app/testpmd: match GRE key and present bits
authorXiaoyu Min <jackmin@mellanox.com>
Fri, 5 Jul 2019 09:54:26 +0000 (17:54 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 8 Jul 2019 19:26:52 +0000 (21:26 +0200)
Support matching on GRE key and present bits (C,K,S)

Example testpmd command could be:
  testpmd>flow create 0 ingress group 1 pattern eth / ipv4 /
  gre / gre_key value is 0x12345678 / end
  actions rss queues 1 0 end / mark id 196 / end

Which will match GRE packet with k present bit set and key value is
0x12345678.

Signed-off-by: Xiaoyu Min <jackmin@mellanox.com>
Acked-by: Ori Kam <orika@mellanox.com>
Acked-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
app/test-pmd/cmdline_flow.c
doc/guides/testpmd_app_ug/testpmd_funcs.rst

index e3e8448..9f36a0e 100644 (file)
@@ -148,6 +148,10 @@ enum index {
        ITEM_MPLS_LABEL,
        ITEM_GRE,
        ITEM_GRE_PROTO,
+       ITEM_GRE_C_RSVD0_VER,
+       ITEM_GRE_C_BIT,
+       ITEM_GRE_K_BIT,
+       ITEM_GRE_S_BIT,
        ITEM_FUZZY,
        ITEM_FUZZY_THRESH,
        ITEM_GTP,
@@ -181,6 +185,8 @@ enum index {
        ITEM_ICMP6_ND_OPT_TLA_ETH_TLA,
        ITEM_META,
        ITEM_META_DATA,
+       ITEM_GRE_KEY,
+       ITEM_GRE_KEY_VALUE,
 
        /* Validate/create actions. */
        ACTIONS,
@@ -626,6 +632,7 @@ static const enum index next_item[] = {
        ITEM_ICMP6_ND_OPT_SLA_ETH,
        ITEM_ICMP6_ND_OPT_TLA_ETH,
        ITEM_META,
+       ITEM_GRE_KEY,
        ZERO,
 };
 
@@ -771,6 +778,16 @@ static const enum index item_mpls[] = {
 
 static const enum index item_gre[] = {
        ITEM_GRE_PROTO,
+       ITEM_GRE_C_RSVD0_VER,
+       ITEM_GRE_C_BIT,
+       ITEM_GRE_K_BIT,
+       ITEM_GRE_S_BIT,
+       ITEM_NEXT,
+       ZERO,
+};
+
+static const enum index item_gre_key[] = {
+       ITEM_GRE_KEY_VALUE,
        ITEM_NEXT,
        ZERO,
 };
@@ -1942,6 +1959,40 @@ static const struct token token_list[] = {
                .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_gre,
                                             protocol)),
        },
+       [ITEM_GRE_C_RSVD0_VER] = {
+               .name = "c_rsvd0_ver",
+               .help =
+                       "checksum (1b), undefined (1b), key bit (1b),"
+                       " sequence number (1b), reserved 0 (9b),"
+                       " version (3b)",
+               .next = NEXT(item_gre, NEXT_ENTRY(UNSIGNED), item_param),
+               .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_gre,
+                                            c_rsvd0_ver)),
+       },
+       [ITEM_GRE_C_BIT] = {
+               .name = "c_bit",
+               .help = "checksum bit (C)",
+               .next = NEXT(item_gre, NEXT_ENTRY(BOOLEAN), item_param),
+               .args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_gre,
+                                                 c_rsvd0_ver,
+                                                 "\x80\x00\x00\x00")),
+       },
+       [ITEM_GRE_S_BIT] = {
+               .name = "s_bit",
+               .help = "sequence number bit (S)",
+               .next = NEXT(item_gre, NEXT_ENTRY(BOOLEAN), item_param),
+               .args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_gre,
+                                                 c_rsvd0_ver,
+                                                 "\x10\x00\x00\x00")),
+       },
+       [ITEM_GRE_K_BIT] = {
+               .name = "k_bit",
+               .help = "key bit (K)",
+               .next = NEXT(item_gre, NEXT_ENTRY(BOOLEAN), item_param),
+               .args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_gre,
+                                                 c_rsvd0_ver,
+                                                 "\x20\x00\x00\x00")),
+       },
        [ITEM_FUZZY] = {
                .name = "fuzzy",
                .help = "fuzzy pattern match, expect faster than default",
@@ -2194,6 +2245,19 @@ static const struct token token_list[] = {
                .args = ARGS(ARGS_ENTRY_MASK_HTON(struct rte_flow_item_meta,
                                                  data, "\xff\xff\xff\xff")),
        },
+       [ITEM_GRE_KEY] = {
+               .name = "gre_key",
+               .help = "match GRE key",
+               .priv = PRIV_ITEM(GRE_KEY, sizeof(rte_be32_t)),
+               .next = NEXT(item_gre_key),
+               .call = parse_vc,
+       },
+       [ITEM_GRE_KEY_VALUE] = {
+               .name = "value",
+               .help = "key value",
+               .next = NEXT(item_gre_key, NEXT_ENTRY(UNSIGNED), item_param),
+               .args = ARGS(ARG_ENTRY_HTON(rte_be32_t)),
+       },
 
        /* Validate/create actions. */
        [ACTIONS] = {
index 49a9e15..ebab2f1 100644 (file)
@@ -3804,6 +3804,10 @@ This section lists supported pattern items and their attributes, if any.
 
   - ``protocol {unsigned}``: protocol type.
 
+- ``gre_key``: match GRE optional key field.
+
+  - ``value {unsigned}``: key value.
+
 - ``fuzzy``: fuzzy pattern match, expect faster than default.
 
   - ``thresh {unsigned}``: accuracy threshold.