Hi Bernard,

>Hi Pavin,
>
><snip>
>
>> > Subject: [dpdk-dev] [PATCH v16 8/8] app/testpmd: add command
>to set
>> > supported ptype mask
>> >
>> > From: Pavan Nikhilesh <pbhagavat...@marvell.com>
>> >
>> > Add command to set supported ptype mask.
>> > Usage:
>> >    set port <port_id> ptype_mask <ptype_mask>
>> >
>> > Disable ptype parsing by default.
>> >
>> > Signed-off-by: Pavan Nikhilesh <pbhagavat...@marvell.com>
>> > ---
>> >  app/test-pmd/cmdline.c                      | 83 +++++++++++++++++++++
>> >  app/test-pmd/testpmd.c                      |  5 ++
>> >  doc/guides/testpmd_app_ug/testpmd_funcs.rst |  7 ++
>> >  3 files changed, 95 insertions(+)
>> >
>> > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
>index
>> > 49c45a3f0..7af2c58c3 100644
>> > --- a/app/test-pmd/cmdline.c
>> > +++ b/app/test-pmd/cmdline.c
>>
>> The help text should be updated to describe the new command at
>line 240 in
>> cmdline.c
>>
>> > @@ -668,6 +668,9 @@ static void cmd_help_long_parsed(void
>> > *parsed_result,
>> >                    "ptype mapping update (port_id) (hw_ptype)
>> (sw_ptype)\n"
>> >                    "    Update a ptype mapping item on a port\n\n"
>> >
>> > +                  "set port (port_id) ptype_mask
>(ptype_mask)\n"
>> > +                  "    set packet types classification for a specific
>> > port\n\n"
>> > +
>> >                    "set port (port_id) queue-region region_id
>(value) "
>> >                    "queue_start_index (value) queue_num
>(value)\n"
>> >                    "    Set a queue region on a port\n\n"
>> > @@ -18916,6 +18919,85 @@ cmdline_parse_inst_t
>> > cmd_show_port_supported_ptypes = {
>> >    },
>> >  };
>> >
>> > +/* Common result structure for set port ptypes */ struct
>> > +cmd_set_port_ptypes_result {
>> > +  cmdline_fixed_string_t set;
>> > +  cmdline_fixed_string_t port;
>> > +  portid_t port_id;
>> > +  cmdline_fixed_string_t ptype_mask;
>> > +  uint32_t mask;
>> > +};
>> > +
>> > +/* Common CLI fields for set port ptypes */
>> > +cmdline_parse_token_string_t cmd_set_port_ptypes_set =
>> > +  TOKEN_STRING_INITIALIZER
>> > +          (struct cmd_set_port_ptypes_result,
>> > +           set, "set");
>> > +cmdline_parse_token_string_t cmd_set_port_ptypes_port =
>> > +  TOKEN_STRING_INITIALIZER
>> > +          (struct cmd_set_port_ptypes_result,
>> > +           port, "port");
>> > +cmdline_parse_token_num_t cmd_set_port_ptypes_port_id =
>> > +  TOKEN_NUM_INITIALIZER
>> > +          (struct cmd_set_port_ptypes_result,
>> > +           port_id, UINT16);
>> > +cmdline_parse_token_string_t cmd_set_port_ptypes_mask_str =
>> > +  TOKEN_STRING_INITIALIZER
>> > +          (struct cmd_set_port_ptypes_result,
>> > +           ptype_mask, "ptype_mask");
>> > +cmdline_parse_token_num_t cmd_set_port_ptypes_mask_u32 =
>> > +  TOKEN_NUM_INITIALIZER
>> > +          (struct cmd_set_port_ptypes_result,
>> > +           mask, UINT32);
>> > +
>> > +static void
>> > +cmd_set_port_ptypes_parsed(
>> > +  void *parsed_result,
>> > +  __attribute__((unused)) struct cmdline *cl,
>> > +  __attribute__((unused)) void *data)
>> > +{
>> > +  struct cmd_set_port_ptypes_result *res = parsed_result;
>> > +#define PTYPE_NAMESIZE        256
>> > +  char ptype_name[PTYPE_NAMESIZE];
>> > +  uint16_t port_id = res->port_id;
>> > +  uint32_t ptype_mask = res->mask;
>> > +  int ret, i;
>> > +
>> > +  ret = rte_eth_dev_get_supported_ptypes(port_id,
>ptype_mask,
>> > NULL, 0);
>
>The last 2 parameters to the above function do not look correct, here is
>the function declaration:
>int rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t
>ptype_mask,  uint32_t *ptypes, int num);
>
>ptypes should be a pointer to an array to hold the ptypes, and num
>should be the size of the array.

