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.
This commit is contained in:
cinap_lenrek 2013-06-23 22:09:16 +02:00
parent 2cf1e43e8c
commit 43323512f0
3 changed files with 44 additions and 16 deletions

View file

@ -1943,14 +1943,19 @@ iwlifstat(Ether *edev, void *buf, long n, ulong off)
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();

View file

@ -251,6 +251,18 @@ sendassoc(Wifi *wifi, Wnode *bss)
wifitx(wifi, bss, b);
}
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)
{
@ -266,13 +278,13 @@ recvassoc(Wifi *wifi, Wnode *wn, uchar *d, int len)
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 @@ wifiproc(void *arg)
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 @@ wifiproc(void *arg)
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 @@ parsekey(Wkey *k, char *s)
}
enum {
CMdebug,
CMessid,
CMauth,
CMunblock,
CMrxkey0,
CMrxkey1,
CMrxkey2,
@ -566,6 +577,7 @@ enum {
static Cmdtab wifictlmsg[] =
{
CMdebug, "debug", 0,
CMessid, "essid", 0,
CMauth, "auth", 0,
@ -593,10 +605,12 @@ wifictl(Wifi *wifi, void *buf, long n)
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,24 +624,31 @@ wifictl(Wifi *wifi, void *buf, long n)
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;
}
}
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 @@ wifictl(Wifi *wifi, void *buf, long n)
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();

View file

@ -45,6 +45,8 @@ struct Wifi
{
Ether *ether;
int debug;
Queue *iq;
char *status;
Ref txseq;