From 261fdd1cc832989c60b3940cd8b2aa6593bc94ea Mon Sep 17 00:00:00 2001 From: Yuyu Li Date: Tue, 12 Nov 2024 20:17:06 +0800 Subject: [PATCH 25/27] Fix the logic of obtaining statistics on flow control storm suppression Previously, regardless of the direction specified by -d, FW would return the statistics of flow control storm suppression in both directions. Now it only returns the statistic in the specified direction. An example is shown: hikptool nic_qos -i eth6 -g pfc_storm_para -d rx before: PFC STORM Information: direction: rx enabled: on period: 2000ms pfc threshold: 1000ms recovery period: 500ms rx storm suppression count: 14 after: PFC STORM Information: direction: rx enabled: on period: 2000ms pfc threshold: 1000ms recovery period: 500ms storm count: 14 Signed-off-by: Yuyu Li --- net/nic/nic_qos/hikp_nic_qos.c | 32 ++++++++++++++++++++++---------- net/nic/nic_qos/hikp_nic_qos.h | 14 +++++++++----- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/net/nic/nic_qos/hikp_nic_qos.c b/net/nic/nic_qos/hikp_nic_qos.c index 81eb0ba..32f251e 100644 --- a/net/nic/nic_qos/hikp_nic_qos.c +++ b/net/nic/nic_qos/hikp_nic_qos.c @@ -56,7 +56,8 @@ static int hikp_nic_qos_cmd_help(struct major_cmd_ctrl *self, const char *argv) static void hikp_nic_qos_show_pkt_buf(const void *data) { - struct nic_pkt_buf_info *pkt_buf = (struct nic_pkt_buf_info *)data; + struct qos_cmd_info *qos_info_pkt = (struct qos_cmd_info *)data; + struct nic_pkt_buf_info *pkt_buf = (struct nic_pkt_buf_info *)&qos_info_pkt->info; struct nic_shared_buf *share_buf = &pkt_buf->share_buf; struct nic_priv_buf *priv_buf = pkt_buf->priv_buf; uint16_t tc_no; @@ -88,11 +89,12 @@ static void hikp_nic_qos_show_pkt_buf(const void *data) static void hikp_nic_qos_show_dcb_info(const void *data) { - struct nic_dcb_info *dcb = (struct nic_dcb_info *)data; + struct qos_cmd_info *qos_info_dcb = (struct qos_cmd_info *)data; + struct nic_dcb_info *dcb = (struct nic_dcb_info *)&qos_info_dcb->info; struct nic_pfc_info *pfc = &dcb->pfc; struct nic_ets_info *ets = &dcb->ets; - uint16_t up; uint16_t tc_no; + uint16_t up; printf("PFC configuration\n"); printf(" PFC enable:"); @@ -125,7 +127,8 @@ static void hikp_nic_qos_show_dcb_info(const void *data) static void hikp_nic_qos_show_pause_info(const void *data) { - struct nic_pause_info *pause = (struct nic_pause_info *)data; + struct qos_cmd_info *qos_info_pause = (struct qos_cmd_info *)data; + struct nic_pause_info *pause = (struct nic_pause_info *)&qos_info_pause->info; printf("PAUSE Information\n"); if (pause->type == HIKP_NONE_PAUSE) @@ -143,8 +146,10 @@ static void hikp_nic_qos_show_pause_info(const void *data) static void hikp_nic_qos_show_pfc_storm_para(const void *data) { + struct qos_cmd_info *qos_info_pfc = (struct qos_cmd_info *)data; struct nic_pfc_storm_para *pfc_storm_para = - (struct nic_pfc_storm_para *)data; + (struct nic_pfc_storm_para *)&qos_info_pfc->info; + uint32_t length = qos_info_pfc->length; printf("PFC STORM Information:\n"); printf("direction: %s\n", pfc_storm_para->dir ? "tx" : "rx"); @@ -155,6 +160,11 @@ static void hikp_nic_qos_show_pfc_storm_para(const void *data) printf("check times: %u\n", pfc_storm_para->times) : printf("pfc threshold: %ums\n", pfc_storm_para->times); printf("recovery period: %ums\n", pfc_storm_para->recovery_period_ms); + + if (length < sizeof(struct nic_pfc_storm_para)) + return; + + printf("storm count: %u\n", pfc_storm_para->storm_count); } static int hikp_nic_qos_get_blk(struct hikp_cmd_header *req_header, @@ -192,11 +202,11 @@ out: } static int hikp_nic_query_qos_feature(struct hikp_cmd_header *req_header, const struct bdf_t *bdf, - union nic_qos_feature_info *data) + struct qos_cmd_info *qcmd_info) { + size_t buf_len = sizeof(qcmd_info->info); struct nic_qos_rsp_head rsp_head = {0}; struct nic_qos_req_para req_data; - size_t buf_len = sizeof(*data); uint32_t total_blk_size; uint8_t total_blk_num; uint8_t blk_id = 0; @@ -207,7 +217,7 @@ static int hikp_nic_query_qos_feature(struct hikp_cmd_header *req_header, const req_data.block_id = blk_id; req_data.dir = g_qos_param.dir; - ret = hikp_nic_qos_get_blk(req_header, &req_data, data, buf_len, &rsp_head); + ret = hikp_nic_qos_get_blk(req_header, &req_data, &qcmd_info->info, buf_len, &rsp_head); if (ret != 0) return ret; @@ -220,13 +230,15 @@ static int hikp_nic_query_qos_feature(struct hikp_cmd_header *req_header, const req_data.dir = g_qos_param.dir; ret = hikp_nic_qos_get_blk(req_header, &req_data, - (uint8_t *)data + total_blk_size, + (uint8_t *)&qcmd_info->info + total_blk_size, buf_len - total_blk_size, &rsp_head); if (ret != 0) return ret; total_blk_size += rsp_head.cur_blk_size; } + qcmd_info->length = total_blk_size; + return ret; } @@ -234,9 +246,9 @@ static void hikp_nic_qos_cmd_execute(struct major_cmd_ctrl *self) { char *revision_id = g_qos_param.revision_id; struct bdf_t *bdf = &g_qos_param.target.bdf; - union nic_qos_feature_info qos_data = {0}; struct hikp_cmd_header req_header = {0}; const struct qos_feature_cmd *qos_cmd; + struct qos_cmd_info qos_data = {0}; int ret; if (bdf->dev_id != 0) { diff --git a/net/nic/nic_qos/hikp_nic_qos.h b/net/nic/nic_qos/hikp_nic_qos.h index d55970a..77fbdd9 100644 --- a/net/nic/nic_qos/hikp_nic_qos.h +++ b/net/nic/nic_qos/hikp_nic_qos.h @@ -57,6 +57,7 @@ struct nic_pfc_storm_para { uint32_t period_ms; uint32_t times; uint32_t recovery_period_ms; + uint32_t storm_count; }; struct nic_ets_info { @@ -87,11 +88,14 @@ struct nic_pause_info { uint16_t rsv; }; -union nic_qos_feature_info { - struct nic_pkt_buf_info pkt_buf; - struct nic_dcb_info dcb; - struct nic_pause_info pause; - struct nic_pfc_storm_para pfc_storm_para; +struct qos_cmd_info { + uint32_t length; + union nic_qos_feature_info { + struct nic_pkt_buf_info pkt_buf; + struct nic_dcb_info dcb; + struct nic_pause_info pause; + struct nic_pfc_storm_para pfc_storm_para; + } info; }; struct nic_qos_rsp_head { -- 2.45.0.windows.1