aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv6/ip6_vti.c51
1 files changed, 20 insertions, 31 deletions
diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c
index 9aaa6bb229e4..b61b0b1bb7ce 100644
--- a/net/ipv6/ip6_vti.c
+++ b/net/ipv6/ip6_vti.c
@@ -1089,36 +1089,26 @@ static struct xfrm6_protocol vti_ipcomp6_protocol __read_mostly = {
1089 **/ 1089 **/
1090static int __init vti6_tunnel_init(void) 1090static int __init vti6_tunnel_init(void)
1091{ 1091{
1092 int err; 1092 const char *msg;
1093 int err;
1093 1094
1095 msg = "tunnel device";
1094 err = register_pernet_device(&vti6_net_ops); 1096 err = register_pernet_device(&vti6_net_ops);
1095 if (err < 0) 1097 if (err < 0)
1096 goto out_pernet; 1098 goto pernet_dev_failed;
1097 1099
1100 msg = "tunnel protocols";
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 pr_err("%s: can't register vti6 protocol\n", __func__); 1103 goto xfrm_proto_esp_failed;
1101
1102 goto out;
1103 }
1104
1105 err = xfrm6_protocol_register(&vti_ah6_protocol, IPPROTO_AH); 1104 err = xfrm6_protocol_register(&vti_ah6_protocol, IPPROTO_AH);
1106 if (err < 0) { 1105 if (err < 0)
1107 xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP); 1106 goto xfrm_proto_ah_failed;
1108 pr_err("%s: can't register vti6 protocol\n", __func__);
1109
1110 goto out;
1111 }
1112
1113 err = xfrm6_protocol_register(&vti_ipcomp6_protocol, IPPROTO_COMP); 1107 err = xfrm6_protocol_register(&vti_ipcomp6_protocol, IPPROTO_COMP);
1114 if (err < 0) { 1108 if (err < 0)
1115 xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH); 1109 goto xfrm_proto_comp_failed;
1116 xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP);
1117 pr_err("%s: can't register vti6 protocol\n", __func__);
1118
1119 goto out;
1120 }
1121 1110
1111 msg = "netlink interface";
1122 err = rtnl_link_register(&vti6_link_ops); 1112 err = rtnl_link_register(&vti6_link_ops);
1123 if (err < 0) 1113 if (err < 0)
1124 goto rtnl_link_failed; 1114 goto rtnl_link_failed;
@@ -1127,11 +1117,14 @@ static int __init vti6_tunnel_init(void)
1127 1117
1128rtnl_link_failed: 1118rtnl_link_failed:
1129 xfrm6_protocol_deregister(&vti_ipcomp6_protocol, IPPROTO_COMP); 1119 xfrm6_protocol_deregister(&vti_ipcomp6_protocol, IPPROTO_COMP);
1120xfrm_proto_comp_failed:
1130 xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH); 1121 xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH);
1122xfrm_proto_ah_failed:
1131 xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP); 1123 xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP);
1132out: 1124xfrm_proto_esp_failed:
1133 unregister_pernet_device(&vti6_net_ops); 1125 unregister_pernet_device(&vti6_net_ops);
1134out_pernet: 1126pernet_dev_failed:
1127 pr_err("vti6 init: failed to register %s\n", msg);
1135 return err; 1128 return err;
1136} 1129}
1137 1130
@@ -1141,13 +1134,9 @@ out_pernet:
1141static void __exit vti6_tunnel_cleanup(void) 1134static void __exit vti6_tunnel_cleanup(void)
1142{ 1135{
1143 rtnl_link_unregister(&vti6_link_ops); 1136 rtnl_link_unregister(&vti6_link_ops);
1144 if (xfrm6_protocol_deregister(&vti_ipcomp6_protocol, IPPROTO_COMP)) 1137 xfrm6_protocol_deregister(&vti_ipcomp6_protocol, IPPROTO_COMP);
1145 pr_info("%s: can't deregister protocol\n", __func__); 1138 xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH);
1146 if (xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH)) 1139 xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP);
1147 pr_info("%s: can't deregister protocol\n", __func__);
1148 if (xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP))
1149 pr_info("%s: can't deregister protocol\n", __func__);
1150
1151 unregister_pernet_device(&vti6_net_ops); 1140 unregister_pernet_device(&vti6_net_ops);
1152} 1141}
1153 1142