ethdev: fix incomplete items in flow API
authorAdrien Mazarguil <adrien.mazarguil@6wind.com>
Wed, 26 Apr 2017 12:07:21 +0000 (14:07 +0200)
committerThomas Monjalon <thomas@monjalon.net>
Sun, 30 Apr 2017 22:13:15 +0000 (00:13 +0200)
E-Tag and NVGRE pattern items have been added hastily without updating
documentation nor testpmd.

This commit also adds default masks for these items based on the ixgbe
implementation.

Fixes: 99e7003831c3 ("net/ixgbe: parse L2 tunnel filter")
Cc: stable@dpdk.org
Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
Acked-by: Wenzhuo Lu <wenzhuo.lu@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 4e99f0f..0a40005 100644 (file)
@@ -159,6 +159,10 @@ enum index {
        ITEM_SCTP_CKSUM,
        ITEM_VXLAN,
        ITEM_VXLAN_VNI,
+       ITEM_E_TAG,
+       ITEM_E_TAG_GRP_ECID_B,
+       ITEM_NVGRE,
+       ITEM_NVGRE_TNI,
        ITEM_MPLS,
        ITEM_MPLS_LABEL,
        ITEM_GRE,
@@ -436,6 +440,8 @@ static const enum index next_item[] = {
        ITEM_TCP,
        ITEM_SCTP,
        ITEM_VXLAN,
+       ITEM_E_TAG,
+       ITEM_NVGRE,
        ITEM_MPLS,
        ITEM_GRE,
        ZERO,
@@ -544,6 +550,18 @@ static const enum index item_vxlan[] = {
        ZERO,
 };
 
+static const enum index item_e_tag[] = {
+       ITEM_E_TAG_GRP_ECID_B,
+       ITEM_NEXT,
+       ZERO,
+};
+
+static const enum index item_nvgre[] = {
+       ITEM_NVGRE_TNI,
+       ITEM_NEXT,
+       ZERO,
+};
+
 static const enum index item_mpls[] = {
        ITEM_MPLS_LABEL,
        ITEM_NEXT,
@@ -1297,6 +1315,34 @@ static const struct token token_list[] = {
                .next = NEXT(item_vxlan, NEXT_ENTRY(UNSIGNED), item_param),
                .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_vxlan, vni)),
        },
+       [ITEM_E_TAG] = {
+               .name = "e_tag",
+               .help = "match E-Tag header",
+               .priv = PRIV_ITEM(E_TAG, sizeof(struct rte_flow_item_e_tag)),
+               .next = NEXT(item_e_tag),
+               .call = parse_vc,
+       },
+       [ITEM_E_TAG_GRP_ECID_B] = {
+               .name = "grp_ecid_b",
+               .help = "GRP and E-CID base",
+               .next = NEXT(item_e_tag, NEXT_ENTRY(UNSIGNED), item_param),
+               .args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_e_tag,
+                                                 rsvd_grp_ecid_b,
+                                                 "\x3f\xff")),
+       },
+       [ITEM_NVGRE] = {
+               .name = "nvgre",
+               .help = "match NVGRE header",
+               .priv = PRIV_ITEM(NVGRE, sizeof(struct rte_flow_item_nvgre)),
+               .next = NEXT(item_nvgre),
+               .call = parse_vc,
+       },
+       [ITEM_NVGRE_TNI] = {
+               .name = "tni",
+               .help = "virtual subnet ID",
+               .next = NEXT(item_nvgre, NEXT_ENTRY(UNSIGNED), item_param),
+               .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_nvgre, tni)),
+       },
        [ITEM_MPLS] = {
                .name = "mpls",
                .help = "match MPLS header",
index 9bca9ec..b587ba9 100644 (file)
@@ -863,6 +863,32 @@ Matches a VXLAN header (RFC 7348).
 - ``rsvd1``: reserved, normally 0x00.
 - Default ``mask`` matches VNI only.
 
+Item: ``E_TAG``
+^^^^^^^^^^^^^^^
+
+Matches an IEEE 802.1BR E-Tag header.
+
+- ``tpid``: tag protocol identifier (0x893F)
+- ``epcp_edei_in_ecid_b``: E-Tag control information (E-TCI), E-PCP (3b),
+  E-DEI (1b), ingress E-CID base (12b).
+- ``rsvd_grp_ecid_b``: reserved (2b), GRP (2b), E-CID base (12b).
+- ``in_ecid_e``: ingress E-CID ext.
+- ``ecid_e``: E-CID ext.
+- Default ``mask`` simultaneously matches GRP and E-CID base.
+
+Item: ``NVGRE``
+^^^^^^^^^^^^^^^
+
+Matches a NVGRE header (RFC 7637).
+
+- ``c_k_s_rsvd0_ver``: checksum (1b), undefined (1b), key bit (1b),
+  sequence number (1b), reserved 0 (9b), version (3b). This field must have
+  value 0x2000 according to RFC 7637.
+- ``protocol``: protocol type (0x6558).
+- ``tni``: virtual subnet ID.
+- ``flow_id``: flow ID.
+- Default ``mask`` matches TNI only.
+
 Item: ``MPLS``
 ^^^^^^^^^^^^^^
 
index ddd1d92..1aea101 100644 (file)
@@ -2537,6 +2537,14 @@ This section lists supported pattern items and their attributes, if any.
 
   - ``vni {unsigned}``: VXLAN identifier.
 
+- ``e_tag``: match IEEE 802.1BR E-Tag header.
+
+  - ``grp_ecid_b {unsigned}``: GRP and E-CID base.
+
+- ``nvgre``: match NVGRE header.
+
+  - ``tni {unsigned}``: virtual subnet ID.
+
 - ``mpls``: match MPLS header.
 
   - ``label {unsigned}``: MPLS label.
index abd4c6a..c47edbc 100644 (file)
@@ -49,6 +49,7 @@
 #include <rte_sctp.h>
 #include <rte_tcp.h>
 #include <rte_udp.h>
+#include <rte_byteorder.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -620,6 +621,19 @@ struct rte_flow_item_e_tag {
        uint8_t ecid_e; /**< E-CID ext. */
 };
 
+/** Default mask for RTE_FLOW_ITEM_TYPE_E_TAG. */
+#ifndef __cplusplus
+static const struct rte_flow_item_e_tag rte_flow_item_e_tag_mask = {
+#if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
+       .rsvd_grp_ecid_b = 0x3fff,
+#elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
+       .rsvd_grp_ecid_b = 0xff3f,
+#else
+#error Unsupported endianness.
+#endif
+};
+#endif
+
 /**
  * RTE_FLOW_ITEM_TYPE_NVGRE.
  *
@@ -638,6 +652,13 @@ struct rte_flow_item_nvgre {
        uint8_t flow_id; /**< Flow ID. */
 };
 
+/** Default mask for RTE_FLOW_ITEM_TYPE_NVGRE. */
+#ifndef __cplusplus
+static const struct rte_flow_item_nvgre rte_flow_item_nvgre_mask = {
+       .tni = "\xff\xff\xff",
+};
+#endif
+
 /**
  * RTE_FLOW_ITEM_TYPE_MPLS.
  *