Add wlandebug(8) tool for turning on/off debug flags in netproto/802_11
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 4 Mar 2007 13:15:48 +0000 (13:15 +0000)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 4 Mar 2007 13:15:48 +0000 (13:15 +0000)
Thank swildner@ to help with the manpage.

Obtained-from: FreeBSD (sam@freebsd.org) w/ modification

tools/tools/README
tools/tools/wlandebug/Makefile [new file with mode: 0644]
tools/tools/wlandebug/wlandebug.8 [new file with mode: 0644]
tools/tools/wlandebug/wlandebug.c [new file with mode: 0644]

index e95e3a6..0180d00 100644 (file)
@@ -1,5 +1,5 @@
 # $FreeBSD: src/tools/tools/README,v 1.18.2.2 2003/02/24 22:52:36 sam Exp $
-# $DragonFly: src/tools/tools/README,v 1.6 2006/07/01 09:10:35 swildner Exp $
+# $DragonFly: src/tools/tools/README,v 1.7 2007/03/04 13:15:48 sephe Exp $
 
 This directory is for tools.
 
@@ -33,4 +33,4 @@ vop_table     Generates a HTML document that shows all the VOP's in
                the kernel.
 diffburst      OBSOLETE: equivalent functionality is available via split -p.
                For example: "cat patchfile | split -p ^diff". See split(1).
