From eb173c8def0a3cb3bf4d7e6ed4e329efbeeb35cf Mon Sep 17 00:00:00 2001 From: Olivier Matz Date: Mon, 3 Oct 2016 10:38:47 +0200 Subject: [PATCH] net: support VLAN in software packet type parser Add a new RTE_PTYPE_L2_ETHER_VLAN packet type, and its support in rte_net_get_ptype(). Signed-off-by: Didier Pallard Signed-off-by: Olivier Matz --- lib/librte_mbuf/rte_mbuf_ptype.h | 7 +++++++ lib/librte_net/rte_net.c | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/lib/librte_mbuf/rte_mbuf_ptype.h b/lib/librte_mbuf/rte_mbuf_ptype.h index 65e9ced9e0..a955c5a726 100644 --- a/lib/librte_mbuf/rte_mbuf_ptype.h +++ b/lib/librte_mbuf/rte_mbuf_ptype.h @@ -135,6 +135,13 @@ extern "C" { * <'ether type'=0x894F> */ #define RTE_PTYPE_L2_ETHER_NSH 0x00000005 +/** + * VLAN packet type. + * + * Packet format: + * <'ether type'=[0x8100]> + */ +#define RTE_PTYPE_L2_ETHER_VLAN 0x00000006 /** * Mask of layer 2 packet types. * It is used for outer packet for tunneling cases. diff --git a/lib/librte_net/rte_net.c b/lib/librte_net/rte_net.c index 93e9df08a8..a75b509244 100644 --- a/lib/librte_net/rte_net.c +++ b/lib/librte_net/rte_net.c @@ -167,6 +167,19 @@ uint32_t rte_net_get_ptype(const struct rte_mbuf *m, off = sizeof(*eh); hdr_lens->l2_len = off; + if (proto == rte_cpu_to_be_16(ETHER_TYPE_VLAN)) { + const struct vlan_hdr *vh; + struct vlan_hdr vh_copy; + + pkt_type = RTE_PTYPE_L2_ETHER_VLAN; + vh = rte_pktmbuf_read(m, off, sizeof(*vh), &vh_copy); + if (unlikely(vh == NULL)) + return pkt_type; + off += sizeof(*vh); + hdr_lens->l2_len += sizeof(*vh); + proto = vh->eth_proto; + } + if (proto == rte_cpu_to_be_16(ETHER_TYPE_IPv4)) { const struct ipv4_hdr *ip4h; struct ipv4_hdr ip4h_copy; -- 2.20.1