代码拉取完成,页面将自动刷新
同步操作将从 src-openEuler/gazelle 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
From e55108b4f3ef13556075da292d1dc17a3335fb04 Mon Sep 17 00:00:00 2001
From: wu-changsheng <wuchangsheng2@huawei.com>
Date: Sat, 8 Oct 2022 17:57:40 +0800
Subject: [PATCH 17/21] conenct support multi queues
---
src/lstack/core/lstack_dpdk.c | 38 ++++++++++++++++++++--
src/lstack/include/lstack_dpdk.h | 1 +
src/lstack/include/lstack_protocol_stack.h | 2 ++
3 files changed, 39 insertions(+), 2 deletions(-)
diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c
index 8d45838..39f8ecf 100644
--- a/src/lstack/core/lstack_dpdk.c
+++ b/src/lstack/core/lstack_dpdk.c
@@ -27,6 +27,7 @@
#include <rte_bus.h>
#include <rte_errno.h>
#include <rte_kni.h>
+#include <rte_thash.h>
#include <lwip/posix_api.h>
#include <lwipopts.h>
#include <lwip/pbuf.h>
@@ -55,6 +56,15 @@ struct eth_params {
struct rte_kni;
static struct rte_bus *g_pci_bus = NULL;
+#define RSS_HASH_KEY_LEN 40
+static uint8_t g_default_rss_key[] = {
+ 0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2,
+ 0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0,
+ 0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4,
+ 0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c,
+ 0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa,
+};
+
int32_t thread_affinity_default(void)
{
static cpu_set_t cpuset;
@@ -327,8 +337,8 @@ static int eth_params_rss(struct rte_eth_conf *conf, struct rte_eth_dev_info *de
int rss_enable = 0;
uint64_t def_rss_hf = ETH_RSS_TCP | ETH_RSS_IP;
struct rte_eth_rss_conf rss_conf = {
- NULL,
- 40,
+ g_default_rss_key,
+ RSS_HASH_KEY_LEN,
def_rss_hf,
};
@@ -445,7 +455,9 @@ int32_t dpdk_ethdev_init(void)
if (rss_enable) {
rss_setup(port_id, nb_queues);
+ stack_group->reta_mask = dev_info.reta_size - 1;
}
+ stack_group->nb_queues = nb_queues;
return 0;
}
@@ -571,3 +583,25 @@ int32_t init_dpdk_ethdev(void)
sem_post(&stack_group->ethdev_init);
return 0;
}
+
+bool port_in_stack_queue(uint32_t src_ip, uint32_t dst_ip, uint16_t src_port, uint16_t dst_port)
+{
+ struct protocol_stack_group *stack_group = get_protocol_stack_group();
+ if (stack_group->reta_mask == 0 || stack_group->nb_queues <= 1) {
+ return true;
+ }
+
+ struct rte_ipv4_tuple tuple = {0};
+ tuple.src_addr = rte_be_to_cpu_32(src_ip);
+ tuple.dst_addr = rte_be_to_cpu_32(dst_ip);
+ tuple.sport = src_port;
+ tuple.dport = dst_port;
+
+ uint32_t hash = rte_softrss((uint32_t *)&tuple, RTE_THASH_V4_L4_LEN, g_default_rss_key);
+
+ uint32_t reta_index = hash & stack_group->reta_mask;
+
+ struct protocol_stack *stack = get_protocol_stack();
+ return (reta_index % stack_group->nb_queues) == stack->queue_id;
+}
+
diff --git a/src/lstack/include/lstack_dpdk.h b/src/lstack/include/lstack_dpdk.h
index e224f23..684d025 100644
--- a/src/lstack/include/lstack_dpdk.h
+++ b/src/lstack/include/lstack_dpdk.h
@@ -51,5 +51,6 @@ int dpdk_ethdev_start(void);
void dpdk_skip_nic_init(void);
int32_t dpdk_init_lstack_kni(void);
void dpdk_restore_pci(void);
+bool port_in_stack_queue(uint32_t src_ip, uint32_t dst_ip, uint16_t src_port, uint16_t dst_port);
#endif /* GAZELLE_DPDK_H */
diff --git a/src/lstack/include/lstack_protocol_stack.h b/src/lstack/include/lstack_protocol_stack.h
index 0a060b4..a791357 100644
--- a/src/lstack/include/lstack_protocol_stack.h
+++ b/src/lstack/include/lstack_protocol_stack.h
@@ -78,6 +78,8 @@ struct protocol_stack_group {
sem_t all_init;
uint64_t rx_offload;
uint64_t tx_offload;
+ uint32_t reta_mask;
+ uint16_t nb_queues;
struct rte_mempool *kni_pktmbuf_pool;
struct eth_params *eth_params;
struct protocol_stack *stacks[PROTOCOL_STACK_MAX];
--
2.23.0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。