From patchwork Wed Oct 31 02:17:56 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cody Doucette X-Patchwork-Id: 47591 X-Patchwork-Delegate: thomas@monjalon.net 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 503054CB3; Wed, 31 Oct 2018 03:18:37 +0100 (CET) Received: from relay64.bu.edu (relay64.bu.edu [128.197.228.104]) by dpdk.org (Postfix) with ESMTP id 685574C91 for ; Wed, 31 Oct 2018 03:18:33 +0100 (CET) X-Envelope-From: doucette@bu.edu X-BU-AUTH: xia1.bu.edu [128.197.41.97] Received: from BU-AUTH (localhost.localdomain [127.0.0.1]) (authenticated bits=0) by relay64.bu.edu (8.14.3/8.14.3) with ESMTP id w9V2I3mP032189 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO); Tue, 30 Oct 2018 22:18:13 -0400 From: Cody Doucette To: Gaetan Rivet Cc: dev@dpdk.org, Cody Doucette Date: Wed, 31 Oct 2018 02:17:56 +0000 Message-Id: <20181031021758.66752-2-doucette@bu.edu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181031021758.66752-1-doucette@bu.edu> References: <20181031021758.66752-1-doucette@bu.edu> Subject: [dpdk-dev] [PATCH v5 1/3] net/failsafe: remove D_XOPEN_SOURCE flag 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" Compilation flag D_XOPEN_SOURCE is causing failsafe to fail to build when changing some DPDK libraries. The flag is not needed and therefore is removed. Signed-off-by: Cody Doucette --- drivers/net/failsafe/Makefile | 1 - drivers/net/failsafe/meson.build | 1 - 2 files changed, 2 deletions(-) diff --git a/drivers/net/failsafe/Makefile b/drivers/net/failsafe/Makefile index 81802d092..eb9292425 100644 --- a/drivers/net/failsafe/Makefile +++ b/drivers/net/failsafe/Makefile @@ -34,7 +34,6 @@ CFLAGS += -std=gnu99 -Wextra CFLAGS += -O3 CFLAGS += -I. CFLAGS += -D_DEFAULT_SOURCE -CFLAGS += -D_XOPEN_SOURCE=700 CFLAGS += $(WERROR_FLAGS) CFLAGS += -Wno-strict-prototypes CFLAGS += -pedantic diff --git a/drivers/net/failsafe/meson.build b/drivers/net/failsafe/meson.build index a249ff4af..d47a52acd 100644 --- a/drivers/net/failsafe/meson.build +++ b/drivers/net/failsafe/meson.build @@ -3,7 +3,6 @@ cflags += '-std=gnu99' cflags += '-D_DEFAULT_SOURCE' -cflags += '-D_XOPEN_SOURCE=700' cflags += '-pedantic' if host_machine.system() == 'linux' cflags += '-DLINUX' From patchwork Wed Oct 31 02:17:57 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cody Doucette X-Patchwork-Id: 47592 X-Patchwork-Delegate: thomas@monjalon.net 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 8444B4F91; Wed, 31 Oct 2018 03:18:47 +0100 (CET) Received: from relay64.bu.edu (relay64.bu.edu [128.197.228.104]) by dpdk.org (Postfix) with ESMTP id 3C4F691 for ; Wed, 31 Oct 2018 03:18:46 +0100 (CET) X-Envelope-From: doucette@bu.edu X-BU-AUTH: xia1.bu.edu [128.197.41.97] Received: from BU-AUTH (localhost.localdomain [127.0.0.1]) (authenticated bits=0) by relay64.bu.edu (8.14.3/8.14.3) with ESMTP id w9V2I3mQ032189 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO); Tue, 30 Oct 2018 22:18:14 -0400 From: Cody Doucette To: Olivier Matz Cc: dev@dpdk.org, Cody Doucette Date: Wed, 31 Oct 2018 02:17:57 +0000 Message-Id: <20181031021758.66752-3-doucette@bu.edu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181031021758.66752-1-doucette@bu.edu> References: <20181031021758.66752-1-doucette@bu.edu> Subject: [dpdk-dev] [PATCH v5 2/3] net: add IPv6 extension header definitions 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" Add a common IPv6 extension header and an inline function for determining whether a next header field represents an IPv6 extension header. Signed-off-by: Cody Doucette Acked-by: Olivier Matz --- lib/librte_net/rte_ip.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/lib/librte_net/rte_ip.h b/lib/librte_net/rte_ip.h index f2a8904a2..43dbb15e4 100644 --- a/lib/librte_net/rte_ip.h +++ b/lib/librte_net/rte_ip.h @@ -350,6 +350,14 @@ struct ipv6_hdr { #define IPV6_HDR_FL_MASK ((1u << IPV6_HDR_TC_SHIFT) - 1) #define IPV6_HDR_TC_MASK (0xf << IPV6_HDR_TC_SHIFT) +/** + * IPv6 extension header + */ +struct ipv6_opt_hdr { + uint8_t nexthdr; /**< Next header. */ + uint8_t hdrlen; /**< Length; presence & meaning varies by ext type. */ +} __attribute__((packed)); + /** * Process the pseudo-header checksum of an IPv6 header. * @@ -421,6 +429,25 @@ rte_ipv6_udptcp_cksum(const struct ipv6_hdr *ipv6_hdr, const void *l4_hdr) return (uint16_t)cksum; } +/** + * Check whether an IPv6 nexthdr value is for an IPv6 extension header. + * + * @param nexthdr + * The protocol/next header field from an IPv6 (extension) header. + * @return + * Whether the nexthdr field is for an IPv6 extension header. + */ +static inline int +ipv6_ext_hdr(uint8_t nexthdr) +{ + return (nexthdr == IPPROTO_HOPOPTS) || + (nexthdr == IPPROTO_ROUTING) || + (nexthdr == IPPROTO_FRAGMENT) || + (nexthdr == IPPROTO_AH) || + (nexthdr == IPPROTO_NONE) || + (nexthdr == IPPROTO_DSTOPTS); +} + #ifdef __cplusplus } #endif From patchwork Wed Oct 31 02:17:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cody Doucette X-Patchwork-Id: 47589 X-Patchwork-Delegate: thomas@monjalon.net 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 CA981F94; Wed, 31 Oct 2018 03:18:31 +0100 (CET) Received: from relay64.bu.edu (relay64.bu.edu [128.197.228.104]) by dpdk.org (Postfix) with ESMTP id 39A56A49 for ; Wed, 31 Oct 2018 03:18:30 +0100 (CET) X-Envelope-From: doucette@bu.edu X-BU-AUTH: xia1.bu.edu [128.197.41.97] Received: from BU-AUTH (localhost.localdomain [127.0.0.1]) (authenticated bits=0) by relay64.bu.edu (8.14.3/8.14.3) with ESMTP id w9V2I3mR032189 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO); Tue, 30 Oct 2018 22:18:15 -0400 From: Cody Doucette To: Konstantin Ananyev , Cristian Dumitrescu Cc: dev@dpdk.org, Cody Doucette , Qiaobin Fu Date: Wed, 31 Oct 2018 02:17:58 +0000 Message-Id: <20181031021758.66752-4-doucette@bu.edu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181031021758.66752-1-doucette@bu.edu> References: <20181031021758.66752-1-doucette@bu.edu> Subject: [dpdk-dev] [PATCH v5 3/3] ip_frag: extend IPv6 fragment header retrieval 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" Add the ability to parse IPv6 extenders to find the IPv6 fragment header, and update callers. According to RFC 8200, there is no guarantee that the IPv6 Fragment extension header will come before any other extension header, even though it is recommended. Signed-off-by: Cody Doucette Signed-off-by: Qiaobin Fu Reviewed-by: Michel Machado --- examples/ip_reassembly/main.c | 6 ++-- lib/librte_ip_frag/rte_ip_frag.h | 23 ++++++------- lib/librte_ip_frag/rte_ip_frag_version.map | 1 + lib/librte_ip_frag/rte_ipv6_fragmentation.c | 38 +++++++++++++++++++++ lib/librte_ip_frag/rte_ipv6_reassembly.c | 4 +-- lib/librte_port/rte_port_ras.c | 6 ++-- 6 files changed, 59 insertions(+), 19 deletions(-) diff --git a/examples/ip_reassembly/main.c b/examples/ip_reassembly/main.c index 17b55d4c7..3a827bd6c 100644 --- a/examples/ip_reassembly/main.c +++ b/examples/ip_reassembly/main.c @@ -365,12 +365,14 @@ reassemble(struct rte_mbuf *m, uint16_t portid, uint32_t queue, eth_hdr->ether_type = rte_be_to_cpu_16(ETHER_TYPE_IPv4); } else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) { /* if packet is IPv6 */ - struct ipv6_extension_fragment *frag_hdr; + const struct ipv6_extension_fragment *frag_hdr; + struct ipv6_extension_fragment frag_hdr_buf; struct ipv6_hdr *ip_hdr; ip_hdr = (struct ipv6_hdr *)(eth_hdr + 1); - frag_hdr = rte_ipv6_frag_get_ipv6_fragment_header(ip_hdr); + frag_hdr = rte_ipv6_frag_get_ipv6_fragment_header(m, + ip_hdr, &frag_hdr_buf); if (frag_hdr != NULL) { struct rte_mbuf *mo; diff --git a/lib/librte_ip_frag/rte_ip_frag.h b/lib/librte_ip_frag/rte_ip_frag.h index 7f425f610..6fc8106bc 100644 --- a/lib/librte_ip_frag/rte_ip_frag.h +++ b/lib/librte_ip_frag/rte_ip_frag.h @@ -211,28 +211,25 @@ rte_ipv6_fragment_packet(struct rte_mbuf *pkt_in, struct rte_mbuf *rte_ipv6_frag_reassemble_packet(struct rte_ip_frag_tbl *tbl, struct rte_ip_frag_death_row *dr, struct rte_mbuf *mb, uint64_t tms, struct ipv6_hdr *ip_hdr, - struct ipv6_extension_fragment *frag_hdr); + const struct ipv6_extension_fragment *frag_hdr); /** * Return a pointer to the packet's fragment header, if found. - * It only looks at the extension header that's right after the fixed IPv6 - * header, and doesn't follow the whole chain of extension headers. * - * @param hdr + * @param pkt + * Pointer to the mbuf of the packet. + * @param ip_hdr * Pointer to the IPv6 header. + * @param frag_hdr + * A pointer to the buffer where the fragment header + * will be copied if it is not contiguous in mbuf data. * @return * Pointer to the IPv6 fragment extension header, or NULL if it's not * present. */ -static inline struct ipv6_extension_fragment * -rte_ipv6_frag_get_ipv6_fragment_header(struct ipv6_hdr *hdr) -{ - if (hdr->proto == IPPROTO_FRAGMENT) { - return (struct ipv6_extension_fragment *) ++hdr; - } - else - return NULL; -} +const struct ipv6_extension_fragment *rte_ipv6_frag_get_ipv6_fragment_header( + struct rte_mbuf *pkt, const struct ipv6_hdr *ip_hdr, + struct ipv6_extension_fragment *frag_hdr); /** * IPv4 fragmentation. diff --git a/lib/librte_ip_frag/rte_ip_frag_version.map b/lib/librte_ip_frag/rte_ip_frag_version.map index d40d5515f..8b4c82d08 100644 --- a/lib/librte_ip_frag/rte_ip_frag_version.map +++ b/lib/librte_ip_frag/rte_ip_frag_version.map @@ -8,6 +8,7 @@ DPDK_2.0 { rte_ipv4_fragment_packet; rte_ipv6_frag_reassemble_packet; rte_ipv6_fragment_packet; + rte_ipv6_frag_get_ipv6_fragment_header; local: *; }; diff --git a/lib/librte_ip_frag/rte_ipv6_fragmentation.c b/lib/librte_ip_frag/rte_ipv6_fragmentation.c index 62a7e4e83..bd847dd3d 100644 --- a/lib/librte_ip_frag/rte_ipv6_fragmentation.c +++ b/lib/librte_ip_frag/rte_ipv6_fragmentation.c @@ -176,3 +176,41 @@ rte_ipv6_fragment_packet(struct rte_mbuf *pkt_in, return out_pkt_pos; } + +const struct ipv6_extension_fragment * +rte_ipv6_frag_get_ipv6_fragment_header(struct rte_mbuf *pkt, + const struct ipv6_hdr *ip_hdr, + struct ipv6_extension_fragment *frag_hdr) +{ + size_t offset = sizeof(struct ipv6_hdr); + uint8_t nexthdr = ip_hdr->proto; + + while (ipv6_ext_hdr(nexthdr)) { + struct ipv6_opt_hdr opt; + const struct ipv6_opt_hdr *popt = rte_pktmbuf_read(pkt, + offset, sizeof(opt), &opt); + if (popt == NULL) + return NULL; + + switch (nexthdr) { + case IPPROTO_NONE: + return NULL; + + case IPPROTO_FRAGMENT: + return rte_pktmbuf_read(pkt, offset, + sizeof(*frag_hdr), frag_hdr); + + case IPPROTO_AH: + offset += (popt->hdrlen + 2) << 2; + break; + + default: + offset += (popt->hdrlen + 1) << 3; + break; + } + + nexthdr = popt->nexthdr; + } + + return NULL; +} diff --git a/lib/librte_ip_frag/rte_ipv6_reassembly.c b/lib/librte_ip_frag/rte_ipv6_reassembly.c index db249fe60..b2d67a3f0 100644 --- a/lib/librte_ip_frag/rte_ipv6_reassembly.c +++ b/lib/librte_ip_frag/rte_ipv6_reassembly.c @@ -135,8 +135,8 @@ ipv6_frag_reassemble(struct ip_frag_pkt *fp) #define FRAG_OFFSET(x) (rte_cpu_to_be_16(x) >> 3) struct rte_mbuf * rte_ipv6_frag_reassemble_packet(struct rte_ip_frag_tbl *tbl, - struct rte_ip_frag_death_row *dr, struct rte_mbuf *mb, uint64_t tms, - struct ipv6_hdr *ip_hdr, struct ipv6_extension_fragment *frag_hdr) + struct rte_ip_frag_death_row *dr, struct rte_mbuf *mb, uint64_t tms, + struct ipv6_hdr *ip_hdr, const struct ipv6_extension_fragment *frag_hdr) { struct ip_frag_pkt *fp; struct ip_frag_key key; diff --git a/lib/librte_port/rte_port_ras.c b/lib/librte_port/rte_port_ras.c index c8b2e19bf..28764f744 100644 --- a/lib/librte_port/rte_port_ras.c +++ b/lib/librte_port/rte_port_ras.c @@ -184,9 +184,11 @@ process_ipv6(struct rte_port_ring_writer_ras *p, struct rte_mbuf *pkt) /* Assume there is no ethernet header */ struct ipv6_hdr *pkt_hdr = rte_pktmbuf_mtod(pkt, struct ipv6_hdr *); - struct ipv6_extension_fragment *frag_hdr; + const struct ipv6_extension_fragment *frag_hdr; + struct ipv6_extension_fragment frag_hdr_buf; uint16_t frag_data = 0; - frag_hdr = rte_ipv6_frag_get_ipv6_fragment_header(pkt_hdr); + frag_hdr = rte_ipv6_frag_get_ipv6_fragment_header(pkt, pkt_hdr, + &frag_hdr_buf); if (frag_hdr != NULL) frag_data = rte_be_to_cpu_16(frag_hdr->frag_data);