X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fipv4%2Fxfrm4_output.c;h=32ad229b4fedaf051746f6facb2936a2abd73af3;hb=987b0145d94eecf292d8b301228356f44611ab7c;hp=ecc4119dfecb363c43a4a622ff69cb2e13299412;hpb=f7ed79d23a47594e7834d66a8f14449796d4f3e6;p=linux-2.6.git diff --git a/net/ipv4/xfrm4_output.c b/net/ipv4/xfrm4_output.c index ecc4119df..32ad229b4 100644 --- a/net/ipv4/xfrm4_output.c +++ b/net/ipv4/xfrm4_output.c @@ -9,8 +9,6 @@ */ #include -#include -#include #include #include #include @@ -19,8 +17,6 @@ #include #include -extern int skb_checksum_setup(struct sk_buff *skb); - /* Add encapsulation header. * * In transport mode, the IP header will be moved forward to make space @@ -66,7 +62,7 @@ static void xfrm4_encap(struct sk_buff *skb) top_iph->frag_off = (flags & XFRM_STATE_NOPMTUDISC) ? 0 : (iph->frag_off & htons(IP_DF)); if (!top_iph->frag_off) - __ip_select_ident(top_iph, dst->child, 0); + __ip_select_ident(top_iph, dst, 0); top_iph->ttl = dst_metric(dst->child, RTAX_HOPLIMIT); @@ -107,10 +103,6 @@ static int xfrm4_output_one(struct sk_buff *skb) struct xfrm_state *x = dst->xfrm; int err; - err = skb_checksum_setup(skb); - if (err) - goto error_nolock; - if (skb->ip_summed == CHECKSUM_HW) { err = skb_checksum_help(skb, 0); if (err) @@ -160,10 +152,16 @@ error_nolock: goto out_exit; } -static int xfrm4_output_finish2(struct sk_buff *skb) +static int xfrm4_output_finish(struct sk_buff *skb) { int err; +#ifdef CONFIG_NETFILTER + if (!skb->dst->xfrm) { + IPCB(skb)->flags |= IPSKB_REROUTED; + return dst_output(skb); + } +#endif while (likely((err = xfrm4_output_one(skb)) == 0)) { nf_reset(skb); @@ -176,7 +174,7 @@ static int xfrm4_output_finish2(struct sk_buff *skb) return dst_output(skb); err = nf_hook(PF_INET, NF_IP_POST_ROUTING, &skb, NULL, - skb->dst->dev, xfrm4_output_finish2); + skb->dst->dev, xfrm4_output_finish); if (unlikely(err != 1)) break; } @@ -184,48 +182,6 @@ static int xfrm4_output_finish2(struct sk_buff *skb) return err; } -static int xfrm4_output_finish(struct sk_buff *skb) -{ - struct sk_buff *segs; - -#ifdef CONFIG_NETFILTER - if (!skb->dst->xfrm) { - IPCB(skb)->flags |= IPSKB_REROUTED; - return dst_output(skb); - } -#endif - - if (!skb_is_gso(skb)) - return xfrm4_output_finish2(skb); - - skb->protocol = htons(ETH_P_IP); - segs = skb_gso_segment(skb, 0); - kfree_skb(skb); - if (unlikely(IS_ERR(segs))) - return PTR_ERR(segs); - - do { - struct sk_buff *nskb = segs->next; - int err; - - segs->next = NULL; - err = xfrm4_output_finish2(segs); - - if (unlikely(err)) { - while ((segs = nskb)) { - nskb = segs->next; - segs->next = NULL; - kfree_skb(segs); - } - return err; - } - - segs = nskb; - } while (segs); - - return 0; -} - int xfrm4_output(struct sk_buff *skb) { return NF_HOOK_COND(PF_INET, NF_IP_POST_ROUTING, skb, NULL, skb->dst->dev,