get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/106648/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 106648,
    "url": "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"
    ]
}