52 typedef struct Hdr Hdr;
72 unpackhdr(uchar *p, uchar *ep, Hdr *h)
81 h->type = (p[0]>>2)&3;
82 h->subtype = (p[0]>>4)&15;
91 // fc dur da sa bssid seq
92 if(p+2+2+6+6+6+2 > ep)
95 h->dur = LittleS(p+2);
96 memmove(h->da, p+4, 6);
97 memmove(h->sa, p+10, 6);
98 memmove(h->bssid, p+16, 6);
99 h->seq = LittleS(p+22);
109 h->aid = LittleS(p+2);
110 memmove(h->bssid, p+4, 6);
111 memmove(h->ta, p+10, 6);
119 h->dur = LittleS(p+2);
120 memmove(h->ra, p+4, 6);
121 memmove(h->ta, p+10, 6);
130 h->dur = LittleS(p+2);
131 memmove(h->ra, p+4, 6);
140 h->dur = LittleS(p+2);
141 memmove(h->ra, p+4, 6);
142 memmove(h->bssid, p+10, 6);
151 h->dur = LittleS(p+2); // ??? maybe
152 // Also, what is at p+22?
154 switch(h->flags&(FlagFromds|FlagTods)){
156 memmove(h->da, p+4, 6);
157 memmove(h->sa, p+10, 6);
158 memmove(h->bssid, p+16, 6);
161 memmove(h->da, p+4, 6);
162 memmove(h->bssid, p+10, 6);
163 memmove(h->sa, p+16, 6);
166 memmove(h->bssid, p+4, 6);
167 memmove(h->sa, p+10, 6);
168 memmove(h->da, p+16, 6);
170 case FlagFromds|FlagTods:
174 memmove(h->ra, p+4, 6);
175 memmove(h->ta, p+10, 6);
176 memmove(h->da, p+16, 6);
177 memmove(h->sa, p+24, 6); // 24 sic
181 h->proto = ProtoNone;
182 if(!(h->flags&FlagWep))
200 static Field p_fields[] =
202 { "s", Fether, Os, "source address" },
203 { "d", Fether, Od, "destination address" },
204 { "t", Fether, Ot, "transmit address" },
205 { "r", Fether, Or, "receive address" },
206 { "bssid", Fether, Obssid, "bssid address" },
207 { "a", Fether, Oa, "any address" },
208 { "sd", Fether, Oa, "source|destination address" },
218 compile_cmp(p80211.name, f, p_fields);
221 if(strcmp(f->s, "mgmt") == 0){
227 if(strcmp(f->s, "ctl") == 0){
233 if(strcmp(f->s, "data") == 0){
239 for(m = p_mux; m->name != nil; m++){
240 if(strcmp(f->s, m->name) == 0){
247 sysfatal("unknown 802.11 field or protocol: %s", f->s);
251 p_filter(Filter *f, Msg *m)
255 memset(&h, 0, sizeof h);
256 if(unpackhdr(m->ps, m->pe, &h) < 0)
262 return memcmp(h.sa, f->a, 6) == 0;
264 return memcmp(h.da, f->a, 6) == 0;
266 return memcmp(h.ta, f->a, 6) == 0;
268 return memcmp(h.ra, f->a, 6) == 0;
270 return memcmp(h.bssid, f->a, 6) == 0;
272 return memcmp(h.sa, f->a, 6) == 0
273 || memcmp(h.da, f->a, 6) == 0
274 || memcmp(h.ta, f->a, 6) == 0
275 || memcmp(h.ra, f->a, 6) == 0
276 || memcmp(h.bssid, f->a, 6) == 0;
278 return h.proto == f->ulv;
288 memset(&h, 0, sizeof h);
289 if(unpackhdr(m->ps, m->pe, &h) < 0)
293 m->p = seprint(m->p, m->e, "fc=%02x flags=%02x ", m->ps[0], m->ps[1]);
296 m->p = seprint(m->p, m->e, "mgmt dur=%d d=%E s=%E bssid=%E seq=%d",
297 h.dur, h.da, h.sa, h.bssid, h.seq);
302 m->p = seprint(m->p, m->e, "ctl poll aid=%d bssid=%E t=%E",
303 h.aid, h.bssid, h.ta);
306 m->p = seprint(m->p, m->e, "ctl rts dur=%d r=%E t=%E",
310 m->p = seprint(m->p, m->e, "ctl cts dur=%d r=%E",
314 m->p = seprint(m->p, m->e, "ctl ack dur=%d r=%E",
318 m->p = seprint(m->p, m->e, "ctl cf end dur=%d r=%E bssid=%E",
319 h.dur, h.ra, h.bssid);
322 m->p = seprint(m->p, m->e, "ctl cf end ack dur=%d r=%E bssid=%E",
323 h.dur, h.ra, h.bssid);
326 m->p = seprint(m->p, m->e, "ctl %.*H", m->ps, h.hdrlen);
331 switch(h.flags&(FlagFromds|FlagTods)){
333 m->p = seprint(m->p, m->e, "data d=%E s=%E bssid=%E",
334 h.da, h.sa, h.bssid);
337 m->p = seprint(m->p, m->e, "data fds d=%E bssid=%E s=%E",
338 h.da, h.bssid, h.sa);
341 m->p = seprint(m->p, m->e, "data tds bssid=%E s=%E d=%E",
342 h.bssid, h.sa, h.da);
344 case FlagFromds|FlagTods:
345 m->p = seprint(m->p, m->e, "data fds tds r=%E t=%E d=%E s=%E",
346 h.ra, h.ta, h.da, h.sa);
349 if(!(h.flags&FlagWep))