diff options
| author | songyanchao <[email protected]> | 2023-12-26 07:13:50 +0000 |
|---|---|---|
| committer | songyanchao <[email protected]> | 2024-01-05 02:27:42 +0000 |
| commit | e152f65e9fe68ce5bb6f375ed1d4afa86992d312 (patch) | |
| tree | 3dcd988670124fef48302b74be7c2a771e40bb7e | |
| parent | f19e5a4fdc6e089cedf7c7de92f22a018b950c0d (diff) | |
✨ feat(TSG-17959): Add link db handling process for Tera node.
Add link db handling process for Tera node.
| -rw-r--r-- | infra/test/TestPortAdapterMapping.cc | 36 | ||||
| -rw-r--r-- | service/src/node_tera.c | 67 | ||||
| -rw-r--r-- | test/tera_test.py | 4 |
3 files changed, 86 insertions, 21 deletions
diff --git a/infra/test/TestPortAdapterMapping.cc b/infra/test/TestPortAdapterMapping.cc index 2a82b8c..80e9ca3 100644 --- a/infra/test/TestPortAdapterMapping.cc +++ b/infra/test/TestPortAdapterMapping.cc @@ -28,6 +28,12 @@ TEST_F(TestPortAdapterMapping, InsertOne) { ASSERT_EQ(port_adapter_mapping_insert(0, ADAPTER_TYPE_EF), 0); ASSERT_EQ(port_adapter_mapping_match(0), ADAPTER_TYPE_EF); + + ASSERT_EQ(port_adapter_mapping_insert(1, ADAPTER_TYPE_VWIRE), 0); + ASSERT_EQ(port_adapter_mapping_match(1), ADAPTER_TYPE_VWIRE); + + ASSERT_EQ(port_adapter_mapping_insert(2, ADAPTER_TYPE_TERA), 0); + ASSERT_EQ(port_adapter_mapping_match(2), ADAPTER_TYPE_TERA); } /* Insert match and remove */ @@ -38,7 +44,20 @@ TEST_F(TestPortAdapterMapping, InsertMatchAndRemove) uint16_t free_capacity = port_adapter_mapping_capacity_get(); for (uint16_t i = 0; i < free_capacity; i++) { - enum adapter_type type = i % 2 ? ADAPTER_TYPE_EF : ADAPTER_TYPE_VWIRE; + enum adapter_type type; + if (i % 3 == 0) + { + type = ADAPTER_TYPE_EF; + } + else if (i % 3 == 1) + { + type = ADAPTER_TYPE_VWIRE; + } + else + { + type = ADAPTER_TYPE_TERA; + } + ASSERT_EQ(port_adapter_mapping_insert(i, type), 0); } @@ -47,7 +66,20 @@ TEST_F(TestPortAdapterMapping, InsertMatchAndRemove) for (uint16_t i = 0; i < free_capacity; i++) { - enum adapter_type type = i % 2 ? ADAPTER_TYPE_EF : ADAPTER_TYPE_VWIRE; + enum adapter_type type; + if (i % 3 == 0) + { + type = ADAPTER_TYPE_EF; + } + else if (i % 3 == 1) + { + type = ADAPTER_TYPE_VWIRE; + } + else + { + type = ADAPTER_TYPE_TERA; + } + ASSERT_EQ(port_adapter_mapping_match(i), type); } diff --git a/service/src/node_tera.c b/service/src/node_tera.c index d5c18c5..4be558b 100644 --- a/service/src/node_tera.c +++ b/service/src/node_tera.c @@ -3,6 +3,7 @@ #include <MESA_prof_load.h> #include <common.h> +#include <link_db.h> #include <port_adapter_mapping.h> #include <sc_common.h> #include <sc_node.h> @@ -28,7 +29,7 @@ enum tera_egress_next struct tera_adapter { uint8_t mac_flipping; - uint16_t adapter_id; + uint16_t tera_id; uint16_t vlan_couple[2]; struct mr_dev_desc * listen_device; }; @@ -40,7 +41,6 @@ struct tera_ingress_stats volatile uint64_t drop_for_no_match; volatile uint64_t drop_for_append_sid_err; volatile uint64_t to_classifier; - } __rte_cache_aligned; /* Tera egress stat struct */ @@ -56,8 +56,8 @@ struct node_tera_main uint32_t nr_sids; uint32_t sid_start; uint32_t sid_end; + struct link_db_ctx * link_db_ctx; struct tera_adapter * adapters; - } __rte_cache_min_aligned; static struct tera_ingress_stats tera_ingress_stats[RTE_MAX_LCORE]; @@ -82,8 +82,6 @@ int tera_adapter_id_check(uint32_t tera_adapter_id) return RT_SUCCESS; } -///////////////////////////////////////////////////////////////// - /* Tera config parse */ int tera_config_parse(struct sc_main * sc, struct node_tera_main * tera_main) { @@ -147,7 +145,7 @@ int tera_config_parse(struct sc_main * sc, struct node_tera_main * tera_main) adapter->vlan_couple[1] = htons((uint16_t)vlan_couple[1]); adapter->mac_flipping = (uint8_t)mac_flipping; adapter->listen_device = dev_desc; - adapter->adapter_id = nr_adapters; + adapter->tera_id = nr_adapters; nr_adapters++; } @@ -218,6 +216,16 @@ int tera_init(struct sc_main * sc) /* Dump the information */ tera_info_dump(tera_main); + /* Link db ctx create */ + uint32_t max_entries; + MESA_load_profile_uint_def(sc->local_cfgfile, "link_dbs", "max_rules", &max_entries, 32); + tera_main->link_db_ctx = link_db_create(LINK_DB_TYPE_TERA, max_entries); + if (tera_main->link_db_ctx == NULL) + return RT_ERR; + + if (link_db_config_parse(sc->local_cfgfile, tera_main->link_db_ctx) == RT_ERR) + return RT_ERR; + /* Init the stats */ memset(tera_ingress_stats, 0, sizeof(tera_ingress_stats)); memset(tera_egress_stats, 0, sizeof(tera_egress_stats)); @@ -226,8 +234,9 @@ int tera_init(struct sc_main * sc) } /* Tera adapter match */ -static __rte_always_inline struct tera_adapter * tera_adapter_match(struct node_tera_main * tera_main, uint16_t port_id, - uint16_t pkt_vlan_id, uint8_t * out_dir) +static inline __rte_always_inline struct tera_adapter * tera_adapter_match(struct node_tera_main * tera_main, + uint16_t port_id, uint16_t pkt_vlan_id, + uint8_t * out_dir) { for (int index = 0; index < tera_main->nr_adapters; index++) { @@ -239,11 +248,13 @@ static __rte_always_inline struct tera_adapter * tera_adapter_match(struct node_ if (adapter->vlan_couple[0] == pkt_vlan_id) { + /* i to e */ *out_dir = 0; return adapter; } else if (adapter->vlan_couple[1] == pkt_vlan_id) { + /* e to i */ *out_dir = 1; return adapter; } @@ -275,6 +286,13 @@ static __rte_always_inline uint16_t tera_ingress_node_process(struct rte_graph * pkts += 1; n_left_from -= 1; + /* Prefetch next mbuf */ + if (n_left_from > 0) + { + rte_prefetch0_write(pkts[0]); + rte_prefetch0_write(mrbuf_cz_data(pkts[0], MR_NODE_CTRLZONE_ID)); + } + struct mrb_metadata * mrb_meta = (struct mrb_metadata *)mrbuf_cz_data(mbuf, MR_NODE_CTRLZONE_ID); struct pkt_parser_result * parser_result = &mrb_meta->pkt_parser_result; @@ -315,16 +333,20 @@ static __rte_always_inline uint16_t tera_ingress_node_process(struct rte_graph * /* Update the vlan id */ vlan_hdr->vlan_tci = ((vlan_hdr->vlan_tci & 0x00F0) | prev_adapter->vlan_couple[(prev_dir + 1) % 2]); - /* Traffic link id lookup */ - // ###################### + /* Traffic link id match */ + uint16_t traffic_link_id; + struct link_db_match_field match_field; + match_field.tera_id = prev_adapter->tera_id; + link_db_match(g_tera_main->link_db_ctx, &match_field, 1, &traffic_link_id); /* Fill mrb_meta */ mrb_meta->adapter_type = ADAPTER_TYPE_TERA; - mrb_meta->adapter_id = prev_adapter->adapter_id; + mrb_meta->adapter_id = prev_adapter->tera_id; mrb_meta->dir = prev_dir; + mrb_meta->traffic_link_id = traffic_link_id; /* Insert sid */ - uint16_t sids[1] = {g_tera_main->sid_start + prev_adapter->adapter_id}; + uint16_t sids[1] = {g_tera_main->sid_start + prev_adapter->tera_id}; if (unlikely(sid_list_prepend(&mrb_meta->sid_list, sids, 1) == RT_ERR)) { stats.drop_for_append_sid_err++; @@ -391,7 +413,10 @@ static __rte_always_inline uint16_t tera_egress_node_process(struct rte_graph * struct rte_mbuf ** pkts = (struct rte_mbuf **)objs; /* Single Packet Processing */ + uint16_t prev_tera_id = UINT16_MAX; + uint16_t prev_port_id = UINT16_MAX; uint32_t sid_start = g_tera_main->sid_start; + while (n_left_from > 0) { struct rte_mbuf * mbuf = pkts[0]; @@ -405,14 +430,22 @@ static __rte_always_inline uint16_t tera_egress_node_process(struct rte_graph * rte_prefetch0_write(mrbuf_cz_data(pkts[0], MR_NODE_CTRLZONE_ID)); } - /* Get tera adapter item */ + /* Get tera id */ struct mrb_metadata * mrb_meta = (struct mrb_metadata *)mrbuf_cz_data(mbuf, MR_NODE_CTRLZONE_ID); - uint16_t tera_adapter_id = mrb_meta->cur_sid - sid_start; - assert(tera_adapter_id < g_tera_main->nr_adapters); - struct tera_adapter * tera_adapter = &g_tera_main->adapters[tera_adapter_id]; + uint16_t tera_id = mrb_meta->cur_sid - sid_start; + + assert(tera_id < g_tera_main->nr_adapters); + + if (prev_tera_id != tera_id) + { + struct tera_adapter * tera_adapter = &g_tera_main->adapters[tera_id]; + + prev_tera_id = tera_id; + prev_port_id = tera_adapter->listen_device->port_id; + } /* Fill port egress */ - mrb_meta->port_egress = tera_adapter->listen_device->port_id; + mrb_meta->port_egress = prev_port_id; } /* Update graph stat */ diff --git a/test/tera_test.py b/test/tera_test.py index c01bcd3..dc2de8c 100644 --- a/test/tera_test.py +++ b/test/tera_test.py @@ -93,8 +93,8 @@ class TestForDisableMacFlapping(BaseTest): mrzcpd = Mrzcpd(tera_disable_mac_flapping) mrzcpd.start() - send_pkt = simple_tcp_packet(vlan_vid=110, dl_vlan_enable=True) - exp_pkt = simple_tcp_packet(vlan_vid=111, dl_vlan_enable=True) + send_pkt = simple_tcp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110, dl_vlan_enable=True) + exp_pkt = simple_tcp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=111, dl_vlan_enable=True) send_packet(self, 0, send_pkt) verify_packets(self, exp_pkt, [0]) finally: |
