diff options
Diffstat (limited to 'net/ipv4/ipcomp.c')
-rw-r--r-- | net/ipv4/ipcomp.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/net/ipv4/ipcomp.c b/net/ipv4/ipcomp.c index 83ed71500898..629067571f02 100644 --- a/net/ipv4/ipcomp.c +++ b/net/ipv4/ipcomp.c | |||
@@ -36,7 +36,7 @@ static void ipcomp4_err(struct sk_buff *skb, u32 info) | |||
36 | return; | 36 | return; |
37 | 37 | ||
38 | spi = htonl(ntohs(ipch->cpi)); | 38 | spi = htonl(ntohs(ipch->cpi)); |
39 | x = xfrm_state_lookup(net, (xfrm_address_t *)&iph->daddr, | 39 | x = xfrm_state_lookup(net, skb->mark, (xfrm_address_t *)&iph->daddr, |
40 | spi, IPPROTO_COMP, AF_INET); | 40 | spi, IPPROTO_COMP, AF_INET); |
41 | if (!x) | 41 | if (!x) |
42 | return; | 42 | return; |
@@ -63,6 +63,7 @@ static struct xfrm_state *ipcomp_tunnel_create(struct xfrm_state *x) | |||
63 | t->props.mode = x->props.mode; | 63 | t->props.mode = x->props.mode; |
64 | t->props.saddr.a4 = x->props.saddr.a4; | 64 | t->props.saddr.a4 = x->props.saddr.a4; |
65 | t->props.flags = x->props.flags; | 65 | t->props.flags = x->props.flags; |
66 | memcpy(&t->mark, &x->mark, sizeof(t->mark)); | ||
66 | 67 | ||
67 | if (xfrm_init_state(t)) | 68 | if (xfrm_init_state(t)) |
68 | goto error; | 69 | goto error; |
@@ -87,8 +88,9 @@ static int ipcomp_tunnel_attach(struct xfrm_state *x) | |||
87 | struct net *net = xs_net(x); | 88 | struct net *net = xs_net(x); |
88 | int err = 0; | 89 | int err = 0; |
89 | struct xfrm_state *t; | 90 | struct xfrm_state *t; |
91 | u32 mark = x->mark.v & x->mark.m; | ||
90 | 92 | ||
91 | t = xfrm_state_lookup(net, (xfrm_address_t *)&x->id.daddr.a4, | 93 | t = xfrm_state_lookup(net, mark, (xfrm_address_t *)&x->id.daddr.a4, |
92 | x->props.saddr.a4, IPPROTO_IPIP, AF_INET); | 94 | x->props.saddr.a4, IPPROTO_IPIP, AF_INET); |
93 | if (!t) { | 95 | if (!t) { |
94 | t = ipcomp_tunnel_create(x); | 96 | t = ipcomp_tunnel_create(x); |