summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsongyanchao <[email protected]>2023-12-26 07:13:50 +0000
committersongyanchao <[email protected]>2024-01-05 02:27:42 +0000
commite152f65e9fe68ce5bb6f375ed1d4afa86992d312 (patch)
tree3dcd988670124fef48302b74be7c2a771e40bb7e
parentf19e5a4fdc6e089cedf7c7de92f22a018b950c0d (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.cc36
-rw-r--r--service/src/node_tera.c67
-rw-r--r--test/tera_test.py4
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: