Skip to content

Commit ccd8e87

Browse files
Dimitri Daskalakisdavem330
authored andcommitted
eth: fbnic: Add validation for MTU changes
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: 1b0a395 ("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>
1 parent be054cc commit ccd8e87

1 file changed

Lines changed: 18 additions & 0 deletions

File tree

drivers/net/ethernet/meta/fbnic/fbnic_netdev.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,23 @@ static int fbnic_set_mac(struct net_device *netdev, void *p)
262262
return 0;
263263
}
264264

265+
static int fbnic_change_mtu(struct net_device *dev, int new_mtu)
266+
{
267+
struct fbnic_net *fbn = netdev_priv(dev);
268+
269+
if (fbnic_check_split_frames(fbn->xdp_prog, new_mtu, fbn->hds_thresh)) {
270+
dev_err(&dev->dev,
271+
"MTU %d is larger than HDS threshold %d in XDP mode\n",
272+
new_mtu, fbn->hds_thresh);
273+
274+
return -EINVAL;
275+
}
276+
277+
WRITE_ONCE(dev->mtu, new_mtu);
278+
279+
return 0;
280+
}
281+
265282
void fbnic_clear_rx_mode(struct fbnic_dev *fbd)
266283
{
267284
struct net_device *netdev = fbd->netdev;
@@ -533,6 +550,7 @@ static const struct net_device_ops fbnic_netdev_ops = {
533550
.ndo_start_xmit = fbnic_xmit_frame,
534551
.ndo_features_check = fbnic_features_check,
535552
.ndo_set_mac_address = fbnic_set_mac,
553+
.ndo_change_mtu = fbnic_change_mtu,
536554
.ndo_set_rx_mode = fbnic_set_rx_mode,
537555
.ndo_get_stats64 = fbnic_get_stats64,
538556
.ndo_bpf = fbnic_bpf,

0 commit comments

Comments
 (0)