-
+wlandebug      Manipulate netproto/802_11 debug flags symbolically.
diff --git a/tools/tools/wlandebug/Makefile b/tools/tools/wlandebug/Makefile
new file mode 100644 (file)
index 0000000..30d62e6
--- /dev/null
@@ -0,0 +1,8 @@
+# $FreeBSD: src/tools/tools/net80211/wlandebug/Makefile,v 1.3 2007/01/12 05:36:28 sam Exp $
+# $DragonFly: src/tools/tools/wlandebug/Makefile,v 1.1 2007/03/04 13:15:48 sephe Exp $
+
+PROG=  wlandebug
+BINDIR=        /usr/bin
+MAN=   wlandebug.8
+
+.include <bsd.prog.mk>
diff --git a/tools/tools/wlandebug/wlandebug.8 b/tools/tools/wlandebug/wlandebug.8
new file mode 100644 (file)
index 0000000..8dab3c9
--- /dev/null
@@ -0,0 +1,179 @@
+.\" Copyright (c) 2007 Sam Leffler, Errno Consulting
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD: src/tools/tools/net80211/wlandebug/wlandebug.8,v 1.2 2007/01/12 08:44:55 joel Exp $
+.\" $DragonFly: src/tools/tools/wlandebug/wlandebug.8,v 1.1 2007/03/04 13:15:48 sephe Exp $
+.\"
+.Dd March 4, 2007
+.Dt WLANDEBUG 8
+.Os
+.Sh NAME
+.Nm wlandebug
+.Nd "set/query 802.11 wireless debugging messages"
+.Sh SYNOPSIS
+.Nm
+.Fl i Ar ifnet
+.Op Fl flag|+flag Ar ...
+.Sh DESCRIPTION
+The
+.Nm
+command is a tool for enabling and disabling
+debugging messages in the
+.Xr wlan 4
+module.
+Running
+.Nm
+with
+.Fl i Ar ifnet
+will display the current messages
+enabled for
+.Ar ifnet .
+When run as the super-user
+.Nm
+can be used to enable and/or disable debugging messages.
+.Pp
+To enable debugging messages of a certain
+.Ar type
+use
+.Ar +type ;
+to disable such messages use
+.Ar -type .
+Multiple messages can be enabled and disabled with a single command.
+.Pp
+Messages are organized in the following groups:
+.Bl -tag -width ".Ar dumppkts"
+.It Ar debug
+general debugging facilities; equivalent to setting the debug
+parameter with
+.Xr ifconfig 8 .
+.It Ar dumppkts
+dump packet contents on transmit and receive.
+.It Ar crypto
+crypto-related work.
+.It Ar input
+errors encountered during input handling.
+.It Ar xrate
+extended rate set handling (for 802.11g).
+.It Ar elemid
+information element processing in 802.11 management frames.
+.It Ar node
+management of per-station state.
+.It Ar assoc
+802.11 station association processing; particularly useful to
+see when stations join and leave a BSS.
+.It Ar auth
+802.11 station authentication processing.
+.It Ar scan
+scanning operation; especially useful for debugging problems
+with not locating an access point.
+.It Ar output
+errors encountered during output handling.
+.It Ar state
+.Xr wlan 4
+state machine operation.
+.It Ar power
+802.11 power save operation; in hostap mode this enables
+copious information about buffered frames for stations operating
+in power save mode.
+.It Ar dot1x
+802.1x operation; not presently meaningful as 802.1x protocol
+support is implemented in user mode by the
+.Xr hostapd 8
+program.
+.It Ar dot1xsm
+802.1x state machine operation; not presently meaningful as 802.1x protocol
+support is implemented in user mode by the
+.Xr hostapd 8
+program.
+.It Ar radius
+radius backend operation as it relates to 802.1x operation;
+not presently meaningful as 802.1x protocol
+support is implemented in user mode by the
+.Xr hostapd 8
+program.
+.It Ar raddump
+dump packets exchanged with the radius backend for 802.1x operation;
+not presently meaningful as 802.1x protocol
+support is implemented in user mode by the
+.Xr hostapd 8
+program.
+.It Ar radkeys
+include key contents when dumping packets exchanged with the
+radius backend for 802.1x operation;
+not presently meaningful as 802.1x protocol
+support is implemented in user mode by the
+.Xr hostapd 8
+program.
+.It Ar wpa
+trace operation of the WPA protocol; 
+only partly meaningful as WPA protocol
+support is mostly implemented in user mode by the
+.Xr hostapd 8
+and
+.Xr wpa_supplicant 8
+programs.
+.It Ar acl
+trace operation of the Access Control List (ACL) support; see
+.Xr wlan_acl 4
+for more details.
+.It Ar wme
+trace operation of WME/WMM protocol processing.
+.It Ar superg
+trace operation of Atheros SuperG protocol processing.
+.It Ar doth
+trace operation of IEEE 802.11h protocol processing.
+.It Ar inact
+trace station inactivity processing; in particular,
+show when stations associated to an access point are dropped due to
+inactivity.
+.It Ar roam
+trace station mode roaming between access points.
+.El
+.Sh EXAMPLES
+The following might be used to debug basic station mode operation:
+.Pp
+.Dl "wlandebug -i ral0 +scan+auth+assoc"
+.Pp
+it enables debug messages while scanning, authenticating to
+an access point, and associating to an access point.
+.Sh SEE ALSO
+.Xr ifconfig 8
+.Sh NOTES
+Different wireless drivers support different debugging messages.
+Drivers such as
+.Xr ath 4
+and
+.Xr ral 4
+that depend on the
+.Xr wlan 4
+module for 802.11 protocol processing typically support
+most of the debugging messages while devices that
+implement parts of the 802.11 protocol in firmware do not.
+.Pp
+Some debugging messages are no longer meaningful
+because protocol processing has moved from the operating
+system to user mode programs such as
+.Xr hostapd 8
+and
+.Xr wpa_supplicant 8 .
diff --git a/tools/tools/wlandebug/wlandebug.c b/tools/tools/wlandebug/wlandebug.c
new file mode 100644 (file)
index 0000000..a1dae3f
--- /dev/null
@@ -0,0 +1,207 @@
+/*-
+ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+ *    redistribution must be conditioned upon including a substantially
+ *    similar Disclaimer requirement for further binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ *    of any contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * $FreeBSD: src/tools/tools/net80211/wlandebug/wlandebug.c,v 1.3 2007/01/12 05:36:17 sam Exp $
+ * $DragonFly: src/tools/tools/wlandebug/wlandebug.c,v 1.1 2007/03/04 13:15:48 sephe Exp $
+ */
+
+/*
+ * wlandebug -i interface [flags]
+ */
+
+#include <sys/types.h>
+#include <netproto/802_11/ieee80211_var.h>
+
+#include <stdio.h>
+#include <ctype.h>
+#include <getopt.h>
+#include <string.h>
+
+#define        N(a)    (sizeof(a)/sizeof(a[0]))
+
+const char *progname;
+
+static struct {
+       const char      *name;
+       u_int           bit;
+} flags[] = {
+       { "debug",      IEEE80211_MSG_DEBUG },
+       { "dumppkts",   IEEE80211_MSG_DUMPPKTS },
+       { "crypto",     IEEE80211_MSG_CRYPTO },
+       { "input",      IEEE80211_MSG_INPUT },
+       { "xrate",      IEEE80211_MSG_XRATE },
+       { "elemid",     IEEE80211_MSG_ELEMID },
+       { "node",       IEEE80211_MSG_NODE },
+       { "assoc",      IEEE80211_MSG_ASSOC },
+       { "auth",       IEEE80211_MSG_AUTH },
+       { "scan",       IEEE80211_MSG_SCAN },
+       { "output",     IEEE80211_MSG_OUTPUT },
+       { "state",      IEEE80211_MSG_STATE },
+       { "power",      IEEE80211_MSG_POWER },
+       { "dot1x",      IEEE80211_MSG_DOT1X },
+       { "dot1xsm",    IEEE80211_MSG_DOT1XSM },
+       { "radius",     IEEE80211_MSG_RADIUS },
+       { "raddump",    IEEE80211_MSG_RADDUMP },
+       { "radkeys",    IEEE80211_MSG_RADKEYS },
+       { "wpa",        IEEE80211_MSG_WPA },
+       { "acl",        IEEE80211_MSG_ACL },
+       { "wme",        IEEE80211_MSG_WME },
+       { "superg",     IEEE80211_MSG_SUPERG },
+       { "doth",       IEEE80211_MSG_DOTH },
+       { "inact",      IEEE80211_MSG_INACT },
+       { "roam",       IEEE80211_MSG_ROAM }
+};
+
+static u_int
+getflag(const char *name, int len)
+{
+       int i;
+
+       for (i = 0; i < N(flags); i++)
+               if (strncasecmp(flags[i].name, name, len) == 0)
+                       return flags[i].bit;
+       return 0;
+}
+
+static const char *
+getflagname(u_int flag)
+{
+       int i;
+
+       for (i = 0; i < N(flags); i++)
+               if (flags[i].bit == flag)
+                       return flags[i].name;
+       return "???";
+}
+
+static void
+usage(void)
+{
+       int i;
+
+       fprintf(stderr, "usage: %s -i device [flags]\n", progname);
+       fprintf(stderr, "where flags are:\n");
+       for (i = 0; i < N(flags); i++)
+               printf("%s\n", flags[i].name);
+       exit(-1);
+}
+
+int
+main(int argc, char *argv[])
+{
+       const char *ifname = NULL;
+       const char *cp, *tp;
+       const char *sep;
+       int c, op, i, unit;
+       u_int32_t debug, ndebug;
+       size_t debuglen, parentlen;
+       char oid[256], parent[256];
+
+       progname = argv[0];
+       if (argc > 1) {
+               if (strcmp(argv[1], "-i") == 0) {
+                       if (argc < 2)
+                               errx(1, "missing interface name for -i option");
+                       ifname = argv[2];
+                       argc -= 2, argv += 2;
+               }
+       }
+
+       if (ifname == NULL)
+               usage();
+
+       for (unit = 0; unit < 10; unit++) {
+               snprintf(oid, sizeof(oid), "net.wlan.%d.%%parent", unit);
+               parentlen = sizeof(parent);
+               if (sysctlbyname(oid, parent, &parentlen, NULL, 0) >= 0 &&
+                   strncmp(parent, ifname, parentlen) == 0)
+                       break;
+       }
+       if (unit == 10)
+               errx(1, "%s: cannot locate wlan sysctl node.", ifname);
+       snprintf(oid, sizeof(oid), "net.wlan.%d.debug", unit);
+       debuglen = sizeof(debug);
+       if (sysctlbyname(oid, &debug, &debuglen, NULL, 0) < 0)
+               err(1, "sysctl-get(%s)", oid);
+       ndebug = debug;
+       for (; argc > 1; argc--, argv++) {
+               cp = argv[1];
+               do {
+                       u_int bit;
+
+                       if (*cp == '-') {
+                               cp++;
+                               op = -1;
+                       } else if (*cp == '+') {
+                               cp++;
+                               op = 1;
+                       } else
+                               op = 0;
+                       for (tp = cp; *tp != '\0' && *tp != '+' && *tp != '-';)
+                               tp++;
+                       bit = getflag(cp, tp-cp);
+                       if (op < 0)
+                               ndebug &= ~bit;
+                       else if (op > 0)
+                               ndebug |= bit;
+                       else {
+                               if (bit == 0) {
+                                       if (isdigit(*cp))
+                                               bit = strtoul(cp, NULL, 0);
+                                       else
+                                               errx(1, "unknown flag %.*s",
+                                                       tp-cp, cp);
+                               }
+                               ndebug = bit;
+                       }
+               } while (*(cp = tp) != '\0');
+       }
+       if (debug != ndebug) {
+               printf("%s: 0x%x => ", oid, debug);
+               if (sysctlbyname(oid, NULL, NULL, &ndebug, sizeof(ndebug)) < 0)
+                       err(1, "sysctl-set(%s)", oid);
+               printf("0x%x", ndebug);
+               debug = ndebug;
+       } else
+               printf("%s: 0x%x", oid, debug);
+       sep = "<";
+       for (i = 0; i < N(flags); i++)
+               if (debug & flags[i].bit) {
+                       printf("%s%s", sep, flags[i].name);
+                       sep = ",";
+               }
+       printf("%s\n", *sep != '<' ? ">" : "");
+       return 0;
+}