From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from proxy.6wind.com (host.76.145.23.62.rev.coltfrance.com [62.23.145.76]) by dpdk.org (Postfix) with ESMTP id A0B05298F for ; Mon, 3 Oct 2016 10:39:04 +0200 (CEST) Received: from glumotte.dev.6wind.com (unknown [10.16.0.195]) by proxy.6wind.com (Postfix) with ESMTP id 8623826E50; Mon, 3 Oct 2016 10:39:04 +0200 (CEST) From: Olivier Matz To: dev@dpdk.org Cc: cunming.liang@intel.com, john.mcnamara@intel.com, andrey.chilikin@intel.com, konstantin.ananyev@intel.com, Jean Dao Date: Mon, 3 Oct 2016 10:38:51 +0200 Message-Id: <1475483937-21696-11-git-send-email-olivier.matz@6wind.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1475483937-21696-1-git-send-email-olivier.matz@6wind.com> References: <1472481335-21226-1-git-send-email-olivier.matz@6wind.com> <1475483937-21696-1-git-send-email-olivier.matz@6wind.com> Subject: [dpdk-dev] [PATCH v3 10/16] net: support Gre 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: Mon, 03 Oct 2016 08:39:04 -0000 Add support of Gre tunnels in rte_net_get_ptype(). Signed-off-by: Jean Dao Signed-off-by: Olivier Matz --- lib/librte_net/rte_net.c | 40 ++++++++++++++++++++++++++++++++++++---- lib/librte_net/rte_net.h | 2 +- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/lib/librte_net/rte_net.c b/lib/librte_net/rte_net.c index 87294bb..66db2c8 100644 --- a/lib/librte_net/rte_net.c +++ b/lib/librte_net/rte_net.c @@ -41,6 +41,7 @@ #include #include #include +#include #include /* get l3 packet type from ip6 next protocol */ @@ -150,11 +151,40 @@ ptype_inner_l4(uint8_t proto) return ptype_inner_l4_proto[proto]; } -/* get the tunnel packet type if any, update proto. */ +/* get the tunnel packet type if any, update proto and off. */ static uint32_t -ptype_tunnel(uint16_t *proto) +ptype_tunnel(uint16_t *proto, const struct rte_mbuf *m, + uint32_t *off) { switch (*proto) { + case IPPROTO_GRE: { + static const uint8_t opt_len[16] = { + [0x0] = 4, + [0x1] = 8, + [0x2] = 8, + [0x8] = 8, + [0x3] = 12, + [0x9] = 12, + [0xa] = 12, + [0xb] = 16, + }; + const struct gre_hdr *gh; + struct gre_hdr gh_copy; + uint16_t flags; + + gh = rte_pktmbuf_read(m, *off, sizeof(*gh), &gh_copy); + if (unlikely(gh == NULL)) + return 0; + + flags = rte_be_to_cpu_16(*(const uint16_t *)gh); + flags >>= 12; + if (opt_len[flags] == 0) + return 0; + + *off += opt_len[flags]; + *proto = gh->proto; + return RTE_PTYPE_TUNNEL_GRE; + } case IPPROTO_IPIP: *proto = rte_cpu_to_be_16(ETHER_TYPE_IPv4); return RTE_PTYPE_TUNNEL_IP; @@ -332,9 +362,11 @@ uint32_t rte_net_get_ptype(const struct rte_mbuf *m, hdr_lens->l4_len = sizeof(struct sctp_hdr); return pkt_type; } else { + uint32_t prev_off = off; + hdr_lens->l4_len = 0; - pkt_type |= ptype_tunnel(&proto); - hdr_lens->tunnel_len = 0; + pkt_type |= ptype_tunnel(&proto, m, &off); + hdr_lens->tunnel_len = off - prev_off; } /* same job for inner header: we need to duplicate the code diff --git a/lib/librte_net/rte_net.h b/lib/librte_net/rte_net.h index f433389..4a72b1b 100644 --- a/lib/librte_net/rte_net.h +++ b/lib/librte_net/rte_net.h @@ -68,7 +68,7 @@ struct rte_net_hdr_lens { * L2: Ether, Vlan, QinQ * L3: IPv4, IPv6 * L4: TCP, UDP, SCTP - * Tunnels: IPv4, IPv6 + * Tunnels: IPv4, IPv6, Gre * * @param m * The packet mbuf to be parsed. -- 2.8.1