aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv4/igmp.c3
-rw-r--r--net/ipv4/ipvs/ip_vs_xmit.c3
-rw-r--r--net/ipv6/mcast.c5
-rw-r--r--net/ipv6/ndisc.c20
4 files changed, 19 insertions, 12 deletions
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
index 8f0df7b4dfe7..b0efd279ddb4 100644
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -333,7 +333,8 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, int size)
333 ((u8*)&pip[1])[2] = 0; 333 ((u8*)&pip[1])[2] = 0;
334 ((u8*)&pip[1])[3] = 0; 334 ((u8*)&pip[1])[3] = 0;
335 335
336 skb->h.raw = skb_put(skb, sizeof(*pig)); 336 skb->h.raw = skb->nh.raw + sizeof(struct iphdr) + 4;
337 skb_put(skb, sizeof(*pig));
337 pig = igmpv3_report_hdr(skb); 338 pig = igmpv3_report_hdr(skb);
338 pig->type = IGMPV3_HOST_MEMBERSHIP_REPORT; 339 pig->type = IGMPV3_HOST_MEMBERSHIP_REPORT;
339 pig->resv1 = 0; 340 pig->resv1 = 0;
diff --git a/net/ipv4/ipvs/ip_vs_xmit.c b/net/ipv4/ipvs/ip_vs_xmit.c
index a7aee6822033..c6276d08b31e 100644
--- a/net/ipv4/ipvs/ip_vs_xmit.c
+++ b/net/ipv4/ipvs/ip_vs_xmit.c
@@ -323,6 +323,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
323 struct iphdr *old_iph = ip_hdr(skb); 323 struct iphdr *old_iph = ip_hdr(skb);
324 u8 tos = old_iph->tos; 324 u8 tos = old_iph->tos;
325 __be16 df = old_iph->frag_off; 325 __be16 df = old_iph->frag_off;
326 unsigned char *old_h = skb_transport_header(skb);
326 struct iphdr *iph; /* Our new IP header */ 327 struct iphdr *iph; /* Our new IP header */
327 int max_headroom; /* The extra header space needed */ 328 int max_headroom; /* The extra header space needed */
328 int mtu; 329 int mtu;
@@ -380,7 +381,7 @@ ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp,
380 old_iph = ip_hdr(skb); 381 old_iph = ip_hdr(skb);
381 } 382 }
382 383
383 skb->h.raw = (void *) old_iph; 384 skb->h.raw = old_h;
384 385
385 /* fix old IP header checksum */ 386 /* fix old IP header checksum */
386 ip_send_check(old_iph); 387 ip_send_check(old_iph);
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
index c6436f5e3e9f..07e86ebb46b8 100644
--- a/net/ipv6/mcast.c
+++ b/net/ipv6/mcast.c
@@ -1423,8 +1423,9 @@ static struct sk_buff *mld_newpack(struct net_device *dev, int size)
1423 1423
1424 memcpy(skb_put(skb, sizeof(ra)), ra, sizeof(ra)); 1424 memcpy(skb_put(skb, sizeof(ra)), ra, sizeof(ra));
1425 1425
1426 pmr =(struct mld2_report *)skb_put(skb, sizeof(*pmr)); 1426 skb_set_transport_header(skb, skb->tail - skb->data);
1427 skb->h.raw = (unsigned char *)pmr; 1427 skb_put(skb, sizeof(*pmr));
1428 pmr = (struct mld2_report *)skb_transport_header(skb);
1428 pmr->type = ICMPV6_MLD2_REPORT; 1429 pmr->type = ICMPV6_MLD2_REPORT;
1429 pmr->resv1 = 0; 1430 pmr->resv1 = 0;
1430 pmr->csum = 0; 1431 pmr->csum = 0;
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;