aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv4/ip_vti.c54
1 files changed, 21 insertions, 33 deletions
diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c
index b8960f3527f3..e453cb724a95 100644
--- a/net/ipv4/ip_vti.c
+++ b/net/ipv4/ip_vti.c
@@ -534,40 +534,28 @@ static struct rtnl_link_ops vti_link_ops __read_mostly = {
534 534
535static int __init vti_init(void) 535static int __init vti_init(void)
536{ 536{
537 const char *msg;
537 int err; 538 int err;
538 539
539 pr_info("IPv4 over IPSec tunneling driver\n"); 540 pr_info("IPv4 over IPsec tunneling driver\n");
540 541
542 msg = "tunnel device";
541 err = register_pernet_device(&vti_net_ops); 543 err = register_pernet_device(&vti_net_ops);
542 if (err < 0) 544 if (err < 0)
543 return err; 545 goto pernet_dev_failed;
544 err = xfrm4_protocol_register(&vti_esp4_protocol, IPPROTO_ESP);
545 if (err < 0) {
546 unregister_pernet_device(&vti_net_ops);
547 pr_info("vti init: can't register tunnel\n");
548
549 return err;
550 }
551 546
547 msg = "tunnel protocols";
548 err = xfrm4_protocol_register(&vti_esp4_protocol, IPPROTO_ESP);
549 if (err < 0)
550 goto xfrm_proto_esp_failed;
552 err = xfrm4_protocol_register(&vti_ah4_protocol, IPPROTO_AH); 551 err = xfrm4_protocol_register(&vti_ah4_protocol, IPPROTO_AH);
553 if (err < 0) { 552 if (err < 0)
554 xfrm4_protocol_deregister(&vti_esp4_protocol, IPPROTO_ESP); 553 goto xfrm_proto_ah_failed;
555 unregister_pernet_device(&vti_net_ops);
556 pr_info("vti init: can't register tunnel\n");
557
558 return err;
559 }
560
561 err = xfrm4_protocol_register(&vti_ipcomp4_protocol, IPPROTO_COMP); 554 err = xfrm4_protocol_register(&vti_ipcomp4_protocol, IPPROTO_COMP);
562 if (err < 0) { 555 if (err < 0)
563 xfrm4_protocol_deregister(&vti_ah4_protocol, IPPROTO_AH); 556 goto xfrm_proto_comp_failed;
564 xfrm4_protocol_deregister(&vti_esp4_protocol, IPPROTO_ESP);
565 unregister_pernet_device(&vti_net_ops);
566 pr_info("vti init: can't register tunnel\n");
567
568 return err;
569 }
570 557
558 msg = "netlink interface";
571 err = rtnl_link_register(&vti_link_ops); 559 err = rtnl_link_register(&vti_link_ops);
572 if (err < 0) 560 if (err < 0)
573 goto rtnl_link_failed; 561 goto rtnl_link_failed;
@@ -576,23 +564,23 @@ static int __init vti_init(void)
576 564
577rtnl_link_failed: 565rtnl_link_failed:
578 xfrm4_protocol_deregister(&vti_ipcomp4_protocol, IPPROTO_COMP); 566 xfrm4_protocol_deregister(&vti_ipcomp4_protocol, IPPROTO_COMP);
567xfrm_proto_comp_failed:
579 xfrm4_protocol_deregister(&vti_ah4_protocol, IPPROTO_AH); 568 xfrm4_protocol_deregister(&vti_ah4_protocol, IPPROTO_AH);
569xfrm_proto_ah_failed:
580 xfrm4_protocol_deregister(&vti_esp4_protocol, IPPROTO_ESP); 570 xfrm4_protocol_deregister(&vti_esp4_protocol, IPPROTO_ESP);
571xfrm_proto_esp_failed:
581 unregister_pernet_device(&vti_net_ops); 572 unregister_pernet_device(&vti_net_ops);
573pernet_dev_failed:
574 pr_err("vti init: failed to register %s\n", msg);
582 return err; 575 return err;
583} 576}
584 577
585static void __exit vti_fini(void) 578static void __exit vti_fini(void)
586{ 579{
587 rtnl_link_unregister(&vti_link_ops); 580 rtnl_link_unregister(&vti_link_ops);
588 if (xfrm4_protocol_deregister(&vti_ipcomp4_protocol, IPPROTO_COMP)) 581 xfrm4_protocol_deregister(&vti_ipcomp4_protocol, IPPROTO_COMP);
589 pr_info("vti close: can't deregister tunnel\n"); 582 xfrm4_protocol_deregister(&vti_ah4_protocol, IPPROTO_AH);
590 if (xfrm4_protocol_deregister(&vti_ah4_protocol, IPPROTO_AH)) 583 xfrm4_protocol_deregister(&vti_esp4_protocol, IPPROTO_ESP);
591 pr_info("vti close: can't deregister tunnel\n");
592 if (xfrm4_protocol_deregister(&vti_esp4_protocol, IPPROTO_ESP))
593 pr_info("vti close: can't deregister tunnel\n");
594
595
596 unregister_pernet_device(&vti_net_ops); 584 unregister_pernet_device(&vti_net_ops);
597} 585}
598 586