[RFT] dumpcap: add file-prefix option

Message ID 20220912190330.73159-1-stephen@networkplumber.org (mailing list archive)
State Accepted, archived
Delegated to: David Marchand
Headers
Series [RFT] dumpcap: add file-prefix option |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/intel-Testing success Testing PASS
ci/iol-x86_64-compile-testing success Testing PASS
ci/iol-aarch64-unit-testing success Testing PASS
ci/iol-aarch64-compile-testing success Testing PASS
ci/iol-x86_64-unit-testing success Testing PASS
ci/github-robot: build success github build: passed

Commit Message

Stephen Hemminger Sept. 12, 2022, 7:03 p.m. UTC
  When using dumpcap in container environment or with multiple
DPDK processes, it is useful to be able to specify file prefix.

This version only accepts the long format option used by
other commands. If no prefix is specified then the default
is used.

Suggested-by: Arshdeep Kaur <arshdeep.kaur@intel.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
Did basic command line test, but still needs testing with a prefix
being used (ie multiple apps).

 app/dumpcap/main.c | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)
  

Comments

Kaur, Arshdeep Sept. 16, 2022, 8:19 a.m. UTC | #1
> -----Original Message-----
> From: Stephen Hemminger <stephen@networkplumber.org>
> Sent: Tuesday, September 13, 2022 12:34 AM
> To: dev@dpdk.org
> Cc: Stephen Hemminger <stephen@networkplumber.org>; Kaur, Arshdeep
> <arshdeep.kaur@intel.com>
> Subject: [RFT] dumpcap: add file-prefix option
> 
> When using dumpcap in container environment or with multiple DPDK
> processes, it is useful to be able to specify file prefix.
> 
> This version only accepts the long format option used by other commands.
> If no prefix is specified then the default is used.
> 
> Suggested-by: Arshdeep Kaur <arshdeep.kaur@intel.com>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
> Did basic command line test, but still needs testing with a prefix being used
> (ie multiple apps).
> 
>  app/dumpcap/main.c | 24 ++++++++++++++++++------
>  1 file changed, 18 insertions(+), 6 deletions(-)
> 
> diff --git a/app/dumpcap/main.c b/app/dumpcap/main.c index
> a6041d4ff495..bdeef96d9c0b 100644
> --- a/app/dumpcap/main.c
> +++ b/app/dumpcap/main.c
> @@ -61,6 +61,7 @@ static char *output_name;  static const char
> *filter_str;  static unsigned int ring_size = 2048;  static const char
> *capture_comment;
> +static const char *file_prefix;
>  static uint32_t snaplen = RTE_MBUF_DEFAULT_BUF_SIZE;  static bool
> dump_bpf;  static struct { @@ -122,6 +123,7 @@ static void usage(void)
>  	       "                           add a capture comment to the output file\n"
>  	       "\n"
>  	       "Miscellaneous:\n"
> +	       "  --file-prefix=<prefix>   prefix to use for multi-process\n"
>  	       "  -q                       don't report packet capture counts\n"
>  	       "  -v, --version            print version information and exit\n"
>  	       "  -h, --help               display this help and exit\n"
> @@ -310,6 +312,7 @@ static void parse_opts(int argc, char **argv)
>  	static const struct option long_options[] = {
>  		{ "autostop",        required_argument, NULL, 'a' },
>  		{ "capture-comment", required_argument, NULL, 0 },
> +		{ "file-prefix",     required_argument, NULL, 0 },
>  		{ "help",            no_argument,       NULL, 'h' },
>  		{ "interface",       required_argument, NULL, 'i' },
>  		{ "list-interfaces", no_argument,       NULL, 'D' },
> @@ -330,11 +333,13 @@ static void parse_opts(int argc, char **argv)
> 
>  		switch (c) {
>  		case 0:
> -			switch (option_index) {
> -			case 0:
> +			if (!strcmp(long_options[option_index].name,
> +				    "capture-comment")) {
>  				capture_comment = optarg;
> -				break;
> -			default:
> +			} else if (!strcmp(long_options[option_index].name,
> +					   "file-prefix")) {
> +				file_prefix = optarg;
> +			} else {
>  				usage();
>  				exit(1);
>  			}

parse_opts() is called after dpdk_init(). So whatever file-prefix we provide, for eal init, it remains NULL.
Please let me know your thoughts about it.

> @@ -512,12 +517,14 @@ static void dpdk_init(void)
>  	static const char * const args[] = {
>  		"dumpcap", "--proc-type", "secondary",
>  		"--log-level", "notice"
> -
>  	};
> -	const int eal_argc = RTE_DIM(args);
> +	int eal_argc = RTE_DIM(args);
>  	char **eal_argv;
>  	unsigned int i;
> 
> +	if (file_prefix != NULL)
> +		eal_argc += 2;
> +
>  	/* DPDK API requires mutable versions of command line arguments.
> */
>  	eal_argv = calloc(eal_argc + 1, sizeof(char *));
>  	if (eal_argv == NULL)
> @@ -527,6 +534,11 @@ static void dpdk_init(void)
>  	for (i = 1; i < RTE_DIM(args); i++)
>  		eal_argv[i] = strdup(args[i]);
> 
> +	if (file_prefix != NULL) {
> +		eal_argv[i++] = strdup("--file-prefix");
> +		eal_argv[i++] = strdup(file_prefix);
> +	}
> +
>  	if (rte_eal_init(eal_argc, eal_argv) < 0)
>  		rte_exit(EXIT_FAILURE, "EAL init failed: is primary process
> running?\n");
> 
> --
> 2.35.1
  
Ben Magistro Sept. 16, 2022, 12:51 p.m. UTC | #2
Kaur,

I believe parse_opts() should be called before dpdk_init() now see
https://patches.dpdk.org/project/dpdk/patch/20220125032545.7704-1-koncept1@gmail.com/

On Fri, Sep 16, 2022 at 4:19 AM Kaur, Arshdeep <arshdeep.kaur@intel.com>
wrote:

>
>
> > -----Original Message-----
> > From: Stephen Hemminger <stephen@networkplumber.org>
> > Sent: Tuesday, September 13, 2022 12:34 AM
> > To: dev@dpdk.org
> > Cc: Stephen Hemminger <stephen@networkplumber.org>; Kaur, Arshdeep
> > <arshdeep.kaur@intel.com>
> > Subject: [RFT] dumpcap: add file-prefix option
> >
> > When using dumpcap in container environment or with multiple DPDK
> > processes, it is useful to be able to specify file prefix.
> >
> > This version only accepts the long format option used by other commands.
> > If no prefix is specified then the default is used.
> >
> > Suggested-by: Arshdeep Kaur <arshdeep.kaur@intel.com>
> > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> > ---
> > Did basic command line test, but still needs testing with a prefix being
> used
> > (ie multiple apps).
> >
> >  app/dumpcap/main.c | 24 ++++++++++++++++++------
> >  1 file changed, 18 insertions(+), 6 deletions(-)
> >
> > diff --git a/app/dumpcap/main.c b/app/dumpcap/main.c index
> > a6041d4ff495..bdeef96d9c0b 100644
> > --- a/app/dumpcap/main.c
> > +++ b/app/dumpcap/main.c
> > @@ -61,6 +61,7 @@ static char *output_name;  static const char
> > *filter_str;  static unsigned int ring_size = 2048;  static const char
> > *capture_comment;
> > +static const char *file_prefix;
> >  static uint32_t snaplen = RTE_MBUF_DEFAULT_BUF_SIZE;  static bool
> > dump_bpf;  static struct { @@ -122,6 +123,7 @@ static void usage(void)
> >              "                           add a capture comment to the
> output file\n"
> >              "\n"
> >              "Miscellaneous:\n"
> > +            "  --file-prefix=<prefix>   prefix to use for
> multi-process\n"
> >              "  -q                       don't report packet capture
> counts\n"
> >              "  -v, --version            print version information and
> exit\n"
> >              "  -h, --help               display this help and exit\n"
> > @@ -310,6 +312,7 @@ static void parse_opts(int argc, char **argv)
> >       static const struct option long_options[] = {
> >               { "autostop",        required_argument, NULL, 'a' },
> >               { "capture-comment", required_argument, NULL, 0 },
> > +             { "file-prefix",     required_argument, NULL, 0 },
> >               { "help",            no_argument,       NULL, 'h' },
> >               { "interface",       required_argument, NULL, 'i' },
> >               { "list-interfaces", no_argument,       NULL, 'D' },
> > @@ -330,11 +333,13 @@ static void parse_opts(int argc, char **argv)
> >
> >               switch (c) {
> >               case 0:
> > -                     switch (option_index) {
> > -                     case 0:
> > +                     if (!strcmp(long_options[option_index].name,
> > +                                 "capture-comment")) {
> >                               capture_comment = optarg;
> > -                             break;
> > -                     default:
> > +                     } else if (!strcmp(long_options[option_index].name,
> > +                                        "file-prefix")) {
> > +                             file_prefix = optarg;
> > +                     } else {
> >                               usage();
> >                               exit(1);
> >                       }
>
> parse_opts() is called after dpdk_init(). So whatever file-prefix we
> provide, for eal init, it remains NULL.
> Please let me know your thoughts about it.
>
> > @@ -512,12 +517,14 @@ static void dpdk_init(void)
> >       static const char * const args[] = {
> >               "dumpcap", "--proc-type", "secondary",
> >               "--log-level", "notice"
> > -
> >       };
> > -     const int eal_argc = RTE_DIM(args);
> > +     int eal_argc = RTE_DIM(args);
> >       char **eal_argv;
> >       unsigned int i;
> >
> > +     if (file_prefix != NULL)
> > +             eal_argc += 2;
> > +
> >       /* DPDK API requires mutable versions of command line arguments.
> > */
> >       eal_argv = calloc(eal_argc + 1, sizeof(char *));
> >       if (eal_argv == NULL)
> > @@ -527,6 +534,11 @@ static void dpdk_init(void)
> >       for (i = 1; i < RTE_DIM(args); i++)
> >               eal_argv[i] = strdup(args[i]);
> >
> > +     if (file_prefix != NULL) {
> > +             eal_argv[i++] = strdup("--file-prefix");
> > +             eal_argv[i++] = strdup(file_prefix);
> > +     }
> > +
> >       if (rte_eal_init(eal_argc, eal_argv) < 0)
> >               rte_exit(EXIT_FAILURE, "EAL init failed: is primary process
> > running?\n");
> >
> > --
> > 2.35.1
>
>
  
Stephen Hemminger Sept. 16, 2022, 3:35 p.m. UTC | #3
On Fri, 16 Sep 2022 08:51:59 -0400
Ben Magistro <koncept1@gmail.com> wrote:

> Kaur,
> 
> I believe parse_opts() should be called before dpdk_init() now see
> https://patches.dpdk.org/project/dpdk/patch/20220125032545.7704-1-koncept1@gmail.com/

Correct, in main branch parse_opts is before dpdk_init
  
Kaur, Arshdeep Sept. 19, 2022, 11:19 a.m. UTC | #4
> -----Original Message-----
> From: Stephen Hemminger <stephen@networkplumber.org>
> Sent: Friday, September 16, 2022 9:05 PM
> To: Ben Magistro <koncept1@gmail.com>
> Cc: Kaur, Arshdeep <arshdeep.kaur@intel.com>; dev@dpdk.org
> Subject: Re: [RFT] dumpcap: add file-prefix option
> 
> On Fri, 16 Sep 2022 08:51:59 -0400
> Ben Magistro <koncept1@gmail.com> wrote:
> 
> > Kaur,
> >
> > I believe parse_opts() should be called before dpdk_init() now see
> > https://patches.dpdk.org/project/dpdk/patch/20220125032545.7704-1-
> konc
> > ept1@gmail.com/
> 
> Correct, in main branch parse_opts is before dpdk_init

Hi Stephen and Ben. I have a doubt regarding this. According to me if dpdk_init is called after parse_opts, then some caller functions (called from within parse_opts) are affected.
Eg.	1) Parameter 'D' : { "list-interfaces", no_argument,       NULL, 'D' }, does not give any output.
	2) Parameter 'i' : { "interface",       required_argument, NULL, 'i' }, does not behave properly. 
I think the reason is that port list is available after eal init. Dumpcap(secondary process) will inherit the ports used by primary process.
This implies that dpdk_init should be called before parse_opts.
But then for multiprocess support, primary process is to be picked up by providing a file-prefix (Added in parse_opts).
This implies that parse_opts should be called before dpdk_init.

So according to me there was a deadlock situation here. Which I handled by providing file-prefix input to the program before dpdk_init manually. And then after dpdk_init, parse_opts should be called.

Please let me know if I am going in the wrong direction. And how else can we solve this?

NOTE: There is a bug in 'if' condition of select_interface function. Control should enter the 'if' condition if we provide select interface as '*' but instead it enters when they are unequal. So I have already submitted a patch for that. And it is acknowledged. Change done is:
- if (strcmp(arg, "*"))
+ if (!strcmp(arg, "*"))
  
Kaur, Arshdeep Sept. 23, 2022, 11:46 a.m. UTC | #5
++ Balaji and Mike.

> -----Original Message-----
> From: Kaur, Arshdeep <arshdeep.kaur@intel.com>
> Sent: Friday, September 16, 2022 1:49 PM
> To: Stephen Hemminger <stephen@networkplumber.org>; dev@dpdk.org
> Subject: RE: [RFT] dumpcap: add file-prefix option
> 
> 
> 
> > -----Original Message-----
> > From: Stephen Hemminger <stephen@networkplumber.org>
> > Sent: Tuesday, September 13, 2022 12:34 AM
> > To: dev@dpdk.org
> > Cc: Stephen Hemminger <stephen@networkplumber.org>; Kaur,
> Arshdeep
> > <arshdeep.kaur@intel.com>
> > Subject: [RFT] dumpcap: add file-prefix option
> >
> > When using dumpcap in container environment or with multiple DPDK
> > processes, it is useful to be able to specify file prefix.
> >
> > This version only accepts the long format option used by other
> commands.
> > If no prefix is specified then the default is used.
> >
> > Suggested-by: Arshdeep Kaur <arshdeep.kaur@intel.com>
> > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> > ---
> > Did basic command line test, but still needs testing with a prefix
> > being used (ie multiple apps).
> >
> >  app/dumpcap/main.c | 24 ++++++++++++++++++------
> >  1 file changed, 18 insertions(+), 6 deletions(-)
> >
> > diff --git a/app/dumpcap/main.c b/app/dumpcap/main.c index
> > a6041d4ff495..bdeef96d9c0b 100644
> > --- a/app/dumpcap/main.c
> > +++ b/app/dumpcap/main.c
> > @@ -61,6 +61,7 @@ static char *output_name;  static const char
> > *filter_str;  static unsigned int ring_size = 2048;  static const char
> > *capture_comment;
> > +static const char *file_prefix;
> >  static uint32_t snaplen = RTE_MBUF_DEFAULT_BUF_SIZE;  static bool
> > dump_bpf;  static struct { @@ -122,6 +123,7 @@ static void usage(void)
> >  	       "                           add a capture comment to the output file\n"
> >  	       "\n"
> >  	       "Miscellaneous:\n"
> > +	       "  --file-prefix=<prefix>   prefix to use for multi-process\n"
> >  	       "  -q                       don't report packet capture counts\n"
> >  	       "  -v, --version            print version information and exit\n"
> >  	       "  -h, --help               display this help and exit\n"
> > @@ -310,6 +312,7 @@ static void parse_opts(int argc, char **argv)
> >  	static const struct option long_options[] = {
> >  		{ "autostop",        required_argument, NULL, 'a' },
> >  		{ "capture-comment", required_argument, NULL, 0 },
> > +		{ "file-prefix",     required_argument, NULL, 0 },
> >  		{ "help",            no_argument,       NULL, 'h' },
> >  		{ "interface",       required_argument, NULL, 'i' },
> >  		{ "list-interfaces", no_argument,       NULL, 'D' },
> > @@ -330,11 +333,13 @@ static void parse_opts(int argc, char **argv)
> >
> >  		switch (c) {
> >  		case 0:
> > -			switch (option_index) {
> > -			case 0:
> > +			if (!strcmp(long_options[option_index].name,
> > +				    "capture-comment")) {
> >  				capture_comment = optarg;
> > -				break;
> > -			default:
> > +			} else if (!strcmp(long_options[option_index].name,
> > +					   "file-prefix")) {
> > +				file_prefix = optarg;
> > +			} else {
> >  				usage();
> >  				exit(1);
> >  			}
> 
> parse_opts() is called after dpdk_init(). So whatever file-prefix we provide,
> for eal init, it remains NULL.
> Please let me know your thoughts about it.
> 
> > @@ -512,12 +517,14 @@ static void dpdk_init(void)
> >  	static const char * const args[] = {
> >  		"dumpcap", "--proc-type", "secondary",
> >  		"--log-level", "notice"
> > -
> >  	};
> > -	const int eal_argc = RTE_DIM(args);
> > +	int eal_argc = RTE_DIM(args);
> >  	char **eal_argv;
> >  	unsigned int i;
> >
> > +	if (file_prefix != NULL)
> > +		eal_argc += 2;
> > +
> >  	/* DPDK API requires mutable versions of command line arguments.
> > */
> >  	eal_argv = calloc(eal_argc + 1, sizeof(char *));
> >  	if (eal_argv == NULL)
> > @@ -527,6 +534,11 @@ static void dpdk_init(void)
> >  	for (i = 1; i < RTE_DIM(args); i++)
> >  		eal_argv[i] = strdup(args[i]);
> >
> > +	if (file_prefix != NULL) {
> > +		eal_argv[i++] = strdup("--file-prefix");
> > +		eal_argv[i++] = strdup(file_prefix);
> > +	}
> > +
> >  	if (rte_eal_init(eal_argc, eal_argv) < 0)
> >  		rte_exit(EXIT_FAILURE, "EAL init failed: is primary process
> > running?\n");
> >
> > --
> > 2.35.1
  
Kaur, Arshdeep Oct. 17, 2022, 5:08 a.m. UTC | #6
Hi Stephen,

These changes are looking good as compared to 
http://patches.dpdk.org/project/dpdk/patch/20220912190330.73159-1-stephen@networkplumber.org/.
I have tested the changes. Works for me.
I am looking for this change in this release. Can you send the v1?

Thanks and regards,
Arshdeep Kaur

> -----Original Message-----
> From: Stephen Hemminger <stephen@networkplumber.org>
> Sent: Tuesday, September 13, 2022 12:34 AM
> To: dev@dpdk.org
> Cc: Stephen Hemminger <stephen@networkplumber.org>; Kaur, Arshdeep
> <arshdeep.kaur@intel.com>
> Subject: [RFT] dumpcap: add file-prefix option
> 
> When using dumpcap in container environment or with multiple DPDK
> processes, it is useful to be able to specify file prefix.
> 
> This version only accepts the long format option used by other commands.
> If no prefix is specified then the default is used.
> 
> Suggested-by: Arshdeep Kaur <arshdeep.kaur@intel.com>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
> Did basic command line test, but still needs testing with a prefix being used
> (ie multiple apps).
> 
>  app/dumpcap/main.c | 24 ++++++++++++++++++------
>  1 file changed, 18 insertions(+), 6 deletions(-)
> 
> diff --git a/app/dumpcap/main.c b/app/dumpcap/main.c index
> a6041d4ff495..bdeef96d9c0b 100644
> --- a/app/dumpcap/main.c
> +++ b/app/dumpcap/main.c
> @@ -61,6 +61,7 @@ static char *output_name;  static const char
> *filter_str;  static unsigned int ring_size = 2048;  static const char
> *capture_comment;
> +static const char *file_prefix;
>  static uint32_t snaplen = RTE_MBUF_DEFAULT_BUF_SIZE;  static bool
> dump_bpf;  static struct { @@ -122,6 +123,7 @@ static void usage(void)
>  	       "                           add a capture comment to the output file\n"
>  	       "\n"
>  	       "Miscellaneous:\n"
> +	       "  --file-prefix=<prefix>   prefix to use for multi-process\n"
>  	       "  -q                       don't report packet capture counts\n"
>  	       "  -v, --version            print version information and exit\n"
>  	       "  -h, --help               display this help and exit\n"
> @@ -310,6 +312,7 @@ static void parse_opts(int argc, char **argv)
>  	static const struct option long_options[] = {
>  		{ "autostop",        required_argument, NULL, 'a' },
>  		{ "capture-comment", required_argument, NULL, 0 },
> +		{ "file-prefix",     required_argument, NULL, 0 },
>  		{ "help",            no_argument,       NULL, 'h' },
>  		{ "interface",       required_argument, NULL, 'i' },
>  		{ "list-interfaces", no_argument,       NULL, 'D' },
> @@ -330,11 +333,13 @@ static void parse_opts(int argc, char **argv)
> 
>  		switch (c) {
>  		case 0:
> -			switch (option_index) {
> -			case 0:
> +			if (!strcmp(long_options[option_index].name,
> +				    "capture-comment")) {
>  				capture_comment = optarg;
> -				break;
> -			default:
> +			} else if (!strcmp(long_options[option_index].name,
> +					   "file-prefix")) {
> +				file_prefix = optarg;
> +			} else {
>  				usage();
>  				exit(1);
>  			}
> @@ -512,12 +517,14 @@ static void dpdk_init(void)
>  	static const char * const args[] = {
>  		"dumpcap", "--proc-type", "secondary",
>  		"--log-level", "notice"
> -
>  	};
> -	const int eal_argc = RTE_DIM(args);
> +	int eal_argc = RTE_DIM(args);
>  	char **eal_argv;
>  	unsigned int i;
> 
> +	if (file_prefix != NULL)
> +		eal_argc += 2;
> +
>  	/* DPDK API requires mutable versions of command line arguments.
> */
>  	eal_argv = calloc(eal_argc + 1, sizeof(char *));
>  	if (eal_argv == NULL)
> @@ -527,6 +534,11 @@ static void dpdk_init(void)
>  	for (i = 1; i < RTE_DIM(args); i++)
>  		eal_argv[i] = strdup(args[i]);
> 
> +	if (file_prefix != NULL) {
> +		eal_argv[i++] = strdup("--file-prefix");
> +		eal_argv[i++] = strdup(file_prefix);
> +	}
> +
>  	if (rte_eal_init(eal_argc, eal_argv) < 0)
>  		rte_exit(EXIT_FAILURE, "EAL init failed: is primary process
> running?\n");
> 
> --
> 2.35.1
  
Kaur, Arshdeep Oct. 20, 2022, 10:43 a.m. UTC | #7
Hi Stephen, a gentle reminder.

Thanks and regards,
Arshdeep Kaur

> -----Original Message-----
> From: Kaur, Arshdeep
> Sent: Monday, October 17, 2022 10:38 AM
> To: Stephen Hemminger <stephen@networkplumber.org>; dev@dpdk.org
> Cc: Chintalapalle, Balaji <balaji.chintalapalle@intel.com>; Beadle, Michael
> <michael.beadle@intel.com>
> Subject: RE: [RFT] dumpcap: add file-prefix option
> 
> Hi Stephen,
> 
> These changes are looking good as compared to
> http://patches.dpdk.org/project/dpdk/patch/20220912190330.73159-1-
> stephen@networkplumber.org/.
> I have tested the changes. Works for me.
> I am looking for this change in this release. Can you send the v1?
> 
> Thanks and regards,
> Arshdeep Kaur
> 
> > -----Original Message-----
> > From: Stephen Hemminger <stephen@networkplumber.org>
> > Sent: Tuesday, September 13, 2022 12:34 AM
> > To: dev@dpdk.org
> > Cc: Stephen Hemminger <stephen@networkplumber.org>; Kaur,
> Arshdeep
> > <arshdeep.kaur@intel.com>
> > Subject: [RFT] dumpcap: add file-prefix option
> >
> > When using dumpcap in container environment or with multiple DPDK
> > processes, it is useful to be able to specify file prefix.
> >
> > This version only accepts the long format option used by other
> commands.
> > If no prefix is specified then the default is used.
> >
> > Suggested-by: Arshdeep Kaur <arshdeep.kaur@intel.com>
> > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> > ---
> > Did basic command line test, but still needs testing with a prefix
> > being used (ie multiple apps).
> >
> >  app/dumpcap/main.c | 24 ++++++++++++++++++------
> >  1 file changed, 18 insertions(+), 6 deletions(-)
> >
> > diff --git a/app/dumpcap/main.c b/app/dumpcap/main.c index
> > a6041d4ff495..bdeef96d9c0b 100644
> > --- a/app/dumpcap/main.c
> > +++ b/app/dumpcap/main.c
> > @@ -61,6 +61,7 @@ static char *output_name;  static const char
> > *filter_str;  static unsigned int ring_size = 2048;  static const char
> > *capture_comment;
> > +static const char *file_prefix;
> >  static uint32_t snaplen = RTE_MBUF_DEFAULT_BUF_SIZE;  static bool
> > dump_bpf;  static struct { @@ -122,6 +123,7 @@ static void usage(void)
> >  	       "                           add a capture comment to the output file\n"
> >  	       "\n"
> >  	       "Miscellaneous:\n"
> > +	       "  --file-prefix=<prefix>   prefix to use for multi-process\n"
> >  	       "  -q                       don't report packet capture counts\n"
> >  	       "  -v, --version            print version information and exit\n"
> >  	       "  -h, --help               display this help and exit\n"
> > @@ -310,6 +312,7 @@ static void parse_opts(int argc, char **argv)
> >  	static const struct option long_options[] = {
> >  		{ "autostop",        required_argument, NULL, 'a' },
> >  		{ "capture-comment", required_argument, NULL, 0 },
> > +		{ "file-prefix",     required_argument, NULL, 0 },
> >  		{ "help",            no_argument,       NULL, 'h' },
> >  		{ "interface",       required_argument, NULL, 'i' },
> >  		{ "list-interfaces", no_argument,       NULL, 'D' },
> > @@ -330,11 +333,13 @@ static void parse_opts(int argc, char **argv)
> >
> >  		switch (c) {
> >  		case 0:
> > -			switch (option_index) {
> > -			case 0:
> > +			if (!strcmp(long_options[option_index].name,
> > +				    "capture-comment")) {
> >  				capture_comment = optarg;
> > -				break;
> > -			default:
> > +			} else if (!strcmp(long_options[option_index].name,
> > +					   "file-prefix")) {
> > +				file_prefix = optarg;
> > +			} else {
> >  				usage();
> >  				exit(1);
> >  			}
> > @@ -512,12 +517,14 @@ static void dpdk_init(void)
> >  	static const char * const args[] = {
> >  		"dumpcap", "--proc-type", "secondary",
> >  		"--log-level", "notice"
> > -
> >  	};
> > -	const int eal_argc = RTE_DIM(args);
> > +	int eal_argc = RTE_DIM(args);
> >  	char **eal_argv;
> >  	unsigned int i;
> >
> > +	if (file_prefix != NULL)
> > +		eal_argc += 2;
> > +
> >  	/* DPDK API requires mutable versions of command line arguments.
> > */
> >  	eal_argv = calloc(eal_argc + 1, sizeof(char *));
> >  	if (eal_argv == NULL)
> > @@ -527,6 +534,11 @@ static void dpdk_init(void)
> >  	for (i = 1; i < RTE_DIM(args); i++)
> >  		eal_argv[i] = strdup(args[i]);
> >
> > +	if (file_prefix != NULL) {
> > +		eal_argv[i++] = strdup("--file-prefix");
> > +		eal_argv[i++] = strdup(file_prefix);
> > +	}
> > +
> >  	if (rte_eal_init(eal_argc, eal_argv) < 0)
> >  		rte_exit(EXIT_FAILURE, "EAL init failed: is primary process
> > running?\n");
> >
> > --
> > 2.35.1
  
Kaur, Arshdeep Oct. 20, 2022, 11:55 a.m. UTC | #8
> -----Original Message-----
> From: Stephen Hemminger <stephen@networkplumber.org>
> Sent: Tuesday, September 13, 2022 12:34 AM
> To: dev@dpdk.org
> Cc: Stephen Hemminger <stephen@networkplumber.org>; Kaur, Arshdeep
> <arshdeep.kaur@intel.com>
> Subject: [RFT] dumpcap: add file-prefix option
> 
> When using dumpcap in container environment or with multiple DPDK
> processes, it is useful to be able to specify file prefix.
> 
> This version only accepts the long format option used by other commands.
> If no prefix is specified then the default is used.
> 
> Suggested-by: Arshdeep Kaur <arshdeep.kaur@intel.com>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>

Looks good ready to merge.

Acked-by:  Arshdeep Kaur <arshdeep.kaur@intel.com>

Tested-by: Arshdeep Kaur <arshdeep.kaur@intel.com>
  
Stephen Hemminger Oct. 20, 2022, 3:40 p.m. UTC | #9
On Thu, 20 Oct 2022 10:43:28 +0000
"Kaur, Arshdeep" <arshdeep.kaur@intel.com> wrote:

> Hi Stephen, a gentle reminder.
> 
> Thanks and regards,
> Arshdeep Kaur
> 
> > -----Original Message-----
> > From: Kaur, Arshdeep
> > Sent: Monday, October 17, 2022 10:38 AM
> > To: Stephen Hemminger <stephen@networkplumber.org>; dev@dpdk.org
> > Cc: Chintalapalle, Balaji <balaji.chintalapalle@intel.com>; Beadle, Michael
> > <michael.beadle@intel.com>
> > Subject: RE: [RFT] dumpcap: add file-prefix option
> > 
> > Hi Stephen,
> > 
> > These changes are looking good as compared to
> > http://patches.dpdk.org/project/dpdk/patch/20220912190330.73159-1-
> > stephen@networkplumber.org/.
> > I have tested the changes. Works for me.
> > I am looking for this change in this release. Can you send the v1?
> > 
> > Thanks and regards,
> > Arshdeep Kaur
> >   
> > > -----Original Message-----
> > > From: Stephen Hemminger <stephen@networkplumber.org>
> > > Sent: Tuesday, September 13, 2022 12:34 AM
> > > To: dev@dpdk.org
> > > Cc: Stephen Hemminger <stephen@networkplumber.org>; Kaur,  
> > Arshdeep  
> > > <arshdeep.kaur@intel.com>
> > > Subject: [RFT] dumpcap: add file-prefix option
> > >
> > > When using dumpcap in container environment or with multiple DPDK
> > > processes, it is useful to be able to specify file prefix.
> > >
> > > This version only accepts the long format option used by other  
> > commands.  
> > > If no prefix is specified then the default is used.
> > >
> > > Suggested-by: Arshdeep Kaur <arshdeep.kaur@intel.com>
> > > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> > > ---

Yes, these should be ready to merge.
This is busy time in release cycle for David and Thomas.
  
David Marchand Oct. 21, 2022, 1:07 p.m. UTC | #10
On Thu, Oct 20, 2022 at 1:55 PM Kaur, Arshdeep <arshdeep.kaur@intel.com> wrote:
> >
> > When using dumpcap in container environment or with multiple DPDK
> > processes, it is useful to be able to specify file prefix.
> >
> > This version only accepts the long format option used by other commands.
> > If no prefix is specified then the default is used.
> >
> > Suggested-by: Arshdeep Kaur <arshdeep.kaur@intel.com>
> > Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> Acked-by:  Arshdeep Kaur <arshdeep.kaur@intel.com>

Applied, thanks.
  

Patch

diff --git a/app/dumpcap/main.c b/app/dumpcap/main.c
index a6041d4ff495..bdeef96d9c0b 100644
--- a/app/dumpcap/main.c
+++ b/app/dumpcap/main.c
@@ -61,6 +61,7 @@  static char *output_name;
 static const char *filter_str;
 static unsigned int ring_size = 2048;
 static const char *capture_comment;
+static const char *file_prefix;
 static uint32_t snaplen = RTE_MBUF_DEFAULT_BUF_SIZE;
 static bool dump_bpf;
 static struct {
@@ -122,6 +123,7 @@  static void usage(void)
 	       "                           add a capture comment to the output file\n"
 	       "\n"
 	       "Miscellaneous:\n"
+	       "  --file-prefix=<prefix>   prefix to use for multi-process\n"
 	       "  -q                       don't report packet capture counts\n"
 	       "  -v, --version            print version information and exit\n"
 	       "  -h, --help               display this help and exit\n"
@@ -310,6 +312,7 @@  static void parse_opts(int argc, char **argv)
 	static const struct option long_options[] = {
 		{ "autostop",        required_argument, NULL, 'a' },
 		{ "capture-comment", required_argument, NULL, 0 },
+		{ "file-prefix",     required_argument, NULL, 0 },
 		{ "help",            no_argument,       NULL, 'h' },
 		{ "interface",       required_argument, NULL, 'i' },
 		{ "list-interfaces", no_argument,       NULL, 'D' },
@@ -330,11 +333,13 @@  static void parse_opts(int argc, char **argv)
 
 		switch (c) {
 		case 0:
-			switch (option_index) {
-			case 0:
+			if (!strcmp(long_options[option_index].name,
+				    "capture-comment")) {
 				capture_comment = optarg;
-				break;
-			default:
+			} else if (!strcmp(long_options[option_index].name,
+					   "file-prefix")) {
+				file_prefix = optarg;
+			} else {
 				usage();
 				exit(1);
 			}
@@ -512,12 +517,14 @@  static void dpdk_init(void)
 	static const char * const args[] = {
 		"dumpcap", "--proc-type", "secondary",
 		"--log-level", "notice"
-
 	};
-	const int eal_argc = RTE_DIM(args);
+	int eal_argc = RTE_DIM(args);
 	char **eal_argv;
 	unsigned int i;
 
+	if (file_prefix != NULL)
+		eal_argc += 2;
+
 	/* DPDK API requires mutable versions of command line arguments. */
 	eal_argv = calloc(eal_argc + 1, sizeof(char *));
 	if (eal_argv == NULL)
@@ -527,6 +534,11 @@  static void dpdk_init(void)
 	for (i = 1; i < RTE_DIM(args); i++)
 		eal_argv[i] = strdup(args[i]);
 
+	if (file_prefix != NULL) {
+		eal_argv[i++] = strdup("--file-prefix");
+		eal_argv[i++] = strdup(file_prefix);
+	}
+
 	if (rte_eal_init(eal_argc, eal_argv) < 0)
 		rte_exit(EXIT_FAILURE, "EAL init failed: is primary process running?\n");