aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/isdn/i4l/isdn_net.c5
-rw-r--r--drivers/net/bonding/bond_alb.c2
-rw-r--r--drivers/net/loopback.c7
-rw-r--r--drivers/net/pasemi_mac.c6
-rw-r--r--drivers/s390/net/qeth_main.c6
-rw-r--r--include/linux/if_pppox.h2
-rw-r--r--include/linux/skbuff.h5
-rw-r--r--include/net/cipso_ipv4.h2
-rw-r--r--include/net/inet_ecn.h6
-rw-r--r--include/net/llc_pdu.h4
-rw-r--r--include/net/pkt_cls.h2
-rw-r--r--net/bridge/br_netfilter.c12
-rw-r--r--net/core/dev.c9
-rw-r--r--net/core/filter.c2
-rw-r--r--net/dccp/ipv6.c8
-rw-r--r--net/decnet/dn_route.c4
-rw-r--r--net/ipv4/af_inet.c2
-rw-r--r--net/ipv4/ah4.c5
-rw-r--r--net/ipv4/esp4.c7
-rw-r--r--net/ipv4/icmp.c4
-rw-r--r--net/ipv4/ip_fragment.c2
-rw-r--r--net/ipv4/ip_options.c12
-rw-r--r--net/ipv4/ip_output.c6
-rw-r--r--net/ipv4/ip_sockglue.c8
-rw-r--r--net/ipv4/ipmr.c2
-rw-r--r--net/ipv4/ipvs/ip_vs_app.c4
-rw-r--r--net/ipv4/ipvs/ip_vs_core.c3
-rw-r--r--net/ipv4/netfilter/arpt_mangle.c2
-rw-r--r--net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c9
-rw-r--r--net/ipv4/raw.c2
-rw-r--r--net/ipv4/tcp_input.c2
-rw-r--r--net/ipv4/xfrm4_input.c2
-rw-r--r--net/ipv4/xfrm4_mode_beet.c4
-rw-r--r--net/ipv4/xfrm4_mode_transport.c4
-rw-r--r--net/ipv4/xfrm4_policy.c2
-rw-r--r--net/ipv6/af_inet6.c3
-rw-r--r--net/ipv6/ah6.c12
-rw-r--r--net/ipv6/datagram.c31
-rw-r--r--net/ipv6/esp6.c4
-rw-r--r--net/ipv6/exthdrs.c56
-rw-r--r--net/ipv6/icmp.c3
-rw-r--r--net/ipv6/ip6_input.c4
-rw-r--r--net/ipv6/ip6_output.c23
-rw-r--r--net/ipv6/ip6_tunnel.c5
-rw-r--r--net/ipv6/ipcomp6.c4
-rw-r--r--net/ipv6/mip6.c29
-rw-r--r--net/ipv6/netfilter/nf_conntrack_reasm.c19
-rw-r--r--net/ipv6/raw.c5
-rw-r--r--net/ipv6/reassembly.c25
-rw-r--r--net/ipv6/tcp_ipv6.c8
-rw-r--r--net/ipv6/xfrm6_input.c6
-rw-r--r--net/ipv6/xfrm6_mode_beet.c2
-rw-r--r--net/ipv6/xfrm6_mode_transport.c6
-rw-r--r--net/ipv6/xfrm6_mode_tunnel.c8
-rw-r--r--net/ipv6/xfrm6_policy.c16
-rw-r--r--net/netfilter/xt_TCPMSS.c4
-rw-r--r--net/sched/act_pedit.c2
-rw-r--r--net/sched/cls_u32.c2
-rw-r--r--net/sched/em_u32.c2
59 files changed, 258 insertions, 185 deletions
diff --git a/drivers/isdn/i4l/isdn_net.c b/drivers/isdn/i4l/isdn_net.c
index 0c2b3752e46e..cd3b1fa4a414 100644
--- a/drivers/isdn/i4l/isdn_net.c
+++ b/drivers/isdn/i4l/isdn_net.c
@@ -872,7 +872,8 @@ typedef struct {
872static void 872static void
873isdn_net_log_skb(struct sk_buff * skb, isdn_net_local * lp) 873isdn_net_log_skb(struct sk_buff * skb, isdn_net_local * lp)
874{ 874{
875 u_char *p = skb->nh.raw; /* hopefully, this was set correctly */ 875 /* hopefully, this was set correctly */
876 const u_char *p = skb_network_header(skb);
876 unsigned short proto = ntohs(skb->protocol); 877 unsigned short proto = ntohs(skb->protocol);
877 int data_ofs; 878 int data_ofs;
878 ip_ports *ipp; 879 ip_ports *ipp;
@@ -880,7 +881,7 @@ isdn_net_log_skb(struct sk_buff * skb, isdn_net_local * lp)
880 881
881 addinfo[0] = '\0'; 882 addinfo[0] = '\0';
882 /* This check stolen from 2.1.72 dev_queue_xmit_nit() */ 883 /* This check stolen from 2.1.72 dev_queue_xmit_nit() */
883 if (skb->nh.raw < skb->data || skb->nh.raw >= skb->tail) { 884 if (p < skb->data || p >= skb->tail) {
884 /* fall back to old isdn_net_log_packet method() */ 885 /* fall back to old isdn_net_log_packet method() */
885 char * buf = skb->data; 886 char * buf = skb->data;
886 887
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c
index 5c2a12c2b997..86cfcb3f8131 100644
--- a/drivers/net/bonding/bond_alb.c
+++ b/drivers/net/bonding/bond_alb.c
@@ -106,7 +106,7 @@ struct arp_pkt {
106 106
107static inline struct arp_pkt *arp_pkt(const struct sk_buff *skb) 107static inline struct arp_pkt *arp_pkt(const struct sk_buff *skb)
108{ 108{
109 return (struct arp_pkt *)skb->nh.raw; 109 return (struct arp_pkt *)skb_network_header(skb);
110} 110}
111 111
112/* Forward declaration */ 112/* Forward declaration */
diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c
index af476d2a513d..9265c27b13b2 100644
--- a/drivers/net/loopback.c
+++ b/drivers/net/loopback.c
@@ -76,7 +76,8 @@ static DEFINE_PER_CPU(struct pcpu_lstats, pcpu_lstats);
76static void emulate_large_send_offload(struct sk_buff *skb) 76static void emulate_large_send_offload(struct sk_buff *skb)
77{ 77{
78 struct iphdr *iph = skb->nh.iph; 78 struct iphdr *iph = skb->nh.iph;
79 struct tcphdr *th = (struct tcphdr*)(skb->nh.raw + (iph->ihl * 4)); 79 struct tcphdr *th = (struct tcphdr *)(skb_network_header(skb) +
80 (iph->ihl * 4));
80 unsigned int doffset = (iph->ihl + th->doff) * 4; 81 unsigned int doffset = (iph->ihl + th->doff) * 4;
81 unsigned int mtu = skb_shinfo(skb)->gso_size + doffset; 82 unsigned int mtu = skb_shinfo(skb)->gso_size + doffset;
82 unsigned int offset = 0; 83 unsigned int offset = 0;
@@ -93,7 +94,7 @@ static void emulate_large_send_offload(struct sk_buff *skb)
93 skb_set_mac_header(nskb, -ETH_HLEN); 94 skb_set_mac_header(nskb, -ETH_HLEN);
94 skb_reset_network_header(nskb); 95 skb_reset_network_header(nskb);
95 iph = nskb->nh.iph; 96 iph = nskb->nh.iph;
96 memcpy(nskb->data, skb->nh.raw, doffset); 97 memcpy(nskb->data, skb_network_header(skb), doffset);
97 if (skb_copy_bits(skb, 98 if (skb_copy_bits(skb,
98 doffset + offset, 99 doffset + offset,
99 nskb->data + doffset, 100 nskb->data + doffset,
@@ -108,7 +109,7 @@ static void emulate_large_send_offload(struct sk_buff *skb)
108 memcpy(nskb->cb, skb->cb, sizeof(skb->cb)); 109 memcpy(nskb->cb, skb->cb, sizeof(skb->cb));
109 nskb->pkt_type = skb->pkt_type; 110 nskb->pkt_type = skb->pkt_type;
110 111
111 th = (struct tcphdr*)(nskb->nh.raw + iph->ihl*4); 112 th = (struct tcphdr *)(skb_network_header(nskb) + iph->ihl * 4);
112 iph->tot_len = htons(frag_size + doffset); 113 iph->tot_len = htons(frag_size + doffset);
113 iph->id = htons(id); 114 iph->id = htons(id);
114 iph->check = 0; 115 iph->check = 0;
diff --git a/drivers/net/pasemi_mac.c b/drivers/net/pasemi_mac.c
index 3f4213f3d5de..82218720bc3e 100644
--- a/drivers/net/pasemi_mac.c
+++ b/drivers/net/pasemi_mac.c
@@ -729,16 +729,18 @@ static int pasemi_mac_start_tx(struct sk_buff *skb, struct net_device *dev)
729 dflags = XCT_MACTX_O | XCT_MACTX_ST | XCT_MACTX_SS | XCT_MACTX_CRC_PAD; 729 dflags = XCT_MACTX_O | XCT_MACTX_ST | XCT_MACTX_SS | XCT_MACTX_CRC_PAD;
730 730
731 if (skb->ip_summed == CHECKSUM_PARTIAL) { 731 if (skb->ip_summed == CHECKSUM_PARTIAL) {
732 const unsigned char *nh = skb_network_header(skb);
733
732 switch (skb->nh.iph->protocol) { 734 switch (skb->nh.iph->protocol) {
733 case IPPROTO_TCP: 735 case IPPROTO_TCP:
734 dflags |= XCT_MACTX_CSUM_TCP; 736 dflags |= XCT_MACTX_CSUM_TCP;
735 dflags |= XCT_MACTX_IPH((skb->h.raw - skb->nh.raw) >> 2); 737 dflags |= XCT_MACTX_IPH((skb->h.raw - skb->nh.raw) >> 2);
736 dflags |= XCT_MACTX_IPO(skb->nh.raw - skb->data); 738 dflags |= XCT_MACTX_IPO(nh - skb->data);
737 break; 739 break;
738 case IPPROTO_UDP: 740 case IPPROTO_UDP:
739 dflags |= XCT_MACTX_CSUM_UDP; 741 dflags |= XCT_MACTX_CSUM_UDP;
740 dflags |= XCT_MACTX_IPH((skb->h.raw - skb->nh.raw) >> 2); 742 dflags |= XCT_MACTX_IPH((skb->h.raw - skb->nh.raw) >> 2);
741 dflags |= XCT_MACTX_IPO(skb->nh.raw - skb->data); 743 dflags |= XCT_MACTX_IPO(nh - skb->data);
742 break; 744 break;
743 } 745 }
744 } 746 }
diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c
index c0ee6d94ea38..0ff29e0628b5 100644
--- a/drivers/s390/net/qeth_main.c
+++ b/drivers/s390/net/qeth_main.c
@@ -3778,9 +3778,11 @@ qeth_get_cast_type(struct qeth_card *card, struct sk_buff *skb)
3778 } 3778 }
3779 /* try something else */ 3779 /* try something else */
3780 if (skb->protocol == ETH_P_IPV6) 3780 if (skb->protocol == ETH_P_IPV6)
3781 return (skb->nh.raw[24] == 0xff) ? RTN_MULTICAST : 0; 3781 return (skb_network_header(skb)[24] == 0xff) ?
3782 RTN_MULTICAST : 0;
3782 else if (skb->protocol == ETH_P_IP) 3783 else if (skb->protocol == ETH_P_IP)
3783 return ((skb->nh.raw[16] & 0xf0) == 0xe0) ? RTN_MULTICAST : 0; 3784 return ((skb_network_header(skb)[16] & 0xf0) == 0xe0) ?
3785 RTN_MULTICAST : 0;
3784 /* ... */ 3786 /* ... */
3785 if (!memcmp(skb->data, skb->dev->broadcast, 6)) 3787 if (!memcmp(skb->data, skb->dev->broadcast, 6))
3786 return RTN_BROADCAST; 3788 return RTN_BROADCAST;
diff --git a/include/linux/if_pppox.h b/include/linux/if_pppox.h
index 7044f8ab30a0..29d6579ff1a0 100644
--- a/include/linux/if_pppox.h
+++ b/include/linux/if_pppox.h
@@ -116,7 +116,7 @@ struct pppoe_hdr {
116 116
117static inline struct pppoe_hdr *pppoe_hdr(const struct sk_buff *skb) 117static inline struct pppoe_hdr *pppoe_hdr(const struct sk_buff *skb)
118{ 118{
119 return (struct pppoe_hdr *)skb->nh.raw; 119 return (struct pppoe_hdr *)skb_network_header(skb);
120} 120}
121 121
122struct pppoe_opt { 122struct pppoe_opt {
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 47cc8b07c2b4..76d30f34b986 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -960,6 +960,11 @@ static inline void skb_reserve(struct sk_buff *skb, int len)
960 skb->tail += len; 960 skb->tail += len;
961} 961}
962 962
963static inline unsigned char *skb_network_header(const struct sk_buff *skb)
964{
965 return skb->nh.raw;
966}
967
963static inline void skb_reset_network_header(struct sk_buff *skb) 968static inline void skb_reset_network_header(struct sk_buff *skb)
964{ 969{
965 skb->nh.raw = skb->data; 970 skb->nh.raw = skb->data;
diff --git a/include/net/cipso_ipv4.h b/include/net/cipso_ipv4.h
index 4c9522c5178f..4f90f5554fac 100644
--- a/include/net/cipso_ipv4.h
+++ b/include/net/cipso_ipv4.h
@@ -120,7 +120,7 @@ extern int cipso_v4_rbm_strictvalid;
120 */ 120 */
121 121
122#define CIPSO_V4_OPTEXIST(x) (IPCB(x)->opt.cipso != 0) 122#define CIPSO_V4_OPTEXIST(x) (IPCB(x)->opt.cipso != 0)
123#define CIPSO_V4_OPTPTR(x) ((x)->nh.raw + IPCB(x)->opt.cipso) 123#define CIPSO_V4_OPTPTR(x) (skb_network_header(x) + IPCB(x)->opt.cipso)
124 124
125/* 125/*
126 * DOI List Functions 126 * DOI List Functions
diff --git a/include/net/inet_ecn.h b/include/net/inet_ecn.h
index 10117c8503e8..b9ed3898e368 100644
--- a/include/net/inet_ecn.h
+++ b/include/net/inet_ecn.h
@@ -114,12 +114,14 @@ static inline int INET_ECN_set_ce(struct sk_buff *skb)
114{ 114{
115 switch (skb->protocol) { 115 switch (skb->protocol) {
116 case __constant_htons(ETH_P_IP): 116 case __constant_htons(ETH_P_IP):
117 if (skb->nh.raw + sizeof(struct iphdr) <= skb->tail) 117 if (skb_network_header(skb) + sizeof(struct iphdr) <=
118 skb->tail)
118 return IP_ECN_set_ce(skb->nh.iph); 119 return IP_ECN_set_ce(skb->nh.iph);
119 break; 120 break;
120 121
121 case __constant_htons(ETH_P_IPV6): 122 case __constant_htons(ETH_P_IPV6):
122 if (skb->nh.raw + sizeof(struct ipv6hdr) <= skb->tail) 123 if (skb_network_header(skb) + sizeof(struct ipv6hdr) <=
124 skb->tail)
123 return IP6_ECN_set_ce(skb->nh.ipv6h); 125 return IP6_ECN_set_ce(skb->nh.ipv6h);
124 break; 126 break;
125 } 127 }
diff --git a/include/net/llc_pdu.h b/include/net/llc_pdu.h
index 778f75a40b4d..4a8f58b17e43 100644
--- a/include/net/llc_pdu.h
+++ b/include/net/llc_pdu.h
@@ -203,7 +203,7 @@ struct llc_pdu_sn {
203 203
204static inline struct llc_pdu_sn *llc_pdu_sn_hdr(struct sk_buff *skb) 204static inline struct llc_pdu_sn *llc_pdu_sn_hdr(struct sk_buff *skb)
205{ 205{
206 return (struct llc_pdu_sn *)skb->nh.raw; 206 return (struct llc_pdu_sn *)skb_network_header(skb);
207} 207}
208 208
209/* Un-numbered PDU format (3 bytes in length) */ 209/* Un-numbered PDU format (3 bytes in length) */
@@ -215,7 +215,7 @@ struct llc_pdu_un {
215 215
216static inline struct llc_pdu_un *llc_pdu_un_hdr(struct sk_buff *skb) 216static inline struct llc_pdu_un *llc_pdu_un_hdr(struct sk_buff *skb)
217{ 217{
218 return (struct llc_pdu_un *)skb->nh.raw; 218 return (struct llc_pdu_un *)skb_network_header(skb);
219} 219}
220 220
221/** 221/**
diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h
index 02647fe3d74b..8a6b0e7bded5 100644
--- a/include/net/pkt_cls.h
+++ b/include/net/pkt_cls.h
@@ -326,7 +326,7 @@ static inline unsigned char * tcf_get_base_ptr(struct sk_buff *skb, int layer)
326 case TCF_LAYER_LINK: 326 case TCF_LAYER_LINK:
327 return skb->data; 327 return skb->data;
328 case TCF_LAYER_NETWORK: 328 case TCF_LAYER_NETWORK:
329 return skb->nh.raw; 329 return skb_network_header(skb);
330 case TCF_LAYER_TRANSPORT: 330 case TCF_LAYER_TRANSPORT:
331 return skb->h.raw; 331 return skb->h.raw;
332 } 332 }
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
index 1163c4f69899..8a56d8963025 100644
--- a/net/bridge/br_netfilter.c
+++ b/net/bridge/br_netfilter.c
@@ -374,7 +374,8 @@ static int check_hbh_len(struct sk_buff *skb)
374{ 374{
375 unsigned char *raw = (u8 *) (skb->nh.ipv6h + 1); 375 unsigned char *raw = (u8 *) (skb->nh.ipv6h + 1);
376 u32 pkt_len; 376 u32 pkt_len;
377 int off = raw - skb->nh.raw; 377 const unsigned char *nh = skb_network_header(skb);
378 int off = raw - nh;
378 int len = (raw[1] + 1) << 3; 379 int len = (raw[1] + 1) << 3;
379 380
380 if ((raw + len) - skb->data > skb_headlen(skb)) 381 if ((raw + len) - skb->data > skb_headlen(skb))
@@ -384,9 +385,9 @@ static int check_hbh_len(struct sk_buff *skb)
384 len -= 2; 385 len -= 2;
385 386
386 while (len > 0) { 387 while (len > 0) {
387 int optlen = skb->nh.raw[off + 1] + 2; 388 int optlen = nh[off + 1] + 2;
388 389
389 switch (skb->nh.raw[off]) { 390 switch (nh[off]) {
390 case IPV6_TLV_PAD0: 391 case IPV6_TLV_PAD0:
391 optlen = 1; 392 optlen = 1;
392 break; 393 break;
@@ -395,9 +396,9 @@ static int check_hbh_len(struct sk_buff *skb)
395 break; 396 break;
396 397
397 case IPV6_TLV_JUMBO: 398 case IPV6_TLV_JUMBO:
398 if (skb->nh.raw[off + 1] != 4 || (off & 3) != 2) 399 if (nh[off + 1] != 4 || (off & 3) != 2)
399 goto bad; 400 goto bad;
400 pkt_len = ntohl(*(__be32 *) (skb->nh.raw + off + 2)); 401 pkt_len = ntohl(*(__be32 *) (nh + off + 2));
401 if (pkt_len <= IPV6_MAXPLEN || 402 if (pkt_len <= IPV6_MAXPLEN ||
402 skb->nh.ipv6h->payload_len) 403 skb->nh.ipv6h->payload_len)
403 goto bad; 404 goto bad;
@@ -406,6 +407,7 @@ static int check_hbh_len(struct sk_buff *skb)
406 if (pskb_trim_rcsum(skb, 407 if (pskb_trim_rcsum(skb,
407 pkt_len + sizeof(struct ipv6hdr))) 408 pkt_len + sizeof(struct ipv6hdr)))
408 goto bad; 409 goto bad;
410 nh = skb_network_header(skb);
409 break; 411 break;
410 default: 412 default:
411 if (optlen > len) 413 if (optlen > len)
diff --git a/net/core/dev.c b/net/core/dev.c
index 1b0758254ba0..54ffe9db9b02 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1068,8 +1068,8 @@ static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
1068 */ 1068 */
1069 skb_reset_mac_header(skb2); 1069 skb_reset_mac_header(skb2);
1070 1070
1071 if (skb2->nh.raw < skb2->data || 1071 if (skb_network_header(skb2) < skb2->data ||
1072 skb2->nh.raw > skb2->tail) { 1072 skb_network_header(skb2) > skb2->tail) {
1073 if (net_ratelimit()) 1073 if (net_ratelimit())
1074 printk(KERN_CRIT "protocol %04x is " 1074 printk(KERN_CRIT "protocol %04x is "
1075 "buggy, dev %s\n", 1075 "buggy, dev %s\n",
@@ -1207,7 +1207,7 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features)
1207 BUG_ON(skb_shinfo(skb)->frag_list); 1207 BUG_ON(skb_shinfo(skb)->frag_list);
1208 1208
1209 skb_reset_mac_header(skb); 1209 skb_reset_mac_header(skb);
1210 skb->mac_len = skb->nh.raw - skb->data; 1210 skb->mac_len = skb->nh.raw - skb->mac.raw;
1211 __skb_pull(skb, skb->mac_len); 1211 __skb_pull(skb, skb->mac_len);
1212 1212
1213 if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL)) { 1213 if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL)) {
@@ -1224,7 +1224,8 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features)
1224 segs = ERR_PTR(err); 1224 segs = ERR_PTR(err);
1225 if (err || skb_gso_ok(skb, features)) 1225 if (err || skb_gso_ok(skb, features))
1226 break; 1226 break;
1227 __skb_push(skb, skb->data - skb->nh.raw); 1227 __skb_push(skb, (skb->data -
1228 skb_network_header(skb)));
1228 } 1229 }
1229 segs = ptype->gso_segment(skb, features); 1230 segs = ptype->gso_segment(skb, features);
1230 break; 1231 break;
diff --git a/net/core/filter.c b/net/core/filter.c
index 1cc128d05422..d2358a5e6339 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -42,7 +42,7 @@ static void *__load_pointer(struct sk_buff *skb, int k)
42 u8 *ptr = NULL; 42 u8 *ptr = NULL;
43 43
44 if (k >= SKF_NET_OFF) 44 if (k >= SKF_NET_OFF)
45 ptr = skb->nh.raw + k - SKF_NET_OFF; 45 ptr = skb_network_header(skb) + k - SKF_NET_OFF;
46 else if (k >= SKF_LL_OFF) 46 else if (k >= SKF_LL_OFF)
47 ptr = skb_mac_header(skb) + k - SKF_LL_OFF; 47 ptr = skb_mac_header(skb) + k - SKF_LL_OFF;
48 48
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c
index 7f51e8db3967..627d0c3c51cf 100644
--- a/net/dccp/ipv6.c
+++ b/net/dccp/ipv6.c
@@ -261,8 +261,8 @@ static int dccp_v6_send_response(struct sock *sk, struct request_sock *req,
261 261
262 if (rxopt->srcrt) 262 if (rxopt->srcrt)
263 opt = ipv6_invert_rthdr(sk, 263 opt = ipv6_invert_rthdr(sk,
264 (struct ipv6_rt_hdr *)(pktopts->nh.raw + 264 (struct ipv6_rt_hdr *)(skb_network_header(pktopts) +
265 rxopt->srcrt)); 265 rxopt->srcrt));
266 } 266 }
267 267
268 if (opt != NULL && opt->srcrt != NULL) { 268 if (opt != NULL && opt->srcrt != NULL) {
@@ -573,8 +573,8 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk,
573 573
574 if (rxopt->srcrt) 574 if (rxopt->srcrt)
575 opt = ipv6_invert_rthdr(sk, 575 opt = ipv6_invert_rthdr(sk,
576 (struct ipv6_rt_hdr *)(ireq6->pktopts->nh.raw + 576 (struct ipv6_rt_hdr *)(skb_network_header(ireq6->pktopts) +
577 rxopt->srcrt)); 577 rxopt->srcrt));
578 } 578 }
579 579
580 if (dst == NULL) { 580 if (dst == NULL) {
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c
index 34079b7ba1d3..32a7db36c9e5 100644
--- a/net/decnet/dn_route.c
+++ b/net/decnet/dn_route.c
@@ -386,7 +386,7 @@ static int dn_return_short(struct sk_buff *skb)
386 __le16 tmp; 386 __le16 tmp;
387 387
388 /* Add back headers */ 388 /* Add back headers */
389 skb_push(skb, skb->data - skb->nh.raw); 389 skb_push(skb, skb->data - skb_network_header(skb));
390 390
391 if ((skb = skb_unshare(skb, GFP_ATOMIC)) == NULL) 391 if ((skb = skb_unshare(skb, GFP_ATOMIC)) == NULL)
392 return NET_RX_DROP; 392 return NET_RX_DROP;
@@ -425,7 +425,7 @@ static int dn_return_long(struct sk_buff *skb)
425 unsigned char tmp[ETH_ALEN]; 425 unsigned char tmp[ETH_ALEN];
426 426
427 /* Add back all headers */ 427 /* Add back all headers */
428 skb_push(skb, skb->data - skb->nh.raw); 428 skb_push(skb, skb->data - skb_network_header(skb));
429 429
430 if ((skb = skb_unshare(skb, GFP_ATOMIC)) == NULL) 430 if ((skb = skb_unshare(skb, GFP_ATOMIC)) == NULL)
431 return NET_RX_DROP; 431 return NET_RX_DROP;
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
index 6e5575b0abef..ab552a6098f9 100644
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -1184,7 +1184,7 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb, int features)
1184 iph->id = htons(id++); 1184 iph->id = htons(id++);
1185 iph->tot_len = htons(skb->len - skb->mac_len); 1185 iph->tot_len = htons(skb->len - skb->mac_len);
1186 iph->check = 0; 1186 iph->check = 0;
1187 iph->check = ip_fast_csum(skb->nh.raw, iph->ihl); 1187 iph->check = ip_fast_csum(skb_network_header(skb), iph->ihl);
1188 } while ((skb = skb->next)); 1188 } while ((skb = skb->next));
1189 1189
1190out: 1190out:
diff --git a/net/ipv4/ah4.c b/net/ipv4/ah4.c
index 7194eb40b6d0..95ddbbd1552a 100644
--- a/net/ipv4/ah4.c
+++ b/net/ipv4/ah4.c
@@ -154,7 +154,7 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb)
154 ah = (struct ip_auth_hdr*)skb->data; 154 ah = (struct ip_auth_hdr*)skb->data;
155 iph = skb->nh.iph; 155 iph = skb->nh.iph;
156 156
157 ihl = skb->data - skb->nh.raw; 157 ihl = skb->data - skb_network_header(skb);
158 memcpy(work_buf, iph, ihl); 158 memcpy(work_buf, iph, ihl);
159 159
160 iph->ttl = 0; 160 iph->ttl = 0;
@@ -181,7 +181,8 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb)
181 } 181 }
182 } 182 }
183 ((struct iphdr*)work_buf)->protocol = ah->nexthdr; 183 ((struct iphdr*)work_buf)->protocol = ah->nexthdr;
184 skb->h.raw = memcpy(skb->nh.raw += ah_hlen, work_buf, ihl); 184 skb->nh.raw += ah_hlen;
185 skb->h.raw = memcpy(skb_network_header(skb), work_buf, ihl);
185 __skb_pull(skb, ah_hlen + ihl); 186 __skb_pull(skb, ah_hlen + ihl);
186 187
187 return 0; 188 return 0;
diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c
index 31041127eeb8..222d21e5bbeb 100644
--- a/net/ipv4/esp4.c
+++ b/net/ipv4/esp4.c
@@ -57,9 +57,10 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
57 *(u8*)(trailer->tail + clen-skb->len - 2) = (clen - skb->len)-2; 57 *(u8*)(trailer->tail + clen-skb->len - 2) = (clen - skb->len)-2;
58 pskb_put(skb, trailer, clen - skb->len); 58 pskb_put(skb, trailer, clen - skb->len);
59 59
60 __skb_push(skb, skb->data - skb->nh.raw); 60 __skb_push(skb, skb->data - skb_network_header(skb));
61 top_iph = skb->nh.iph; 61 top_iph = skb->nh.iph;
62 esph = (struct ip_esp_hdr *)(skb->nh.raw + top_iph->ihl*4); 62 esph = (struct ip_esp_hdr *)(skb_network_header(skb) +
63 top_iph->ihl * 4);
63 top_iph->tot_len = htons(skb->len + alen); 64 top_iph->tot_len = htons(skb->len + alen);
64 *(u8*)(trailer->tail - 1) = top_iph->protocol; 65 *(u8*)(trailer->tail - 1) = top_iph->protocol;
65 66
@@ -222,7 +223,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb)
222 223
223 if (x->encap) { 224 if (x->encap) {
224 struct xfrm_encap_tmpl *encap = x->encap; 225 struct xfrm_encap_tmpl *encap = x->encap;
225 struct udphdr *uh = (void *)(skb->nh.raw + ihl); 226 struct udphdr *uh = (void *)(skb_network_header(skb) + ihl);
226 227
227 /* 228 /*
228 * 1) if the NAT-T peer's IP or port changed then 229 * 1) if the NAT-T peer's IP or port changed then
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
index 4b7a0d946a0d..ff124d40c585 100644
--- a/net/ipv4/icmp.c
+++ b/net/ipv4/icmp.c
@@ -484,7 +484,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
484 u8 _inner_type, *itp; 484 u8 _inner_type, *itp;
485 485
486 itp = skb_header_pointer(skb_in, 486 itp = skb_header_pointer(skb_in,
487 skb_in->nh.raw + 487 skb_network_header(skb_in) +
488 (iph->ihl << 2) + 488 (iph->ihl << 2) +
489 offsetof(struct icmphdr, 489 offsetof(struct icmphdr,
490 type) - 490 type) -
@@ -536,7 +536,7 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
536 icmp_param.data.icmph.un.gateway = info; 536 icmp_param.data.icmph.un.gateway = info;
537 icmp_param.data.icmph.checksum = 0; 537 icmp_param.data.icmph.checksum = 0;
538 icmp_param.skb = skb_in; 538 icmp_param.skb = skb_in;
539 icmp_param.offset = skb_in->nh.raw - skb_in->data; 539 icmp_param.offset = skb_network_offset(skb_in);
540 icmp_out_count(icmp_param.data.icmph.type); 540 icmp_out_count(icmp_param.data.icmph.type);
541 inet_sk(icmp_socket->sk)->tos = tos; 541 inet_sk(icmp_socket->sk)->tos = tos;
542 ipc.addr = iph->saddr; 542 ipc.addr = iph->saddr;
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c
index 3dfd7581cfc6..268a6c7347f2 100644
--- a/net/ipv4/ip_fragment.c
+++ b/net/ipv4/ip_fragment.c
@@ -658,7 +658,7 @@ static struct sk_buff *ip_frag_reasm(struct ipq *qp, struct net_device *dev)
658 } 658 }
659 659
660 skb_shinfo(head)->frag_list = head->next; 660 skb_shinfo(head)->frag_list = head->next;
661 skb_push(head, head->data - head->nh.raw); 661 skb_push(head, head->data - skb_network_header(head));
662 atomic_sub(head->truesize, &ip_frag_mem); 662 atomic_sub(head->truesize, &ip_frag_mem);
663 663
664 for (fp=head->next; fp; fp = fp->next) { 664 for (fp=head->next; fp; fp = fp->next) {
diff --git a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c
index f906a80d5a87..f7e9db612565 100644
--- a/net/ipv4/ip_options.c
+++ b/net/ipv4/ip_options.c
@@ -40,7 +40,7 @@
40void ip_options_build(struct sk_buff * skb, struct ip_options * opt, 40void ip_options_build(struct sk_buff * skb, struct ip_options * opt,
41 __be32 daddr, struct rtable *rt, int is_frag) 41 __be32 daddr, struct rtable *rt, int is_frag)
42{ 42{
43 unsigned char * iph = skb->nh.raw; 43 unsigned char *iph = skb_network_header(skb);
44 44
45 memcpy(&(IPCB(skb)->opt), opt, sizeof(struct ip_options)); 45 memcpy(&(IPCB(skb)->opt), opt, sizeof(struct ip_options));
46 memcpy(iph+sizeof(struct iphdr), opt->__data, opt->optlen); 46 memcpy(iph+sizeof(struct iphdr), opt->__data, opt->optlen);
@@ -104,7 +104,7 @@ int ip_options_echo(struct ip_options * dopt, struct sk_buff * skb)
104 return 0; 104 return 0;
105 } 105 }
106 106
107 sptr = skb->nh.raw; 107 sptr = skb_network_header(skb);
108 dptr = dopt->__data; 108 dptr = dopt->__data;
109 109
110 if (skb->dst) 110 if (skb->dst)
@@ -217,7 +217,7 @@ int ip_options_echo(struct ip_options * dopt, struct sk_buff * skb)
217 217
218void ip_options_fragment(struct sk_buff * skb) 218void ip_options_fragment(struct sk_buff * skb)
219{ 219{
220 unsigned char * optptr = skb->nh.raw + sizeof(struct iphdr); 220 unsigned char *optptr = skb_network_header(skb) + sizeof(struct iphdr);
221 struct ip_options * opt = &(IPCB(skb)->opt); 221 struct ip_options * opt = &(IPCB(skb)->opt);
222 int l = opt->optlen; 222 int l = opt->optlen;
223 int optlen; 223 int optlen;
@@ -264,7 +264,7 @@ int ip_options_compile(struct ip_options * opt, struct sk_buff * skb)
264 264
265 if (!opt) { 265 if (!opt) {
266 opt = &(IPCB(skb)->opt); 266 opt = &(IPCB(skb)->opt);
267 iph = skb->nh.raw; 267 iph = skb_network_header(skb);
268 opt->optlen = ((struct iphdr *)iph)->ihl*4 - sizeof(struct iphdr); 268 opt->optlen = ((struct iphdr *)iph)->ihl*4 - sizeof(struct iphdr);
269 optptr = iph + sizeof(struct iphdr); 269 optptr = iph + sizeof(struct iphdr);
270 opt->is_data = 0; 270 opt->is_data = 0;
@@ -563,7 +563,7 @@ void ip_forward_options(struct sk_buff *skb)
563 struct ip_options * opt = &(IPCB(skb)->opt); 563 struct ip_options * opt = &(IPCB(skb)->opt);
564 unsigned char * optptr; 564 unsigned char * optptr;
565 struct rtable *rt = (struct rtable*)skb->dst; 565 struct rtable *rt = (struct rtable*)skb->dst;
566 unsigned char *raw = skb->nh.raw; 566 unsigned char *raw = skb_network_header(skb);
567 567
568 if (opt->rr_needaddr) { 568 if (opt->rr_needaddr) {
569 optptr = (unsigned char *)raw + opt->rr; 569 optptr = (unsigned char *)raw + opt->rr;
@@ -609,7 +609,7 @@ int ip_options_rcv_srr(struct sk_buff *skb)
609 int srrspace, srrptr; 609 int srrspace, srrptr;
610 __be32 nexthop; 610 __be32 nexthop;
611 struct iphdr *iph = skb->nh.iph; 611 struct iphdr *iph = skb->nh.iph;
612 unsigned char * optptr = skb->nh.raw + opt->srr; 612 unsigned char *optptr = skb_network_header(skb) + opt->srr;
613 struct rtable *rt = (struct rtable*)skb->dst; 613 struct rtable *rt = (struct rtable*)skb->dst;
614 struct rtable *rt2; 614 struct rtable *rt2;
615 int err; 615 int err;
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index 669f5d97c6eb..eae228469627 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -503,7 +503,7 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
503 frag->h.raw = frag->data; 503 frag->h.raw = frag->data;
504 __skb_push(frag, hlen); 504 __skb_push(frag, hlen);
505 skb_reset_network_header(frag); 505 skb_reset_network_header(frag);
506 memcpy(frag->nh.raw, iph, hlen); 506 memcpy(skb_network_header(frag), iph, hlen);
507 iph = frag->nh.iph; 507 iph = frag->nh.iph;
508 iph->tot_len = htons(frag->len); 508 iph->tot_len = htons(frag->len);
509 ip_copy_metadata(frag, skb); 509 ip_copy_metadata(frag, skb);
@@ -607,7 +607,7 @@ slow_path:
607 * Copy the packet header into the new buffer. 607 * Copy the packet header into the new buffer.
608 */ 608 */
609 609
610 memcpy(skb2->nh.raw, skb->data, hlen); 610 memcpy(skb_network_header(skb2), skb->data, hlen);
611 611
612 /* 612 /*
613 * Copy a block of the IP datagram. 613 * Copy a block of the IP datagram.
@@ -1198,7 +1198,7 @@ int ip_push_pending_frames(struct sock *sk)
1198 tail_skb = &(skb_shinfo(skb)->frag_list); 1198 tail_skb = &(skb_shinfo(skb)->frag_list);
1199 1199
1200 /* move skb->data to ip header from ext header */ 1200 /* move skb->data to ip header from ext header */
1201 if (skb->data < skb->nh.raw) 1201 if (skb->data < skb_network_header(skb))
1202 __skb_pull(skb, skb_network_offset(skb)); 1202 __skb_pull(skb, skb_network_offset(skb));
1203 while ((tmp_skb = __skb_dequeue(&sk->sk_write_queue)) != NULL) { 1203 while ((tmp_skb = __skb_dequeue(&sk->sk_write_queue)) != NULL) {
1204 __skb_pull(tmp_skb, skb->h.raw - skb->nh.raw); 1204 __skb_pull(tmp_skb, skb->h.raw - skb->nh.raw);
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
index f8ab654b6a35..70888e1ef6b7 100644
--- a/net/ipv4/ip_sockglue.c
+++ b/net/ipv4/ip_sockglue.c
@@ -273,7 +273,8 @@ void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
273 serr->ee.ee_pad = 0; 273 serr->ee.ee_pad = 0;
274 serr->ee.ee_info = info; 274 serr->ee.ee_info = info;
275 serr->ee.ee_data = 0; 275 serr->ee.ee_data = 0;
276 serr->addr_offset = (u8*)&(((struct iphdr*)(skb->h.icmph+1))->daddr) - skb->nh.raw; 276 serr->addr_offset = (u8 *)&(((struct iphdr *)(skb->h.icmph + 1))->daddr) -
277 skb_network_header(skb);
277 serr->port = port; 278 serr->port = port;
278 279
279 skb->h.raw = payload; 280 skb->h.raw = payload;
@@ -309,7 +310,7 @@ void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 inf
309 serr->ee.ee_pad = 0; 310 serr->ee.ee_pad = 0;
310 serr->ee.ee_info = info; 311 serr->ee.ee_info = info;
311 serr->ee.ee_data = 0; 312 serr->ee.ee_data = 0;
312 serr->addr_offset = (u8*)&iph->daddr - skb->nh.raw; 313 serr->addr_offset = (u8 *)&iph->daddr - skb_network_header(skb);
313 serr->port = port; 314 serr->port = port;
314 315
315 skb->h.raw = skb->tail; 316 skb->h.raw = skb->tail;
@@ -355,7 +356,8 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len)
355 sin = (struct sockaddr_in *)msg->msg_name; 356 sin = (struct sockaddr_in *)msg->msg_name;
356 if (sin) { 357 if (sin) {
357 sin->sin_family = AF_INET; 358 sin->sin_family = AF_INET;
358 sin->sin_addr.s_addr = *(__be32*)(skb->nh.raw + serr->addr_offset); 359 sin->sin_addr.s_addr = *(__be32 *)(skb_network_header(skb) +
360 serr->addr_offset);
359 sin->sin_port = serr->port; 361 sin->sin_port = serr->port;
360 memset(&sin->sin_zero, 0, sizeof(sin->sin_zero)); 362 memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));
361 } 363 }
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
index 51528d3cc334..4a8d99bca441 100644
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
@@ -563,7 +563,7 @@ static int ipmr_cache_report(struct sk_buff *pkt, vifi_t vifi, int assert)
563 */ 563 */
564 msg = (struct igmpmsg*)skb_push(skb, sizeof(struct iphdr)); 564 msg = (struct igmpmsg*)skb_push(skb, sizeof(struct iphdr));
565 skb->nh.raw = skb->h.raw = (u8*)msg; 565 skb->nh.raw = skb->h.raw = (u8*)msg;
566 memcpy(msg, pkt->nh.raw, sizeof(struct iphdr)); 566 memcpy(msg, skb_network_header(pkt), sizeof(struct iphdr));
567 msg->im_msgtype = IGMPMSG_WHOLEPKT; 567 msg->im_msgtype = IGMPMSG_WHOLEPKT;
568 msg->im_mbz = 0; 568 msg->im_mbz = 0;
569 msg->im_vif = reg_vif_num; 569 msg->im_vif = reg_vif_num;
diff --git a/net/ipv4/ipvs/ip_vs_app.c b/net/ipv4/ipvs/ip_vs_app.c
index 22e104c6a493..f29d3a27eec6 100644
--- a/net/ipv4/ipvs/ip_vs_app.c
+++ b/net/ipv4/ipvs/ip_vs_app.c
@@ -338,7 +338,7 @@ static inline int app_tcp_pkt_out(struct ip_vs_conn *cp, struct sk_buff **pskb,
338 if (!ip_vs_make_skb_writable(pskb, tcp_offset + sizeof(*th))) 338 if (!ip_vs_make_skb_writable(pskb, tcp_offset + sizeof(*th)))
339 return 0; 339 return 0;
340 340
341 th = (struct tcphdr *)((*pskb)->nh.raw + tcp_offset); 341 th = (struct tcphdr *)(skb_network_header(*pskb) + tcp_offset);
342 342
343 /* 343 /*
344 * Remember seq number in case this pkt gets resized 344 * Remember seq number in case this pkt gets resized
@@ -413,7 +413,7 @@ static inline int app_tcp_pkt_in(struct ip_vs_conn *cp, struct sk_buff **pskb,
413 if (!ip_vs_make_skb_writable(pskb, tcp_offset + sizeof(*th))) 413 if (!ip_vs_make_skb_writable(pskb, tcp_offset + sizeof(*th)))
414 return 0; 414 return 0;
415 415
416 th = (struct tcphdr *)((*pskb)->nh.raw + tcp_offset); 416 th = (struct tcphdr *)(skb_network_header(*pskb) + tcp_offset);
417 417
418 /* 418 /*
419 * Remember seq number in case this pkt gets resized 419 * Remember seq number in case this pkt gets resized
diff --git a/net/ipv4/ipvs/ip_vs_core.c b/net/ipv4/ipvs/ip_vs_core.c
index 858686d616a2..5d54dd2ce12f 100644
--- a/net/ipv4/ipvs/ip_vs_core.c
+++ b/net/ipv4/ipvs/ip_vs_core.c
@@ -559,7 +559,8 @@ void ip_vs_nat_icmp(struct sk_buff *skb, struct ip_vs_protocol *pp,
559{ 559{
560 struct iphdr *iph = skb->nh.iph; 560 struct iphdr *iph = skb->nh.iph;
561 unsigned int icmp_offset = iph->ihl*4; 561 unsigned int icmp_offset = iph->ihl*4;
562 struct icmphdr *icmph = (struct icmphdr *)(skb->nh.raw + icmp_offset); 562 struct icmphdr *icmph = (struct icmphdr *)(skb_network_header(skb) +
563 icmp_offset);
563 struct iphdr *ciph = (struct iphdr *)(icmph + 1); 564 struct iphdr *ciph = (struct iphdr *)(icmph + 1);
564 565
565 if (inout) { 566 if (inout) {
diff --git a/net/ipv4/netfilter/arpt_mangle.c b/net/ipv4/netfilter/arpt_mangle.c
index 709db4d3f48f..af1c8593eb19 100644
--- a/net/ipv4/netfilter/arpt_mangle.c
+++ b/net/ipv4/netfilter/arpt_mangle.c
@@ -31,7 +31,7 @@ target(struct sk_buff **pskb,
31 } 31 }
32 32
33 arp = (*pskb)->nh.arph; 33 arp = (*pskb)->nh.arph;
34 arpptr = (*pskb)->nh.raw + sizeof(*arp); 34 arpptr = skb_network_header(*pskb) + sizeof(*arp);
35 pln = arp->ar_pln; 35 pln = arp->ar_pln;
36 hln = arp->ar_hln; 36 hln = arp->ar_hln;
37 /* We assume that pln and hln were checked in the match */ 37 /* We assume that pln and hln were checked in the match */
diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
index 8f3e92d20df8..7cebbff0b0c3 100644
--- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
+++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
@@ -105,7 +105,7 @@ ipv4_prepare(struct sk_buff **pskb, unsigned int hooknum, unsigned int *dataoff,
105 return -NF_DROP; 105 return -NF_DROP;
106 } 106 }
107 107
108 *dataoff = (*pskb)->nh.raw - (*pskb)->data + (*pskb)->nh.iph->ihl*4; 108 *dataoff = skb_network_offset(*pskb) + (*pskb)->nh.iph->ihl * 4;
109 *protonum = (*pskb)->nh.iph->protocol; 109 *protonum = (*pskb)->nh.iph->protocol;
110 110
111 return NF_ACCEPT; 111 return NF_ACCEPT;
@@ -151,10 +151,9 @@ static unsigned int ipv4_conntrack_help(unsigned int hooknum,
151 if (!help || !help->helper) 151 if (!help || !help->helper)
152 return NF_ACCEPT; 152 return NF_ACCEPT;
153 153
154 return help->helper->help(pskb, 154 return help->helper->help(pskb, (skb_network_offset(*pskb) +
155 (*pskb)->nh.raw - (*pskb)->data 155 (*pskb)->nh.iph->ihl * 4),
156 + (*pskb)->nh.iph->ihl*4, 156 ct, ctinfo);
157 ct, ctinfo);
158} 157}
159 158
160static unsigned int ipv4_conntrack_defrag(unsigned int hooknum, 159static unsigned int ipv4_conntrack_defrag(unsigned int hooknum,
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index 67e5e3c035c1..a3d02fdfc066 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c
@@ -256,7 +256,7 @@ int raw_rcv(struct sock *sk, struct sk_buff *skb)
256 } 256 }
257 nf_reset(skb); 257 nf_reset(skb);
258 258
259 skb_push(skb, skb->data - skb->nh.raw); 259 skb_push(skb, skb->data - skb_network_header(skb));
260 260
261 raw_rcv_skb(sk, skb); 261 raw_rcv_skb(sk, skb);
262 return 0; 262 return 0;
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index f5e019cefc15..00190835cea1 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -3634,7 +3634,7 @@ tcp_collapse(struct sock *sk, struct sk_buff_head *list,
3634 return; 3634 return;
3635 3635
3636 skb_set_mac_header(nskb, skb_mac_header(skb) - skb->head); 3636 skb_set_mac_header(nskb, skb_mac_header(skb) - skb->head);
3637 nskb->nh.raw = nskb->data + (skb->nh.raw - skb->head); 3637 nskb->nh.raw = nskb->data + (skb_network_header(skb) - skb->head);
3638 nskb->h.raw = nskb->data + (skb->h.raw - skb->head); 3638 nskb->h.raw = nskb->data + (skb->h.raw - skb->head);
3639 3639
3640 skb_reserve(nskb, header); 3640 skb_reserve(nskb, header);
diff --git a/net/ipv4/xfrm4_input.c b/net/ipv4/xfrm4_input.c
index 78e80deb7e89..d89969c502dd 100644
--- a/net/ipv4/xfrm4_input.c
+++ b/net/ipv4/xfrm4_input.c
@@ -146,7 +146,7 @@ int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type)
146 return 0; 146 return 0;
147 } else { 147 } else {
148#ifdef CONFIG_NETFILTER 148#ifdef CONFIG_NETFILTER
149 __skb_push(skb, skb->data - skb->nh.raw); 149 __skb_push(skb, skb->data - skb_network_header(skb));
150 skb->nh.iph->tot_len = htons(skb->len); 150 skb->nh.iph->tot_len = htons(skb->len);
151 ip_send_check(skb->nh.iph); 151 ip_send_check(skb->nh.iph);
152 152
diff --git a/net/ipv4/xfrm4_mode_beet.c b/net/ipv4/xfrm4_mode_beet.c
index eaaf3565f3b2..505fca034a1f 100644
--- a/net/ipv4/xfrm4_mode_beet.c
+++ b/net/ipv4/xfrm4_mode_beet.c
@@ -98,7 +98,7 @@ static int xfrm4_beet_input(struct xfrm_state *x, struct sk_buff *skb)
98 } 98 }
99 99
100 skb->nh.raw = skb->data + (phlen - sizeof(*iph)); 100 skb->nh.raw = skb->data + (phlen - sizeof(*iph));
101 memmove(skb->nh.raw, iph, sizeof(*iph)); 101 memmove(skb_network_header(skb), iph, sizeof(*iph));
102 skb->h.raw = skb->data + (phlen + optlen); 102 skb->h.raw = skb->data + (phlen + optlen);
103 skb->data = skb->h.raw; 103 skb->data = skb->h.raw;
104 104
@@ -112,7 +112,7 @@ static int xfrm4_beet_input(struct xfrm_state *x, struct sk_buff *skb)
112 else 112 else
113 iph->protocol = protocol; 113 iph->protocol = protocol;
114 iph->check = 0; 114 iph->check = 0;
115 iph->check = ip_fast_csum(skb->nh.raw, iph->ihl); 115 iph->check = ip_fast_csum(skb_network_header(skb), iph->ihl);
116 err = 0; 116 err = 0;
117out: 117out:
118 return err; 118 return err;
diff --git a/net/ipv4/xfrm4_mode_transport.c b/net/ipv4/xfrm4_mode_transport.c
index a820dde2c862..b198087c073e 100644
--- a/net/ipv4/xfrm4_mode_transport.c
+++ b/net/ipv4/xfrm4_mode_transport.c
@@ -34,7 +34,7 @@ static int xfrm4_transport_output(struct xfrm_state *x, struct sk_buff *skb)
34 34
35 skb_push(skb, x->props.header_len); 35 skb_push(skb, x->props.header_len);
36 skb_reset_network_header(skb); 36 skb_reset_network_header(skb);
37 memmove(skb->nh.raw, iph, ihl); 37 memmove(skb_network_header(skb), iph, ihl);
38 return 0; 38 return 0;
39} 39}
40 40
@@ -51,7 +51,7 @@ static int xfrm4_transport_input(struct xfrm_state *x, struct sk_buff *skb)
51 int ihl = skb->data - skb->h.raw; 51 int ihl = skb->data - skb->h.raw;
52 52
53 if (skb->h.raw != skb->nh.raw) { 53 if (skb->h.raw != skb->nh.raw) {
54 memmove(skb->h.raw, skb->nh.raw, ihl); 54 memmove(skb->h.raw, skb_network_header(skb), ihl);
55 skb->nh.raw = skb->h.raw; 55 skb->nh.raw = skb->h.raw;
56 } 56 }
57 skb->nh.iph->tot_len = htons(skb->len + ihl); 57 skb->nh.iph->tot_len = htons(skb->len + ihl);
diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
index 98a833ce1114..fbb1d3decf02 100644
--- a/net/ipv4/xfrm4_policy.c
+++ b/net/ipv4/xfrm4_policy.c
@@ -210,7 +210,7 @@ static void
210_decode_session4(struct sk_buff *skb, struct flowi *fl) 210_decode_session4(struct sk_buff *skb, struct flowi *fl)
211{ 211{
212 struct iphdr *iph = skb->nh.iph; 212 struct iphdr *iph = skb->nh.iph;
213 u8 *xprth = skb->nh.raw + iph->ihl*4; 213 u8 *xprth = skb_network_header(skb) + iph->ihl * 4;
214 214
215 memset(fl, 0, sizeof(struct flowi)); 215 memset(fl, 0, sizeof(struct flowi));
216 if (!(iph->frag_off & htons(IP_MF | IP_OFFSET))) { 216 if (!(iph->frag_off & htons(IP_MF | IP_OFFSET))) {
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
index 2ff070417955..7b917f856e1c 100644
--- a/net/ipv6/af_inet6.c
+++ b/net/ipv6/af_inet6.c
@@ -693,7 +693,8 @@ int ipv6_opt_accepted(struct sock *sk, struct sk_buff *skb)
693 if (np->rxopt.all) { 693 if (np->rxopt.all) {
694 if ((opt->hop && (np->rxopt.bits.hopopts || 694 if ((opt->hop && (np->rxopt.bits.hopopts ||
695 np->rxopt.bits.ohopopts)) || 695 np->rxopt.bits.ohopopts)) ||
696 ((IPV6_FLOWINFO_MASK & *(__be32*)skb->nh.raw) && 696 ((IPV6_FLOWINFO_MASK &
697 *(__be32 *)skb_network_header(skb)) &&
697 np->rxopt.bits.rxflow) || 698 np->rxopt.bits.rxflow) ||
698 (opt->srcrt && (np->rxopt.bits.srcrt || 699 (opt->srcrt && (np->rxopt.bits.srcrt ||
699 np->rxopt.bits.osrcrt)) || 700 np->rxopt.bits.osrcrt)) ||
diff --git a/net/ipv6/ah6.c b/net/ipv6/ah6.c
index dc68b7269c3c..1c914386982f 100644
--- a/net/ipv6/ah6.c
+++ b/net/ipv6/ah6.c
@@ -238,8 +238,8 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb)
238 top_iph = (struct ipv6hdr *)skb->data; 238 top_iph = (struct ipv6hdr *)skb->data;
239 top_iph->payload_len = htons(skb->len - sizeof(*top_iph)); 239 top_iph->payload_len = htons(skb->len - sizeof(*top_iph));
240 240
241 nexthdr = *skb->nh.raw; 241 nexthdr = *skb_network_header(skb);
242 *skb->nh.raw = IPPROTO_AH; 242 *skb_network_header(skb) = IPPROTO_AH;
243 243
244 /* When there are no extension headers, we only need to save the first 244 /* When there are no extension headers, we only need to save the first
245 * 8 bytes of the base IP header. 245 * 8 bytes of the base IP header.
@@ -341,7 +341,7 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb)
341 pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) 341 pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
342 goto out; 342 goto out;
343 343
344 hdr_len = skb->data - skb->nh.raw; 344 hdr_len = skb->data - skb_network_header(skb);
345 ah = (struct ipv6_auth_hdr*)skb->data; 345 ah = (struct ipv6_auth_hdr*)skb->data;
346 ahp = x->data; 346 ahp = x->data;
347 nexthdr = ah->nexthdr; 347 nexthdr = ah->nexthdr;
@@ -354,7 +354,7 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb)
354 if (!pskb_may_pull(skb, ah_hlen)) 354 if (!pskb_may_pull(skb, ah_hlen))
355 goto out; 355 goto out;
356 356
357 tmp_hdr = kmemdup(skb->nh.raw, hdr_len, GFP_ATOMIC); 357 tmp_hdr = kmemdup(skb_network_header(skb), hdr_len, GFP_ATOMIC);
358 if (!tmp_hdr) 358 if (!tmp_hdr)
359 goto out; 359 goto out;
360 if (ipv6_clear_mutable_options(skb->nh.ipv6h, hdr_len, XFRM_POLICY_IN)) 360 if (ipv6_clear_mutable_options(skb->nh.ipv6h, hdr_len, XFRM_POLICY_IN))
@@ -382,7 +382,9 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb)
382 } 382 }
383 } 383 }
384 384
385 skb->h.raw = memcpy(skb->nh.raw += ah_hlen, tmp_hdr, hdr_len); 385 skb->nh.raw += ah_hlen;
386 memcpy(skb_network_header(skb), tmp_hdr, hdr_len);
387 skb->h.raw = skb->nh.raw;
386 __skb_pull(skb, ah_hlen + hdr_len); 388 __skb_pull(skb, ah_hlen + hdr_len);
387 389
388 kfree(tmp_hdr); 390 kfree(tmp_hdr);
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c
index 31a20f17c854..7a86db6163ee 100644
--- a/net/ipv6/datagram.c
+++ b/net/ipv6/datagram.c
@@ -227,7 +227,8 @@ void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
227 serr->ee.ee_pad = 0; 227 serr->ee.ee_pad = 0;
228 serr->ee.ee_info = info; 228 serr->ee.ee_info = info;
229 serr->ee.ee_data = 0; 229 serr->ee.ee_data = 0;
230 serr->addr_offset = (u8*)&(((struct ipv6hdr*)(icmph+1))->daddr) - skb->nh.raw; 230 serr->addr_offset = (u8 *)&(((struct ipv6hdr *)(icmph + 1))->daddr) -
231 skb_network_header(skb);
231 serr->port = port; 232 serr->port = port;
232 233
233 skb->h.raw = payload; 234 skb->h.raw = payload;
@@ -264,7 +265,7 @@ void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info)
264 serr->ee.ee_pad = 0; 265 serr->ee.ee_pad = 0;
265 serr->ee.ee_info = info; 266 serr->ee.ee_info = info;
266 serr->ee.ee_data = 0; 267 serr->ee.ee_data = 0;
267 serr->addr_offset = (u8*)&iph->daddr - skb->nh.raw; 268 serr->addr_offset = (u8 *)&iph->daddr - skb_network_header(skb);
268 serr->port = fl->fl_ip_dport; 269 serr->port = fl->fl_ip_dport;
269 270
270 skb->h.raw = skb->tail; 271 skb->h.raw = skb->tail;
@@ -310,21 +311,24 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
310 311
311 sin = (struct sockaddr_in6 *)msg->msg_name; 312 sin = (struct sockaddr_in6 *)msg->msg_name;
312 if (sin) { 313 if (sin) {
314 const unsigned char *nh = skb_network_header(skb);
313 sin->sin6_family = AF_INET6; 315 sin->sin6_family = AF_INET6;
314 sin->sin6_flowinfo = 0; 316 sin->sin6_flowinfo = 0;
315 sin->sin6_port = serr->port; 317 sin->sin6_port = serr->port;
316 sin->sin6_scope_id = 0; 318 sin->sin6_scope_id = 0;
317 if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6) { 319 if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6) {
318 ipv6_addr_copy(&sin->sin6_addr, 320 ipv6_addr_copy(&sin->sin6_addr,
319 (struct in6_addr *)(skb->nh.raw + serr->addr_offset)); 321 (struct in6_addr *)(nh + serr->addr_offset));
320 if (np->sndflow) 322 if (np->sndflow)
321 sin->sin6_flowinfo = *(__be32*)(skb->nh.raw + serr->addr_offset - 24) & IPV6_FLOWINFO_MASK; 323 sin->sin6_flowinfo =
324 (*(__be32 *)(nh + serr->addr_offset - 24) &
325 IPV6_FLOWINFO_MASK);
322 if (ipv6_addr_type(&sin->sin6_addr) & IPV6_ADDR_LINKLOCAL) 326 if (ipv6_addr_type(&sin->sin6_addr) & IPV6_ADDR_LINKLOCAL)
323 sin->sin6_scope_id = IP6CB(skb)->iif; 327 sin->sin6_scope_id = IP6CB(skb)->iif;
324 } else { 328 } else {
325 ipv6_addr_set(&sin->sin6_addr, 0, 0, 329 ipv6_addr_set(&sin->sin6_addr, 0, 0,
326 htonl(0xffff), 330 htonl(0xffff),
327 *(__be32*)(skb->nh.raw + serr->addr_offset)); 331 *(__be32 *)(nh + serr->addr_offset));
328 } 332 }
329 } 333 }
330 334
@@ -382,6 +386,7 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)
382{ 386{
383 struct ipv6_pinfo *np = inet6_sk(sk); 387 struct ipv6_pinfo *np = inet6_sk(sk);
384 struct inet6_skb_parm *opt = IP6CB(skb); 388 struct inet6_skb_parm *opt = IP6CB(skb);
389 unsigned char *nh = skb_network_header(skb);
385 390
386 if (np->rxopt.bits.rxinfo) { 391 if (np->rxopt.bits.rxinfo) {
387 struct in6_pktinfo src_info; 392 struct in6_pktinfo src_info;
@@ -401,14 +406,14 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)
401 put_cmsg(msg, SOL_IPV6, IPV6_TCLASS, sizeof(tclass), &tclass); 406 put_cmsg(msg, SOL_IPV6, IPV6_TCLASS, sizeof(tclass), &tclass);
402 } 407 }
403 408
404 if (np->rxopt.bits.rxflow && (*(__be32*)skb->nh.raw & IPV6_FLOWINFO_MASK)) { 409 if (np->rxopt.bits.rxflow && (*(__be32 *)nh & IPV6_FLOWINFO_MASK)) {
405 __be32 flowinfo = *(__be32*)skb->nh.raw & IPV6_FLOWINFO_MASK; 410 __be32 flowinfo = *(__be32 *)nh & IPV6_FLOWINFO_MASK;
406 put_cmsg(msg, SOL_IPV6, IPV6_FLOWINFO, sizeof(flowinfo), &flowinfo); 411 put_cmsg(msg, SOL_IPV6, IPV6_FLOWINFO, sizeof(flowinfo), &flowinfo);
407 } 412 }
408 413
409 /* HbH is allowed only once */ 414 /* HbH is allowed only once */
410 if (np->rxopt.bits.hopopts && opt->hop) { 415 if (np->rxopt.bits.hopopts && opt->hop) {
411 u8 *ptr = skb->nh.raw + opt->hop; 416 u8 *ptr = nh + opt->hop;
412 put_cmsg(msg, SOL_IPV6, IPV6_HOPOPTS, (ptr[1]+1)<<3, ptr); 417 put_cmsg(msg, SOL_IPV6, IPV6_HOPOPTS, (ptr[1]+1)<<3, ptr);
413 } 418 }
414 419
@@ -428,7 +433,7 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)
428 433
429 while (off <= opt->lastopt) { 434 while (off <= opt->lastopt) {
430 unsigned len; 435 unsigned len;
431 u8 *ptr = skb->nh.raw + off; 436 u8 *ptr = nh + off;
432 437
433 switch(nexthdr) { 438 switch(nexthdr) {
434 case IPPROTO_DSTOPTS: 439 case IPPROTO_DSTOPTS:
@@ -470,19 +475,19 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)
470 put_cmsg(msg, SOL_IPV6, IPV6_2292HOPLIMIT, sizeof(hlim), &hlim); 475 put_cmsg(msg, SOL_IPV6, IPV6_2292HOPLIMIT, sizeof(hlim), &hlim);
471 } 476 }
472 if (np->rxopt.bits.ohopopts && opt->hop) { 477 if (np->rxopt.bits.ohopopts && opt->hop) {
473 u8 *ptr = skb->nh.raw + opt->hop; 478 u8 *ptr = nh + opt->hop;
474 put_cmsg(msg, SOL_IPV6, IPV6_2292HOPOPTS, (ptr[1]+1)<<3, ptr); 479 put_cmsg(msg, SOL_IPV6, IPV6_2292HOPOPTS, (ptr[1]+1)<<3, ptr);
475 } 480 }
476 if (np->rxopt.bits.odstopts && opt->dst0) { 481 if (np->rxopt.bits.odstopts && opt->dst0) {
477 u8 *ptr = skb->nh.raw + opt->dst0; 482 u8 *ptr = nh + opt->dst0;
478 put_cmsg(msg, SOL_IPV6, IPV6_2292DSTOPTS, (ptr[1]+1)<<3, ptr); 483 put_cmsg(msg, SOL_IPV6, IPV6_2292DSTOPTS, (ptr[1]+1)<<3, ptr);
479 } 484 }
480 if (np->rxopt.bits.osrcrt && opt->srcrt) { 485 if (np->rxopt.bits.osrcrt && opt->srcrt) {
481 struct ipv6_rt_hdr *rthdr = (struct ipv6_rt_hdr *)(skb->nh.raw + opt->srcrt); 486 struct ipv6_rt_hdr *rthdr = (struct ipv6_rt_hdr *)(nh + opt->srcrt);
482 put_cmsg(msg, SOL_IPV6, IPV6_2292RTHDR, (rthdr->hdrlen+1) << 3, rthdr); 487 put_cmsg(msg, SOL_IPV6, IPV6_2292RTHDR, (rthdr->hdrlen+1) << 3, rthdr);
483 } 488 }
484 if (np->rxopt.bits.odstopts && opt->dst1) { 489 if (np->rxopt.bits.odstopts && opt->dst1) {
485 u8 *ptr = skb->nh.raw + opt->dst1; 490 u8 *ptr = nh + opt->dst1;
486 put_cmsg(msg, SOL_IPV6, IPV6_2292DSTOPTS, (ptr[1]+1)<<3, ptr); 491 put_cmsg(msg, SOL_IPV6, IPV6_2292DSTOPTS, (ptr[1]+1)<<3, ptr);
487 } 492 }
488 return 0; 493 return 0;
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c
index 363e63ffecca..6e6b57ac8013 100644
--- a/net/ipv6/esp6.c
+++ b/net/ipv6/esp6.c
@@ -92,8 +92,8 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb)
92 top_iph = (struct ipv6hdr *)__skb_push(skb, hdr_len); 92 top_iph = (struct ipv6hdr *)__skb_push(skb, hdr_len);
93 esph = (struct ipv6_esp_hdr *)skb->h.raw; 93 esph = (struct ipv6_esp_hdr *)skb->h.raw;
94 top_iph->payload_len = htons(skb->len + alen - sizeof(*top_iph)); 94 top_iph->payload_len = htons(skb->len + alen - sizeof(*top_iph));
95 *(u8*)(trailer->tail - 1) = *skb->nh.raw; 95 *(u8 *)(trailer->tail - 1) = *skb_network_header(skb);
96 *skb->nh.raw = IPPROTO_ESP; 96 *skb_network_header(skb) = IPPROTO_ESP;
97 97
98 esph->spi = x->id.spi; 98 esph->spi = x->id.spi;
99 esph->seq_no = htonl(++x->replay.oseq); 99 esph->seq_no = htonl(++x->replay.oseq);
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c
index fce5abde554f..9ebf120ba6d3 100644
--- a/net/ipv6/exthdrs.c
+++ b/net/ipv6/exthdrs.c
@@ -50,13 +50,14 @@
50 50
51int ipv6_find_tlv(struct sk_buff *skb, int offset, int type) 51int ipv6_find_tlv(struct sk_buff *skb, int offset, int type)
52{ 52{
53 int packet_len = skb->tail - skb->nh.raw; 53 const unsigned char *nh = skb_network_header(skb);
54 int packet_len = skb->tail - nh;
54 struct ipv6_opt_hdr *hdr; 55 struct ipv6_opt_hdr *hdr;
55 int len; 56 int len;
56 57
57 if (offset + 2 > packet_len) 58 if (offset + 2 > packet_len)
58 goto bad; 59 goto bad;
59 hdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset); 60 hdr = (struct ipv6_opt_hdr *)(nh + offset);
60 len = ((hdr->hdrlen + 1) << 3); 61 len = ((hdr->hdrlen + 1) << 3);
61 62
62 if (offset + len > packet_len) 63 if (offset + len > packet_len)
@@ -66,7 +67,7 @@ int ipv6_find_tlv(struct sk_buff *skb, int offset, int type)
66 len -= 2; 67 len -= 2;
67 68
68 while (len > 0) { 69 while (len > 0) {
69 int opttype = skb->nh.raw[offset]; 70 int opttype = nh[offset];
70 int optlen; 71 int optlen;
71 72
72 if (opttype == type) 73 if (opttype == type)
@@ -77,7 +78,7 @@ int ipv6_find_tlv(struct sk_buff *skb, int offset, int type)
77 optlen = 1; 78 optlen = 1;
78 break; 79 break;
79 default: 80 default:
80 optlen = skb->nh.raw[offset + 1] + 2; 81 optlen = nh[offset + 1] + 2;
81 if (optlen > len) 82 if (optlen > len)
82 goto bad; 83 goto bad;
83 break; 84 break;
@@ -113,7 +114,7 @@ static int ip6_tlvopt_unknown(struct sk_buff **skbp, int optoff)
113{ 114{
114 struct sk_buff *skb = *skbp; 115 struct sk_buff *skb = *skbp;
115 116
116 switch ((skb->nh.raw[optoff] & 0xC0) >> 6) { 117 switch ((skb_network_header(skb)[optoff] & 0xC0) >> 6) {
117 case 0: /* ignore */ 118 case 0: /* ignore */
118 return 1; 119 return 1;
119 120
@@ -141,6 +142,7 @@ static int ip6_parse_tlv(struct tlvtype_proc *procs, struct sk_buff **skbp)
141{ 142{
142 struct sk_buff *skb = *skbp; 143 struct sk_buff *skb = *skbp;
143 struct tlvtype_proc *curr; 144 struct tlvtype_proc *curr;
145 const unsigned char *nh = skb_network_header(skb);
144 int off = skb->h.raw - skb->nh.raw; 146 int off = skb->h.raw - skb->nh.raw;
145 int len = ((skb->h.raw[1]+1)<<3); 147 int len = ((skb->h.raw[1]+1)<<3);
146 148
@@ -151,9 +153,9 @@ static int ip6_parse_tlv(struct tlvtype_proc *procs, struct sk_buff **skbp)
151 len -= 2; 153 len -= 2;
152 154
153 while (len > 0) { 155 while (len > 0) {
154 int optlen = skb->nh.raw[off+1]+2; 156 int optlen = nh[off + 1] + 2;
155 157
156 switch (skb->nh.raw[off]) { 158 switch (nh[off]) {
157 case IPV6_TLV_PAD0: 159 case IPV6_TLV_PAD0:
158 optlen = 1; 160 optlen = 1;
159 break; 161 break;
@@ -165,7 +167,7 @@ static int ip6_parse_tlv(struct tlvtype_proc *procs, struct sk_buff **skbp)
165 if (optlen > len) 167 if (optlen > len)
166 goto bad; 168 goto bad;
167 for (curr=procs; curr->type >= 0; curr++) { 169 for (curr=procs; curr->type >= 0; curr++) {
168 if (curr->type == skb->nh.raw[off]) { 170 if (curr->type == nh[off]) {
169 /* type specific length/alignment 171 /* type specific length/alignment
170 checks will be performed in the 172 checks will be performed in the
171 func(). */ 173 func(). */
@@ -211,7 +213,7 @@ static int ipv6_dest_hao(struct sk_buff **skbp, int optoff)
211 opt->dsthao = opt->dst1; 213 opt->dsthao = opt->dst1;
212 opt->dst1 = 0; 214 opt->dst1 = 0;
213 215
214 hao = (struct ipv6_destopt_hao *)(skb->nh.raw + optoff); 216 hao = (struct ipv6_destopt_hao *)(skb_network_header(skb) + optoff);
215 217
216 if (hao->length != 16) { 218 if (hao->length != 16) {
217 LIMIT_NETDEBUG( 219 LIMIT_NETDEBUG(
@@ -244,8 +246,9 @@ static int ipv6_dest_hao(struct sk_buff **skbp, int optoff)
244 246
245 /* update all variable using below by copied skbuff */ 247 /* update all variable using below by copied skbuff */
246 *skbp = skb = skb2; 248 *skbp = skb = skb2;
247 hao = (struct ipv6_destopt_hao *)(skb2->nh.raw + optoff); 249 hao = (struct ipv6_destopt_hao *)(skb_network_header(skb2) +
248 ipv6h = (struct ipv6hdr *)skb2->nh.raw; 250 optoff);
251 ipv6h = skb2->nh.ipv6h;
249 } 252 }
250 253
251 if (skb->ip_summed == CHECKSUM_COMPLETE) 254 if (skb->ip_summed == CHECKSUM_COMPLETE)
@@ -406,7 +409,8 @@ static int ipv6_rthdr_rcv(struct sk_buff **skbp)
406 default: 409 default:
407 IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), 410 IP6_INC_STATS_BH(ip6_dst_idev(skb->dst),
408 IPSTATS_MIB_INHDRERRORS); 411 IPSTATS_MIB_INHDRERRORS);
409 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, (&hdr->type) - skb->nh.raw); 412 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD,
413 (&hdr->type) - skb_network_header(skb));
410 return -1; 414 return -1;
411 } 415 }
412 416
@@ -443,7 +447,7 @@ looped_back:
443 skb->h.raw += (hdr->hdrlen + 1) << 3; 447 skb->h.raw += (hdr->hdrlen + 1) << 3;
444 opt->dst0 = opt->dst1; 448 opt->dst0 = opt->dst1;
445 opt->dst1 = 0; 449 opt->dst1 = 0;
446 opt->nhoff = (&hdr->nexthdr) - skb->nh.raw; 450 opt->nhoff = (&hdr->nexthdr) - skb_network_header(skb);
447 return 1; 451 return 1;
448 } 452 }
449 453
@@ -452,7 +456,9 @@ looped_back:
452 if (hdr->hdrlen & 0x01) { 456 if (hdr->hdrlen & 0x01) {
453 IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), 457 IP6_INC_STATS_BH(ip6_dst_idev(skb->dst),
454 IPSTATS_MIB_INHDRERRORS); 458 IPSTATS_MIB_INHDRERRORS);
455 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, (&hdr->hdrlen) - skb->nh.raw); 459 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD,
460 ((&hdr->hdrlen) -
461 skb_network_header(skb)));
456 return -1; 462 return -1;
457 } 463 }
458 break; 464 break;
@@ -479,7 +485,9 @@ looped_back:
479 if (hdr->segments_left > n) { 485 if (hdr->segments_left > n) {
480 IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), 486 IP6_INC_STATS_BH(ip6_dst_idev(skb->dst),
481 IPSTATS_MIB_INHDRERRORS); 487 IPSTATS_MIB_INHDRERRORS);
482 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, (&hdr->segments_left) - skb->nh.raw); 488 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD,
489 ((&hdr->segments_left) -
490 skb_network_header(skb)));
483 return -1; 491 return -1;
484 } 492 }
485 493
@@ -547,7 +555,7 @@ looped_back:
547 dst_release(xchg(&skb->dst, NULL)); 555 dst_release(xchg(&skb->dst, NULL));
548 ip6_route_input(skb); 556 ip6_route_input(skb);
549 if (skb->dst->error) { 557 if (skb->dst->error) {
550 skb_push(skb, skb->data - skb->nh.raw); 558 skb_push(skb, skb->data - skb_network_header(skb));
551 dst_input(skb); 559 dst_input(skb);
552 return -1; 560 return -1;
553 } 561 }
@@ -565,7 +573,7 @@ looped_back:
565 goto looped_back; 573 goto looped_back;
566 } 574 }
567 575
568 skb_push(skb, skb->data - skb->nh.raw); 576 skb_push(skb, skb->data - skb_network_header(skb));
569 dst_input(skb); 577 dst_input(skb);
570 return -1; 578 return -1;
571} 579}
@@ -656,13 +664,14 @@ EXPORT_SYMBOL_GPL(ipv6_invert_rthdr);
656static int ipv6_hop_ra(struct sk_buff **skbp, int optoff) 664static int ipv6_hop_ra(struct sk_buff **skbp, int optoff)
657{ 665{
658 struct sk_buff *skb = *skbp; 666 struct sk_buff *skb = *skbp;
667 const unsigned char *nh = skb_network_header(skb);
659 668
660 if (skb->nh.raw[optoff+1] == 2) { 669 if (nh[optoff + 1] == 2) {
661 IP6CB(skb)->ra = optoff; 670 IP6CB(skb)->ra = optoff;
662 return 1; 671 return 1;
663 } 672 }
664 LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_ra: wrong RA length %d\n", 673 LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_ra: wrong RA length %d\n",
665 skb->nh.raw[optoff+1]); 674 nh[optoff + 1]);
666 kfree_skb(skb); 675 kfree_skb(skb);
667 return 0; 676 return 0;
668} 677}
@@ -672,17 +681,18 @@ static int ipv6_hop_ra(struct sk_buff **skbp, int optoff)
672static int ipv6_hop_jumbo(struct sk_buff **skbp, int optoff) 681static int ipv6_hop_jumbo(struct sk_buff **skbp, int optoff)
673{ 682{
674 struct sk_buff *skb = *skbp; 683 struct sk_buff *skb = *skbp;
684 const unsigned char *nh = skb_network_header(skb);
675 u32 pkt_len; 685 u32 pkt_len;
676 686
677 if (skb->nh.raw[optoff+1] != 4 || (optoff&3) != 2) { 687 if (nh[optoff + 1] != 4 || (optoff & 3) != 2) {
678 LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n", 688 LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n",
679 skb->nh.raw[optoff+1]); 689 nh[optoff+1]);
680 IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), 690 IP6_INC_STATS_BH(ip6_dst_idev(skb->dst),
681 IPSTATS_MIB_INHDRERRORS); 691 IPSTATS_MIB_INHDRERRORS);
682 goto drop; 692 goto drop;
683 } 693 }
684 694
685 pkt_len = ntohl(*(__be32*)(skb->nh.raw+optoff+2)); 695 pkt_len = ntohl(*(__be32 *)(nh + optoff + 2));
686 if (pkt_len <= IPV6_MAXPLEN) { 696 if (pkt_len <= IPV6_MAXPLEN) {
687 IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_INHDRERRORS); 697 IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_INHDRERRORS);
688 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff+2); 698 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff+2);
@@ -727,7 +737,7 @@ int ipv6_parse_hopopts(struct sk_buff **skbp)
727 struct inet6_skb_parm *opt = IP6CB(skb); 737 struct inet6_skb_parm *opt = IP6CB(skb);
728 738
729 /* 739 /*
730 * skb->nh.raw is equal to skb->data, and 740 * skb_network_header(skb) is equal to skb->data, and
731 * skb->h.raw - skb->nh.raw is always equal to 741 * skb->h.raw - skb->nh.raw is always equal to
732 * sizeof(struct ipv6hdr) by definition of 742 * sizeof(struct ipv6hdr) by definition of
733 * hop-by-hop options. 743 * hop-by-hop options.
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c
index aa4a0a59ffac..e5293b34229f 100644
--- a/net/ipv6/icmp.c
+++ b/net/ipv6/icmp.c
@@ -284,7 +284,8 @@ static void mip6_addr_swap(struct sk_buff *skb)
284 if (opt->dsthao) { 284 if (opt->dsthao) {
285 off = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO); 285 off = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO);
286 if (likely(off >= 0)) { 286 if (likely(off >= 0)) {
287 hao = (struct ipv6_destopt_hao *)(skb->nh.raw + off); 287 hao = (struct ipv6_destopt_hao *)
288 (skb_network_header(skb) + off);
288 ipv6_addr_copy(&tmp, &iph->saddr); 289 ipv6_addr_copy(&tmp, &iph->saddr);
289 ipv6_addr_copy(&iph->saddr, &hao->addr); 290 ipv6_addr_copy(&iph->saddr, &hao->addr);
290 ipv6_addr_copy(&hao->addr, &tmp); 291 ipv6_addr_copy(&hao->addr, &tmp);
diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c
index 61e7a6c8141d..aecc74da0721 100644
--- a/net/ipv6/ip6_input.c
+++ b/net/ipv6/ip6_input.c
@@ -163,7 +163,7 @@ resubmit:
163 if (!pskb_pull(skb, skb->h.raw - skb->data)) 163 if (!pskb_pull(skb, skb->h.raw - skb->data))
164 goto discard; 164 goto discard;
165 nhoff = IP6CB(skb)->nhoff; 165 nhoff = IP6CB(skb)->nhoff;
166 nexthdr = skb->nh.raw[nhoff]; 166 nexthdr = skb_network_header(skb)[nhoff];
167 167
168 raw_sk = sk_head(&raw_v6_htable[nexthdr & (MAX_INET_PROTOS - 1)]); 168 raw_sk = sk_head(&raw_v6_htable[nexthdr & (MAX_INET_PROTOS - 1)]);
169 if (raw_sk && !ipv6_raw_deliver(skb, nexthdr)) 169 if (raw_sk && !ipv6_raw_deliver(skb, nexthdr))
@@ -181,7 +181,7 @@ resubmit:
181 indefinitely. */ 181 indefinitely. */
182 nf_reset(skb); 182 nf_reset(skb);
183 183
184 skb_postpull_rcsum(skb, skb->nh.raw, 184 skb_postpull_rcsum(skb, skb_network_header(skb),
185 skb->h.raw - skb->nh.raw); 185 skb->h.raw - skb->nh.raw);
186 hdr = skb->nh.ipv6h; 186 hdr = skb->nh.ipv6h;
187 if (ipv6_addr_is_multicast(&hdr->daddr) && 187 if (ipv6_addr_is_multicast(&hdr->daddr) &&
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 47d00210cba1..f1dfcc319717 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -323,10 +323,11 @@ static int ip6_forward_proxy_check(struct sk_buff *skb)
323 if (nexthdr == IPPROTO_ICMPV6) { 323 if (nexthdr == IPPROTO_ICMPV6) {
324 struct icmp6hdr *icmp6; 324 struct icmp6hdr *icmp6;
325 325
326 if (!pskb_may_pull(skb, skb->nh.raw + offset + 1 - skb->data)) 326 if (!pskb_may_pull(skb, (skb_network_header(skb) +
327 offset + 1 - skb->data)))
327 return 0; 328 return 0;
328 329
329 icmp6 = (struct icmp6hdr *)(skb->nh.raw + offset); 330 icmp6 = (struct icmp6hdr *)(skb_network_header(skb) + offset);
330 331
331 switch (icmp6->icmp6_type) { 332 switch (icmp6->icmp6_type) {
332 case NDISC_ROUTER_SOLICITATION: 333 case NDISC_ROUTER_SOLICITATION:
@@ -392,7 +393,7 @@ int ip6_forward(struct sk_buff *skb)
392 * that different fragments will go along one path. --ANK 393 * that different fragments will go along one path. --ANK
393 */ 394 */
394 if (opt->ra) { 395 if (opt->ra) {
395 u8 *ptr = skb->nh.raw + opt->ra; 396 u8 *ptr = skb_network_header(skb) + opt->ra;
396 if (ip6_call_ra_chain(skb, (ptr[2]<<8) + ptr[3])) 397 if (ip6_call_ra_chain(skb, (ptr[2]<<8) + ptr[3]))
397 return 0; 398 return 0;
398 } 399 }
@@ -527,7 +528,7 @@ int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr)
527{ 528{
528 u16 offset = sizeof(struct ipv6hdr); 529 u16 offset = sizeof(struct ipv6hdr);
529 struct ipv6_opt_hdr *exthdr = (struct ipv6_opt_hdr*)(skb->nh.ipv6h + 1); 530 struct ipv6_opt_hdr *exthdr = (struct ipv6_opt_hdr*)(skb->nh.ipv6h + 1);
530 unsigned int packet_len = skb->tail - skb->nh.raw; 531 unsigned int packet_len = skb->tail - skb_network_header(skb);
531 int found_rhdr = 0; 532 int found_rhdr = 0;
532 *nexthdr = &skb->nh.ipv6h->nexthdr; 533 *nexthdr = &skb->nh.ipv6h->nexthdr;
533 534
@@ -554,7 +555,8 @@ int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr)
554 555
555 offset += ipv6_optlen(exthdr); 556 offset += ipv6_optlen(exthdr);
556 *nexthdr = &exthdr->nexthdr; 557 *nexthdr = &exthdr->nexthdr;
557 exthdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset); 558 exthdr = (struct ipv6_opt_hdr *)(skb_network_header(skb) +
559 offset);
558 } 560 }
559 561
560 return offset; 562 return offset;
@@ -620,7 +622,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
620 /* BUILD HEADER */ 622 /* BUILD HEADER */
621 623
622 *prevhdr = NEXTHDR_FRAGMENT; 624 *prevhdr = NEXTHDR_FRAGMENT;
623 tmp_hdr = kmemdup(skb->nh.raw, hlen, GFP_ATOMIC); 625 tmp_hdr = kmemdup(skb_network_header(skb), hlen, GFP_ATOMIC);
624 if (!tmp_hdr) { 626 if (!tmp_hdr) {
625 IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS); 627 IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS);
626 return -ENOMEM; 628 return -ENOMEM;
@@ -630,7 +632,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
630 fh = (struct frag_hdr*)__skb_push(skb, sizeof(struct frag_hdr)); 632 fh = (struct frag_hdr*)__skb_push(skb, sizeof(struct frag_hdr));
631 __skb_push(skb, hlen); 633 __skb_push(skb, hlen);
632 skb_reset_network_header(skb); 634 skb_reset_network_header(skb);
633 memcpy(skb->nh.raw, tmp_hdr, hlen); 635 memcpy(skb_network_header(skb), tmp_hdr, hlen);
634 636
635 ipv6_select_ident(skb, fh); 637 ipv6_select_ident(skb, fh);
636 fh->nexthdr = nexthdr; 638 fh->nexthdr = nexthdr;
@@ -654,7 +656,8 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
654 fh = (struct frag_hdr*)__skb_push(frag, sizeof(struct frag_hdr)); 656 fh = (struct frag_hdr*)__skb_push(frag, sizeof(struct frag_hdr));
655 __skb_push(frag, hlen); 657 __skb_push(frag, hlen);
656 skb_reset_network_header(frag); 658 skb_reset_network_header(frag);
657 memcpy(frag->nh.raw, tmp_hdr, hlen); 659 memcpy(skb_network_header(frag), tmp_hdr,
660 hlen);
658 offset += skb->len - hlen - sizeof(struct frag_hdr); 661 offset += skb->len - hlen - sizeof(struct frag_hdr);
659 fh->nexthdr = nexthdr; 662 fh->nexthdr = nexthdr;
660 fh->reserved = 0; 663 fh->reserved = 0;
@@ -753,7 +756,7 @@ slow_path:
753 /* 756 /*
754 * Copy the packet header into the new buffer. 757 * Copy the packet header into the new buffer.
755 */ 758 */
756 memcpy(frag->nh.raw, skb->data, hlen); 759 memcpy(skb_network_header(frag), skb->data, hlen);
757 760
758 /* 761 /*
759 * Build fragment header. 762 * Build fragment header.
@@ -1329,7 +1332,7 @@ int ip6_push_pending_frames(struct sock *sk)
1329 tail_skb = &(skb_shinfo(skb)->frag_list); 1332 tail_skb = &(skb_shinfo(skb)->frag_list);
1330 1333
1331 /* move skb->data to ip header from ext header */ 1334 /* move skb->data to ip header from ext header */
1332 if (skb->data < skb->nh.raw) 1335 if (skb->data < skb_network_header(skb))
1333 __skb_pull(skb, skb_network_offset(skb)); 1336 __skb_pull(skb, skb_network_offset(skb));
1334 while ((tmp_skb = __skb_dequeue(&sk->sk_write_queue)) != NULL) { 1337 while ((tmp_skb = __skb_dequeue(&sk->sk_write_queue)) != NULL) {
1335 __skb_pull(tmp_skb, skb->h.raw - skb->nh.raw); 1338 __skb_pull(tmp_skb, skb->h.raw - skb->nh.raw);
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
index a1e4f39c6793..aafbdfa8d785 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -995,9 +995,10 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
995 !ip6_tnl_xmit_ctl(t) || ip6_tnl_addr_conflict(t, ipv6h)) 995 !ip6_tnl_xmit_ctl(t) || ip6_tnl_addr_conflict(t, ipv6h))
996 return -1; 996 return -1;
997 997
998 if ((offset = parse_tlv_tnl_enc_lim(skb, skb->nh.raw)) > 0) { 998 offset = parse_tlv_tnl_enc_lim(skb, skb_network_header(skb));
999 if (offset > 0) {
999 struct ipv6_tlv_tnl_enc_lim *tel; 1000 struct ipv6_tlv_tnl_enc_lim *tel;
1000 tel = (struct ipv6_tlv_tnl_enc_lim *) &skb->nh.raw[offset]; 1001 tel = (struct ipv6_tlv_tnl_enc_lim *)&skb_network_header(skb)[offset];
1001 if (tel->encap_limit == 0) { 1002 if (tel->encap_limit == 0) {
1002 icmpv6_send(skb, ICMPV6_PARAMPROB, 1003 icmpv6_send(skb, ICMPV6_PARAMPROB,
1003 ICMPV6_HDR_FIELD, offset + 2, skb->dev); 1004 ICMPV6_HDR_FIELD, offset + 2, skb->dev);
diff --git a/net/ipv6/ipcomp6.c b/net/ipv6/ipcomp6.c
index 5724ba9f75de..3e71d1691b7d 100644
--- a/net/ipv6/ipcomp6.c
+++ b/net/ipv6/ipcomp6.c
@@ -166,10 +166,10 @@ static int ipcomp6_output(struct xfrm_state *x, struct sk_buff *skb)
166 top_iph->payload_len = htons(skb->len - sizeof(struct ipv6hdr)); 166 top_iph->payload_len = htons(skb->len - sizeof(struct ipv6hdr));
167 167
168 ipch = (struct ipv6_comp_hdr *)start; 168 ipch = (struct ipv6_comp_hdr *)start;
169 ipch->nexthdr = *skb->nh.raw; 169 ipch->nexthdr = *skb_network_header(skb);
170 ipch->flags = 0; 170 ipch->flags = 0;
171 ipch->cpi = htons((u16 )ntohl(x->id.spi)); 171 ipch->cpi = htons((u16 )ntohl(x->id.spi));
172 *skb->nh.raw = IPPROTO_COMP; 172 *skb_network_header(skb) = IPPROTO_COMP;
173 173
174out_ok: 174out_ok:
175 return 0; 175 return 0;
diff --git a/net/ipv6/mip6.c b/net/ipv6/mip6.c
index 0afcabdd8ed6..bb4033553f3b 100644
--- a/net/ipv6/mip6.c
+++ b/net/ipv6/mip6.c
@@ -99,14 +99,16 @@ int mip6_mh_filter(struct sock *sk, struct sk_buff *skb)
99 if (mh->ip6mh_hdrlen < mip6_mh_len(mh->ip6mh_type)) { 99 if (mh->ip6mh_hdrlen < mip6_mh_len(mh->ip6mh_type)) {
100 LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH message too short: %d vs >=%d\n", 100 LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH message too short: %d vs >=%d\n",
101 mh->ip6mh_hdrlen, mip6_mh_len(mh->ip6mh_type)); 101 mh->ip6mh_hdrlen, mip6_mh_len(mh->ip6mh_type));
102 mip6_param_prob(skb, 0, (&mh->ip6mh_hdrlen) - skb->nh.raw); 102 mip6_param_prob(skb, 0, ((&mh->ip6mh_hdrlen) -
103 skb_network_header(skb)));
103 return -1; 104 return -1;
104 } 105 }
105 106
106 if (mh->ip6mh_proto != IPPROTO_NONE) { 107 if (mh->ip6mh_proto != IPPROTO_NONE) {
107 LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH invalid payload proto = %d\n", 108 LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH invalid payload proto = %d\n",
108 mh->ip6mh_proto); 109 mh->ip6mh_proto);
109 mip6_param_prob(skb, 0, (&mh->ip6mh_proto) - skb->nh.raw); 110 mip6_param_prob(skb, 0, ((&mh->ip6mh_proto) -
111 skb_network_header(skb)));
110 return -1; 112 return -1;
111 } 113 }
112 114
@@ -152,8 +154,8 @@ static int mip6_destopt_output(struct xfrm_state *x, struct sk_buff *skb)
152 iph = (struct ipv6hdr *)skb->data; 154 iph = (struct ipv6hdr *)skb->data;
153 iph->payload_len = htons(skb->len - sizeof(*iph)); 155 iph->payload_len = htons(skb->len - sizeof(*iph));
154 156
155 nexthdr = *skb->nh.raw; 157 nexthdr = *skb_network_header(skb);
156 *skb->nh.raw = IPPROTO_DSTOPTS; 158 *skb_network_header(skb) = IPPROTO_DSTOPTS;
157 159
158 dstopt = (struct ipv6_destopt_hdr *)skb->h.raw; 160 dstopt = (struct ipv6_destopt_hdr *)skb->h.raw;
159 dstopt->nexthdr = nexthdr; 161 dstopt->nexthdr = nexthdr;
@@ -215,7 +217,8 @@ static int mip6_destopt_reject(struct xfrm_state *x, struct sk_buff *skb, struct
215 if (likely(opt->dsthao)) { 217 if (likely(opt->dsthao)) {
216 offset = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO); 218 offset = ipv6_find_tlv(skb, opt->dsthao, IPV6_TLV_HAO);
217 if (likely(offset >= 0)) 219 if (likely(offset >= 0))
218 hao = (struct ipv6_destopt_hao *)(skb->nh.raw + offset); 220 hao = (struct ipv6_destopt_hao *)
221 (skb_network_header(skb) + offset);
219 } 222 }
220 223
221 skb_get_timestamp(skb, &stamp); 224 skb_get_timestamp(skb, &stamp);
@@ -254,7 +257,8 @@ static int mip6_destopt_offset(struct xfrm_state *x, struct sk_buff *skb,
254{ 257{
255 u16 offset = sizeof(struct ipv6hdr); 258 u16 offset = sizeof(struct ipv6hdr);
256 struct ipv6_opt_hdr *exthdr = (struct ipv6_opt_hdr*)(skb->nh.ipv6h + 1); 259 struct ipv6_opt_hdr *exthdr = (struct ipv6_opt_hdr*)(skb->nh.ipv6h + 1);
257 unsigned int packet_len = skb->tail - skb->nh.raw; 260 const unsigned char *nh = skb_network_header(skb);
261 unsigned int packet_len = skb->tail - nh;
258 int found_rhdr = 0; 262 int found_rhdr = 0;
259 263
260 *nexthdr = &skb->nh.ipv6h->nexthdr; 264 *nexthdr = &skb->nh.ipv6h->nexthdr;
@@ -288,7 +292,7 @@ static int mip6_destopt_offset(struct xfrm_state *x, struct sk_buff *skb,
288 292
289 offset += ipv6_optlen(exthdr); 293 offset += ipv6_optlen(exthdr);
290 *nexthdr = &exthdr->nexthdr; 294 *nexthdr = &exthdr->nexthdr;
291 exthdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset); 295 exthdr = (struct ipv6_opt_hdr *)(nh + offset);
292 } 296 }
293 297
294 return offset; 298 return offset;
@@ -361,8 +365,8 @@ static int mip6_rthdr_output(struct xfrm_state *x, struct sk_buff *skb)
361 iph = (struct ipv6hdr *)skb->data; 365 iph = (struct ipv6hdr *)skb->data;
362 iph->payload_len = htons(skb->len - sizeof(*iph)); 366 iph->payload_len = htons(skb->len - sizeof(*iph));
363 367
364 nexthdr = *skb->nh.raw; 368 nexthdr = *skb_network_header(skb);
365 *skb->nh.raw = IPPROTO_ROUTING; 369 *skb_network_header(skb) = IPPROTO_ROUTING;
366 370
367 rt2 = (struct rt2_hdr *)skb->h.raw; 371 rt2 = (struct rt2_hdr *)skb->h.raw;
368 rt2->rt_hdr.nexthdr = nexthdr; 372 rt2->rt_hdr.nexthdr = nexthdr;
@@ -384,7 +388,8 @@ static int mip6_rthdr_offset(struct xfrm_state *x, struct sk_buff *skb,
384{ 388{
385 u16 offset = sizeof(struct ipv6hdr); 389 u16 offset = sizeof(struct ipv6hdr);
386 struct ipv6_opt_hdr *exthdr = (struct ipv6_opt_hdr*)(skb->nh.ipv6h + 1); 390 struct ipv6_opt_hdr *exthdr = (struct ipv6_opt_hdr*)(skb->nh.ipv6h + 1);
387 unsigned int packet_len = skb->tail - skb->nh.raw; 391 const unsigned char *nh = skb_network_header(skb);
392 unsigned int packet_len = skb->tail - nh;
388 int found_rhdr = 0; 393 int found_rhdr = 0;
389 394
390 *nexthdr = &skb->nh.ipv6h->nexthdr; 395 *nexthdr = &skb->nh.ipv6h->nexthdr;
@@ -397,7 +402,7 @@ static int mip6_rthdr_offset(struct xfrm_state *x, struct sk_buff *skb,
397 case NEXTHDR_ROUTING: 402 case NEXTHDR_ROUTING:
398 if (offset + 3 <= packet_len) { 403 if (offset + 3 <= packet_len) {
399 struct ipv6_rt_hdr *rt; 404 struct ipv6_rt_hdr *rt;
400 rt = (struct ipv6_rt_hdr *)(skb->nh.raw + offset); 405 rt = (struct ipv6_rt_hdr *)(nh + offset);
401 if (rt->type != 0) 406 if (rt->type != 0)
402 return offset; 407 return offset;
403 } 408 }
@@ -417,7 +422,7 @@ static int mip6_rthdr_offset(struct xfrm_state *x, struct sk_buff *skb,
417 422
418 offset += ipv6_optlen(exthdr); 423 offset += ipv6_optlen(exthdr);
419 *nexthdr = &exthdr->nexthdr; 424 *nexthdr = &exthdr->nexthdr;
420 exthdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset); 425 exthdr = (struct ipv6_opt_hdr *)(nh + offset);
421 } 426 }
422 427
423 return offset; 428 return offset;
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c
index c311b9a12ca6..bc1d09584008 100644
--- a/net/ipv6/netfilter/nf_conntrack_reasm.c
+++ b/net/ipv6/netfilter/nf_conntrack_reasm.c
@@ -408,11 +408,12 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb,
408 return -1; 408 return -1;
409 } 409 }
410 410
411 if (skb->ip_summed == CHECKSUM_COMPLETE) 411 if (skb->ip_summed == CHECKSUM_COMPLETE) {
412 const unsigned char *nh = skb_network_header(skb);
412 skb->csum = csum_sub(skb->csum, 413 skb->csum = csum_sub(skb->csum,
413 csum_partial(skb->nh.raw, 414 csum_partial(nh, (u8 *)(fhdr + 1) - nh,
414 (u8*)(fhdr + 1) - skb->nh.raw,
415 0)); 415 0));
416 }
416 417
417 /* Is this the final fragment? */ 418 /* Is this the final fragment? */
418 if (!(fhdr->frag_off & htons(IP6_MF))) { 419 if (!(fhdr->frag_off & htons(IP6_MF))) {
@@ -583,7 +584,9 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_queue *fq, struct net_device *dev)
583 BUG_TRAP(NFCT_FRAG6_CB(head)->offset == 0); 584 BUG_TRAP(NFCT_FRAG6_CB(head)->offset == 0);
584 585
585 /* Unfragmented part is taken from the first segment. */ 586 /* Unfragmented part is taken from the first segment. */
586 payload_len = (head->data - head->nh.raw) - sizeof(struct ipv6hdr) + fq->len - sizeof(struct frag_hdr); 587 payload_len = ((head->data - skb_network_header(head)) -
588 sizeof(struct ipv6hdr) + fq->len -
589 sizeof(struct frag_hdr));
587 if (payload_len > IPV6_MAXPLEN) { 590 if (payload_len > IPV6_MAXPLEN) {
588 DEBUGP("payload len is too large.\n"); 591 DEBUGP("payload len is too large.\n");
589 goto out_oversize; 592 goto out_oversize;
@@ -624,7 +627,7 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_queue *fq, struct net_device *dev)
624 627
625 /* We have to remove fragment header from datagram and to relocate 628 /* We have to remove fragment header from datagram and to relocate
626 * header in order to calculate ICV correctly. */ 629 * header in order to calculate ICV correctly. */
627 head->nh.raw[fq->nhoffset] = head->h.raw[0]; 630 skb_network_header(head)[fq->nhoffset] = head->h.raw[0];
628 memmove(head->head + sizeof(struct frag_hdr), head->head, 631 memmove(head->head + sizeof(struct frag_hdr), head->head,
629 (head->data - head->head) - sizeof(struct frag_hdr)); 632 (head->data - head->head) - sizeof(struct frag_hdr));
630 head->mac.raw += sizeof(struct frag_hdr); 633 head->mac.raw += sizeof(struct frag_hdr);
@@ -632,7 +635,7 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_queue *fq, struct net_device *dev)
632 635
633 skb_shinfo(head)->frag_list = head->next; 636 skb_shinfo(head)->frag_list = head->next;
634 head->h.raw = head->data; 637 head->h.raw = head->data;
635 skb_push(head, head->data - head->nh.raw); 638 skb_push(head, head->data - skb_network_header(head));
636 atomic_sub(head->truesize, &nf_ct_frag6_mem); 639 atomic_sub(head->truesize, &nf_ct_frag6_mem);
637 640
638 for (fp=head->next; fp; fp = fp->next) { 641 for (fp=head->next; fp; fp = fp->next) {
@@ -653,7 +656,9 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_queue *fq, struct net_device *dev)
653 656
654 /* Yes, and fold redundant checksum back. 8) */ 657 /* Yes, and fold redundant checksum back. 8) */
655 if (head->ip_summed == CHECKSUM_COMPLETE) 658 if (head->ip_summed == CHECKSUM_COMPLETE)
656 head->csum = csum_partial(head->nh.raw, head->h.raw-head->nh.raw, head->csum); 659 head->csum = csum_partial(skb_network_header(head),
660 head->h.raw - head->nh.raw,
661 head->csum);
657 662
658 fq->fragments = NULL; 663 fq->fragments = NULL;
659 664
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index 5f26645195dc..9b2bcde73f19 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -361,7 +361,7 @@ int rawv6_rcv(struct sock *sk, struct sk_buff *skb)
361 skb->ip_summed = CHECKSUM_UNNECESSARY; 361 skb->ip_summed = CHECKSUM_UNNECESSARY;
362 362
363 if (skb->ip_summed == CHECKSUM_COMPLETE) { 363 if (skb->ip_summed == CHECKSUM_COMPLETE) {
364 skb_postpull_rcsum(skb, skb->nh.raw, 364 skb_postpull_rcsum(skb, skb_network_header(skb),
365 skb->h.raw - skb->nh.raw); 365 skb->h.raw - skb->nh.raw);
366 if (!csum_ipv6_magic(&skb->nh.ipv6h->saddr, 366 if (!csum_ipv6_magic(&skb->nh.ipv6h->saddr,
367 &skb->nh.ipv6h->daddr, 367 &skb->nh.ipv6h->daddr,
@@ -488,7 +488,8 @@ static int rawv6_push_pending_frames(struct sock *sk, struct flowi *fl,
488 goto out; 488 goto out;
489 489
490 offset = rp->offset; 490 offset = rp->offset;
491 total_len = inet_sk(sk)->cork.length - (skb->nh.raw - skb->data); 491 total_len = inet_sk(sk)->cork.length - (skb_network_header(skb) -
492 skb->data);
492 if (offset >= total_len - 1) { 493 if (offset >= total_len - 1) {
493 err = -EINVAL; 494 err = -EINVAL;
494 ip6_flush_pending_frames(sk); 495 ip6_flush_pending_frames(sk);
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c
index 1dde449379fb..f85e49acb91a 100644
--- a/net/ipv6/reassembly.c
+++ b/net/ipv6/reassembly.c
@@ -436,13 +436,18 @@ static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb,
436 if ((unsigned int)end > IPV6_MAXPLEN) { 436 if ((unsigned int)end > IPV6_MAXPLEN) {
437 IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), 437 IP6_INC_STATS_BH(ip6_dst_idev(skb->dst),
438 IPSTATS_MIB_INHDRERRORS); 438 IPSTATS_MIB_INHDRERRORS);
439 icmpv6_param_prob(skb,ICMPV6_HDR_FIELD, (u8*)&fhdr->frag_off - skb->nh.raw); 439 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD,
440 ((u8 *)&fhdr->frag_off -
441 skb_network_header(skb)));
440 return; 442 return;
441 } 443 }
442 444
443 if (skb->ip_summed == CHECKSUM_COMPLETE) 445 if (skb->ip_summed == CHECKSUM_COMPLETE) {
446 const unsigned char *nh = skb_network_header(skb);
444 skb->csum = csum_sub(skb->csum, 447 skb->csum = csum_sub(skb->csum,
445 csum_partial(skb->nh.raw, (u8*)(fhdr+1)-skb->nh.raw, 0)); 448 csum_partial(nh, (u8 *)(fhdr + 1) - nh,
449 0));
450 }
446 451
447 /* Is this the final fragment? */ 452 /* Is this the final fragment? */
448 if (!(fhdr->frag_off & htons(IP6_MF))) { 453 if (!(fhdr->frag_off & htons(IP6_MF))) {
@@ -605,7 +610,9 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in,
605 BUG_TRAP(FRAG6_CB(head)->offset == 0); 610 BUG_TRAP(FRAG6_CB(head)->offset == 0);
606 611
607 /* Unfragmented part is taken from the first segment. */ 612 /* Unfragmented part is taken from the first segment. */
608 payload_len = (head->data - head->nh.raw) - sizeof(struct ipv6hdr) + fq->len - sizeof(struct frag_hdr); 613 payload_len = ((head->data - skb_network_header(head)) -
614 sizeof(struct ipv6hdr) + fq->len -
615 sizeof(struct frag_hdr));
609 if (payload_len > IPV6_MAXPLEN) 616 if (payload_len > IPV6_MAXPLEN)
610 goto out_oversize; 617 goto out_oversize;
611 618
@@ -639,7 +646,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in,
639 /* We have to remove fragment header from datagram and to relocate 646 /* We have to remove fragment header from datagram and to relocate
640 * header in order to calculate ICV correctly. */ 647 * header in order to calculate ICV correctly. */
641 nhoff = fq->nhoffset; 648 nhoff = fq->nhoffset;
642 head->nh.raw[nhoff] = head->h.raw[0]; 649 skb_network_header(head)[nhoff] = head->h.raw[0];
643 memmove(head->head + sizeof(struct frag_hdr), head->head, 650 memmove(head->head + sizeof(struct frag_hdr), head->head,
644 (head->data - head->head) - sizeof(struct frag_hdr)); 651 (head->data - head->head) - sizeof(struct frag_hdr));
645 head->mac.raw += sizeof(struct frag_hdr); 652 head->mac.raw += sizeof(struct frag_hdr);
@@ -647,7 +654,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in,
647 654
648 skb_shinfo(head)->frag_list = head->next; 655 skb_shinfo(head)->frag_list = head->next;
649 head->h.raw = head->data; 656 head->h.raw = head->data;
650 skb_push(head, head->data - head->nh.raw); 657 skb_push(head, head->data - skb_network_header(head));
651 atomic_sub(head->truesize, &ip6_frag_mem); 658 atomic_sub(head->truesize, &ip6_frag_mem);
652 659
653 for (fp=head->next; fp; fp = fp->next) { 660 for (fp=head->next; fp; fp = fp->next) {
@@ -671,7 +678,9 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in,
671 678
672 /* Yes, and fold redundant checksum back. 8) */ 679 /* Yes, and fold redundant checksum back. 8) */
673 if (head->ip_summed == CHECKSUM_COMPLETE) 680 if (head->ip_summed == CHECKSUM_COMPLETE)
674 head->csum = csum_partial(head->nh.raw, head->h.raw-head->nh.raw, head->csum); 681 head->csum = csum_partial(skb_network_header(head),
682 head->h.raw - head->nh.raw,
683 head->csum);
675 684
676 rcu_read_lock(); 685 rcu_read_lock();
677 IP6_INC_STATS_BH(__in6_dev_get(dev), IPSTATS_MIB_REASMOKS); 686 IP6_INC_STATS_BH(__in6_dev_get(dev), IPSTATS_MIB_REASMOKS);
@@ -725,7 +734,7 @@ static int ipv6_frag_rcv(struct sk_buff **skbp)
725 skb->h.raw += sizeof(struct frag_hdr); 734 skb->h.raw += sizeof(struct frag_hdr);
726 IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_REASMOKS); 735 IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_REASMOKS);
727 736
728 IP6CB(skb)->nhoff = (u8*)fhdr - skb->nh.raw; 737 IP6CB(skb)->nhoff = (u8 *)fhdr - skb_network_header(skb);
729 return 1; 738 return 1;
730 } 739 }
731 740
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 92f99927d12d..80a52ab1e384 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -486,7 +486,9 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
486 struct sk_buff *pktopts = treq->pktopts; 486 struct sk_buff *pktopts = treq->pktopts;
487 struct inet6_skb_parm *rxopt = IP6CB(pktopts); 487 struct inet6_skb_parm *rxopt = IP6CB(pktopts);
488 if (rxopt->srcrt) 488 if (rxopt->srcrt)
489 opt = ipv6_invert_rthdr(sk, (struct ipv6_rt_hdr*)(pktopts->nh.raw + rxopt->srcrt)); 489 opt = ipv6_invert_rthdr(sk,
490 (struct ipv6_rt_hdr *)(skb_network_header(pktopts) +
491 rxopt->srcrt));
490 } 492 }
491 493
492 if (opt && opt->srcrt) { 494 if (opt && opt->srcrt) {
@@ -1389,7 +1391,9 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1389 opt == NULL && treq->pktopts) { 1391 opt == NULL && treq->pktopts) {
1390 struct inet6_skb_parm *rxopt = IP6CB(treq->pktopts); 1392 struct inet6_skb_parm *rxopt = IP6CB(treq->pktopts);
1391 if (rxopt->srcrt) 1393 if (rxopt->srcrt)
1392 opt = ipv6_invert_rthdr(sk, (struct ipv6_rt_hdr *)(treq->pktopts->nh.raw + rxopt->srcrt)); 1394 opt = ipv6_invert_rthdr(sk,
1395 (struct ipv6_rt_hdr *)(skb_network_header(treq->pktopts) +
1396 rxopt->srcrt));
1393 } 1397 }
1394 1398
1395 if (dst == NULL) { 1399 if (dst == NULL) {
diff --git a/net/ipv6/xfrm6_input.c b/net/ipv6/xfrm6_input.c
index 33a1b9200431..5c929f886129 100644
--- a/net/ipv6/xfrm6_input.c
+++ b/net/ipv6/xfrm6_input.c
@@ -28,7 +28,7 @@ int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi)
28 unsigned int nhoff; 28 unsigned int nhoff;
29 29
30 nhoff = IP6CB(skb)->nhoff; 30 nhoff = IP6CB(skb)->nhoff;
31 nexthdr = skb->nh.raw[nhoff]; 31 nexthdr = skb_network_header(skb)[nhoff];
32 32
33 seq = 0; 33 seq = 0;
34 if (!spi && (err = xfrm_parse_spi(skb, nexthdr, &spi, &seq)) != 0) 34 if (!spi && (err = xfrm_parse_spi(skb, nexthdr, &spi, &seq)) != 0)
@@ -58,7 +58,7 @@ int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi)
58 if (nexthdr <= 0) 58 if (nexthdr <= 0)
59 goto drop_unlock; 59 goto drop_unlock;
60 60
61 skb->nh.raw[nhoff] = nexthdr; 61 skb_network_header(skb)[nhoff] = nexthdr;
62 62
63 if (x->props.replay_window) 63 if (x->props.replay_window)
64 xfrm_replay_advance(x, seq); 64 xfrm_replay_advance(x, seq);
@@ -113,7 +113,7 @@ int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi)
113 } else { 113 } else {
114#ifdef CONFIG_NETFILTER 114#ifdef CONFIG_NETFILTER
115 skb->nh.ipv6h->payload_len = htons(skb->len); 115 skb->nh.ipv6h->payload_len = htons(skb->len);
116 __skb_push(skb, skb->data - skb->nh.raw); 116 __skb_push(skb, skb->data - skb_network_header(skb));
117 117
118 NF_HOOK(PF_INET6, NF_IP6_PRE_ROUTING, skb, skb->dev, NULL, 118 NF_HOOK(PF_INET6, NF_IP6_PRE_ROUTING, skb, skb->dev, NULL,
119 ip6_rcv_finish); 119 ip6_rcv_finish);
diff --git a/net/ipv6/xfrm6_mode_beet.c b/net/ipv6/xfrm6_mode_beet.c
index c015bfde2b1c..247e2d5d2acf 100644
--- a/net/ipv6/xfrm6_mode_beet.c
+++ b/net/ipv6/xfrm6_mode_beet.c
@@ -67,7 +67,7 @@ static int xfrm6_beet_input(struct xfrm_state *x, struct sk_buff *skb)
67 goto out; 67 goto out;
68 68
69 skb_push(skb, size); 69 skb_push(skb, size);
70 memmove(skb->data, skb->nh.raw, size); 70 memmove(skb->data, skb_network_header(skb), size);
71 skb_reset_network_header(skb); 71 skb_reset_network_header(skb);
72 72
73 old_mac = skb_mac_header(skb); 73 old_mac = skb_mac_header(skb);
diff --git a/net/ipv6/xfrm6_mode_transport.c b/net/ipv6/xfrm6_mode_transport.c
index 3a4b39b12bad..ace0bbf4f25d 100644
--- a/net/ipv6/xfrm6_mode_transport.c
+++ b/net/ipv6/xfrm6_mode_transport.c
@@ -53,8 +53,10 @@ static int xfrm6_transport_input(struct xfrm_state *x, struct sk_buff *skb)
53{ 53{
54 int ihl = skb->data - skb->h.raw; 54 int ihl = skb->data - skb->h.raw;
55 55
56 if (skb->h.raw != skb->nh.raw) 56 if (skb->h.raw != skb->nh.raw) {
57 skb->nh.raw = memmove(skb->h.raw, skb->nh.raw, ihl); 57 memmove(skb->h.raw, skb_network_header(skb), ihl);
58 skb->nh.raw = skb->h.raw;
59 }
58 skb->nh.ipv6h->payload_len = htons(skb->len + ihl - 60 skb->nh.ipv6h->payload_len = htons(skb->len + ihl -
59 sizeof(struct ipv6hdr)); 61 sizeof(struct ipv6hdr));
60 skb->h.raw = skb->data; 62 skb->h.raw = skb->data;
diff --git a/net/ipv6/xfrm6_mode_tunnel.c b/net/ipv6/xfrm6_mode_tunnel.c
index 8ce5ef2d0b1c..498f17b5c42f 100644
--- a/net/ipv6/xfrm6_mode_tunnel.c
+++ b/net/ipv6/xfrm6_mode_tunnel.c
@@ -87,9 +87,10 @@ static int xfrm6_tunnel_input(struct xfrm_state *x, struct sk_buff *skb)
87{ 87{
88 int err = -EINVAL; 88 int err = -EINVAL;
89 const unsigned char *old_mac; 89 const unsigned char *old_mac;
90 const unsigned char *nh = skb_network_header(skb);
90 91
91 if (skb->nh.raw[IP6CB(skb)->nhoff] != IPPROTO_IPV6 92 if (nh[IP6CB(skb)->nhoff] != IPPROTO_IPV6 &&
92 && skb->nh.raw[IP6CB(skb)->nhoff] != IPPROTO_IPIP) 93 nh[IP6CB(skb)->nhoff] != IPPROTO_IPIP)
93 goto out; 94 goto out;
94 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) 95 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
95 goto out; 96 goto out;
@@ -98,7 +99,8 @@ static int xfrm6_tunnel_input(struct xfrm_state *x, struct sk_buff *skb)
98 (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC))) 99 (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
99 goto out; 100 goto out;
100 101
101 if (skb->nh.raw[IP6CB(skb)->nhoff] == IPPROTO_IPV6) { 102 nh = skb_network_header(skb);
103 if (nh[IP6CB(skb)->nhoff] == IPPROTO_IPV6) {
102 if (x->props.flags & XFRM_STATE_DECAP_DSCP) 104 if (x->props.flags & XFRM_STATE_DECAP_DSCP)
103 ipv6_copy_dscp(skb->nh.ipv6h, skb->h.ipv6h); 105 ipv6_copy_dscp(skb->nh.ipv6h, skb->h.ipv6h);
104 if (!(x->props.flags & XFRM_STATE_NOECN)) 106 if (!(x->props.flags & XFRM_STATE_NOECN))
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c
index d8a585bd2cb4..cb5a723d4cb4 100644
--- a/net/ipv6/xfrm6_policy.c
+++ b/net/ipv6/xfrm6_policy.c
@@ -273,14 +273,16 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl)
273 u16 offset = skb->h.raw - skb->nh.raw; 273 u16 offset = skb->h.raw - skb->nh.raw;
274 struct ipv6hdr *hdr = skb->nh.ipv6h; 274 struct ipv6hdr *hdr = skb->nh.ipv6h;
275 struct ipv6_opt_hdr *exthdr; 275 struct ipv6_opt_hdr *exthdr;
276 u8 nexthdr = skb->nh.raw[IP6CB(skb)->nhoff]; 276 const unsigned char *nh = skb_network_header(skb);
277 u8 nexthdr = nh[IP6CB(skb)->nhoff];
277 278
278 memset(fl, 0, sizeof(struct flowi)); 279 memset(fl, 0, sizeof(struct flowi));
279 ipv6_addr_copy(&fl->fl6_dst, &hdr->daddr); 280 ipv6_addr_copy(&fl->fl6_dst, &hdr->daddr);
280 ipv6_addr_copy(&fl->fl6_src, &hdr->saddr); 281 ipv6_addr_copy(&fl->fl6_src, &hdr->saddr);
281 282
282 while (pskb_may_pull(skb, skb->nh.raw + offset + 1 - skb->data)) { 283 while (pskb_may_pull(skb, nh + offset + 1 - skb->data)) {
283 exthdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset); 284 nh = skb_network_header(skb);
285 exthdr = (struct ipv6_opt_hdr *)(nh + offset);
284 286
285 switch (nexthdr) { 287 switch (nexthdr) {
286 case NEXTHDR_ROUTING: 288 case NEXTHDR_ROUTING:
@@ -288,7 +290,7 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl)
288 case NEXTHDR_DEST: 290 case NEXTHDR_DEST:
289 offset += ipv6_optlen(exthdr); 291 offset += ipv6_optlen(exthdr);
290 nexthdr = exthdr->nexthdr; 292 nexthdr = exthdr->nexthdr;
291 exthdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset); 293 exthdr = (struct ipv6_opt_hdr *)(nh + offset);
292 break; 294 break;
293 295
294 case IPPROTO_UDP: 296 case IPPROTO_UDP:
@@ -296,7 +298,7 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl)
296 case IPPROTO_TCP: 298 case IPPROTO_TCP:
297 case IPPROTO_SCTP: 299 case IPPROTO_SCTP:
298 case IPPROTO_DCCP: 300 case IPPROTO_DCCP:
299 if (pskb_may_pull(skb, skb->nh.raw + offset + 4 - skb->data)) { 301 if (pskb_may_pull(skb, nh + offset + 4 - skb->data)) {
300 __be16 *ports = (__be16 *)exthdr; 302 __be16 *ports = (__be16 *)exthdr;
301 303
302 fl->fl_ip_sport = ports[0]; 304 fl->fl_ip_sport = ports[0];
@@ -306,7 +308,7 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl)
306 return; 308 return;
307 309
308 case IPPROTO_ICMPV6: 310 case IPPROTO_ICMPV6:
309 if (pskb_may_pull(skb, skb->nh.raw + offset + 2 - skb->data)) { 311 if (pskb_may_pull(skb, nh + offset + 2 - skb->data)) {
310 u8 *icmp = (u8 *)exthdr; 312 u8 *icmp = (u8 *)exthdr;
311 313
312 fl->fl_icmp_type = icmp[0]; 314 fl->fl_icmp_type = icmp[0];
@@ -317,7 +319,7 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl)
317 319
318#ifdef CONFIG_IPV6_MIP6 320#ifdef CONFIG_IPV6_MIP6
319 case IPPROTO_MH: 321 case IPPROTO_MH:
320 if (pskb_may_pull(skb, skb->nh.raw + offset + 3 - skb->data)) { 322 if (pskb_may_pull(skb, nh + offset + 3 - skb->data)) {
321 struct ip6_mh *mh; 323 struct ip6_mh *mh;
322 mh = (struct ip6_mh *)exthdr; 324 mh = (struct ip6_mh *)exthdr;
323 325
diff --git a/net/netfilter/xt_TCPMSS.c b/net/netfilter/xt_TCPMSS.c
index db7e38c08de2..afc0c60e19d5 100644
--- a/net/netfilter/xt_TCPMSS.c
+++ b/net/netfilter/xt_TCPMSS.c
@@ -54,7 +54,7 @@ tcpmss_mangle_packet(struct sk_buff **pskb,
54 return -1; 54 return -1;
55 55
56 tcplen = (*pskb)->len - tcphoff; 56 tcplen = (*pskb)->len - tcphoff;
57 tcph = (struct tcphdr *)((*pskb)->nh.raw + tcphoff); 57 tcph = (struct tcphdr *)(skb_network_header(*pskb) + tcphoff);
58 58
59 /* Since it passed flags test in tcp match, we know it is is 59 /* Since it passed flags test in tcp match, we know it is is
60 not a fragment, and has data >= tcp header length. SYN 60 not a fragment, and has data >= tcp header length. SYN
@@ -113,7 +113,7 @@ tcpmss_mangle_packet(struct sk_buff **pskb,
113 return -1; 113 return -1;
114 kfree_skb(*pskb); 114 kfree_skb(*pskb);
115 *pskb = newskb; 115 *pskb = newskb;
116 tcph = (struct tcphdr *)((*pskb)->nh.raw + tcphoff); 116 tcph = (struct tcphdr *)(skb_network_header(*pskb) + tcphoff);
117 } 117 }
118 118
119 skb_put((*pskb), TCPOLEN_MSS); 119 skb_put((*pskb), TCPOLEN_MSS);
diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c
index 3d6a2fcc9ce4..20813eee8af4 100644
--- a/net/sched/act_pedit.c
+++ b/net/sched/act_pedit.c
@@ -136,7 +136,7 @@ static int tcf_pedit(struct sk_buff *skb, struct tc_action *a,
136 } 136 }
137 } 137 }
138 138
139 pptr = skb->nh.raw; 139 pptr = skb_network_header(skb);
140 140
141 spin_lock(&p->tcf_lock); 141 spin_lock(&p->tcf_lock);
142 142
diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
index 0bcb16928d25..695b34051b9f 100644
--- a/net/sched/cls_u32.c
+++ b/net/sched/cls_u32.c
@@ -119,7 +119,7 @@ static int u32_classify(struct sk_buff *skb, struct tcf_proto *tp, struct tcf_re
119 } stack[TC_U32_MAXDEPTH]; 119 } stack[TC_U32_MAXDEPTH];
120 120
121 struct tc_u_hnode *ht = (struct tc_u_hnode*)tp->root; 121 struct tc_u_hnode *ht = (struct tc_u_hnode*)tp->root;
122 u8 *ptr = skb->nh.raw; 122 u8 *ptr = skb_network_header(skb);
123 struct tc_u_knode *n; 123 struct tc_u_knode *n;
124 int sdepth = 0; 124 int sdepth = 0;
125 int off2 = 0; 125 int off2 = 0;
diff --git a/net/sched/em_u32.c b/net/sched/em_u32.c
index cd0600c67969..0a2a7fe08de3 100644
--- a/net/sched/em_u32.c
+++ b/net/sched/em_u32.c
@@ -22,7 +22,7 @@ static int em_u32_match(struct sk_buff *skb, struct tcf_ematch *em,
22 struct tcf_pkt_info *info) 22 struct tcf_pkt_info *info)
23{ 23{
24 struct tc_u32_key *key = (struct tc_u32_key *) em->data; 24 struct tc_u32_key *key = (struct tc_u32_key *) em->data;
25 unsigned char *ptr = skb->nh.raw; 25 const unsigned char *ptr = skb_network_header(skb);
26 26
27 if (info) { 27 if (info) {
28 if (info->ptr) 28 if (info->ptr)