summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorsongyanchao <[email protected]>2023-12-27 07:40:17 +0000
committersongyanchao <[email protected]>2024-01-05 02:28:26 +0000
commit0e207394572e023b2edebf699d77b03cf9091a52 (patch)
tree828628a7937753a4cf792dd26a34bc857240b26b /app
parentebfbdc3f439396ef5755e6aad008ed526f1f58fa (diff)
✨ feat(TSG-17959): Add tera adapter processing flow for route context.
Add tera adapter processing flow for route context.
Diffstat (limited to 'app')
-rw-r--r--app/CMakeLists.txt1
-rw-r--r--app/src/mrb.c88
2 files changed, 78 insertions, 11 deletions
diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt
index 4a30e17..74cf7de 100644
--- a/app/CMakeLists.txt
+++ b/app/CMakeLists.txt
@@ -4,6 +4,7 @@ include_directories(${CMAKE_SOURCE_DIR}/include/extern)
include_directories(${CMAKE_SOURCE_DIR}/include/internal)
include_directories(include)
+include_directories(../service/include)
add_library(marsio SHARED src/marsio.c src/arp.c src/icmp.c src/neigh.c src/rawio.c src/mrb.c
src/sendpath.c src/monit.c src/tap.c)
diff --git a/app/src/mrb.c b/app/src/mrb.c
index e80b4b1..b858cd0 100644
--- a/app/src/mrb.c
+++ b/app/src/mrb.c
@@ -7,6 +7,8 @@
#include <rte_malloc.h>
#include <rte_mbuf.h>
+#include <sc_node_common.h>
+
void * marsio_buff_ctrlzone(marsio_buff_t * mr_buff, uint8_t id)
{
return NULL;
@@ -695,12 +697,24 @@ uint32_t marsio_buff_get_rehash_index(marsio_buff_t * m)
struct mrb_metadata_route_ctx
{
uint8_t dir;
- uint16_t ef_link_id;
+ uint8_t adapter_type;
uint16_t traffic_link_id;
uint16_t port_ingress;
uint16_t port_egress;
- uint16_t ef_peer_index;
uint32_t hash_usr;
+
+ union {
+ struct
+ {
+ uint16_t ef_peer_index;
+ uint16_t ef_link_id;
+ };
+ struct
+ {
+ uint16_t vlan_tci;
+ struct rte_ether_hdr eth_hdr;
+ };
+ };
};
int marsio_buff_get_metadata(marsio_buff_t * m, enum mr_buff_metadata_type type, void * data, unsigned int sz_data)
@@ -726,15 +740,31 @@ int marsio_buff_get_metadata(marsio_buff_t * m, enum mr_buff_metadata_type type,
}
struct mrb_metadata_route_ctx * route_ctx = (struct mrb_metadata_route_ctx *)data;
- if (route_ctx != NULL)
+ if (route_ctx == NULL)
+ {
+ return -EINVAL;
+ }
+
+ route_ctx->dir = mrb_metadata->dir;
+ route_ctx->adapter_type = mrb_metadata->adapter_type;
+ route_ctx->port_ingress = mrb_metadata->port_ingress;
+ route_ctx->port_egress = mrb_metadata->port_egress;
+ route_ctx->traffic_link_id = mrb_metadata->traffic_link_id;
+ route_ctx->hash_usr = mbuf->hash.usr;
+
+ if (mrb_metadata->adapter_type == ADAPTER_TYPE_EF)
{
- route_ctx->dir = mrb_metadata->dir;
- route_ctx->port_ingress = mrb_metadata->port_ingress;
- route_ctx->port_egress = mrb_metadata->port_egress;
route_ctx->ef_peer_index = mrb_metadata->ef_peer_index;
route_ctx->ef_link_id = mrb_metadata->ef_link_id;
- route_ctx->traffic_link_id = mrb_metadata->traffic_link_id;
- route_ctx->hash_usr = mbuf->hash.usr;
+ }
+ else if (mrb_metadata->adapter_type == ADAPTER_TYPE_TERA)
+ {
+ const struct rte_ether_hdr * eth_hdr = rte_pktmbuf_mtod(mbuf, const struct rte_ether_hdr *);
+ const struct rte_vlan_hdr * vlan_hdr =
+ rte_pktmbuf_mtod_offset(mbuf, const struct rte_vlan_hdr *, sizeof(struct rte_ether_hdr));
+
+ route_ctx->vlan_tci = vlan_hdr->vlan_tci;
+ rte_memcpy(&route_ctx->eth_hdr, eth_hdr, sizeof(struct rte_ether_hdr));
}
return sizeof(struct mrb_metadata_route_ctx);
@@ -842,12 +872,48 @@ int marsio_buff_set_metadata(marsio_buff_t * m, enum mr_buff_metadata_type type,
mrb_metadata->packet_create_from_nf = 1;
mrb_metadata->dir = route_ctx->dir;
+ mrb_metadata->adapter_type = route_ctx->adapter_type;
+ mrb_metadata->traffic_link_id = route_ctx->traffic_link_id;
mrb_metadata->port_ingress = route_ctx->port_ingress;
mrb_metadata->port_egress = route_ctx->port_egress;
- mrb_metadata->ef_peer_index = route_ctx->ef_peer_index;
- mrb_metadata->ef_link_id = route_ctx->ef_link_id;
- mrb_metadata->traffic_link_id = route_ctx->traffic_link_id;
mbuf->hash.usr = route_ctx->hash_usr;
+
+ if (route_ctx->adapter_type == ADAPTER_TYPE_EF)
+ {
+ mrb_metadata->ef_peer_index = route_ctx->ef_peer_index;
+ mrb_metadata->ef_link_id = route_ctx->ef_link_id;
+ }
+ else if (route_ctx->adapter_type == ADAPTER_TYPE_TERA)
+ {
+ /* Get original eth hdr */
+ struct rte_ether_hdr * eth_hdr = rte_pktmbuf_mtod(mbuf, struct rte_ether_hdr *);
+ rte_be16_t ether_type = eth_hdr->ether_type;
+
+ /* Remove original eth hdr */
+ rte_pktmbuf_adj(mbuf, sizeof(struct rte_ether_hdr));
+
+ /* Encap the vlan hdr */
+ struct rte_vlan_hdr * vlan_hdr =
+ (struct rte_vlan_hdr *)rte_pktmbuf_prepend(mbuf, sizeof(struct rte_vlan_hdr));
+ if (vlan_hdr == NULL)
+ {
+ return -ENOMEM;
+ }
+
+ vlan_hdr->vlan_tci = route_ctx->vlan_tci;
+ vlan_hdr->eth_proto = ether_type;
+
+ /* Encap the eth hdr */
+ struct rte_ether_hdr * new_eth_hdr =
+ (struct rte_ether_hdr *)rte_pktmbuf_prepend(mbuf, sizeof(struct rte_ether_hdr));
+ if (new_eth_hdr == NULL)
+ {
+ return -ENOMEM;
+ }
+
+ rte_memcpy(new_eth_hdr, &route_ctx->eth_hdr, sizeof(struct rte_ether_hdr));
+ }
+
return 0;
}