ethdev: add mark flow item
authorDeclan Doherty <declan.doherty@intel.com>
Thu, 26 Apr 2018 17:29:18 +0000 (18:29 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 27 Apr 2018 17:00:57 +0000 (18:00 +0100)
Introduces a new action type RTE_FLOW_ITEM_TYPE_MARK which enables
flow patterns to specify arbitrary integer values to match aginst
set by the RTE_FLOW_ACTION_TYPE_MARK action in previously matched
flows.

Add support for specification of new MARK flow item in testpmd's cli.
Update testpmd documentation to describe new MARK flow item support.

Signed-off-by: Declan Doherty <declan.doherty@intel.com>
app/test-pmd/cmdline_flow.c
doc/guides/prog_guide/rte_flow.rst
doc/guides/testpmd_app_ug/testpmd_funcs.rst
lib/librte_ether/rte_flow.h

index 6e9fa5d..1ac04a0 100644 (file)
@@ -91,6 +91,8 @@ enum index {
        ITEM_PHY_PORT_INDEX,
        ITEM_PORT_ID,
        ITEM_PORT_ID_ID,
+       ITEM_MARK,
+       ITEM_MARK_ID,
        ITEM_RAW,
        ITEM_RAW_RELATIVE,
        ITEM_RAW_SEARCH,
@@ -494,6 +496,7 @@ static const enum index next_item[] = {
        ITEM_VF,
        ITEM_PHY_PORT,
        ITEM_PORT_ID,
+       ITEM_MARK,
        ITEM_RAW,
        ITEM_ETH,
        ITEM_VLAN,
@@ -555,6 +558,12 @@ static const enum index item_port_id[] = {
        ZERO,
 };
 
+static const enum index item_mark[] = {
+       ITEM_MARK_ID,
+       ITEM_NEXT,
+       ZERO,
+};
+
 static const enum index item_raw[] = {
        ITEM_RAW_RELATIVE,
        ITEM_RAW_SEARCH,
@@ -1289,6 +1298,19 @@ static const struct token token_list[] = {
                .next = NEXT(item_port_id, NEXT_ENTRY(UNSIGNED), item_param),
                .args = ARGS(ARGS_ENTRY(struct rte_flow_item_port_id, id)),
        },
+       [ITEM_MARK] = {
+               .name = "mark",
+               .help = "match traffic against value set in previously matched rule",
+               .priv = PRIV_ITEM(MARK, sizeof(struct rte_flow_item_mark)),
+               .next = NEXT(item_mark),
+               .call = parse_vc,
+       },
+       [ITEM_MARK_ID] = {
+               .name = "id",
+               .help = "Integer value to match against",
+               .next = NEXT(item_mark, NEXT_ENTRY(UNSIGNED), item_param),
+               .args = ARGS(ARGS_ENTRY(struct rte_flow_item_mark, id)),
+       },
        [ITEM_RAW] = {
                .name = "raw",
                .help = "match an arbitrary byte string",
index 92e0f89..5b23778 100644 (file)
@@ -656,6 +656,36 @@ representor" depending on the kind of underlying device).
    | ``mask`` | ``id``   | zeroed to match any port ID |
    +----------+----------+-----------------------------+
 
+Item: ``MARK``
+^^^^^^^^^^^^^^
+
+Matches an arbitrary integer value which was set using the ``MARK`` action in
+a previously matched rule.
+
+This item can only specified once as a match criteria as the ``MARK`` action can
+only be specified once in a flow action.
+
+Note the value of MARK field is arbitrary and application defined.
+
+Depending on the underlying implementation the MARK item may be supported on
+the physical device, with virtual groups in the PMD or not at all.
+
+- Default ``mask`` matches any integer value.
+
+.. _table_rte_flow_item_mark:
+
+.. table:: MARK
+
+   +----------+----------+---------------------------+
+   | Field    | Subfield | Value                     |
+   +==========+==========+===========================+
+   | ``spec`` | ``id``   | integer value             |
+   +----------+--------------------------------------+
+   | ``last`` | ``id``   | upper range value         |
+   +----------+----------+---------------------------+
+   | ``mask`` | ``id``   | zeroed to match any value |
+   +----------+----------+---------------------------+
+
 Data matching item types
 ~~~~~~~~~~~~~~~~~~~~~~~~
 
index 260d044..013a405 100644 (file)
@@ -3240,6 +3240,10 @@ This section lists supported pattern items and their attributes, if any.
 
   - ``id {unsigned}``: DPDK port ID.
 
+- ``mark``: match value set in previously matched flow rule using the mark action.
+
+  - ``id {unsigned}``: arbitrary integer value.
+
 - ``raw``: match an arbitrary byte string.
 
   - ``relative {boolean}``: look for pattern after the previous item.
index 17c1c4a..d390bbf 100644 (file)
@@ -406,6 +406,13 @@ enum rte_flow_item_type {
         * See struct rte_flow_item_icmp6_nd_opt_tla_eth.
         */
        RTE_FLOW_ITEM_TYPE_ICMP6_ND_OPT_TLA_ETH,
+
+       /**
+        * Matches specified mark field.
+        *
+        * See struct rte_flow_item_mark.
+        */
+       RTE_FLOW_ITEM_TYPE_MARK,
 };
 
 /**
@@ -1148,6 +1155,28 @@ rte_flow_item_icmp6_nd_opt_tla_eth_mask = {
 };
 #endif
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this structure may change without prior notice
+ *
+ * RTE_FLOW_ITEM_TYPE_MARK
+ *
+ * Matches an arbitrary integer value which was set using the ``MARK`` action
+ * in a previously matched rule.
+ *
+ * This item can only be specified once as a match criteria as the ``MARK``
+ * action can only be specified once in a flow action.
+ *
+ * This value is arbitrary and application-defined. Maximum allowed value
+ * depends on the underlying implementation.
+ *
+ * Depending on the underlying implementation the MARK item may be supported on
+ * the physical device, with virtual groups in the PMD or not at all.
+ */
+struct rte_flow_item_mark {
+       uint32_t id; /**< Integer value to match against. */
+};
+
 /**
  * Matching pattern item definition.
  *