git: 9front

Download patch

ref: 4ccbd5042434734c09f171e47ca0b78682dc2c36
parent: cea568929708208c2b41a56187da89bf28f52a1f
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Sun Jun 23 18:09:16 EDT 2013

wifi: add a debug flag and printing

add a debug flag that can be set in the ethernet options which
causes status transitions and wifictl messages to be printed.

--- a/sys/src/9/pc/etheriwl.c
+++ b/sys/src/9/pc/etheriwl.c
@@ -1943,14 +1943,19 @@
 static void
 setoptions(Ether *edev)
 {
+	char buf[64], *p;
 	Ctlr *ctlr;
-	char buf[64];
 	int i;
 
 	ctlr = edev->ctlr;
 	for(i = 0; i < edev->nopt; i++){
-		if(strncmp(edev->opt[i], "essid=", 6) == 0){
-			snprint(buf, sizeof(buf), "essid %s", edev->opt[i]+6);
+		snprint(buf, sizeof(buf), "%s", edev->opt[i]);
+		p = strchr(buf, '=');
+		if(p != nil)
+			*p = 0;
+		if(strcmp(buf, "debug") == 0 || strcmp(buf, "essid") == 0){
+			if(p != nil)
+				*p = ' ';
 			if(!waserror()){
 				wifictl(ctlr->wifi, buf, strlen(buf));
 				poperror();
--- a/sys/src/9/pc/wifi.c
+++ b/sys/src/9/pc/wifi.c
@@ -252,6 +252,18 @@
 }
 
 static void
+setstatus(Wifi *wifi, char *new)
+{
+	char *old;
+
+	old = wifi->status;
+	wifi->status = new;
+	if(wifi->debug && new != old)
+		print("#l%d: status: %s -> %s (from pc=%#p)\n",
+			wifi->ether->ctlrno, old, new, getcallerpc(&wifi));
+}
+
+static void
 recvassoc(Wifi *wifi, Wnode *wn, uchar *d, int len)
 {
 	uint s;
@@ -266,13 +278,13 @@
 	case 0x00:
 		wn->aid = d[0] | d[1]<<8;
 		if(wn->rsnelen > 0)
-			wifi->status = Sblocked;
+			setstatus(wifi, Sblocked);
 		else
-			wifi->status = Sassoc;
+			setstatus(wifi, Sassoc);
 		break;
 	default:
 		wn->aid = 0;
-		wifi->status = Sunassoc;
+		setstatus(wifi, Sunassoc);
 		return;
 	}
 }
@@ -375,7 +387,7 @@
 			recvbeacon(wifi, wn, b->rp, BLEN(b));
 			if(wifi->bss == nil && wifi->essid[0] != 0 && strcmp(wifi->essid, wn->ssid) == 0){
 				wifi->bss = wn;
-				wifi->status = Sconn;
+				setstatus(wifi, Sconn);
 				sendauth(wifi, wn);
 			}
 			continue;
@@ -393,11 +405,11 @@
 			recvassoc(wifi, wn, b->rp, BLEN(b));
 			break;
 		case 0xb0:	/* auth */
-			wifi->status = Sauth;
+			setstatus(wifi, Sauth);
 			sendassoc(wifi, wn);
 			break;
 		case 0xc0:	/* deauth */
-			wifi->status = Sunauth;
+			setstatus(wifi, Sunauth);
 			memset(wn->rxkey, 0, sizeof(wn->rxkey));
 			memset(wn->txkey, 0, sizeof(wn->txkey));
 			wn->aid = 0;
@@ -552,10 +564,9 @@
 }
 
 enum {
+	CMdebug,
 	CMessid,
 	CMauth,
-	CMunblock,
-
 	CMrxkey0,
 	CMrxkey1,
 	CMrxkey2,
@@ -566,6 +577,7 @@
 
 static Cmdtab wifictlmsg[] =
 {
+	CMdebug,	"debug",	0,
 	CMessid,	"essid",	0,
 	CMauth,		"auth",		0,
 
@@ -593,10 +605,12 @@
 		free(cb);
 		nexterror();
 	}
+	if(wifi->debug)
+		print("#l%d: wifictl: %.*s\n", wifi->ether->ctlrno, (int)n, buf);
 	wn = wifi->bss;
 	cb = parsecmd(buf, n);
 	ct = lookupcmd(cb, wifictlmsg, nelem(wifictlmsg));
-	if(ct->index != CMessid){
+	if(ct->index >= CMauth){
 		if(ct->index >= CMrxkey0 && cb->nf > 1){
 			uchar addr[Eaddrlen];
 
@@ -610,17 +624,24 @@
 			error("missing node");
 	}
 	switch(ct->index){
+	case CMdebug:
+		if(cb->f[1] != nil)
+			wifi->debug = atoi(cb->f[1]);
+		else
+			wifi->debug ^= 1;
+		print("#l%d: debug: %d\n", wifi->ether->ctlrno, wifi->debug);
+		break;
 	case CMessid:
 		if(cb->f[1] == nil){
 			wifi->essid[0] = 0;
 			wifi->bss = nil;
-			wifi->status = Snone;
+			setstatus(wifi, Snone);
 		} else {
 			strncpy(wifi->essid, cb->f[1], Essidlen);
 			for(wn = wifi->node; wn != &wifi->node[nelem(wifi->node)]; wn++)
 				if(strcmp(wifi->essid, wn->ssid) == 0){
 					wifi->bss = wn;
-					wifi->status = Sconn;
+					setstatus(wifi, Sconn);
 					sendauth(wifi, wn);
 					break;
 				}
@@ -627,7 +648,7 @@
 		}
 		break;
 	case CMauth:
-		wifi->status = Sauth;
+		setstatus(wifi, Sauth);
 		memset(wn->rxkey, 0, sizeof(wn->rxkey));
 		memset(wn->txkey, 0, sizeof(wn->txkey));
 		if(cb->f[1] == nil)
@@ -645,7 +666,7 @@
 		if(cb->f[1] == nil || parsekey(k, cb->f[1]) != 0)
 			error("bad key");
 		if(ct->index >= CMtxkey0 && wifi->status == Sblocked && wifi->bss == wn)
-			wifi->status = Sassoc;
+			setstatus(wifi, Sassoc);
 		break;
 	}
 	poperror();
--- a/sys/src/9/pc/wifi.h
+++ b/sys/src/9/pc/wifi.h
@@ -45,6 +45,8 @@
 {
 	Ether	*ether;
 
+	int	debug;
+
 	Queue	*iq;
 	char	*status;
 	Ref	txseq;
--