Fix proxy-neighborsolicitation.
[tinc] / src / route.c
index d38b08e..b586157 100644 (file)
@@ -17,7 +17,7 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
     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"
 */
 
 #include "system.h"
@@ -59,14 +59,14 @@ mac_t mymac = {{0xFE, 0xFD, 0, 0, 0, 0}};
 
 /* Sizes of various headers */
 
 
 /* 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 */
 
 
 /* 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(&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"));
 
        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(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_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;
 
        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(&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;
 
 
        ns.nd_ns_hdr.icmp6_cksum = checksum;