From patchwork Thu Sep 7 11:20:59 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xing, Beilei" X-Patchwork-Id: 28436 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 0F122199BD; Thu, 7 Sep 2017 13:21:07 +0200 (CEST) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by dpdk.org (Postfix) with ESMTP id 1566D16829 for ; Thu, 7 Sep 2017 13:21:02 +0200 (CEST) Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga105.fm.intel.com with ESMTP; 07 Sep 2017 04:21:02 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.42,358,1500966000"; d="scan'208";a="146527065" Received: from unknown (HELO dpdk9.sh.intel.com) ([10.67.118.52]) by orsmga005.jf.intel.com with ESMTP; 07 Sep 2017 04:21:01 -0700 From: Beilei Xing To: jingjing.wu@intel.com Cc: andrey.chilikin@intel.com, dev@dpdk.org Date: Thu, 7 Sep 2017 19:20:59 +0800 Message-Id: <1504783263-20575-3-git-send-email-beilei.xing@intel.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1504783263-20575-1-git-send-email-beilei.xing@intel.com> References: <1503647430-93905-2-git-send-email-beilei.xing@intel.com> <1504783263-20575-1-git-send-email-beilei.xing@intel.com> Subject: [dpdk-dev] [PATCH v2 2/6] ethdev: add GTPC and GTPU items 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" This patch adds GTPC and GTPU items to generic rte flow, and also exposes the following item fields through the flow command: - GTPC TEID - GTPU TEID Signed-off-by: Beilei Xing --- app/test-pmd/cmdline_flow.c | 44 +++++++++++++++++++++++++++++ app/test-pmd/config.c | 2 ++ doc/guides/prog_guide/rte_flow.rst | 26 +++++++++++++++++ doc/guides/testpmd_app_ug/testpmd_funcs.rst | 8 ++++++ lib/librte_ether/rte_flow.h | 44 +++++++++++++++++++++++++++++ 5 files changed, 124 insertions(+) diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index a17a004..72d159c 100644 --- a/app/test-pmd/cmdline_flow.c +++ b/app/test-pmd/cmdline_flow.c @@ -171,6 +171,10 @@ enum index { ITEM_GRE_PROTO, ITEM_FUZZY, ITEM_FUZZY_THRESH, + ITEM_GTPC, + ITEM_GTPC_TEID, + ITEM_GTPU, + ITEM_GTPU_TEID, /* Validate/create actions. */ ACTIONS, @@ -451,6 +455,8 @@ static const enum index next_item[] = { ITEM_MPLS, ITEM_GRE, ITEM_FUZZY, + ITEM_GTPC, + ITEM_GTPU, ZERO, }; @@ -588,6 +594,18 @@ static const enum index item_gre[] = { ZERO, }; +static const enum index item_gtpc[] = { + ITEM_GTPC_TEID, + ITEM_NEXT, + ZERO, +}; + +static const enum index item_gtpu[] = { + ITEM_GTPU_TEID, + ITEM_NEXT, + ZERO, +}; + static const enum index next_action[] = { ACTION_END, ACTION_VOID, @@ -1421,6 +1439,32 @@ static const struct token token_list[] = { .args = ARGS(ARGS_ENTRY(struct rte_flow_item_fuzzy, thresh)), }, + [ITEM_GTPC] = { + .name = "gtpc", + .help = "match GTP header", + .priv = PRIV_ITEM(GTPC, sizeof(struct rte_flow_item_gtp)), + .next = NEXT(item_gtpc), + .call = parse_vc, + }, + [ITEM_GTPC_TEID] = { + .name = "teid", + .help = "TUNNEL ENDPOINT IDENTIFIER", + .next = NEXT(item_gtpc, NEXT_ENTRY(UNSIGNED), item_param), + .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_gtp, teid)), + }, + [ITEM_GTPU] = { + .name = "gtpu", + .help = "match GTP header", + .priv = PRIV_ITEM(GTPU, sizeof(struct rte_flow_item_gtp)), + .next = NEXT(item_gtpu), + .call = parse_vc, + }, + [ITEM_GTPU_TEID] = { + .name = "teid", + .help = "TUNNEL ENDPOINT IDENTIFIER", + .next = NEXT(item_gtpu, NEXT_ENTRY(UNSIGNED), item_param), + .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_gtp, teid)), + }, /* Validate/create actions. */ [ACTIONS] = { diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index 3ae3e1c..be4c3b9 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -947,6 +947,8 @@ static const struct { MK_FLOW_ITEM(MPLS, sizeof(struct rte_flow_item_mpls)), MK_FLOW_ITEM(GRE, sizeof(struct rte_flow_item_gre)), MK_FLOW_ITEM(FUZZY, sizeof(struct rte_flow_item_fuzzy)), + MK_FLOW_ITEM(GTPC, sizeof(struct rte_flow_item_gtp)), + MK_FLOW_ITEM(GTPU, sizeof(struct rte_flow_item_gtp)), }; /** Compute storage space needed by item specification. */ diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst index 662a912..9e7179a 100644 --- a/doc/guides/prog_guide/rte_flow.rst +++ b/doc/guides/prog_guide/rte_flow.rst @@ -955,6 +955,32 @@ Usage example, fuzzy match a TCPv4 packets: | 4 | END | +-------+----------+ +Item: ``GTPC`` +^^^^^^^^^^^^^^ + +Matches a GTP header. + +- ``v_pt_rsv_flags``: version (3b), protocol type (1b), reserved (1b), + extension header flag (1b), sequence number flag (1b), N-PDU number + flag (1b). +- ``msg_type``: message type. +- ``msg_len``: message length. +- ``teid``: TEID. +- Default ``mask`` matches teid only. + +Item: ``GTPU`` +^^^^^^^^^^^^^^ + +Matches a GTP header. + +- ``v_pt_rsv_flags``: version (3b), protocol type (1b), reserved (1b), + extension header flag (1b), sequence number flag (1b), N-PDU number + flag (1b). +- ``msg_type``: message type. +- ``msg_len``: message length. +- ``teid``: TEID. +- Default ``mask`` matches teid only. + Actions ~~~~~~~ diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst index 2ed62f5..2ca36ad 100644 --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst @@ -2696,6 +2696,14 @@ This section lists supported pattern items and their attributes, if any. - ``thresh {unsigned}``: accuracy threshold. +- ``gtpc``: match GTP header. + + - ``teid {unsigned}``: Tunnel endpoint identifier. + +- ``gtpu``: match GTP header. + + - ``teid {unsigned}``: Tunnel endpoint identifier. + Actions list ^^^^^^^^^^^^ diff --git a/lib/librte_ether/rte_flow.h b/lib/librte_ether/rte_flow.h index bba6169..8b24cac 100644 --- a/lib/librte_ether/rte_flow.h +++ b/lib/librte_ether/rte_flow.h @@ -309,6 +309,24 @@ enum rte_flow_item_type { * See struct rte_flow_item_fuzzy. */ RTE_FLOW_ITEM_TYPE_FUZZY, + + /** + * Matches a GTP header. + * + * Configure flow for GTP-C packets. + * + * See struct rte_flow_item_gtp. + */ + RTE_FLOW_ITEM_TYPE_GTPC, + + /** + * Matches a GTP header. + * + * Configure flow for GTP-U packets. + * + * See struct rte_flow_item_gtp. + */ + RTE_FLOW_ITEM_TYPE_GTPU, }; /** @@ -735,6 +753,32 @@ static const struct rte_flow_item_fuzzy rte_flow_item_fuzzy_mask = { #endif /** + * RTE_FLOW_ITEM_TYPE_GTP. + * + * Matches a GTP header. + */ +struct rte_flow_item_gtp { + /** + * Version (2b), protocol type (1b), reserved (1b), + * Extension header flag (1b), + * Sequence number flag (1b), + * N-PDU number flag (1b). + */ + uint8_t v_pt_rsv_flags; + uint8_t msg_type; /**< Message type. */ + rte_be16_t msg_len; /**< Message length. */ + rte_be32_t teid; /**< Tunnel endpoint identifier. */ +}; + +/** Default mask for RTE_FLOW_ITEM_TYPE_GTP. */ +#ifndef __cplusplus +static const struct rte_flow_item_gtp rte_flow_item_gtp_mask = { + .msg_type = 0x00, + .teid = RTE_BE32(0xffffffff), +}; +#endif + +/** * Matching pattern item definition. * * A pattern is formed by stacking items starting from the lowest protocol