]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
eth: fbnic: Add validation for MTU changes
authorDimitri Daskalakis <dimitri.daskalakis1@gmail.com>
Sat, 14 Feb 2026 17:19:49 +0000 (09:19 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 18 Feb 2026 06:09:31 +0000 (06:09 +0000)
Increasing the MTU beyond the HDS threshold causes the hardware to
fragment packets across multiple buffers. If a single-buffer XDP program
is attached, the driver will drop all multi-frag frames. While we can't
prevent a remote sender from sending non-TCP packets larger than the MTU,
this will prevent users from inadvertently breaking new TCP streams.

Traditionally, drivers supported XDP with MTU less than 4Kb
(packet per page). Fbnic currently prevents attaching XDP when MTU is too high.
But it does not prevent increasing MTU after XDP is attached.

Fixes: 1b0a3950dbd4 ("eth: fbnic: Add XDP pass, drop, abort support")
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Dimitri Daskalakis <dimitri.daskalakis1@gmail.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/meta/fbnic/fbnic_netdev.c

index 81c9d5c9a4b2c0e5f42022a595f2e4d368e057f6..e3ca5fcfabef3682b1db09a0deb6e82b99060d26 100644 (file)
@@ -262,6 +262,23 @@ static int fbnic_set_mac(struct net_device *netdev, void *p)
        return 0;
 }
 
+static int fbnic_change_mtu(struct net_device *dev, int new_mtu)
+{
+       struct fbnic_net *fbn = netdev_priv(dev);
+
+       if (fbnic_check_split_frames(fbn->xdp_prog, new_mtu, fbn->hds_thresh)) {
+               dev_err(&dev->dev,
+                       "MTU %d is larger than HDS threshold %d in XDP mode\n",
+                       new_mtu, fbn->hds_thresh);
+
+               return -EINVAL;
+       }
+
+       WRITE_ONCE(dev->mtu, new_mtu);
+
+       return 0;
+}
+
 void fbnic_clear_rx_mode(struct fbnic_dev *fbd)
 {
        struct net_device *netdev = fbd->netdev;
@@ -533,6 +550,7 @@ static const struct net_device_ops fbnic_netdev_ops = {
        .ndo_start_xmit         = fbnic_xmit_frame,
        .ndo_features_check     = fbnic_features_check,
        .ndo_set_mac_address    = fbnic_set_mac,
+       .ndo_change_mtu         = fbnic_change_mtu,
        .ndo_set_rx_mode        = fbnic_set_rx_mode,
        .ndo_get_stats64        = fbnic_get_stats64,
        .ndo_bpf                = fbnic_bpf,