From patchwork Wed Mar 28 15:43:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Didier Pallard X-Patchwork-Id: 36623 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CE4A82C12; Wed, 28 Mar 2018 17:44:23 +0200 (CEST) Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by dpdk.org (Postfix) with ESMTP id AA3CE2BCD for ; Wed, 28 Mar 2018 17:44:21 +0200 (CEST) Received: by mail-wm0-f65.google.com with SMTP id a20so26429991wmd.1 for ; Wed, 28 Mar 2018 08:44:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=W9XiUnK+7rKB5wR53VBQbnD4OOzYToBraj/8cJ7nFcY=; b=xM1+81EYYzpudT4TlUvc2kYrgz/BPGVCNtMVPJyp6Dg8XtXnPCd8ndmxOflPKA5Aso 4pjAJSvDlpg0Wr3CzmSLqyO90zQV0Ndw90BeqbyLTJoEZEUjsi9LwtpSmgzv+bdwJPQQ uCZ8Hle1sPNaBOkfgsVCGYBPH7O6R3hfFKRRv0A1PJibqiqN34r0COjwavsuYQ4RrG+u tqMY4PvKN63mym+eMLp3+f4qbolOmYdie5FSMIffy9RemZXnLhV8TCa2+yuWfUvGFblA S9na+YpeXGLe9b8I3y7T1AFRNlVLfnDPQrVgNhIjA8d3dj8n074kRiahZxu6RCYemeGh ASrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=W9XiUnK+7rKB5wR53VBQbnD4OOzYToBraj/8cJ7nFcY=; b=BSESs/GBDNMx+fDpdseotHrLKWxYvPxeCz/C4xC+LfhgzTx8IV+/8pj4Fyc8R95LsO rYRIWF41jFI8J8h7w6xZiy0VOmhs9m4Gmr8Gjd8kDHTrQpVgJCwV1cmM5ysuEkUV+1id fqdS1VNr9LgRdm9ZTpr+fz34TxKX+IItc7iffN+0jZzj1dD/tOaEdrHmezYS1rv1LNaQ 913VamTcgTCMf7Se2+QB2Kcnj/euQWDB8BbMKbOnSKZOBdzZt9EY+21L7g1hFMqBZWqh IAI9rHtlzY/dZ1DnKtRed1CJtlLzEz+f4ur2s/dUYxy0P7eeAgq/AI0Ojfs7h87sp5W5 01UQ== X-Gm-Message-State: AElRT7EPneRkNeeWVhtW9VIlim2hRJ/c4ONjwknrTRbBaQ7fTKh0b/UO FjnPFi6Um0xeDrh4A6kJtncjl9L/ X-Google-Smtp-Source: AIpwx4+i7QJk+ulweVTJdaq5ym3+AiUO13/yxvYUTlKYWWUvGB0z8r3rNOyg4mZUZeNYrDdqKkllrg== X-Received: by 10.28.232.200 with SMTP id f69mr2965985wmi.32.1522251860901; Wed, 28 Mar 2018 08:44:20 -0700 (PDT) Received: from pala.dev.6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id o23sm7957279wrf.93.2018.03.28.08.44.19 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 28 Mar 2018 08:44:20 -0700 (PDT) From: Didier Pallard To: dev@dpdk.org Date: Wed, 28 Mar 2018 17:43:42 +0200 Message-Id: <20180328154349.24976-2-didier.pallard@6wind.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180328154349.24976-1-didier.pallard@6wind.com> References: <20180328154349.24976-1-didier.pallard@6wind.com> Subject: [dpdk-dev] [PATCH 1/8] net: export IPv6 header extensions skip function X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" skip_ip6_ext function can be exported as a helper, it may be used by some PMD to skip IPv6 header extensions. Signed-off-by: Didier Pallard Acked-by: Olivier Matz --- lib/librte_net/Makefile | 1 + lib/librte_net/rte_net.c | 21 ++++++++++++++------- lib/librte_net/rte_net.h | 27 +++++++++++++++++++++++++++ lib/librte_net/rte_net_version.map | 1 + 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/lib/librte_net/Makefile b/lib/librte_net/Makefile index 95ff54900..85e403f41 100644 --- a/lib/librte_net/Makefile +++ b/lib/librte_net/Makefile @@ -5,6 +5,7 @@ include $(RTE_SDK)/mk/rte.vars.mk LIB = librte_net.a +CFLAGS += -DALLOW_EXPERIMENTAL_API CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR) -O3 LDLIBS += -lrte_mbuf -lrte_eal -lrte_mempool diff --git a/lib/librte_net/rte_net.c b/lib/librte_net/rte_net.c index 56a13e3c4..9eb7c7438 100644 --- a/lib/librte_net/rte_net.c +++ b/lib/librte_net/rte_net.c @@ -178,8 +178,8 @@ ip4_hlen(const struct ipv4_hdr *hdr) } /* parse ipv6 extended headers, update offset and return next proto */ -static uint16_t -skip_ip6_ext(uint16_t proto, const struct rte_mbuf *m, uint32_t *off, +int __rte_experimental +rte_net_skip_ip6_ext(uint16_t proto, const struct rte_mbuf *m, uint32_t *off, int *frag) { struct ext_hdr { @@ -201,7 +201,7 @@ skip_ip6_ext(uint16_t proto, const struct rte_mbuf *m, uint32_t *off, xh = rte_pktmbuf_read(m, *off, sizeof(*xh), &xh_copy); if (xh == NULL) - return 0; + return -1; *off += (xh->len + 1) * 8; proto = xh->next_hdr; break; @@ -209,7 +209,7 @@ skip_ip6_ext(uint16_t proto, const struct rte_mbuf *m, uint32_t *off, xh = rte_pktmbuf_read(m, *off, sizeof(*xh), &xh_copy); if (xh == NULL) - return 0; + return -1; *off += 8; proto = xh->next_hdr; *frag = 1; @@ -220,7 +220,7 @@ skip_ip6_ext(uint16_t proto, const struct rte_mbuf *m, uint32_t *off, return proto; } } - return 0; + return -1; } /* parse mbuf data to get packet type */ @@ -233,6 +233,7 @@ uint32_t rte_net_get_ptype(const struct rte_mbuf *m, uint32_t pkt_type = RTE_PTYPE_L2_ETHER; uint32_t off = 0; uint16_t proto; + int ret; if (hdr_lens == NULL) hdr_lens = &local_hdr_lens; @@ -316,7 +317,10 @@ uint32_t rte_net_get_ptype(const struct rte_mbuf *m, off += hdr_lens->l3_len; pkt_type |= ptype_l3_ip6(proto); if ((pkt_type & RTE_PTYPE_L3_MASK) == RTE_PTYPE_L3_IPV6_EXT) { - proto = skip_ip6_ext(proto, m, &off, &frag); + ret = rte_net_skip_ip6_ext(proto, m, &off, &frag); + if (ret < 0) + return pkt_type; + proto = ret; hdr_lens->l3_len = off - hdr_lens->l2_len; } if (proto == 0) @@ -449,7 +453,10 @@ uint32_t rte_net_get_ptype(const struct rte_mbuf *m, uint32_t prev_off; prev_off = off; - proto = skip_ip6_ext(proto, m, &off, &frag); + ret = rte_net_skip_ip6_ext(proto, m, &off, &frag); + if (ret < 0) + return pkt_type; + proto = ret; hdr_lens->inner_l3_len += off - prev_off; } if (proto == 0) diff --git a/lib/librte_net/rte_net.h b/lib/librte_net/rte_net.h index 0e97901f3..b6ab6e1d5 100644 --- a/lib/librte_net/rte_net.h +++ b/lib/librte_net/rte_net.h @@ -29,6 +29,33 @@ struct rte_net_hdr_lens { }; /** + * Skip IPv6 header extensions. + * + * This function skips all IPv6 extensions, returning size of + * complete header including options and final protocol value. + * + * @warning + * @b EXPERIMENTAL: this API may change without prior notice + * + * @param proto + * Protocol field of IPv6 header. + * @param m + * The packet mbuf to be parsed. + * @param off + * On input, must contain the offset to the first byte following + * IPv6 header, on output, contains offset to the first byte + * of next layer (after any IPv6 extension header) + * @param frag + * Contains 1 in output if packet is an IPv6 fragment. + * @return + * Protocol that follows IPv6 header. + * -1 if an error occurs during mbuf parsing. + */ +int __rte_experimental +rte_net_skip_ip6_ext(uint16_t proto, const struct rte_mbuf *m, uint32_t *off, + int *frag); + +/** * Parse an Ethernet packet to get its packet type. * * This function parses the network headers in mbuf data and return its diff --git a/lib/librte_net/rte_net_version.map b/lib/librte_net/rte_net_version.map index 213e6fd32..8bc57d51c 100644 --- a/lib/librte_net/rte_net_version.map +++ b/lib/librte_net/rte_net_version.map @@ -17,4 +17,5 @@ EXPERIMENTAL { global: rte_net_make_rarp_packet; + rte_net_skip_ip6_ext; } DPDK_17.05;