]> git.hungrycats.org Git - linux/commitdiff
[AH6]: Get things working again.
authorHerbert Xu <herbert@gondor.apana.org.au>
Wed, 28 Jul 2004 02:01:51 +0000 (19:01 -0700)
committerDavid S. Miller <davem@nuts.davemloft.net>
Wed, 28 Jul 2004 02:01:51 +0000 (19:01 -0700)
Re: [AH6] Disable mutable bits after AH header

Unfortunately I broke ah6_input() in that patch.  Thanks to Miyazawa-san
for notifying me of the problem.

In that patch I removed the nh_offset parameter to ipv6_clear_mutable_options.
That broke ah6_input() because it relies on that variable to set the nexthdr.

The following patch fixes this by moving this work out to the caller
xfrm6_rcv() where the information is already available.  It also removes
an unnecessary call to ip6_find_1stfragopt() in xfrm6_rcv() since nhoffp
already points to the nexthdr preceding the current header.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@redhat.com>
net/ipv6/ah6.c
net/ipv6/esp6.c
net/ipv6/ipcomp6.c
net/ipv6/xfrm6_input.c

index e57cb8ba76110fce6913ff4c592ebed9a6e5b141..ca1e0fb576acbaa564f78b18742fa4e72aaf0915 100644 (file)
@@ -246,9 +246,7 @@ int ah6_input(struct xfrm_state *x, struct xfrm_decap_state *decap, struct sk_bu
        unsigned char *tmp_hdr = NULL;
        u16 hdr_len;
        u16 ah_hlen;
-       u16 nh_offset = 0;
-       u8 nexthdr = 0;
-       u8 *prevhdr;
+       int nexthdr;
 
        if (!pskb_may_pull(skb, sizeof(struct ip_auth_hdr)))
                goto out;
@@ -301,8 +299,6 @@ int ah6_input(struct xfrm_state *x, struct xfrm_decap_state *decap, struct sk_bu
 
        skb->nh.raw = skb_pull(skb, ah_hlen);
        memcpy(skb->nh.raw, tmp_hdr, hdr_len);
-       prevhdr = (u8*)(skb->nh.raw + nh_offset);
-       *prevhdr = nexthdr;
        skb->nh.ipv6h->payload_len = htons(skb->len - sizeof(struct ipv6hdr));
        skb_pull(skb, hdr_len);
        skb->h.raw = skb->data;
index 8682cf13402a0db06475882de2cd854a1ef3253d..0763c9fc50bb7b1bf1c0375c615571b2a83737ef 100644 (file)
@@ -258,7 +258,6 @@ int esp6_input(struct xfrm_state *x, struct xfrm_decap_state *decap, struct sk_b
                u8 nexthdr[2];
                struct scatterlist *sg = &esp->sgbuf[0];
                u8 padlen;
-               u8 *prevhdr;
 
                if (unlikely(nfrags > ESP_NUM_FAST_SG)) {
                        sg = kmalloc(sizeof(struct scatterlist)*nfrags, GFP_ATOMIC);
@@ -289,8 +288,7 @@ int esp6_input(struct xfrm_state *x, struct xfrm_decap_state *decap, struct sk_b
                skb->nh.raw += sizeof(struct ipv6_esp_hdr) + esp->conf.ivlen;
                memcpy(skb->nh.raw, tmp_hdr, hdr_len);
                skb->nh.ipv6h->payload_len = htons(skb->len - sizeof(struct ipv6hdr));
-               ip6_find_1stfragopt(skb, &prevhdr);
-               ret = *prevhdr = nexthdr[1];
+               ret = nexthdr[1];
        }
 
 out:
index c6307aa54f916f3b0677429e0b649c4b0d334ac1..9f2dfa1607c4d3d5670a8f08616129ce80f2ecac 100644 (file)
@@ -49,7 +49,6 @@ static int ipcomp6_input(struct xfrm_state *x, struct xfrm_decap_state *decap, s
 {
        int err = 0;
        u8 nexthdr = 0;
-       u8 *prevhdr;
        int hdr_len = skb->h.raw - skb->nh.raw;
        unsigned char *tmp_hdr = NULL;
        struct ipv6hdr *iph;
@@ -106,8 +105,6 @@ static int ipcomp6_input(struct xfrm_state *x, struct xfrm_decap_state *decap, s
        iph = skb->nh.ipv6h;
        iph->payload_len = htons(skb->len);
        
-       ip6_find_1stfragopt(skb, &prevhdr);
-       *prevhdr = nexthdr;
 out:
        if (tmp_hdr)
                kfree(tmp_hdr);
index c679a3ce4e165c4861c299052bf52f0cc139467d..0791594f8878ac6e1a326c95f53ea833fd981d1d 100644 (file)
@@ -34,12 +34,11 @@ int xfrm6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
        struct xfrm_state *x;
        int xfrm_nr = 0;
        int decaps = 0;
-       int nexthdr = 0;
-       u8 *prevhdr = NULL;
+       int nexthdr;
+       unsigned int nhoff;
 
-       ip6_find_1stfragopt(skb, &prevhdr);
-       nexthdr = *prevhdr;
-       *nhoffp = prevhdr - skb->nh.raw;
+       nhoff = *nhoffp;
+       nexthdr = skb->nh.raw[nhoff];
 
        if ((err = xfrm_parse_spi(skb, nexthdr, &spi, &seq)) != 0)
                goto drop;
@@ -67,6 +66,8 @@ int xfrm6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
                if (nexthdr <= 0)
                        goto drop_unlock;
 
+               skb->nh.raw[nhoff] = nexthdr;
+
                if (x->props.replay_window)
                        xfrm_replay_advance(x, seq);