128 lines
1.8 KiB
C
128 lines
1.8 KiB
C
typedef struct Wkey Wkey;
|
|
typedef struct Wnode Wnode;
|
|
typedef struct Wifi Wifi;
|
|
typedef struct Wifipkt Wifipkt;
|
|
typedef struct DMAT DMAT;
|
|
typedef struct DMTE DMTE;
|
|
|
|
enum {
|
|
Essidlen = 32,
|
|
};
|
|
|
|
/* cipher */
|
|
enum {
|
|
TKIP = 1,
|
|
CCMP = 2,
|
|
};
|
|
|
|
struct Wkey
|
|
{
|
|
int cipher;
|
|
int len;
|
|
uvlong tsc;
|
|
uchar key[];
|
|
};
|
|
|
|
struct Wnode
|
|
{
|
|
uchar bssid[Eaddrlen];
|
|
char ssid[Essidlen+2];
|
|
|
|
char *status;
|
|
|
|
int rsnelen;
|
|
uchar rsne[258];
|
|
Wkey *txkey[1];
|
|
Wkey *rxkey[5];
|
|
|
|
int aid; /* association id */
|
|
ulong lastsend;
|
|
ulong lastseen;
|
|
|
|
uchar *minrate; /* pointers into wifi->rates */
|
|
uchar *maxrate;
|
|
uchar *actrate;
|
|
|
|
ulong validrates; /* bitmap on wifi->rates */
|
|
ulong basicrates;
|
|
|
|
ulong txcount; /* statistics for rate adaption */
|
|
ulong txerror;
|
|
|
|
/* stuff from beacon */
|
|
uvlong rs;
|
|
uvlong ts;
|
|
uchar dtimcount;
|
|
uchar dtimperiod;
|
|
int ival;
|
|
int cap;
|
|
int channel;
|
|
int brsnelen;
|
|
uchar brsne[258];
|
|
};
|
|
|
|
struct DMTE
|
|
{
|
|
uchar ip[16];
|
|
uchar mac[6];
|
|
uchar valid;
|
|
};
|
|
|
|
struct DMAT
|
|
{
|
|
DMTE tab[127]; /* prime */
|
|
uvlong map;
|
|
};
|
|
|
|
struct Wifi
|
|
{
|
|
Ether *ether;
|
|
|
|
int debug;
|
|
|
|
RWlock crypt;
|
|
Queue *iq;
|
|
ulong watchdog;
|
|
ulong lastauth;
|
|
Ref txseq;
|
|
void (*transmit)(Wifi*, Wnode*, Block*);
|
|
|
|
/* for searching */
|
|
uchar bssid[Eaddrlen];
|
|
char essid[Essidlen+2];
|
|
|
|
/* supported data rates by hardware */
|
|
uchar *rates;
|
|
|
|
/* effective base station */
|
|
Wnode *bss;
|
|
|
|
Wnode node[32];
|
|
|
|
DMAT dmat;
|
|
};
|
|
|
|
struct Wifipkt
|
|
{
|
|
uchar fc[2];
|
|
uchar dur[2];
|
|
uchar a1[Eaddrlen];
|
|
uchar a2[Eaddrlen];
|
|
uchar a3[Eaddrlen];
|
|
uchar seq[2];
|
|
uchar a4[Eaddrlen];
|
|
};
|
|
|
|
enum {
|
|
Btimestamp = 1<<15,
|
|
};
|
|
|
|
Wifi *wifiattach(Ether *ether, void (*transmit)(Wifi*, Wnode*, Block*));
|
|
void wifiiq(Wifi*, Block*);
|
|
int wifihdrlen(Wifipkt*);
|
|
void wifitxfail(Wifi*, Block*);
|
|
|
|
long wifistat(Wifi*, void*, long, ulong);
|
|
long wifictl(Wifi*, void*, long);
|
|
void wificfg(Wifi*, char*);
|