diff options
| author | songyanchao <[email protected]> | 2024-06-27 07:57:23 +0000 |
|---|---|---|
| committer | songyanchao <[email protected]> | 2024-06-27 07:57:23 +0000 |
| commit | 3ac025e2578a8a9fe2da632912d7fe78dfdcb01f (patch) | |
| tree | e2a2e919eb9d8cf5064a42fdca3865ae419e3808 /service | |
| parent | 06f515f5fee9457b99841cfd3bb42bcf31f91f7d (diff) | |
✨ feat: Add switch for BFD discriminator mode.wy-project-support
1.Add switch for BFD discriminator mode. 2.Update VXLAN encapsulation construction function. 3.Enhance EF support to set source port range for VXLAN.
Diffstat (limited to 'service')
| -rw-r--r-- | service/src/node_bfd.c | 37 | ||||
| -rw-r--r-- | service/src/node_etherfabric.c | 47 |
2 files changed, 74 insertions, 10 deletions
diff --git a/service/src/node_bfd.c b/service/src/node_bfd.c index 250bcb7..fb4a275 100644 --- a/service/src/node_bfd.c +++ b/service/src/node_bfd.c @@ -1,3 +1,4 @@ +#include <MESA_prof_load.h> #include <cJSON.h> #include <common.h> #include <ldbc.h> @@ -5,6 +6,7 @@ #include <netinet/in.h> #include <rte_graph.h> #include <rte_graph_worker.h> +#include <rte_memcpy.h> #include <sc_common.h> #include <sc_node.h> #include <sc_node_common.h> @@ -94,6 +96,7 @@ struct bfd_stat /* Bfd Main Struct */ struct node_bfd_main { + uint32_t discriminator_mode; struct bfd_stat graph_stat[RTE_MAX_LCORE]; }; @@ -101,7 +104,7 @@ struct node_bfd_main static struct node_bfd_main * global_bfd_main = NULL; /************************************* Bfd Config **************************************/ -/* Init Bfd Servicd */ +/* Init Bfd */ int bfd_init(struct sc_main * sc) { struct node_bfd_main * bfd_main = NULL; @@ -110,6 +113,17 @@ int bfd_init(struct sc_main * sc) MR_VERIFY_MALLOC(bfd_main); sc->bfd_node_main = bfd_main; global_bfd_main = bfd_main; + + unsigned int discriminator_mode = 0; + MESA_load_profile_uint_def(sc->local_cfgfile, "bfd", "disc_mode", &discriminator_mode, 0); + bfd_main->discriminator_mode = discriminator_mode; + + MR_INFO("Bfd Init Success"); + if (discriminator_mode == 0) + MR_INFO("Bfd Discriminator Mode: STANDARD"); + else + MR_INFO("Bfd Discriminator Mode: FLIP"); + return RT_SUCCESS; } @@ -161,11 +175,22 @@ uint8_t bfd_reply(struct rte_ether_hdr * ether_hdr, struct rte_ipv4_hdr * ipv4_h /* Swap discriminator */ struct bfd_header_t * bfd_hdr = (struct bfd_header_t *)(udp_hdr + 1); - uint8_t swap_discriminator[4]; - uint32_t discriminator = htonl(MR_BFD_START_DISCRIMINATOR + bfd_session_id); - memcpy(swap_discriminator, bfd_hdr->my_discriminator, sizeof(swap_discriminator)); - memcpy(bfd_hdr->my_discriminator, &discriminator, sizeof(swap_discriminator)); - memcpy(bfd_hdr->your_discriminator, swap_discriminator, sizeof(swap_discriminator)); + + if (global_bfd_main->discriminator_mode == 0) + { + uint8_t swap_discriminator[4]; + uint32_t discriminator = htonl(MR_BFD_START_DISCRIMINATOR + bfd_session_id); + rte_memcpy(swap_discriminator, bfd_hdr->my_discriminator, sizeof(swap_discriminator)); + rte_memcpy(bfd_hdr->my_discriminator, &discriminator, sizeof(swap_discriminator)); + rte_memcpy(bfd_hdr->your_discriminator, swap_discriminator, sizeof(swap_discriminator)); + } + else + { + uint8_t swap_discriminator[4]; + rte_memcpy(swap_discriminator, bfd_hdr->my_discriminator, sizeof(swap_discriminator)); + rte_memcpy(bfd_hdr->my_discriminator, bfd_hdr->your_discriminator, sizeof(swap_discriminator)); + rte_memcpy(bfd_hdr->your_discriminator, swap_discriminator, sizeof(swap_discriminator)); + } /* Set udp check sum */ udp_hdr->dgram_cksum = 0; diff --git a/service/src/node_etherfabric.c b/service/src/node_etherfabric.c index 84f2f00..23a1da9 100644 --- a/service/src/node_etherfabric.c +++ b/service/src/node_etherfabric.c @@ -74,6 +74,9 @@ struct ef_mgr uint32_t nr_sids; uint32_t sid_start; uint32_t sid_end; + uint32_t src_port_start; + uint32_t src_port_end; + uint32_t src_port_range; struct rte_hash * ef_peer_hash; struct ef_adapter * ef_adapters; struct link_db_ctx * link_db_ctx; @@ -200,6 +203,33 @@ int parser_ef_adapter_config(struct sc_main * sc, struct ef_mgr * ef_mgr) return RT_ERR; } + /* Get the src port start */ + uint32_t src_port_start; + MESA_load_profile_uint_def(sc->local_cfgfile, "ef_adapters", "src_port_start", &src_port_start, 49152); + + if (src_port_start > 65535) + { + MR_ERROR("Etherfabric adapters config 'src_port_start' is invalid: %u .", src_port_start); + return RT_ERR; + } + + /* Get the src port end */ + uint32_t src_port_end; + MESA_load_profile_uint_def(sc->local_cfgfile, "ef_adapters", "src_port_end", &src_port_end, 65535); + + if (src_port_end > 65535) + { + MR_ERROR("Etherfabric adapters config 'src_port_end' is invalid: %u .", src_port_end); + return RT_ERR; + } + + /* Check the src port range */ + if (src_port_start > src_port_end) + { + MR_ERROR("Etherfabric adapters config 'src_port_end' less than 'src_port_start' ."); + return RT_ERR; + } + /* Parsing all config */ int ret; uint16_t nr_adapters = 0; @@ -294,6 +324,9 @@ int parser_ef_adapter_config(struct sc_main * sc, struct ef_mgr * ef_mgr) ef_mgr->nr_sids = nr_sids; ef_mgr->sid_start = sid_start; ef_mgr->sid_end = sid_end; + ef_mgr->src_port_start = src_port_start; + ef_mgr->src_port_end = src_port_end; + ef_mgr->src_port_range = src_port_end - src_port_start + 1; return RT_SUCCESS; } @@ -306,6 +339,8 @@ void dump_ef_adapter_config(struct ef_mgr * ef_mgr) MR_INFO(" "); MR_INFO("Etherfabric adapter, total num: %u, sid num: %u, sid start: %u, sid end:%u", ef_mgr->nr_adapters, ef_mgr->nr_sids, ef_mgr->sid_start, ef_mgr->sid_end); + MR_INFO("Etherfabric adapter, src port range: %u, src port start: %u, src port end: %u", ef_mgr->src_port_range, + ef_mgr->src_port_start, ef_mgr->src_port_end); for (int i = 0; i < nr_max_ef_adapters; i++) { @@ -517,7 +552,9 @@ static __rte_always_inline uint16_t ef_ingress_node_process(struct rte_graph * g struct mrb_metadata * mrb_meta = mrbuf_cz_data(mbuf, MR_NODE_CTRLZONE_ID); mrb_meta->adapter_type = ADAPTER_TYPE_EF; mrb_meta->adapter_id = ef_adapter_id; + mrb_meta->vxlan_id_half_high = outer_g_vxlan_hdr->vlan_id_half_high; mrb_meta->ef_link_id = outer_g_vxlan_hdr->link_id; + mrb_meta->vxlan_id_half_low = outer_g_vxlan_hdr->vlan_id_half_low; mrb_meta->traffic_link_id = result; mrb_meta->dir = outer_g_vxlan_hdr->dir; mrb_meta->ef_peer_index = (uint16_t)ef_peer_index; @@ -592,10 +629,7 @@ RTE_NODE_REGISTER(ef_ingress_node_base); /* Generate the source port for VXLAN encapsulation, rfc7348 */ static inline uint16_t generate_vxlan_src_port(struct rte_mbuf * mbuf) { - uint16_t min = 49152; - uint16_t range = 65535 - 49152 + 1; - - return min + (uint16_t)(mbuf->hash.usr % range); + return g_ef_main->ef_mgr.src_port_start + (uint16_t)(mbuf->hash.usr % g_ef_main->ef_mgr.src_port_range); } /* Fill Ether IPv4 Udp Vxlan hdr for the constructed packet */ @@ -611,6 +645,11 @@ static inline int vxlan_encap_constructed_pkt(struct rte_mbuf * mbuf, struct mrb /* clear the vxlan header */ memset(p_vxlan_hdr, 0, sizeof(struct g_vxlan_hdr)); + + /* fill the vxlan header */ + p_vxlan_hdr->flags = 0x08; + p_vxlan_hdr->vlan_id_half_high = mrb_meta->vxlan_id_half_high; + p_vxlan_hdr->vlan_id_half_low = mrb_meta->vxlan_id_half_low; p_vxlan_hdr->dir = mrb_meta->dir; p_vxlan_hdr->link_id = mrb_meta->ef_link_id; |
