From patchwork Thu Dec 14 17:00:09 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Github ODP bot X-Patchwork-Id: 121992 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp7063398qgn; Thu, 14 Dec 2017 09:01:55 -0800 (PST) X-Google-Smtp-Source: ACJfBouXwN/YQl759nfnXZRHGknMwq3qEgmUvzncyewAdUj8SDUsSmR3e0wMqKezwgNhBgVP8ma4 X-Received: by 10.98.71.144 with SMTP id p16mr10163453pfi.15.1513270915390; Thu, 14 Dec 2017 09:01:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513270914; cv=none; d=google.com; s=arc-20160816; b=JkAZYV559iGXgcgmaT3aiOP/7djAF7mdB6QAuAuoOmSr7b0cL35q0XrKTWw0DWpIXB F0wRGFg4fY31bFCJFykRBL9SioVtFXVaJqUh02a/443nxm/pFlcSVt/44uuD90f7pCMZ P1CSf+Qc/cBcqPT1NuKNoxBupk6uo28c8GK1nkTK+e8pdRHhfEBjpIIm5vRhfGN0J4bf JQiES947fLDBkXiCBuESxXRo5YYf+k/rhoQl0XPpbH991E7SKJhYQ1OlGEXw4+FdOquo rWYcMDO/qI0z19sPb4FEh43UJBdrJhZJNHzkmVJSmQab66koLVefixhzSG2dSuN6XiWe B0aQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:github-pr-num :references:in-reply-to:message-id:date:to:from:delivered-to :arc-authentication-results; bh=B+84Degwx4GaPdTtULklXr7UAYRHgmyB2bFYqMCHX+I=; b=diifrs2G4XozhO3HT+pQfUFa67/i/cnHwu1fO6iSN2mlq7e7IrI2skoLi+MfeFcVcl 7fJzT2Mn2N1h97ut/vUHP3KkmEkhVn/v93heleFpc5D8XkbDhvbckPyZRumbHzFUqWeJ CMlFvlnTpQoWV5LhnzlF2kYRtUykCFYGwll4K2uPAy33ZosMQZs1e8CMvh6f6420L08h Bod2lItazWKw+mzXRrn2HnRpW0PNuP9pLVHoja5ft8uwofCN52yIZd6R0HDcEoojT22k MnS456iR1aksp6G7oOReh2e/gtpNq1a5MYWe7OD6++xIhU9RLz+jVTbKugmlCigiol/M MNXA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Return-Path: Received: from lists.linaro.org (ec2-54-197-127-237.compute-1.amazonaws.com. [54.197.127.237]) by mx.google.com with ESMTP id t65si4678500qke.95.2017.12.14.09.01.54; Thu, 14 Dec 2017 09:01:54 -0800 (PST) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) client-ip=54.197.127.237; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.197.127.237 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=yandex.ru Received: by lists.linaro.org (Postfix, from userid 109) id 9D28560918; Thu, 14 Dec 2017 17:01:54 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id 77FED60970; Thu, 14 Dec 2017 17:00:28 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 287D660926; Thu, 14 Dec 2017 17:00:18 +0000 (UTC) Received: from forward105p.mail.yandex.net (forward105p.mail.yandex.net [77.88.28.108]) by lists.linaro.org (Postfix) with ESMTPS id EC13D6091D for ; Thu, 14 Dec 2017 17:00:14 +0000 (UTC) Received: from mxback9j.mail.yandex.net (mxback9j.mail.yandex.net [IPv6:2a02:6b8:0:1619::112]) by forward105p.mail.yandex.net (Yandex) with ESMTP id 7E57E408346B for ; Thu, 14 Dec 2017 20:00:13 +0300 (MSK) Received: from smtp3o.mail.yandex.net (smtp3o.mail.yandex.net [2a02:6b8:0:1a2d::27]) by mxback9j.mail.yandex.net (nwsmtp/Yandex) with ESMTP id wA206Vfm0I-0Dr8X9uv; Thu, 14 Dec 2017 20:00:13 +0300 Received: by smtp3o.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id P3vbKkCfK1-0CrS6nH4; Thu, 14 Dec 2017 20:00:12 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client certificate not present) From: Github ODP bot To: lng-odp@lists.linaro.org Date: Thu, 14 Dec 2017 20:00:09 +0300 Message-Id: <1513270810-29728-4-git-send-email-odpbot@yandex.ru> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1513270810-29728-1-git-send-email-odpbot@yandex.ru> References: <1513270810-29728-1-git-send-email-odpbot@yandex.ru> Github-pr-num: 345 Subject: [lng-odp] [PATCH v2 3/4] linux-gen: cls: LD_VNI pmr term implementation X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" From: Balasubramanian Manoharan Update packet parsing function to handle inner header packet parsing for vxlan packets. Add classification verification function for pmr term ODP_PMR_TERM_LD_VNI. Signed-off-by: Balasubramanian Manoharan --- /** Email created from pull request 345 (bala-manoharan:BUG2903) ** https://github.com/Linaro/odp/pull/345 ** Patch: https://github.com/Linaro/odp/pull/345.patch ** Base sha: 6b5cdc77eb9759a2349b10372a964648559bc92c ** Merge commit sha: 65c561d30ea4c8c5f8ae17c2b407df9c6cc35f3d **/ .../include/odp/api/plat/packet_types.h | 1 + .../include/odp_classification_inlines.h | 23 +++++++++--- .../linux-generic/include/odp_packet_internal.h | 5 +-- platform/linux-generic/odp_classification.c | 4 +-- platform/linux-generic/odp_packet.c | 41 +++++++++++++++++----- platform/linux-generic/odp_packet_flags.c | 10 ++++++ 6 files changed, 67 insertions(+), 17 deletions(-) diff --git a/platform/linux-generic/include/odp/api/plat/packet_types.h b/platform/linux-generic/include/odp/api/plat/packet_types.h index 009a3aa7c..89eff1b70 100644 --- a/platform/linux-generic/include/odp/api/plat/packet_types.h +++ b/platform/linux-generic/include/odp/api/plat/packet_types.h @@ -146,6 +146,7 @@ typedef union { uint64_t sctp:1; /**< SCTP */ uint64_t icmp:1; /**< ICMP */ + uint64_t vxlan:1; /**< VXLAN */ uint64_t color:2; /**< Packet color for traffic mgmt */ uint64_t nodrop:1; /**< Drop eligibility status */ }; diff --git a/platform/linux-generic/include/odp_classification_inlines.h b/platform/linux-generic/include/odp_classification_inlines.h index 2747db8cc..f48bbf514 100644 --- a/platform/linux-generic/include/odp_classification_inlines.h +++ b/platform/linux-generic/include/odp_classification_inlines.h @@ -24,6 +24,7 @@ extern "C" { #include #include #include +#include #include #include #include @@ -304,11 +305,25 @@ static inline int verify_pmr_ipsec_spi(const uint8_t *pkt_addr, return 0; } -static inline int verify_pmr_ld_vni(const uint8_t *pkt_addr ODP_UNUSED, - odp_packet_hdr_t *pkt_hdr ODP_UNUSED, - pmr_term_value_t *term_value ODP_UNUSED) +static inline int verify_pmr_ld_vni(const uint8_t *pkt_addr, + odp_packet_hdr_t *pkt_hdr, + pmr_term_value_t *term_value) { - ODP_UNIMPLEMENTED(); + uint32_t vni; + uint32_t vni_be; + const _odp_vxlanhdr_t *vxlan; + + if (!pkt_hdr->p.input_flags.vxlan) + return 0; + + pkt_addr += pkt_hdr->p.l4_offset; + pkt_addr += _ODP_UDPHDR_LEN; + vxlan = (const _odp_vxlanhdr_t *)pkt_addr; + vni = odp_be_to_cpu_32(vxlan->vni); + vni_be = ODPH_VXLAN_VNI(vni); + if (term_value->match.value == (vni_be & term_value->match.mask)) + return 1; + return 0; } diff --git a/platform/linux-generic/include/odp_packet_internal.h b/platform/linux-generic/include/odp_packet_internal.h index fb3d44498..94cca9aa3 100644 --- a/platform/linux-generic/include/odp_packet_internal.h +++ b/platform/linux-generic/include/odp_packet_internal.h @@ -120,6 +120,7 @@ typedef struct { */ packet_parser_t p; + packet_parser_t inner_p; odp_pktio_t input; @@ -310,8 +311,8 @@ static inline void packet_set_ts(odp_packet_hdr_t *pkt_hdr, odp_time_t *ts) } } -int packet_parse_common(packet_parser_t *pkt_hdr, const uint8_t *ptr, - uint32_t pkt_len, uint32_t seg_len, +int packet_parse_common(packet_parser_t *pkt_hdr, packet_parser_t *innner_prs, + const uint8_t *ptr, uint32_t pkt_len, uint32_t seg_len, odp_pktio_parser_layer_t layer); int _odp_cls_parse(odp_packet_hdr_t *pkt_hdr, const uint8_t *parseptr); diff --git a/platform/linux-generic/odp_classification.c b/platform/linux-generic/odp_classification.c index 3dabb3873..cab74e159 100644 --- a/platform/linux-generic/odp_classification.c +++ b/platform/linux-generic/odp_classification.c @@ -856,8 +856,8 @@ int cls_classify_packet(pktio_entry_t *entry, const uint8_t *base, packet_parse_reset(pkt_hdr); packet_set_len(pkt_hdr, pkt_len); - packet_parse_common(&pkt_hdr->p, base, pkt_len, seg_len, - ODP_PKTIO_PARSER_LAYER_ALL); + packet_parse_common(&pkt_hdr->p, &pkt_hdr->inner_p, base, pkt_len, + seg_len, ODP_PKTIO_PARSER_LAYER_ALL); cos = cls_select_cos(entry, base, pkt_hdr); if (cos == NULL) diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index 04f1f33bb..d2cbf5b46 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -1982,12 +1983,31 @@ static inline void parse_tcp(packet_parser_t *prs, *parseptr += (uint32_t)tcp->hl * 4; } +static inline void parse_vxlan(packet_parser_t *prs, packet_parser_t *in_prs, + const uint8_t **parseptr, uint32_t *offset, + uint32_t frame_len, uint32_t seg_len) +{ + const _odp_vxlanhdr_t *vxlan = (const _odp_vxlanhdr_t *)*parseptr; + + if (ODPH_VXLAN_BIT(vxlan->flags)) + prs->input_flags.vxlan = 1; + + if (offset) + *offset += sizeof(_odp_vxlanhdr_t); + + *parseptr += sizeof(_odp_vxlanhdr_t); + packet_parse_common(in_prs, prs, *parseptr, frame_len, seg_len, + ODP_PKTIO_PARSER_LAYER_L4); +} + /** * Parser helper function for UDP */ -static inline void parse_udp(packet_parser_t *prs, - const uint8_t **parseptr, uint32_t *offset) +static inline void parse_udp(packet_parser_t *prs, packet_parser_t *in_p, + const uint8_t **parseptr, uint32_t *offset, + uint32_t frame_len, uint32_t seg_len) { + uint16_t dport; const _odp_udphdr_t *udp = (const _odp_udphdr_t *)*parseptr; uint32_t udplen = odp_be_to_cpu_16(udp->length); @@ -1996,7 +2016,10 @@ static inline void parse_udp(packet_parser_t *prs, if (offset) *offset += sizeof(_odp_udphdr_t); - *parseptr += sizeof(_odp_udphdr_t); + *parseptr += _ODP_UDPHDR_LEN; + dport = odp_be_to_cpu_16(udp->dst_port); + if (dport == _ODP_UDP_VXLAN_PORT) + parse_vxlan(prs, in_p, parseptr, offset, frame_len, seg_len); } /** @@ -2005,9 +2028,9 @@ static inline void parse_udp(packet_parser_t *prs, * The function expects at least PACKET_PARSE_SEG_LEN bytes of data to be * available from the ptr. */ -int packet_parse_common(packet_parser_t *prs, const uint8_t *ptr, - uint32_t frame_len, uint32_t seg_len, - odp_pktio_parser_layer_t layer) +int packet_parse_common(packet_parser_t *prs, packet_parser_t *inner_prs, + const uint8_t *ptr, uint32_t frame_len, + uint32_t seg_len, odp_pktio_parser_layer_t layer) { uint32_t offset; uint16_t ethtype; @@ -2142,7 +2165,7 @@ int packet_parse_common(packet_parser_t *prs, const uint8_t *ptr, if (odp_unlikely(offset + _ODP_UDPHDR_LEN > seg_len)) return -1; prs->input_flags.udp = 1; - parse_udp(prs, &parseptr, NULL); + parse_udp(prs, inner_prs, &parseptr, NULL, frame_len, seg_len); break; case _ODP_IPPROTO_AH: @@ -2177,8 +2200,8 @@ int packet_parse_layer(odp_packet_hdr_t *pkt_hdr, uint32_t seg_len = packet_first_seg_len(pkt_hdr); void *base = packet_data(pkt_hdr); - return packet_parse_common(&pkt_hdr->p, base, pkt_hdr->frame_len, - seg_len, layer); + return packet_parse_common(&pkt_hdr->p, &pkt_hdr->inner_p, base, + pkt_hdr->frame_len, seg_len, layer); } uint64_t odp_packet_to_u64(odp_packet_t hdl) diff --git a/platform/linux-generic/odp_packet_flags.c b/platform/linux-generic/odp_packet_flags.c index 2e26ad601..e58850431 100644 --- a/platform/linux-generic/odp_packet_flags.c +++ b/platform/linux-generic/odp_packet_flags.c @@ -78,6 +78,11 @@ int odp_packet_has_vlan(odp_packet_t pkt) retflag(pkt, input_flags.vlan); } +int odp_packet_has_vxlan(odp_packet_t pkt) +{ + retflag(pkt, input_flags.vxlan); +} + int odp_packet_has_vlan_qinq(odp_packet_t pkt) { retflag(pkt, input_flags.vlan_qinq); @@ -271,6 +276,11 @@ void odp_packet_has_udp_set(odp_packet_t pkt, int val) setflag(pkt, input_flags.udp, val); } +void odp_packet_has_vxlan_set(odp_packet_t pkt, int val) +{ + setflag(pkt, input_flags.vxlan, val); +} + void odp_packet_has_tcp_set(odp_packet_t pkt, int val) { setflag(pkt, input_flags.tcp, val);