* not implement this, it is assumed that the hw is not able to have
* multiple net devices on single physical port.
*
- * void (*ndo_add_vxlan_port)(struct net_device *dev,
- * sa_family_t sa_family, __be16 port);
- * Called by vxlan to notify a driver about the UDP port and socket
- * address family that vxlan is listening to. It is called only when
- * a new port starts listening. The operation is protected by the
- * vxlan_net->sock_lock.
- *
- * void (*ndo_add_geneve_port)(struct net_device *dev,
- * sa_family_t sa_family, __be16 port);
- * Called by geneve to notify a driver about the UDP port and socket
- * address family that geneve is listnening to. It is called only when
- * a new port starts listening. The operation is protected by the
- * geneve_net->sock_lock.
- *
- * void (*ndo_del_geneve_port)(struct net_device *dev,
- * sa_family_t sa_family, __be16 port);
- * Called by geneve to notify the driver about a UDP port and socket
- * address family that geneve is not listening to anymore. The operation
- * is protected by the geneve_net->sock_lock.
- *
- * void (*ndo_del_vxlan_port)(struct net_device *dev,
- * sa_family_t sa_family, __be16 port);
- * Called by vxlan to notify the driver about a UDP port and socket
- * address family that vxlan is not listening to anymore. The operation
- * is protected by the vxlan_net->sock_lock.
- *
* void (*ndo_udp_tunnel_add)(struct net_device *dev,
* struct udp_tunnel_info *ti);
* Called by UDP tunnel to notify a driver about the UDP port and socket
struct netdev_phys_item_id *ppid);
int (*ndo_get_phys_port_name)(struct net_device *dev,
char *name, size_t len);
- void (*ndo_add_vxlan_port)(struct net_device *dev,
- sa_family_t sa_family,
- __be16 port);
- void (*ndo_del_vxlan_port)(struct net_device *dev,
- sa_family_t sa_family,
- __be16 port);
- void (*ndo_add_geneve_port)(struct net_device *dev,
- sa_family_t sa_family,
- __be16 port);
- void (*ndo_del_geneve_port)(struct net_device *dev,
- sa_family_t sa_family,
- __be16 port);
void (*ndo_udp_tunnel_add)(struct net_device *dev,
struct udp_tunnel_info *ti);
void (*ndo_udp_tunnel_del)(struct net_device *dev,
}
EXPORT_SYMBOL_GPL(setup_udp_tunnel_sock);
-static void __udp_tunnel_push_rx_port(struct net_device *dev,
- struct udp_tunnel_info *ti)
-{
- if (dev->netdev_ops->ndo_udp_tunnel_add) {
- dev->netdev_ops->ndo_udp_tunnel_add(dev, ti);
- return;
- }
-
- switch (ti->type) {
- case UDP_TUNNEL_TYPE_VXLAN:
- if (!dev->netdev_ops->ndo_add_vxlan_port)
- break;
-
- dev->netdev_ops->ndo_add_vxlan_port(dev,
- ti->sa_family,
- ti->port);
- break;
- case UDP_TUNNEL_TYPE_GENEVE:
- if (!dev->netdev_ops->ndo_add_geneve_port)
- break;
-
- dev->netdev_ops->ndo_add_geneve_port(dev,
- ti->sa_family,
- ti->port);
- break;
- default:
- break;
- }
-}
-
void udp_tunnel_push_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_add)
+ return;
+
ti.type = type;
ti.sa_family = sk->sk_family;
ti.port = inet_sk(sk)->inet_sport;
- __udp_tunnel_push_rx_port(dev, &ti);
+ dev->netdev_ops->ndo_udp_tunnel_add(dev, &ti);
}
EXPORT_SYMBOL_GPL(udp_tunnel_push_rx_port);
ti.port = inet_sk(sk)->inet_sport;
rcu_read_lock();
- for_each_netdev_rcu(net, dev)
- __udp_tunnel_push_rx_port(dev, &ti);
+ for_each_netdev_rcu(net, dev) {
+ if (!dev->netdev_ops->ndo_udp_tunnel_add)
+ continue;
+ dev->netdev_ops->ndo_udp_tunnel_add(dev, &ti);
+ }
rcu_read_unlock();
}
EXPORT_SYMBOL_GPL(udp_tunnel_notify_add_rx_port);
-static void __udp_tunnel_pull_rx_port(struct net_device *dev,
- struct udp_tunnel_info *ti)
-{
- if (dev->netdev_ops->ndo_udp_tunnel_del) {
- dev->netdev_ops->ndo_udp_tunnel_del(dev, ti);
- return;
- }
-
- switch (ti->type) {
- case UDP_TUNNEL_TYPE_VXLAN:
- if (!dev->netdev_ops->ndo_del_vxlan_port)
- break;
-
- dev->netdev_ops->ndo_del_vxlan_port(dev,
- ti->sa_family,
- ti->port);
- break;
- case UDP_TUNNEL_TYPE_GENEVE:
- if (!dev->netdev_ops->ndo_del_geneve_port)
- break;
-
- dev->netdev_ops->ndo_del_geneve_port(dev,
- ti->sa_family,
- ti->port);
- break;
- default:
- break;
- }
-}
-
/* Notify netdevs that UDP port is no more listening */
void udp_tunnel_notify_del_rx_port(struct socket *sock, unsigned short type)
{
ti.port = inet_sk(sk)->inet_sport;
rcu_read_lock();
- for_each_netdev_rcu(net, dev)
- __udp_tunnel_pull_rx_port(dev, &ti);
+ for_each_netdev_rcu(net, dev) {
+ if (!dev->netdev_ops->ndo_udp_tunnel_del)
+ continue;
+ dev->netdev_ops->ndo_udp_tunnel_del(dev, &ti);
+ }
rcu_read_unlock();
}
EXPORT_SYMBOL_GPL(udp_tunnel_notify_del_rx_port);