X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Froute.c;h=571b1ba2edc8a25ea7eb2c18238865f95955f5df;hp=00aa486368b9e1327483f390212a6ecb6323f257;hb=12de5a8eedd985f4732e88de6185f77a8244612c;hpb=7d21a8d1c7fd8909fe02385dbb4717c074db4648 diff --git a/src/route.c b/src/route.c index 00aa4863..571b1ba2 100644 --- a/src/route.c +++ b/src/route.c @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: route.c,v 1.1.2.47 2003/03/29 21:51:21 guus Exp $ + $Id: route.c,v 1.1.2.50 2003/06/11 19:28:35 guus Exp $ */ #include "config.h" @@ -67,7 +67,8 @@ int routing_mode = RMODE_ROUTER; int priorityinheritance = 0; int macexpire = 600; -subnet_t mymac; +int overwrite_mac = 0; +mac_t mymac = {0xFE, 0xFD, 0, 0, 0, 0}; /* RFC 1071 */ @@ -76,10 +77,13 @@ uint16_t inet_checksum(void *data, int len, uint16_t prevsum) uint16_t *p = data; uint32_t checksum = prevsum ^ 0xFFFF; - len /= 2; - - while(len--) + while(len >= 2) { checksum += *p++; + len -= 2; + } + + if(len) + checksum += *(unsigned char *)p; while(checksum >> 16) checksum = (checksum & 0xFFFF) + (checksum >> 16); @@ -295,8 +299,8 @@ void route_ipv6_unreachable(vpn_packet_t *packet, uint8_t code) /* Remember original source and destination */ - memcpy(&pseudo.ip6_src, &hdr->ip6_src, 16); - memcpy(&pseudo.ip6_dst, &hdr->ip6_dst, 16); + memcpy(&pseudo.ip6_src, &hdr->ip6_dst, 16); + memcpy(&pseudo.ip6_dst, &hdr->ip6_src, 16); pseudo.length = ntohs(hdr->ip6_plen) + sizeof(*hdr); if(pseudo.length >= IP_MSS - sizeof(*hdr) - sizeof(*icmp)) @@ -312,8 +316,8 @@ void route_ipv6_unreachable(vpn_packet_t *packet, uint8_t code) hdr->ip6_plen = htons(sizeof(*icmp) + pseudo.length); hdr->ip6_nxt = IPPROTO_ICMPV6; hdr->ip6_hlim = 255; - memcpy(&hdr->ip6_dst, &pseudo.ip6_src, 16); - memcpy(&hdr->ip6_src, &pseudo.ip6_dst, 16); + memcpy(&hdr->ip6_dst, &pseudo.ip6_dst, 16); + memcpy(&hdr->ip6_src, &pseudo.ip6_src, 16); /* Fill in ICMP header */ @@ -323,8 +327,6 @@ void route_ipv6_unreachable(vpn_packet_t *packet, uint8_t code) /* Create pseudo header */ - memcpy(&pseudo.ip6_src, &hdr->ip6_src, 16); - memcpy(&pseudo.ip6_dst, &hdr->ip6_dst, 16); pseudo.length = htonl(sizeof(*icmp) + pseudo.length); pseudo.next = htonl(IPPROTO_ICMPV6); @@ -396,7 +398,8 @@ void route_neighborsol(vpn_packet_t *packet) /* First, snatch the source address from the neighbor solicitation packet */ - memcpy(mymac.net.mac.address.x, packet->data + 6, 6); + if(overwrite_mac) + memcpy(mymac.x, packet->data + 6, 6); /* Check if this is a valid neighbor solicitation request */ @@ -498,7 +501,8 @@ void route_arp(vpn_packet_t *packet) /* First, snatch the source address from the ARP packet */ - memcpy(mymac.net.mac.address.x, packet->data + 6, 6); + if(overwrite_mac) + memcpy(mymac.x, packet->data + 6, 6); /* This routine generates replies to ARP requests. You don't need to set NOARP flag on the interface anymore (which is broken on FreeBSD). @@ -627,7 +631,8 @@ void route_incoming(node_t *source, vpn_packet_t *packet) if(n) { if(n == myself) { - memcpy(packet->data, mymac.net.mac.address.x, 6); + if(overwrite_mac) + memcpy(packet->data, mymac.x, 6); write_packet(packet); } else send_packet(n, packet);