net: check UDP tunnel RX port offload feature before calling tunnel ndo ndo
authorSabrina Dubroca <sd@queasysnail.net>
Fri, 21 Jul 2017 10:49:29 +0000 (12:49 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 Jul 2017 20:52:59 +0000 (13:52 -0700)
If NETIF_F_RX_UDP_TUNNEL_PORT was disabled on a given netdevice, skip
the tunnel offload ndo call during tunnel port creation and deletion.

Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/udp_tunnel.c

index 58bd39fb14b452f27fcac7702f1ab6fb2293efce..0d3f14cdc524dabaff72597e7038eafe9ac7669c 100644 (file)
@@ -82,7 +82,8 @@ void udp_tunnel_push_rx_port(struct net_device *dev, struct socket *sock,
        struct sock *sk = sock->sk;
        struct udp_tunnel_info ti;
 
-       if (!dev->netdev_ops->ndo_udp_tunnel_add)
+       if (!dev->netdev_ops->ndo_udp_tunnel_add ||
+           !(dev->features & NETIF_F_RX_UDP_TUNNEL_PORT))
                return;
 
        ti.type = type;
@@ -109,6 +110,8 @@ void udp_tunnel_notify_add_rx_port(struct socket *sock, unsigned short type)
        for_each_netdev_rcu(net, dev) {
                if (!dev->netdev_ops->ndo_udp_tunnel_add)
                        continue;
+               if (!(dev->features & NETIF_F_RX_UDP_TUNNEL_PORT))
+                       continue;
                dev->netdev_ops->ndo_udp_tunnel_add(dev, &ti);
        }
        rcu_read_unlock();
@@ -131,6 +134,8 @@ void udp_tunnel_notify_del_rx_port(struct socket *sock, unsigned short type)
        for_each_netdev_rcu(net, dev) {
                if (!dev->netdev_ops->ndo_udp_tunnel_del)
                        continue;
+               if (!(dev->features & NETIF_F_RX_UDP_TUNNEL_PORT))
+                       continue;
                dev->netdev_ops->ndo_udp_tunnel_del(dev, &ti);
        }
        rcu_read_unlock();