]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net/mlx5e: Fix wraparound in rate limiting for values above 255 Gbps
authorGal Pressman <gal@nvidia.com>
Sun, 9 Nov 2025 09:37:52 +0000 (11:37 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Dec 2025 11:45:18 +0000 (12:45 +0100)
[ Upstream commit 43b27d1bd88a4bce34ec2437d103acfae9655f9e ]

Add validation to reject rates exceeding 255 Gbps that would overflow
the 8 bits max bandwidth field.

Fixes: d8880795dabf ("net/mlx5e: Implement DCBNL IEEE max rate")
Signed-off-by: Gal Pressman <gal@nvidia.com>
Reviewed-by: Nimrod Oren <noren@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/1762681073-1084058-5-git-send-email-tariqt@nvidia.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c

index 3379f99a44dd6ee161d0af756f99a15add0bf94f..4acab31f53ac0fea4a68f16ee9d479aae8f35468 100644 (file)
@@ -580,11 +580,13 @@ static int mlx5e_dcbnl_ieee_setmaxrate(struct net_device *netdev,
        u8 max_bw_value[IEEE_8021QAZ_MAX_TCS];
        u8 max_bw_unit[IEEE_8021QAZ_MAX_TCS];
        __u64 upper_limit_mbps;
+       __u64 upper_limit_gbps;
        int i;
 
        memset(max_bw_value, 0, sizeof(max_bw_value));
        memset(max_bw_unit, 0, sizeof(max_bw_unit));
        upper_limit_mbps = 255 * MLX5E_100MB;
+       upper_limit_gbps = 255 * MLX5E_1GB;
 
        for (i = 0; i <= mlx5_max_tc(mdev); i++) {
                if (!maxrate->tc_maxrate[i]) {
@@ -596,10 +598,16 @@ static int mlx5e_dcbnl_ieee_setmaxrate(struct net_device *netdev,
                                                  MLX5E_100MB);
                        max_bw_value[i] = max_bw_value[i] ? max_bw_value[i] : 1;
                        max_bw_unit[i]  = MLX5_100_MBPS_UNIT;
-               } else {
+               } else if (max_bw_value[i] <= upper_limit_gbps) {
                        max_bw_value[i] = div_u64(maxrate->tc_maxrate[i],
                                                  MLX5E_1GB);
                        max_bw_unit[i]  = MLX5_GBPS_UNIT;
+               } else {
+                       netdev_err(netdev,
+                                  "tc_%d maxrate %llu Kbps exceeds limit %llu\n",
+                                  i, maxrate->tc_maxrate[i],
+                                  upper_limit_gbps);
+                       return -EINVAL;
                }
        }