struct inet6_skb_parm h6;
        } header;
 
-       unsigned int nhoff;
        unsigned int daddroff;
 };
 
 
        return xfrm4_extract_header(skb);
 }
 
-#ifdef CONFIG_NETFILTER
 static inline int xfrm4_rcv_encap_finish(struct sk_buff *skb)
 {
        if (skb->dst == NULL) {
        kfree_skb(skb);
        return NET_RX_DROP;
 }
-#endif
 
 int xfrm4_rcv_encap(struct sk_buff *skb, int nexthdr, __be32 spi,
                    int encap_type)
 {
-       XFRM_SPI_SKB_CB(skb)->nhoff = offsetof(struct iphdr, protocol);
        XFRM_SPI_SKB_CB(skb)->daddroff = offsetof(struct iphdr, daddr);
        return xfrm_input(skb, nexthdr, spi, encap_type);
 }
 
 int xfrm4_transport_finish(struct sk_buff *skb, int async)
 {
+       struct iphdr *iph = ip_hdr(skb);
+
+       iph->protocol = XFRM_MODE_SKB_CB(skb)->protocol;
+
 #ifdef CONFIG_NETFILTER
        __skb_push(skb, skb->data - skb_network_header(skb));
-       ip_hdr(skb)->tot_len = htons(skb->len);
-       ip_send_check(ip_hdr(skb));
+       iph->tot_len = htons(skb->len);
+       ip_send_check(iph);
 
        NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, skb->dev, NULL,
                xfrm4_rcv_encap_finish);
        return 0;
 #else
-       return -ip_hdr(skb)->protocol;
+       return -iph->protocol;
 #endif
 }
 
 
        if (err)
                return err;
 
+       XFRM_MODE_SKB_CB(skb)->protocol = ip_hdr(skb)->protocol;
+
        return xfrm4_extract_header(skb);
 }
 
 
        XFRM_MODE_SKB_CB(skb)->frag_off = iph->frag_off;
        XFRM_MODE_SKB_CB(skb)->tos = iph->tos;
        XFRM_MODE_SKB_CB(skb)->ttl = iph->ttl;
-       XFRM_MODE_SKB_CB(skb)->protocol = iph->protocol;
        memset(XFRM_MODE_SKB_CB(skb)->flow_lbl, 0,
               sizeof(XFRM_MODE_SKB_CB(skb)->flow_lbl));
 
 
 
 int xfrm6_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi)
 {
-       XFRM_SPI_SKB_CB(skb)->nhoff = IP6CB(skb)->nhoff;
        XFRM_SPI_SKB_CB(skb)->daddroff = offsetof(struct ipv6hdr, daddr);
        return xfrm_input(skb, nexthdr, spi, 0);
 }
 
 int xfrm6_transport_finish(struct sk_buff *skb, int async)
 {
+       skb_network_header(skb)[IP6CB(skb)->nhoff] =
+               XFRM_MODE_SKB_CB(skb)->protocol;
+
 #ifdef CONFIG_NETFILTER
        ipv6_hdr(skb)->payload_len = htons(skb->len);
        __skb_push(skb, skb->data - skb_network_header(skb));
 
        if (err)
                return err;
 
-       IP6CB(skb)->nhoff = offsetof(struct ipv6hdr, nexthdr);
+       XFRM_MODE_SKB_CB(skb)->protocol = ipv6_hdr(skb)->nexthdr;
+
        return xfrm6_extract_header(skb);
 }
 
 
        XFRM_MODE_SKB_CB(skb)->frag_off = htons(IP_DF);
        XFRM_MODE_SKB_CB(skb)->tos = ipv6_get_dsfield(iph);
        XFRM_MODE_SKB_CB(skb)->ttl = iph->hop_limit;
-       XFRM_MODE_SKB_CB(skb)->protocol =
-               skb_network_header(skb)[IP6CB(skb)->nhoff];
        memcpy(XFRM_MODE_SKB_CB(skb)->flow_lbl, iph->flow_lbl,
               sizeof(XFRM_MODE_SKB_CB(skb)->flow_lbl));
 
 
        __be32 seq;
        struct xfrm_state *x;
        int decaps = 0;
-       unsigned int nhoff = XFRM_SPI_SKB_CB(skb)->nhoff;
        unsigned int daddroff = XFRM_SPI_SKB_CB(skb)->daddroff;
 
        /* Allocate new secpath or COW existing one. */
                        goto drop_unlock;
                }
 
-               skb_network_header(skb)[nhoff] = nexthdr;
-
                /* only the first xfrm gets the encap type */
                encap_type = 0;
 
 
                spin_unlock(&x->lock);
 
+               XFRM_MODE_SKB_CB(skb)->protocol = nexthdr;
+
                if (x->inner_mode->input(x, skb))
                        goto drop;