*     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);