netpoll: fix position of network header
authorAmerigo Wang <amwang@redhat.com>
Mon, 3 Jun 2013 16:31:36 +0000 (16:31 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 5 Jun 2013 00:37:04 +0000 (17:37 -0700)
Similar to the problem in pktgen, netpoll uses skb_tail_offset()
too, as the code is copied from pktgen.

Also use return values of skb_put() directly, this will simiplify
the code.

Reported-by: Thomas Graf <tgraf@suug.ch>
Cc: Thomas Graf <tgraf@suug.ch>
Cc: Daniel Borkmann <dborkmann@redhat.com>
Cc: David S. Miller <davem@davemloft.net>
Signed-off-by: Cong Wang <amwang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/netpoll.c

index 688517c7ff17b67c669f14bdf98a963003b64901..03c8ec3edc7208715f76ab06c68154de30d089af 100644 (file)
@@ -676,8 +676,6 @@ static void netpoll_neigh_reply(struct sk_buff *skb, struct netpoll_info *npinfo
 
                spin_lock_irqsave(&npinfo->rx_lock, flags);
                list_for_each_entry_safe(np, tmp, &npinfo->rx_np, rx) {
-                       unsigned long tail_offset;
-
                        if (!ipv6_addr_equal(daddr, &np->local_ip.in6))
                                continue;
 
@@ -691,30 +689,20 @@ static void netpoll_neigh_reply(struct sk_buff *skb, struct netpoll_info *npinfo
                        send_skb->dev = skb->dev;
 
                        skb_reset_network_header(send_skb);
-                       skb_put(send_skb, sizeof(struct ipv6hdr));
-                       hdr = ipv6_hdr(send_skb);
-
+                       hdr = (struct ipv6hdr *) skb_put(send_skb, sizeof(struct ipv6hdr));
                        *(__be32*)hdr = htonl(0x60000000);
-
                        hdr->payload_len = htons(size);
                        hdr->nexthdr = IPPROTO_ICMPV6;
                        hdr->hop_limit = 255;
                        hdr->saddr = *saddr;
                        hdr->daddr = *daddr;
 
-                       tail_offset = skb_tail_offset(skb);
-                       if (tail_offset > 0xffff) {
-                               kfree_skb(send_skb);
-                               continue;
-                       }
-                       skb_set_network_header(send_skb, tail_offset);
-                       skb_put(send_skb, size);
-
-                       icmp6h = (struct icmp6hdr *)skb_transport_header(skb);
+                       icmp6h = (struct icmp6hdr *) skb_put(send_skb, sizeof(struct icmp6hdr));
                        icmp6h->icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT;
                        icmp6h->icmp6_router = 0;
                        icmp6h->icmp6_solicited = 1;
-                       target = (struct in6_addr *)(skb_transport_header(send_skb) + sizeof(struct icmp6hdr));
+
+                       target = (struct in6_addr *) skb_put(send_skb, sizeof(struct in6_addr));
                        *target = msg->target;
                        icmp6h->icmp6_cksum = csum_ipv6_magic(saddr, daddr, size,
                                                              IPPROTO_ICMPV6,