diff options
Diffstat (limited to 'net/ipv6/ndisc.c')
-rw-r--r-- | net/ipv6/ndisc.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index f9a85ab594db..f8e619772fb4 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -492,8 +492,9 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh, | |||
492 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); | 492 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); |
493 | ip6_nd_hdr(sk, skb, dev, src_addr, daddr, IPPROTO_ICMPV6, len); | 493 | ip6_nd_hdr(sk, skb, dev, src_addr, daddr, IPPROTO_ICMPV6, len); |
494 | 494 | ||
495 | msg = (struct nd_msg *)skb_put(skb, len); | 495 | skb_set_transport_header(skb, skb->tail - skb->data); |
496 | skb->h.raw = (unsigned char*)msg; | 496 | skb_put(skb, len); |
497 | msg = (struct nd_msg *)skb_transport_header(skb); | ||
497 | 498 | ||
498 | msg->icmph.icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT; | 499 | msg->icmph.icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT; |
499 | msg->icmph.icmp6_code = 0; | 500 | msg->icmph.icmp6_code = 0; |
@@ -583,8 +584,9 @@ void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh, | |||
583 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); | 584 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); |
584 | ip6_nd_hdr(sk, skb, dev, saddr, daddr, IPPROTO_ICMPV6, len); | 585 | ip6_nd_hdr(sk, skb, dev, saddr, daddr, IPPROTO_ICMPV6, len); |
585 | 586 | ||
586 | msg = (struct nd_msg *)skb_put(skb, len); | 587 | skb_set_transport_header(skb, skb->tail - skb->data); |
587 | skb->h.raw = (unsigned char*)msg; | 588 | skb_put(skb, len); |
589 | msg = (struct nd_msg *)skb_transport_header(skb); | ||
588 | msg->icmph.icmp6_type = NDISC_NEIGHBOUR_SOLICITATION; | 590 | msg->icmph.icmp6_type = NDISC_NEIGHBOUR_SOLICITATION; |
589 | msg->icmph.icmp6_code = 0; | 591 | msg->icmph.icmp6_code = 0; |
590 | msg->icmph.icmp6_cksum = 0; | 592 | msg->icmph.icmp6_cksum = 0; |
@@ -683,8 +685,9 @@ void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr, | |||
683 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); | 685 | skb_reserve(skb, LL_RESERVED_SPACE(dev)); |
684 | ip6_nd_hdr(sk, skb, dev, saddr, daddr, IPPROTO_ICMPV6, len); | 686 | ip6_nd_hdr(sk, skb, dev, saddr, daddr, IPPROTO_ICMPV6, len); |
685 | 687 | ||
686 | hdr = (struct icmp6hdr *)skb_put(skb, len); | 688 | skb_set_transport_header(skb, skb->tail - skb->data); |
687 | skb->h.raw = (unsigned char*)hdr; | 689 | skb_put(skb, len); |
690 | hdr = icmp6_hdr(skb); | ||
688 | hdr->icmp6_type = NDISC_ROUTER_SOLICITATION; | 691 | hdr->icmp6_type = NDISC_ROUTER_SOLICITATION; |
689 | hdr->icmp6_code = 0; | 692 | hdr->icmp6_code = 0; |
690 | hdr->icmp6_cksum = 0; | 693 | hdr->icmp6_cksum = 0; |
@@ -1519,8 +1522,9 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh, | |||
1519 | ip6_nd_hdr(sk, buff, dev, &saddr_buf, &ipv6_hdr(skb)->saddr, | 1522 | ip6_nd_hdr(sk, buff, dev, &saddr_buf, &ipv6_hdr(skb)->saddr, |
1520 | IPPROTO_ICMPV6, len); | 1523 | IPPROTO_ICMPV6, len); |
1521 | 1524 | ||
1522 | icmph = (struct icmp6hdr *)skb_put(buff, len); | 1525 | skb_set_transport_header(buff, buff->tail - buff->data); |
1523 | buff->h.raw = (unsigned char*)icmph; | 1526 | skb_put(buff, len); |
1527 | icmph = icmp6_hdr(buff); | ||
1524 | 1528 | ||
1525 | memset(icmph, 0, sizeof(struct icmp6hdr)); | 1529 | memset(icmph, 0, sizeof(struct icmp6hdr)); |
1526 | icmph->icmp6_type = NDISC_REDIRECT; | 1530 | icmph->icmp6_type = NDISC_REDIRECT; |