We can use the same API to get the number of ptypes supported to initialize the 
array below.

@see examples/l3fwd/l3fwd_lpm.c +424

>
>> > +  if (ret <= 0) {
>> > +          printf("Port %d doesn't support any ptypes.\n",
>port_id);
>> > +          return;
>> > +  }
>> > +
>> > +  uint32_t ptypes[ret];
>
>The above declaration can then be moved to the top of the function
>with the other declarations.


I intentionally placed it here as the array size depends on ret and there is 
no readily available macro for max number of packet types.


Thanks,
Pavan.

>
>> > +
>> > +  ret = rte_eth_dev_set_ptypes(port_id, ptype_mask, ptypes,
>ret);
>> > +  if (ret <= 0) {
>> > +          printf("Unable to set requested ptypes for Port %d\n",
>> > port_id);
>> > +          return;
>> > +  }
>> > +
>> > +  printf("Successfully set following ptypes for Port %d\n",
>port_id);
>> > +  for (i = 0; i < ret && ptypes[i] != RTE_PTYPE_UNKNOWN; i++) {
>> > +          rte_get_ptype_name(ptypes[i], ptype_name,
>> > sizeof(ptype_name));
>> > +          printf("%s\n", ptype_name);
>> > +  }
>> > +}
>> > +
>> > +cmdline_parse_inst_t cmd_set_port_ptypes = {
>> > +  .f = cmd_set_port_ptypes_parsed,
>> > +  .data = NULL,
>> > +  .help_str = "set port <port_id> ptype_mask <mask>",
>> > +  .tokens = {
>> > +          (void *)&cmd_set_port_ptypes_set,
>> > +          (void *)&cmd_set_port_ptypes_port,
>> > +          (void *)&cmd_set_port_ptypes_port_id,
>> > +          (void *)&cmd_set_port_ptypes_mask_str,
>> > +          (void *)&cmd_set_port_ptypes_mask_u32,
>> > +          NULL,
>> > +  },
>> > +};
>> > +
>> >  /*
>> >
>>
>******************************************************
>****
>> > ********************** */
>> >
>> >  /* list of instructions */
>> > @@ -19155,6 +19237,7 @@ cmdline_parse_ctx_t main_ctx[] = {
>> >    (cmdline_parse_inst_t *)&cmd_show_vf_stats,
>> >    (cmdline_parse_inst_t *)&cmd_clear_vf_stats,
>> >    (cmdline_parse_inst_t
>*)&cmd_show_port_supported_ptypes,
>> > +  (cmdline_parse_inst_t *)&cmd_set_port_ptypes,
>> >    (cmdline_parse_inst_t *)&cmd_ptype_mapping_get,
>> >    (cmdline_parse_inst_t *)&cmd_ptype_mapping_replace,
>> >    (cmdline_parse_inst_t *)&cmd_ptype_mapping_reset, diff --
>git
>> > a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index
>> > 5ba974162..812aebf35 100644
>> > --- a/app/test-pmd/testpmd.c
>> > +++ b/app/test-pmd/testpmd.c
>> > @@ -2024,6 +2024,7 @@ start_port(portid_t pid)
>> >    queueid_t qi;
>> >    struct rte_port *port;
>> >    struct rte_ether_addr mac_addr;
>> > +  static uint8_t clr_ptypes = 1;
>> >
>> >    if (port_id_is_invalid(pid, ENABLED_WARN))
>> >            return 0;
>> > @@ -2153,6 +2154,10 @@ start_port(portid_t pid)
>> >                    }
>> >            }
>> >            configure_rxtx_dump_callbacks(verbose_level);
>> > +          if (clr_ptypes) {
>> > +                  clr_ptypes = 0;
>> > +                  rte_eth_dev_set_ptypes(pi,
>> > RTE_PTYPE_UNKNOWN, NULL, 0);
>> > +          }
>> >            /* start port */
>> >            if (rte_eth_dev_start(pi) < 0) {
>> >                    printf("Fail to start port %d\n", pi); diff --git
>> > a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
>> > b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
>> > index c68a742eb..f78ac9444 100644
>> > --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
>> > +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
>> > @@ -472,6 +472,13 @@ Show ptypes supported for a specific port::
>> >
>> >     testpmd> show port (port_id) ptypes
>> >
>> > +set port supported ptypes
>> > +~~~~~~~~~~~~~~~~~~~~~~~~~
>> > +
>> > +set packet types classification for a specific port::
>> > +
>> > +   testpmd> set port (port_id) ptypes_mask (mask)
>> > +
>> >  show device info
>> >  ~~~~~~~~~~~~~~~~
>> >
>> > --
>> > 2.17.1
> Regards,
>
> Bernard.

Reply via email to