ref: acd55b1bbaa57ada1b2421c11821e1911512b6bf
parent: ac4840116ef15e2fc65d0e68f7e16d3a8a1aa2f8
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Sat Jun 22 21:01:36 EDT 2013
wifi: simplify
--- a/sys/src/9/pc/wifi.c
+++ b/sys/src/9/pc/wifi.c
@@ -346,6 +346,20 @@
}
}
+/* check if a node qualifies as our bss matching bssid and essid */
+static int
+goodbss(Wifi *wifi, Wnode *wn)
+{+ if(memcmp(wifi->bssid, wifi->ether->bcast, Eaddrlen) != 0){+ if(memcmp(wifi->bssid, wn->bssid, Eaddrlen) != 0)
+ return 0; /* bssid doesnt match */
+ } else if(wifi->essid[0] == 0)
+ return 0; /* both bssid and essid unspecified */
+ if(wifi->essid[0] != 0 && strcmp(wifi->essid, wn->ssid) != 0)
+ return 0; /* essid doesnt match */
+ return 1;
+}
+
static void
wifiproc(void *arg)
{@@ -385,14 +399,7 @@
continue;
b->rp += wifihdrlen(w);
recvbeacon(wifi, wn, b->rp, BLEN(b));
- if(wifi->bss == nil){- if(memcmp(wifi->bssid, wifi->ether->bcast, Eaddrlen) != 0){- if(memcmp(wifi->bssid, wn->bssid, Eaddrlen) != 0)
- continue; /* bssid doesnt match */
- } else if(wifi->essid[0] == 0)
- continue; /* both bssid and essid unspecified */
- if(wifi->essid[0] != 0 && strcmp(wifi->essid, wn->ssid) != 0)
- continue; /* essid doesnt match */
+ if(wifi->bss == nil && goodbss(wifi, wn)){wifi->bss = wn;
setstatus(wifi, Sconn);
sendauth(wifi, wn);
@@ -644,39 +651,27 @@
print("#l%d: debug: %d\n", wifi->ether->ctlrno, wifi->debug);break;
case CMessid:
- if(cb->f[1] != nil){+ if(cb->f[1] != nil)
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){- /* both must match if specified */
- if(memcmp(wifi->bssid, wifi->ether->bcast, Eaddrlen) != 0
- && memcmp(wifi->bssid, wn->bssid, Eaddrlen) != 0)
- continue;
-
- wifi->bss = wn;
- setstatus(wifi, Sconn);
- sendauth(wifi, wn);
- goto done;
- }
- } else
+ else
wifi->essid[0] = 0;
- wifi->bss = nil;
- setstatus(wifi, Snone);
- break;
- case CMbssid:
- memmove(wifi->bssid, addr, Eaddrlen);
- if(wn != nil){- /* both must match if specified */
- if(wifi->essid[0] == 0 || strcmp(wifi->essid, wn->ssid) == 0){+ Findbss:
+ wn = wifi->bss;
+ if(wn != nil && goodbss(wifi, wn))
+ break;
+ for(wn = wifi->node; wn != &wifi->node[nelem(wifi->node)]; wn++)
+ if(goodbss(wifi, wn)){wifi->bss = wn;
setstatus(wifi, Sconn);
sendauth(wifi, wn);
goto done;
}
- }
wifi->bss = nil;
setstatus(wifi, Snone);
break;
+ case CMbssid:
+ memmove(wifi->bssid, addr, Eaddrlen);
+ goto Findbss;
case CMauth:
setstatus(wifi, Sauth);
memset(wn->rxkey, 0, sizeof(wn->rxkey));
--
⑨