vserver 2.0 rc7
[linux-2.6.git] / net / ipv4 / ipcomp.c
index 89e320d..1a23c52 100644 (file)
@@ -154,11 +154,9 @@ out:
        return err;
 }
 
-static int ipcomp_output(struct sk_buff *skb)
+static int ipcomp_output(struct xfrm_state *x, struct sk_buff *skb)
 {
        int err;
-       struct dst_entry *dst = skb->dst;
-       struct xfrm_state *x = dst->xfrm;
        struct iphdr *iph;
        struct ip_comp_hdr *ipch;
        struct ipcomp_data *ipcd = x->data;
@@ -169,32 +167,22 @@ static int ipcomp_output(struct sk_buff *skb)
        hdr_len = iph->ihl * 4;
        if ((skb->len - hdr_len) < ipcd->threshold) {
                /* Don't bother compressing */
-               if (x->props.mode) {
-                       ip_send_check(iph);
-               }
                goto out_ok;
        }
 
        if ((skb_is_nonlinear(skb) || skb_cloned(skb)) &&
            skb_linearize(skb, GFP_ATOMIC) != 0) {
-               err = -ENOMEM;
-               goto error;
+               goto out_ok;
        }
        
        err = ipcomp_compress(x, skb);
+       iph = skb->nh.iph;
+
        if (err) {
-               if (err == -EMSGSIZE) {
-                       if (x->props.mode) {
-                               iph = skb->nh.iph;
-                               ip_send_check(iph);
-                       }
-                       goto out_ok;
-               }
-               goto error;
+               goto out_ok;
        }
 
        /* Install ipcomp header, convert into ipcomp datagram. */
-       iph = skb->nh.iph;
        iph->tot_len = htons(skb->len);
        ipch = (struct ip_comp_hdr *)((char *)iph + iph->ihl * 4);
        ipch->nexthdr = iph->protocol;
@@ -202,12 +190,12 @@ static int ipcomp_output(struct sk_buff *skb)
        ipch->cpi = htons((u16 )ntohl(x->id.spi));
        iph->protocol = IPPROTO_COMP;
        ip_send_check(iph);
+       return 0;
 
 out_ok:
-       err = 0;
-
-error:
-       return err;
+       if (x->props.mode)
+               ip_send_check(iph);
+       return 0;
 }
 
 static void ipcomp4_err(struct sk_buff *skb, u32 info)