git: c904e20cc903 - main - Implement own command line option for the frequently used -i usbusX -f Y syntax, -d ugenX.Y, similar to what usbconfig(8) does.

Hans Petter Selasky hselasky at FreeBSD.org
Fri May 14 15:18:25 UTC 2021


The branch main has been updated by hselasky:

URL: https://cgit.FreeBSD.org/src/commit/?id=c904e20cc903d28c1090c531c907cdd6865455ff

commit c904e20cc903d28c1090c531c907cdd6865455ff
Author:     Hans Petter Selasky <hselasky at FreeBSD.org>
AuthorDate: 2021-05-14 15:12:57 +0000
Commit:     Hans Petter Selasky <hselasky at FreeBSD.org>
CommitDate: 2021-05-14 15:15:07 +0000

    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
---
 usr.sbin/usbdump/usbdump.8 | 30 ++++++++++++++++++++++++-
 usr.sbin/usbdump/usbdump.c | 56 ++++++++++++++++++++++++++++++++++++++--------
 2 files changed, 76 insertions(+), 10 deletions(-)

diff --git a/usr.sbin/usbdump/usbdump.8 b/usr.sbin/usbdump/usbdump.8
index 475e832cd03b..6b5ad1920e94 100644
--- a/usr.sbin/usbdump/usbdump.8
+++ b/usr.sbin/usbdump/usbdump.8
@@ -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 .
diff --git a/usr.sbin/usbdump/usbdump.c b/usr.sbin/usbdump/usbdump.c
index a38d08a252af..00d3b8e8913b 100644
--- a/usr.sbin/usbdump/usbdump.c
+++ b/usr.sbin/usbdump/usbdump.c
@@ -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);


More information about the dev-commits-src-all mailing list