summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/mrb.c23
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);