geneve/vxlan: add support for NETDEV_UDP_TUNNEL_DROP_INFO
authorSabrina Dubroca <sd@queasysnail.net>
Fri, 21 Jul 2017 10:49:32 +0000 (12:49 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 Jul 2017 20:52:59 +0000 (13:52 -0700)
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/geneve.c
drivers/net/vxlan.c

index 0436a4283059a8fb6eaa622773e2f877461177b9..74545ecb94318e7621f8ff7bbe649d68c88d4018 100644 (file)
@@ -1016,16 +1016,22 @@ static struct device_type geneve_type = {
  * supply the listening GENEVE udp ports. Callers are expected
  * to implement the ndo_udp_tunnel_add.
  */
-static void geneve_push_rx_ports(struct net_device *dev)
+static void geneve_offload_rx_ports(struct net_device *dev, bool push)
 {
        struct net *net = dev_net(dev);
        struct geneve_net *gn = net_generic(net, geneve_net_id);
        struct geneve_sock *gs;
 
        rcu_read_lock();
-       list_for_each_entry_rcu(gs, &gn->sock_list, list)
-               udp_tunnel_push_rx_port(dev, gs->sock,
-                                       UDP_TUNNEL_TYPE_GENEVE);
+       list_for_each_entry_rcu(gs, &gn->sock_list, list) {
+               if (push) {
+                       udp_tunnel_push_rx_port(dev, gs->sock,
+                                               UDP_TUNNEL_TYPE_GENEVE);
+               } else {
+                       udp_tunnel_drop_rx_port(dev, gs->sock,
+                                               UDP_TUNNEL_TYPE_GENEVE);
+               }
+       }
        rcu_read_unlock();
 }
 
@@ -1560,8 +1566,9 @@ static int geneve_netdevice_event(struct notifier_block *unused,
 {
        struct net_device *dev = netdev_notifier_info_to_dev(ptr);
 
-       if (event == NETDEV_UDP_TUNNEL_PUSH_INFO)
-               geneve_push_rx_ports(dev);
+       if (event == NETDEV_UDP_TUNNEL_PUSH_INFO ||
+           event == NETDEV_UDP_TUNNEL_DROP_INFO)
+               geneve_offload_rx_ports(dev, event == NETDEV_UDP_TUNNEL_PUSH_INFO);
 
        return NOTIFY_DONE;
 }
index 96aa7e6cf214cc332eba6d54fcd626bee917c633..4642d5be2fa00a434f1444b58d0d00af7dff5a06 100644 (file)
@@ -2608,7 +2608,7 @@ static struct device_type vxlan_type = {
  * supply the listening VXLAN udp ports. Callers are expected
  * to implement the ndo_udp_tunnel_add.
  */
-static void vxlan_push_rx_ports(struct net_device *dev)
+static void vxlan_offload_rx_ports(struct net_device *dev, bool push)
 {
        struct vxlan_sock *vs;
        struct net *net = dev_net(dev);
@@ -2617,11 +2617,19 @@ static void vxlan_push_rx_ports(struct net_device *dev)
 
        spin_lock(&vn->sock_lock);
        for (i = 0; i < PORT_HASH_SIZE; ++i) {
-               hlist_for_each_entry_rcu(vs, &vn->sock_list[i], hlist)
-                       udp_tunnel_push_rx_port(dev, vs->sock,
-                                               (vs->flags & VXLAN_F_GPE) ?
-                                               UDP_TUNNEL_TYPE_VXLAN_GPE :
-                                               UDP_TUNNEL_TYPE_VXLAN);
+               hlist_for_each_entry_rcu(vs, &vn->sock_list[i], hlist) {
+                       unsigned short type;
+
+                       if (vs->flags & VXLAN_F_GPE)
+                               type = UDP_TUNNEL_TYPE_VXLAN_GPE;
+                       else
+                               type = UDP_TUNNEL_TYPE_VXLAN;
+
+                       if (push)
+                               udp_tunnel_push_rx_port(dev, vs->sock, type);
+                       else
+                               udp_tunnel_drop_rx_port(dev, vs->sock, type);
+               }
        }
        spin_unlock(&vn->sock_lock);
 }
@@ -3632,8 +3640,9 @@ static int vxlan_netdevice_event(struct notifier_block *unused,
 
        if (event == NETDEV_UNREGISTER)
                vxlan_handle_lowerdev_unregister(vn, dev);
-       else if (event == NETDEV_UDP_TUNNEL_PUSH_INFO)
-               vxlan_push_rx_ports(dev);
+       else if (event == NETDEV_UDP_TUNNEL_PUSH_INFO ||
+                event == NETDEV_UDP_TUNNEL_DROP_INFO)
+               vxlan_offload_rx_ports(dev, event == NETDEV_UDP_TUNNEL_PUSH_INFO);
 
        return NOTIFY_DONE;
 }