git: 9front

Download patch

ref: 656e22d91f62399d67cd5be0ca88d15abddf2a29
parent: 2e410f6b62a519f3db8adf9a4972d20be2335522
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Wed Feb 13 03:23:54 EST 2013

etheriwl: dont let transmit change back receiver settings when in promisc mode, cleanup

--- a/sys/src/9/pc/etheriwl.c
+++ b/sys/src/9/pc/etheriwl.c
@@ -327,6 +327,7 @@
 	int bssnodeid;
 
 	/* current receiver settings */
+	uchar bssid[Eaddrlen];
 	int channel;
 	int prom;
 	int aid;
@@ -1264,32 +1265,28 @@
 rxon(Ether *edev, Wnode *bss)
 {
 	uchar c[Tcmdsize], *p;
-	Ctlr *ctlr;
-	uchar *bssid;
 	int filter, flags;
+	Ctlr *ctlr;
 
 	ctlr = edev->ctlr;
-	bssid = edev->bcast;
 	filter = FilterMulticast | FilterBeacon;
-	if(ctlr->prom)
+	if(ctlr->prom){
 		filter |= FilterPromisc;
+		bss = nil;
+	}
 	if(bss != nil){
 		ctlr->channel = bss->channel;
-		if(bss->aid != 0){
-			bssid = bss->bssid;
+		memmove(ctlr->bssid, bss->bssid, Eaddrlen);
+		ctlr->aid = bss->aid;
+		if(ctlr->aid != 0){
 			filter |= FilterBSS;
 			filter &= ~FilterBeacon;
-			ctlr->aid = bss->aid;
-
 			ctlr->bssnodeid = -1;
-		} else {
-			filter &= ~FilterBSS;
-			filter |= FilterBeacon;
-			ctlr->aid = 0;
-	
+		} else
 			ctlr->bcastnodeid = -1;
-		}
 	} else {
+		memmove(ctlr->bssid, edev->bcast, Eaddrlen);
+		ctlr->aid = 0;
 		ctlr->bcastnodeid = -1;
 		ctlr->bssnodeid = -1;
 	}
@@ -1296,11 +1293,11 @@
 	flags = RFlagTSF | RFlagCTSToSelf | RFlag24Ghz | RFlagAuto;
 
 	if(0) print("rxon: bssid %E, aid %x, channel %d, filter %x, flags %x\n",
-		bssid, ctlr->aid, ctlr->channel, filter, flags);
+		ctlr->bssid, ctlr->aid, ctlr->channel, filter, flags);
 
 	memset(p = c, 0, sizeof(c));
 	memmove(p, edev->ea, 6); p += 8;	/* myaddr */
-	memmove(p, bssid, 6); p += 8;		/* bssid */
+	memmove(p, ctlr->bssid, 6); p += 8;	/* bssid */
 	memmove(p, edev->ea, 6); p += 8;	/* wlap */
 	*p++ = 3;				/* mode (STA) */
 	*p++ = 0;				/* air (?) */
@@ -1335,6 +1332,7 @@
 		ctlr->bssnodeid = 0;
 		addnode(ctlr, ctlr->bssnodeid, bss->bssid);
 	}
+	flushcmd(ctlr);
 }
 
 static struct ratetab {
@@ -1386,7 +1384,11 @@
 	ctlr = edev->ctlr;
 
 	qlock(ctlr);
-	if(wn != nil && (wn->aid != ctlr->aid || wn->channel != ctlr->channel))
+
+	if(ctlr->prom == 0)
+	if(wn->aid != ctlr->aid
+	|| wn->channel != ctlr->channel
+	|| memcmp(wn->bssid, ctlr->bssid, Eaddrlen) != 0)
 		rxon(edev, wn);
 
 	rate = 0;
@@ -1515,10 +1517,7 @@
 	ctlr = edev->ctlr;
 	qlock(ctlr);
 	ctlr->prom = on;
-	if(ctlr->prom)
-		rxon(edev, nil);
-	else
-		rxon(edev, ctlr->wifi->bss);
+	rxon(edev, ctlr->wifi->bss);
 	qunlock(ctlr);
 }
 
--- a/sys/src/9/pc/wifi.c
+++ b/sys/src/9/pc/wifi.c
@@ -345,7 +345,8 @@
 	Wnode *bss;
 	SNAP *s;
 
-	if(BLEN(b) < ETHERHDRSIZE){
+	bss = wifi->bss;
+	if(bss == nil || BLEN(b) < ETHERHDRSIZE){
 		freeb(b);
 		return;
 	}
@@ -357,8 +358,7 @@
 	w = (Wifipkt*)b->rp;
 	w->fc[0] = 0x08;	/* data */
 	w->fc[1] = 0x01;	/* STA->AP */
-	bss = wifi->bss;
-	memmove(w->a1, bss != nil ? bss->bssid : wifi->ether->bcast, Eaddrlen);
+	memmove(w->a1, bss->bssid, Eaddrlen);
 	memmove(w->a2, e.s, Eaddrlen);
 	memmove(w->a3, e.d, Eaddrlen);
 
--