From patchwork Wed Mar 28 23:29:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qi Zhang X-Patchwork-Id: 36638 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 92C7344BE; Thu, 29 Mar 2018 08:39:29 +0200 (CEST) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id B8E31322C for ; Thu, 29 Mar 2018 08:39:25 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Mar 2018 23:39:25 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,375,1517904000"; d="scan'208";a="27919522" Received: from dpdk27.sh.intel.com ([10.67.111.90]) by fmsmga007.fm.intel.com with ESMTP; 28 Mar 2018 23:39:23 -0700 From: Qi Zhang To: adrien.mazarguil@6wind.com Cc: dev@dpdk.org, declan.doherty@intel.com, sugesh.chandran@intel.com, michael.j.glynn@intel.com, yu.y.liu@intel.com, konstantin.ananyev@intel.com, bruce.richardson@intel.com, Qi Zhang Date: Wed, 28 Mar 2018 19:29:39 -0400 Message-Id: <1522279780-34842-4-git-send-email-qi.z.zhang@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1522279780-34842-1-git-send-email-qi.z.zhang@intel.com> References: <1522279780-34842-1-git-send-email-qi.z.zhang@intel.com> Subject: [dpdk-dev] [PATCH 3/4] ether: add more protocol support in flow API 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 new protocol header match support as below RTE_FLOW_ITEM_TYPE_ARP - match IPv4 ARP header RTE_FLOW_ITEM_TYPE_EXT_HDR_ANY - match any IPv6 extension header RTE_FLOW_ITEM_TYPE_ICMPV6 - match IPv6 ICMP header RTE_FLOW_ITEM_TYPE_ICMPV6_TGT_ADDR - match IPv6 ICMP Target address RTE_FLOW_ITEM_TYPE_ICMPV6_SSL - match IPv6 ICMP Source Link-layer address RTE_FLOW_ITEM_TYPE_ICMPV6_TTL - match IPv6 ICMP Target Link-layer address Signed-off-by: Qi Zhang --- lib/librte_ether/rte_flow.h | 158 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) diff --git a/lib/librte_ether/rte_flow.h b/lib/librte_ether/rte_flow.h index 1288379..f38b7be 100644 --- a/lib/librte_ether/rte_flow.h +++ b/lib/librte_ether/rte_flow.h @@ -323,6 +323,49 @@ enum rte_flow_item_type { * See struct rte_flow_item_geneve. */ RTE_FLOW_ITEM_TYPE_GENEVE, + + /** + * Matches ARP IPv4 header. + * + * See struct rte_flow_item_arp. + */ + TE_FLOW_ITEM_TYPE_ARP, + + /** + * Matches any IPv6 Extension header. + * + * See struct rte_flow_item_ipv6_ext_any. + */ + TE_FLOW_ITEM_TYPE_IPV6_EXT_HDR_ANY, + + /** + * Matches ICMPv6 header. + * + * See struct rte_flow_item_icmpv6 + */ + TE_FLOW_ITEM_TYPE_ICMPV6, + + /** + * Match ICMPv6 target address. + * + * See struct rte_flow_item_icmpv6_tgt_addr. + */ + TE_FLOW_ITEM_TYPE_ICMPV6_TGT_ADDR, + + /** + * Match ICMPv6 Source Link-Layer Address. + * + * See struct rte_flow_item_icmpv6_sll. + */ + TE_FLOW_ITEM_TYPE_ICMPV6_SLL, + + /** + * Match ICMPv6 Source Link-Layer Address. + * + * See struct rte_flow_item_icmpv6_tll. + */ + RTE_FLOW_ITEM_TYPE_ICMPV6_TLL, + }; /** @@ -815,6 +858,121 @@ static const struct rte_flow_item_geneve rte_flow_item_geneve_mask = { #endif /** + * RTE_FLOW_ITEM_TYPE_ARP + * + * Matches IPv4 ARP packet header + */ +struct rte_flow_item_arp { + struct arp_hdr hdr; +}; + +/** Default mask for RTE_FLOW_ITEM_TYPE_ARP. */ +#ifndef __cplusplus +static const struct rte_flow_item_arp rte_flow_item_arp_mask = { + .hdr = { + .arp_data = { + .arp_sha = { + .addr_bytes = "\xff\xff\xff\xff\xff\xff", + }, + .arp_sip = RTE_BE32(0xffffffff), + .arp_tha = { + .addr_bytes = "\xff\xff\xff\xff\xff\xff", + }, + .arp_tip = RTE_BE32(0xffffffff), + }, + }, +}; +#endif + +/** + * RTE_FLOW_ITEM_TYPE_IPV6_EXT_HDR_ANY + * + * Matches any IPv6 extension header. + */ +struct rte_flow_item_ipv6_ext_hdr_any { + uint8_t next_hdr; +}; + +/** Default mask for RTE_FLOW_ITEM_TYPE_IPV6_EXT_HDR_ANY. */ +#ifndef __cplusplus +static const +struct rte_flow_item_ipv6_ext_hdr_any rte_flow_item_ipv6_ext_any_mask = { + .next_hdr = 0xff, +}; +#endif + +/** + * RTE_FLOW_ITEM_TYPE_ICMPV6 + * + * Matches ICMPv6 header. + */ +struct rte_flow_item_icmpv6 { + uint8_t type; + uint8_t code; + uint16_t checksum; +}; + +/** Default mask for RTE_FLOW_ITEM_TYPE_ICMPV6 */ +#ifndef __cplusplus +static const struct rte_flow_item_icmpv6 rte_flow_item_icmpv6_mask = { + .type = 0xff, + .code = 0xff, + .checksum = RTE_BE16(0xffff), +}; +#endif + +/** + * RTE_FLOW_ITEM_TYPE_ICMPV6_TGT_ADDR + * + * Matches ICMPv6's Target Address. + */ +struct rte_flow_item_icmpv6_tgt_addr { + uint8_t addr[16]; +}; + +/** Default mask for RTE_FLOW_ITEM_TYPE_ICMPV6_TGT_ADDR */ +#ifndef __cplusplus +static const +struct rte_flow_item_icmpv6_tgt_addr rte_flow_item_icmpv6_tgt_addr_mask = { + .addr = "\xff\xff\xff\xff", +}; +#endif + +/** + * RTE_FLOW_ITEM_TYPE_ICPMV6_SLL. + * + * Matches ICMPv6 Source Link-Layer address. + */ +struct rte_flow_item_icmpv6_sll { + struct ether_addr addr; +}; +/** Default mask for RTE_FLOW_ITEM_TYPE_ICMPV6_SLL */ +#ifndef __cplusplus +static const struct rte_flow_item_icmpv6_sll rte_flow_item_icmpv6_sll_mask = { + .addr = { + .addr_bytes = "\xff\xff\xff\xff\xff\xff", + } +}; +#endif + +/** + * RTE_FLOW_ITEM_TYPE_ICMPV6_TLL. + * + * Matches ICMPv6 Target Link-Layer address. + */ +struct rte_flow_item_icmpv6_tll { + struct ether_addr addr; +}; +/** Default mask for RTE_FLOW_ITEM_TYPE_ICMPV6_TLL */ +#ifndef __cplusplus +static const struct rte_flow_item_icmpv6_tll rte_flow_item_icmpv6_tll_mask = { + .addr = { + .addr_bytes = "\xff\xff\xff\xff\xff\xff", + } +}; +#endif + +/** * Matching pattern item definition. * * A pattern is formed by stacking items starting from the lowest protocol