diff options
| author | songyanchao <[email protected]> | 2023-12-27 07:40:17 +0000 |
|---|---|---|
| committer | songyanchao <[email protected]> | 2024-01-05 02:28:26 +0000 |
| commit | 0e207394572e023b2edebf699d77b03cf9091a52 (patch) | |
| tree | 828628a7937753a4cf792dd26a34bc857240b26b /app | |
| parent | ebfbdc3f439396ef5755e6aad008ed526f1f58fa (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.txt | 1 | ||||
| -rw-r--r-- | app/src/mrb.c | 88 |
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; } |
