diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-03-05 15:46:18 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-03-05 15:46:18 -0500 |
commit | 3fa04ecd72780da31ba8b329e148179bc24a9c7d (patch) | |
tree | f5d462fd4aee086952d18f159f737c450ab46b3b /net/ipv4/ipcomp.c | |
parent | 180b62a3d837613fcac3ce89576526423926c3c3 (diff) | |
parent | 1cda707d52e51a6cafac0aef12d2bd7052d572e6 (diff) |
Merge branch 'writeback-for-2.6.34' into nfs-for-2.6.34
Diffstat (limited to 'net/ipv4/ipcomp.c')
-rw-r--r-- | net/ipv4/ipcomp.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/net/ipv4/ipcomp.c b/net/ipv4/ipcomp.c index 38fbf04150ae..629067571f02 100644 --- a/net/ipv4/ipcomp.c +++ b/net/ipv4/ipcomp.c | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | static void ipcomp4_err(struct sk_buff *skb, u32 info) | 26 | static void ipcomp4_err(struct sk_buff *skb, u32 info) |
27 | { | 27 | { |
28 | struct net *net = dev_net(skb->dev); | ||
28 | __be32 spi; | 29 | __be32 spi; |
29 | struct iphdr *iph = (struct iphdr *)skb->data; | 30 | struct iphdr *iph = (struct iphdr *)skb->data; |
30 | struct ip_comp_hdr *ipch = (struct ip_comp_hdr *)(skb->data+(iph->ihl<<2)); | 31 | struct ip_comp_hdr *ipch = (struct ip_comp_hdr *)(skb->data+(iph->ihl<<2)); |
@@ -35,7 +36,7 @@ static void ipcomp4_err(struct sk_buff *skb, u32 info) | |||
35 | return; | 36 | return; |
36 | 37 | ||
37 | spi = htonl(ntohs(ipch->cpi)); | 38 | spi = htonl(ntohs(ipch->cpi)); |
38 | x = xfrm_state_lookup(&init_net, (xfrm_address_t *)&iph->daddr, | 39 | x = xfrm_state_lookup(net, skb->mark, (xfrm_address_t *)&iph->daddr, |
39 | spi, IPPROTO_COMP, AF_INET); | 40 | spi, IPPROTO_COMP, AF_INET); |
40 | if (!x) | 41 | if (!x) |
41 | return; | 42 | return; |
@@ -47,9 +48,10 @@ static void ipcomp4_err(struct sk_buff *skb, u32 info) | |||
47 | /* We always hold one tunnel user reference to indicate a tunnel */ | 48 | /* We always hold one tunnel user reference to indicate a tunnel */ |
48 | static struct xfrm_state *ipcomp_tunnel_create(struct xfrm_state *x) | 49 | static struct xfrm_state *ipcomp_tunnel_create(struct xfrm_state *x) |
49 | { | 50 | { |
51 | struct net *net = xs_net(x); | ||
50 | struct xfrm_state *t; | 52 | struct xfrm_state *t; |
51 | 53 | ||
52 | t = xfrm_state_alloc(&init_net); | 54 | t = xfrm_state_alloc(net); |
53 | if (t == NULL) | 55 | if (t == NULL) |
54 | goto out; | 56 | goto out; |
55 | 57 | ||
@@ -61,6 +63,7 @@ static struct xfrm_state *ipcomp_tunnel_create(struct xfrm_state *x) | |||
61 | t->props.mode = x->props.mode; | 63 | t->props.mode = x->props.mode; |
62 | t->props.saddr.a4 = x->props.saddr.a4; | 64 | t->props.saddr.a4 = x->props.saddr.a4; |
63 | t->props.flags = x->props.flags; | 65 | t->props.flags = x->props.flags; |
66 | memcpy(&t->mark, &x->mark, sizeof(t->mark)); | ||
64 | 67 | ||
65 | if (xfrm_init_state(t)) | 68 | if (xfrm_init_state(t)) |
66 | goto error; | 69 | goto error; |
@@ -82,10 +85,12 @@ error: | |||
82 | */ | 85 | */ |
83 | static int ipcomp_tunnel_attach(struct xfrm_state *x) | 86 | static int ipcomp_tunnel_attach(struct xfrm_state *x) |
84 | { | 87 | { |
88 | struct net *net = xs_net(x); | ||
85 | int err = 0; | 89 | int err = 0; |
86 | struct xfrm_state *t; | 90 | struct xfrm_state *t; |
91 | u32 mark = x->mark.v & x->mark.m; | ||
87 | 92 | ||
88 | t = xfrm_state_lookup(&init_net, (xfrm_address_t *)&x->id.daddr.a4, | 93 | t = xfrm_state_lookup(net, mark, (xfrm_address_t *)&x->id.daddr.a4, |
89 | x->props.saddr.a4, IPPROTO_IPIP, AF_INET); | 94 | x->props.saddr.a4, IPPROTO_IPIP, AF_INET); |
90 | if (!t) { | 95 | if (!t) { |
91 | t = ipcomp_tunnel_create(x); | 96 | t = ipcomp_tunnel_create(x); |
@@ -124,16 +129,12 @@ static int ipcomp4_init_state(struct xfrm_state *x) | |||
124 | if (x->props.mode == XFRM_MODE_TUNNEL) { | 129 | if (x->props.mode == XFRM_MODE_TUNNEL) { |
125 | err = ipcomp_tunnel_attach(x); | 130 | err = ipcomp_tunnel_attach(x); |
126 | if (err) | 131 | if (err) |
127 | goto error_tunnel; | 132 | goto out; |
128 | } | 133 | } |
129 | 134 | ||
130 | err = 0; | 135 | err = 0; |
131 | out: | 136 | out: |
132 | return err; | 137 | return err; |
133 | |||
134 | error_tunnel: | ||
135 | ipcomp_destroy(x); | ||
136 | goto out; | ||
137 | } | 138 | } |
138 | 139 | ||
139 | static const struct xfrm_type ipcomp_type = { | 140 | static const struct xfrm_type ipcomp_type = { |