#include <linux/netfilter_ingress.h>
 #include <linux/crash_dump.h>
 #include <linux/sctp.h>
+#include <net/udp_tunnel.h>
 
 #include "net-sysfs.h"
 
        netdev_for_each_lower_dev(dev, lower, iter)
                netdev_sync_lower_features(dev, lower, features);
 
-       if (!err)
+       if (!err) {
+               netdev_features_t diff = features ^ dev->features;
+
+               if (diff & NETIF_F_RX_UDP_TUNNEL_PORT) {
+                       /* udp_tunnel_{get,drop}_rx_info both need
+                        * NETIF_F_RX_UDP_TUNNEL_PORT enabled on the
+                        * device, or they won't do anything.
+                        * Thus we need to update dev->features
+                        * *before* calling udp_tunnel_get_rx_info,
+                        * but *after* calling udp_tunnel_drop_rx_info.
+                        */
+                       if (features & NETIF_F_RX_UDP_TUNNEL_PORT) {
+                               dev->features = features;
+                               udp_tunnel_get_rx_info(dev);
+                       } else {
+                               udp_tunnel_drop_rx_info(dev);
+                       }
+               }
+
                dev->features = features;
+       }
 
        return err < 0 ? 0 : 1;
 }