]> err.no Git - linux-2.6/blobdiff - net/ipv6/mip6.c
Pull cpuidle into release branch
[linux-2.6] / net / ipv6 / mip6.c
index 7261c29898cb27c867d42eef0390cb9513d8eb60..7fd841d410190382fe5ea1c4b31df9ebada0f07f 100644 (file)
@@ -153,8 +153,8 @@ static int mip6_destopt_output(struct xfrm_state *x, struct sk_buff *skb)
        u8 nexthdr;
        int len;
 
+       skb_push(skb, -skb_network_offset(skb));
        iph = ipv6_hdr(skb);
-       iph->payload_len = htons(skb->len - sizeof(*iph));
 
        nexthdr = *skb_mac_header(skb);
        *skb_mac_header(skb) = IPPROTO_DSTOPTS;
@@ -172,7 +172,9 @@ static int mip6_destopt_output(struct xfrm_state *x, struct sk_buff *skb)
        len = ((char *)hao - (char *)dstopt) + sizeof(*hao);
 
        memcpy(&hao->addr, &iph->saddr, sizeof(hao->addr));
+       spin_lock_bh(&x->lock);
        memcpy(&iph->saddr, x->coaddr, sizeof(iph->saddr));
+       spin_unlock_bh(&x->lock);
 
        BUG_TRAP(len == x->props.header_len);
        dstopt->hdrlen = (x->props.header_len >> 3) - 1;
@@ -365,8 +367,8 @@ static int mip6_rthdr_output(struct xfrm_state *x, struct sk_buff *skb)
        struct rt2_hdr *rt2;
        u8 nexthdr;
 
+       skb_push(skb, -skb_network_offset(skb));
        iph = ipv6_hdr(skb);
-       iph->payload_len = htons(skb->len - sizeof(*iph));
 
        nexthdr = *skb_mac_header(skb);
        *skb_mac_header(skb) = IPPROTO_ROUTING;
@@ -381,7 +383,9 @@ static int mip6_rthdr_output(struct xfrm_state *x, struct sk_buff *skb)
        BUG_TRAP(rt2->rt_hdr.hdrlen == 2);
 
        memcpy(&rt2->addr, &iph->daddr, sizeof(rt2->addr));
+       spin_lock_bh(&x->lock);
        memcpy(&iph->daddr, x->coaddr, sizeof(iph->daddr));
+       spin_unlock_bh(&x->lock);
 
        return 0;
 }