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