diff options
Diffstat (limited to 'net/ipv6/ip6_vti.c')
| -rw-r--r-- | net/ipv6/ip6_vti.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c index b7c0f827140b..6cc9f9371cc5 100644 --- a/net/ipv6/ip6_vti.c +++ b/net/ipv6/ip6_vti.c | |||
| @@ -511,6 +511,7 @@ static int vti6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
| 511 | u8 type, u8 code, int offset, __be32 info) | 511 | u8 type, u8 code, int offset, __be32 info) |
| 512 | { | 512 | { |
| 513 | __be32 spi; | 513 | __be32 spi; |
| 514 | __u32 mark; | ||
| 514 | struct xfrm_state *x; | 515 | struct xfrm_state *x; |
| 515 | struct ip6_tnl *t; | 516 | struct ip6_tnl *t; |
| 516 | struct ip_esp_hdr *esph; | 517 | struct ip_esp_hdr *esph; |
| @@ -524,6 +525,8 @@ static int vti6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
| 524 | if (!t) | 525 | if (!t) |
| 525 | return -1; | 526 | return -1; |
| 526 | 527 | ||
| 528 | mark = be32_to_cpu(t->parms.o_key); | ||
| 529 | |||
| 527 | switch (protocol) { | 530 | switch (protocol) { |
| 528 | case IPPROTO_ESP: | 531 | case IPPROTO_ESP: |
| 529 | esph = (struct ip_esp_hdr *)(skb->data + offset); | 532 | 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, | |||
| 545 | type != NDISC_REDIRECT) | 548 | type != NDISC_REDIRECT) |
| 546 | return 0; | 549 | return 0; |
| 547 | 550 | ||
| 548 | x = xfrm_state_lookup(net, skb->mark, (const xfrm_address_t *)&iph->daddr, | 551 | x = xfrm_state_lookup(net, mark, (const xfrm_address_t *)&iph->daddr, |
| 549 | spi, protocol, AF_INET6); | 552 | spi, protocol, AF_INET6); |
| 550 | if (!x) | 553 | if (!x) |
| 551 | return 0; | 554 | return 0; |
| @@ -1097,7 +1100,6 @@ static int __init vti6_tunnel_init(void) | |||
| 1097 | 1100 | ||
| 1098 | err = xfrm6_protocol_register(&vti_esp6_protocol, IPPROTO_ESP); | 1101 | err = xfrm6_protocol_register(&vti_esp6_protocol, IPPROTO_ESP); |
| 1099 | if (err < 0) { | 1102 | if (err < 0) { |
| 1100 | unregister_pernet_device(&vti6_net_ops); | ||
| 1101 | pr_err("%s: can't register vti6 protocol\n", __func__); | 1103 | pr_err("%s: can't register vti6 protocol\n", __func__); |
| 1102 | 1104 | ||
| 1103 | goto out; | 1105 | goto out; |
| @@ -1106,7 +1108,6 @@ static int __init vti6_tunnel_init(void) | |||
| 1106 | err = xfrm6_protocol_register(&vti_ah6_protocol, IPPROTO_AH); | 1108 | err = xfrm6_protocol_register(&vti_ah6_protocol, IPPROTO_AH); |
| 1107 | if (err < 0) { | 1109 | if (err < 0) { |
| 1108 | xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP); | 1110 | xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP); |
| 1109 | unregister_pernet_device(&vti6_net_ops); | ||
| 1110 | pr_err("%s: can't register vti6 protocol\n", __func__); | 1111 | pr_err("%s: can't register vti6 protocol\n", __func__); |
| 1111 | 1112 | ||
| 1112 | goto out; | 1113 | goto out; |
| @@ -1116,7 +1117,6 @@ static int __init vti6_tunnel_init(void) | |||
| 1116 | if (err < 0) { | 1117 | if (err < 0) { |
| 1117 | xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH); | 1118 | xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH); |
| 1118 | xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP); | 1119 | xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP); |
| 1119 | unregister_pernet_device(&vti6_net_ops); | ||
| 1120 | pr_err("%s: can't register vti6 protocol\n", __func__); | 1120 | pr_err("%s: can't register vti6 protocol\n", __func__); |
| 1121 | 1121 | ||
| 1122 | goto out; | 1122 | goto out; |
