net: add infrastructure to un-offload UDP tunnel port
authorSabrina Dubroca <sd@queasysnail.net>
Fri, 21 Jul 2017 10:49:30 +0000 (12:49 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 Jul 2017 20:52:59 +0000 (13:52 -0700)
This adds a new NETDEV_UDP_TUNNEL_DROP_INFO event, similar to
NETDEV_UDP_TUNNEL_PUSH_INFO, to signal to un-offload ports.

This also adds udp_tunnel_drop_rx_port(), which calls
ndo_udp_tunnel_del.

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

index 614642eb7eb7ae98a6a65b8ffe54bf1c07360438..3a3cdc1b1f319421dde87d8c246d16e6ced5fd46 100644 (file)
@@ -2317,6 +2317,7 @@ struct netdev_lag_lower_state_info {
 #define NETDEV_PRECHANGEUPPER  0x001A
 #define NETDEV_CHANGELOWERSTATE        0x001B
 #define NETDEV_UDP_TUNNEL_PUSH_INFO    0x001C
+#define NETDEV_UDP_TUNNEL_DROP_INFO    0x001D
 #define NETDEV_CHANGE_TX_QUEUE_LEN     0x001E
 
 int register_netdevice_notifier(struct notifier_block *nb);
index 02c5be0374517da8d6912e2a727606a0e2b8b27d..10cce0dd4450353410e55d2b96ffeab6921b1759 100644 (file)
@@ -115,6 +115,8 @@ struct udp_tunnel_info {
 /* Notify network devices of offloadable types */
 void udp_tunnel_push_rx_port(struct net_device *dev, struct socket *sock,
                             unsigned short type);
+void udp_tunnel_drop_rx_port(struct net_device *dev, struct socket *sock,
+                            unsigned short type);
 void udp_tunnel_notify_add_rx_port(struct socket *sock, unsigned short type);
 void udp_tunnel_notify_del_rx_port(struct socket *sock, unsigned short type);
 
@@ -124,6 +126,12 @@ static inline void udp_tunnel_get_rx_info(struct net_device *dev)
        call_netdevice_notifiers(NETDEV_UDP_TUNNEL_PUSH_INFO, dev);
 }
 
+static inline void udp_tunnel_drop_rx_info(struct net_device *dev)
+{
+       ASSERT_RTNL();
+       call_netdevice_notifiers(NETDEV_UDP_TUNNEL_DROP_INFO, dev);
+}
+
 /* Transmit the skb using UDP encapsulation. */
 void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
                         __be32 src, __be32 dst, __u8 tos, __u8 ttl,
index 0d3f14cdc524dabaff72597e7038eafe9ac7669c..6539ff15e9a3420db867bc2174aab3e196f97e43 100644 (file)
@@ -94,6 +94,24 @@ void udp_tunnel_push_rx_port(struct net_device *dev, struct socket *sock,
 }
 EXPORT_SYMBOL_GPL(udp_tunnel_push_rx_port);
 
+void udp_tunnel_drop_rx_port(struct net_device *dev, struct socket *sock,
+                            unsigned short type)
+{
+       struct sock *sk = sock->sk;
+       struct udp_tunnel_info ti;
+
+       if (!dev->netdev_ops->ndo_udp_tunnel_del ||
+           !(dev->features & NETIF_F_RX_UDP_TUNNEL_PORT))
+               return;
+
+       ti.type = type;
+       ti.sa_family = sk->sk_family;
+       ti.port = inet_sk(sk)->inet_sport;
+
+       dev->netdev_ops->ndo_udp_tunnel_del(dev, &ti);
+}
+EXPORT_SYMBOL_GPL(udp_tunnel_drop_rx_port);
+
 /* Notify netdevs that UDP port started listening */
 void udp_tunnel_notify_add_rx_port(struct socket *sock, unsigned short type)
 {