X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Froute.c;h=b586157d760de0d965cce1be211a9baae53f50d4;hp=d38b08e4be89fb49979bf2e6b20a478776fce302;hb=354b7ab20e04736b368985a9e9dfd54ff5b7584e;hpb=60943122f7b3a5896ce64c9000e119931484c12c diff --git a/src/route.c b/src/route.c index d38b08e4..b586157d 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.67 2003/10/06 13:49:57 guus Exp $ + $Id: route.c,v 1.1.2.69 2003/12/08 12:00:40 guus Exp $ */ #include "system.h" @@ -59,14 +59,14 @@ mac_t mymac = {{0xFE, 0xFD, 0, 0, 0, 0}}; /* Sizes of various headers */ -static size_t ether_size = sizeof(struct ether_header); -static size_t arp_size = sizeof(struct ether_arp); -static size_t ip_size = sizeof(struct ip); -static size_t icmp_size = sizeof(struct icmp) - sizeof(struct ip); -static size_t ip6_size = sizeof(struct ip6_hdr); -static size_t icmp6_size = sizeof(struct icmp6_hdr); -static size_t ns_size = sizeof(struct nd_neighbor_solicit); -static size_t opt_size = sizeof(struct nd_opt_hdr); +static const size_t ether_size = sizeof(struct ether_header); +static const size_t arp_size = sizeof(struct ether_arp); +static const size_t ip_size = sizeof(struct ip); +static const size_t icmp_size = sizeof(struct icmp) - sizeof(struct ip); +static const size_t ip6_size = sizeof(struct ip6_hdr); +static const size_t icmp6_size = sizeof(struct icmp6_hdr); +static const size_t ns_size = sizeof(struct nd_neighbor_solicit); +static const size_t opt_size = sizeof(struct nd_opt_hdr); /* RFC 1071 */ @@ -438,6 +438,7 @@ static void route_neighborsol(vpn_packet_t *packet) checksum = inet_checksum(&pseudo, sizeof(pseudo), ~0); checksum = inet_checksum(&ns, ns_size, checksum); checksum = inet_checksum(&opt, opt_size, checksum); + checksum = inet_checksum(packet->data + ether_size + ip6_size + ns_size + opt_size, ETH_ALEN, checksum); if(checksum) { ifdebug(TRAFFIC) logger(LOG_WARNING, _("Cannot route packet: checksum error for neighbor solicitation request")); @@ -472,10 +473,10 @@ static void route_neighborsol(vpn_packet_t *packet) memcpy(packet->data, packet->data + ETH_ALEN, ETH_ALEN); /* copy destination address */ packet->data[ETH_ALEN * 2 - 1] ^= 0xFF; /* mangle source address so it looks like it's not from us */ - memcpy(&ip6.ip6_src, &ns.nd_ns_target, sizeof(ip6.ip6_src)); /* swap destination and source protocol address */ memcpy(&ip6.ip6_dst, &ip6.ip6_src, sizeof(ip6.ip6_dst)); /* ... */ + memcpy(&ip6.ip6_src, &ns.nd_ns_target, sizeof(ip6.ip6_src)); /* swap destination and source protocol address */ - memcpy(&opt + opt_size, packet->data + ETH_ALEN, ETH_ALEN); /* add fake source hard addr */ + memcpy(packet->data + ether_size + ip6_size + ns_size + opt_size, packet->data + ETH_ALEN, ETH_ALEN); /* add fake source hard addr */ ns.nd_ns_cksum = 0; ns.nd_ns_type = ND_NEIGHBOR_ADVERT; @@ -494,6 +495,7 @@ static void route_neighborsol(vpn_packet_t *packet) checksum = inet_checksum(&pseudo, sizeof(pseudo), ~0); checksum = inet_checksum(&ns, ns_size, checksum); checksum = inet_checksum(&opt, opt_size, checksum); + checksum = inet_checksum(packet->data + ether_size + ip6_size + ns_size + opt_size, ETH_ALEN, checksum); ns.nd_ns_hdr.icmp6_cksum = checksum;