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:
parent
2cf1e43e8c
commit
43323512f0
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -45,6 +45,8 @@ struct Wifi
|
|||
{
|
||||
Ether *ether;
|
||||
|
||||
int debug;
|
||||
|
||||
Queue *iq;
|
||||
char *status;
|
||||
Ref txseq;
|
||||
|
|
Loading…
Reference in a new issue