From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 4DE8268DD for ; Wed, 6 Jul 2016 09:08:24 +0200 (CEST) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga103.fm.intel.com with ESMTP; 06 Jul 2016 00:08:23 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,317,1464678000"; d="scan'208";a="1001662298" Received: from shwdeisgchi017.ccr.corp.intel.com (HELO [10.239.66.156]) ([10.239.66.156]) by fmsmga001.fm.intel.com with ESMTP; 06 Jul 2016 00:08:22 -0700 To: Olivier Matz , dev@dpdk.org References: <1467733310-20875-1-git-send-email-olivier.matz@6wind.com> <1467733310-20875-10-git-send-email-olivier.matz@6wind.com> From: "Liang, Cunming" Message-ID: <577CAE66.6050606@intel.com> Date: Wed, 6 Jul 2016 15:08:22 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0 MIME-Version: 1.0 In-Reply-To: <1467733310-20875-10-git-send-email-olivier.matz@6wind.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [dpdk-dev] [PATCH 09/18] mbuf: support Mpls in software packet type parser X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Jul 2016 07:08:24 -0000 Hi Olivier, On 7/5/2016 11:41 PM, Olivier Matz wrote: > Add a new RTE_PTYPE_L2_ETHER_MPLS packet type, and its support in > rte_pktmbuf_get_ptype(). > > Signed-off-by: Didier Pallard > Signed-off-by: Olivier Matz > --- > lib/librte_mbuf/rte_mbuf_ptype.c | 25 +++++++++++++++++++++++++ > lib/librte_mbuf/rte_mbuf_ptype.h | 9 ++++++++- > lib/librte_net/Makefile | 4 +++- > lib/librte_net/rte_ether.h | 2 ++ > 4 files changed, 38 insertions(+), 2 deletions(-) > > diff --git a/lib/librte_mbuf/rte_mbuf_ptype.c b/lib/librte_mbuf/rte_mbuf_ptype.c > index 5d46608..0dea600 100644 > --- a/lib/librte_mbuf/rte_mbuf_ptype.c > +++ b/lib/librte_mbuf/rte_mbuf_ptype.c > @@ -41,6 +41,7 @@ > #include > #include > #include > +#include > > /* get l3 packet type from ip6 next protocol */ > static uint32_t > @@ -166,6 +167,9 @@ uint32_t rte_pktmbuf_get_ptype(const struct rte_mbuf *m, > off = sizeof(*eh); > hdr_lens->l2_len = off; > > + if (proto == rte_cpu_to_be_16(ETHER_TYPE_IPv4)) > + goto l3; /* fast path if packet is IPv4 */ > + > if (proto == rte_cpu_to_be_16(ETHER_TYPE_VLAN)) { > const struct vlan_hdr *vh; > struct vlan_hdr vh_copy; > @@ -189,8 +193,29 @@ uint32_t rte_pktmbuf_get_ptype(const struct rte_mbuf *m, > off += 2 * sizeof(*vh); > hdr_lens->l2_len += 2 * sizeof(*vh); > proto = vh->eth_proto; > + } else if ((proto == rte_cpu_to_be_16(ETHER_TYPE_MPLS)) || > + (proto == rte_cpu_to_be_16(ETHER_TYPE_MPLSM))) { > + unsigned int i; > + const struct mpls_hdr *mh; > + struct mpls_hdr mh_copy; > + > +#define MAX_MPLS_HDR 5 > + for (i = 0; i < MAX_MPLS_HDR; i++) { > + mh = rte_pktmbuf_read(m, off + (i * sizeof(*mh)), > + sizeof(*mh), &mh_copy); > + if (unlikely(mh == NULL)) > + return pkt_type; > + if (mh->bs) > + break; > + } > + if (i == MAX_MPLS_HDR) > + return pkt_type; > + pkt_type = RTE_PTYPE_L2_ETHER_MPLS; > + hdr_lens->l2_len += (sizeof(*mh) * (i + 1)); [LC] l2_len includes Eth, Vlan(opt.), MPLS(opt.). For VLAN and MPLS, it may include #n times overlay. These layer recognition knowledge are lost after the detection logic. Once the APP takes the ptype, for the layer(L2, L3, L4) which has more shim-layer, the xxx_len can't help to avoid the re-parse cost. > + return pkt_type; > } > > [...]