Add a minimal ndo_change_mtu that rejects MTU values too large for single-page XDP buffers when an XDP program is attached. Without this, users could change the MTU at runtime and break the XDP buffer layout. When no XDP program is attached, any MTU change is accepted, matching the existing behavior without ndo_change_mtu. Signed-off-by: Nicolai Buchwitz Reviewed-by: Florian Fainelli Reviewed-by: Mohsin Bashir --- drivers/net/ethernet/broadcom/genet/bcmgenet.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index e74494be7a23..e74cc055210c 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -4087,6 +4087,20 @@ static int bcmgenet_xdp_xmit(struct net_device *dev, int num_frames, return sent; } +static int bcmgenet_change_mtu(struct net_device *dev, int new_mtu) +{ + struct bcmgenet_priv *priv = netdev_priv(dev); + + if (priv->xdp_prog && new_mtu > PAGE_SIZE - GENET_RX_HEADROOM - + SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) { + netdev_warn(dev, "MTU too large for single-page XDP buffer\n"); + return -EINVAL; + } + + WRITE_ONCE(dev->mtu, new_mtu); + return 0; +} + static const struct net_device_ops bcmgenet_netdev_ops = { .ndo_open = bcmgenet_open, .ndo_stop = bcmgenet_close, @@ -4097,6 +4111,7 @@ static const struct net_device_ops bcmgenet_netdev_ops = { .ndo_eth_ioctl = phy_do_ioctl_running, .ndo_set_features = bcmgenet_set_features, .ndo_get_stats64 = bcmgenet_get_stats64, + .ndo_change_mtu = bcmgenet_change_mtu, .ndo_change_carrier = bcmgenet_change_carrier, .ndo_bpf = bcmgenet_xdp, .ndo_xdp_xmit = bcmgenet_xdp_xmit, -- 2.51.0