Commit 43b27d1b authored by Gal Pressman's avatar Gal Pressman Committed by Paolo Abeni
Browse files

net/mlx5e: Fix wraparound in rate limiting for values above 255 Gbps



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

Fixes: d8880795 ("net/mlx5e: Implement DCBNL IEEE max rate")
Signed-off-by: default avatarGal Pressman <gal@nvidia.com>
Reviewed-by: default avatarNimrod Oren <noren@nvidia.com>
Signed-off-by: default avatarTariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/1762681073-1084058-5-git-send-email-tariqt@nvidia.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent a7bf4d50
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -596,11 +596,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]) {
@@ -612,10 +614,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;
		}
	}