加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0193-cfg-bond_slave_mac-support-pci-addr.patch 8.86 KB
一键复制 编辑 原始数据 按行查看 历史
From 61366e0a54935684ca3e17477c6367907285a5ff Mon Sep 17 00:00:00 2001
From: zhengjiebing <zhengjiebing_yewu@cmss.chinamobile.com>
Date: Mon, 17 Jun 2024 18:35:12 +0800
Subject: [PATCH] cfg: bond_slave_mac support pci addr
---
src/lstack/core/lstack_cfg.c | 35 +++++++++---------
src/lstack/core/lstack_dpdk.c | 63 ++++++++++++++++++++++++---------
src/lstack/include/lstack_cfg.h | 16 ++++++++-
3 files changed, 80 insertions(+), 34 deletions(-)
diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c
index 0e5fbf3..6ce862b 100644
--- a/src/lstack/core/lstack_cfg.c
+++ b/src/lstack/core/lstack_cfg.c
@@ -39,6 +39,7 @@
#define LSTACK_CONF_ENV "LSTACK_CONF_PATH"
#define NUMA_CPULIST_PATH "/sys/devices/system/node/node%u/cpulist"
#define DEV_MAC_LEN 17
+#define DEV_PCI_ADDR_LEN 12
#define CPUS_MAX_NUM 256
#define BOND_MIIMON_MIN 1
#define BOND_MIIMON_MAX INT_MAX
@@ -188,6 +189,21 @@ static int32_t str_to_eth_addr(const char *src, unsigned char *dst)
return 0;
}
+static int32_t str_to_dev_addr(const char *src, struct dev_addr *dst)
+{
+ int32_t ret = 0;
+ if (strlen(src) == DEV_PCI_ADDR_LEN) {
+ /* str to pci addr */
+ ret = rte_pci_addr_parse(src, &dst->addr.pci_addr);
+ dst->addr_type = DEV_ADDR_TYPE_PCI;
+ } else {
+ /* str to mac addr */
+ ret = str_to_eth_addr(src, dst->addr.mac_addr.addr_bytes);
+ dst->addr_type = DEV_ADDR_TYPE_MAC;
+ }
+ return ret;
+}
+
static int32_t parse_gateway_addr(void)
{
char *value;
@@ -1227,16 +1243,6 @@ static int32_t parse_bond_miimon(void)
return ret;
}
-static bool validate_bond_mac(uint8_t *mac_addr, struct rte_ether_addr *bond_slave_mac, int num_slaves)
-{
- for (int i = 0; i < num_slaves; i++) {
- if (memcmp(mac_addr, bond_slave_mac[i].addr_bytes, ETHER_ADDR_LEN) == 0) {
- return true;
- }
- }
- return false;
-}
-
static int32_t parse_bond_slave_mac(void)
{
if (g_config_params.bond_mode == -1) {
@@ -1269,7 +1275,8 @@ static int32_t parse_bond_slave_mac(void)
free(bond_slave_mac_tmp);
return -EINVAL;
}
- ret = str_to_eth_addr(mac_addr, g_config_params.bond_slave_mac_addr[k].addr_bytes);
+
+ ret = str_to_dev_addr(mac_addr, &g_config_params.bond_slave_addr[k]);
if (ret != 0) {
LSTACK_PRE_LOG(LSTACK_ERR, "cfg: invalid device name %s ret=%d.\n", mac_addr, ret);
free(bond_slave_mac_tmp);
@@ -1279,12 +1286,6 @@ static int32_t parse_bond_slave_mac(void)
k = k + 1;
}
free(bond_slave_mac_tmp);
- if (g_config_params.bond_mode == BONDING_MODE_ACTIVE_BACKUP) {
- if (!validate_bond_mac(g_config_params.mac_addr, g_config_params.bond_slave_mac_addr, GAZELLE_MAX_BOND_NUM)) {
- LSTACK_PRE_LOG(LSTACK_ERR, "cfg: devices must be in bond_slave_mac for BONDING_MODE_ACTIVE_BACKUP.\n");
- return -EINVAL;
- }
- }
return ret;
}
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index 07fffe9..785431f 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -372,6 +372,23 @@ static int32_t ethdev_port_id(uint8_t *mac)
return port_id;
}
+static int32_t pci_to_port_id(struct rte_pci_addr *pci_addr)
+{
+ uint16_t port_id;
+ char device_name[RTE_DEV_NAME_MAX_LEN] = "";
+
+ rte_pci_device_name(pci_addr, device_name, RTE_DEV_NAME_MAX_LEN);
+
+ int ret = rte_eth_dev_get_port_by_name(device_name, &port_id);
+ if (ret < 0) {
+ LSTACK_LOG(ERR, LSTACK, "match failed: no NIC matches cfg:%04x:%02x:%02x.%x\n",
+ pci_addr->domain, pci_addr->bus, pci_addr->devid, pci_addr->function);
+ return -EINVAL;
+ }
+
+ return port_id;
+}
+
static int eth_params_rss(struct rte_eth_conf *conf, struct rte_eth_dev_info *dev_info)
{
int rss_enable = 0;
@@ -491,18 +508,25 @@ static void rss_setup(const int port_id, const uint16_t nb_queues)
free(reta_conf);
}
-int32_t dpdk_bond_primary_set(int port_id, int slave_port_id)
+int32_t dpdk_bond_primary_set(int port_id, int *slave_port_id)
{
int32_t primary_port_id = ethdev_port_id(get_global_cfg_params()->mac_addr);
- if (slave_port_id == primary_port_id) {
- int32_t ret = rte_eth_bond_primary_set(port_id, primary_port_id);
- if (ret != 0) {
- LSTACK_LOG(ERR, LSTACK, "dpdk set bond primary port failed ret = %d\n", ret);
- return -1;
+ if (primary_port_id < 0) {
+ LSTACK_LOG(ERR, LSTACK, "cannot get the port id of the cfg\n");
+ return -1;
+ }
+ for (int i = 0; i < GAZELLE_MAX_BOND_NUM; i++) {
+ if (slave_port_id[i] == primary_port_id) {
+ int32_t ret = rte_eth_bond_primary_set(port_id, primary_port_id);
+ if (ret != 0) {
+ LSTACK_LOG(ERR, LSTACK, "dpdk set bond primary port failed ret = %d\n", ret);
+ return -1;
+ }
+ return ret;
}
- return ret;
}
- return 0;
+ LSTACK_LOG(ERR, LSTACK, "cfg: devices must be in bond_slave_mac for BONDING_MODE_ACTIVE_BACKUP.\n");
+ return -1;
}
int32_t dpdk_ethdev_init(int port_id)
@@ -687,12 +711,17 @@ static int dpdk_bond_create(uint8_t mode, int *slave_port_id, int count)
LSTACK_LOG(ERR, LSTACK, "bond add slave devices failed, ret=%d\n", ret);
return -1;
}
- if (cfg->bond_mode == BONDING_MODE_ACTIVE_BACKUP) {
- dpdk_bond_primary_set(port_id, slave_port_id[i]);
+ }
+
+ if (cfg->bond_mode == BONDING_MODE_ACTIVE_BACKUP) {
+ ret = dpdk_bond_primary_set(port_id, slave_port_id);
+ if (ret != 0) {
+ LSTACK_LOG(ERR, LSTACK, "dpdk set bond primary port failed ret = %d\n", ret);
+ return -1;
}
}
- if (get_global_cfg_params()->bond_mode == BONDING_MODE_8023AD) {
+ if (cfg->bond_mode == BONDING_MODE_8023AD) {
ret = rte_eth_bond_8023ad_dedicated_queues_enable(port_id);
if (ret < 0) {
LSTACK_LOG(ERR, LSTACK, "dpdk enable 8023 dedicated queues failed ret = %d\n", ret);
@@ -717,8 +746,7 @@ static int dpdk_bond_create(uint8_t mode, int *slave_port_id, int count)
return -1;
}
- if ((get_global_cfg_params()->bond_mode == BONDING_MODE_8023AD) ||
- (get_global_cfg_params()->bond_mode == BONDING_MODE_ALB)) {
+ if ((cfg->bond_mode == BONDING_MODE_8023AD) || (cfg->bond_mode == BONDING_MODE_ALB)) {
for (int i = 0; i < count; i++) {
/* bond port promiscuous only enable primary port */
/* we enable all ports */
@@ -742,17 +770,20 @@ static int dpdk_bond_create(uint8_t mode, int *slave_port_id, int count)
int32_t init_dpdk_ethdev(void)
{
int32_t ret;
- int slave_port_id[GAZELLE_MAX_BOND_NUM];
+ int slave_port_id[GAZELLE_MAX_BOND_NUM] = {-1};
int port_id;
struct cfg_params *cfg = get_global_cfg_params();
int i;
if (cfg->bond_mode >= 0) {
for (i = 0; i < GAZELLE_MAX_BOND_NUM; i++) {
- if (rte_is_zero_ether_addr(&cfg->bond_slave_mac_addr[i])) {
+ if (cfg->bond_slave_addr[i].addr_type == DEV_ADDR_TYPE_EMPTY) {
break;
+ } else if (cfg->bond_slave_addr[i].addr_type == DEV_ADDR_TYPE_MAC) {
+ slave_port_id[i] = ethdev_port_id(cfg->bond_slave_addr[i].addr.mac_addr.addr_bytes);
+ } else {
+ slave_port_id[i] = pci_to_port_id(&cfg->bond_slave_addr[i].addr.pci_addr);
}
- slave_port_id[i] = ethdev_port_id(cfg->bond_slave_mac_addr[i].addr_bytes);
ret = dpdk_ethdev_init(slave_port_id[i]);
if (ret < 0) {
LSTACK_LOG(ERR, LSTACK, "slave port(%d) init failed, ret=%d\n", slave_port_id[i], ret);
diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h
index 94878de..21d9d83 100644
--- a/src/lstack/include/lstack_cfg.h
+++ b/src/lstack/include/lstack_cfg.h
@@ -16,6 +16,8 @@
#include <lwip/ip_addr.h>
#include <rte_ether.h>
+#include <rte_pci.h>
+#include <rte_bus_pci.h>
#include "lstack_protocol_stack.h"
#include "gazelle_opt.h"
@@ -52,6 +54,18 @@
#define LSTACK_LPM_PKTS_IN_DETECT_MIN 5
#define LSTACK_LPM_PKTS_IN_DETECT_MAX 65535
+#define DEV_ADDR_TYPE_EMPTY 0
+#define DEV_ADDR_TYPE_MAC 1
+#define DEV_ADDR_TYPE_PCI 2
+
+struct dev_addr {
+ uint8_t addr_type; // 0:empty, 1:mac, 2:pci
+ union addr_union {
+ struct rte_ether_addr mac_addr;
+ struct rte_pci_addr pci_addr;
+ } addr;
+};
+
struct secondary_attach_arg {
uint8_t socket_num;
uint64_t socket_size;
@@ -114,7 +128,7 @@ struct cfg_params {
bool tuple_filter;
int8_t bond_mode;
int32_t bond_miimon;
- struct rte_ether_addr bond_slave_mac_addr[GAZELLE_MAX_BOND_NUM];
+ struct dev_addr bond_slave_addr[GAZELLE_MAX_BOND_NUM];
bool use_sockmap;
bool udp_enable;
struct cfg_nic_params nic;
--
2.33.0
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化