Implement own command line option for the frequently used -i usbusX -f Y syntax,

-d ugenX.Y, similar to what usbconfig(8) does.

MFC after:	1 week
Sponsored by:	Mellanox Technologies // NVIDIA Networking
This commit is contained in:
Hans Petter Selasky 2021-05-14 17:12:57 +02:00
parent c65e2d7092
commit c904e20cc9
2 changed files with 76 additions and 10 deletions

View File

@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd April 24, 2012
.Dd May 14, 2021
.Dt USBDUMP 8
.Os
.Sh NAME
@ -33,6 +33,9 @@
.Nd "dump traffic on USB host controller"
.Sh SYNOPSIS
.Nm
.Op Fl d Ar [ugen]B
.Op Fl d Ar [ugen]B.D
.Op Fl d Ar [ugen]B.D.E
.Op Fl i Ar ifname
.Op Fl r Ar file
.Op Fl s Ar snaplen
@ -48,6 +51,31 @@ utility provides a way to dump USB packets on host controllers.
.Pp
The following options are accepted:
.Bl -tag -width ".Fl f Ar file"
.It Fl d Ar [ugen]bus
Shortcut for
.Fl i
option.
The argument may be prefixed by "ugen".
The option may be specified multiple times, but the bus specified must
be the same.
.It Fl d Ar [ugen]bus.device
Shortcut for
.Fl i
and
.Fl f
options.
The argument may be prefixed by "ugen".
The option may be specified multiple times, but the bus specified must
be the same.
.It Fl d Ar [ugen]bus.device.endpoint
Shortcut for
.Fl i
and
.Fl f
options.
The argument may be prefixed by "ugen".
The option may be specified multiple times, but the bus specified must
be the same.
.It Fl b Ar file
Store data part of the USB trace in binary format to the given
.Ar file .

View File

@ -108,14 +108,14 @@ struct header_32 {
uint8_t align;
} __packed;
static int doexit = 0;
static int pkt_captured = 0;
static int verbose = 0;
static int doexit;
static int pkt_captured;
static int verbose;
static int uf_minor;
static const char *i_arg = "usbus0";
static const char *r_arg = NULL;
static const char *w_arg = NULL;
static const char *b_arg = NULL;
static char *i_arg;
static char *r_arg;
static char *w_arg;
static char *b_arg;
static struct usbcap uc;
static const char *errstr_table[USB_ERR_MAX] = {
[USB_ERR_NORMAL_COMPLETION] = "0",
@ -779,7 +779,10 @@ usage(void)
#define FMT " %-14s %s\n"
fprintf(stderr, "usage: usbdump [options]\n");
fprintf(stderr, FMT, "-i <usbusX>", "Listen on USB bus interface");
fprintf(stderr, FMT, "-d [ugen]B", "Listen on bus, B");
fprintf(stderr, FMT, "-d [ugen]B.D", "Listen on bus, B and device, D");
fprintf(stderr, FMT, "-d [ugen]B.D.E", "Listen on bus, B, device, D, and endpoint E");
fprintf(stderr, FMT, "-i <usbusX>", "Listen on this bus interface");
fprintf(stderr, FMT, "-f <unit[.endpoint]>", "Specify a device and endpoint filter");
fprintf(stderr, FMT, "-r <file>", "Read the raw packets from file");
fprintf(stderr, FMT, "-s <snaplen>", "Snapshot bytes from each packet");
@ -828,9 +831,41 @@ main(int argc, char *argv[])
const char *optstring;
char *pp;
optstring = "b:hi:r:s:vw:f:";
optstring = "b:d:hi:r:s:vw:f:";
while ((o = getopt(argc, argv, optstring)) != -1) {
switch (o) {
case 'd':
pp = optarg;
if (pp[0] == 'u' && pp[1] == 'g' && pp[2] == 'e' && pp[3] == 'n')
pp += 4;
ifindex = strtol(pp, &pp, 10);
/* Must be same bus when using -d option. */
if (i_arg != NULL) {
if (atoi(i_arg + 5) != ifindex)
usage();
} else {
asprintf(&i_arg, "usbus%d", ifindex);
}
/* Parse unit and endpoint, if any. */
if (pp != NULL) {
if (*pp == '.') {
filt_unit = strtol(pp + 1, &pp, 10);
filt_ep = -1;
if (pp != NULL) {
if (*pp == '.') {
filt_ep = strtol(pp + 1, &pp, 10);
if (pp != NULL && *pp != 0)
usage();
} else if (*pp != 0) {
usage();
}
}
add_filter(filt_unit, filt_ep);
} else if (*pp != 0) {
usage();
}
}
break;
case 'i':
i_arg = optarg;
break;
@ -879,6 +914,9 @@ main(int argc, char *argv[])
}
}
if (i_arg == NULL)
i_arg = "usbus0";
if (b_arg != NULL) {
p->bfd = open(b_arg, O_CREAT | O_TRUNC |
O_WRONLY, S_IRUSR | S_IWUSR);