|
@@ -144,6 +144,7 @@
|
|
#include <linux/netfilter_ingress.h>
|
|
#include <linux/netfilter_ingress.h>
|
|
#include <linux/crash_dump.h>
|
|
#include <linux/crash_dump.h>
|
|
#include <linux/sctp.h>
|
|
#include <linux/sctp.h>
|
|
|
|
+#include <net/udp_tunnel.h>
|
|
|
|
|
|
#include "net-sysfs.h"
|
|
#include "net-sysfs.h"
|
|
|
|
|
|
@@ -7327,8 +7328,27 @@ sync_lower:
|
|
netdev_for_each_lower_dev(dev, lower, iter)
|
|
netdev_for_each_lower_dev(dev, lower, iter)
|
|
netdev_sync_lower_features(dev, lower, features);
|
|
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;
|
|
dev->features = features;
|
|
|
|
+ }
|
|
|
|
|
|
return err < 0 ? 0 : 1;
|
|
return err < 0 ? 0 : 1;
|
|
}
|
|
}
|