This patch adds bitmask support for RSS, FDIR
and FDIR flexible payload.

Signed-off-by: Beilei Xing <beilei.x...@intel.com>
---
 app/test-pmd/cmdline.c                      | 199 +++++++++++++++++++++++++---
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |   8 +-
 2 files changed, 187 insertions(+), 20 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 589121d..a227554 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -902,7 +902,12 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "    Update a flow type to pctype mapping item on a 
port\n\n"
 
                        "port config (port_id) pctype (pctype_id) hash_inset|"
-                       "fdir_inset|fdir_flx_inset get|set|clear field\n"
+                       "fdir_inset|fdir_flx_inset set field\n"
+                       " (field_idx) mask (mask_val)\n"
+                       "    Set RSS|FDIR|FDIR_FLX input set for some 
pctype\n\n"
+
+                       "port config (port_id) pctype (pctype_id) hash_inset|"
+                       "fdir_inset|fdir_flx_inset get|clear field\n"
                        " (field_idx)\n"
                        "    Configure RSS|FDIR|FDIR_FLX input set for some 
pctype\n\n"
 
@@ -15707,9 +15712,11 @@ struct cmd_cfg_input_set_result {
        cmdline_fixed_string_t pctype;
        uint8_t pctype_id;
        cmdline_fixed_string_t inset_type;
-       cmdline_fixed_string_t opt;
+       cmdline_fixed_string_t set;
        cmdline_fixed_string_t field;
        uint8_t field_idx;
+       cmdline_fixed_string_t mask;
+       uint16_t mask_val;
 };
 
 static void
@@ -15722,6 +15729,7 @@ cmd_cfg_input_set_parsed(
        struct cmd_cfg_input_set_result *res = parsed_result;
        enum rte_pmd_i40e_inset_type inset_type = INSET_NONE;
        struct rte_pmd_i40e_inset inset;
+       uint8_t i;
 #endif
        int ret = -ENOTSUP;
 
@@ -15744,25 +15752,26 @@ cmd_cfg_input_set_parsed(
                return;
        }
 
-       if (!strcmp(res->opt, "get")) {
-               ret = rte_pmd_i40e_inset_field_get(inset.inset,
+       ret = rte_pmd_i40e_inset_field_set(&inset.inset,
                                                   res->field_idx);
-               if (ret)
-                       printf("Field index %d is enabled.\n", res->field_idx);
-               else
-                       printf("Field index %d is disabled.\n", res->field_idx);
-               return;
-       } else if (!strcmp(res->opt, "set"))
-               ret = rte_pmd_i40e_inset_field_set(&inset.inset,
-                                                  res->field_idx);
-       else if (!strcmp(res->opt, "clear"))
-               ret = rte_pmd_i40e_inset_field_clear(&inset.inset,
-                                                    res->field_idx);
        if (ret) {
                printf("Failed to configure input set field.\n");
                return;
        }
 
+       for (i = 0; i < 2; i++) {
+               if (!inset.mask[i].mask ||
+                   inset.mask[i].field_idx == res->field_idx) {
+                       inset.mask[i].field_idx = res->field_idx;
+                       inset.mask[i].mask = res->mask_val;
+                       break;
+               }
+       }
+       if (i == 2) {
+               printf("exceed maximal number of bitmasks.\n");
+               return;
+       }
+
        ret = rte_pmd_i40e_inset_set(res->port_id, res->pctype_id,
                                     &inset, inset_type);
        if (ret) {
@@ -15794,21 +15803,28 @@ cmdline_parse_token_string_t 
cmd_cfg_input_set_inset_type =
        TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result,
                                 inset_type,
                                 "hash_inset#fdir_inset#fdir_flx_inset");
-cmdline_parse_token_string_t cmd_cfg_input_set_opt =
+cmdline_parse_token_string_t cmd_cfg_input_set_set =
        TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result,
-                                opt, "get#set#clear");
+                                set, "set");
 cmdline_parse_token_string_t cmd_cfg_input_set_field =
        TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result,
                                 field, "field");
 cmdline_parse_token_num_t cmd_cfg_input_set_field_idx =
        TOKEN_NUM_INITIALIZER(struct cmd_cfg_input_set_result,
                              field_idx, UINT8);
