Commit 00f97da1 authored by Amerigo Wang's avatar Amerigo Wang Committed by David S. Miller

netpoll: fix position of network header

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: default avatarThomas 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: default avatarCong Wang <amwang@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 525cebed
...@@ -676,8 +676,6 @@ static void netpoll_neigh_reply(struct sk_buff *skb, struct netpoll_info *npinfo ...@@ -676,8 +676,6 @@ static void netpoll_neigh_reply(struct sk_buff *skb, struct netpoll_info *npinfo
spin_lock_irqsave(&npinfo->rx_lock, flags); spin_lock_irqsave(&npinfo->rx_lock, flags);
list_for_each_entry_safe(np, tmp, &npinfo->rx_np, rx) { list_for_each_entry_safe(np, tmp, &npinfo->rx_np, rx) {
unsigned long tail_offset;
if (!ipv6_addr_equal(daddr, &np->local_ip.in6)) if (!ipv6_addr_equal(daddr, &np->local_ip.in6))
continue; continue;
...@@ -691,30 +689,20 @@ static void netpoll_neigh_reply(struct sk_buff *skb, struct netpoll_info *npinfo ...@@ -691,30 +689,20 @@ static void netpoll_neigh_reply(struct sk_buff *skb, struct netpoll_info *npinfo
send_skb->dev = skb->dev; send_skb->dev = skb->dev;
skb_reset_network_header(send_skb); skb_reset_network_header(send_skb);
skb_put(send_skb, sizeof(struct ipv6hdr)); hdr = (struct ipv6hdr *) skb_put(send_skb, sizeof(struct ipv6hdr));
hdr = ipv6_hdr(send_skb);
*(__be32*)hdr = htonl(0x60000000); *(__be32*)hdr = htonl(0x60000000);
hdr->payload_len = htons(size); hdr->payload_len = htons(size);
hdr->nexthdr = IPPROTO_ICMPV6; hdr->nexthdr = IPPROTO_ICMPV6;
hdr->hop_limit = 255; hdr->hop_limit = 255;
hdr->saddr = *saddr; hdr->saddr = *saddr;
hdr->daddr = *daddr; hdr->daddr = *daddr;
tail_offset = skb_tail_offset(skb); icmp6h = (struct icmp6hdr *) skb_put(send_skb, sizeof(struct icmp6hdr));
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->icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT; icmp6h->icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT;
icmp6h->icmp6_router = 0; icmp6h->icmp6_router = 0;
icmp6h->icmp6_solicited = 1; 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; *target = msg->target;
icmp6h->icmp6_cksum = csum_ipv6_magic(saddr, daddr, size, icmp6h->icmp6_cksum = csum_ipv6_magic(saddr, daddr, size,
IPPROTO_ICMPV6, IPPROTO_ICMPV6,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment