|
@@ -511,6 +511,7 @@ static int vti6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
|
|
u8 type, u8 code, int offset, __be32 info)
|
|
|
{
|
|
|
__be32 spi;
|
|
|
+ __u32 mark;
|
|
|
struct xfrm_state *x;
|
|
|
struct ip6_tnl *t;
|
|
|
struct ip_esp_hdr *esph;
|
|
@@ -524,6 +525,8 @@ static int vti6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
|
|
if (!t)
|
|
|
return -1;
|
|
|
|
|
|
+ mark = be32_to_cpu(t->parms.o_key);
|
|
|
+
|
|
|
switch (protocol) {
|
|
|
case IPPROTO_ESP:
|
|
|
esph = (struct ip_esp_hdr *)(skb->data + offset);
|
|
@@ -545,7 +548,7 @@ static int vti6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
|
|
type != NDISC_REDIRECT)
|
|
|
return 0;
|
|
|
|
|
|
- x = xfrm_state_lookup(net, skb->mark, (const xfrm_address_t *)&iph->daddr,
|
|
|
+ x = xfrm_state_lookup(net, mark, (const xfrm_address_t *)&iph->daddr,
|
|
|
spi, protocol, AF_INET6);
|
|
|
if (!x)
|
|
|
return 0;
|
|
@@ -1097,7 +1100,6 @@ static int __init vti6_tunnel_init(void)
|
|
|
|
|
|
err = xfrm6_protocol_register(&vti_esp6_protocol, IPPROTO_ESP);
|
|
|
if (err < 0) {
|
|
|
- unregister_pernet_device(&vti6_net_ops);
|
|
|
pr_err("%s: can't register vti6 protocol\n", __func__);
|
|
|
|
|
|
goto out;
|
|
@@ -1106,7 +1108,6 @@ static int __init vti6_tunnel_init(void)
|
|
|
err = xfrm6_protocol_register(&vti_ah6_protocol, IPPROTO_AH);
|
|
|
if (err < 0) {
|
|
|
xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP);
|
|
|
- unregister_pernet_device(&vti6_net_ops);
|
|
|
pr_err("%s: can't register vti6 protocol\n", __func__);
|
|
|
|
|
|
goto out;
|
|
@@ -1116,7 +1117,6 @@ static int __init vti6_tunnel_init(void)
|
|
|
if (err < 0) {
|
|
|
xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH);
|
|
|
xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP);
|
|
|
- unregister_pernet_device(&vti6_net_ops);
|
|
|
pr_err("%s: can't register vti6 protocol\n", __func__);
|
|
|
|
|
|
goto out;
|