+cmdline_parse_token_string_t cmd_cfg_input_set_mask =
+       TOKEN_STRING_INITIALIZER(struct cmd_cfg_input_set_result,
+                                mask, "mask");
+cmdline_parse_token_num_t cmd_cfg_input_set_mask_val =
+       TOKEN_NUM_INITIALIZER(struct cmd_cfg_input_set_result,
+                             mask_val, UINT16);
 
 cmdline_parse_inst_t cmd_cfg_input_set = {
        .f = cmd_cfg_input_set_parsed,
        .data = NULL,
        .help_str = "port config <port_id> pctype <pctype_id> hash_inset|"
-                   "fdir_inset|fdir_flx_inset get|set|clear field <field_idx>",
+                   "fdir_inset|fdir_flx_inset set field <field_idx> "
+                   "mask <mask_val>",
        .tokens = {
                (void *)&cmd_cfg_input_set_port,
                (void *)&cmd_cfg_input_set_cfg,
@@ -15816,9 +15832,153 @@ cmdline_parse_inst_t cmd_cfg_input_set = {
                (void *)&cmd_cfg_input_set_pctype,
                (void *)&cmd_cfg_input_set_pctype_id,
                (void *)&cmd_cfg_input_set_inset_type,
-               (void *)&cmd_cfg_input_set_opt,
+               (void *)&cmd_cfg_input_set_set,
                (void *)&cmd_cfg_input_set_field,
                (void *)&cmd_cfg_input_set_field_idx,
+               (void *)&cmd_cfg_input_set_mask,
+               (void *)&cmd_cfg_input_set_mask_val,
+               NULL,
+       },
+};
+
+/* Get field info or clear some field */
+struct cmd_get_clr_input_set_result {
+       cmdline_fixed_string_t port;
+       cmdline_fixed_string_t cfg;
+       portid_t port_id;
+       cmdline_fixed_string_t pctype;
+       uint8_t pctype_id;
+       cmdline_fixed_string_t inset_type;
+       cmdline_fixed_string_t opt;
+       cmdline_fixed_string_t field;
+       uint8_t field_idx;
+};
+
+static void
+cmd_get_clr_input_set_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+       struct cmd_get_clr_input_set_result *res = parsed_result;
+#ifdef RTE_LIBRTE_I40E_PMD
+       enum rte_pmd_i40e_inset_type inset_type = INSET_NONE;
+       struct rte_pmd_i40e_inset inset;
+       uint8_t i;
+#endif
+       int ret = -ENOTSUP;
+
+       if (res->port_id > nb_ports) {
+               printf("Invalid port, range is [0, %d]\n", nb_ports - 1);
+               return;
+       }
+
+       if (!all_ports_stopped()) {
+               printf("Please stop all ports first\n");
+               return;
+       }
+
+#ifdef RTE_LIBRTE_I40E_PMD
+       if (!strcmp(res->inset_type, "hash_inset"))
+               inset_type = INSET_HASH;
+       else if (!strcmp(res->inset_type, "fdir_inset"))
+               inset_type = INSET_FDIR;
+       else if (!strcmp(res->inset_type, "fdir_flx_inset"))
+               inset_type = INSET_FDIR_FLX;
+       ret = rte_pmd_i40e_inset_get(res->port_id, res->pctype_id,
+                                    &inset, inset_type);
+       if (ret) {
+               printf("Failed to get input set.\n");
+               return;
+       }
+
+       if (!strcmp(res->opt, "get")) {
+               ret = rte_pmd_i40e_inset_field_get(inset.inset,
+                                                  res->field_idx);
+               if (ret) {
+                       printf("Field index %d is enabled.\n", res->field_idx);
+                       for (i = 0; i < 2; i++) {
+                               if (inset.mask[i].field_idx == res->field_idx) {
+                                       printf("Mask is: 0x%x\n",
+                                              inset.mask[i].mask);
+                                       break;
+                               }
+                       }
+               } else {
+                       printf("Field index %d is disabled.\n", res->field_idx);
+               }
+               return;
+       } else if (!strcmp(res->opt, "clear")) {
+               ret = rte_pmd_i40e_inset_field_clear(&inset.inset,
+                                                    res->field_idx);
+               if (ret) {
+                       printf("Failed to clear input set field.\n");
+                       return;
+               }
+               for (i = 0; i < 2; i++) {
+                       if (inset.mask[i].field_idx == res->field_idx) {
+                               inset.mask[i].mask = 0;
+                               break;
+                       }
+               }
+       }
+
+       ret = rte_pmd_i40e_inset_set(res->port_id, res->pctype_id,
+                                    &inset, inset_type);
+       if (ret) {
+               printf("Failed to configure input set.\n");
+               return;
+       }
+#endif
+
+       if (ret == -ENOTSUP)
+               printf("Function not supported\n");
+}
+
+cmdline_parse_token_string_t cmd_get_clr_input_set_port =
+       TOKEN_STRING_INITIALIZER(struct cmd_get_clr_input_set_result,
+                                port, "port");
+cmdline_parse_token_string_t cmd_get_clr_input_set_cfg =
+       TOKEN_STRING_INITIALIZER(struct cmd_get_clr_input_set_result,
+                                cfg, "config");
+cmdline_parse_token_num_t cmd_get_clr_input_set_port_id =
+       TOKEN_NUM_INITIALIZER(struct cmd_get_clr_input_set_result,
+                             port_id, UINT16);
+cmdline_parse_token_string_t cmd_get_clr_input_set_pctype =
+       TOKEN_STRING_INITIALIZER(struct cmd_get_clr_input_set_result,
+                                pctype, "pctype");
+cmdline_parse_token_num_t cmd_get_clr_input_set_pctype_id =
+       TOKEN_NUM_INITIALIZER(struct cmd_get_clr_input_set_result,
+                             pctype_id, UINT8);
+cmdline_parse_token_string_t cmd_get_clr_input_set_inset_type =
+       TOKEN_STRING_INITIALIZER(struct cmd_get_clr_input_set_result,
+                                inset_type,
+                                "hash_inset#fdir_inset#fdir_flx_inset");
+cmdline_parse_token_string_t cmd_get_clr_input_set_opt =
+       TOKEN_STRING_INITIALIZER(struct cmd_get_clr_input_set_result,
+                                opt, "get#clear");
+cmdline_parse_token_string_t cmd_get_clr_input_set_field =
+       TOKEN_STRING_INITIALIZER(struct cmd_get_clr_input_set_result,
+                                field, "field");
+cmdline_parse_token_num_t cmd_get_clr_input_set_field_idx =
+       TOKEN_NUM_INITIALIZER(struct cmd_get_clr_input_set_result,
+                             field_idx, UINT8);
+
+cmdline_parse_inst_t cmd_get_clr_input_set = {
+       .f = cmd_get_clr_input_set_parsed,
+       .data = NULL,
+       .help_str = "port config <port_id> pctype <pctype_id> hash_inset|"
+                   "fdir_inset|fdir_flx_inset get|clear field <field_idx>",
+       .tokens = {
+               (void *)&cmd_get_clr_input_set_port,
+               (void *)&cmd_get_clr_input_set_cfg,
+               (void *)&cmd_get_clr_input_set_port_id,
+               (void *)&cmd_get_clr_input_set_pctype,
+               (void *)&cmd_get_clr_input_set_pctype_id,
+               (void *)&cmd_get_clr_input_set_inset_type,
+               (void *)&cmd_get_clr_input_set_opt,
+               (void *)&cmd_get_clr_input_set_field,
+               (void *)&cmd_get_clr_input_set_field_idx,
                NULL,
        },
 };
