|
@@ -1172,7 +1172,7 @@ static struct device_type geneve_type = {
|
|
|
* supply the listening GENEVE udp ports. Callers are expected
|
|
|
* to implement the ndo_add_geneve_port.
|
|
|
*/
|
|
|
-void geneve_get_rx_port(struct net_device *dev)
|
|
|
+static void geneve_push_rx_ports(struct net_device *dev)
|
|
|
{
|
|
|
struct net *net = dev_net(dev);
|
|
|
struct geneve_net *gn = net_generic(net, geneve_net_id);
|
|
@@ -1181,6 +1181,9 @@ void geneve_get_rx_port(struct net_device *dev)
|
|
|
struct sock *sk;
|
|
|
__be16 port;
|
|
|
|
|
|
+ if (!dev->netdev_ops->ndo_add_geneve_port)
|
|
|
+ return;
|
|
|
+
|
|
|
rcu_read_lock();
|
|
|
list_for_each_entry_rcu(gs, &gn->sock_list, list) {
|
|
|
sk = gs->sock->sk;
|
|
@@ -1190,7 +1193,6 @@ void geneve_get_rx_port(struct net_device *dev)
|
|
|
}
|
|
|
rcu_read_unlock();
|
|
|
}
|
|
|
-EXPORT_SYMBOL_GPL(geneve_get_rx_port);
|
|
|
|
|
|
/* Initialize the device structure. */
|
|
|
static void geneve_setup(struct net_device *dev)
|
|
@@ -1538,6 +1540,21 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(geneve_dev_create_fb);
|
|
|
|
|
|
+static int geneve_netdevice_event(struct notifier_block *unused,
|
|
|
+ unsigned long event, void *ptr)
|
|
|
+{
|
|
|
+ struct net_device *dev = netdev_notifier_info_to_dev(ptr);
|
|
|
+
|
|
|
+ if (event == NETDEV_OFFLOAD_PUSH_GENEVE)
|
|
|
+ geneve_push_rx_ports(dev);
|
|
|
+
|
|
|
+ return NOTIFY_DONE;
|
|
|
+}
|
|
|
+
|
|
|
+static struct notifier_block geneve_notifier_block __read_mostly = {
|
|
|
+ .notifier_call = geneve_netdevice_event,
|
|
|
+};
|
|
|
+
|
|
|
static __net_init int geneve_init_net(struct net *net)
|
|
|
{
|
|
|
struct geneve_net *gn = net_generic(net, geneve_net_id);
|
|
@@ -1590,11 +1607,18 @@ static int __init geneve_init_module(void)
|
|
|
if (rc)
|
|
|
goto out1;
|
|
|
|
|
|
- rc = rtnl_link_register(&geneve_link_ops);
|
|
|
+ rc = register_netdevice_notifier(&geneve_notifier_block);
|
|
|
if (rc)
|
|
|
goto out2;
|
|
|
|
|
|
+ rc = rtnl_link_register(&geneve_link_ops);
|
|
|
+ if (rc)
|
|
|
+ goto out3;
|
|
|
+
|
|
|
return 0;
|
|
|
+
|
|
|
+out3:
|
|
|
+ unregister_netdevice_notifier(&geneve_notifier_block);
|
|
|
out2:
|
|
|
unregister_pernet_subsys(&geneve_net_ops);
|
|
|
out1:
|
|
@@ -1605,6 +1629,7 @@ late_initcall(geneve_init_module);
|
|
|
static void __exit geneve_cleanup_module(void)
|
|
|
{
|
|
|
rtnl_link_unregister(&geneve_link_ops);
|
|
|
+ unregister_netdevice_notifier(&geneve_notifier_block);
|
|
|
unregister_pernet_subsys(&geneve_net_ops);
|
|
|
}
|
|
|
module_exit(geneve_cleanup_module);
|