From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 11257A0350; Sun, 28 Jun 2020 18:20:14 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id DBF761D146; Sun, 28 Jun 2020 18:20:13 +0200 (CEST) Received: from git-send-mailer.rdmz.labs.mlnx (unknown [37.142.13.130]) by dpdk.org (Postfix) with ESMTP id 7CBBE1D127 for ; Sun, 28 Jun 2020 18:20:12 +0200 (CEST) From: Bing Zhao To: orika@mellanox.com, john.mcnamara@intel.com, marko.kovacevic@intel.com, thomas@monjalon.net, ferruh.yigit@intel.com, arybchenko@solarflare.com, olivier.matz@6wind.com Cc: dev@dpdk.org Date: Mon, 29 Jun 2020 00:20:01 +0800 Message-Id: <1593361201-424067-1-git-send-email-bingz@mellanox.com> X-Mailer: git-send-email 2.5.5 Subject: [dpdk-dev] [PATCH] rte_flow: add eCPRI key fields to 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 a new item "rte_flow_item_ecpri" in order to match eCRPI header. eCPRI is a packet based protocol used in the fronthaul interface of 5G networks. Header format definition could be found in the specification via the link below: https://www.gigalight.com/downloads/standards/ecpri-specification.pdf eCPRI message can be over Ethernet layer (.1Q supported also) or over UDP layer. Message header formats are the same in these two variants. Signed-off-by: Bing Zhao --- doc/guides/prog_guide/rte_flow.rst | 8 ++ lib/librte_ethdev/rte_flow.c | 1 + lib/librte_ethdev/rte_flow.h | 31 ++++++ lib/librte_net/Makefile | 1 + lib/librte_net/meson.build | 3 +- lib/librte_net/rte_ecpri.h | 160 +++++++++++++++++++++++++++++ lib/librte_net/rte_ether.h | 1 + 7 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 lib/librte_net/rte_ecpri.h diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst index d5dd18ce99..669d519233 100644 --- a/doc/guides/prog_guide/rte_flow.rst +++ b/doc/guides/prog_guide/rte_flow.rst @@ -1362,6 +1362,14 @@ Matches a PFCP Header. - ``seid``: session endpoint identifier. - Default ``mask`` matches s_field and seid. +Item: ``ECPRI`` +^^^^^^^^^^^^^ + +Matches a eCPRI header. + +- ``hdr``: eCPRI header definition (``rte_ecpri.h``). +- Default ``mask`` matches message type of common header only. + Actions ~~~~~~~ diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c index 1685be5f73..f8fdd68fe9 100644 --- a/lib/librte_ethdev/rte_flow.c +++ b/lib/librte_ethdev/rte_flow.c @@ -95,6 +95,7 @@ static const struct rte_flow_desc_data rte_flow_desc_item[] = { MK_FLOW_ITEM(HIGIG2, sizeof(struct rte_flow_item_higig2_hdr)), MK_FLOW_ITEM(L2TPV3OIP, sizeof(struct rte_flow_item_l2tpv3oip)), MK_FLOW_ITEM(PFCP, sizeof(struct rte_flow_item_pfcp)), + MK_FLOW_ITEM(ECPRI, sizeof(struct rte_flow_item_ecpri)), }; /** Generate flow_action[] entry. */ diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h index b0e4199192..2683466f7a 100644 --- a/lib/librte_ethdev/rte_flow.h +++ b/lib/librte_ethdev/rte_flow.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -527,6 +528,13 @@ enum rte_flow_item_type { */ RTE_FLOW_ITEM_TYPE_PFCP, + /** + * Matches eCPRI Header. + * See struct rte_flow_item_ecpri. + * + */ + RTE_FLOW_ITEM_TYPE_ECPRI, + }; /** @@ -1546,6 +1554,29 @@ static const struct rte_flow_item_pfcp rte_flow_item_pfcp_mask = { }; #endif +/** + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice + * + * RTE_FLOW_ITEM_TYPE_ECPRI + * + * Match eCPRI Header + */ +struct rte_flow_item_ecpri { + struct rte_ecpri_msg_hdr hdr; +}; + +/** Default mask for RTE_FLOW_ITEM_TYPE_ECPRI. */ +#ifndef __cplusplus +static const struct rte_flow_item_ecpri rte_flow_item_ecpri_mask = { + .hdr = { + .common = { + .type = 0xFF, + }, + }, +}; +#endif + /** * Matching pattern item definition. * diff --git a/lib/librte_net/Makefile b/lib/librte_net/Makefile index aa1d6fed5a..9830e771b3 100644 --- a/lib/librte_net/Makefile +++ b/lib/librte_net/Makefile @@ -20,5 +20,6 @@ SYMLINK-$(CONFIG_RTE_LIBRTE_NET)-include += rte_sctp.h rte_icmp.h rte_arp.h SYMLINK-$(CONFIG_RTE_LIBRTE_NET)-include += rte_ether.h rte_gre.h rte_net.h SYMLINK-$(CONFIG_RTE_LIBRTE_NET)-include += rte_net_crc.h rte_mpls.h rte_higig.h SYMLINK-$(CONFIG_RTE_LIBRTE_NET)-include += rte_gtp.h rte_vxlan.h +SYMLINK-$(CONFIG_RTE_LIBRTE_NET)-include += rte_ecpri.h include $(RTE_SDK)/mk/rte.lib.mk diff --git a/lib/librte_net/meson.build b/lib/librte_net/meson.build index f799349b3e..24ed8253b4 100644 --- a/lib/librte_net/meson.build +++ b/lib/librte_net/meson.build @@ -15,7 +15,8 @@ headers = files('rte_ip.h', 'rte_net.h', 'rte_net_crc.h', 'rte_mpls.h', - 'rte_higig.h') + 'rte_higig.h', + 'rte_ecpri.h') sources = files('rte_arp.c', 'rte_ether.c', 'rte_net.c', 'rte_net_crc.c') deps += ['mbuf'] diff --git a/lib/librte_net/rte_ecpri.h b/lib/librte_net/rte_ecpri.h new file mode 100644 index 0000000000..c1fd000775 --- /dev/null +++ b/lib/librte_net/rte_ecpri.h @@ -0,0 +1,160 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2020 Mellanox Technologies, Ltd + */ + +#ifndef _RTE_ECPRI_H_ +#define _RTE_ECPRI_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * eCPRI Protocol Revision 1.0, 1.1, 1.2, 2.0: 0001b + * Other values are reserved for future + */ +#define RTE_ECPRI_REV_UPTO_20 1 + +/** + * eCPRI message types in specifications + * IWF* types will only be supported from rev.2 + */ +#define RTE_ECPRI_MSG_TYPE_IQ_DATA 0 +#define RTE_ECPRI_MSG_TYPE_BIT_SEQ 1 +#define RTE_ECPRI_MSG_TYPE_RTC_CTRL 2 +#define RTE_ECPRI_MSG_TYPE_GEN_DATA 3 +#define RTE_ECPRI_MSG_TYPE_RM_ACC 4 +#define RTE_ECPRI_MSG_TYPE_DLY_MSR 5 +#define RTE_ECPRI_MSG_TYPE_RMT_RST 6 +#define RTE_ECPRI_MSG_TYPE_EVT_IND 7 +#define RTE_ECPRI_MSG_TYPE_IWF_UP 8 +#define RTE_ECPRI_MSG_TYPE_IWF_OPT 9 +#define RTE_ECPRI_MSG_TYPE_IWF_MAP 10 +#define RTE_ECPRI_MSG_TYPE_IWF_DCTRL 11 + +/** + * eCPRI Common Header + */ +RTE_STD_C11 +struct rte_ecpri_common_hdr { +#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN + uint32_t size:16; /**< Payload Size */ + uint32_t type:8; /**< Message Type */ + uint32_t c:1; /**< Concatenation Indicator */ + uint32_t res:3; /**< Reserved */ + uint32_t revision:4; /**< Protocol Revision */ +#elif RTE_BYTE_ORDER == RTE_BIG_ENDIAN + uint32_t revision:4; /**< Protocol Revision */ + uint32_t res:3; /**< Reserved */ + uint32_t c:1; /**< Concatenation Indicator */ + uint32_t type:8; /**< Message Type */ + uint32_t size:16; /**< Payload Size */ +#endif +} __rte_packed; + +/** + * eCPRI Message Header of Type #0: IQ Data + */ +struct rte_ecpri_msg_iq_data { + rte_be16_t pc_id; /**< Physical channel ID */ + rte_be16_t seq_id; /**< Sequence ID */ +}; + +/** + * eCPRI Message Header of Type #1: Bit Sequence + */ +struct rte_ecpri_msg_bit_seq { + rte_be16_t pc_id; /**< Physical channel ID */ + rte_be16_t seq_id; /**< Sequence ID */ +}; + +/** + * eCPRI Message Header of Type #2: Real-Time Control Data + */ +struct rte_ecpri_msg_rtc_ctrl { + rte_be16_t rtc_id; /**< Real-Time Control Data ID */ + rte_be16_t seq_id; /**< Sequence ID */ +}; + +/** + * eCPRI Message Header of Type #3: Generic Data Transfer + */ +struct rte_ecpri_msg_gen_data { + rte_be32_t pc_id; /**< Physical channel ID */ + rte_be32_t seq_id; /**< Sequence ID */ +}; + +/** + * eCPRI Message Header of Type #4: Remote Memory Access + */ +RTE_STD_C11 +struct rte_ecpri_msg_rm_access { +#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN + uint32_t ele_id:16; /**< Element ID */ + uint32_t rr:4; /**< Req/Resp */ + uint32_t rw:4; /**< Read/Write */ + uint32_t rma_id:8; /**< Remote Memory Access ID */ +#elif RTE_BYTE_ORDER == RTE_BIG_ENDIAN + uint32_t rma_id:8; /**< Remote Memory Access ID */ + uint32_t rw:4; /**< Read/Write */ + uint32_t rr:4; /**< Req/Resp */ + uint32_t ele_id:16; /**< Element ID */ +#endif + rte_be16_t addr_m; /**< 48-bits address (16 MSB) */ + rte_be32_t addr_l; /**< 48-bits address (32 LSB) */ + rte_be16_t length; /**< number of bytes */ +} __rte_packed; + +/** + * eCPRI Message Header of Type #5: One-Way Delay Measurement + */ +struct rte_ecpri_msg_delay_measure { + uint8_t msr_id; /**< Measurement ID */ + uint8_t act_type; /**< Action Type */ +}; + +/** + * eCPRI Message Header of Type #6: Remote Reset + */ +struct rte_ecpri_msg_remote_reset { + uint8_t msr_id; /**< Measurement ID */ + uint8_t act_type; /**< Action Type */ +}; + +/** + * eCPRI Message Header of Type #7: Event Indication + */ +struct rte_ecpri_msg_event_ind { + uint8_t evt_id; /**< Event ID */ + uint8_t evt_type; /**< Event Type */ + uint8_t seq; /**< Sequence Number */ + uint8_t number; /**< Number of Faults/Notif */ +}; + +/** + * eCPRI Message Header Format: Common Header + Message Types + */ +RTE_STD_C11 +struct rte_ecpri_msg_hdr { + struct rte_ecpri_common_hdr common; + union { + struct rte_ecpri_msg_iq_data type0; + struct rte_ecpri_msg_bit_seq type1; + struct rte_ecpri_msg_rtc_ctrl type2; + struct rte_ecpri_msg_bit_seq type3; + struct rte_ecpri_msg_rm_access type4; + struct rte_ecpri_msg_delay_measure type5; + struct rte_ecpri_msg_remote_reset type6; + struct rte_ecpri_msg_event_ind type7; + uint32_t dummy[3]; + }; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_ECPRI_H_ */ diff --git a/lib/librte_net/rte_ether.h b/lib/librte_net/rte_ether.h index 0ae4e75b6c..184a3f9b43 100644 --- a/lib/librte_net/rte_ether.h +++ b/lib/librte_net/rte_ether.h @@ -304,6 +304,7 @@ struct rte_vlan_hdr { #define RTE_ETHER_TYPE_LLDP 0x88CC /**< LLDP Protocol. */ #define RTE_ETHER_TYPE_MPLS 0x8847 /**< MPLS ethertype. */ #define RTE_ETHER_TYPE_MPLSM 0x8848 /**< MPLS multicast ethertype. */ +#define RTE_ETHER_TYPE_ECPRI 0xAEFE /**< eCPRI ethertype (.1Q supported). */ /** * Extract VLAN tag information into mbuf -- 2.19.0.windows.1