diff options
Diffstat (limited to 'app/src/mrb.c')
| -rw-r--r-- | app/src/mrb.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/app/src/mrb.c b/app/src/mrb.c index 3377a8e..757fd5a 100644 --- a/app/src/mrb.c +++ b/app/src/mrb.c @@ -778,6 +778,29 @@ int marsio_buff_set_metadata(marsio_buff_t * m, enum mr_buff_metadata_type type, switch (type) { + case MR_BUFF_METADATA_VLAN_TCI: + if (unlikely(sz_data < sizeof(uint16_t))) + { + return -ENOMEM; + } + + /* we do not want to relay on the hardware offload capability */ + struct rte_ether_hdr * ether_hdr = (struct rte_ether_hdr *)rte_pktmbuf_mtod(mbuf, struct rte_ether_hdr *); + + /* already has a vlan header */ + if (ether_hdr->ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_VLAN)) + { + struct rte_vlan_hdr * vlan_hdr = (struct rte_vlan_hdr *)(ether_hdr + 1); + vlan_hdr->vlan_tci = rte_cpu_to_be_16(*(uint16_t *)data); + } + else + { + mbuf->vlan_tci = *(uint16_t *)data; + rte_vlan_insert(&mbuf); + } + + return 0; + case MR_BUFF_ROUTE_CTX: { struct mrb_metadata_route_ctx * route_ctx = (struct mrb_metadata_route_ctx *)data; assert(route_ctx != NULL); |
