Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/106648/?format=api
http://patches.dpdk.org/api/patches/106648/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/patch/20220128020708.62787-4-humin29@huawei.com/", "project": { "id": 1, "url": "http://patches.dpdk.org/api/projects/1/?format=api", "name": "DPDK", "link_name": "dpdk", "list_id": "dev.dpdk.org", "list_email": "dev@dpdk.org", "web_url": "http://core.dpdk.org", "scm_url": "git://dpdk.org/dpdk", "webscm_url": "http://git.dpdk.org/dpdk", "list_archive_url": "https://inbox.dpdk.org/dev", "list_archive_url_format": "https://inbox.dpdk.org/dev/{}", "commit_url_format": "" }, "msgid": "<20220128020708.62787-4-humin29@huawei.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20220128020708.62787-4-humin29@huawei.com", "date": "2022-01-28T02:07:05", "name": "[3/6] net/hns3: fix insecure way to query MAC statistics", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": true, "hash": "991aad37af5d43a3470dc62ed0fbfcbc8200b7a2", "submitter": { "id": 1944, "url": "http://patches.dpdk.org/api/people/1944/?format=api", "name": "humin (Q)", "email": "humin29@huawei.com" }, "delegate": { "id": 319, "url": "http://patches.dpdk.org/api/users/319/?format=api", "username": "fyigit", "first_name": "Ferruh", "last_name": "Yigit", "email": "ferruh.yigit@amd.com" }, "mbox": "http://patches.dpdk.org/project/dpdk/patch/20220128020708.62787-4-humin29@huawei.com/mbox/", "series": [ { "id": 21406, "url": "http://patches.dpdk.org/api/series/21406/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=21406", "date": "2022-01-28T02:07:03", "name": "bugfixes for hns3 PMD", "version": 1, "mbox": "http://patches.dpdk.org/series/21406/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/106648/comments/", "check": "success", "checks": "http://patches.dpdk.org/api/patches/106648/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<dev-bounces@dpdk.org>", "X-Original-To": "patchwork@inbox.dpdk.org", "Delivered-To": "patchwork@inbox.dpdk.org", "Received": [ "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id C79A6A034E;\n\tFri, 28 Jan 2022 03:07:26 +0100 (CET)", "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 3A0094284E;\n\tFri, 28 Jan 2022 03:07:03 +0100 (CET)", "from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188])\n by mails.dpdk.org (Postfix) with ESMTP id 1F18A4277B\n for <dev@dpdk.org>; Fri, 28 Jan 2022 03:06:57 +0100 (CET)", "from dggeme756-chm.china.huawei.com (unknown [172.30.72.53])\n by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4JlLQP6PGCz9sHY;\n Fri, 28 Jan 2022 10:05:33 +0800 (CST)", "from localhost.localdomain (10.69.192.56) by\n dggeme756-chm.china.huawei.com (10.3.19.102) with Microsoft SMTP Server\n (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id\n 15.1.2308.21; Fri, 28 Jan 2022 10:06:54 +0800" ], "From": "\"Min Hu (Connor)\" <humin29@huawei.com>", "To": "<dev@dpdk.org>", "CC": "<ferruh.yigit@intel.com>, <thomas@monjalon.net>", "Subject": "[PATCH 3/6] net/hns3: fix insecure way to query MAC statistics", "Date": "Fri, 28 Jan 2022 10:07:05 +0800", "Message-ID": "<20220128020708.62787-4-humin29@huawei.com>", "X-Mailer": "git-send-email 2.33.0", "In-Reply-To": "<20220128020708.62787-1-humin29@huawei.com>", "References": "<20220128020708.62787-1-humin29@huawei.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Content-Type": "text/plain", "X-Originating-IP": "[10.69.192.56]", "X-ClientProxiedBy": "dggems702-chm.china.huawei.com (10.3.19.179) To\n dggeme756-chm.china.huawei.com (10.3.19.102)", "X-CFilter-Loop": "Reflected", "X-BeenThere": "dev@dpdk.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "DPDK patches and discussions <dev.dpdk.org>", "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>", "List-Archive": "<http://mails.dpdk.org/archives/dev/>", "List-Post": "<mailto:dev@dpdk.org>", "List-Help": "<mailto:dev-request@dpdk.org?subject=help>", "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>", "Errors-To": "dev-bounces@dpdk.org" }, "content": "From: Huisong Li <lihuisong@huawei.com>\n\nThe query way of MAC statistics in HNS3 PF driver is as following:\n1) get MAC statistics register number and calculate descriptor number.\n2) use above descriptor number to send command to firmware to query all MAC\n statistics and copy to hns3_mac_stats struct in driver.\n\nThe preceding way does not verify the validity of the number of obtained\nregister, which may cause memory out-of-bounds.\n\nFixes: 8839c5e202f3 (\"net/hns3: support device stats\")\nCc: stable@dpdk.org\n\nSigned-off-by: Huisong Li <lihuisong@huawei.com>\nSigned-off-by: Min Hu (Connor) <humin29@huawei.com>\n---\n drivers/net/hns3/hns3_ethdev.c | 4 ++\n drivers/net/hns3/hns3_ethdev.h | 1 +\n drivers/net/hns3/hns3_stats.c | 116 ++++++++++++++++-----------------\n drivers/net/hns3/hns3_stats.h | 11 ++--\n 4 files changed, 65 insertions(+), 67 deletions(-)", "diff": "diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c\nindex 73bf209717..57f1572340 100644\n--- a/drivers/net/hns3/hns3_ethdev.c\n+++ b/drivers/net/hns3/hns3_ethdev.c\n@@ -2733,6 +2733,10 @@ hns3_get_capability(struct hns3_hw *hw)\n \tif (ret)\n \t\treturn ret;\n \n+\tret = hns3_query_mac_stats_reg_num(hw);\n+\tif (ret)\n+\t\treturn ret;\n+\n \tif (hw->revision < PCI_REVISION_ID_HIP09_A) {\n \t\thns3_set_default_dev_specifications(hw);\n \t\thw->intr.mapping_mode = HNS3_INTR_MAPPING_VEC_RSV_ONE;\ndiff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h\nindex cf6380ebb2..ef028a7b2c 100644\n--- a/drivers/net/hns3/hns3_ethdev.h\n+++ b/drivers/net/hns3/hns3_ethdev.h\n@@ -500,6 +500,7 @@ struct hns3_hw {\n \tstruct hns3_tqp_stats tqp_stats;\n \t/* Include Mac stats | Rx stats | Tx stats */\n \tstruct hns3_mac_stats mac_stats;\n+\tuint32_t mac_stats_reg_num;\n \tstruct hns3_rx_missed_stats imissed_stats;\n \tuint64_t oerror_stats;\n \tuint32_t fw_version;\ndiff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c\nindex 606b72509a..806720faff 100644\n--- a/drivers/net/hns3/hns3_stats.c\n+++ b/drivers/net/hns3/hns3_stats.c\n@@ -307,24 +307,21 @@ static const struct hns3_xstats_name_offset hns3_imissed_stats_strings[] = {\n \n static void hns3_tqp_stats_clear(struct hns3_hw *hw);\n \n-/*\n- * Query all the MAC statistics data of Network ICL command ,opcode id: 0x0034.\n- * This command is used before send 'query_mac_stat command', the descriptor\n- * number of 'query_mac_stat command' must match with reg_num in this command.\n- * @praram hw\n- * Pointer to structure hns3_hw.\n- * @return\n- * 0 on success.\n- */\n static int\n-hns3_update_mac_stats(struct hns3_hw *hw, const uint32_t desc_num)\n+hns3_update_mac_stats(struct hns3_hw *hw)\n {\n+#define HNS3_MAC_STATS_REG_NUM_PER_DESC\t4\n+\n \tuint64_t *data = (uint64_t *)(&hw->mac_stats);\n \tstruct hns3_cmd_desc *desc;\n+\tuint32_t stats_iterms;\n \tuint64_t *desc_data;\n-\tuint16_t i, k, n;\n+\tuint32_t desc_num;\n+\tuint16_t i;\n \tint ret;\n \n+\t/* The first desc has a 64-bit header, so need to consider it. */\n+\tdesc_num = hw->mac_stats_reg_num / HNS3_MAC_STATS_REG_NUM_PER_DESC + 1;\n \tdesc = rte_malloc(\"hns3_mac_desc\",\n \t\t\t desc_num * sizeof(struct hns3_cmd_desc), 0);\n \tif (desc == NULL) {\n@@ -340,65 +337,71 @@ hns3_update_mac_stats(struct hns3_hw *hw, const uint32_t desc_num)\n \t\treturn ret;\n \t}\n \n-\tfor (i = 0; i < desc_num; i++) {\n-\t\t/* For special opcode 0034, only the first desc has the head */\n-\t\tif (i == 0) {\n-\t\t\tdesc_data = (uint64_t *)(&desc[i].data[0]);\n-\t\t\tn = HNS3_RD_FIRST_STATS_NUM;\n-\t\t} else {\n-\t\t\tdesc_data = (uint64_t *)(&desc[i]);\n-\t\t\tn = HNS3_RD_OTHER_STATS_NUM;\n-\t\t}\n-\n-\t\tfor (k = 0; k < n; k++) {\n-\t\t\t*data += rte_le_to_cpu_64(*desc_data);\n-\t\t\tdata++;\n-\t\t\tdesc_data++;\n-\t\t}\n+\tstats_iterms = RTE_MIN(sizeof(hw->mac_stats) / sizeof(uint64_t),\n+\t\t\t hw->mac_stats_reg_num);\n+\tdesc_data = (uint64_t *)(&desc[0].data[0]);\n+\tfor (i = 0; i < stats_iterms; i++) {\n+\t\t/*\n+\t\t * Data memory is continuous and only the first descriptor has a\n+\t\t * header in this command.\n+\t\t */\n+\t\t*data += rte_le_to_cpu_64(*desc_data);\n+\t\tdata++;\n+\t\tdesc_data++;\n \t}\n \trte_free(desc);\n \n \treturn 0;\n }\n \n-/*\n- * Query Mac stat reg num command ,opcode id: 0x0033.\n- * This command is used before send 'query_mac_stat command', the descriptor\n- * number of 'query_mac_stat command' must match with reg_num in this command.\n- * @praram rte_stats\n- * Pointer to structure rte_eth_stats.\n- * @return\n- * 0 on success.\n- */\n static int\n-hns3_mac_query_reg_num(struct rte_eth_dev *dev, uint32_t *desc_num)\n+hns3_mac_query_reg_num(struct hns3_hw *hw, uint32_t *reg_num)\n {\n-\tstruct hns3_adapter *hns = dev->data->dev_private;\n-\tstruct hns3_hw *hw = &hns->hw;\n+#define HNS3_MAC_STATS_RSV_REG_NUM_ON_HIP08_B\t3\n \tstruct hns3_cmd_desc desc;\n-\tuint32_t *desc_data;\n-\tuint32_t reg_num;\n \tint ret;\n \n \thns3_cmd_setup_basic_desc(&desc, HNS3_OPC_QUERY_MAC_REG_NUM, true);\n \tret = hns3_cmd_send(hw, &desc, 1);\n-\tif (ret)\n+\tif (ret) {\n+\t\thns3_err(hw, \"failed to query MAC statistic reg number, ret = %d\",\n+\t\t\t ret);\n \t\treturn ret;\n+\t}\n \n-\t/*\n-\t * The num of MAC statistics registers that are provided by IMP in this\n-\t * version.\n-\t */\n-\tdesc_data = (uint32_t *)(&desc.data[0]);\n-\treg_num = rte_le_to_cpu_32(*desc_data);\n+\t/* The number of MAC statistics registers are provided by firmware. */\n+\t*reg_num = rte_le_to_cpu_32(desc.data[0]);\n+\tif (*reg_num == 0) {\n+\t\thns3_err(hw, \"MAC statistic reg number is invalid!\");\n+\t\treturn -ENODATA;\n+\t}\n \n \t/*\n-\t * The descriptor number of 'query_additional_mac_stat command' is\n-\t * '1 + (reg_num-3)/4 + ((reg_num-3)%4 !=0)';\n-\t * This value is 83 in this version\n+\t * If driver doesn't request the firmware to report more MAC statistics\n+\t * iterms and the total number of MAC statistics registers by using new\n+\t * method, firmware will only reports the number of valid statistics\n+\t * registers. However, structure hns3_mac_stats in driver contains valid\n+\t * and reserved statistics iterms. In this case, the total register\n+\t * number must be added to three reserved statistics registers.\n \t */\n-\t*desc_num = 1 + ((reg_num - 3) >> 2) +\n-\t\t (uint32_t)(((reg_num - 3) & 0x3) ? 1 : 0);\n+\t*reg_num += HNS3_MAC_STATS_RSV_REG_NUM_ON_HIP08_B;\n+\n+\treturn 0;\n+}\n+\n+int\n+hns3_query_mac_stats_reg_num(struct hns3_hw *hw)\n+{\n+\tuint32_t mac_stats_reg_num = 0;\n+\tint ret;\n+\n+\tret = hns3_mac_query_reg_num(hw, &mac_stats_reg_num);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\thw->mac_stats_reg_num = mac_stats_reg_num;\n+\tif (hw->mac_stats_reg_num > sizeof(hw->mac_stats) / sizeof(uint64_t))\n+\t\thns3_warn(hw, \"MAC stats reg number from firmware is greater than stats iterms in driver.\");\n \n \treturn 0;\n }\n@@ -408,15 +411,8 @@ hns3_query_update_mac_stats(struct rte_eth_dev *dev)\n {\n \tstruct hns3_adapter *hns = dev->data->dev_private;\n \tstruct hns3_hw *hw = &hns->hw;\n-\tuint32_t desc_num;\n-\tint ret;\n \n-\tret = hns3_mac_query_reg_num(dev, &desc_num);\n-\tif (ret == 0)\n-\t\tret = hns3_update_mac_stats(hw, desc_num);\n-\telse\n-\t\thns3_err(hw, \"Query mac reg num fail : %d\", ret);\n-\treturn ret;\n+\treturn hns3_update_mac_stats(hw);\n }\n \n static int\ndiff --git a/drivers/net/hns3/hns3_stats.h b/drivers/net/hns3/hns3_stats.h\nindex d1230f94cb..c81d351082 100644\n--- a/drivers/net/hns3/hns3_stats.h\n+++ b/drivers/net/hns3/hns3_stats.h\n@@ -5,11 +5,6 @@\n #ifndef _HNS3_STATS_H_\n #define _HNS3_STATS_H_\n \n-/* stats macro */\n-#define HNS3_MAC_CMD_NUM\t\t21\n-#define HNS3_RD_FIRST_STATS_NUM\t\t2\n-#define HNS3_RD_OTHER_STATS_NUM\t\t4\n-\n /* TQP stats */\n struct hns3_tqp_stats {\n \tuint64_t rcb_tx_ring_pktnum_rcd; /* Total num of transmitted packets */\n@@ -22,6 +17,7 @@ struct hns3_tqp_stats {\n struct hns3_mac_stats {\n \tuint64_t mac_tx_mac_pause_num;\n \tuint64_t mac_rx_mac_pause_num;\n+\tuint64_t rsv0;\n \tuint64_t mac_tx_pfc_pri0_pkt_num;\n \tuint64_t mac_tx_pfc_pri1_pkt_num;\n \tuint64_t mac_tx_pfc_pri2_pkt_num;\n@@ -58,7 +54,7 @@ struct hns3_mac_stats {\n \tuint64_t mac_tx_1519_2047_oct_pkt_num;\n \tuint64_t mac_tx_2048_4095_oct_pkt_num;\n \tuint64_t mac_tx_4096_8191_oct_pkt_num;\n-\tuint64_t rsv0;\n+\tuint64_t rsv1;\n \tuint64_t mac_tx_8192_9216_oct_pkt_num;\n \tuint64_t mac_tx_9217_12287_oct_pkt_num;\n \tuint64_t mac_tx_12288_16383_oct_pkt_num;\n@@ -85,7 +81,7 @@ struct hns3_mac_stats {\n \tuint64_t mac_rx_1519_2047_oct_pkt_num;\n \tuint64_t mac_rx_2048_4095_oct_pkt_num;\n \tuint64_t mac_rx_4096_8191_oct_pkt_num;\n-\tuint64_t rsv1;\n+\tuint64_t rsv2;\n \tuint64_t mac_rx_8192_9216_oct_pkt_num;\n \tuint64_t mac_rx_9217_12287_oct_pkt_num;\n \tuint64_t mac_rx_12288_16383_oct_pkt_num;\n@@ -168,5 +164,6 @@ int hns3_stats_reset(struct rte_eth_dev *dev);\n int hns3_tqp_stats_init(struct hns3_hw *hw);\n void hns3_tqp_stats_uninit(struct hns3_hw *hw);\n int hns3_update_imissed_stats(struct hns3_hw *hw, bool is_clear);\n+int hns3_query_mac_stats_reg_num(struct hns3_hw *hw);\n \n #endif /* _HNS3_STATS_H_ */\n", "prefixes": [ "3/6" ] }{ "id": 106648, "url": "