git: 9front

Download patch

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));
--