From patchwork Mon Apr 16 06:10:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qi Zhang X-Patchwork-Id: 38171 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 BF9721B21F; Mon, 16 Apr 2018 08:10:45 +0200 (CEST) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by dpdk.org (Postfix) with ESMTP id 13F631B1D9 for ; Mon, 16 Apr 2018 08:10:41 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 15 Apr 2018 23:10:41 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,458,1517904000"; d="scan'208";a="33655062" Received: from dpdk51.sh.intel.com ([10.67.110.184]) by orsmga007.jf.intel.com with ESMTP; 15 Apr 2018 23:10:39 -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: Mon, 16 Apr 2018 14:10:42 +0800 Message-Id: <20180416061042.785-5-qi.z.zhang@intel.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180416061042.785-1-qi.z.zhang@intel.com> References: <1522279780-34842-1-git-send-email-qi.z.zhang@intel.com> <20180416061042.785-1-qi.z.zhang@intel.com> Subject: [dpdk-dev] [PATCH v3 4/4] ethdev: add VLAN and MPLS pop push action 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 couple Openflow frienldy VLAN/MPLS push/pop actions. RTE_FLOW_ACTION_VLAN_POP - pop a VLAN header. RTE_FLOW_ACTION_VLAN_PUSH - push a VLAN header. RTE_FLOW_ACTION_MPLS_POP - pop a MPLS header. RTE_FLOW_ACTION_MPLS_PUSH - push a MPLS header. Signed-off-by: Qi Zhang --- app/test-pmd/cmdline_flow.c | 82 +++++++++++++++++++++++++++++ doc/guides/prog_guide/rte_flow.rst | 69 ++++++++++++++++++++++++ doc/guides/testpmd_app_ug/testpmd_funcs.rst | 14 +++++ lib/librte_ether/rte_flow.h | 71 +++++++++++++++++++++++++ 4 files changed, 236 insertions(+) diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index 417cbecc9..736d79bef 100644 --- a/app/test-pmd/cmdline_flow.c +++ b/app/test-pmd/cmdline_flow.c @@ -201,6 +201,13 @@ enum index { ACTION_IP_TTL_DEC_LVL, ACTION_TTL_COPY_OUT, ACTION_TTL_COPY_IN, + ACTION_VLAN_POP, + ACTION_VLAN_PUSH, + ACTION_VLAN_PUSH_TYPE, + ACTION_MPLS_POP, + ACTION_MPLS_POP_TYPE, + ACTION_MPLS_PUSH, + ACTION_MPLS_PUSH_TYPE, }; /** Size of pattern[] field in struct rte_flow_item_raw. */ @@ -678,6 +685,10 @@ static const enum index next_action[] = { ACTION_IP_TTL_DEC, ACTION_TTL_COPY_OUT, ACTION_TTL_COPY_IN, + ACTION_VLAN_POP, + ACTION_VLAN_PUSH, + ACTION_MPLS_POP, + ACTION_MPLS_PUSH, ZERO, }; @@ -728,6 +739,21 @@ static const enum index action_ip_ttl_dec[] = { ZERO, }; +static const enum index action_vlan_push[] = { + ACTION_VLAN_PUSH_TYPE, + ZERO, +}; + +static const enum index action_mpls_pop[] = { + ACTION_MPLS_POP_TYPE, + ZERO, +}; + +static const enum index action_mpls_push[] = { + ACTION_MPLS_PUSH_TYPE, + ZERO, +}; + static int parse_init(struct context *, const struct token *, const char *, unsigned int, void *, unsigned int); @@ -1921,6 +1947,62 @@ static const struct token token_list[] = { .next = NEXT(NEXT_ENTRY(ACTION_NEXT)), .call = parse_vc, }, + + [ACTION_VLAN_POP] = { + .name = "vlan_pop", + .help = "pop the outermost VLAN header.", + .priv = PRIV_ACTION(DROP, 0), + .next = NEXT(NEXT_ENTRY(ACTION_NEXT)), + .call = parse_vc, + }, + [ACTION_VLAN_PUSH] = { + .name = "vlan_push", + .help = "push new VLAN header onto the packet", + .priv = PRIV_ACTION(VLAN_PUSH, + sizeof(struct rte_flow_action_vlan_push)), + .next = NEXT(action_vlan_push), + .call = parse_vc, + }, + [ACTION_VLAN_PUSH_TYPE] = { + .name = "type", + .help = "Ethertype of VLAN header", + .next = NEXT(action_vlan_push, NEXT_ENTRY(UNSIGNED)), + .args = ARGS(ARGS_ENTRY(struct rte_flow_action_vlan_push, + ether_type)), + .call = parse_vc, + }, + [ACTION_MPLS_POP] = { + .name = "mpls_pop", + .help = "pop the outermost MPLS header", + .priv = PRIV_ACTION(MPLS_POP, + sizeof(struct rte_flow_action_mpls_pop)), + .next = NEXT(action_mpls_pop), + .call = parse_vc, + }, + [ACTION_MPLS_POP_TYPE] = { + .name = "type", + .help = "Ethertype of MPLS header", + .next = NEXT(action_mpls_pop, NEXT_ENTRY(UNSIGNED)), + .args = ARGS(ARGS_ENTRY(struct rte_flow_action_mpls_pop, + ether_type)), + .call = parse_vc, + }, + [ACTION_MPLS_PUSH] = { + .name = "mpls_push", + .help = "push new MPLS header onto the packet", + .priv = PRIV_ACTION(MPLS_PUSH, + sizeof(struct rte_flow_action_mpls_push)), + .next = NEXT(action_mpls_push), + .call = parse_vc, + }, + [ACTION_MPLS_PUSH_TYPE] = { + .name = "type", + .help = "Ethertype of MPLS header", + .next = NEXT(action_mpls_push, NEXT_ENTRY(UNSIGNED)), + .args = ARGS(ARGS_ENTRY(struct rte_flow_action_mpls_push, + ether_type)), + .call = parse_vc, + }, }; /** Remove and return last entry from argument stack. */ diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst index 65f2d4a16..a009f1aac 100644 --- a/doc/guides/prog_guide/rte_flow.rst +++ b/doc/guides/prog_guide/rte_flow.rst @@ -1684,6 +1684,75 @@ required MPLS or IP headers. | no properties | +---------------+ +Action: ``ACTION_VLAN_POP`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Pop the outer-most VLAN header from the packet. + +.. _table_rte_flow_action_vlan_pop: + +.. table:: VLAN_POP + + +---------------+ + | Field | + +===============+ + | no properties | + +---------------+ + +Action: ``ACTION_VLAN_PUSH`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Push a new VLAN header onto the packet, Ethertype 0x8100 or 0x88a8 should +be used. The value of VLAN ID and VLAN priority for the new header is copied +from an exist VLAN header in the packet, they will be set to 0 if no such +VLAN header exist. + +.. _table_rte_flow_action_vlan_push: + +.. table:: VLAN_PUSH + + +----------------+------------------------+ + | Field | Value | + +================+========================+ + | ``ether_type`` | Ethertype for VLAN tag | + +----------------+------------------------+ + +Action: ``ACTION_MPLS_POP`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Pop the outer-most MPLS header from the packet, Ethertype is required for +the resulting packet if it is not the last MPLS header be popped, Ethertype +must be 0x8847 or 0x8848. + +.. _table_rte_flow_action_mpls_pop: + +.. table:: MPLS_POP + + +----------------+---------------------------+ + | Field | Value | + +================+===========================+ + | ``ether_type`` | Ethertype for MPLS header | + +----------------+---------------------------+ + +Action: ``ACTION_MPLS_PUSH`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Push a new MPLS header onto the packet, Ethertype 0x8847 or 0x8848 should +be used. The value of MPLS label and traffic class is copied from exist +outermost MPLS header, and TTL is copied from exist outermost MPLS or IP +header, they will be set to 0 if exist packet does not contain required +header. + +.. _table_rte_flow_action_mpls_push: + +.. table:: MPLS_PUSH + + +----------------+---------------------------+ + | Field | Value | + +================+===========================+ + | ``ether_type`` | Ethertype for MPLS header | + +----------------+---------------------------+ + Negative types ~~~~~~~~~~~~~~ diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst index d2fe6637b..c06f2f0b0 100644 --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst @@ -3461,6 +3461,20 @@ This section lists supported actions and their attributes, if any. - ``ttl_copy_in``: copy TTL inwards. +- ``vlan_pop``: pop the outermost VLAN header. + +- ``vlan_push``: push new VLAN header onto the packet. + + - ``type``: Ethertype of the VLAN header. + +- ``mpls_pop``: pop the outermost MPLS header. + + - ``type``: Ethertype of the MPLS header. + +- ``mpls_push``: push new MPLS header onto the packet. + + - ``type``: Ethertype of the MPLS header. + Destroying flow rules ~~~~~~~~~~~~~~~~~~~~~ diff --git a/lib/librte_ether/rte_flow.h b/lib/librte_ether/rte_flow.h index ab181cd83..c5b30363e 100644 --- a/lib/librte_ether/rte_flow.h +++ b/lib/librte_ether/rte_flow.h @@ -1285,6 +1285,41 @@ enum rte_flow_action_type { * packets that contain required protocol headers. */ RTE_FLOW_ACTION_TYPE_TTL_COPY_IN, + + /** + * Pop the outer-most VLAN header from the packet. + */ + RTE_FLOW_ACTION_TYPE_VLAN_POP, + + /** + * Push a new VLAN header onto the packet, Ethertype 0x8100 or 0x88a8 + * should be used. The value of VLAN ID and VLAN priority for the new + * header is copied from an exist VLAN header in the packet, they will + * be set to 0 if no such VLAN header exist. + * + * See struct rte_flow_action_vlan_push. + */ + RTE_FLOW_ACTION_TYPE_VLAN_PUSH, + + /** + * Pop the outer-most MPLS header from the packet, Ethertype is + * required for the resulting packet if it is not the last MPLS + * header be popped, Ethertype must be 0x8847 or 0x8848. + * + * See struct rte_flow_action_mpls_pop. + */ + RTE_FLOW_ACTION_TYPE_MPLS_POP, + + /** + * Push a new MPLS header onto the packet, Ethertype 0x8847 or 0x8848 + * should be used. The value of MPLS label and traffic class is copied + * from exist outermost MPLS header, and TTL is copied from exist + * outermost MPLS or IP header, they will be set to 0 if exist packet + * does not contain required header. + * + * See struct rte_flow_action_mpls_push. + */ + RTE_FLOW_ACTION_TYPE_MPLS_PUSH, }; /** @@ -1501,6 +1536,42 @@ struct rte_flow_action_ip_ttl_dec { }; /** + * RTE_FLOW_ACTION_TYPE_VLAN_PUSH, + * + * Push a new VLAN header onto the packet, Ethertype 0x8100 or 0x88a8 + * should be used. The value of VLAN ID and VLAN priority for the new + * header is copied from an exist outermost VLAN header in the packet, + * they will be set to 0 if no such VLAN header exist. + */ +struct rte_flow_action_vlan_push { + rte_be16_t ether_type; /**< Ethertype for vlan tag. */ +}; + +/** + * RTE_FLOW_ACTION_TYPE_MPLS_POP, + * + * Pop the outer-most MPLS header from the packet, Ethertype is + * required for the resulting packet if it is not the last MPLS + * header be popped, Ethertype must be 0x8847 or 0x8848. + */ +struct rte_flow_action_mpls_pop { + rte_be16_t ether_type; /**< Ethertype for MPLS header */ +}; + +/** + * RTE_FLOW_ACTION_TYPE_MPLS_PUSH, + * + * Push a new MPLS header onto the packet, Ethertype 0x8847 or 0x8848 + * should be used. The value of MPLS label and traffic class are copied + * from exist outermost MPLS header, and TTL is copied from exist outermost + * MPLS or IP header, they will be set to 0, if exist packet does not + * contain required header. + */ +struct rte_flow_action_mpls_push { + rte_be16_t ether_type; /**< Ethertype for MPLS header */ +}; + +/** * Definition of a single action. * * A list of actions is terminated by a END action.