linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / net / ipv6 / ipcomp6.c
index f3093f2..d511a88 100644 (file)
@@ -47,6 +47,7 @@
 #include <linux/rtnetlink.h>
 #include <net/icmp.h>
 #include <net/ipv6.h>
+#include <net/protocol.h>
 #include <linux/ipv6.h>
 #include <linux/icmpv6.h>
 
@@ -130,8 +131,7 @@ static int ipcomp6_input(struct xfrm_state *x, struct xfrm_decap_state *decap, s
 out_put_cpu:
        put_cpu();
 out:
-       if (tmp_hdr)
-               kfree(tmp_hdr);
+       kfree(tmp_hdr);
        if (err)
                goto error_out;
        return nexthdr;
@@ -139,11 +139,9 @@ error_out:
        return err;
 }
 
-static int ipcomp6_output(struct sk_buff *skb)
+static int ipcomp6_output(struct xfrm_state *x, struct sk_buff *skb)
 {
        int err;
-       struct dst_entry *dst = skb->dst;
-       struct xfrm_state *x = dst->xfrm;
        struct ipv6hdr *top_iph;
        int hdr_len;
        struct ipv6_comp_hdr *ipch;
@@ -162,8 +160,7 @@ static int ipcomp6_output(struct sk_buff *skb)
 
        if ((skb_is_nonlinear(skb) || skb_cloned(skb)) &&
                skb_linearize(skb, GFP_ATOMIC) != 0) {
-               err = -ENOMEM;
-               goto error;
+               goto out_ok;
        }
 
        /* compression */
@@ -176,11 +173,7 @@ static int ipcomp6_output(struct sk_buff *skb)
        tfm = *per_cpu_ptr(ipcd->tfms, cpu);
 
        err = crypto_comp_compress(tfm, start, plen, scratch, &dlen);
-       if (err) {
-               put_cpu();
-               goto error;
-       }
-       if ((dlen + sizeof(struct ipv6_comp_hdr)) >= plen) {
+       if (err || (dlen + sizeof(struct ipv6_comp_hdr)) >= plen) {
                put_cpu();
                goto out_ok;
        }
@@ -200,10 +193,7 @@ static int ipcomp6_output(struct sk_buff *skb)
        *skb->nh.raw = IPPROTO_COMP;
 
 out_ok:
-       err = 0;
-
-error:
-       return err;
+       return 0;
 }
 
 static void ipcomp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
@@ -222,8 +212,7 @@ static void ipcomp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
        if (!x)
                return;
 
-       printk(KERN_DEBUG "pmtu discovery on SA IPCOMP/%08x/"
-                       "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n",
+       printk(KERN_DEBUG "pmtu discovery on SA IPCOMP/%08x/" NIP6_FMT "\n",
                        spi, NIP6(iph->daddr));
        xfrm_state_put(x);
 }
@@ -244,14 +233,9 @@ static struct xfrm_state *ipcomp6_tunnel_create(struct xfrm_state *x)
        t->props.mode = 1;
        memcpy(t->props.saddr.a6, x->props.saddr.a6, sizeof(struct in6_addr));
 
-       t->type = xfrm_get_type(IPPROTO_IPV6, t->props.family);
-       if (t->type == NULL)
-               goto error;
-
-       if (t->type->init_state(t, NULL))
+       if (xfrm_init_state(t))
                goto error;
 
-       t->km.state = XFRM_STATE_VALID;
        atomic_set(&t->tunnel_users, 1);
 
 out:
@@ -356,8 +340,7 @@ static void ipcomp6_free_tfms(struct crypto_tfm **tfms)
 
        for_each_cpu(cpu) {
                struct crypto_tfm *tfm = *per_cpu_ptr(tfms, cpu);
-               if (tfm)
-                       crypto_free_tfm(tfm);
+               crypto_free_tfm(tfm);
        }
        free_percpu(tfms);
 }
@@ -369,7 +352,7 @@ static struct crypto_tfm **ipcomp6_alloc_tfms(const char *alg_name)
        int cpu;
 
        /* This can be any valid CPU ID so we don't need locking. */
-       cpu = smp_processor_id();
+       cpu = raw_smp_processor_id();
 
        list_for_each_entry(pos, &ipcomp6_tfms_list, list) {
                struct crypto_tfm *tfm;
@@ -430,7 +413,7 @@ static void ipcomp6_destroy(struct xfrm_state *x)
        xfrm6_tunnel_free_spi((xfrm_address_t *)&x->props.saddr);
 }
 
-static int ipcomp6_init_state(struct xfrm_state *x, void *args)
+static int ipcomp6_init_state(struct xfrm_state *x)
 {
        int err;
        struct ipcomp_data *ipcd;
@@ -468,7 +451,7 @@ static int ipcomp6_init_state(struct xfrm_state *x, void *args)
                        goto error_tunnel;
        }
 
-       calg_desc = xfrm_calg_get_byname(x->calg->alg_name);
+       calg_desc = xfrm_calg_get_byname(x->calg->alg_name, 0);
        BUG_ON(!calg_desc);
        ipcd->threshold = calg_desc->uinfo.comp.threshold;
        x->data = ipcd;