@@ -17819,6 +17979,7 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_ddp_get_list,
        (cmdline_parse_inst_t *)&cmd_ddp_get_info,
        (cmdline_parse_inst_t *)&cmd_cfg_input_set,
+       (cmdline_parse_inst_t *)&cmd_get_clr_input_set,
        (cmdline_parse_inst_t *)&cmd_clear_input_set,
        (cmdline_parse_inst_t *)&cmd_show_vf_stats,
        (cmdline_parse_inst_t *)&cmd_clear_vf_stats,
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst 
b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index dde205a..670f81c 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -1989,7 +1989,13 @@ port config input set
 Config RSS/FDIR/FDIR flexible payload input set for some pctype::
    testpmd> port config (port_id) pctype (pctype_id) \
             (hash_inset|fdir_inset|fdir_flx_inset) \
-           (get|set|clear) field (field_idx)
+           set field (field_idx) mask (mask_val)
+
+Get some field info or clear some field of RSS/FDIR/FDIR flexible
+payload input set for some pctype::
+   testpmd> port config (port_id) pctype (pctype_id) \
+               (hash_inset|fdir_inset|fdir_flx_inset) \
+              (get|clear) field (field_idx)
 
 Clear RSS/FDIR/FDIR flexible payload input set for some pctype::
    testpmd> port config (port_id) pctype (pctype_id) \
-- 
2.5.5

Reply via email to