diff options
-rw-r--r-- | net/ipv6/esp6.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index 6eef8a7e35f2..d15da1377149 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c | |||
@@ -421,8 +421,8 @@ static u32 esp6_get_mtu(struct xfrm_state *x, int mtu) | |||
421 | net_adj) & ~(blksize - 1)) + net_adj - 2; | 421 | net_adj) & ~(blksize - 1)) + net_adj - 2; |
422 | } | 422 | } |
423 | 423 | ||
424 | static void esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | 424 | static int esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, |
425 | u8 type, u8 code, int offset, __be32 info) | 425 | u8 type, u8 code, int offset, __be32 info) |
426 | { | 426 | { |
427 | struct net *net = dev_net(skb->dev); | 427 | struct net *net = dev_net(skb->dev); |
428 | const struct ipv6hdr *iph = (const struct ipv6hdr *)skb->data; | 428 | const struct ipv6hdr *iph = (const struct ipv6hdr *)skb->data; |
@@ -431,18 +431,20 @@ static void esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
431 | 431 | ||
432 | if (type != ICMPV6_PKT_TOOBIG && | 432 | if (type != ICMPV6_PKT_TOOBIG && |
433 | type != NDISC_REDIRECT) | 433 | type != NDISC_REDIRECT) |
434 | return; | 434 | return 0; |
435 | 435 | ||
436 | x = xfrm_state_lookup(net, skb->mark, (const xfrm_address_t *)&iph->daddr, | 436 | x = xfrm_state_lookup(net, skb->mark, (const xfrm_address_t *)&iph->daddr, |
437 | esph->spi, IPPROTO_ESP, AF_INET6); | 437 | esph->spi, IPPROTO_ESP, AF_INET6); |
438 | if (!x) | 438 | if (!x) |
439 | return; | 439 | return 0; |
440 | 440 | ||
441 | if (type == NDISC_REDIRECT) | 441 | if (type == NDISC_REDIRECT) |
442 | ip6_redirect(skb, net, skb->dev->ifindex, 0); | 442 | ip6_redirect(skb, net, skb->dev->ifindex, 0); |
443 | else | 443 | else |
444 | ip6_update_pmtu(skb, net, info, 0, 0); | 444 | ip6_update_pmtu(skb, net, info, 0, 0); |
445 | xfrm_state_put(x); | 445 | xfrm_state_put(x); |
446 | |||
447 | return 0; | ||
446 | } | 448 | } |
447 | 449 | ||
448 | static void esp6_destroy(struct xfrm_state *x) | 450 | static void esp6_destroy(struct xfrm_state *x) |
@@ -614,6 +616,11 @@ error: | |||
614 | return err; | 616 | return err; |
615 | } | 617 | } |
616 | 618 | ||
619 | static int esp6_rcv_cb(struct sk_buff *skb, int err) | ||
620 | { | ||
621 | return 0; | ||
622 | } | ||
623 | |||
617 | static const struct xfrm_type esp6_type = | 624 | static const struct xfrm_type esp6_type = |
618 | { | 625 | { |
619 | .description = "ESP6", | 626 | .description = "ESP6", |
@@ -628,10 +635,11 @@ static const struct xfrm_type esp6_type = | |||
628 | .hdr_offset = xfrm6_find_1stfragopt, | 635 | .hdr_offset = xfrm6_find_1stfragopt, |
629 | }; | 636 | }; |
630 | 637 | ||
631 | static const struct inet6_protocol esp6_protocol = { | 638 | static struct xfrm6_protocol esp6_protocol = { |
632 | .handler = xfrm6_rcv, | 639 | .handler = xfrm6_rcv, |
640 | .cb_handler = esp6_rcv_cb, | ||
633 | .err_handler = esp6_err, | 641 | .err_handler = esp6_err, |
634 | .flags = INET6_PROTO_NOPOLICY, | 642 | .priority = 0, |
635 | }; | 643 | }; |
636 | 644 | ||
637 | static int __init esp6_init(void) | 645 | static int __init esp6_init(void) |
@@ -640,7 +648,7 @@ static int __init esp6_init(void) | |||
640 | pr_info("%s: can't add xfrm type\n", __func__); | 648 | pr_info("%s: can't add xfrm type\n", __func__); |
641 | return -EAGAIN; | 649 | return -EAGAIN; |
642 | } | 650 | } |
643 | if (inet6_add_protocol(&esp6_protocol, IPPROTO_ESP) < 0) { | 651 | if (xfrm6_protocol_register(&esp6_protocol, IPPROTO_ESP) < 0) { |
644 | pr_info("%s: can't add protocol\n", __func__); | 652 | pr_info("%s: can't add protocol\n", __func__); |
645 | xfrm_unregister_type(&esp6_type, AF_INET6); | 653 | xfrm_unregister_type(&esp6_type, AF_INET6); |
646 | return -EAGAIN; | 654 | return -EAGAIN; |
@@ -651,7 +659,7 @@ static int __init esp6_init(void) | |||
651 | 659 | ||
652 | static void __exit esp6_fini(void) | 660 | static void __exit esp6_fini(void) |
653 | { | 661 | { |
654 | if (inet6_del_protocol(&esp6_protocol, IPPROTO_ESP) < 0) | 662 | if (xfrm6_protocol_deregister(&esp6_protocol, IPPROTO_ESP) < 0) |
655 | pr_info("%s: can't remove protocol\n", __func__); | 663 | pr_info("%s: can't remove protocol\n", __func__); |
656 | if (xfrm_unregister_type(&esp6_type, AF_INET6) < 0) | 664 | if (xfrm_unregister_type(&esp6_type, AF_INET6) < 0) |
657 | pr_info("%s: can't remove xfrm type\n", __func__); | 665 | pr_info("%s: can't remove xfrm type\n", __func__); |