Projects
openEuler:C
gazelle
_service:tar_scm:0164-dfx-support-get-nic-bond-...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:0164-dfx-support-get-nic-bond-status.patch of Package gazelle
From 819f74f014592b8af93eb45fd13681caa2cb662a Mon Sep 17 00:00:00 2001 From: zhangmengxuan <zhangmengxuan@kylinos.cn> Date: Thu, 28 Mar 2024 21:24:05 +0800 Subject: [PATCH] dfx: support get nic bond status --- src/common/gazelle_dfx_msg.h | 9 +++++++++ src/lstack/core/lstack_dpdk.c | 27 +++++++++++++++++++++++++++ src/ltran/ltran_dfx.c | 14 ++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/src/common/gazelle_dfx_msg.h b/src/common/gazelle_dfx_msg.h index d7ba80f..4929ae7 100644 --- a/src/common/gazelle_dfx_msg.h +++ b/src/common/gazelle_dfx_msg.h @@ -256,15 +256,24 @@ struct gazelle_stat_low_power_info { #define RTE_ETH_XSTATS_NAME_SIZE 64 #define RTE_ETH_XSTATS_MAX_LEN 256 +#define RTE_MAX_ETHPORTS 32 struct nic_eth_xstats_name { char name[RTE_ETH_XSTATS_NAME_SIZE]; }; +struct bonding { + int8_t mode; + int32_t miimon; + uint16_t primary_port_id; + uint16_t slaves[RTE_MAX_ETHPORTS]; +}; + struct nic_eth_xstats { struct nic_eth_xstats_name xstats_name[RTE_ETH_XSTATS_MAX_LEN]; uint64_t values[RTE_ETH_XSTATS_MAX_LEN]; uint32_t len; uint16_t port_id; + struct bonding bonding; }; struct nic_eth_features { diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c index a774d45..cd87026 100644 --- a/src/lstack/core/lstack_dpdk.c +++ b/src/lstack/core/lstack_dpdk.c @@ -870,6 +870,31 @@ static int dpdk_nic_xstats_name_get(struct nic_eth_xstats_name *names, uint16_t return len; } +void dpdk_nic_bond_xstats_get(struct gazelle_stack_dfx_data *dfx, uint16_t port_id, uint16_t *slaves, int count) +{ + dfx->data.nic_xstats.bonding.mode = rte_eth_bond_mode_get(port_id); + if (dfx->data.nic_xstats.bonding.mode < 0) { + LSTACK_LOG(ERR, LSTACK, "rte_eth_bond_mode_get failed.\n"); + return; + } + + dfx->data.nic_xstats.bonding.primary_port_id = rte_eth_bond_primary_get(port_id); + if (dfx->data.nic_xstats.bonding.primary_port_id < 0) { + LSTACK_LOG(ERR, LSTACK, "rte_eth_bond_primary_get failed.\n"); + return; + } + + dfx->data.nic_xstats.bonding.miimon = rte_eth_bond_link_monitoring_get(port_id); + if (dfx->data.nic_xstats.bonding.miimon <= 0) { + LSTACK_LOG(ERR, LSTACK, "rte_eth_bond_link_monitoring_get failed.\n"); + return; + } + + for (int i = 0; i < count; i++) { + dfx->data.nic_xstats.bonding.slaves[i] = slaves[i]; + } +} + void dpdk_nic_xstats_get(struct gazelle_stack_dfx_data *dfx, uint16_t port_id) { struct rte_eth_dev_info dev_info; @@ -878,6 +903,7 @@ void dpdk_nic_xstats_get(struct gazelle_stack_dfx_data *dfx, uint16_t port_id) dfx->data.nic_xstats.len = -1; dfx->data.nic_xstats.port_id = port_id; + dfx->data.nic_xstats.bonding.mode = -1; ret = rte_eth_dev_info_get(port_id, &dev_info); if (ret < 0) { LSTACK_LOG(ERR, LSTACK, "rte_eth_dev_info_get failed.\n"); @@ -904,6 +930,7 @@ void dpdk_nic_xstats_get(struct gazelle_stack_dfx_data *dfx, uint16_t port_id) if (dpdk_nic_xstats_value_get(dfx->data.nic_xstats.values, len, slaves, slave_count) != 0) { return; } + dpdk_nic_bond_xstats_get(dfx, port_id, slaves, slave_count); } else { len = dpdk_nic_xstats_name_get(dfx->data.nic_xstats.xstats_name, port_id); if (len <= 0) { diff --git a/src/ltran/ltran_dfx.c b/src/ltran/ltran_dfx.c index 073dfa7..88d11bd 100644 --- a/src/ltran/ltran_dfx.c +++ b/src/ltran/ltran_dfx.c @@ -200,6 +200,20 @@ static void gazelle_print_lstack_xstats(void *buf, const struct gazelle_stat_msg struct nic_eth_xstats *xstats = &stat->data.nic_xstats; static const char *nic_stats_border = "########################"; + if (xstats->bonding.mode >= 0) { + printf("############# NIC bonding mode display #############\n"); + printf("%s############################\n", nic_stats_border); + printf("Bonding modeļ¼ [%d]\n", xstats->bonding.mode); + printf("Bonding miimon: [%d]\n", xstats->bonding.miimon); + printf("Slaves(%d): [", xstats->port_id); + for (int i = 0; i < xstats->port_id - 1; i++) { + printf("%d ", xstats->bonding.slaves[i]); + } + printf("%d]\n", xstats->bonding.slaves[xstats->port_id - 1]); + printf("Primary: [%d]\n", xstats->bonding.primary_port_id); + printf("%s############################\n", nic_stats_border); + } + printf("###### NIC extended statistics for port %-2d #########\n", xstats->port_id); printf("%s############################\n", nic_stats_border); if (xstats->len <= 0 || xstats->len > RTE_ETH_XSTATS_MAX_LEN) { -- 2.33.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.