VYPR
Unrated severityNVD Advisory· Published May 27, 2026· Updated May 27, 2026

CVE-2026-45952

CVE-2026-45952

Description

In the Linux kernel, the following vulnerability has been resolved:

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.

Affected products

1

Patches

6
03399063aa0c

eth: fbnic: Add validation for MTU changes

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitDimitri DaskalakisFeb 14, 2026Fixed in 6.19.4via kernel-cna
2 files changed · +36 2
  • drivers/net/ethernet/meta/fbnic/fbnic_netdev.c+18 1 modified
    diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    index 81c9d5c9a4b2c0..e3ca5fcfabef36 100644
    --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    @@ -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,
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/ethernet/meta/fbnic/fbnic_netdev.c+18 1 modified
    diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    index 81c9d5c9a4b2c0..e3ca5fcfabef36 100644
    --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    @@ -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,
    -- 
    cgit 1.3-korg
    
    
    
d7eaa006c044

eth: fbnic: Add validation for MTU changes

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitDimitri DaskalakisFeb 14, 2026Fixed in 6.18.14via kernel-cna
2 files changed · +36 2
  • drivers/net/ethernet/meta/fbnic/fbnic_netdev.c+18 1 modified
    diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    index e95be0e7bd9e0d..5cbf3ad175a543 100644
    --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    @@ -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,
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/ethernet/meta/fbnic/fbnic_netdev.c+18 1 modified
    diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    index e95be0e7bd9e0d..5cbf3ad175a543 100644
    --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    @@ -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,
    -- 
    cgit 1.3-korg
    
    
    
ccd8e87748ad

eth: fbnic: Add validation for MTU changes

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitDimitri DaskalakisFeb 14, 2026Fixed in 7.0via kernel-cna
2 files changed · +36 2
  • drivers/net/ethernet/meta/fbnic/fbnic_netdev.c+18 1 modified
    diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    index 81c9d5c9a4b2c0..e3ca5fcfabef36 100644
    --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    @@ -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,
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/ethernet/meta/fbnic/fbnic_netdev.c+18 1 modified
    diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    index 81c9d5c9a4b2c0..e3ca5fcfabef36 100644
    --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    @@ -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,
    -- 
    cgit 1.3-korg
    
    
    
ccd8e87748ad

eth: fbnic: Add validation for MTU changes

2 files changed · +36 2
  • drivers/net/ethernet/meta/fbnic/fbnic_netdev.c+18 1 modified
    diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    index 81c9d5c9a4b2c0..e3ca5fcfabef36 100644
    --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    @@ -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,
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/ethernet/meta/fbnic/fbnic_netdev.c+18 1 modified
    diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    index 81c9d5c9a4b2c0..e3ca5fcfabef36 100644
    --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    @@ -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,
    -- 
    cgit 1.3-korg
    
    
    
03399063aa0c

eth: fbnic: Add validation for MTU changes

2 files changed · +36 2
  • drivers/net/ethernet/meta/fbnic/fbnic_netdev.c+18 1 modified
    diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    index 81c9d5c9a4b2c0..e3ca5fcfabef36 100644
    --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    @@ -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,
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/ethernet/meta/fbnic/fbnic_netdev.c+18 1 modified
    diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    index 81c9d5c9a4b2c0..e3ca5fcfabef36 100644
    --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    @@ -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,
    -- 
    cgit 1.3-korg
    
    
    
d7eaa006c044

eth: fbnic: Add validation for MTU changes

2 files changed · +36 2
  • drivers/net/ethernet/meta/fbnic/fbnic_netdev.c+18 1 modified
    diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    index e95be0e7bd9e0d..5cbf3ad175a543 100644
    --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    @@ -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,
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/net/ethernet/meta/fbnic/fbnic_netdev.c+18 1 modified
    diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    index e95be0e7bd9e0d..5cbf3ad175a543 100644
    --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c
    @@ -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,
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"Missing MTU change validation in the fbnic driver allows increasing the MTU beyond the HDS threshold after a single-buffer XDP program is already attached, causing the hardware to fragment packets across multiple buffers that the XDP program cannot handle."

Attack vector

An attacker with local admin (root or CAP_NET_ADMIN) privileges on the system can increase the MTU of a fbnic network device beyond the HDS threshold while a single-buffer XDP program is attached [patch_id=2661049]. The driver previously prevented attaching XDP when the MTU was too high, but did not prevent raising the MTU after XDP was already attached [patch_id=2661051]. Once the MTU exceeds the threshold, the hardware fragments incoming packets across multiple buffers; the single-buffer XDP program then drops all multi-frag frames, effectively breaking new TCP streams on that interface.

Affected code

The vulnerability exists in `drivers/net/ethernet/meta/fbnic/fbnic_netdev.c` where the `fbnic_netdev_ops` structure previously lacked an `ndo_change_mtu` handler [patch_id=2661049]. The fix adds a new `fbnic_change_mtu` function that validates MTU changes against the XDP program and HDS threshold before applying them.

What the fix does

The patch adds a new `fbnic_change_mtu` callback registered as `ndo_change_mtu` in the `fbnic_netdev_ops` structure [patch_id=2661049]. This callback calls `fbnic_check_split_frames(fbn->xdp_prog, new_mtu, fbn->hds_thresh)` to validate that the requested MTU is compatible with any currently attached XDP program and the HDS threshold [patch_id=2661051]. If the check fails, the change is rejected with `-EINVAL` and a descriptive error message is logged, preventing the user from inadvertently breaking XDP functionality.

Preconditions

  • authAttacker must have CAP_NET_ADMIN or root privileges to change MTU on the fbnic interface
  • configA single-buffer XDP program must already be attached to the fbnic network device
  • inputThe requested MTU must exceed the HDS threshold (hds_thresh)

Generated on May 27, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

3

News mentions

0

No linked articles in our index yet.