|
|
@@ -584,33 +584,6 @@ static struct rtnl_link_ops vti_link_ops __read_mostly = {
|
|
|
.get_link_net = ip_tunnel_get_link_net,
|
|
|
};
|
|
|
|
|
|
-static bool is_vti_tunnel(const struct net_device *dev)
|
|
|
-{
|
|
|
- return dev->netdev_ops == &vti_netdev_ops;
|
|
|
-}
|
|
|
-
|
|
|
-static int vti_device_event(struct notifier_block *unused,
|
|
|
- unsigned long event, void *ptr)
|
|
|
-{
|
|
|
- struct net_device *dev = netdev_notifier_info_to_dev(ptr);
|
|
|
- struct ip_tunnel *tunnel = netdev_priv(dev);
|
|
|
-
|
|
|
- if (!is_vti_tunnel(dev))
|
|
|
- return NOTIFY_DONE;
|
|
|
-
|
|
|
- switch (event) {
|
|
|
- case NETDEV_DOWN:
|
|
|
- if (!net_eq(tunnel->net, dev_net(dev)))
|
|
|
- xfrm_garbage_collect(tunnel->net);
|
|
|
- break;
|
|
|
- }
|
|
|
- return NOTIFY_DONE;
|
|
|
-}
|
|
|
-
|
|
|
-static struct notifier_block vti_notifier_block __read_mostly = {
|
|
|
- .notifier_call = vti_device_event,
|
|
|
-};
|
|
|
-
|
|
|
static int __init vti_init(void)
|
|
|
{
|
|
|
const char *msg;
|
|
|
@@ -618,8 +591,6 @@ static int __init vti_init(void)
|
|
|
|
|
|
pr_info("IPv4 over IPsec tunneling driver\n");
|
|
|
|
|
|
- register_netdevice_notifier(&vti_notifier_block);
|
|
|
-
|
|
|
msg = "tunnel device";
|
|
|
err = register_pernet_device(&vti_net_ops);
|
|
|
if (err < 0)
|
|
|
@@ -652,7 +623,6 @@ xfrm_proto_ah_failed:
|
|
|
xfrm_proto_esp_failed:
|
|
|
unregister_pernet_device(&vti_net_ops);
|
|
|
pernet_dev_failed:
|
|
|
- unregister_netdevice_notifier(&vti_notifier_block);
|
|
|
pr_err("vti init: failed to register %s\n", msg);
|
|
|
return err;
|
|
|
}
|
|
|
@@ -664,7 +634,6 @@ static void __exit vti_fini(void)
|
|
|
xfrm4_protocol_deregister(&vti_ah4_protocol, IPPROTO_AH);
|
|
|
xfrm4_protocol_deregister(&vti_esp4_protocol, IPPROTO_ESP);
|
|
|
unregister_pernet_device(&vti_net_ops);
|
|
|
- unregister_netdevice_notifier(&vti_notifier_block);
|
|
|
}
|
|
|
|
|
|
module_init(vti_init);
|