return 1;
 }
 
+/* Notify netdevs that UDP port started listening */
+static void vxlan_notify_add_rx_port(struct sock *sk)
+{
+       struct net_device *dev;
+       struct net *net = sock_net(sk);
+       sa_family_t sa_family = sk->sk_family;
+       u16 port = htons(inet_sk(sk)->inet_sport);
+
+       rcu_read_lock();
+       for_each_netdev_rcu(net, dev) {
+               if (dev->netdev_ops->ndo_add_vxlan_port)
+                       dev->netdev_ops->ndo_add_vxlan_port(dev, sa_family,
+                                                           port);
+       }
+       rcu_read_unlock();
+}
+
+/* Notify netdevs that UDP port is no more listening */
+static void vxlan_notify_del_rx_port(struct sock *sk)
+{
+       struct net_device *dev;
+       struct net *net = sock_net(sk);
+       sa_family_t sa_family = sk->sk_family;
+       u16 port = htons(inet_sk(sk)->inet_sport);
+
+       rcu_read_lock();
+       for_each_netdev_rcu(net, dev) {
+               if (dev->netdev_ops->ndo_del_vxlan_port)
+                       dev->netdev_ops->ndo_del_vxlan_port(dev, sa_family,
+                                                           port);
+       }
+       rcu_read_unlock();
+}
+
 /* Add new entry to forwarding table -- assumes lock held */
 static int vxlan_fdb_create(struct vxlan_dev *vxlan,
                            const u8 *mac, union vxlan_addr *ip,
 
 void vxlan_sock_release(struct vxlan_sock *vs)
 {
-       struct vxlan_net *vn = net_generic(sock_net(vs->sock->sk), vxlan_net_id);
+       struct sock *sk = vs->sock->sk;
+       struct net *net = sock_net(sk);
+       struct vxlan_net *vn = net_generic(net, vxlan_net_id);
 
        if (!atomic_dec_and_test(&vs->refcnt))
                return;
        hlist_del_rcu(&vs->hlist);
        smp_wmb();
        vs->sock->sk->sk_user_data = NULL;
+       vxlan_notify_del_rx_port(sk);
        spin_unlock(&vn->sock_lock);
 
        queue_work(vxlan_wq, &vs->del_work);
        .name = "vxlan",
 };
 
+/* Calls the ndo_add_vxlan_port of the caller in order to
+ * supply the listening VXLAN udp ports.
+ */
+void vxlan_get_rx_port(struct net_device *dev)
+{
+       struct vxlan_sock *vs;
+       struct net *net = dev_net(dev);
+       struct vxlan_net *vn = net_generic(net, vxlan_net_id);
+       sa_family_t sa_family;
+       u16 port;
+       int i;
+
+       if (!dev || !dev->netdev_ops || !dev->netdev_ops->ndo_add_vxlan_port)
+               return;
+
+       spin_lock(&vn->sock_lock);
+       for (i = 0; i < PORT_HASH_SIZE; ++i) {
+               hlist_for_each_entry_rcu(vs, vs_head(net, i), hlist) {
+                       port = htons(inet_sk(vs->sock->sk)->inet_sport);
+                       sa_family = vs->sock->sk->sk_family;
+                       dev->netdev_ops->ndo_add_vxlan_port(dev, sa_family,
+                                                           port);
+               }
+       }
+       spin_unlock(&vn->sock_lock);
+}
+EXPORT_SYMBOL_GPL(vxlan_get_rx_port);
+
 /* Initialize the device structure. */
 static void vxlan_setup(struct net_device *dev)
 {
 
        spin_lock(&vn->sock_lock);
        hlist_add_head_rcu(&vs->hlist, vs_head(net, port));
+       vxlan_notify_add_rx_port(sk);
        spin_unlock(&vn->sock_lock);
 
        /* Mark socket as an encapsulation socket. */
 
  *     Called to get ID of physical port of this device. If driver does
  *     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, __u16 port);
+ *     Called by vxlan to notiy a driver about the UDP port and socket
+ *     address family that vxlan is listnening to. It is called only when
+ *     a new port starts listening. The operation is protected by the
+ *     vxlan_net->sock_lock.
+ *
+ * void (*ndo_del_vxlan_port)(struct  net_device *dev,
+ *                           sa_family_t sa_family, __u16 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.
  */
 struct net_device_ops {
        int                     (*ndo_init)(struct net_device *dev);
                                                      bool new_carrier);
        int                     (*ndo_get_phys_port_id)(struct net_device *dev,
                                                        struct netdev_phys_port_id *ppid);
+       void                    (*ndo_add_vxlan_port)(struct  net_device *dev,
+                                                     sa_family_t sa_family,
+                                                     __u16 port);
+       void                    (*ndo_del_vxlan_port)(struct  net_device *dev,
+                                                     sa_family_t sa_family,
+                                                     __u16 port);
 };
 
 /*