summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsongyanchao <[email protected]>2024-06-27 07:57:23 +0000
committersongyanchao <[email protected]>2024-06-27 07:57:23 +0000
commit3ac025e2578a8a9fe2da632912d7fe78dfdcb01f (patch)
treee2a2e919eb9d8cf5064a42fdca3865ae419e3808
parent06f515f5fee9457b99841cfd3bb42bcf31f91f7d (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.
-rw-r--r--.gitignore3
-rw-r--r--include/internal/metadata_define.h6
-rw-r--r--include/internal/mrb_define.h5
-rw-r--r--service/src/node_bfd.c37
-rw-r--r--service/src/node_etherfabric.c47
5 files changed, 86 insertions, 12 deletions
diff --git a/.gitignore b/.gitignore
index 5c9ea97..81aa806 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,9 +25,10 @@ test/ptf_test/ptf_test
/x64
/marsio1.VC.db
.vscode/
+.cache/
.idea
cmake-build-*
cmake-build-*
version.txt
-Testing/ \ No newline at end of file
+Testing/
diff --git a/include/internal/metadata_define.h b/include/internal/metadata_define.h
index e092810..ef4ecbc 100644
--- a/include/internal/metadata_define.h
+++ b/include/internal/metadata_define.h
@@ -20,6 +20,8 @@ struct mrb_metadata_route_ctx
union {
struct
{
+ uint8_t vxlan_id_half_high;
+ uint8_t vxlan_id_half_low;
uint16_t ef_peer_index;
uint16_t ef_link_id;
};
@@ -68,6 +70,8 @@ int buffer_metadata_get(marsio_buff_t * m, enum mr_buff_metadata_type type, void
if (mrb_metadata->adapter_type == ADAPTER_TYPE_EF)
{
+ route_ctx->vxlan_id_half_high = mrb_metadata->vxlan_id_half_high;
+ route_ctx->vxlan_id_half_low = mrb_metadata->vxlan_id_half_low;
route_ctx->ef_peer_index = mrb_metadata->ef_peer_index;
route_ctx->ef_link_id = mrb_metadata->ef_link_id;
}
@@ -199,6 +203,8 @@ int buffer_metadata_set(marsio_buff_t * m, enum mr_buff_metadata_type type, void
if (route_ctx->adapter_type == ADAPTER_TYPE_EF)
{
+ mrb_metadata->vxlan_id_half_high = route_ctx->vxlan_id_half_high;
+ mrb_metadata->vxlan_id_half_low = route_ctx->vxlan_id_half_low;
mrb_metadata->ef_peer_index = route_ctx->ef_peer_index;
mrb_metadata->ef_link_id = route_ctx->ef_link_id;
}
diff --git a/include/internal/mrb_define.h b/include/internal/mrb_define.h
index 7bb23ab..3158fea 100644
--- a/include/internal/mrb_define.h
+++ b/include/internal/mrb_define.h
@@ -17,10 +17,13 @@ struct mrb_zone_idx
/* mbuf common metadata */
struct mrb_metadata
{
+ uint8_t vxlan_id_half_high;
+
/* status */
uint8_t dir : 1;
uint8_t packet_create_from_nf : 1;
- uint8_t no_use : 6;
+ uint8_t vxlan_id_half_low : 4;
+ uint8_t no_use : 2;
uint8_t is_ctrlbuf : 1;
uint8_t adapter_type : 2;
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;