Add a callback notifier for when the minimum GSO values calculated across all the bridge ports changes. This allows for veth to adjust based on the devices in the bridge.
Signed-off-by: Stephen Hemminger <sthem...@microsoft.com> --- include/linux/netdevice.h | 1 + net/bridge/br_if.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index ef789e1d679e..0da966ffec70 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -2326,6 +2326,7 @@ struct netdev_lag_lower_state_info { #define NETDEV_UDP_TUNNEL_PUSH_INFO 0x001C #define NETDEV_UDP_TUNNEL_DROP_INFO 0x001D #define NETDEV_CHANGE_TX_QUEUE_LEN 0x001E +#define NETDEV_CHANGE_GSO_MAX 0x001F int register_netdevice_notifier(struct notifier_block *nb); int unregister_netdevice_notifier(struct notifier_block *nb); diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index 9ba4ed65c52b..ca4ccadd78d0 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c @@ -453,8 +453,15 @@ static void br_set_gso_limits(struct net_bridge *br) gso_max_size = min(gso_max_size, p->dev->gso_max_size); gso_max_segs = min(gso_max_segs, p->dev->gso_max_segs); } + + if (br->dev->gso_max_size == gso_max_size && + br->dev->gso_max_segs == gso_max_segs) + return; + br->dev->gso_max_size = gso_max_size; br->dev->gso_max_segs = gso_max_segs; + + call_netdevice_notifiers(NETDEV_CHANGE_GSO_MAX, br->dev); } /* -- 2.11.0