From 9437f113443158cb3bd8aa31c69e40de5ff6c3dc Mon Sep 17 00:00:00 2001 From: jiangheng Date: Mon, 5 Sep 2022 01:33:52 +0800 Subject: [PATCH] add tuple filter in conf to diff rss rule and tuple filter rule --- src/lstack/api/lstack_wrap.c | 2 +- src/lstack/core/lstack_cfg.c | 13 +++++ src/lstack/core/lstack_dpdk.c | 70 ++++++++++++------------- src/lstack/core/lstack_protocol_stack.c | 8 ++- src/lstack/include/lstack_cfg.h | 1 + src/lstack/include/lstack_ethdev.h | 1 - src/lstack/include/lstack_vdev.h | 1 - src/lstack/lstack.conf | 10 +++- src/lstack/netif/lstack_ethdev.c | 6 +-- src/lstack/netif/lstack_vdev.c | 5 +- 10 files changed, 68 insertions(+), 49 deletions(-) diff --git a/src/lstack/api/lstack_wrap.c b/src/lstack/api/lstack_wrap.c index ecde391..1fba81c 100644 --- a/src/lstack/api/lstack_wrap.c +++ b/src/lstack/api/lstack_wrap.c @@ -303,7 +303,7 @@ static inline int32_t do_listen(int32_t s, int32_t backlog) } int32_t ret; - if (use_ltran() && get_global_cfg_params()->listen_shadow == 0) { + if (get_global_cfg_params()->listen_shadow == 0) { ret = stack_single_listen(s, backlog); } else { ret = stack_broadcast_listen(s, backlog); diff --git a/src/lstack/core/lstack_cfg.c b/src/lstack/core/lstack_cfg.c index 72a3292..88f69e1 100644 --- a/src/lstack/core/lstack_cfg.c +++ b/src/lstack/core/lstack_cfg.c @@ -69,6 +69,7 @@ static int32_t parse_num_process(void); static int32_t parse_process_numa(void); static int32_t parse_process_index(void); static int32_t parse_seperate_sendrecv_args(void); +static int32_t parse_tuple_filter(void); static inline int32_t parse_int(void *arg, char * arg_string, int32_t default_val, int32_t min_val, int32_t max_val) @@ -120,6 +121,7 @@ static struct config_vector_t g_config_tbl[] = { { "num_process", parse_num_process }, { "process_numa", parse_process_numa }, { "process_idx", parse_process_index }, + { "tuple_filter", parse_tuple_filter }, { NULL, NULL } }; @@ -1030,3 +1032,14 @@ static int parse_process_index(void) return 0; } +static int parse_tuple_filter(void) +{ + parse_int(&g_config_params.tuple_filter, "tuple_filter", 0, 0, 1); + if (g_config_params.tuple_filter == 0) { + return 0; + } + if (g_config_params.use_ltran || g_config_params.listen_shadow) { + return -EINVAL; + } + return 0; +} diff --git a/src/lstack/core/lstack_dpdk.c b/src/lstack/core/lstack_dpdk.c index 2463d3e..2ecfd1d 100644 --- a/src/lstack/core/lstack_dpdk.c +++ b/src/lstack/core/lstack_dpdk.c @@ -445,44 +445,44 @@ int32_t dpdk_ethdev_init(void) nb_queues = get_global_cfg_params()->tot_queue_num; } - struct protocol_stack_group *stack_group = get_protocol_stack_group(); + struct protocol_stack_group *stack_group = get_protocol_stack_group(); - int32_t port_id = ethdev_port_id(get_global_cfg_params()->mac_addr); - if (port_id < 0) { - return port_id; - } - get_global_cfg_params()->port_id = port_id; + int32_t port_id = ethdev_port_id(get_global_cfg_params()->mac_addr); + if (port_id < 0) { + return port_id; + } + get_global_cfg_params()->port_id = port_id; - struct rte_eth_dev_info dev_info; - int32_t ret = rte_eth_dev_info_get(port_id, &dev_info); - if (ret != 0) { - LSTACK_LOG(ERR, LSTACK, "get dev info ret=%d\n", ret); - return ret; - } + struct rte_eth_dev_info dev_info; + int32_t ret = rte_eth_dev_info_get(port_id, &dev_info); + if (ret != 0) { + LSTACK_LOG(ERR, LSTACK, "get dev info ret=%d\n", ret); + return ret; + } - int32_t max_queues = LWIP_MIN(dev_info.max_rx_queues, dev_info.max_tx_queues); - if (max_queues < nb_queues) { - LSTACK_LOG(ERR, LSTACK, "port_id %d max_queues=%d\n", port_id, max_queues); - return -EINVAL; - } + int32_t max_queues = LWIP_MIN(dev_info.max_rx_queues, dev_info.max_tx_queues); + if (max_queues < nb_queues) { + LSTACK_LOG(ERR, LSTACK, "port_id %d max_queues=%d\n", port_id, max_queues); + return -EINVAL; + } + + struct eth_params *eth_params = alloc_eth_params(port_id, nb_queues); + if (eth_params == NULL) { + return -ENOMEM; + } + eth_params_checksum(ð_params->conf, &dev_info); + int32_t rss_enable = 0; + if (!get_global_cfg_params()->tuple_filter) { + rss_enable = eth_params_rss(ð_params->conf, &dev_info); + } + stack_group->eth_params = eth_params; + stack_group->port_id = eth_params->port_id; + stack_group->rx_offload = eth_params->conf.rxmode.offloads; + stack_group->tx_offload = eth_params->conf.txmode.offloads; + /* used for tcp port alloc */ + stack_group->reta_mask = dev_info.reta_size - 1; + stack_group->nb_queues = nb_queues; - struct eth_params *eth_params = alloc_eth_params(port_id, nb_queues); - if (eth_params == NULL) { - return -ENOMEM; - } - eth_params_checksum(ð_params->conf, &dev_info); - int32_t rss_enable = 0; - if (use_ltran()) { - rss_enable = eth_params_rss(ð_params->conf, &dev_info); - } - stack_group->eth_params = eth_params; - stack_group->port_id = eth_params->port_id; - stack_group->rx_offload = eth_params->conf.rxmode.offloads; - stack_group->tx_offload = eth_params->conf.txmode.offloads; - /* used for tcp port alloc */ - stack_group->reta_mask = dev_info.reta_size - 1; - stack_group->nb_queues = nb_queues; - if (get_global_cfg_params()->is_primary) { for (uint32_t i = 0; i < stack_group->stack_num; i++) { struct protocol_stack *stack = stack_group->stacks[i]; @@ -512,7 +512,7 @@ int32_t dpdk_ethdev_init(void) return ret; } - if (rss_enable && use_ltran()) { + if (rss_enable && !get_global_cfg_params()->tuple_filter) { rss_setup(port_id, nb_queues); stack_group->reta_mask = dev_info.reta_size - 1; } diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c index 5811b26..4be981a 100644 --- a/src/lstack/core/lstack_protocol_stack.c +++ b/src/lstack/core/lstack_protocol_stack.c @@ -132,10 +132,10 @@ struct protocol_stack *get_bind_protocol_stack(void) int min_conn_num = GAZELLE_MAX_CLIENTS; /* close listen shadow, per app communication thread select only one stack */ - if (use_ltran() && get_global_cfg_params()->listen_shadow == 0) { + if (get_global_cfg_params()->listen_shadow == 0) { static _Atomic uint16_t stack_index = 0; - index = atomic_fetch_add(&stack_index, 1); - if (index >= stack_group->stack_num) { + index = atomic_fetch_add(&stack_index, 1); + if (index >= stack_group->stack_num) { LSTACK_LOG(ERR, LSTACK, "thread =%hu larger than stack num = %hu\n", index, stack_group->stack_num); return NULL; } @@ -645,8 +645,6 @@ int32_t init_protocol_stack(void) struct sys_thread *thread = sys_thread_new(name, libnet_listen_thread, (void*)(&stack_group->sem_listen_thread), 0, 0); free(thread); sem_wait(&stack_group->sem_listen_thread); - - create_flow_rule_map(); } if (get_init_fail()) { diff --git a/src/lstack/include/lstack_cfg.h b/src/lstack/include/lstack_cfg.h index 942c0b7..5f8e6b3 100644 --- a/src/lstack/include/lstack_cfg.h +++ b/src/lstack/include/lstack_cfg.h @@ -103,6 +103,7 @@ struct cfg_params { char unix_socket_filename[NAME_MAX]; uint16_t send_ring_size; bool expand_send_ring; + bool tuple_filter; }; struct cfg_params *get_global_cfg_params(void); diff --git a/src/lstack/include/lstack_ethdev.h b/src/lstack/include/lstack_ethdev.h index 25f5b8e..39a972d 100644 --- a/src/lstack/include/lstack_ethdev.h +++ b/src/lstack/include/lstack_ethdev.h @@ -45,7 +45,6 @@ int32_t gazelle_eth_dev_poll(struct protocol_stack *stack, uint8_t use_ltran_fla void eth_dev_recv(struct rte_mbuf *mbuf, struct protocol_stack *stack); int recv_pkts_from_other_process(int process_index, void* arg); -void create_flow_rule_map(); void kni_handle_rx(uint16_t port_id); void delete_user_process_port(uint16_t dst_port, enum port_type type); void add_user_process_port(uint16_t dst_port, uint8_t process_idx, enum port_type type); diff --git a/src/lstack/include/lstack_vdev.h b/src/lstack/include/lstack_vdev.h index 0995277..540a31a 100644 --- a/src/lstack/include/lstack_vdev.h +++ b/src/lstack/include/lstack_vdev.h @@ -22,7 +22,6 @@ void vdev_dev_ops_init(struct lstack_dev_ops *dev_ops); int vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple); int recv_pkts_from_other_process(int process_index, void* arg); -void create_flow_rule_map(); void transfer_delete_rule_info_to_process0(uint32_t dst_ip, uint16_t src_port, uint16_t dst_port); void transfer_create_rule_info_to_process0(uint16_t queue_id, uint32_t src_ip, uint32_t dst_ip, uint16_t src_port, uint16_t dst_port); void transfer_add_or_delete_listen_port_to_process0(uint16_t listen_port, uint8_t process_idx, uint8_t is_add); diff --git a/src/lstack/lstack.conf b/src/lstack/lstack.conf index 389a81c..64a2f42 100644 --- a/src/lstack/lstack.conf +++ b/src/lstack/lstack.conf @@ -50,6 +50,14 @@ mask_addr="255.255.255.0" gateway_addr="192.168.1.1" devices="aa:bb:cc:dd:ee:ff" -num_process=2 +#0: use rss rule +#1: use tcp tuple rule to specify packet to nic queue +tuple_filter=0 + +#tuple_filter=1, below cfg valid +num_process=1 process_numa="0,1" process_idx=0 + +#tuple_filer=0, below cfg valid +listen_shadow=0 diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c index 5032b5b..5ec211d 100644 --- a/src/lstack/netif/lstack_ethdev.c +++ b/src/lstack/netif/lstack_ethdev.c @@ -530,7 +530,6 @@ int recv_pkts_from_other_process(int process_index, void* arg){ parse_arp_and_transefer(buf); }else if(n == TRANSFER_TCP_MUBF_LEN) { /* tcp. lstack_mbuf_queue_id */ - printf("recv_pkts_from_other_process, process idx %d \n ", process_index); parse_tcp_and_transefer(buf); }else if (n == DELETE_FLOWS_PARAMS_LENGTH) { /* delete rule */ @@ -645,7 +644,6 @@ void kni_handle_tx(struct rte_mbuf *mbuf) ipv4_hdr->hdr_checksum = rte_ipv4_cksum(ipv4_hdr); } - // 发送到内核协议栈 if (!rte_kni_tx_burst(get_gazelle_kni(), &mbuf, 1)) { rte_pktmbuf_free(mbuf); } @@ -680,8 +678,8 @@ int32_t gazelle_eth_dev_poll(struct protocol_stack *stack, uint8_t use_ltran_fla transfer_arp_to_other_process(stack->pkts[i]); transfer_type = TRANSFER_KERNEL; } - }else { - if (!use_ltran_flag && stack->queue_id == 0) { + } else { + if (!use_ltran_flag && get_global_cfg_params()->tuple_filter && stack->queue_id == 0) { transfer_type = distribute_pakages(stack->pkts[i]); } } diff --git a/src/lstack/netif/lstack_vdev.c b/src/lstack/netif/lstack_vdev.c index 1752853..2a4c6ac 100644 --- a/src/lstack/netif/lstack_vdev.c +++ b/src/lstack/netif/lstack_vdev.c @@ -151,7 +151,7 @@ int32_t vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple) return -1; } - if (!use_ltran()) { + if (!use_ltran() & get_global_cfg_params()->tuple_filter) { if(type == REG_RING_TCP_LISTEN_CLOSE){ if (get_global_cfg_params()->is_primary) { delete_user_process_port(qtuple->src_port, PORT_LISTEN); @@ -190,6 +190,9 @@ int32_t vdev_reg_xmit(enum reg_ring_type type, struct gazelle_quintuple *qtuple) } return 0; } + if (!use_ltran()) { + return 0; + } int32_t ret; -- 2.23.0