[dpdk-dev] [PATCH v16 8/8] app/testpmd: add command to set supported ptype mask
Pavan Nikhilesh Bhagavatula
pbhagavatula at marvell.com
Thu Nov 7 15:36:20 CET 2019
Hi Bernard,
>Hi Pavin,
>
><snip>
>
>> > Subject: [dpdk-dev] [PATCH v16 8/8] app/testpmd: add command
>to set
>> > supported ptype mask
>> >
>> > From: Pavan Nikhilesh <pbhagavatula at 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 <pbhagavatula at 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.
More information about the dev
mailing list