mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
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: d8880795da ("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>
This commit is contained in:
committed by
Paolo Abeni
parent
a7bf4d5063
commit
43b27d1bd8
@@ -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_value[IEEE_8021QAZ_MAX_TCS];
|
||||||
u8 max_bw_unit[IEEE_8021QAZ_MAX_TCS];
|
u8 max_bw_unit[IEEE_8021QAZ_MAX_TCS];
|
||||||
__u64 upper_limit_mbps;
|
__u64 upper_limit_mbps;
|
||||||
|
__u64 upper_limit_gbps;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
memset(max_bw_value, 0, sizeof(max_bw_value));
|
memset(max_bw_value, 0, sizeof(max_bw_value));
|
||||||
memset(max_bw_unit, 0, sizeof(max_bw_unit));
|
memset(max_bw_unit, 0, sizeof(max_bw_unit));
|
||||||
upper_limit_mbps = 255 * MLX5E_100MB;
|
upper_limit_mbps = 255 * MLX5E_100MB;
|
||||||
|
upper_limit_gbps = 255 * MLX5E_1GB;
|
||||||
|
|
||||||
for (i = 0; i <= mlx5_max_tc(mdev); i++) {
|
for (i = 0; i <= mlx5_max_tc(mdev); i++) {
|
||||||
if (!maxrate->tc_maxrate[i]) {
|
if (!maxrate->tc_maxrate[i]) {
|
||||||
@@ -612,10 +614,16 @@ static int mlx5e_dcbnl_ieee_setmaxrate(struct net_device *netdev,
|
|||||||
MLX5E_100MB);
|
MLX5E_100MB);
|
||||||
max_bw_value[i] = max_bw_value[i] ? max_bw_value[i] : 1;
|
max_bw_value[i] = max_bw_value[i] ? max_bw_value[i] : 1;
|
||||||
max_bw_unit[i] = MLX5_100_MBPS_UNIT;
|
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],
|
max_bw_value[i] = div_u64(maxrate->tc_maxrate[i],
|
||||||
MLX5E_1GB);
|
MLX5E_1GB);
|
||||||
max_bw_unit[i] = MLX5_GBPS_UNIT;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user