net: call udp_tunnel_get_rx_info when NETIF_F_RX_UDP_TUNNEL_PORT is toggled
NETIF_F_RX_UDP_TUNNEL_PORT is special, in that we need to do more than just flip the bit in dev->features. When disabling we must also clear currently offloaded ports from the device, and when enabling we must tell the device to offload the ports it can. Because vxlan stores its sockets in a hashtable and they are inserted at the head of per-bucket lists, switching the feature off and then on can result in a different set of ports being offloaded (depending on the HW's limits). Signed-off-by: Sabrina Dubroca <sd@queasysnail.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
296d8ee37c
commit
ae847f40b6
|
@ -144,6 +144,7 @@
|
|||
#include <linux/netfilter_ingress.h>
|
||||
#include <linux/crash_dump.h>
|
||||
#include <linux/sctp.h>
|
||||
#include <net/udp_tunnel.h>
|
||||
|
||||
#include "net-sysfs.h"
|
||||
|
||||
|
@ -7327,8 +7328,27 @@ sync_lower:
|
|||
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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue