]> git.lizzy.rs Git - plan9front.git/commitdiff
wifi: handle short preamble and short time slot capabilities
authorcinap_lenrek <cinap_lenrek@felloff.net>
Mon, 13 Feb 2017 21:26:38 +0000 (22:26 +0100)
committercinap_lenrek <cinap_lenrek@felloff.net>
Mon, 13 Feb 2017 21:26:38 +0000 (22:26 +0100)
- drivers enable short preamble and sort timeslot depending
  on the ap beacon capinfo field (bss->cap)
- wifi sets short preamble bit in capinfo on association request
- wifi sets short timeslot bit when ap advertized it in beacon

sys/src/9/pc/etheriwl.c
sys/src/9/pc/etherrt2860.c
sys/src/9/pc/etherwpi.c
sys/src/9/pc/wifi.c

index 6bb902e2cec0babaa85a82f4ee4d5dd493ea91f4..105bb44cc55cd5cb5f33af7b726593e4a84d57e8 100644 (file)
@@ -1845,7 +1845,12 @@ rxon(Ether *edev, Wnode *bss)
                        ctlr->channel = bss->channel;
                bss = nil;
        }
+       flags = RFlagTSF | RFlagCTSToSelf | RFlag24Ghz | RFlagAuto;
        if(bss != nil){
+               if(bss->cap & (1<<5))
+                       flags |= RFlagShPreamble;
+               if(bss->cap & (1<<10))
+                       flags |= RFlagShSlot;
                ctlr->channel = bss->channel;
                memmove(ctlr->bssid, bss->bssid, Eaddrlen);
                ctlr->aid = bss->aid;
@@ -1861,7 +1866,6 @@ rxon(Ether *edev, Wnode *bss)
                ctlr->bcastnodeid = -1;
                ctlr->bssnodeid = -1;
        }
-       flags = RFlagTSF | RFlagCTSToSelf | RFlag24Ghz | RFlagAuto;
 
        if(ctlr->aid != 0)
                setled(ctlr, 2, 0, 1);          /* on when associated */
index 7d71d612f559152a5a7674a553131b1d1277975b..2311611e83afb035f0cbb1347843eb23e14c9d17 100644 (file)
@@ -1318,10 +1318,12 @@ rxon(Ether *edev, Wnode *bss)
 {
        u32int tmp;
        Ctlr *ctlr;
+       int cap;
 
        ctlr = edev->ctlr;
 
        if(bss != nil){
+               cap = bss->cap;
                ctlr->channel = bss->channel;
                memmove(ctlr->bssid, bss->bssid, Eaddrlen);
                ctlr->aid = bss->aid;
@@ -1332,6 +1334,7 @@ rxon(Ether *edev, Wnode *bss)
                }else
                        ctlr->bcastnodeid = -1;
        }else{
+               cap = 0;
                memmove(ctlr->bssid, edev->bcast, Eaddrlen);
                ctlr->aid = 0;
                ctlr->bcastnodeid = -1;
@@ -1377,14 +1380,13 @@ rxon(Ether *edev, Wnode *bss)
        /* update slot */
        tmp = csr32r(ctlr, BkoffSlotCfg);
        tmp &= ~0xff;
-       tmp |= /* (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : */ 20;
+       tmp |= (cap & (1<<10)) ? 9 : 20;
        csr32w(ctlr, BkoffSlotCfg, tmp);
        
        /* set TX preamble */
        tmp = csr32r(ctlr, AutoRspCfg);
        tmp &= ~CckShortEn;
-/*     if(sc->sc_ic.ic_flags & IEEE80211_F_SHPREAMBLE)
-               tmp |= CckShortEn; */
+       if(cap & (1<<5)) tmp |= CckShortEn;     
        csr32w(ctlr, AutoRspCfg, tmp);
 
        /* set basic rates */
index 4dbc65e6de41d2267f7eeb18019e5462325a2f52..1663eb31bb9808dfd64d8883132ea4c80f2acd4e 100644 (file)
@@ -1304,7 +1304,12 @@ rxon(Ether *edev, Wnode *bss)
                        ctlr->channel = bss->channel;
                bss = nil;
        }
+       flags = RFlagTSF | RFlag24Ghz | RFlagAuto;
        if(bss != nil){
+               if(bss->cap & (1<<5))
+                       flags |= RFlagShPreamble;
+               if(bss->cap & (1<<10))
+                       flags |= RFlagShSlot;
                ctlr->channel = bss->channel;
                memmove(ctlr->bssid, bss->bssid, Eaddrlen);
                ctlr->aid = bss->aid;
@@ -1319,7 +1324,6 @@ rxon(Ether *edev, Wnode *bss)
                ctlr->bcastnodeid = -1;
                ctlr->bssnodeid = -1;
        }
-       flags = RFlagTSF | RFlag24Ghz | RFlagAuto;
 
        if(ctlr->aid != 0)
                setled(ctlr, 2, 0, 1);          /* on when associated */
index 8325c0aa75089dd374bf15c99ab331e78948d7ff..7cea422f7001c39dd57297bbf6a24ec16e32692c 100644 (file)
@@ -320,7 +320,7 @@ sendassoc(Wifi *wifi, Wnode *bss)
        Wifipkt *w;
        Block *b;
        uchar *p;
-       int n;
+       int cap, n;
 
        b = allocb(WIFIHDRSIZE + 512);
        w = (Wifipkt*)b->wp;
@@ -331,9 +331,16 @@ sendassoc(Wifi *wifi, Wnode *bss)
        memmove(w->a3, bss->bssid, Eaddrlen);
        b->wp += WIFIHDRSIZE;
        p = b->wp;
-       *p++ = 1;       /* capinfo */
-       *p++ = 0;
-       *p++ = 16;      /* interval */
+
+       /* capinfo */
+       cap = 1;                                // ESS
+       cap |= (1<<5);                          // Short Preamble
+       cap |= (1<<10) & bss->cap;              // Short Slot Time
+       *p++ = cap;
+       *p++ = cap>>8;
+
+       /* interval */
+       *p++ = 16;
        *p++ = 16>>8;
 
        n = strlen(bss->ssid);