summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsongyanchao <[email protected]>2023-12-14 08:28:19 +0000
committersongyanchao <[email protected]>2023-12-15 04:03:30 +0000
commitd50641cd11ae06ef246039d46764d1b1e173cdcb (patch)
treef955665eb36afd2886922b6368995f89a1af4393
parentbfbc182a7f0e7e5ce2ec41ae47392f287882f37b (diff)
✨ feat(TSG-17860): Add processing logic for traffic link id in etherfabric node.
Add processing logic for traffic link id in etherfabric node.
-rw-r--r--app/src/mrb.c10
-rw-r--r--include/external/marsio.h2
-rw-r--r--include/internal/mrb_define.h2
-rw-r--r--service/src/classifier_rule_parser.c2
-rw-r--r--service/src/node_etherfabric.c118
-rw-r--r--service/src/node_forwarder.c2
-rw-r--r--service/src/node_health_check.c8
-rw-r--r--service/src/node_lb.c4
-rw-r--r--service/src/node_phydev.c3
-rw-r--r--tools/tcpdump/pdump.c2
10 files changed, 33 insertions, 120 deletions
diff --git a/app/src/mrb.c b/app/src/mrb.c
index 05e8ffc..49f10c3 100644
--- a/app/src/mrb.c
+++ b/app/src/mrb.c
@@ -696,7 +696,7 @@ struct mrb_metadata_route_ctx
{
uint8_t dir;
uint16_t ef_link_id;
- uint16_t global_link_id;
+ uint16_t traffic_link_id;
uint16_t port_ingress;
uint16_t port_egress;
uint16_t peer_index;
@@ -733,7 +733,7 @@ int marsio_buff_get_metadata(marsio_buff_t * m, enum mr_buff_metadata_type type,
route_ctx->port_egress = mrb_metadata->port_egress;
route_ctx->peer_index = mrb_metadata->peer_index;
route_ctx->ef_link_id = mrb_metadata->ef_link_id;
- route_ctx->global_link_id = mrb_metadata->global_link_id;
+ route_ctx->traffic_link_id = mrb_metadata->traffic_link_id;
route_ctx->hash_usr = mbuf->hash.usr;
}
@@ -780,13 +780,13 @@ int marsio_buff_get_metadata(marsio_buff_t * m, enum mr_buff_metadata_type type,
return sizeof(uint16_t);
}
- case MR_BUFF_GLOBAL_LINK_ID: {
+ case MR_BUFF_TRAFFIC_LINK_ID: {
if (unlikely(sz_data < sizeof(uint16_t)))
{
return -ENOMEM;
}
- *(uint16_t *)(data) = (uint16_t)mrb_metadata->global_link_id;
+ *(uint16_t *)(data) = (uint16_t)mrb_metadata->traffic_link_id;
return sizeof(uint16_t);
}
@@ -856,7 +856,7 @@ int marsio_buff_set_metadata(marsio_buff_t * m, enum mr_buff_metadata_type type,
mrb_metadata->port_egress = route_ctx->port_egress;
mrb_metadata->peer_index = route_ctx->peer_index;
mrb_metadata->ef_link_id = route_ctx->ef_link_id;
- mrb_metadata->global_link_id = route_ctx->global_link_id;
+ mrb_metadata->traffic_link_id = route_ctx->traffic_link_id;
mbuf->hash.usr = route_ctx->hash_usr;
return 0;
}
diff --git a/include/external/marsio.h b/include/external/marsio.h
index 452eb8c..f353f0e 100644
--- a/include/external/marsio.h
+++ b/include/external/marsio.h
@@ -114,7 +114,7 @@ enum mr_buff_metadata_type
/* etherfabric link id */
MR_BUFF_EF_LINK_ID = 6,
/* global link id */
- MR_BUFF_GLOBAL_LINK_ID = 7,
+ MR_BUFF_TRAFFIC_LINK_ID = 7,
/* user 0 */
MR_BUFF_USER_0 = 254
};
diff --git a/include/internal/mrb_define.h b/include/internal/mrb_define.h
index 6438256..e55e844 100644
--- a/include/internal/mrb_define.h
+++ b/include/internal/mrb_define.h
@@ -30,7 +30,7 @@ struct mrb_metadata
uint16_t payload_offset;
uint16_t user_0;
uint16_t ef_link_id;
- uint16_t global_link_id;
+ uint16_t traffic_link_id;
/* for EF adapter */
uint16_t peer_index;
diff --git a/service/src/classifier_rule_parser.c b/service/src/classifier_rule_parser.c
index 32d7c1f..19cf5ab 100644
--- a/service/src/classifier_rule_parser.c
+++ b/service/src/classifier_rule_parser.c
@@ -626,7 +626,7 @@ void classifier_rule_dump(struct rule_list_parsed * rule_list)
unsigned int max_len = sizeof(str_rule_info) - 1;
struct rule_field_parser * rule = &rule_list->rules[index];
- int len = snprintf(str_rule_info, max_len, "Pkt classifier rule, rule id:%u, ", rule->rule_id);
+ int len = snprintf(str_rule_info, max_len, "Pkt classifier, rule id:%u, ", rule->rule_id);
if (rule->ether_type == RTE_ETHER_TYPE_IPV4)
{
struct in_addr src_addr, dst_addr;
diff --git a/service/src/node_etherfabric.c b/service/src/node_etherfabric.c
index 7faed79..2715ed1 100644
--- a/service/src/node_etherfabric.c
+++ b/service/src/node_etherfabric.c
@@ -3,6 +3,7 @@
#include <cJSON.h>
#include <common.h>
#include <ldbc.h>
+#include <link_db.h>
#include <mrb_define.h>
#include <netinet/in.h>
#include <rte_graph.h>
@@ -64,14 +65,6 @@ struct peer
struct rte_ether_addr ef_mac_addr;
} __rte_cache_aligned;
-/* Global link struct */
-struct global_link
-{
- uint16_t global_link_id;
- uint16_t ef_link_id;
- uint32_t ef_ip_addr;
-};
-
/* Etherfabric adapter management struct */
struct ef_mgr
{
@@ -83,7 +76,7 @@ struct ef_mgr
struct rte_hash * peer_hash;
struct ef_adapter * ef_adapters;
struct peer peers[1024];
- struct global_link global_links[32];
+ struct link_db_ctx * link_db_ctx;
};
/* Etherfabric ingress stat struct */
@@ -278,64 +271,6 @@ int parser_ef_adapter_config(struct sc_main * sc, struct ef_mgr * ef_mgr)
return RT_SUCCESS;
}
-/* Parsing the global link id config */
-int parser_global_link_config(struct sc_main * sc, struct ef_mgr * ef_mgr)
-{
- /* Parsing all config */
- int ret;
- uint16_t nr_global_links = 0;
- for (int index = 0; index < RTE_DIM(ef_mgr->global_links); index++)
- {
- char str_conf_section[MR_STRING_MAX] = {};
- snprintf(str_conf_section, sizeof(str_conf_section), "global_link_config:%d", index);
-
- /* Get global link id */
- uint32_t global_link_id = 0;
- ret = MESA_load_profile_uint_nodef(sc->local_cfgfile, str_conf_section, "global_link_id", &global_link_id);
- if (ret < 0)
- continue;
-
- /* Get etherfabric ip addr */
- char str_ef_ip_addr[MR_STRING_MAX] = {};
- ret = MESA_load_profile_string_nodef(sc->local_cfgfile, str_conf_section, "ef_ip_addr", str_ef_ip_addr,
- sizeof(str_ef_ip_addr));
- if (ret < 0)
- {
- MR_ERROR("The : %s ,No config the 'ef_ip_addr'.", str_conf_section);
- return RT_ERR;
- }
-
- /* Get etherfabric ip addr */
- uint32_t ef_ip_addr = 0;
- ret = inet_pton(AF_INET, str_ef_ip_addr, &ef_ip_addr);
- if (ret < 0)
- {
- MR_ERROR("The : %s ,No config the 'ef_ip_addr'.", str_conf_section);
- return RT_ERR;
- }
-
- /* Get etherfabric link id */
- uint32_t ef_link_id = 0;
- ret = MESA_load_profile_uint_nodef(sc->local_cfgfile, str_conf_section, "ef_link_id", &ef_link_id);
- if (ret < 0)
- {
- MR_ERROR("The : %s ,No config the 'ef_link_id'.", str_conf_section);
- return RT_ERR;
- }
-
- /* Save the global link id */
- struct global_link * global_link = &ef_mgr->global_links[nr_global_links];
- global_link->global_link_id = global_link_id;
- global_link->ef_link_id = ef_link_id;
- global_link->ef_ip_addr = ef_ip_addr;
- nr_global_links++;
- }
-
- /* Save the global link id num */
- ef_mgr->nr_global_links = nr_global_links;
- return RT_SUCCESS;
-}
-
/* Dump etherfabric adapter config */
void dump_ef_adapter_config(struct ef_mgr * ef_mgr)
{
@@ -366,22 +301,6 @@ void dump_ef_adapter_config(struct ef_mgr * ef_mgr)
}
}
-/* Dump global link config */
-void dump_global_link_config(struct ef_mgr * ef_mgr)
-{
- if (ef_mgr->nr_global_links == 0)
- return;
-
- for (int i = 0; i < ef_mgr->nr_global_links; i++)
- {
- struct global_link * global_link = &ef_mgr->global_links[i];
- char str_addr[INET_ADDRSTRLEN];
- inet_ntop(AF_INET, &global_link->ef_ip_addr, str_addr, sizeof(str_addr));
- MR_INFO("Global link, config id: %u, etherfabric ip addr: %s, etherfabric link id:%u, global link id:%u", i,
- str_addr, global_link->ef_link_id, global_link->global_link_id);
- }
-}
-
/* Init etherfabric */
int ef_init(struct sc_main * sc)
{
@@ -408,12 +327,13 @@ int ef_init(struct sc_main * sc)
/* Dump the etherfabric adapter config */
dump_ef_adapter_config(ef_mgr);
- /* Parsing the global link config */
- if (parser_global_link_config(sc, ef_mgr) != RT_SUCCESS)
+ /* Link db mgr create */
+ ef_mgr->link_db_ctx = link_db_create(sc, LINK_DB_TYPE_EF);
+ if (ef_mgr->link_db_ctx == NULL)
return RT_ERR;
- /* Dump the global link config */
- dump_global_link_config(ef_mgr);
+ if (link_db_config_parse(sc, ef_mgr->link_db_ctx) == RT_ERR)
+ return RT_ERR;
/* Setup peer hash */
if (peer_setup_hash(ef_mgr) != RT_SUCCESS)
@@ -482,20 +402,6 @@ int peer_lookup_and_add(struct rte_hash * peer_hash, struct peer * peers, struct
return ret;
}
-/* Global link id lookup */
-uint16_t global_link_id_lookup(struct ef_mgr * ef_mgr, uint16_t ef_link_id, uint32_t ef_ip_addr)
-{
- for (uint16_t index = 0; index < ef_mgr->nr_global_links; index++)
- {
- struct global_link * global_link = &ef_mgr->global_links[index];
- if (ef_link_id == global_link->ef_link_id && ef_ip_addr == global_link->ef_ip_addr)
- {
- return global_link->global_link_id;
- }
- }
- return UINT16_MAX;
-}
-
static inline void vxlan_encap_forwarded_pkt(struct rte_mbuf * mbuf)
{
/* swap eth_hdr */
@@ -582,14 +488,18 @@ static __rte_always_inline uint16_t ef_ingress_node_process(struct rte_graph * g
goto node_enqueue;
}
- /* Global link id lookup */
- uint16_t global_link_id = global_link_id_lookup(ef_mgr, outer_g_vxlan_hdr->link_id, outer_ipv4_hdr->src_addr);
+ /* Traffic link id lookup */
+ uint16_t result;
+ struct link_db_match_field match_field;
+ match_field.ef_link_id = outer_g_vxlan_hdr->link_id;
+ match_field.ef_ip_addr = outer_ipv4_hdr->src_addr;
+ link_db_match(ef_mgr->link_db_ctx, &match_field, 1, &result);
/* Fill peer index and dir */
private_ctrlzone->adapter_type = ADAPTER_TYPE_EF;
private_ctrlzone->adapter_id = adapter_id;
private_ctrlzone->ef_link_id = outer_g_vxlan_hdr->link_id;
- private_ctrlzone->global_link_id = global_link_id;
+ private_ctrlzone->traffic_link_id = result;
private_ctrlzone->dir = outer_g_vxlan_hdr->dir;
private_ctrlzone->peer_index = (uint16_t)peer_index;
diff --git a/service/src/node_forwarder.c b/service/src/node_forwarder.c
index bc75abf..1a9c286 100644
--- a/service/src/node_forwarder.c
+++ b/service/src/node_forwarder.c
@@ -72,7 +72,7 @@ int sid_check(uint32_t sid)
void forwarder_table_inserter(uint16_t sid, uint16_t type)
{
char str_forwarder[1024] = {};
- int len = snprintf(str_forwarder, sizeof(str_forwarder), "new entry in forwarder table created, sid=%u", sid);
+ int len = snprintf(str_forwarder, sizeof(str_forwarder), "New entry in forwarder table created, sid=%u", sid);
switch (type)
{
case FORWARDER_TYPE_LB:
diff --git a/service/src/node_health_check.c b/service/src/node_health_check.c
index 682b99c..3796591 100644
--- a/service/src/node_health_check.c
+++ b/service/src/node_health_check.c
@@ -285,10 +285,10 @@ void private_health_check_func(struct health_check_session * _session)
switch (remote_state)
{
case REMOTE_UP:
- MR_INFO("health check, name=%s, device=%s, remote_state=Up", _session->name, _session->device);
+ MR_INFO("Health check, name=%s, device=%s, remote_state=Up", _session->name, _session->device);
break;
case REMOTE_DOWN:
- MR_INFO("health check, name=%s, device=%s, remote_state=Down", _session->name, _session->device);
+ MR_INFO("Health check, name=%s, device=%s, remote_state=Down", _session->name, _session->device);
break;
}
}
@@ -425,7 +425,7 @@ int parse_health_check_config(struct sc_main * sc, struct health_check_main * _h
void dump_health_check_session(struct health_check_session * _session, int session_id)
{
char str_session_info[1024] = {};
- int len = snprintf(str_session_info, sizeof(str_session_info), "health check, id=%u", session_id);
+ int len = snprintf(str_session_info, sizeof(str_session_info), "Health check, id=%u", session_id);
len += snprintf(str_session_info + len, sizeof(str_session_info) - len, ", name=%s", _session->name);
len += snprintf(str_session_info + len, sizeof(str_session_info) - len, ", dev_name=%s", _session->device);
len += snprintf(str_session_info + len, sizeof(str_session_info) - len, ", dev_id=%u", _session->port_id);
@@ -452,7 +452,7 @@ void dump_health_check_config(struct health_check_main * _health_check_main)
MR_INFO("\n");
/* Dump the health check config */
- MR_INFO("health check session total number: %u", _health_check_main->total_session_num);
+ MR_INFO("Health check session total number: %u", _health_check_main->total_session_num);
for (int index = 0; index < _health_check_main->total_session_num; index++)
{
struct health_check_session * _session = &_health_check_main->sessions[index];
diff --git a/service/src/node_lb.c b/service/src/node_lb.c
index 3fffa32..c62e4fe 100644
--- a/service/src/node_lb.c
+++ b/service/src/node_lb.c
@@ -395,7 +395,7 @@ void dump_lb_config(struct lb_management * lb_manage)
return;
MR_INFO("\n");
- MR_INFO("load balance config, total_num=%u, sid_num=%u, sid_start=%u, sid_end=%u", lb_manage->nr_group,
+ MR_INFO("Load balance config, total_num=%u, sid_num=%u, sid_start=%u, sid_end=%u", lb_manage->nr_group,
lb_manage->nr_sid, lb_manage->sid_start, lb_manage->sid_end);
for (int i = 0; i < MR_LB_MAX_GROUP; i++)
@@ -406,7 +406,7 @@ void dump_lb_config(struct lb_management * lb_manage)
continue;
char str_config_info[2048];
- int len = snprintf(str_config_info, sizeof(str_config_info), "load balance, id=%u", lb_groups->lb_group_id);
+ int len = snprintf(str_config_info, sizeof(str_config_info), "Load balance, id=%u", lb_groups->lb_group_id);
switch (lb_groups->group_mode)
{
case GROUP_MODE_BALANCE:
diff --git a/service/src/node_phydev.c b/service/src/node_phydev.c
index c929114..278af63 100644
--- a/service/src/node_phydev.c
+++ b/service/src/node_phydev.c
@@ -318,6 +318,9 @@ static __rte_always_inline uint16_t dpdk_dev_rx_node_process(struct rte_graph *
mrb_meta->port_ingress = ctx->dev_desc->port_id;
mrb_meta->port_egress = UINT16_MAX;
+ /* Init the traffic link id */
+ mrb_meta->traffic_link_id = UINT16_MAX;
+
/* Parser Pkt */
struct pkt_parser pkt_parser;
pkt_parser_init(&pkt_parser, &mrb_meta->pkt_parser_result, LAYER_TYPE_ALL, MR_PKT_PARSER_LAYERS_MAX);
diff --git a/tools/tcpdump/pdump.c b/tools/tcpdump/pdump.c
index 5916dc2..bdabdd0 100644
--- a/tools/tcpdump/pdump.c
+++ b/tools/tcpdump/pdump.c
@@ -593,7 +593,7 @@ int mr_pcapng_add_opt(struct rte_mbuf * mbuf, uint16_t port_id, uint32_t rx_tx_f
len = snprintf(str_dir, str_maxlen, "dir:%u", mrb_metadata->dir);
len += snprintf(str_dir + len, str_maxlen - len, ", ef_link_id:%u", mrb_metadata->ef_link_id);
- len += snprintf(str_dir + len, str_maxlen - len, ", global_link_id:%u", mrb_metadata->global_link_id);
+ len += snprintf(str_dir + len, str_maxlen - len, ", traffic_link_id:%u", mrb_metadata->traffic_link_id);
len += snprintf(str_dir + len, str_maxlen - len, ", ef_peer_id:%u", mrb_metadata->peer_index);
len = snprintf(str_sid_raw, str_maxlen - len, "sid raw head:%u", sid_list->head);