netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* RFC: cleaning up struct sk_buff before halloween
@ 2002-09-30 22:53 Arnaldo Carvalho de Melo
  2002-09-30 22:53 ` David S. Miller
  0 siblings, 1 reply; 3+ messages in thread
From: Arnaldo Carvalho de Melo @ 2002-09-30 22:53 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev

Hi,

	Please take a look at the patch below and tell me what are you thoughts
about it. The idea is similar to what I did with struct sock, i.e., get rid of
protocol specific stuff in generic networking data structures. This is already
how LLC and IPX works.

	The patch only deals with skb->nh.{arph,iph}, and it is surprisingly
small due to the fact that most of the code already did:

struct iphdr *iph = skb->nh.iph;

so I only had to replace with:

struct iphdr *iph = ip_hdr(skb);

	When everything would be finished, skb->nh would stop being a union and
become a void pointer.

	It'd be smaller if I had resisted the itch to do a
s/__constant_htons/htons/g where __constant_ is not needed 8)

	If you think that this is something doable for 2.6, I'll break the
changeset into smaller chunks, per subsystem, etc.

	I understand that with the ongoing USAGI merge this could cause some
clashes, but I don't think it would be that much of a problem, as most of the
places, as I stated above, already use iph-> style access, so the hunks are
rather localized.

	Now off to a party celebrating the birth of a close friend first
daughter :-)

Best Regards,

- Arnaldo

===== drivers/net/8139cp.c 1.33 vs edited =====
--- 1.33/drivers/net/8139cp.c	Mon Sep 30 03:09:02 2002
+++ edited/drivers/net/8139cp.c	Mon Sep 30 19:22:22 2002
@@ -792,7 +792,7 @@
 
 #ifdef CP_TX_CHECKSUM
 		if (skb->ip_summed == CHECKSUM_HW) {
-			const struct iphdr *ip = skb->nh.iph;
+			const struct iphdr *ip = ip_hdr(skb);
 			if (ip->protocol == IPPROTO_TCP)
 				txd->opts1 = cpu_to_le32(eor | len | DescOwn |
 							 FirstFrag | LastFrag |
@@ -819,7 +819,7 @@
 		dma_addr_t first_mapping;
 		int frag, first_entry = entry;
 #ifdef CP_TX_CHECKSUM
-		const struct iphdr *ip = skb->nh.iph;
+		const struct iphdr *ip = ip_hdr(skb);
 #endif
 
 		/* We must give this initial chunk to the device last.
===== drivers/net/loopback.c 1.7 vs edited =====
--- 1.7/drivers/net/loopback.c	Thu Aug 29 05:51:36 2002
+++ edited/drivers/net/loopback.c	Mon Sep 30 19:22:22 2002
@@ -65,7 +65,7 @@
 
 static void emulate_large_send_offload(struct sk_buff *skb)
 {
-	struct iphdr *iph = skb->nh.iph;
+	struct iphdr *iph = ip_hdr(skb);
 	struct tcphdr *th = (struct tcphdr*)(skb->nh.raw + (iph->ihl * 4));
 	unsigned int doffset = (iph->ihl + th->doff) * 4;
 	unsigned int mtu = skb_shinfo(skb)->tso_size + doffset;
@@ -82,7 +82,7 @@
 		skb_reserve(nskb, 32);
 		nskb->mac.raw = nskb->data - 14;
 		nskb->nh.raw = nskb->data;
-		iph = nskb->nh.iph;
+		iph = ip_hdr(nskb);
 		memcpy(nskb->data, skb->nh.raw, doffset);
 		if (skb_copy_bits(skb,
 				  doffset + offset,
@@ -148,7 +148,7 @@
 #endif
 
 	if (skb_shinfo(skb)->tso_size) {
-		struct iphdr *iph = skb->nh.iph;
+		struct iphdr *iph = ip_hdr(skb);
 
 		if (skb->protocol != htons(ETH_P_IP))
 			BUG();
===== drivers/net/ns83820.c 1.15 vs edited =====
--- 1.15/drivers/net/ns83820.c	Fri Aug 30 22:32:17 2002
+++ edited/drivers/net/ns83820.c	Mon Sep 30 19:22:22 2002
@@ -1039,9 +1039,9 @@
 	extsts = 0;
 	if (skb->ip_summed == CHECKSUM_HW) {
 		extsts |= EXTSTS_IPPKT;
-		if (IPPROTO_TCP == skb->nh.iph->protocol)
+		if (IPPROTO_TCP == ip_hdr(skb)->protocol)
 			extsts |= EXTSTS_TCPPKT;
-		else if (IPPROTO_UDP == skb->nh.iph->protocol)
+		else if (IPPROTO_UDP == ip_hdr(skb)->protocol)
 			extsts |= EXTSTS_UDPPKT;
 	}
 
===== drivers/net/e100/e100_main.c 1.25 vs edited =====
--- 1.25/drivers/net/e100/e100_main.c	Thu Sep 19 20:58:59 2002
+++ edited/drivers/net/e100/e100_main.c	Mon Sep 30 19:22:22 2002
@@ -2244,7 +2244,7 @@
 	tcb->tcb_skb = skb;
 
 	if (skb->ip_summed == CHECKSUM_HW) {
-		const struct iphdr *ip = skb->nh.iph;
+		const struct iphdr *ip = ip_hdr(skb);
 
 		if ((ip->protocol == IPPROTO_TCP) ||
 		    (ip->protocol == IPPROTO_UDP)) {
===== drivers/net/e1000/e1000_main.c 1.31 vs edited =====
--- 1.31/drivers/net/e1000/e1000_main.c	Thu Aug 29 07:37:43 2002
+++ edited/drivers/net/e1000/e1000_main.c	Mon Sep 30 19:22:22 2002
@@ -1303,17 +1303,16 @@
 	uint16_t ipcse, tucse, mss;
 	
 	if(skb_shinfo(skb)->tso_size) {
+		struct iphdr *iph = ip_hdr(skb);
+
 		hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2));
 		mss = skb_shinfo(skb)->tso_size;
-		skb->nh.iph->tot_len = 0;
-		skb->nh.iph->check = 0;
-		skb->h.th->check = ~csum_tcpudp_magic(skb->nh.iph->saddr,
-		                                      skb->nh.iph->daddr,
-		                                      0,
-		                                      IPPROTO_TCP,
-		                                      0);
+		iph->tot_len = 0;
+		iph->check = 0;
+		skb->h.th->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr,
+		                                      0, IPPROTO_TCP, 0);
 		ipcss = skb->nh.raw - skb->data;
-		ipcso = (void *)&(skb->nh.iph->check) - (void *)skb->data;
+		ipcso = (void *)&(iph->check) - (void *)skb->data;
 		ipcse = skb->h.raw - skb->data - 1;
 		tucss = skb->h.raw - skb->data;
 		tucso = (void *)&(skb->h.th->check) - (void *)skb->data;
===== include/linux/if_arp.h 1.8 vs edited =====
--- 1.8/include/linux/if_arp.h	Tue Feb  5 13:23:43 2002
+++ edited/include/linux/if_arp.h	Mon Sep 30 19:35:34 2002
@@ -145,4 +145,6 @@
 
 };
 
+#define arp_hdr(skb) ((struct arphdr *)(skb)->nh.raw)
+
 #endif	/* _LINUX_IF_ARP_H */
===== include/linux/ip.h 1.3 vs edited =====
--- 1.3/include/linux/ip.h	Mon Mar 11 10:46:43 2002
+++ edited/include/linux/ip.h	Mon Sep 30 19:36:07 2002
@@ -176,4 +176,6 @@
 	/*The options start here. */
 };
 
+#define ip_hdr(skb) ((struct iphdr *)(skb)->nh.raw)
+
 #endif	/* _LINUX_IP_H */
===== include/linux/skbuff.h 1.14 vs edited =====
--- 1.14/include/linux/skbuff.h	Thu Aug 29 05:51:36 2002
+++ edited/include/linux/skbuff.h	Mon Sep 30 19:34:59 2002
@@ -189,9 +189,7 @@
 	} h;
 
 	union {
-		struct iphdr	*iph;
 		struct ipv6hdr	*ipv6h;
-		struct arphdr	*arph;
 		unsigned char	*raw;
 	} nh;
 
===== net/atm/mpc.c 1.5 vs edited =====
--- 1.5/net/atm/mpc.c	Fri Jul 19 03:16:19 2002
+++ edited/net/atm/mpc.c	Mon Sep 30 19:22:22 2002
@@ -726,7 +726,7 @@
 	new_skb->protocol = eth_type_trans(new_skb, dev);
 	new_skb->nh.raw = new_skb->data;
 
-	eg->latest_ip_addr = new_skb->nh.iph->saddr;
+	eg->latest_ip_addr = ip_hdr(new_skb)->saddr;
 	eg->packets_rcvd++;
 	mpc->eg_ops->put(eg);
 
===== net/bridge/netfilter/ebt_log.c 1.1 vs edited =====
--- 1.1/net/bridge/netfilter/ebt_log.c	Mon Sep 16 20:11:27 2002
+++ edited/net/bridge/netfilter/ebt_log.c	Mon Sep 30 19:41:29 2002
@@ -60,16 +60,16 @@
 
 	if ((info->bitmask & EBT_LOG_IP) && skb->mac.ethernet->h_proto ==
 	   htons(ETH_P_IP)){
-		struct iphdr *iph = skb->nh.iph;
+		struct iphdr *iph = ip_hdr(skb);
 		printk(" IP SRC=%u.%u.%u.%u IP DST=%u.%u.%u.%u,",
 		   NIPQUAD(iph->saddr), NIPQUAD(iph->daddr));
 		printk(" IP tos=0x%02X, IP proto=%d", iph->tos, iph->protocol);
 	}
 
 	if ((info->bitmask & EBT_LOG_ARP) &&
-	    ((skb->mac.ethernet->h_proto == __constant_htons(ETH_P_ARP)) ||
-	    (skb->mac.ethernet->h_proto == __constant_htons(ETH_P_RARP)))) {
-		struct arphdr * arph = skb->nh.arph;
+	    ((skb->mac.ethernet->h_proto == htons(ETH_P_ARP)) ||
+	    (skb->mac.ethernet->h_proto == htons(ETH_P_RARP)))) {
+		struct arphdr *arph = arp_hdr(skb);
 		printk(" ARP HTYPE=%d, PTYPE=0x%04x, OPCODE=%d",
 		   ntohs(arph->ar_hrd), ntohs(arph->ar_pro),
 		   ntohs(arph->ar_op));
===== net/core/netfilter.c 1.7 vs edited =====
--- 1.7/net/core/netfilter.c	Wed May  1 06:23:51 2002
+++ edited/net/core/netfilter.c	Mon Sep 30 19:22:22 2002
@@ -178,7 +178,7 @@
 	       skb->len);
 	switch (pf) {
 	case PF_INET: {
-		const struct iphdr *ip = skb->nh.iph;
+		const struct iphdr *ip = ip_hdr(skb);
 		__u32 *opt = (__u32 *) (ip + 1);
 		int opti;
 		__u16 src_port = 0, dst_port = 0;
@@ -561,7 +561,7 @@
 /* route_me_harder function, used by iptable_nat, iptable_mangle + ip_queue */
 int ip_route_me_harder(struct sk_buff **pskb)
 {
-	struct iphdr *iph = (*pskb)->nh.iph;
+	struct iphdr *iph = ip_hdr(*pskb);
 	struct rtable *rt;
 	struct rt_key key = { dst:iph->daddr,
 			      src:iph->saddr,
===== net/econet/af_econet.c 1.9 vs edited =====
--- 1.9/net/econet/af_econet.c	Wed Aug 28 10:42:25 2002
+++ edited/net/econet/af_econet.c	Mon Sep 30 19:22:22 2002
@@ -817,7 +817,7 @@
 
 static void aun_incoming(struct sk_buff *skb, struct aunhdr *ah, size_t len)
 {
-	struct iphdr *ip = skb->nh.iph;
+	struct iphdr *ip = ip_hdr(skb);
 	unsigned char stn = ntohl(ip->saddr) & 0xff;
 	struct sock *sk;
 	struct sk_buff *newskb;
@@ -915,7 +915,7 @@
 	data = skb->h.raw + sizeof(struct udphdr);
 	ah = (struct aunhdr *)data;
 	len = skb->len - sizeof(struct udphdr);
-	ip = skb->nh.iph;
+	ip = ip_hdr(skb);
 
 	switch (ah->code)
 	{
===== net/ipv4/arp.c 1.10 vs edited =====
--- 1.10/net/ipv4/arp.c	Fri Jul 19 03:16:19 2002
+++ edited/net/ipv4/arp.c	Mon Sep 30 19:22:22 2002
@@ -322,8 +322,8 @@
 	u32 target = *(u32*)neigh->primary_key;
 	int probes = atomic_read(&neigh->probes);
 
-	if (skb && inet_addr_type(skb->nh.iph->saddr) == RTN_LOCAL)
-		saddr = skb->nh.iph->saddr;
+	if (skb && inet_addr_type(ip_hdr(skb)->saddr) == RTN_LOCAL)
+		saddr = ip_hdr(skb)->saddr;
 	else
 		saddr = inet_select_addr(dev, target, RT_SCOPE_LINK);
 
@@ -624,7 +624,7 @@
 	if (in_dev == NULL)
 		goto out;
 
-	arp = skb->nh.arph;
+	arp = arp_hdr(skb);
 	arp_ptr= (unsigned char *)(arp+1);
 
 	switch (dev_type) {
@@ -823,7 +823,7 @@
 
 int arp_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt)
 {
-	struct arphdr *arp = skb->nh.arph;
+	struct arphdr *arp = arp_hdr(skb);
 
 	if (arp->ar_hln != dev->addr_len ||
 	    dev->flags & IFF_NOARP ||
===== net/ipv4/icmp.c 1.18 vs edited =====
--- 1.18/net/ipv4/icmp.c	Fri Jul 19 03:16:19 2002
+++ edited/net/ipv4/icmp.c	Mon Sep 30 19:22:22 2002
@@ -409,7 +409,7 @@
 	icmp_param->csum = 0;
 	icmp_out_count(icmp_param->data.icmph.type);
 
-	inet->tos = skb->nh.iph->tos;
+	inet->tos = ip_hdr(skb)->tos;
 	inet->ttl = sysctl_ip_default_ttl;
 	daddr = ipc.addr = rt->rt_src;
 	ipc.opt = NULL;
@@ -419,7 +419,7 @@
 			daddr = icmp_param->replyopts.faddr;
 	}
 	if (ip_route_output(&rt, daddr, rt->rt_spec_dst,
-			    RT_TOS(skb->nh.iph->tos), 0))
+			    RT_TOS(ip_hdr(skb)->tos), 0))
 		goto out_unlock;
 	if (icmpv4_xrlim_allow(rt, icmp_param->data.icmph.type,
 			       icmp_param->data.icmph.code)) {
@@ -463,7 +463,7 @@
 	 *	Check this, icmp_send is called from the most obscure devices
 	 *	sometimes.
 	 */
-	iph = skb_in->nh.iph;
+	iph = ip_hdr(skb_in);
 
 	if ((u8 *)iph < skb_in->head || (u8 *)(iph + 1) > skb_in->tail)
 		goto out;
@@ -682,7 +682,7 @@
 		if (net_ratelimit())
 			printk(KERN_WARNING "%u.%u.%u.%u sent an invalid ICMP "
 					    "error to a broadcast.\n",
-			       NIPQUAD(skb->nh.iph->saddr));
+			       NIPQUAD(ip_hdr(skb)->saddr));
 		goto out;
 	}
 
@@ -774,7 +774,7 @@
 			 */
 		case ICMP_REDIR_HOST:
 		case ICMP_REDIR_HOSTTOS:
-			ip_rt_redirect(skb->nh.iph->saddr,
+			ip_rt_redirect(ip_hdr(skb)->saddr,
 				       ip, skb->h.icmph->un.gateway,
 				       iph->saddr, iph->tos, skb->dev);
 			break;
===== net/ipv4/igmp.c 1.7 vs edited =====
--- 1.7/net/ipv4/igmp.c	Fri Aug 30 21:47:02 2002
+++ edited/net/ipv4/igmp.c	Mon Sep 30 19:22:22 2002
@@ -224,7 +224,7 @@
 
 	skb_reserve(skb, (dev->hard_header_len+15)&~15);
 
-	skb->nh.iph = iph = (struct iphdr *)skb_put(skb, sizeof(struct iphdr)+4);
+	iph = ip_hdr(skb) = (struct iphdr *)skb_put(skb, sizeof(*iph) + 4);
 
 	iph->version  = 4;
 	iph->ihl      = (sizeof(struct iphdr)+4)>>2;
===== net/ipv4/ip_forward.c 1.2 vs edited =====
--- 1.2/net/ipv4/ip_forward.c	Tue Feb  5 05:39:17 2002
+++ edited/net/ipv4/ip_forward.c	Mon Sep 30 19:22:22 2002
@@ -92,7 +92,7 @@
 	 *	that the packet's lifetime expired.
 	 */
 
-	iph = skb->nh.iph;
+	iph = ip_hdr(skb);
 	rt = (struct rtable*)skb->dst;
 
 	if (iph->ttl <= 1)
@@ -120,7 +120,7 @@
 	/* We are about to mangle packet. Copy it! */
 	if (skb_cow(skb, dev2->hard_header_len))
 		goto drop;
-	iph = skb->nh.iph;
+	iph = ip_hdr(skb);
 
 	/* Decrease ttl after skb cow done */
 	ip_decrease_ttl(iph);
===== net/ipv4/ip_fragment.c 1.6 vs edited =====
--- 1.6/net/ipv4/ip_fragment.c	Wed May 22 15:16:37 2002
+++ edited/net/ipv4/ip_fragment.c	Mon Sep 30 19:22:22 2002
@@ -377,11 +377,11 @@
 	if (qp->last_in & COMPLETE)
 		goto err;
 
- 	offset = ntohs(skb->nh.iph->frag_off);
+ 	offset = ntohs(ip_hdr(skb)->frag_off);
 	flags = offset & ~IP_OFFSET;
 	offset &= IP_OFFSET;
 	offset <<= 3;		/* offset is in 8-byte chunks */
- 	ihl = skb->nh.iph->ihl * 4;
+ 	ihl = ip_hdr(skb)->ihl * 4;
 
 	/* Determine the position of this fragment. */
  	end = offset + skb->len - ihl;
@@ -518,7 +518,7 @@
 	BUG_TRAP(FRAG_CB(head)->offset == 0);
 
 	/* Allocate a new buffer for the datagram. */
-	ihlen = head->nh.iph->ihl*4;
+	ihlen = ip_hdr(head)->ihl * 4;
 	len = ihlen + qp->len;
 
 	if(len > 65535)
@@ -570,7 +570,7 @@
 	head->dev = dev;
 	head->stamp = qp->stamp;
 
-	iph = head->nh.iph;
+	iph = ip_hdr(head);
 	iph->frag_off = 0;
 	iph->tot_len = htons(len);
 	IP_INC_STATS_BH(IpReasmOKs);
@@ -596,7 +596,7 @@
 /* Process an incoming IP datagram fragment. */
 struct sk_buff *ip_defrag(struct sk_buff *skb)
 {
-	struct iphdr *iph = skb->nh.iph;
+	struct iphdr *iph = ip_hdr(skb);
 	struct ipq *qp;
 	struct net_device *dev;
 	
===== net/ipv4/ip_gre.c 1.9 vs edited =====
--- 1.9/net/ipv4/ip_gre.c	Fri Jul 19 03:16:19 2002
+++ edited/net/ipv4/ip_gre.c	Mon Sep 30 19:22:22 2002
@@ -538,8 +538,8 @@
 {
 	if (INET_ECN_is_ce(iph->tos)) {
 		if (skb->protocol == __constant_htons(ETH_P_IP)) {
-			if (INET_ECN_is_not_ce(skb->nh.iph->tos))
-				IP_ECN_set_ce(skb->nh.iph);
+			if (INET_ECN_is_not_ce(ip_hdr(skb)->tos))
+				IP_ECN_set_ce(ip_hdr(skb));
 		} else if (skb->protocol == __constant_htons(ETH_P_IPV6)) {
 			if (INET_ECN_is_not_ce(ip6_get_dsfield(skb->nh.ipv6h)))
 				IP6_ECN_set_ce(skb->nh.ipv6h);
@@ -572,7 +572,7 @@
 	if (!pskb_may_pull(skb, 16))
 		goto drop_nolock;
 
-	iph = skb->nh.iph;
+	iph = ip_hdr(skb);
 	h = skb->data;
 	flags = *(u16*)h;
 
@@ -677,7 +677,7 @@
 {
 	struct ip_tunnel *tunnel = (struct ip_tunnel*)dev->priv;
 	struct net_device_stats *stats = &tunnel->stat;
-	struct iphdr  *old_iph = skb->nh.iph;
+	struct iphdr  *old_iph = ip_hdr(skb);
 	struct iphdr  *tiph;
 	u8     tos;
 	u16    df;
@@ -837,7 +837,7 @@
 	 *	Push down and install the IPIP header.
 	 */
 
-	iph 			=	skb->nh.iph;
+	iph 			=	ip_hdr(skb);
 	iph->version		=	4;
 	iph->ihl		=	sizeof(struct iphdr) >> 2;
 	iph->frag_off		=	df;
===== net/ipv4/ip_input.c 1.6 vs edited =====
--- 1.6/net/ipv4/ip_input.c	Wed Mar 20 01:12:59 2002
+++ edited/net/ipv4/ip_input.c	Mon Sep 30 19:22:22 2002
@@ -156,7 +156,7 @@
 int ip_call_ra_chain(struct sk_buff *skb)
 {
 	struct ip_ra_chain *ra;
-	u8 protocol = skb->nh.iph->protocol;
+	u8 protocol = ip_hdr(skb)->protocol;
 	struct sock *last = NULL;
 
 	read_lock(&ip_ra_lock);
@@ -169,7 +169,7 @@
 		if (sk && inet_sk(sk)->num == protocol 
 		    && ((sk->bound_dev_if == 0) 
 			|| (sk->bound_dev_if == skb->dev->ifindex))) {
-			if (skb->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
+			if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) {
 				skb = ip_defrag(skb);
 				if (skb == NULL) {
 					read_unlock(&ip_ra_lock);
@@ -218,7 +218,7 @@
 
 static inline int ip_local_deliver_finish(struct sk_buff *skb)
 {
-	int ihl = skb->nh.iph->ihl*4;
+	int ihl = ip_hdr(skb)->ihl * 4;
 
 #ifdef CONFIG_NETFILTER_DEBUG
 	nf_debug_ip_local_deliver(skb);
@@ -238,7 +238,7 @@
 
 	{
 		/* Note: See raw.c and net/raw.h, RAWV4_HTABLE_SIZE==MAX_INET_PROTOS */
-		int protocol = skb->nh.iph->protocol;
+		int protocol = ip_hdr(skb)->protocol;
 		int hash = protocol & (MAX_INET_PROTOS - 1);
 		struct sock *raw_sk = raw_v4_htable[hash];
 		struct inet_protocol *ipprot;
@@ -248,7 +248,7 @@
 		 * don't care less
 		 */
 		if(raw_sk != NULL)
-			raw_sk = raw_v4_input(skb, skb->nh.iph, hash);
+			raw_sk = raw_v4_input(skb, ip_hdr(skb), hash);
 
 		ipprot = (struct inet_protocol *) inet_protos[hash];
 		flag = 0;
@@ -263,7 +263,8 @@
 
 				return ret;
 			} else {
-				flag = ip_run_ipprot(skb, skb->nh.iph, ipprot, (raw_sk != NULL));
+				flag = ip_run_ipprot(skb, ip_hdr(skb), ipprot,
+						     (raw_sk != NULL));
 			}
 		}
 
@@ -293,7 +294,7 @@
 	 *	Reassemble IP fragments.
 	 */
 
-	if (skb->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
+	if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) {
 		skb = ip_defrag(skb);
 		if (!skb)
 			return 0;
@@ -306,7 +307,7 @@
 static inline int ip_rcv_finish(struct sk_buff *skb)
 {
 	struct net_device *dev = skb->dev;
-	struct iphdr *iph = skb->nh.iph;
+	struct iphdr *iph = ip_hdr(skb);
 
 	/*
 	 *	Initialise the virtual path cache for the packet. It describes
@@ -341,7 +342,7 @@
 
 		if (skb_cow(skb, skb_headroom(skb)))
 			goto drop;
-		iph = skb->nh.iph;
+		iph = ip_hdr(skb);
 
 		if (ip_options_compile(NULL, skb))
 			goto inhdr_error;
@@ -394,7 +395,7 @@
 	if (!pskb_may_pull(skb, sizeof(struct iphdr)))
 		goto inhdr_error;
 
-	iph = skb->nh.iph;
+	iph = ip_hdr(skb);
 
 	/*
 	 *	RFC1122: 3.1.2.2 MUST silently discard any IP frame that fails the checksum.
@@ -413,7 +414,7 @@
 	if (!pskb_may_pull(skb, iph->ihl*4))
 		goto inhdr_error;
 
-	iph = skb->nh.iph;
+	iph = ip_hdr(skb);
 
 	if (ip_fast_csum((u8 *)iph, iph->ihl) != 0)
 		goto inhdr_error; 
===== net/ipv4/ip_nat_dumb.c 1.2 vs edited =====
--- 1.2/net/ipv4/ip_nat_dumb.c	Tue Feb  5 05:39:17 2002
+++ edited/net/ipv4/ip_nat_dumb.c	Mon Sep 30 19:22:22 2002
@@ -47,7 +47,7 @@
 ip_do_nat(struct sk_buff *skb)
 {
 	struct rtable *rt = (struct rtable*)skb->dst;
-	struct iphdr *iph = skb->nh.iph;
+	struct iphdr *iph = ip_hdr(skb);
 	u32 odaddr = iph->daddr;
 	u32 osaddr = iph->saddr;
 	u16	check;
===== net/ipv4/ip_options.c 1.3 vs edited =====
--- 1.3/net/ipv4/ip_options.c	Fri Sep 13 19:47:24 2002
+++ edited/net/ipv4/ip_options.c	Mon Sep 30 19:22:22 2002
@@ -106,7 +106,7 @@
 	if (skb->dst)
 		daddr = ((struct rtable*)skb->dst)->rt_spec_dst;
 	else
-		daddr = skb->nh.iph->daddr;
+		daddr = ip_hdr(skb)->daddr;
 
 	if (sopt->rr) {
 		optlen  = sptr[sopt->rr+1];
@@ -176,7 +176,7 @@
 			/*
 			 * RFC1812 requires to fix illegal source routes.
 			 */
-			if (memcmp(&skb->nh.iph->saddr, &start[soffset+3], 4) == 0)
+			if (!memcmp(&ip_hdr(skb)->saddr, &start[soffset + 3], 4))
 				doffset -= 4;
 		}
 		if (doffset > 3) {
@@ -259,7 +259,7 @@
 		optptr = iph + sizeof(struct iphdr);
 		opt->is_data = 0;
 	} else {
-		optptr = opt->is_data ? opt->__data : (unsigned char*)&(skb->nh.iph[1]);
+		optptr = opt->is_data ? opt->__data : (unsigned char*)&(ip_hdr(skb)[1]);
 		iph = optptr - sizeof(struct iphdr);
 	}
 
@@ -547,7 +547,7 @@
 		if (srrptr + 3 <= srrspace) {
 			opt->is_changed = 1;
 			ip_rt_get_source(&optptr[srrptr-1], rt);
-			skb->nh.iph->daddr = rt->rt_dst;
+			ip_hdr(skb)->daddr = rt->rt_dst;
 			optptr[2] = srrptr+4;
 		} else if (net_ratelimit())
 			printk(KERN_CRIT "ip_forward(): Argh! Destination lost!\n");
@@ -559,7 +559,7 @@
 	}
 	if (opt->is_changed) {
 		opt->is_changed = 0;
-		ip_send_check(skb->nh.iph);
+		ip_send_check(ip_hdr(skb));
 	}
 }
 
@@ -568,7 +568,7 @@
 	struct ip_options *opt = &(IPCB(skb)->opt);
 	int srrspace, srrptr;
 	u32 nexthop;
-	struct iphdr *iph = skb->nh.iph;
+	struct iphdr *iph = ip_hdr(skb);
 	unsigned char * optptr = skb->nh.raw + opt->srr;
 	struct rtable *rt = (struct rtable*)skb->dst;
 	struct rtable *rt2;
===== net/ipv4/ip_output.c 1.14 vs edited =====
--- 1.14/net/ipv4/ip_output.c	Thu Aug 29 05:57:05 2002
+++ edited/net/ipv4/ip_output.c	Mon Sep 30 19:22:22 2002
@@ -145,7 +145,7 @@
 	iph->protocol = sk->protocol;
 	iph->tot_len  = htons(skb->len);
 	ip_select_ident(iph, &rt->u.dst, sk);
-	skb->nh.iph   = iph;
+	ip_hdr(skb)   = iph;
 
 	if (opt && opt->optlen) {
 		iph->ihl += opt->optlen>>2;
@@ -238,7 +238,7 @@
 
 		/* Multicasts with ttl 0 must not go beyond the host */
 
-		if (skb->nh.iph->ttl == 0) {
+		if (!ip_hdr(skb)->ttl) {
 			kfree_skb(skb);
 			return 0;
 		}
@@ -284,7 +284,7 @@
 	struct sock *sk = skb->sk;
 	struct rtable *rt = (struct rtable *)skb->dst;
 	struct net_device *dev;
-	struct iphdr *iph = skb->nh.iph;
+	struct iphdr *iph = ip_hdr(skb);
 
 	dev = rt->u.dst.dev;
 
@@ -303,7 +303,7 @@
 		if (sk)
 			skb_set_owner_w(skb2, sk);
 		skb = skb2;
-		iph = skb->nh.iph;
+		iph = ip_hdr(skb);
 	}
 
 	if (skb->len > rt->u.dst.pmtu) {
@@ -401,7 +401,7 @@
 	iph->protocol = sk->protocol;
 	iph->saddr    = rt->rt_src;
 	iph->daddr    = rt->rt_dst;
-	skb->nh.iph   = iph;
+	ip_hdr(skb)   = iph;
 	/* Transport layer set skb->h.foo itself. */
 
 	if(opt && opt->optlen) {
@@ -561,7 +561,7 @@
 		 */
 
 		data = skb_put(skb, fraglen);
-		skb->nh.iph = (struct iphdr *)data;
+		ip_hdr(skb) = (struct iphdr *)data;
 
 		/*
 		 *	Only write IP header onto non-raw packets 
@@ -711,7 +711,7 @@
 	skb->priority = sk->priority;
 	skb->dst = dst_clone(&rt->u.dst);
 
-	skb->nh.iph = iph = (struct iphdr *)skb_put(skb, length);
+	iph = ip_hdr(skb) = (struct iphdr *)skb_put(skb, length);
 
 	if (!inet->hdrincl) {
 		iph->version=4;
@@ -781,7 +781,7 @@
 	 *	Point into the IP datagram header.
 	 */
 
-	iph = skb->nh.iph;
+	iph = ip_hdr(skb);
 
 	/*
 	 *	Setup starting values.
@@ -862,7 +862,7 @@
 		/*
 		 *	Fill in the new header fields.
 		 */
-		iph = skb2->nh.iph;
+		iph = ip_hdr(skb2);
 		iph->frag_off = htons((offset >> 3));
 
 		/* ANK: dirty, but effective trick. Upgrade options only if
@@ -991,7 +991,7 @@
 			daddr = replyopts.opt.faddr;
 	}
 
-	if (ip_route_output(&rt, daddr, rt->rt_spec_dst, RT_TOS(skb->nh.iph->tos), 0))
+	if (ip_route_output(&rt, daddr, rt->rt_spec_dst, RT_TOS(ip_hdr(skb)->tos), 0))
 		return;
 
 	/* And let IP do all the hard work.
@@ -1001,9 +1001,9 @@
 	   with locally disabled BH and that sk cannot be already spinlocked.
 	 */
 	bh_lock_sock(sk);
-	inet->tos = skb->nh.iph->tos;
+	inet->tos = ip_hdr(skb)->tos;
 	sk->priority = skb->priority;
-	sk->protocol = skb->nh.iph->protocol;
+	sk->protocol = ip_hdr(skb)->protocol;
 	ip_build_xmit(sk, ip_reply_glue_bits, arg, len, &ipc, rt, MSG_DONTWAIT);
 	bh_unlock_sock(sk);
 
===== net/ipv4/ip_sockglue.c 1.8 vs edited =====
--- 1.8/net/ipv4/ip_sockglue.c	Mon Mar 11 10:46:43 2002
+++ edited/net/ipv4/ip_sockglue.c	Mon Sep 30 19:22:22 2002
@@ -58,7 +58,7 @@
 	struct in_pktinfo info;
 	struct rtable *rt = (struct rtable *)skb->dst;
 
-	info.ipi_addr.s_addr = skb->nh.iph->daddr;
+	info.ipi_addr.s_addr = ip_hdr(skb)->daddr;
 	if (rt) {
 		info.ipi_ifindex = rt->rt_iif;
 		info.ipi_spec_dst.s_addr = rt->rt_spec_dst;
@@ -72,13 +72,13 @@
 
 static void ip_cmsg_recv_ttl(struct msghdr *msg, struct sk_buff *skb)
 {
-	int ttl = skb->nh.iph->ttl;
+	int ttl = ip_hdr(skb)->ttl;
 	put_cmsg(msg, SOL_IP, IP_TTL, sizeof(int), &ttl);
 }
 
 static void ip_cmsg_recv_tos(struct msghdr *msg, struct sk_buff *skb)
 {
-	put_cmsg(msg, SOL_IP, IP_TOS, 1, &skb->nh.iph->tos);
+	put_cmsg(msg, SOL_IP, IP_TOS, 1, &ip_hdr(skb)->tos);
 }
 
 static void ip_cmsg_recv_opts(struct msghdr *msg, struct sk_buff *skb)
@@ -86,7 +86,8 @@
 	if (IPCB(skb)->opt.optlen == 0)
 		return;
 
-	put_cmsg(msg, SOL_IP, IP_RECVOPTS, IPCB(skb)->opt.optlen, skb->nh.iph+1);
+	put_cmsg(msg, SOL_IP, IP_RECVOPTS, IPCB(skb)->opt.optlen,
+		 ip_hdr(skb) + 1);
 }
 
 
@@ -276,8 +277,7 @@
 	if (!skb)
 		return;
 
-	iph = (struct iphdr*)skb_put(skb, sizeof(struct iphdr));
-	skb->nh.iph = iph;
+	iph = ip_hdr(skb) = (struct iphdr*)skb_put(skb, sizeof(struct iphdr));
 	iph->daddr = daddr;
 
 	serr = SKB_EXT_ERR(skb);  
@@ -346,7 +346,7 @@
 		struct inet_opt *inet = inet_sk(sk);
 
 		sin->sin_family = AF_INET;
-		sin->sin_addr.s_addr = skb->nh.iph->saddr;
+		sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
 		sin->sin_port = 0;
 		memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));
 		if (inet->cmsg_flags)
===== net/ipv4/ipconfig.c 1.20 vs edited =====
--- 1.20/net/ipv4/ipconfig.c	Fri Aug 23 22:47:08 2002
+++ edited/net/ipv4/ipconfig.c	Mon Sep 30 19:22:22 2002
@@ -668,7 +668,7 @@
 	memset(b, 0, sizeof(struct bootp_pkt));
 
 	/* Construct IP header */
-	skb->nh.iph = h = &b->iph;
+	h = ip_hdr(skb) = &b->iph;
 	h->version = 4;
 	h->ihl = 5;
 	h->tot_len = htons(sizeof(struct bootp_pkt));
@@ -792,7 +792,7 @@
  */
 static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt)
 {
-	struct bootp_pkt *b = (struct bootp_pkt *) skb->nh.iph;
+	struct bootp_pkt *b = (struct bootp_pkt *)ip_hdr(skb);
 	struct iphdr *h = &b->iph;
 	struct ic_device *d;
 	int len;
===== net/ipv4/ipip.c 1.12 vs edited =====
--- 1.12/net/ipv4/ipip.c	Fri Jul 19 03:16:19 2002
+++ edited/net/ipv4/ipip.c	Mon Sep 30 19:22:22 2002
@@ -467,7 +467,7 @@
 static inline void ipip_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb)
 {
 	if (INET_ECN_is_ce(iph->tos) &&
-	    INET_ECN_is_not_ce(skb->nh.iph->tos))
+	    INET_ECN_is_not_ce(ip_hdr(skb)->tos))
 		IP_ECN_set_ce(iph);
 }
 
@@ -479,7 +479,7 @@
 	if (!pskb_may_pull(skb, sizeof(struct iphdr)))
 		goto out;
 
-	iph = skb->nh.iph;
+	iph = ip_hdr(skb);
 	skb->mac.raw = skb->nh.raw;
 	skb->nh.raw = skb->data;
 	memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
@@ -533,7 +533,7 @@
 	u16    df = tiph->frag_off;
 	struct rtable *rt;     			/* Route to the other host */
 	struct net_device *tdev;			/* Device to other host */
-	struct iphdr  *old_iph = skb->nh.iph;
+	struct iphdr  *old_iph = ip_hdr(skb);
 	struct iphdr  *iph;			/* Our new IP header */
 	int    max_headroom;			/* The extra header space needed */
 	u32    dst = tiph->daddr;
@@ -632,7 +632,7 @@
 	 *	Push down and install the IPIP header.
 	 */
 
-	iph 			=	skb->nh.iph;
+	iph 			=	ip_hdr(skb);
 	iph->version		=	4;
 	iph->ihl		=	sizeof(struct iphdr)>>2;
 	iph->frag_off		=	df;
===== net/ipv4/ipmr.c 1.9 vs edited =====
--- 1.9/net/ipv4/ipmr.c	Wed Mar 13 20:27:38 2002
+++ edited/net/ipv4/ipmr.c	Mon Sep 30 19:22:22 2002
@@ -294,7 +294,7 @@
 	atomic_dec(&cache_resolve_queue_len);
 
 	while((skb=skb_dequeue(&c->mfc_un.unres.unresolved))) {
-		if (skb->nh.iph->version == 0) {
+		if (!ip_hdr(skb)->version) {
 			struct nlmsghdr *nlh = (struct nlmsghdr *)skb_pull(skb, sizeof(struct iphdr));
 			nlh->nlmsg_type = NLMSG_ERROR;
 			nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct nlmsgerr));
@@ -499,7 +499,7 @@
 	 */
 
 	while((skb=__skb_dequeue(&uc->mfc_un.unres.unresolved))) {
-		if (skb->nh.iph->version == 0) {
+		if (!ip_hdr(skb)->version) {
 			int err;
 			struct nlmsghdr *nlh = (struct nlmsghdr *)skb_pull(skb, sizeof(struct iphdr));
 
@@ -527,7 +527,7 @@
 static int ipmr_cache_report(struct sk_buff *pkt, vifi_t vifi, int assert)
 {
 	struct sk_buff *skb;
-	int ihl = pkt->nh.iph->ihl<<2;
+	int ihl = ip_hdr(pkt)->ihl << 2;
 	struct igmphdr *igmp;
 	struct igmpmsg *msg;
 	int ret;
@@ -555,8 +555,9 @@
 		msg->im_msgtype = IGMPMSG_WHOLEPKT;
 		msg->im_mbz = 0;
  		msg->im_vif = reg_vif_num;
-		skb->nh.iph->ihl = sizeof(struct iphdr) >> 2;
-		skb->nh.iph->tot_len = htons(ntohs(pkt->nh.iph->tot_len) + sizeof(struct iphdr));
+		ip_hdr(skb)->ihl = sizeof(struct iphdr) >> 2;
+		ip_hdr(skb)->tot_len = htons(ntohs(ip_hdr(pkt)->tot_len) +
+					     sizeof(struct iphdr));
 	} else 
 #endif
 	{	
@@ -565,23 +566,23 @@
 	 *	Copy the IP header
 	 */
 
-	skb->nh.iph = (struct iphdr *)skb_put(skb, ihl);
-	memcpy(skb->data,pkt->data,ihl);
-	skb->nh.iph->protocol = 0;			/* Flag to the kernel this is a route add */
-	msg = (struct igmpmsg*)skb->nh.iph;
-	msg->im_vif = vifi;
-	skb->dst = dst_clone(pkt->dst);
+	struct iphdr *iph = ip_hdr(skb) = (struct iphdr *)skb_put(skb, ihl);
+
+	memcpy(skb->data, pkt->data, ihl);
+	iph->protocol	= 0; /* Flag to the kernel this is a route add */
+	msg		= (struct igmpmsg *)iph;
+	msg->im_vif	= vifi;
+	skb->dst	= dst_clone(pkt->dst);
 
 	/*
 	 *	Add our header
 	 */
 
 	igmp=(struct igmphdr *)skb_put(skb,sizeof(struct igmphdr));
-	igmp->type	=
-	msg->im_msgtype = assert;
-	igmp->code 	=	0;
-	skb->nh.iph->tot_len=htons(skb->len);			/* Fix the length */
-	skb->h.raw = skb->nh.raw;
+	igmp->type	= msg->im_msgtype = assert;
+	igmp->code 	= 0;
+	iph->tot_len	= htons(skb->len);			/* Fix the length */
+	skb->h.raw	= skb->nh.raw;
         }
 
 	if (mroute_socket == NULL) {
@@ -610,11 +611,12 @@
 {
 	int err;
 	struct mfc_cache *c;
+	struct iphdr *iph = ip_hdr(skb);
 
 	spin_lock_bh(&mfc_unres_lock);
 	for (c=mfc_unres_queue; c; c=c->next) {
-		if (c->mfc_mcastgrp == skb->nh.iph->daddr &&
-		    c->mfc_origin == skb->nh.iph->saddr)
+		if (c->mfc_mcastgrp == iph->daddr &&
+		    c->mfc_origin == iph->saddr)
 			break;
 	}
 
@@ -634,9 +636,9 @@
 		/*
 		 *	Fill in the new cache entry
 		 */
-		c->mfc_parent=-1;
-		c->mfc_origin=skb->nh.iph->saddr;
-		c->mfc_mcastgrp=skb->nh.iph->daddr;
+		c->mfc_parent	= -1;
+		c->mfc_origin	= iph->saddr;
+		c->mfc_mcastgrp	= iph->daddr;
 
 		/*
 		 *	Reflect first query at mrouted.
@@ -1083,8 +1085,8 @@
 	struct iphdr *iph = (struct iphdr *)skb_push(skb,sizeof(struct iphdr));
 
 	iph->version	= 	4;
-	iph->tos	=	skb->nh.iph->tos;
-	iph->ttl	=	skb->nh.iph->ttl;
+	iph->tos	=	ip_hdr(skb)->tos;
+	iph->ttl	=	ip_hdr(skb)->ttl;
 	iph->frag_off	=	0;
 	iph->daddr	=	daddr;
 	iph->saddr	=	saddr;
@@ -1094,8 +1096,8 @@
 	ip_select_ident(iph, skb->dst, NULL);
 	ip_send_check(iph);
 
-	skb->h.ipiph = skb->nh.iph;
-	skb->nh.iph = iph;
+	skb->h.ipiph = ip_hdr(skb);
+	ip_hdr(skb)  = iph;
 #ifdef CONFIG_NETFILTER
 	nf_conntrack_put(skb->nfct);
 	skb->nfct = NULL;
@@ -1119,7 +1121,7 @@
 static void ipmr_queue_xmit(struct sk_buff *skb, struct mfc_cache *c,
 			   int vifi, int last)
 {
-	struct iphdr *iph = skb->nh.iph;
+	struct iphdr *iph = ip_hdr(skb);
 	struct vif_device *vif = &vif_table[vifi];
 	struct net_device *dev;
 	struct rtable *rt;
@@ -1183,7 +1185,7 @@
 
 	dst_release(skb2->dst);
 	skb2->dst = &rt->u.dst;
-	iph = skb2->nh.iph;
+	iph = ip_hdr(skb2);
 	ip_decrease_ttl(iph);
 
 	/* FIXME: forward and output firewalls used to be called here.
@@ -1278,7 +1280,7 @@
 	 *	Forward the frame
 	 */
 	for (ct = cache->mfc_un.res.maxvif-1; ct >= cache->mfc_un.res.minvif; ct--) {
-		if (skb->nh.iph->ttl > cache->mfc_un.res.ttls[ct]) {
+		if (ip_hdr(skb)->ttl > cache->mfc_un.res.ttls[ct]) {
 			if (psend != -1)
 				ipmr_queue_xmit(skb, cache, psend, 0);
 			psend=ct;
@@ -1313,7 +1315,7 @@
 		    if (IPCB(skb)->opt.router_alert) {
 			    if (ip_call_ra_chain(skb))
 				    return 0;
-		    } else if (skb->nh.iph->protocol == IPPROTO_IGMP){
+		    } else if (ip_hdr(skb)->protocol == IPPROTO_IGMP){
 			    /* IGMPv1 (and broken IGMPv2 implementations sort of
 			       Cisco IOS <= 11.2(8)) do not put router alert
 			       option to IGMP packets destined to routable
@@ -1331,7 +1333,7 @@
 	}
 
 	read_lock(&mrt_lock);
-	cache = ipmr_cache_find(skb->nh.iph->saddr, skb->nh.iph->daddr);
+	cache = ipmr_cache_find(ip_hdr(skb)->saddr, ip_hdr(skb)->daddr);
 
 	/*
 	 *	No usable cache entry
@@ -1431,7 +1433,7 @@
 
 	skb->mac.raw = skb->nh.raw;
 	skb_pull(skb, (u8*)encap - skb->data);
-	skb->nh.iph = (struct iphdr *)skb->data;
+	ip_hdr(skb) = (struct iphdr *)skb->data;
 	skb->dev = reg_dev;
 	memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
 	skb->protocol = __constant_htons(ETH_P_IP);
@@ -1498,7 +1500,7 @@
 
 	skb->mac.raw = skb->nh.raw;
 	skb_pull(skb, (u8*)encap - skb->data);
-	skb->nh.iph = (struct iphdr *)skb->data;
+	ip_hdr(skb) = (struct iphdr *)skb->data;
 	skb->dev = reg_dev;
 	memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
 	skb->protocol = __constant_htons(ETH_P_IP);
@@ -1564,6 +1566,7 @@
 
 	if (cache==NULL) {
 		struct net_device *dev;
+		struct iphdr *iph;
 		int vif;
 
 		if (nowait) {
@@ -1576,11 +1579,11 @@
 			read_unlock(&mrt_lock);
 			return -ENODEV;
 		}
-		skb->nh.raw = skb_push(skb, sizeof(struct iphdr));
-		skb->nh.iph->ihl = sizeof(struct iphdr)>>2;
-		skb->nh.iph->saddr = rt->rt_src;
-		skb->nh.iph->daddr = rt->rt_dst;
-		skb->nh.iph->version = 0;
+		iph = ip_hdr(skb) = skb_push(skb, sizeof(*iph));
+		iph->ihl     = sizeof(*iph) >> 2;
+		iph->saddr   = rt->rt_src;
+		iph->daddr   = rt->rt_dst;
+		iph->version = 0;
 		err = ipmr_cache_unresolved(vif, skb);
 		read_unlock(&mrt_lock);
 		return err;
===== net/ipv4/raw.c 1.10 vs edited =====
--- 1.10/net/ipv4/raw.c	Fri Jul 19 03:16:20 2002
+++ edited/net/ipv4/raw.c	Mon Sep 30 19:22:22 2002
@@ -525,7 +525,7 @@
 	/* Copy the address. */
 	if (sin) {
 		sin->sin_family = AF_INET;
-		sin->sin_addr.s_addr = skb->nh.iph->saddr;
+		sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
 		memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));
 	}
 	if (inet->cmsg_flags)
===== net/ipv4/route.c 1.19 vs edited =====
--- 1.19/net/ipv4/route.c	Thu Aug 29 05:57:05 2002
+++ edited/net/ipv4/route.c	Mon Sep 30 19:22:22 2002
@@ -1142,7 +1142,7 @@
 static int ip_rt_bug(struct sk_buff *skb)
 {
 	printk(KERN_DEBUG "ip_rt_bug: %u.%u.%u.%u -> %u.%u.%u.%u, %s\n",
-		NIPQUAD(skb->nh.iph->saddr), NIPQUAD(skb->nh.iph->daddr),
+		NIPQUAD(ip_hdr(skb)->saddr), NIPQUAD(ip_hdr(skb)->daddr),
 		skb->dev ? skb->dev->name : "?");
 	kfree_skb(skb);
 	return 0;
===== net/ipv4/syncookies.c 1.8 vs edited =====
--- 1.8/net/ipv4/syncookies.c	Fri May 10 12:38:54 2002
+++ edited/net/ipv4/syncookies.c	Mon Sep 30 19:22:22 2002
@@ -60,7 +60,7 @@
 
 	NET_INC_STATS_BH(SyncookiesSent);
 
-	return secure_tcp_syn_cookie(skb->nh.iph->saddr, skb->nh.iph->daddr,
+	return secure_tcp_syn_cookie(ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
 				     skb->h.th->source, skb->h.th->dest,
 				     ntohl(skb->h.th->seq),
 				     jiffies / (HZ * 60), mssind);
@@ -79,14 +79,12 @@
  */
 static inline int cookie_check(struct sk_buff *skb, __u32 cookie)
 {
-	__u32 seq; 
-	__u32 mssind;
-
-	seq = ntohl(skb->h.th->seq)-1; 
-	mssind = check_tcp_syn_cookie(cookie,
-				      skb->nh.iph->saddr, skb->nh.iph->daddr,
-				      skb->h.th->source, skb->h.th->dest,
-				      seq, jiffies / (HZ * 60), COUNTER_TRIES);
+	struct iphdr *iph = ip_hdr(skb);
+	__u32 seq = ntohl(skb->h.th->seq) - 1; 
+	__u32 mssind = check_tcp_syn_cookie(cookie, iph->saddr, iph->daddr,
+					    skb->h.th->source, skb->h.th->dest,
+					    seq, jiffies / (HZ * 60),
+					    COUNTER_TRIES);
 
 	return mssind < NUM_MSS ? msstab[mssind] + 1 : 0;
 }
@@ -140,8 +138,8 @@
 	req->snt_isn		= cookie; 
 	req->mss		= mss;
  	req->rmt_port		= skb->h.th->source;
-	req->af.v4_req.loc_addr = skb->nh.iph->daddr;
-	req->af.v4_req.rmt_addr = skb->nh.iph->saddr;
+	req->af.v4_req.loc_addr = ip_hdr(skb)->daddr;
+	req->af.v4_req.rmt_addr = ip_hdr(skb)->saddr;
 	req->class		= &or_ipv4; /* for savety */
 	req->af.v4_req.opt	= NULL;
 
===== net/ipv4/tcp_ipv4.c 1.23 vs edited =====
--- 1.23/net/ipv4/tcp_ipv4.c	Thu Aug 29 05:57:05 2002
+++ edited/net/ipv4/tcp_ipv4.c	Mon Sep 30 19:22:22 2002
@@ -526,8 +526,8 @@
 
 static inline __u32 tcp_v4_init_sequence(struct sock *sk, struct sk_buff *skb)
 {
-	return secure_tcp_sequence_number(skb->nh.iph->daddr,
-					  skb->nh.iph->saddr,
+	return secure_tcp_sequence_number(ip_hdr(skb)->daddr,
+					  ip_hdr(skb)->saddr,
 					  skb->h.th->dest,
 					  skb->h.th->source);
 }
@@ -1184,8 +1184,8 @@
 	memset(&arg, 0, sizeof arg);
 	arg.iov[0].iov_base = (unsigned char *)&rth;
 	arg.iov[0].iov_len  = sizeof rth;
-	arg.csum = csum_tcpudp_nofold(skb->nh.iph->daddr,
-				      skb->nh.iph->saddr, /*XXX*/
+	arg.csum = csum_tcpudp_nofold(ip_hdr(skb)->daddr,
+				      ip_hdr(skb)->saddr, /*XXX*/
 				      sizeof(struct tcphdr), IPPROTO_TCP, 0);
 	arg.n_iov = 1;
 	arg.csumoffset = offsetof(struct tcphdr, check) / 2;
@@ -1235,8 +1235,8 @@
 	rep.th.ack     = 1;
 	rep.th.window  = htons(win);
 
-	arg.csum = csum_tcpudp_nofold(skb->nh.iph->daddr,
-				      skb->nh.iph->saddr, /*XXX*/
+	arg.csum = csum_tcpudp_nofold(ip_hdr(skb)->daddr,
+				      ip_hdr(skb)->saddr, /*XXX*/
 				      arg.iov[0].iov_len, IPPROTO_TCP, 0);
 	arg.csumoffset = offsetof(struct tcphdr, check) / 2;
 
@@ -1390,8 +1390,8 @@
 {
 	struct tcp_opt tp;
 	struct open_request *req;
-	__u32 saddr = skb->nh.iph->saddr;
-	__u32 daddr = skb->nh.iph->daddr;
+	__u32 saddr = ip_hdr(skb)->saddr;
+	__u32 daddr = ip_hdr(skb)->daddr;
 	__u32 isn = TCP_SKB_CB(skb)->when;
 	struct dst_entry *dst = NULL;
 #ifdef CONFIG_SYN_COOKIES
@@ -1569,7 +1569,7 @@
 	newinet->opt	      = req->af.v4_req.opt;
 	req->af.v4_req.opt    = NULL;
 	newinet->mc_index     = tcp_v4_iif(skb);
-	newinet->mc_ttl	      = skb->nh.iph->ttl;
+	newinet->mc_ttl	      = ip_hdr(skb)->ttl;
 	newtp->ext_header_len = 0;
 	if (newinet->opt)
 		newtp->ext_header_len = newinet->opt->optlen;
@@ -1595,7 +1595,7 @@
 static struct sock *tcp_v4_hnd_req(struct sock *sk, struct sk_buff *skb)
 {
 	struct tcphdr *th = skb->h.th;
-	struct iphdr *iph = skb->nh.iph;
+	struct iphdr *iph = ip_hdr(skb);
 	struct tcp_opt *tp = tcp_sk(sk);
 	struct sock *nsk;
 	struct open_request **prev;
@@ -1605,9 +1605,9 @@
 	if (req)
 		return tcp_check_req(sk, skb, req, prev);
 
-	nsk = __tcp_v4_lookup_established(skb->nh.iph->saddr,
+	nsk = __tcp_v4_lookup_established(ip_hdr(skb)->saddr,
 					  th->source,
-					  skb->nh.iph->daddr,
+					  ip_hdr(skb)->daddr,
 					  ntohs(th->dest),
 					  tcp_v4_iif(skb));
 
@@ -1629,10 +1629,12 @@
 
 static int tcp_v4_checksum_init(struct sk_buff *skb)
 {
+	struct iphdr *iph = ip_hdr(skb);
+
 	if (skb->ip_summed == CHECKSUM_HW) {
 		skb->ip_summed = CHECKSUM_UNNECESSARY;
-		if (!tcp_v4_check(skb->h.th, skb->len, skb->nh.iph->saddr,
-				  skb->nh.iph->daddr, skb->csum))
+		if (!tcp_v4_check(skb->h.th, skb->len, iph->saddr,
+				  iph->daddr, skb->csum))
 			return 0;
 
 		NETDEBUG(if (net_ratelimit())
@@ -1640,15 +1642,13 @@
 		skb->ip_summed = CHECKSUM_NONE;
 	}
 	if (skb->len <= 76) {
-		if (tcp_v4_check(skb->h.th, skb->len, skb->nh.iph->saddr,
-				 skb->nh.iph->daddr,
-				 skb_checksum(skb, 0, skb->len, 0)))
+		if (tcp_v4_check(skb->h.th, skb->len, iph->saddr,
+				 iph->daddr, skb_checksum(skb, 0, skb->len, 0)))
 			return -1;
 		skb->ip_summed = CHECKSUM_UNNECESSARY;
 	} else {
-		skb->csum = ~tcp_v4_check(skb->h.th, skb->len,
-					  skb->nh.iph->saddr,
-					  skb->nh.iph->daddr, 0);
+		skb->csum = ~tcp_v4_check(skb->h.th, skb->len, iph->saddr,
+					  iph->daddr, 0);
 	}
 	return 0;
 }
@@ -1724,6 +1724,7 @@
 int tcp_v4_rcv(struct sk_buff *skb)
 {
 	struct tcphdr *th;
+	struct iphdr *iph;
 	struct sock *sk;
 	int ret;
 
@@ -1752,17 +1753,17 @@
 		goto bad_packet;
 
 	th = skb->h.th;
+	iph = ip_hdr(skb);
 	TCP_SKB_CB(skb)->seq = ntohl(th->seq);
 	TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin +
 				    skb->len - th->doff * 4);
 	TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq);
 	TCP_SKB_CB(skb)->when	 = 0;
-	TCP_SKB_CB(skb)->flags	 = skb->nh.iph->tos;
+	TCP_SKB_CB(skb)->flags	 = iph->tos;
 	TCP_SKB_CB(skb)->sacked	 = 0;
 
-	sk = __tcp_v4_lookup(skb->nh.iph->saddr, th->source,
-			     skb->nh.iph->daddr, ntohs(th->dest),
-			     tcp_v4_iif(skb));
+	sk = __tcp_v4_lookup(iph->saddr, th->source, iph->daddr,
+			     ntohs(th->dest), tcp_v4_iif(skb));
 
 	if (!sk)
 		goto no_tcp_socket;
@@ -1814,7 +1815,7 @@
 	switch (tcp_timewait_state_process((struct tcp_tw_bucket *)sk,
 					   skb, th, skb->len)) {
 	case TCP_TW_SYN: {
-		struct sock *sk2 = tcp_v4_lookup_listener(skb->nh.iph->daddr,
+		struct sock *sk2 = tcp_v4_lookup_listener(iph->daddr,
 							  ntohs(th->dest),
 							  tcp_v4_iif(skb));
 		if (sk2) {
===== net/ipv4/udp.c 1.11 vs edited =====
--- 1.11/net/ipv4/udp.c	Fri Jul 19 03:16:20 2002
+++ edited/net/ipv4/udp.c	Mon Sep 30 19:22:22 2002
@@ -687,7 +687,7 @@
 	{
 		sin->sin_family = AF_INET;
 		sin->sin_port = skb->h.uh->source;
-		sin->sin_addr.s_addr = skb->nh.iph->saddr;
+		sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
 		memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
   	}
 	if (inet->cmsg_flags)
@@ -904,8 +904,8 @@
   	struct udphdr *uh;
 	unsigned short ulen;
 	struct rtable *rt = (struct rtable*)skb->dst;
-	u32 saddr = skb->nh.iph->saddr;
-	u32 daddr = skb->nh.iph->daddr;
+	u32 saddr = ip_hdr(skb)->saddr;
+	u32 daddr = ip_hdr(skb)->daddr;
 	int len = skb->len;
 
   	IP_INC_STATS_BH(IpInDelivers);
===== net/ipv4/netfilter/arp_tables.c 1.2 vs edited =====
--- 1.2/net/ipv4/netfilter/arp_tables.c	Tue Jun 18 03:25:22 2002
+++ edited/net/ipv4/netfilter/arp_tables.c	Mon Sep 30 19:41:48 2002
@@ -247,7 +247,7 @@
 {
 	static const char nulldevname[IFNAMSIZ] = { 0 };
 	unsigned int verdict = NF_DROP;
-	struct arphdr *arp = (*pskb)->nh.arph;
+	struct arphdr *arp = arp_hdr(*pskb);
 	int hotdrop = 0;
 	struct arpt_entry *e, *back;
 	const char *indev, *outdev;
@@ -314,7 +314,7 @@
 								     userdata);
 
 				/* Target might have changed stuff. */
-				arp = (*pskb)->nh.arph;
+				arp = arp_hdr(*pskb);
 
 				if (verdict == ARPT_CONTINUE)
 					e = (void *)e + e->next_offset;
===== net/ipv4/netfilter/ip_conntrack_core.c 1.12 vs edited =====
--- 1.12/net/ipv4/netfilter/ip_conntrack_core.c	Fri Aug 23 22:34:38 2002
+++ edited/net/ipv4/netfilter/ip_conntrack_core.c	Mon Sep 30 19:22:22 2002
@@ -508,7 +508,7 @@
 	IP_NF_ASSERT(iph->protocol == IPPROTO_ICMP);
 	IP_NF_ASSERT(skb->nfct == NULL);
 
-	iph = skb->nh.iph;
+	iph = ip_hdr(skb);
 	hdr = (struct icmphdr *)((u_int32_t *)iph + iph->ihl);
 	inner = (struct iphdr *)(hdr + 1);
 	datalen = skb->len - iph->ihl*4 - sizeof(*hdr);
@@ -680,7 +680,7 @@
 	for (i=0; i < IP_CT_NUMBER; i++)
 		conntrack->infos[i].master = &conntrack->ct_general;
 
-	if (!protocol->new(conntrack, skb->nh.iph, skb->len)) {
+	if (!protocol->new(conntrack, ip_hdr(skb), skb->len)) {
 		kmem_cache_free(ip_conntrack_cachep, conntrack);
 		return NULL;
 	}
@@ -747,9 +747,9 @@
 	struct ip_conntrack_tuple tuple;
 	struct ip_conntrack_tuple_hash *h;
 
-	IP_NF_ASSERT((skb->nh.iph->frag_off & htons(IP_OFFSET)) == 0);
+	IP_NF_ASSERT((ip_hdr(skb)->frag_off & htons(IP_OFFSET)) == 0);
 
-	if (!get_tuple(skb->nh.iph, skb->len, &tuple, proto))
+	if (!get_tuple(ip_hdr(skb), skb->len, &tuple, proto))
 		return NULL;
 
 	/* look for tuple match */
@@ -810,11 +810,11 @@
 	if ((*pskb)->pkt_type == PACKET_BROADCAST) {
 		printk("Broadcast packet!\n");
 		return NF_ACCEPT;
-	} else if (((*pskb)->nh.iph->daddr & htonl(0x000000FF)) 
+	} else if ((ip_hdr(*pskb)->daddr & htonl(0x000000FF)) 
 		   == htonl(0x000000FF)) {
 		printk("Should bcast: %u.%u.%u.%u->%u.%u.%u.%u (sk=%p, ptype=%u)\n",
-		       NIPQUAD((*pskb)->nh.iph->saddr),
-		       NIPQUAD((*pskb)->nh.iph->daddr),
+		       NIPQUAD(ip_hdr(*pskb)->saddr),
+		       NIPQUAD(ip_hdr(*pskb)->daddr),
 		       (*pskb)->sk, (*pskb)->pkt_type);
 	}
 #endif
@@ -825,17 +825,17 @@
 		return NF_ACCEPT;
 
 	/* Gather fragments. */
-	if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
+	if (ip_hdr(*pskb)->frag_off & htons(IP_MF | IP_OFFSET)) {
 		*pskb = ip_ct_gather_frags(*pskb);
 		if (!*pskb)
 			return NF_STOLEN;
 	}
 
-	proto = ip_ct_find_proto((*pskb)->nh.iph->protocol);
+	proto = ip_ct_find_proto(ip_hdr(*pskb)->protocol);
 
 	/* It may be an icmp error... */
-	if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP 
-	    && icmp_error_track(*pskb, &ctinfo, hooknum))
+	if (ip_hdr(*pskb)->protocol == IPPROTO_ICMP &&
+	    icmp_error_track(*pskb, &ctinfo, hooknum))
 		return NF_ACCEPT;
 
 	if (!(ct = resolve_normal_ct(*pskb, proto,&set_reply,hooknum,&ctinfo)))
@@ -848,7 +848,7 @@
 
 	IP_NF_ASSERT((*pskb)->nfct);
 
-	ret = proto->packet(ct, (*pskb)->nh.iph, (*pskb)->len, ctinfo);
+	ret = proto->packet(ct, ip_hdr(*pskb), (*pskb)->len, ctinfo);
 	if (ret == -1) {
 		/* Invalid */
 		nf_conntrack_put((*pskb)->nfct);
@@ -857,7 +857,7 @@
 	}
 
 	if (ret != NF_DROP && ct->helper) {
-		ret = ct->helper->help((*pskb)->nh.iph, (*pskb)->len,
+		ret = ct->helper->help(ip_hdr(*pskb), (*pskb)->len,
 				       ct, ctinfo);
 		if (ret == -1) {
 			/* Invalid */
@@ -1216,7 +1216,7 @@
 		sock_put(sk);
 	}
 
-	ip_send_check(skb->nh.iph);
+	ip_send_check(ip_hdr(skb));
 	skb->nfcache |= NFC_ALTERED;
 #ifdef CONFIG_NETFILTER_DEBUG
 	/* Packet path as if nothing had happened. */
===== net/ipv4/netfilter/ip_conntrack_proto_tcp.c 1.5 vs edited =====
--- 1.5/net/ipv4/netfilter/ip_conntrack_proto_tcp.c	Mon Sep 23 00:16:36 2002
+++ edited/net/ipv4/netfilter/ip_conntrack_proto_tcp.c	Mon Sep 30 19:22:22 2002
@@ -234,7 +234,7 @@
 static int tcp_exp_matches_pkt(struct ip_conntrack_expect *exp,
 			       struct sk_buff **pskb)
 {
-	struct iphdr *iph = (*pskb)->nh.iph;
+	struct iphdr *iph = ip_hdr(*pskb);
 	struct tcphdr *tcph = (struct tcphdr *)((u_int32_t *)iph + iph->ihl);
 	unsigned int datalen;
 
===== net/ipv4/netfilter/ip_conntrack_standalone.c 1.9 vs edited =====
--- 1.9/net/ipv4/netfilter/ip_conntrack_standalone.c	Mon Aug 19 15:41:51 2002
+++ edited/net/ipv4/netfilter/ip_conntrack_standalone.c	Mon Sep 30 19:22:22 2002
@@ -217,7 +217,7 @@
 {
 	/* root is playing with raw sockets. */
 	if ((*pskb)->len < sizeof(struct iphdr)
-	    || (*pskb)->nh.iph->ihl * 4 < sizeof(struct iphdr)) {
+	    || ip_hdr(*pskb)->ihl * 4 < sizeof(struct iphdr)) {
 		if (net_ratelimit())
 			printk("ipt_hook: happy cracking.\n");
 		return NF_ACCEPT;
===== net/ipv4/netfilter/ip_fw_compat.c 1.10 vs edited =====
--- 1.10/net/ipv4/netfilter/ip_fw_compat.c	Mon Aug 19 15:51:30 2002
+++ edited/net/ipv4/netfilter/ip_fw_compat.c	Mon Sep 30 19:22:22 2002
@@ -101,7 +101,7 @@
 					  (struct net_device *)in,
 					  (*pskb)->nh.raw, &redirpt, pskb);
 
-		if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
+		if (ip_hdr(*pskb)->frag_off & htons(IP_MF | IP_OFFSET)) {
 			*pskb = ip_ct_gather_frags(*pskb);
 
 			if (!*pskb)
@@ -147,7 +147,7 @@
 		 * Generally, routing is THE FIRST thing to make, when
 		 * packet enters IP stack. Before packet is routed you
 		 * cannot call any service routines from IP stack.  */
-		struct iphdr *iph = (*pskb)->nh.iph;
+		struct iphdr *iph = ip_hdr(*pskb);
 
 		if ((*pskb)->dst != NULL
 		    || ip_route_input(*pskb, iph->daddr, iph->saddr, iph->tos,
@@ -165,7 +165,7 @@
 		} else if (hooknum == NF_IP_POST_ROUTING) {
 			check_for_unredirect(*pskb);
 			/* Handle ICMP errors from client here */
-			if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP
+			if (ip_hdr(*pskb)->protocol == IPPROTO_ICMP
 			    && (*pskb)->nfct)
 				check_for_masq_error(*pskb);
 		}
===== net/ipv4/netfilter/ip_fw_compat_masq.c 1.4 vs edited =====
--- 1.4/net/ipv4/netfilter/ip_fw_compat_masq.c	Tue Mar 26 20:16:27 2002
+++ edited/net/ipv4/netfilter/ip_fw_compat_masq.c	Mon Sep 30 19:22:22 2002
@@ -35,7 +35,7 @@
 unsigned int
 do_masquerade(struct sk_buff **pskb, const struct net_device *dev)
 {
-	struct iphdr *iph = (*pskb)->nh.iph;
+	struct iphdr *iph = ip_hdr(*pskb);
 	struct ip_nat_info *info;
 	enum ip_conntrack_info ctinfo;
 	struct ip_conntrack *ct;
@@ -123,7 +123,7 @@
 check_for_demasq(struct sk_buff **pskb)
 {
 	struct ip_conntrack_tuple tuple;
-	struct iphdr *iph = (*pskb)->nh.iph;
+	struct iphdr *iph = ip_hdr(*pskb);
 	struct ip_conntrack_protocol *protocol;
 	struct ip_conntrack_tuple_hash *h;
 	enum ip_conntrack_info ctinfo;
@@ -157,7 +157,7 @@
 		/* Fall thru... */
 	case IPPROTO_TCP:
 	case IPPROTO_UDP:
-		IP_NF_ASSERT(((*pskb)->nh.iph->frag_off & htons(IP_OFFSET)) == 0);
+		IP_NF_ASSERT(!(ip_hdr(*pskb)->frag_off & htons(IP_OFFSET)));
 
 		if (!get_tuple(iph, (*pskb)->len, &tuple, protocol)) {
 			if (net_ratelimit())
===== net/ipv4/netfilter/ip_fw_compat_redir.c 1.5 vs edited =====
--- 1.5/net/ipv4/netfilter/ip_fw_compat_redir.c	Wed Feb 13 22:36:31 2002
+++ edited/net/ipv4/netfilter/ip_fw_compat_redir.c	Mon Sep 30 19:22:22 2002
@@ -95,7 +95,7 @@
 
 static void do_tcp_redir(struct sk_buff *skb, struct redir *redir)
 {
-	struct iphdr *iph = skb->nh.iph;
+	struct iphdr *iph = ip_hdr(skb);
 	struct tcphdr *tcph = (struct tcphdr *)((u_int32_t *)iph
 						+ iph->ihl);
 
@@ -135,7 +135,7 @@
 /* `unredir' a reply packet. */
 static void do_tcp_unredir(struct sk_buff *skb, struct redir *redir)
 {
-	struct iphdr *iph = skb->nh.iph;
+	struct iphdr *iph = ip_hdr(skb);
 	struct tcphdr *tcph = (struct tcphdr *)((u_int32_t *)iph
 						+ iph->ihl);
 
@@ -167,7 +167,7 @@
 	    const struct net_device *dev,
 	    u_int16_t redirpt)
 {
-	struct iphdr *iph = skb->nh.iph;
+	struct iphdr *iph = ip_hdr(skb);
 	u_int32_t newdst;
 
 	/* Figure out address: not loopback. */
@@ -253,7 +253,7 @@
 void
 check_for_redirect(struct sk_buff *skb)
 {
-	struct iphdr *iph = skb->nh.iph;
+	struct iphdr *iph = ip_hdr(skb);
 	struct tcphdr *tcph = (struct tcphdr *)((u_int32_t *)iph
 						+ iph->ihl);
 	struct redir *redir;
@@ -281,7 +281,7 @@
 void
 check_for_unredirect(struct sk_buff *skb)
 {
-	struct iphdr *iph = skb->nh.iph;
+	struct iphdr *iph = ip_hdr(skb);
 	struct tcphdr *tcph = (struct tcphdr *)((u_int32_t *)iph
 						+ iph->ihl);
 	struct redir *redir;
===== net/ipv4/netfilter/ip_nat_core.c 1.14 vs edited =====
--- 1.14/net/ipv4/netfilter/ip_nat_core.c	Wed Aug 28 04:54:31 2002
+++ edited/net/ipv4/netfilter/ip_nat_core.c	Mon Sep 30 19:22:22 2002
@@ -739,7 +739,7 @@
 	int ret = 1;
 
 	MUST_BE_READ_LOCKED(&ip_conntrack_lock);
-	proto = ip_ct_find_proto((*pskb)->nh.iph->protocol);
+	proto = ip_ct_find_proto(ip_hdr(*pskb)->protocol);
 	if (proto->exp_matches_pkt)
 		ret = proto->exp_matches_pkt(exp, pskb);
 
@@ -757,7 +757,7 @@
 	unsigned int i;
 	struct ip_nat_helper *helper;
 	enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
-	int is_tcp = (*pskb)->nh.iph->protocol == IPPROTO_TCP;
+	int is_tcp = ip_hdr(*pskb)->protocol == IPPROTO_TCP;
 
 	/* Need nat lock to protect against modification, but neither
 	   conntrack (referenced) and helper (deleted with
@@ -784,8 +784,8 @@
 			       ? "SRC" : "DST",
 			       NIPQUAD(info->manips[i].manip.ip),
 			       htons(info->manips[i].manip.u.all));
-			manip_pkt((*pskb)->nh.iph->protocol,
-				  (*pskb)->nh.iph,
+			manip_pkt(ip_hdr(*pskb)->protocol,
+				  ip_hdr(*pskb),
 				  (*pskb)->len,
 				  &info->manips[i].manip,
 				  info->manips[i].maniptype,
@@ -803,8 +803,8 @@
 		DEBUGP("do_bindings: helper existing for (%p)\n", ct);
 
 		/* Always defragged for helpers */
-		IP_NF_ASSERT(!((*pskb)->nh.iph->frag_off
-			       & __constant_htons(IP_MF|IP_OFFSET)));
+		IP_NF_ASSERT(!(ip_hdr(*pskb)->frag_off &
+			       htons(IP_MF | IP_OFFSET)));
 
 		/* Have to grab read lock before sibling_list traversal */
 		READ_LOCK(&ip_conntrack_lock);
@@ -864,7 +864,7 @@
 		       unsigned int hooknum,
 		       int dir)
 {
-	struct iphdr *iph = skb->nh.iph;
+	struct iphdr *iph = ip_hdr(skb);
 	struct icmphdr *hdr = (struct icmphdr *)((u_int32_t *)iph + iph->ihl);
 	struct iphdr *inner = (struct iphdr *)(hdr + 1);
 	size_t datalen = skb->len - ((void *)inner - (void *)iph);
===== net/ipv4/netfilter/ip_nat_ftp.c 1.6 vs edited =====
--- 1.6/net/ipv4/netfilter/ip_nat_ftp.c	Mon Aug 19 15:51:30 2002
+++ edited/net/ipv4/netfilter/ip_nat_ftp.c	Mon Sep 30 19:22:22 2002
@@ -173,7 +173,7 @@
 			  struct ip_conntrack_expect *expect)
 {
 	u_int32_t newip;
-	struct iphdr *iph = (*pskb)->nh.iph;
+	struct iphdr *iph = ip_hdr(*pskb);
 	struct tcphdr *tcph = (void *)iph + iph->ihl*4;
 	u_int16_t port;
 	struct ip_conntrack_tuple newtuple;
@@ -232,7 +232,7 @@
 			 unsigned int hooknum,
 			 struct sk_buff **pskb)
 {
-	struct iphdr *iph = (*pskb)->nh.iph;
+	struct iphdr *iph = ip_hdr(*pskb);
 	struct tcphdr *tcph = (void *)iph + iph->ihl*4;
 	unsigned int datalen;
 	int dir;
===== net/ipv4/netfilter/ip_nat_helper.c 1.6 vs edited =====
--- 1.6/net/ipv4/netfilter/ip_nat_helper.c	Sun Sep  1 03:08:16 2002
+++ edited/net/ipv4/netfilter/ip_nat_helper.c	Mon Sep 30 19:22:22 2002
@@ -59,7 +59,7 @@
 	DEBUGP("ip_nat_resize_packet: old_size = %u, new_size = %u\n",
 		(*skb)->len, new_size);
 
-	iph = (*skb)->nh.iph;
+	iph = ip_hdr(*skb);
 	tcph = (void *)iph + iph->ihl*4;
 	data = (void *)tcph + tcph->doff*4;
 
@@ -83,7 +83,7 @@
 		}
 	}
 
-	iph = (*skb)->nh.iph;
+	iph = ip_hdr(*skb);
 	tcph = (void *)iph + iph->ihl*4;
 	data = (void *)tcph + tcph->doff*4;
 
@@ -129,7 +129,7 @@
 			 char *rep_buffer,
 			 unsigned int rep_len)
 {
-	struct iphdr *iph = (*skb)->nh.iph;
+	struct iphdr *iph = ip_hdr(*skb);
 	struct tcphdr *tcph;
 	unsigned char *data;
 	u_int32_t tcplen, newlen, newtcplen;
@@ -170,7 +170,7 @@
 	}
 
 	/* skb may be copied !! */
-	iph = (*skb)->nh.iph;
+	iph = ip_hdr(*skb);
 	tcph = (void *)iph + iph->ihl*4;
 	data = (void *)tcph + tcph->doff*4;
 
@@ -261,12 +261,11 @@
 			struct ip_conntrack *ct,
 			enum ip_conntrack_info ctinfo)
 {
-	struct iphdr *iph;
+	struct iphdr *iph = ip_hdr(skb);
 	struct tcphdr *tcph;
 	unsigned char *ptr;
 	int length, dir, sack_adjusted = 0;
 
-	iph = skb->nh.iph;
 	tcph = (void *)iph + iph->ihl*4;
 	length = (tcph->doff*4)-sizeof(struct tcphdr);
 	ptr = (unsigned char *)(tcph+1);
@@ -311,12 +310,11 @@
 		  struct ip_conntrack *ct, 
 		  enum ip_conntrack_info ctinfo)
 {
-	struct iphdr *iph;
+	struct iphdr *iph = ip_hdr(skb);
 	struct tcphdr *tcph;
 	int dir, newseq, newack;
 	struct ip_nat_seq *this_way, *other_way;	
 	
-	iph = skb->nh.iph;
 	tcph = (void *)iph + iph->ihl*4;
 
 	dir = CTINFO2DIR(ctinfo);
===== net/ipv4/netfilter/ip_nat_irc.c 1.3 vs edited =====
--- 1.3/net/ipv4/netfilter/ip_nat_irc.c	Tue Mar 26 20:16:27 2002
+++ edited/net/ipv4/netfilter/ip_nat_irc.c	Mon Sep 30 19:22:22 2002
@@ -97,7 +97,7 @@
 {
 	u_int32_t newip;
 	struct ip_conntrack_tuple t;
-	struct iphdr *iph = (*pskb)->nh.iph;
+	struct iphdr *iph = ip_hdr(*pskb);
 	struct tcphdr *tcph = (void *) iph + iph->ihl * 4;
 	int port;
 
@@ -161,7 +161,7 @@
 			 unsigned int hooknum, 
 			 struct sk_buff **pskb)
 {
-	struct iphdr *iph = (*pskb)->nh.iph;
+	struct iphdr *iph = ip_hdr(*pskb);
 	struct tcphdr *tcph = (void *) iph + iph->ihl * 4;
 	unsigned int datalen;
 	int dir;
===== net/ipv4/netfilter/ip_nat_snmp_basic.c 1.4 vs edited =====
--- 1.4/net/ipv4/netfilter/ip_nat_snmp_basic.c	Mon Aug 19 15:51:30 2002
+++ edited/net/ipv4/netfilter/ip_nat_snmp_basic.c	Mon Sep 30 19:22:22 2002
@@ -1207,7 +1207,7 @@
                           unsigned int hooknum,
                           struct sk_buff **pskb)
 {
-	struct iphdr *iph = (*pskb)->nh.iph;
+	struct iphdr *iph = ip_hdr(*pskb);
 	struct udphdr *udph = (struct udphdr *)((u_int32_t *)iph + iph->ihl);
 	u_int16_t udplen = ntohs(udph->len);
 	u_int16_t paylen = udplen - sizeof(struct udphdr);
@@ -1250,7 +1250,7 @@
                              struct sk_buff **pskb)
 {
 	int dir = CTINFO2DIR(ctinfo);
-	struct iphdr *iph = (*pskb)->nh.iph;
+	struct iphdr *iph = ip_hdr(*pskb);
 	struct udphdr *udph = (struct udphdr *)((u_int32_t *)iph + iph->ihl);
 
 	spin_lock_bh(&snmp_lock);
===== net/ipv4/netfilter/ip_nat_standalone.c 1.13 vs edited =====
--- 1.13/net/ipv4/netfilter/ip_nat_standalone.c	Tue Mar 26 20:16:27 2002
+++ edited/net/ipv4/netfilter/ip_nat_standalone.c	Mon Sep 30 19:22:22 2002
@@ -74,8 +74,7 @@
 
 	/* We never see fragments: conntrack defrags on pre-routing
 	   and local-out, and ip_nat_out protects post-routing. */
-	IP_NF_ASSERT(!((*pskb)->nh.iph->frag_off
-		       & __constant_htons(IP_MF|IP_OFFSET)));
+	IP_NF_ASSERT(!(ip_hdr(*pskb)->frag_off & htons(IP_MF | IP_OFFSET)));
 
 	(*pskb)->nfcache |= NFC_UNKNOWN;
 
@@ -92,7 +91,7 @@
 		/* Exception: ICMP redirect to new connection (not in
                    hash table yet).  We must not let this through, in
                    case we're doing NAT to the same network. */
-		struct iphdr *iph = (*pskb)->nh.iph;
+		struct iphdr *iph = ip_hdr(*pskb);
 		struct icmphdr *hdr = (struct icmphdr *)
 			((u_int32_t *)iph + iph->ihl);
 		if (iph->protocol == IPPROTO_ICMP
@@ -104,7 +103,7 @@
 	switch (ctinfo) {
 	case IP_CT_RELATED:
 	case IP_CT_RELATED+IP_CT_IS_REPLY:
-		if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP) {
+		if (ip_hdr(*pskb)->protocol == IPPROTO_ICMP) {
 			return icmp_reply_translation(*pskb, ct, hooknum,
 						      CTINFO2DIR(ctinfo));
 		}
@@ -173,7 +172,7 @@
 {
 	/* root is playing with raw sockets. */
 	if ((*pskb)->len < sizeof(struct iphdr)
-	    || (*pskb)->nh.iph->ihl * 4 < sizeof(struct iphdr))
+	    || ip_hdr(*pskb)->ihl * 4 < sizeof(struct iphdr))
 		return NF_ACCEPT;
 
 	/* We can hit fragment here; forwarded packets get
@@ -186,7 +185,7 @@
 
 	   I'm starting to have nightmares about fragments.  */
 
-	if ((*pskb)->nh.iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) {
+	if (ip_hdr(*pskb)->frag_off & htons(IP_MF | IP_OFFSET)) {
 		*pskb = ip_ct_gather_frags(*pskb);
 
 		if (!*pskb)
@@ -208,16 +207,16 @@
 
 	/* root is playing with raw sockets. */
 	if ((*pskb)->len < sizeof(struct iphdr)
-	    || (*pskb)->nh.iph->ihl * 4 < sizeof(struct iphdr))
+	    || ip_hdr(*pskb)->ihl * 4 < sizeof(struct iphdr))
 		return NF_ACCEPT;
 
-	saddr = (*pskb)->nh.iph->saddr;
-	daddr = (*pskb)->nh.iph->daddr;
+	saddr = ip_hdr(*pskb)->saddr;
+	daddr = ip_hdr(*pskb)->daddr;
 
 	ret = ip_nat_fn(hooknum, pskb, in, out, okfn);
 	if (ret != NF_DROP && ret != NF_STOLEN
-	    && ((*pskb)->nh.iph->saddr != saddr
-		|| (*pskb)->nh.iph->daddr != daddr))
+	    && (ip_hdr(*pskb)->saddr != saddr
+		|| ip_hdr(*pskb)->daddr != daddr))
 		return ip_route_me_harder(pskb) == 0 ? ret : NF_DROP;
 	return ret;
 }
===== net/ipv4/netfilter/ip_queue.c 1.8 vs edited =====
--- 1.8/net/ipv4/netfilter/ip_queue.c	Tue Jul 23 00:15:20 2002
+++ edited/net/ipv4/netfilter/ip_queue.c	Mon Sep 30 19:22:22 2002
@@ -286,7 +286,7 @@
 	entry->skb = skb;
 
 	if (entry->info->hook == NF_IP_LOCAL_OUT) {
-		struct iphdr *iph = skb->nh.iph;
+		struct iphdr *iph = ip_hdr(skb);
 
 		entry->rt_info.tos = iph->tos;
 		entry->rt_info.daddr = iph->daddr;
@@ -362,7 +362,7 @@
 	 * returns control to the table.
 	 */
 	if (e->info->hook == NF_IP_LOCAL_OUT) {
-		struct iphdr *iph = e->skb->nh.iph;
+		struct iphdr *iph = ip_hdr(e->skb);
 
 		if (!(iph->tos == e->rt_info.tos
 		      && iph->daddr == e->rt_info.daddr
===== net/ipv4/netfilter/ip_tables.c 1.9 vs edited =====
--- 1.9/net/ipv4/netfilter/ip_tables.c	Wed Aug 28 04:53:27 2002
+++ edited/net/ipv4/netfilter/ip_tables.c	Mon Sep 30 19:22:22 2002
@@ -272,7 +272,7 @@
 	struct ipt_entry *e, *back;
 
 	/* Initialization */
-	ip = (*pskb)->nh.iph;
+	ip = ip_hdr(*pskb);
 	protohdr = (u_int32_t *)ip + ip->ihl;
 	datalen = (*pskb)->len - ip->ihl * 4;
 	indev = in ? in->name : nulldevname;
@@ -377,7 +377,7 @@
 					= 0x57acc001;
 #endif
 				/* Target might have changed stuff. */
-				ip = (*pskb)->nh.iph;
+				ip = ip_hdr(*pskb);
 				protohdr = (u_int32_t *)ip + ip->ihl;
 				datalen = (*pskb)->len - ip->ihl * 4;
 
===== net/ipv4/netfilter/ipt_DSCP.c 1.1 vs edited =====
--- 1.1/net/ipv4/netfilter/ipt_DSCP.c	Mon Aug 19 15:48:13 2002
+++ edited/net/ipv4/netfilter/ipt_DSCP.c	Mon Sep 30 19:22:22 2002
@@ -29,7 +29,7 @@
        const void *targinfo,
        void *userinfo)
 {
-	struct iphdr *iph = (*pskb)->nh.iph;
+	struct iphdr *iph = ip_hdr(*pskb);
 	const struct ipt_DSCP_info *dinfo = targinfo;
 	u_int8_t sh_dscp = ((dinfo->dscp << IPT_DSCP_SHIFT) & IPT_DSCP_MASK);
 
@@ -45,7 +45,7 @@
 				return NF_DROP;
 			kfree_skb(*pskb);
 			*pskb = nskb;
-			iph = (*pskb)->nh.iph;
+			iph = ip_hdr(*pskb);
 		}
 
 		diffs[0] = htons(iph->tos) ^ 0xFFFF;
===== net/ipv4/netfilter/ipt_ECN.c 1.1 vs edited =====
--- 1.1/net/ipv4/netfilter/ipt_ECN.c	Mon Aug 19 15:48:13 2002
+++ edited/net/ipv4/netfilter/ipt_ECN.c	Mon Sep 30 19:22:22 2002
@@ -38,7 +38,7 @@
 				return NF_DROP;
 			kfree_skb(*pskb);
 			*pskb = nskb;
-			iph = (*pskb)->nh.iph;
+			iph = ip_hdr(*pskb);
 		}
 
 		diffs[0] = htons(iph->tos) ^ 0xFFFF;
@@ -72,7 +72,7 @@
 			return NF_DROP;
 		kfree_skb(*pskb);
 		*pskb = nskb;
-		iph = (*pskb)->nh.iph;
+		iph = ip_hdr(*pskb);
 	}
 
 	diffs[0] = *tcpflags;
@@ -109,7 +109,7 @@
        const void *targinfo,
        void *userinfo)
 {
-	struct iphdr *iph = (*pskb)->nh.iph;
+	struct iphdr *iph = ip_hdr(*pskb);
 	const struct ipt_ECN_info *einfo = targinfo;
 
 	if (einfo->operation & IPT_ECN_OP_SET_IP)
===== net/ipv4/netfilter/ipt_LOG.c 1.4 vs edited =====
--- 1.4/net/ipv4/netfilter/ipt_LOG.c	Tue Feb  5 13:24:40 2002
+++ edited/net/ipv4/netfilter/ipt_LOG.c	Mon Sep 30 19:22:22 2002
@@ -278,7 +278,7 @@
 	       const void *targinfo,
 	       void *userinfo)
 {
-	struct iphdr *iph = (*pskb)->nh.iph;
+	struct iphdr *iph = ip_hdr(*pskb);
 	const struct ipt_log_info *loginfo = targinfo;
 	char level_string[4] = "< >";
 
===== net/ipv4/netfilter/ipt_MASQUERADE.c 1.5 vs edited =====
--- 1.5/net/ipv4/netfilter/ipt_MASQUERADE.c	Tue Feb  5 05:49:27 2002
+++ edited/net/ipv4/netfilter/ipt_MASQUERADE.c	Mon Sep 30 19:22:22 2002
@@ -84,9 +84,9 @@
 
 	mr = targinfo;
 
-	key.dst = (*pskb)->nh.iph->daddr;
+	key.dst = ip_hdr(*pskb)->daddr;
 	key.src = 0; /* Unknown: that's what we're trying to establish */
-	key.tos = RT_TOS((*pskb)->nh.iph->tos)|RTO_CONN;
+	key.tos = RT_TOS(ip_hdr(*pskb)->tos) | RTO_CONN;
 	key.oif = out->ifindex;
 #ifdef CONFIG_IP_ROUTE_FWMARK
 	key.fwmark = (*pskb)->nfmark;
===== net/ipv4/netfilter/ipt_MIRROR.c 1.3 vs edited =====
--- 1.3/net/ipv4/netfilter/ipt_MIRROR.c	Tue Feb  5 13:23:43 2002
+++ edited/net/ipv4/netfilter/ipt_MIRROR.c	Mon Sep 30 19:22:22 2002
@@ -43,7 +43,7 @@
 
 static int route_mirror(struct sk_buff *skb)
 {
-        struct iphdr *iph = skb->nh.iph;
+        struct iphdr *iph = ip_hdr(skb);
 	struct rtable *rt;
 
 	/* Backwards */
@@ -67,7 +67,7 @@
 static void
 ip_rewrite(struct sk_buff *skb)
 {
-	struct iphdr *iph = skb->nh.iph;
+	struct iphdr *iph = ip_hdr(skb);
 	u32 odaddr = iph->saddr;
 	u32 osaddr = iph->daddr;
 
@@ -113,7 +113,7 @@
 		/* If we are not at FORWARD hook (INPUT/PREROUTING),
 		 * the TTL isn't decreased by the IP stack */
 		if (hooknum != NF_IP_FORWARD) {
-			struct iphdr *iph = (*pskb)->nh.iph;
+			struct iphdr *iph = ip_hdr(*pskb);
 			if (iph->ttl <= 1) {
 				/* this will traverse normal stack, and 
 				 * thus call conntrack on the icmp packet */
===== net/ipv4/netfilter/ipt_REJECT.c 1.8 vs edited =====
--- 1.8/net/ipv4/netfilter/ipt_REJECT.c	Mon Aug 19 15:51:30 2002
+++ edited/net/ipv4/netfilter/ipt_REJECT.c	Mon Sep 30 19:22:22 2002
@@ -36,6 +36,7 @@
 static void send_reset(struct sk_buff *oldskb, int local)
 {
 	struct sk_buff *nskb;
+	struct iphdr *iph, *oiph = ip_hdr(oldskb);
 	struct tcphdr *otcph, *tcph;
 	struct rtable *rt;
 	unsigned int otcplen;
@@ -44,21 +45,20 @@
 	int needs_ack;
 
 	/* IP header checks: fragment, too short. */
-	if (oldskb->nh.iph->frag_off & htons(IP_OFFSET)
-	    || oldskb->len < (oldskb->nh.iph->ihl<<2) + sizeof(struct tcphdr))
+	if (oiph->frag_off & htons(IP_OFFSET) ||
+	    oldskb->len < (oiph->ihl << 2) + sizeof(struct tcphdr))
 		return;
 
-	otcph = (struct tcphdr *)((u_int32_t*)oldskb->nh.iph + oldskb->nh.iph->ihl);
-	otcplen = oldskb->len - oldskb->nh.iph->ihl*4;
+	otcph = (struct tcphdr *)((u_int32_t*)oiph + oiph->ihl);
+	otcplen = oldskb->len - oiph->ihl * 4;
 
 	/* No RST for RST. */
 	if (otcph->rst)
 		return;
 
 	/* Check checksum. */
-	if (tcp_v4_check(otcph, otcplen, oldskb->nh.iph->saddr,
-			 oldskb->nh.iph->daddr,
-			 csum_partial((char *)otcph, otcplen, 0)) != 0)
+	if (tcp_v4_check(otcph, otcplen, oiph->saddr, oiph->daddr,
+			 csum_partial((char *)otcph, otcplen, 0)))
 		return;
 
 	/* Copy skb (even if skb is about to be dropped, we can't just
@@ -77,20 +77,21 @@
 #endif
 	nskb->nfmark = 0;
 
-	tcph = (struct tcphdr *)((u_int32_t*)nskb->nh.iph + nskb->nh.iph->ihl);
+	iph = ip_hdr(nskb);
+	tcph = (struct tcphdr *)((u_int32_t*)iph + iph->ihl);
 
 	/* Swap source and dest */
-	tmp_addr = nskb->nh.iph->saddr;
-	nskb->nh.iph->saddr = nskb->nh.iph->daddr;
-	nskb->nh.iph->daddr = tmp_addr;
+	tmp_addr = iph->saddr;
+	iph->saddr = iph->daddr;
+	iph->daddr = tmp_addr;
 	tmp_port = tcph->source;
 	tcph->source = tcph->dest;
 	tcph->dest = tmp_port;
 
 	/* Truncate to length (no data) */
-	tcph->doff = sizeof(struct tcphdr)/4;
-	skb_trim(nskb, nskb->nh.iph->ihl*4 + sizeof(struct tcphdr));
-	nskb->nh.iph->tot_len = htons(nskb->len);
+	tcph->doff = sizeof(*tcph) / 4;
+	skb_trim(nskb, iph->ihl * 4 + sizeof(*tcph));
+	iph->tot_len = htons(nskb->len);
 
 	if (tcph->ack) {
 		needs_ack = 0;
@@ -113,28 +114,22 @@
 
 	/* Adjust TCP checksum */
 	tcph->check = 0;
-	tcph->check = tcp_v4_check(tcph, sizeof(struct tcphdr),
-				   nskb->nh.iph->saddr,
-				   nskb->nh.iph->daddr,
-				   csum_partial((char *)tcph,
-						sizeof(struct tcphdr), 0));
+	tcph->check = tcp_v4_check(tcph, sizeof(*tcph), iph->saddr, iph->daddr,
+				   csum_partial((char *)tcph, sizeof(*tcph), 0));
 
 	/* Adjust IP TTL, DF */
-	nskb->nh.iph->ttl = MAXTTL;
+	iph->ttl = MAXTTL;
 	/* Set DF, id = 0 */
-	nskb->nh.iph->frag_off = htons(IP_DF);
-	nskb->nh.iph->id = 0;
+	iph->frag_off = htons(IP_DF);
+	iph->id = 0;
 
 	/* Adjust IP checksum */
-	nskb->nh.iph->check = 0;
-	nskb->nh.iph->check = ip_fast_csum((unsigned char *)nskb->nh.iph, 
-					   nskb->nh.iph->ihl);
+	iph->check = 0;
+	iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
 
 	/* Routing: if not headed for us, route won't like source */
-	if (ip_route_output(&rt, nskb->nh.iph->daddr,
-			    local ? nskb->nh.iph->saddr : 0,
-			    RT_TOS(nskb->nh.iph->tos) | RTO_CONN,
-			    0) != 0)
+	if (ip_route_output(&rt, iph->daddr, local ? iph->saddr : 0,
+			    RT_TOS(iph->tos) | RTO_CONN, 0))
 		goto free_nskb;
 
 	dst_release(nskb->dst);
@@ -172,7 +167,7 @@
 	if (!xrlim_allow(&rt->u.dst, 1*HZ))
 		return;
 
-	iph = skb_in->nh.iph;
+	iph = ip_hdr(skb_in);
 
 	/* No replies to physical multicast/broadcast */
 	if (skb_in->pkt_type!=PACKET_HOST)
@@ -231,8 +226,7 @@
 	skb_reserve(nskb, hh_len);
 
 	/* Set up IP header */
-	iph = nskb->nh.iph
-		= (struct iphdr *)skb_put(nskb, sizeof(struct iphdr));
+	iph = ip_hdr(skb_in) = (struct iphdr *)skb_put(nskb, sizeof(*iph));
 	iph->version=4;
 	iph->ihl=5;
 	iph->tos=tos;
@@ -261,10 +255,9 @@
 	data = skb_put(nskb,
 		       length - sizeof(struct iphdr) - sizeof(struct icmphdr));
 	/* FIXME: won't work with nonlinear skbs --RR */
-	memcpy(data, skb_in->nh.iph,
-	       length - sizeof(struct iphdr) - sizeof(struct icmphdr));
+	memcpy(data, ip_hdr(skb_in), length - sizeof(*iph) - sizeof(*icmph));
 	icmph->checksum = ip_compute_csum((unsigned char *)icmph,
-					  length - sizeof(struct iphdr));
+					  length - sizeof(*iph));
 
 	connection_attach(nskb, skb_in->nfct);
 
@@ -283,7 +276,7 @@
 
 	/* Our naive response construction doesn't deal with IP
            options, and probably shouldn't try. */
-	if ((*pskb)->nh.iph->ihl<<2 != sizeof(struct iphdr))
+	if (ip_hdr(*pskb)->ihl << 2 != sizeof(struct iphdr))
 		return NF_DROP;
 
 	/* WARNING: This code causes reentry within iptables.
===== net/ipv4/netfilter/ipt_TCPMSS.c 1.5 vs edited =====
--- 1.5/net/ipv4/netfilter/ipt_TCPMSS.c	Tue Feb  5 13:23:43 2002
+++ edited/net/ipv4/netfilter/ipt_TCPMSS.c	Mon Sep 30 19:22:22 2002
@@ -59,7 +59,7 @@
 		*pskb = nskb;
 	}
 
-	iph = (*pskb)->nh.iph;
+	iph = ip_hdr(*pskb);
 	tcplen = (*pskb)->len - iph->ihl*4;
 
 	tcph = (void *)iph + iph->ihl*4;
@@ -119,9 +119,9 @@
 			DEBUGP(KERN_INFO "ipt_tcpmss_target: %u.%u.%u.%u:%hu"
 			       "->%u.%u.%u.%u:%hu changed TCP MSS option"
 			       " (from %u to %u)\n", 
-			       NIPQUAD((*pskb)->nh.iph->saddr),
+			       NIPQUAD(ip_hdr(*pskb)->saddr),
 			       ntohs(tcph->source),
-			       NIPQUAD((*pskb)->nh.iph->daddr),
+			       NIPQUAD(ip_hdr(*pskb)->daddr),
 			       ntohs(tcph->dest),
 			       oldmss, newmss);
 			goto retmodified;
@@ -145,7 +145,7 @@
 
 		kfree_skb(*pskb);
 		*pskb = newskb;
-		iph = (*pskb)->nh.iph;
+		iph = ip_hdr(*pskb);
 		tcph = (void *)iph + iph->ihl*4;
 	}
 
@@ -177,9 +177,9 @@
 
 	DEBUGP(KERN_INFO "ipt_tcpmss_target: %u.%u.%u.%u:%hu"
 	       "->%u.%u.%u.%u:%hu added TCP MSS option (%u)\n",
-	       NIPQUAD((*pskb)->nh.iph->saddr),
+	       NIPQUAD(ip_hdr(*pskb)->saddr),
 	       ntohs(tcph->source),
-	       NIPQUAD((*pskb)->nh.iph->daddr),
+	       NIPQUAD(ip_hdr(*pskb)->daddr),
 	       ntohs(tcph->dest),
 	       newmss);
 
===== net/ipv4/netfilter/ipt_TOS.c 1.6 vs edited =====
--- 1.6/net/ipv4/netfilter/ipt_TOS.c	Tue Feb  5 13:23:43 2002
+++ edited/net/ipv4/netfilter/ipt_TOS.c	Mon Sep 30 19:22:22 2002
@@ -15,7 +15,7 @@
        const void *targinfo,
        void *userinfo)
 {
-	struct iphdr *iph = (*pskb)->nh.iph;
+	struct iphdr *iph = ip_hdr(*pskb);
 	const struct ipt_tos_target_info *tosinfo = targinfo;
 
 	if ((iph->tos & IPTOS_TOS_MASK) != tosinfo->tos) {
@@ -29,7 +29,7 @@
 				return NF_DROP;
 			kfree_skb(*pskb);
 			*pskb = nskb;
-			iph = (*pskb)->nh.iph;
+			iph = ip_hdr(*pskb);
 		}
 
 		diffs[0] = htons(iph->tos) ^ 0xFFFF;
===== net/ipv4/netfilter/ipt_ULOG.c 1.5 vs edited =====
--- 1.5/net/ipv4/netfilter/ipt_ULOG.c	Sun Sep 22 03:24:37 2002
+++ edited/net/ipv4/netfilter/ipt_ULOG.c	Mon Sep 30 19:22:22 2002
@@ -220,7 +220,7 @@
 		*(pm->prefix) = '\0';
 
 	if (in && in->hard_header_len > 0
-	    && (*pskb)->mac.raw != (void *) (*pskb)->nh.iph
+	    && (*pskb)->mac.raw != (void *)ip_hdr(*pskb)
 	    && in->hard_header_len <= ULOG_MAC_LEN) {
 		memcpy(pm->mac, (*pskb)->mac.raw, in->hard_header_len);
 		pm->mac_len = in->hard_header_len;
===== net/ipv4/netfilter/ipt_dscp.c 1.1 vs edited =====
--- 1.1/net/ipv4/netfilter/ipt_dscp.c	Mon Aug 19 15:48:13 2002
+++ edited/net/ipv4/netfilter/ipt_dscp.c	Mon Sep 30 19:22:22 2002
@@ -23,7 +23,7 @@
 		 int *hotdrop)
 {
 	const struct ipt_dscp_info *info = matchinfo;
-	const struct iphdr *iph = skb->nh.iph;
+	const struct iphdr *iph = ip_hdr(skb);
 
 	u_int8_t sh_dscp = ((info->dscp << IPT_DSCP_SHIFT) & IPT_DSCP_MASK);
 
===== net/ipv4/netfilter/ipt_ecn.c 1.1 vs edited =====
--- 1.1/net/ipv4/netfilter/ipt_ecn.c	Mon Aug 19 15:48:13 2002
+++ edited/net/ipv4/netfilter/ipt_ecn.c	Mon Sep 30 19:22:22 2002
@@ -60,7 +60,7 @@
 		 int *hotdrop)
 {
 	const struct ipt_ecn_info *info = matchinfo;
-	const struct iphdr *iph = skb->nh.iph;
+	const struct iphdr *iph = ip_hdr(skb);
 
 	if (info->operation & IPT_ECN_OP_MATCH_IP)
 		if (!match_ip(skb, iph, info))
===== net/ipv4/netfilter/ipt_length.c 1.1 vs edited =====
--- 1.1/net/ipv4/netfilter/ipt_length.c	Tue Feb  5 05:54:00 2002
+++ edited/net/ipv4/netfilter/ipt_length.c	Mon Sep 30 19:22:22 2002
@@ -20,7 +20,7 @@
       int *hotdrop)
 {
 	const struct ipt_length_info *info = matchinfo;
-	u_int16_t pktlen = ntohs(skb->nh.iph->tot_len);
+	u_int16_t pktlen = ntohs(ip_hdr(skb)->tot_len);
 	
 	return (pktlen >= info->min && pktlen <= info->max) ^ info->invert;
 }
===== net/ipv4/netfilter/ipt_tcpmss.c 1.2 vs edited =====
--- 1.2/net/ipv4/netfilter/ipt_tcpmss.c	Tue Feb  5 05:49:27 2002
+++ edited/net/ipv4/netfilter/ipt_tcpmss.c	Mon Sep 30 19:22:22 2002
@@ -53,10 +53,10 @@
       int *hotdrop)
 {
 	const struct ipt_tcpmss_match_info *info = matchinfo;
-	const struct tcphdr *tcph = (void *)skb->nh.iph + skb->nh.iph->ihl*4;
+	const struct tcphdr *tcph = (void *)ip_hdr(skb) + ip_hdr(skb)->ihl * 4;
 
 	return mssoption_match(info->mss_min, info->mss_max, tcph,
-			       skb->len - skb->nh.iph->ihl*4,
+			       skb->len - ip_hdr(skb)->ihl * 4,
 			       info->invert, hotdrop);
 }
 
===== net/ipv4/netfilter/ipt_tos.c 1.2 vs edited =====
--- 1.2/net/ipv4/netfilter/ipt_tos.c	Tue Feb  5 05:49:27 2002
+++ edited/net/ipv4/netfilter/ipt_tos.c	Mon Sep 30 19:22:22 2002
@@ -16,7 +16,7 @@
       int *hotdrop)
 {
 	const struct ipt_tos_info *info = matchinfo;
-	const struct iphdr *iph = skb->nh.iph;
+	const struct iphdr *iph = ip_hdr(skb);
 
 	return (iph->tos == info->tos) ^ info->invert;
 }
===== net/ipv4/netfilter/ipt_ttl.c 1.1 vs edited =====
--- 1.1/net/ipv4/netfilter/ipt_ttl.c	Tue Feb  5 05:54:00 2002
+++ edited/net/ipv4/netfilter/ipt_ttl.c	Mon Sep 30 19:22:22 2002
@@ -23,7 +23,7 @@
 		 int *hotdrop)
 {
 	const struct ipt_ttl_info *info = matchinfo;
-	const struct iphdr *iph = skb->nh.iph;
+	const struct iphdr *iph = ip_hdr(skb);
 
 	switch (info->mode) {
 		case IPT_TTL_EQ:
===== net/ipv4/netfilter/ipt_unclean.c 1.6 vs edited =====
--- 1.6/net/ipv4/netfilter/ipt_unclean.c	Sun Sep 22 03:24:37 2002
+++ edited/net/ipv4/netfilter/ipt_unclean.c	Mon Sep 30 19:22:22 2002
@@ -554,7 +554,7 @@
       u_int16_t datalen,
       int *hotdrop)
 {
-	return !check_ip(skb->nh.iph, skb->len, 0);
+	return !check_ip(ip_hdr(skb), skb->len, 0);
 }
 
 /* Called when user tries to insert an entry of this type. */
===== net/ipv4/netfilter/iptable_filter.c 1.3 vs edited =====
--- 1.3/net/ipv4/netfilter/iptable_filter.c	Tue Feb  5 13:24:40 2002
+++ edited/net/ipv4/netfilter/iptable_filter.c	Mon Sep 30 19:22:22 2002
@@ -105,7 +105,7 @@
 {
 	/* root is playing with raw sockets. */
 	if ((*pskb)->len < sizeof(struct iphdr)
-	    || (*pskb)->nh.iph->ihl * 4 < sizeof(struct iphdr)) {
+	    || ip_hdr(*pskb)->ihl * 4 < sizeof(struct iphdr)) {
 		if (net_ratelimit())
 			printk("ipt_hook: happy cracking.\n");
 		return NF_ACCEPT;
===== net/ipv4/netfilter/iptable_mangle.c 1.7 vs edited =====
--- 1.7/net/ipv4/netfilter/iptable_mangle.c	Mon Feb 11 05:21:45 2002
+++ edited/net/ipv4/netfilter/iptable_mangle.c	Mon Sep 30 19:22:22 2002
@@ -136,6 +136,7 @@
 		   const struct net_device *out,
 		   int (*okfn)(struct sk_buff *))
 {
+	struct iphdr *iph = ip_hdr(*pskb);
 	unsigned int ret;
 	u_int8_t tos;
 	u_int32_t saddr, daddr;
@@ -143,7 +144,7 @@
 
 	/* root is playing with raw sockets. */
 	if ((*pskb)->len < sizeof(struct iphdr)
-	    || (*pskb)->nh.iph->ihl * 4 < sizeof(struct iphdr)) {
+	    || iph->ihl * 4 < sizeof(struct iphdr)) {
 		if (net_ratelimit())
 			printk("ipt_hook: happy cracking.\n");
 		return NF_ACCEPT;
@@ -151,17 +152,17 @@
 
 	/* Save things which could affect route */
 	nfmark = (*pskb)->nfmark;
-	saddr = (*pskb)->nh.iph->saddr;
-	daddr = (*pskb)->nh.iph->daddr;
-	tos = (*pskb)->nh.iph->tos;
+	saddr  = iph->saddr;
+	daddr  = iph->daddr;
+	tos    = iph->tos;
 
 	ret = ipt_do_table(pskb, hook, in, out, &packet_mangler, NULL);
 	/* Reroute for ANY change. */
 	if (ret != NF_DROP && ret != NF_STOLEN && ret != NF_QUEUE
-	    && ((*pskb)->nh.iph->saddr != saddr
-		|| (*pskb)->nh.iph->daddr != daddr
+	    && (iph->saddr != saddr
+		|| iph->daddr != daddr
 		|| (*pskb)->nfmark != nfmark
-		|| (*pskb)->nh.iph->tos != tos))
+		|| iph->tos != tos))
 		return ip_route_me_harder(pskb) == 0 ? ret : NF_DROP;
 
 	return ret;
===== net/ipv6/datagram.c 1.4 vs edited =====
--- 1.4/net/ipv6/datagram.c	Mon Feb 11 05:06:54 2002
+++ edited/net/ipv6/datagram.c	Mon Sep 30 19:22:22 2002
@@ -172,9 +172,8 @@
 		} else {
 			struct inet_opt *inet = inet_sk(sk);
 
-			ipv6_addr_set(&sin->sin6_addr, 0, 0,
-				      __constant_htonl(0xffff),
-				      skb->nh.iph->saddr);
+			ipv6_addr_set(&sin->sin6_addr, 0, 0, htonl(0xffff),
+				      ip_hdr(skb)->saddr);
 			if (inet->cmsg_flags)
 				ip_cmsg_recv(msg, skb);
 		}
===== net/ipv6/sit.c 1.12 vs edited =====
--- 1.12/net/ipv6/sit.c	Fri Jul 19 03:16:20 2002
+++ edited/net/ipv6/sit.c	Mon Sep 30 19:22:22 2002
@@ -389,7 +389,7 @@
 	if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
 		goto out;
 
-	iph = skb->nh.iph;
+	iph = ip_hdr(skb);
 
 	read_lock(&ipip6_lock);
 	if ((tunnel = ipip6_tunnel_lookup(iph->saddr, iph->daddr)) != NULL) {
@@ -584,11 +584,11 @@
 	 *	Push down and install the IPIP header.
 	 */
 
-	iph 			=	skb->nh.iph;
+	iph 			=	ip_hdr(skb);
 	iph->version		=	4;
 	iph->ihl		=	sizeof(struct iphdr)>>2;
 	if (mtu > IPV6_MIN_MTU)
-		iph->frag_off	=	__constant_htons(IP_DF);
+		iph->frag_off	=	htons(IP_DF);
 	else
 		iph->frag_off	=	0;
 
===== net/ipv6/tcp_ipv6.c 1.22 vs edited =====
--- 1.22/net/ipv6/tcp_ipv6.c	Thu Aug 29 05:57:05 2002
+++ edited/net/ipv6/tcp_ipv6.c	Mon Sep 30 19:22:22 2002
@@ -414,8 +414,8 @@
 						    skb->h.th->dest,
 						    skb->h.th->source);
 	} else {
-		return secure_tcp_sequence_number(skb->nh.iph->daddr,
-						  skb->nh.iph->saddr,
+		return secure_tcp_sequence_number(ip_hdr(skb)->daddr,
+						  ip_hdr(skb)->saddr,
 						  skb->h.th->dest,
 						  skb->h.th->source);
 	}
===== net/ipv6/udp.c 1.12 vs edited =====
--- 1.12/net/ipv6/udp.c	Sun Sep 22 16:15:33 2002
+++ edited/net/ipv6/udp.c	Mon Sep 30 19:22:22 2002
@@ -424,11 +424,11 @@
 		sin6->sin6_flowinfo = 0;
 		sin6->sin6_scope_id = 0;
 
-		if (skb->protocol == __constant_htons(ETH_P_IP)) {
+		if (skb->protocol == htons(ETH_P_IP)) {
 			struct inet_opt *inet = inet_sk(sk);
 
 			ipv6_addr_set(&sin6->sin6_addr, 0, 0,
-				      __constant_htonl(0xffff), skb->nh.iph->saddr);
+				      htonl(0xffff), ip_hdr(skb)->saddr);
 			if (inet->cmsg_flags)
 				ip_cmsg_recv(msg, skb);
 		} else {
===== net/ipv6/netfilter/ip6table_filter.c 1.3 vs edited =====
--- 1.3/net/ipv6/netfilter/ip6table_filter.c	Tue Feb  5 13:24:40 2002
+++ edited/net/ipv6/netfilter/ip6table_filter.c	Mon Sep 30 19:22:22 2002
@@ -106,7 +106,7 @@
 #if 0
 	/* root is playing with raw sockets. */
 	if ((*pskb)->len < sizeof(struct iphdr)
-	    || (*pskb)->nh.iph->ihl * 4 < sizeof(struct iphdr)) {
+	    || ip_hdr(*pskb)->ihl * 4 < sizeof(struct iphdr)) {
 		if (net_ratelimit())
 			printk("ip6t_hook: happy cracking.\n");
 		return NF_ACCEPT;
===== net/ipv6/netfilter/ip6table_mangle.c 1.3 vs edited =====
--- 1.3/net/ipv6/netfilter/ip6table_mangle.c	Tue Feb  5 13:24:40 2002
+++ edited/net/ipv6/netfilter/ip6table_mangle.c	Mon Sep 30 19:22:22 2002
@@ -143,7 +143,7 @@
 #if 0
 	/* root is playing with raw sockets. */
 	if ((*pskb)->len < sizeof(struct iphdr)
-	    || (*pskb)->nh.iph->ihl * 4 < sizeof(struct iphdr)) {
+	    || ip_hdr(*pskb)->ihl * 4 < sizeof(struct iphdr)) {
 		if (net_ratelimit())
 			printk("ip6t_hook: happy cracking.\n");
 		return NF_ACCEPT;
===== net/sched/cls_rsvp.h 1.2 vs edited =====
--- 1.2/net/sched/cls_rsvp.h	Tue Feb  5 13:24:36 2002
+++ edited/net/sched/cls_rsvp.h	Mon Sep 30 19:22:22 2002
@@ -146,7 +146,7 @@
 #if RSVP_DST_LEN == 4
 	struct ipv6hdr *nhptr = skb->nh.ipv6h;
 #else
-	struct iphdr *nhptr = skb->nh.iph;
+	struct iphdr *nhptr = ip_hdr(skb);
 #endif
 
 #if !defined( __i386__) && !defined(__mc68000__)
===== net/sched/sch_atm.c 1.3 vs edited =====
--- 1.3/net/sched/sch_atm.c	Tue Feb  5 13:24:36 2002
+++ edited/net/sched/sch_atm.c	Mon Sep 30 19:22:22 2002
@@ -497,7 +497,7 @@
 			}
 			D2PRINTK("atm_tc_deqeueue: sending on class %p\n",flow);
 			/* remove any LL header somebody else has attached */
-			skb_pull(skb,(char *) skb->nh.iph-(char *) skb->data);
+			skb_pull(skb, (char *)ip_hdr(skb) - (char *)skb->data);
 			if (skb_headroom(skb) < flow->hdr_len) {
 				struct sk_buff *new;
 
@@ -507,7 +507,7 @@
 				skb = new;
 			}
 			D2PRINTK("sch_atm_dequeue: ip %p, data %p\n",
-			    skb->nh.iph,skb->data);
+				 ip_hdr(skb), skb->data);
 			ATM_SKB(skb)->vcc = flow->vcc;
 			memcpy(skb_push(skb,flow->hdr_len),flow->hdr,
 			    flow->hdr_len);
===== net/sched/sch_dsmark.c 1.6 vs edited =====
--- 1.6/net/sched/sch_dsmark.c	Tue Feb  5 13:24:36 2002
+++ edited/net/sched/sch_dsmark.c	Mon Sep 30 19:22:22 2002
@@ -194,10 +194,10 @@
 	D2PRINTK("dsmark_enqueue(skb %p,sch %p,[qdisc %p])\n",skb,sch,p);
 	if (p->set_tc_index) {
 		switch (skb->protocol) {
-			case __constant_htons(ETH_P_IP):
-				skb->tc_index = ipv4_get_dsfield(skb->nh.iph);
+			case htons(ETH_P_IP):
+				skb->tc_index = ipv4_get_dsfield(ip_hdr(skb));
 				break;
-			case __constant_htons(ETH_P_IPV6):
+			case htons(ETH_P_IPV6):
 				skb->tc_index = ipv6_get_dsfield(skb->nh.ipv6h);
 				break;
 			default:
@@ -262,13 +262,13 @@
 	index = skb->tc_index & (p->indices-1);
 	D2PRINTK("index %d->%d\n",skb->tc_index,index);
 	switch (skb->protocol) {
-		case __constant_htons(ETH_P_IP):
-			ipv4_change_dsfield(skb->nh.iph,
-			    p->mask[index],p->value[index]);
+		case htons(ETH_P_IP):
+			ipv4_change_dsfield(ip_hdr(skb), p->mask[index],
+					    p->value[index]);
 			break;
-		case __constant_htons(ETH_P_IPV6):
-			ipv6_change_dsfield(skb->nh.ipv6h,
-			    p->mask[index],p->value[index]);
+		case htons(ETH_P_IPV6):
+			ipv6_change_dsfield(skb->nh.ipv6h, p->mask[index],
+					    p->value[index]);
 			break;
 		default:
 			/*
===== net/sched/sch_red.c 1.4 vs edited =====
--- 1.4/net/sched/sch_red.c	Tue Feb  5 13:24:36 2002
+++ edited/net/sched/sch_red.c	Mon Sep 30 19:22:22 2002
@@ -164,26 +164,26 @@
 		return 0;
 
 	switch (skb->protocol) {
-	case __constant_htons(ETH_P_IP):
+	case htons(ETH_P_IP):
 	{
-		u8 tos = skb->nh.iph->tos;
+		u8 tos = ip_hdr(skb)->tos;
 
 		if (!(tos & RED_ECN_ECT))
 			return 0;
 
 		if (!(tos & RED_ECN_CE))
-			IP_ECN_set_ce(skb->nh.iph);
+			IP_ECN_set_ce(ip_hdr(skb));
 
 		return 1;
 	}
 
-	case __constant_htons(ETH_P_IPV6):
+	case htons(ETH_P_IPV6):
 	{
 		u32 label = *(u32*)skb->nh.raw;
 
-		if (!(label & __constant_htonl(RED_ECN_ECT<<20)))
+		if (!(label & htonl(RED_ECN_ECT << 20)))
 			return 0;
-		label |= __constant_htonl(RED_ECN_CE<<20);
+		label |= htonl(RED_ECN_CE << 20);
 		return 1;
 	}
 
===== net/sched/sch_sfq.c 1.5 vs edited =====
--- 1.5/net/sched/sch_sfq.c	Wed May 22 15:16:37 2002
+++ edited/net/sched/sch_sfq.c	Mon Sep 30 19:22:22 2002
@@ -140,9 +140,9 @@
 	u32 h, h2;
 
 	switch (skb->protocol) {
-	case __constant_htons(ETH_P_IP):
+	case htons(ETH_P_IP):
 	{
-		struct iphdr *iph = skb->nh.iph;
+		struct iphdr *iph = ip_hdr(skb);
 		h = iph->daddr;
 		h2 = iph->saddr^iph->protocol;
 		if (!(iph->frag_off&htons(IP_MF|IP_OFFSET)) &&
@@ -152,7 +152,7 @@
 			h2 ^= *(((u32*)iph) + iph->ihl);
 		break;
 	}
-	case __constant_htons(ETH_P_IPV6):
+	case htons(ETH_P_IPV6):
 	{
 		struct ipv6hdr *iph = skb->nh.ipv6h;
 		h = iph->daddr.s6_addr32[3];
===== net/sctp/input.c 1.5 vs edited =====
--- 1.5/net/sctp/input.c	Wed Sep 25 10:16:43 2002
+++ edited/net/sctp/input.c	Mon Sep 30 19:22:22 2002
@@ -76,13 +76,14 @@
 	__u16 *port;
 	size_t len;
 	struct sctphdr *sh;
+	struct iphdr *iph = ip_hdr(skb);
 
-	switch (skb->nh.iph->version) {
+	switch (iph->version) {
 	case 4:
 		to = &addr->v4.sin_addr.s_addr;
 		port = &addr->v4.sin_port;
-		saddr = &skb->nh.iph->saddr;
-		daddr = &skb->nh.iph->daddr;
+		saddr = &iph->saddr;
+		daddr = &iph->daddr;
 		len = sizeof(struct in_addr);
 		addr->v4.sin_family = AF_INET;
 		break;
===== net/sctp/protocol.c 1.7 vs edited =====
--- 1.7/net/sctp/protocol.c	Wed Sep 25 10:16:43 2002
+++ edited/net/sctp/protocol.c	Mon Sep 30 19:22:22 2002
@@ -387,7 +387,7 @@
 		sin = (struct sockaddr_in *)msgname;
 		sh = (struct sctphdr *)skb->h.raw;
 		sin->sin_port = sh->source;
-		sin->sin_addr.s_addr = skb->nh.iph->saddr;
+		sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
 	}
 } 
 
===== net/sctp/sm_make_chunk.c 1.8 vs edited =====
--- 1.8/net/sctp/sm_make_chunk.c	Wed Sep 25 10:16:43 2002
+++ edited/net/sctp/sm_make_chunk.c	Mon Sep 30 19:22:22 2002
@@ -971,7 +971,7 @@
 
 	source = &chunk->source;
 	skb = chunk->skb;
-	ih4 = skb->nh.iph;
+	ih4 = ip_hdr(skb);
 	ih6 = skb->nh.ipv6h;
 	sh = chunk->sctp_hdr;
 
@@ -1186,20 +1186,20 @@
 {
 	sctp_association_t *asoc;
 	sctp_scope_t scope;
+	struct iphdr *iph;
 
 	/* Create the bare association.  */
 	scope = sctp_scope(sctp_source(chunk));
 	asoc = sctp_association_new(ep, ep->base.sk, scope, priority);
 	if (!asoc)
 		goto nodata;
-
+	iph = ip_hdr(chunk->skb);
 	/* Create an entry for the source address of the packet.  */
-	switch (chunk->skb->nh.iph->version) {
+	switch (iph->version) {
 	case 4:
 		asoc->c.peer_addr.v4.sin_family     = AF_INET;
 		asoc->c.peer_addr.v4.sin_port = ntohs(chunk->sctp_hdr->source);
-		asoc->c.peer_addr.v4.sin_addr.s_addr =
-			chunk->skb->nh.iph->saddr;
+		asoc->c.peer_addr.v4.sin_addr.s_addr = iph->saddr;
                 break;
 
 	case 6:
===== net/sctp/sm_statefuns.c 1.8 vs edited =====
--- 1.8/net/sctp/sm_statefuns.c	Wed Sep 25 10:16:43 2002
+++ edited/net/sctp/sm_statefuns.c	Mon Sep 30 19:22:22 2002
@@ -1926,7 +1926,7 @@
 
 	if (!chunk->ecn_ce_done) {
 		chunk->ecn_ce_done = 1;
-		if (INET_ECN_is_ce(chunk->skb->nh.iph->tos) &&
+		if (INET_ECN_is_ce(ip_hdr(chunk->skb)->tos) &&
 		    asoc->peer.ecn_capable) {
 			/* Do real work as sideffect. */
 			sctp_add_cmd_sf(commands, SCTP_CMD_ECN_CE,
@@ -2140,7 +2140,7 @@
 	 */
 	if (!chunk->ecn_ce_done) {
 		chunk->ecn_ce_done = 1;
-		if (INET_ECN_is_ce(chunk->skb->nh.iph->tos) &&
+		if (INET_ECN_is_ce(ip_hdr(chunk->skb)->tos) &&
 		    asoc->peer.ecn_capable) {
 			/* Do real work as sideffect. */
 			sctp_add_cmd_sf(commands, SCTP_CMD_ECN_CE,
===== net/sunrpc/svcsock.c 1.26 vs edited =====
--- 1.26/net/sunrpc/svcsock.c	Wed Sep 18 07:05:34 2002
+++ edited/net/sunrpc/svcsock.c	Mon Sep 30 19:22:22 2002
@@ -532,7 +532,7 @@
 	/* Get sender address */
 	rqstp->rq_addr.sin_family = AF_INET;
 	rqstp->rq_addr.sin_port = skb->h.uh->source;
-	rqstp->rq_addr.sin_addr.s_addr = skb->nh.iph->saddr;
+	rqstp->rq_addr.sin_addr.s_addr = ip_hdr(skb)->saddr;
 
 	if (serv->sv_stats)
 		serv->sv_stats->netudpcnt++;

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: RFC: cleaning up struct sk_buff before halloween
  2002-09-30 22:53 RFC: cleaning up struct sk_buff before halloween Arnaldo Carvalho de Melo
@ 2002-09-30 22:53 ` David S. Miller
  2002-10-01  5:20   ` acme
  0 siblings, 1 reply; 3+ messages in thread
From: David S. Miller @ 2002-09-30 22:53 UTC (permalink / raw)
  To: acme; +Cc: netdev


	If you think that this is something doable for 2.6, I'll break
        the changeset into smaller chunks, per subsystem, etc.

Let's do this like the last week of October or something :-)
It even qualifies past the feature freeze since it's a cleanup.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: RFC: cleaning up struct sk_buff before halloween
  2002-09-30 22:53 ` David S. Miller
@ 2002-10-01  5:20   ` acme
  0 siblings, 0 replies; 3+ messages in thread
From: acme @ 2002-10-01  5:20 UTC (permalink / raw)
  To: David S. Miller; +Cc: acme, netdev

Quoting "David S. Miller" <davem@redhat.com>:  
  
> 	If you think that this is something doable for 2.6, I'll break  
>         the changeset into smaller chunks, per subsystem, etc.  
>   
> Let's do this like the last week of October or something :-)  
> It even qualifies past the feature freeze since it's a cleanup.  
  
Done deal. :-)  
  
- Arnaldo  

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2002-10-01  5:20 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-09-30 22:53 RFC: cleaning up struct sk_buff before halloween Arnaldo Carvalho de Melo
2002-09-30 22:53 ` David S. Miller
2002-10-01  5:20   ` acme

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).