1*43f728cbSDavid du Colombier typedef struct Wkey Wkey; 2*43f728cbSDavid du Colombier typedef struct Wnode Wnode; 3*43f728cbSDavid du Colombier typedef struct Wifi Wifi; 4*43f728cbSDavid du Colombier typedef struct Wifipkt Wifipkt; 5*43f728cbSDavid du Colombier 6*43f728cbSDavid du Colombier enum { 7*43f728cbSDavid du Colombier Essidlen = 32, 8*43f728cbSDavid du Colombier }; 9*43f728cbSDavid du Colombier 10*43f728cbSDavid du Colombier /* cipher */ 11*43f728cbSDavid du Colombier enum { 12*43f728cbSDavid du Colombier TKIP = 1, 13*43f728cbSDavid du Colombier CCMP = 2, 14*43f728cbSDavid du Colombier }; 15*43f728cbSDavid du Colombier 16*43f728cbSDavid du Colombier struct Wkey 17*43f728cbSDavid du Colombier { 18*43f728cbSDavid du Colombier int cipher; 19*43f728cbSDavid du Colombier int len; 20*43f728cbSDavid du Colombier uvlong tsc; 21*43f728cbSDavid du Colombier uchar key[]; 22*43f728cbSDavid du Colombier }; 23*43f728cbSDavid du Colombier 24*43f728cbSDavid du Colombier struct Wnode 25*43f728cbSDavid du Colombier { 26*43f728cbSDavid du Colombier uchar bssid[Eaddrlen]; 27*43f728cbSDavid du Colombier char ssid[Essidlen+2]; 28*43f728cbSDavid du Colombier 29*43f728cbSDavid du Colombier char *status; 30*43f728cbSDavid du Colombier 31*43f728cbSDavid du Colombier int rsnelen; 32*43f728cbSDavid du Colombier uchar rsne[258]; 33*43f728cbSDavid du Colombier Wkey *txkey[1]; 34*43f728cbSDavid du Colombier Wkey *rxkey[5]; 35*43f728cbSDavid du Colombier 36*43f728cbSDavid du Colombier int aid; /* association id */ 37*43f728cbSDavid du Colombier ulong lastsend; 38*43f728cbSDavid du Colombier ulong lastseen; 39*43f728cbSDavid du Colombier 40*43f728cbSDavid du Colombier uchar *minrate; /* pointers into wifi->rates */ 41*43f728cbSDavid du Colombier uchar *maxrate; 42*43f728cbSDavid du Colombier uchar *actrate; 43*43f728cbSDavid du Colombier 44*43f728cbSDavid du Colombier ulong txcount; /* statistics for rate adaption */ 45*43f728cbSDavid du Colombier ulong txerror; 46*43f728cbSDavid du Colombier 47*43f728cbSDavid du Colombier /* stuff from beacon */ 48*43f728cbSDavid du Colombier int ival; 49*43f728cbSDavid du Colombier int cap; 50*43f728cbSDavid du Colombier int channel; 51*43f728cbSDavid du Colombier int brsnelen; 52*43f728cbSDavid du Colombier uchar brsne[258]; 53*43f728cbSDavid du Colombier }; 54*43f728cbSDavid du Colombier 55*43f728cbSDavid du Colombier struct Wifi 56*43f728cbSDavid du Colombier { 57*43f728cbSDavid du Colombier Ether *ether; 58*43f728cbSDavid du Colombier 59*43f728cbSDavid du Colombier int debug; 60*43f728cbSDavid du Colombier 61*43f728cbSDavid du Colombier RWlock crypt; 62*43f728cbSDavid du Colombier Queue *iq; 63*43f728cbSDavid du Colombier ulong watchdog; 64*43f728cbSDavid du Colombier ulong lastauth; 65*43f728cbSDavid du Colombier Ref txseq; 66*43f728cbSDavid du Colombier void (*transmit)(Wifi*, Wnode*, Block*); 67*43f728cbSDavid du Colombier 68*43f728cbSDavid du Colombier /* for searching */ 69*43f728cbSDavid du Colombier uchar bssid[Eaddrlen]; 70*43f728cbSDavid du Colombier char essid[Essidlen+2]; 71*43f728cbSDavid du Colombier 72*43f728cbSDavid du Colombier /* supported data rates by hardware */ 73*43f728cbSDavid du Colombier uchar *rates; 74*43f728cbSDavid du Colombier 75*43f728cbSDavid du Colombier /* effective base station */ 76*43f728cbSDavid du Colombier Wnode *bss; 77*43f728cbSDavid du Colombier 78*43f728cbSDavid du Colombier Wnode node[32]; 79*43f728cbSDavid du Colombier }; 80*43f728cbSDavid du Colombier 81*43f728cbSDavid du Colombier struct Wifipkt 82*43f728cbSDavid du Colombier { 83*43f728cbSDavid du Colombier uchar fc[2]; 84*43f728cbSDavid du Colombier uchar dur[2]; 85*43f728cbSDavid du Colombier uchar a1[Eaddrlen]; 86*43f728cbSDavid du Colombier uchar a2[Eaddrlen]; 87*43f728cbSDavid du Colombier uchar a3[Eaddrlen]; 88*43f728cbSDavid du Colombier uchar seq[2]; 89*43f728cbSDavid du Colombier uchar a4[Eaddrlen]; 90*43f728cbSDavid du Colombier }; 91*43f728cbSDavid du Colombier 92*43f728cbSDavid du Colombier Wifi *wifiattach(Ether *ether, void (*transmit)(Wifi*, Wnode*, Block*)); 93*43f728cbSDavid du Colombier void wifiiq(Wifi*, Block*); 94*43f728cbSDavid du Colombier int wifihdrlen(Wifipkt*); 95*43f728cbSDavid du Colombier void wifitxfail(Wifi*, Block*); 96*43f728cbSDavid du Colombier 97*43f728cbSDavid du Colombier long wifistat(Wifi*, void*, long, ulong); 98*43f728cbSDavid du Colombier long wifictl(Wifi*, void*, long); 99*43f728cbSDavid du Colombier void wificfg(Wifi*, char*); 100