+/**
+ * Insert VLAN using mbuf headroom space.
+ *
+ * @param buf
+ * Buffer for VLAN insertion.
+ *
+ * @return
+ * 0 on success, errno value on failure.
+ */
+static inline int
+insert_vlan_sw(struct rte_mbuf *buf)
+{
+ uintptr_t addr;
+ uint32_t vlan;
+ uint16_t head_room_len = rte_pktmbuf_headroom(buf);
+
+ if (head_room_len < 4)
+ return EINVAL;
+
+ addr = rte_pktmbuf_mtod(buf, uintptr_t);
+ vlan = htonl(0x81000000 | buf->vlan_tci);
+ memmove((void *)(addr - 4), (void *)addr, 12);
+ memcpy((void *)(addr + 8), &vlan, sizeof(vlan));
+
+ SET_DATA_OFF(buf, head_room_len - 4);
+ DATA_LEN(buf) += 4;
+
+ return 0;
+}
+