提交 6973e00c 编写于 作者: Y youshengzui 提交者: Xie XiuQi

net: hns3: add boundary check for device list

driver inclusion
category: bugfix
bugzilla: NA
CVE: NA

This patch is dedicated to add boundary check for dcb_info list
Signed-off-by: Nyoushengzui <youshengzui@huawei.com>
Reviewed-by: Ndengweiwei <dengweiwei@huawei.com>
Reviewed-by: Nzhongzhaohui <zhongzhaohui@huawei.com>
Reviewed-by: Nliyongxin1 <liyongxin1@huawei.com>
Reviewed-by: NYang Yingliang <yangyingliang@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 dc873a46
...@@ -17,7 +17,7 @@ extern const char hns3_copyright[]; ...@@ -17,7 +17,7 @@ extern const char hns3_copyright[];
#ifdef CONFIG_IT_VALIDATION #ifdef CONFIG_IT_VALIDATION
#define HNAE_DRIVER_VERSION "1.8.15.1" #define HNAE_DRIVER_VERSION "1.9.16.0"
extern struct net_device_ops hns3_nic_netdev_ops; extern struct net_device_ops hns3_nic_netdev_ops;
extern const struct hnae3_client_ops client_ops; extern const struct hnae3_client_ops client_ops;
......
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
#define HCLGE_OPC_DCQCN_TEMPLATE_CFG 0x7014 #define HCLGE_OPC_DCQCN_TEMPLATE_CFG 0x7014
#define HCLGE_OPC_DCQCN_GET_MSG_CNT 0x7017 #define HCLGE_OPC_DCQCN_GET_MSG_CNT 0x7017
#define HNAE_DRIVER_VERSION "1.8.15.2" #define HNAE_DRIVER_VERSION "1.9.16.0"
#define MAX_MSG_OUT_SIZE (1024U * 2048U) #define MAX_MSG_OUT_SIZE (1024U * 2048U)
#define MAX_MSG_IN_SIZE (1024U * 2048U) #define MAX_MSG_IN_SIZE (1024U * 2048U)
......
...@@ -13,28 +13,26 @@ ...@@ -13,28 +13,26 @@
#include "hclge_tm.h" #include "hclge_tm.h"
#include "hclge_cmd.h" #include "hclge_cmd.h"
#include "hns3_priv_dcb.h" #include "hns3_priv_dcb.h"
#define FUNKY_BUF_ERR -1
#define MAX_DEV_LISTED 20
struct nictool_dcb_info dcb_all_info[20]; struct nictool_dcb_info dcb_all_info[MAX_DEV_LISTED];
u8 curr_dev_index;
u8 max_index;
static void check_and_set_curr_dev(struct hns3_nic_priv *net_priv) static int check_and_set_curr_dev(struct hns3_nic_priv *net_priv)
{ {
int flag = false;
int i; int i;
for (i = 0; i < max_index; i++) { for (i = 0; i < MAX_DEV_LISTED; i++) {
if (dcb_all_info[i].net_priv != net_priv) if (!dcb_all_info[i].net_priv) {
continue; dcb_all_info[i].net_priv = net_priv;
flag = true; break;
curr_dev_index = i; } else if (dcb_all_info[i].net_priv == net_priv) {
} break;
}
if (!flag) {
max_index++;
curr_dev_index = max_index - 1;
dcb_all_info[curr_dev_index].net_priv = net_priv;
} }
if (i == MAX_DEV_LISTED)
return FUNKY_BUF_ERR;
return i;
} }
int hns3_test_dcb_cfg(struct hns3_nic_priv *net_priv, int hns3_test_dcb_cfg(struct hns3_nic_priv *net_priv,
...@@ -42,6 +40,7 @@ int hns3_test_dcb_cfg(struct hns3_nic_priv *net_priv, ...@@ -42,6 +40,7 @@ int hns3_test_dcb_cfg(struct hns3_nic_priv *net_priv,
{ {
struct nictool_dcb_cfg_param *out_info; struct nictool_dcb_cfg_param *out_info;
struct nictool_dcb_cfg_param *in_info; struct nictool_dcb_cfg_param *in_info;
int curr_dev_idx;
bool check; bool check;
check = !buf_in || in_size < sizeof(struct nictool_dcb_cfg_param); check = !buf_in || in_size < sizeof(struct nictool_dcb_cfg_param);
...@@ -52,7 +51,11 @@ int hns3_test_dcb_cfg(struct hns3_nic_priv *net_priv, ...@@ -52,7 +51,11 @@ int hns3_test_dcb_cfg(struct hns3_nic_priv *net_priv,
in_info = (struct nictool_dcb_cfg_param *)buf_in; in_info = (struct nictool_dcb_cfg_param *)buf_in;
out_info = (struct nictool_dcb_cfg_param *)buf_out; out_info = (struct nictool_dcb_cfg_param *)buf_out;
check_and_set_curr_dev(net_priv); curr_dev_idx = check_and_set_curr_dev(net_priv);
if (curr_dev_idx < 0) {
pr_err("Exceed MAX_DEV_LISTED: %d\n", MAX_DEV_LISTED);
return -1;
}
if (in_info->is_read) { if (in_info->is_read) {
check = !buf_out || check = !buf_out ||
out_size < sizeof(struct nictool_dcb_cfg_param); out_size < sizeof(struct nictool_dcb_cfg_param);
...@@ -62,10 +65,10 @@ int hns3_test_dcb_cfg(struct hns3_nic_priv *net_priv, ...@@ -62,10 +65,10 @@ int hns3_test_dcb_cfg(struct hns3_nic_priv *net_priv,
return -EFAULT; return -EFAULT;
} }
out_info->dcb_en = out_info->dcb_en =
dcb_all_info[curr_dev_index].dcb_cfg_info.dcb_en; dcb_all_info[curr_dev_idx].dcb_cfg_info.dcb_en;
} else { } else {
if (in_info->cfg_flag & NICTOOL_DCB_DCB_CFG_FLAG) if (in_info->cfg_flag & NICTOOL_DCB_DCB_CFG_FLAG)
dcb_all_info[curr_dev_index].dcb_cfg_info.dcb_en = dcb_all_info[curr_dev_idx].dcb_cfg_info.dcb_en =
in_info->dcb_en; in_info->dcb_en;
} }
...@@ -73,7 +76,7 @@ int hns3_test_dcb_cfg(struct hns3_nic_priv *net_priv, ...@@ -73,7 +76,7 @@ int hns3_test_dcb_cfg(struct hns3_nic_priv *net_priv,
} }
static int hns3_test_cfg_pfc_en(u8 is_read, struct hclge_dev *hdev, static int hns3_test_cfg_pfc_en(u8 is_read, struct hclge_dev *hdev,
struct nictool_pfc_cfg_param *info) struct nictool_pfc_cfg_param *info, int dev_idx)
{ {
struct hclge_desc desc; struct hclge_desc desc;
int ret; int ret;
...@@ -93,13 +96,13 @@ static int hns3_test_cfg_pfc_en(u8 is_read, struct hclge_dev *hdev, ...@@ -93,13 +96,13 @@ static int hns3_test_cfg_pfc_en(u8 is_read, struct hclge_dev *hdev,
desc.data[0] = (desc.data[0] & (~0x3)) | desc.data[0] = (desc.data[0] & (~0x3)) |
(info->pfc_en << 0) | (info->pfc_en << 0) |
(info->pfc_en << 1); (info->pfc_en << 1);
dcb_all_info[curr_dev_index].pfc_cfg_info.pfc_en = dcb_all_info[dev_idx].pfc_cfg_info.pfc_en =
info->pfc_en; info->pfc_en;
} }
if (info->cfg_flag & NICTOOL_PFC_PRIEN_CFG_FLAG) { if (info->cfg_flag & NICTOOL_PFC_PRIEN_CFG_FLAG) {
desc.data[0] = (desc.data[0] & (~0xff00)) | desc.data[0] = (desc.data[0] & (~0xff00)) |
(info->prien << 8); (info->prien << 8);
dcb_all_info[curr_dev_index].pfc_cfg_info.prien = dcb_all_info[dev_idx].pfc_cfg_info.prien =
info->prien; info->prien;
} }
ret = hclge_cmd_send(&hdev->hw, &desc, 1); ret = hclge_cmd_send(&hdev->hw, &desc, 1);
...@@ -160,6 +163,7 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv, ...@@ -160,6 +163,7 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv,
struct hclge_vport *vport; struct hclge_vport *vport;
struct hnae3_handle *h; struct hnae3_handle *h;
struct hclge_dev *hdev; struct hclge_dev *hdev;
int curr_dev_idx;
bool check; bool check;
int ret; int ret;
...@@ -169,7 +173,11 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv, ...@@ -169,7 +173,11 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv,
return -EFAULT; return -EFAULT;
} }
check_and_set_curr_dev(net_priv); curr_dev_idx = check_and_set_curr_dev(net_priv);
if (curr_dev_idx < 0) {
pr_err("Exceed MAX_DEV_LISTED: %d\n", MAX_DEV_LISTED);
return -1;
}
h = net_priv->ae_handle; h = net_priv->ae_handle;
vport = hclge_get_vport(h); vport = hclge_get_vport(h);
ndev = h->netdev; ndev = h->netdev;
...@@ -178,7 +186,7 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv, ...@@ -178,7 +186,7 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv,
out_info = (struct nictool_pfc_cfg_param *)buf_out; out_info = (struct nictool_pfc_cfg_param *)buf_out;
if (!in_info->is_read && if (!in_info->is_read &&
!dcb_all_info[curr_dev_index].dcb_cfg_info.dcb_en) { !dcb_all_info[curr_dev_idx].dcb_cfg_info.dcb_en) {
pr_err("please enable dcb cfg first!\n"); pr_err("please enable dcb cfg first!\n");
return -1; return -1;
} }
...@@ -196,7 +204,8 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv, ...@@ -196,7 +204,8 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv,
__func__); __func__);
return -EFAULT; return -EFAULT;
} }
ret = hns3_test_cfg_pfc_en(in_info->is_read, hdev, out_info); ret = hns3_test_cfg_pfc_en(in_info->is_read, hdev,
out_info, curr_dev_idx);
if (ret) if (ret)
return ret; return ret;
ret = hns3_test_cfg_pause_param(hdev, out_info, true); ret = hns3_test_cfg_pause_param(hdev, out_info, true);
...@@ -207,7 +216,7 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv, ...@@ -207,7 +216,7 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv,
if (in_info->cfg_flag & NICTOOL_PFC_PRIEN_CFG_FLAG) { if (in_info->cfg_flag & NICTOOL_PFC_PRIEN_CFG_FLAG) {
pfc.pfc_en = in_info->prien; pfc.pfc_en = in_info->prien;
dcb_all_info[curr_dev_index].pfc_cfg_info.prien = dcb_all_info[curr_dev_idx].pfc_cfg_info.prien =
in_info->prien; in_info->prien;
if (ndev->dcbnl_ops->ieee_setpfc) { if (ndev->dcbnl_ops->ieee_setpfc) {
rtnl_lock(); rtnl_lock();
...@@ -230,7 +239,7 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv, ...@@ -230,7 +239,7 @@ int hns3_test_dcb_pfc_cfg(struct hns3_nic_priv *net_priv,
} }
static void hns3_test_disable_ets_cfg(struct hclge_dev *hdev, static void hns3_test_disable_ets_cfg(struct hclge_dev *hdev,
struct ieee_ets *ets) struct ieee_ets *ets, int dev_idx)
{ {
u8 percent = 0; u8 percent = 0;
int i; int i;
...@@ -238,31 +247,32 @@ static void hns3_test_disable_ets_cfg(struct hclge_dev *hdev, ...@@ -238,31 +247,32 @@ static void hns3_test_disable_ets_cfg(struct hclge_dev *hdev,
for (i = 0; i < NICTOOL_ETS_MAC_TC_NUM; i++) { for (i = 0; i < NICTOOL_ETS_MAC_TC_NUM; i++) {
ets->prio_tc[i] = hdev->tm_info.prio_tc[i]; ets->prio_tc[i] = hdev->tm_info.prio_tc[i];
ets->tc_tsa[i] = IEEE_8021QAZ_TSA_ETS; ets->tc_tsa[i] = IEEE_8021QAZ_TSA_ETS;
dcb_all_info[curr_dev_index].ets_cfg_info.schedule[i] = 0; dcb_all_info[dev_idx].ets_cfg_info.schedule[i] = 0;
} }
for (i = 0; i < hdev->tm_info.num_tc; i++) { for (i = 0; i < hdev->tm_info.num_tc; i++) {
ets->tc_tx_bw[i] = 100 / hdev->tm_info.num_tc; ets->tc_tx_bw[i] = 100 / hdev->tm_info.num_tc;
dcb_all_info[curr_dev_index].ets_cfg_info.bw[i] = dcb_all_info[dev_idx].ets_cfg_info.bw[i] =
ets->tc_tx_bw[i]; ets->tc_tx_bw[i];
percent += ets->tc_tx_bw[i]; percent += ets->tc_tx_bw[i];
} }
if (percent != 100) { if (percent != 100) {
ets->tc_tx_bw[i - 1] += (100 - percent); ets->tc_tx_bw[i - 1] += (100 - percent);
dcb_all_info[curr_dev_index].ets_cfg_info.bw[i - 1] = dcb_all_info[dev_idx].ets_cfg_info.bw[i - 1] =
ets->tc_tx_bw[i - 1]; ets->tc_tx_bw[i - 1];
} }
} }
static void hns3_test_enable_ets_cfg(struct hclge_dev *hdev, static void hns3_test_enable_ets_cfg(struct hclge_dev *hdev,
struct ieee_ets *ets, struct ieee_ets *ets,
struct nictool_ets_cfg_param *info) struct nictool_ets_cfg_param *info,
int dev_idx)
{ {
int i; int i;
if (info->cfg_flag & NICTOOL_ETS_UP2TC_CFG_FLAG) { if (info->cfg_flag & NICTOOL_ETS_UP2TC_CFG_FLAG) {
for (i = 0; i < NICTOOL_ETS_MAC_TC_NUM; i++) { for (i = 0; i < NICTOOL_ETS_MAC_TC_NUM; i++) {
ets->prio_tc[i] = info->up2tc[i]; ets->prio_tc[i] = info->up2tc[i];
dcb_all_info[curr_dev_index].ets_cfg_info.up2tc[i] = dcb_all_info[dev_idx].ets_cfg_info.up2tc[i] =
info->up2tc[i]; info->up2tc[i];
} }
} else { } else {
...@@ -273,7 +283,7 @@ static void hns3_test_enable_ets_cfg(struct hclge_dev *hdev, ...@@ -273,7 +283,7 @@ static void hns3_test_enable_ets_cfg(struct hclge_dev *hdev,
if (info->cfg_flag & NICTOOL_ETS_BANDWIDTH_CFG_FLAG) { if (info->cfg_flag & NICTOOL_ETS_BANDWIDTH_CFG_FLAG) {
for (i = 0; i < NICTOOL_ETS_MAC_TC_NUM; i++) { for (i = 0; i < NICTOOL_ETS_MAC_TC_NUM; i++) {
ets->tc_tx_bw[i] = info->bw[i]; ets->tc_tx_bw[i] = info->bw[i];
dcb_all_info[curr_dev_index].ets_cfg_info.bw[i] = dcb_all_info[dev_idx].ets_cfg_info.bw[i] =
info->bw[i]; info->bw[i];
} }
} else { } else {
...@@ -285,7 +295,7 @@ static void hns3_test_enable_ets_cfg(struct hclge_dev *hdev, ...@@ -285,7 +295,7 @@ static void hns3_test_enable_ets_cfg(struct hclge_dev *hdev,
for (i = 0; i < NICTOOL_ETS_MAC_TC_NUM; i++) { for (i = 0; i < NICTOOL_ETS_MAC_TC_NUM; i++) {
ets->tc_tsa[i] = info->schedule[i] ? ets->tc_tsa[i] = info->schedule[i] ?
IEEE_8021QAZ_TSA_STRICT : IEEE_8021QAZ_TSA_ETS; IEEE_8021QAZ_TSA_STRICT : IEEE_8021QAZ_TSA_ETS;
dcb_all_info[curr_dev_index].ets_cfg_info.schedule[i] = dcb_all_info[dev_idx].ets_cfg_info.schedule[i] =
info->schedule[i]; info->schedule[i];
} }
} else { } else {
...@@ -306,6 +316,7 @@ int hns3_test_dcb_ets_cfg(struct hns3_nic_priv *net_priv, ...@@ -306,6 +316,7 @@ int hns3_test_dcb_ets_cfg(struct hns3_nic_priv *net_priv,
struct hclge_dev *hdev; struct hclge_dev *hdev;
struct hclge_desc desc; struct hclge_desc desc;
struct hnae3_handle *h; struct hnae3_handle *h;
int curr_dev_idx;
bool check; bool check;
int ret; int ret;
int i; int i;
...@@ -317,7 +328,11 @@ int hns3_test_dcb_ets_cfg(struct hns3_nic_priv *net_priv, ...@@ -317,7 +328,11 @@ int hns3_test_dcb_ets_cfg(struct hns3_nic_priv *net_priv,
return -EFAULT; return -EFAULT;
} }
check_and_set_curr_dev(net_priv); curr_dev_idx = check_and_set_curr_dev(net_priv);
if (curr_dev_idx < 0) {
pr_err("Exceed MAX_DEV_LISTED: %d\n", MAX_DEV_LISTED);
return -1;
}
h = net_priv->ae_handle; h = net_priv->ae_handle;
vport = hclge_get_vport(h); vport = hclge_get_vport(h);
ndev = h->netdev; ndev = h->netdev;
...@@ -326,7 +341,7 @@ int hns3_test_dcb_ets_cfg(struct hns3_nic_priv *net_priv, ...@@ -326,7 +341,7 @@ int hns3_test_dcb_ets_cfg(struct hns3_nic_priv *net_priv,
out_info = (struct nictool_ets_cfg_param *)buf_out; out_info = (struct nictool_ets_cfg_param *)buf_out;
if (!in_info->is_read && if (!in_info->is_read &&
!dcb_all_info[curr_dev_index].dcb_cfg_info.dcb_en) { !dcb_all_info[curr_dev_idx].dcb_cfg_info.dcb_en) {
pr_err("please enable dcb cfg first!\n"); pr_err("please enable dcb cfg first!\n");
return -1; return -1;
} }
...@@ -345,31 +360,32 @@ int hns3_test_dcb_ets_cfg(struct hns3_nic_priv *net_priv, ...@@ -345,31 +360,32 @@ int hns3_test_dcb_ets_cfg(struct hns3_nic_priv *net_priv,
return ret; return ret;
} }
out_info->ets_en = out_info->ets_en =
dcb_all_info[curr_dev_index].ets_cfg_info.ets_en; dcb_all_info[curr_dev_idx].ets_cfg_info.ets_en;
for (i = 0; i < NICTOOL_ETS_MAC_TC_NUM; i++) { for (i = 0; i < NICTOOL_ETS_MAC_TC_NUM; i++) {
out_info->up2tc[i] = out_info->up2tc[i] =
(desc.data[0] & (0xf << (4 * i))) >> (4 * i); (desc.data[0] & (0xf << (4 * i))) >> (4 * i);
dcb_all_info[curr_dev_index].ets_cfg_info.up2tc[i] = dcb_all_info[curr_dev_idx].ets_cfg_info.up2tc[i] =
out_info->up2tc[i]; out_info->up2tc[i];
out_info->bw[i] = hdev->tm_info.pg_info[0].tc_dwrr[i]; out_info->bw[i] = hdev->tm_info.pg_info[0].tc_dwrr[i];
dcb_all_info[curr_dev_index].ets_cfg_info.bw[i] = dcb_all_info[curr_dev_idx].ets_cfg_info.bw[i] =
hdev->tm_info.pg_info[0].tc_dwrr[i]; hdev->tm_info.pg_info[0].tc_dwrr[i];
out_info->schedule[i] = out_info->schedule[i] =
!hdev->tm_info.tc_info[i].tc_sch_mode; !hdev->tm_info.tc_info[i].tc_sch_mode;
dcb_all_info[curr_dev_index].ets_cfg_info.schedule[i] = dcb_all_info[curr_dev_idx].ets_cfg_info.schedule[i] =
!hdev->tm_info.tc_info[i].tc_sch_mode; !hdev->tm_info.tc_info[i].tc_sch_mode;
} }
} else { } else {
struct ieee_ets ets = {0}; struct ieee_ets ets = {0};
if (in_info->cfg_flag & NICTOOL_ETS_EN_CFG_FLAG) if (in_info->cfg_flag & NICTOOL_ETS_EN_CFG_FLAG)
dcb_all_info[curr_dev_index].ets_cfg_info.ets_en = dcb_all_info[curr_dev_idx].ets_cfg_info.ets_en =
in_info->ets_en; in_info->ets_en;
if (!dcb_all_info[curr_dev_index].ets_cfg_info.ets_en) if (!dcb_all_info[curr_dev_idx].ets_cfg_info.ets_en)
hns3_test_disable_ets_cfg(hdev, &ets); hns3_test_disable_ets_cfg(hdev, &ets, curr_dev_idx);
else else
hns3_test_enable_ets_cfg(hdev, &ets, in_info); hns3_test_enable_ets_cfg(hdev, &ets, in_info,
curr_dev_idx);
if (ndev->dcbnl_ops->ieee_setets) { if (ndev->dcbnl_ops->ieee_setets) {
rtnl_lock(); rtnl_lock();
...@@ -382,7 +398,7 @@ int hns3_test_dcb_ets_cfg(struct hns3_nic_priv *net_priv, ...@@ -382,7 +398,7 @@ int hns3_test_dcb_ets_cfg(struct hns3_nic_priv *net_priv,
out_info->cfg_flag = in_info->cfg_flag; out_info->cfg_flag = in_info->cfg_flag;
out_info->is_read = in_info->is_read; out_info->is_read = in_info->is_read;
out_info->ets_en = out_info->ets_en =
dcb_all_info[curr_dev_index].ets_cfg_info.ets_en; dcb_all_info[curr_dev_idx].ets_cfg_info.ets_en;
} }
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册