Merge branch 'vendor/BINUTILS_ALL'
[dragonfly.git] / sys / netproto / 802_11 / wlan / ieee80211_adhoc.c
1 /*-
2  * Copyright (c) 2007-2009 Sam Leffler, Errno Consulting
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  * 
25  * $FreeBSD: head/sys/net80211/ieee80211_adhoc.c 203422 2010-02-03 10:07:43Z rpaulo $
26  * $DragonFly$
27  */
28
29 /*
30  * IEEE 802.11 IBSS mode support.
31  */
32 #include "opt_inet.h"
33 #include "opt_wlan.h"
34
35 #include <sys/param.h>
36 #include <sys/systm.h> 
37 #include <sys/mbuf.h>   
38 #include <sys/malloc.h>
39 #include <sys/kernel.h>
40
41 #include <sys/socket.h>
42 #include <sys/sockio.h>
43 #include <sys/endian.h>
44 #include <sys/errno.h>
45 #include <sys/proc.h>
46 #include <sys/sysctl.h>
47
48 #include <net/if.h>
49 #include <net/if_media.h>
50 #include <net/if_llc.h>
51 #include <net/ethernet.h>
52 #include <net/route.h>
53
54 #include <net/bpf.h>
55
56 #include <netproto/802_11/ieee80211_var.h>
57 #include <netproto/802_11/ieee80211_adhoc.h>
58 #include <netproto/802_11/ieee80211_input.h>
59 #ifdef IEEE80211_SUPPORT_SUPERG
60 #include <netproto/802_11/ieee80211_superg.h>
61 #endif
62 #ifdef IEEE80211_SUPPORT_TDMA
63 #include <netproto/802_11/ieee80211_tdma.h>
64 #endif
65
66 #define IEEE80211_RATE2MBS(r)   (((r) & IEEE80211_RATE_VAL) / 2)
67
68 static  void adhoc_vattach(struct ieee80211vap *);
69 static  int adhoc_newstate(struct ieee80211vap *, enum ieee80211_state, int);
70 static int adhoc_input(struct ieee80211_node *, struct mbuf *, int, int);
71 static void adhoc_recv_mgmt(struct ieee80211_node *, struct mbuf *,
72         int subtype, int, int);
73 static void ahdemo_recv_mgmt(struct ieee80211_node *, struct mbuf *,
74         int subtype, int, int);
75 static void adhoc_recv_ctl(struct ieee80211_node *, struct mbuf *, int subtype);
76
77 void
78 ieee80211_adhoc_attach(struct ieee80211com *ic)
79 {
80         ic->ic_vattach[IEEE80211_M_IBSS] = adhoc_vattach;
81         ic->ic_vattach[IEEE80211_M_AHDEMO] = adhoc_vattach;
82 }
83
84 void
85 ieee80211_adhoc_detach(struct ieee80211com *ic)
86 {
87 }
88
89 static void
90 adhoc_vdetach(struct ieee80211vap *vap)
91 {
92 }
93
94 static void
95 adhoc_vattach(struct ieee80211vap *vap)
96 {
97         vap->iv_newstate = adhoc_newstate;
98         vap->iv_input = adhoc_input;
99         if (vap->iv_opmode == IEEE80211_M_IBSS)
100                 vap->iv_recv_mgmt = adhoc_recv_mgmt;
101         else
102                 vap->iv_recv_mgmt = ahdemo_recv_mgmt;
103         vap->iv_recv_ctl = adhoc_recv_ctl;
104         vap->iv_opdetach = adhoc_vdetach;
105 #ifdef IEEE80211_SUPPORT_TDMA
106         /*
107          * Throw control to tdma support.  Note we do this
108          * after setting up our callbacks so it can piggyback
109          * on top of us.
110          */
111         if (vap->iv_caps & IEEE80211_C_TDMA)
112                 ieee80211_tdma_vattach(vap);
113 #endif
114 }
115
116 static void
117 sta_leave(void *arg, struct ieee80211_node *ni)
118 {
119         struct ieee80211vap *vap = arg;
120
121         if (ni->ni_vap == vap && ni != vap->iv_bss)
122                 ieee80211_node_leave(ni);
123 }
124
125 /*
126  * IEEE80211_M_IBSS+IEEE80211_M_AHDEMO vap state machine handler.
127  */
128 static int
129 adhoc_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
130 {
131         struct ieee80211com *ic = vap->iv_ic;
132         struct ieee80211_node *ni;
133         enum ieee80211_state ostate;
134
135         ostate = vap->iv_state;
136         IEEE80211_DPRINTF(vap, IEEE80211_MSG_STATE, "%s: %s -> %s (%d)\n",
137             __func__, ieee80211_state_name[ostate],
138             ieee80211_state_name[nstate], arg);
139         vap->iv_state = nstate;                 /* state transition */
140         if (ostate != IEEE80211_S_SCAN)
141                 ieee80211_cancel_scan(vap);     /* background scan */
142         ni = vap->iv_bss;                       /* NB: no reference held */
143         switch (nstate) {
144         case IEEE80211_S_INIT:
145                 switch (ostate) {
146                 case IEEE80211_S_SCAN:
147                         ieee80211_cancel_scan(vap);
148                         break;
149                 default:
150                         break;
151                 }
152                 if (ostate != IEEE80211_S_INIT) {
153                         /* NB: optimize INIT -> INIT case */
154                         ieee80211_reset_bss(vap);
155                 }
156                 break;
157         case IEEE80211_S_SCAN:
158                 switch (ostate) {
159                 case IEEE80211_S_RUN:           /* beacon miss */
160                         /* purge station table; entries are stale */
161                         ieee80211_iterate_nodes(&ic->ic_sta, sta_leave, vap);
162                         /* fall thru... */
163                 case IEEE80211_S_INIT:
164                         if (vap->iv_des_chan != IEEE80211_CHAN_ANYC &&
165                             !IEEE80211_IS_CHAN_RADAR(vap->iv_des_chan)) {
166                                 /*
167                                  * Already have a channel; bypass the
168                                  * scan and startup immediately.
169                                  */
170                                 ieee80211_create_ibss(vap, vap->iv_des_chan);
171                                 break;
172                         }
173                         /*
174                          * Initiate a scan.  We can come here as a result
175                          * of an IEEE80211_IOC_SCAN_REQ too in which case
176                          * the vap will be marked with IEEE80211_FEXT_SCANREQ
177                          * and the scan request parameters will be present
178                          * in iv_scanreq.  Otherwise we do the default.
179                          */
180                         if (vap->iv_flags_ext & IEEE80211_FEXT_SCANREQ) {
181                                 ieee80211_check_scan(vap,
182                                     vap->iv_scanreq_flags,
183                                     vap->iv_scanreq_duration,
184                                     vap->iv_scanreq_mindwell,
185                                     vap->iv_scanreq_maxdwell,
186                                     vap->iv_scanreq_nssid, vap->iv_scanreq_ssid);
187                                 vap->iv_flags_ext &= ~IEEE80211_FEXT_SCANREQ;
188                         } else
189                                 ieee80211_check_scan_current(vap);
190                         break;
191                 case IEEE80211_S_SCAN:
192                         /*
193                          * This can happen because of a change in state
194                          * that requires a reset.  Trigger a new scan
195                          * unless we're in manual roaming mode in which
196                          * case an application must issue an explicit request.
197                          */
198                         if (vap->iv_roaming == IEEE80211_ROAMING_AUTO)
199                                 ieee80211_check_scan_current(vap);
200                         break;
201                 default:
202                         goto invalid;
203                 }
204                 break;
205         case IEEE80211_S_RUN:
206                 if (vap->iv_flags & IEEE80211_F_WPA) {
207                         /* XXX validate prerequisites */
208                 }
209                 switch (ostate) {
210                 case IEEE80211_S_SCAN:
211 #ifdef IEEE80211_DEBUG
212                         if (ieee80211_msg_debug(vap)) {
213                                 ieee80211_note(vap,
214                                     "synchronized with %6D ssid ",
215                                     ni->ni_bssid, ":");
216                                 ieee80211_print_essid(vap->iv_bss->ni_essid,
217                                     ni->ni_esslen);
218                                 /* XXX MCS/HT */
219                                 kprintf(" channel %d start %uMb\n",
220                                     ieee80211_chan2ieee(ic, ic->ic_curchan),
221                                     IEEE80211_RATE2MBS(ni->ni_txrate));
222                         }
223 #endif
224                         break;
225                 default:
226                         goto invalid;
227                 }
228                 /*
229                  * When 802.1x is not in use mark the port authorized
230                  * at this point so traffic can flow.
231                  */
232                 if (ni->ni_authmode != IEEE80211_AUTH_8021X)
233                         ieee80211_node_authorize(ni);
234                 /*
235                  * Fake association when joining an existing bss.
236                  */
237                 if (!IEEE80211_ADDR_EQ(ni->ni_macaddr, vap->iv_myaddr) &&
238                     ic->ic_newassoc != NULL)
239                         ic->ic_newassoc(ni, ostate != IEEE80211_S_RUN);
240                 break;
241         case IEEE80211_S_SLEEP:
242                 ieee80211_sta_pwrsave(vap, 0);
243                 break;
244         default:
245         invalid:
246                 IEEE80211_DPRINTF(vap, IEEE80211_MSG_STATE,
247                     "%s: unexpected state transition %s -> %s\n", __func__,
248                     ieee80211_state_name[ostate], ieee80211_state_name[nstate]);
249                 break;
250         }
251         return 0;
252 }
253
254 /*
255  * Decide if a received management frame should be
256  * printed when debugging is enabled.  This filters some
257  * of the less interesting frames that come frequently
258  * (e.g. beacons).
259  */
260 static __inline int
261 doprint(struct ieee80211vap *vap, int subtype)
262 {
263         switch (subtype) {
264         case IEEE80211_FC0_SUBTYPE_BEACON:
265                 return (vap->iv_ic->ic_flags & IEEE80211_F_SCAN);
266         case IEEE80211_FC0_SUBTYPE_PROBE_REQ:
267                 return 1;
268         }
269         return 1;
270 }
271
272 /*
273  * Process a received frame.  The node associated with the sender
274  * should be supplied.  If nothing was found in the node table then
275  * the caller is assumed to supply a reference to iv_bss instead.
276  * The RSSI and a timestamp are also supplied.  The RSSI data is used
277  * during AP scanning to select a AP to associate with; it can have
278  * any units so long as values have consistent units and higher values
279  * mean ``better signal''.  The receive timestamp is currently not used
280  * by the 802.11 layer.
281  */
282 static int
283 adhoc_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf)
284 {
285 #define SEQ_LEQ(a,b)    ((int)((a)-(b)) <= 0)
286 #define HAS_SEQ(type)   ((type & 0x4) == 0)
287         struct ieee80211vap *vap = ni->ni_vap;
288         struct ieee80211com *ic = ni->ni_ic;
289         struct ifnet *ifp = vap->iv_ifp;
290         struct ieee80211_frame *wh;
291         struct ieee80211_key *key;
292         struct ether_header *eh;
293         int hdrspace, need_tap = 1;     /* mbuf need to be tapped. */   
294         uint8_t dir, type, subtype, qos;
295         uint8_t *bssid;
296         uint16_t rxseq;
297
298         if (m->m_flags & M_AMPDU_MPDU) {
299                 /*
300                  * Fastpath for A-MPDU reorder q resubmission.  Frames
301                  * w/ M_AMPDU_MPDU marked have already passed through
302                  * here but were received out of order and been held on
303                  * the reorder queue.  When resubmitted they are marked
304                  * with the M_AMPDU_MPDU flag and we can bypass most of
305                  * the normal processing.
306                  */
307                 wh = mtod(m, struct ieee80211_frame *);
308                 type = IEEE80211_FC0_TYPE_DATA;
309                 dir = wh->i_fc[1] & IEEE80211_FC1_DIR_MASK;
310                 subtype = IEEE80211_FC0_SUBTYPE_QOS;
311                 hdrspace = ieee80211_hdrspace(ic, wh);  /* XXX optimize? */
312                 goto resubmit_ampdu;
313         }
314
315         KASSERT(ni != NULL, ("null node"));
316         ni->ni_inact = ni->ni_inact_reload;
317
318         type = -1;                      /* undefined */
319
320         if (m->m_pkthdr.len < sizeof(struct ieee80211_frame_min)) {
321                 IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY,
322                     ni->ni_macaddr, NULL,
323                     "too short (1): len %u", m->m_pkthdr.len);
324                 vap->iv_stats.is_rx_tooshort++;
325                 goto out;
326         }
327         /*
328          * Bit of a cheat here, we use a pointer for a 3-address
329          * frame format but don't reference fields past outside
330          * ieee80211_frame_min w/o first validating the data is
331          * present.
332          */
333         wh = mtod(m, struct ieee80211_frame *);
334
335         if ((wh->i_fc[0] & IEEE80211_FC0_VERSION_MASK) !=
336             IEEE80211_FC0_VERSION_0) {
337                 IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY,
338                     ni->ni_macaddr, NULL, "wrong version, fc %02x:%02x",
339                     wh->i_fc[0], wh->i_fc[1]);
340                 vap->iv_stats.is_rx_badversion++;
341                 goto err;
342         }
343
344         dir = wh->i_fc[1] & IEEE80211_FC1_DIR_MASK;
345         type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
346         subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
347         if ((ic->ic_flags & IEEE80211_F_SCAN) == 0) {
348                 if (dir != IEEE80211_FC1_DIR_NODS)
349                         bssid = wh->i_addr1;
350                 else if (type == IEEE80211_FC0_TYPE_CTL)
351                         bssid = wh->i_addr1;
352                 else {
353                         if (m->m_pkthdr.len < sizeof(struct ieee80211_frame)) {
354                                 IEEE80211_DISCARD_MAC(vap,
355                                     IEEE80211_MSG_ANY, ni->ni_macaddr,
356                                     NULL, "too short (2): len %u",
357                                     m->m_pkthdr.len);
358                                 vap->iv_stats.is_rx_tooshort++;
359                                 goto out;
360                         }
361                         bssid = wh->i_addr3;
362                 }
363                 /*
364                  * Validate the bssid.
365                  */
366                 if (!IEEE80211_ADDR_EQ(bssid, vap->iv_bss->ni_bssid) &&
367                     !IEEE80211_ADDR_EQ(bssid, ifp->if_broadcastaddr)) {
368                         /* not interested in */
369                         IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT,
370                             bssid, NULL, "%s", "not to bss");
371                         vap->iv_stats.is_rx_wrongbss++;
372                         goto out;
373                 }
374                 /*
375                  * Data frame, cons up a node when it doesn't
376                  * exist. This should probably done after an ACL check.
377                  */
378                 if (type == IEEE80211_FC0_TYPE_DATA &&
379                     ni == vap->iv_bss &&
380                     !IEEE80211_ADDR_EQ(wh->i_addr2, ni->ni_macaddr)) {
381                         /*
382                          * Beware of frames that come in too early; we
383                          * can receive broadcast frames and creating sta
384                          * entries will blow up because there is no bss
385                          * channel yet.
386                          */
387                         if (vap->iv_state != IEEE80211_S_RUN) {
388                                 IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT,
389                                     wh, "data", "not in RUN state (%s)",
390                                     ieee80211_state_name[vap->iv_state]);
391                                 vap->iv_stats.is_rx_badstate++;
392                                 goto err;
393                         }
394                         /*
395                          * Fake up a node for this newly
396                          * discovered member of the IBSS.
397                          */
398                         ni = ieee80211_fakeup_adhoc_node(vap, wh->i_addr2);
399                         if (ni == NULL) {
400                                 /* NB: stat kept for alloc failure */
401                                 goto err;
402                         }
403                 }
404                 IEEE80211_RSSI_LPF(ni->ni_avgrssi, rssi);
405                 ni->ni_noise = nf;
406                 if (HAS_SEQ(type)) {
407                         uint8_t tid = ieee80211_gettid(wh);
408                         if (IEEE80211_QOS_HAS_SEQ(wh) &&
409                             TID_TO_WME_AC(tid) >= WME_AC_VI)
410                                 ic->ic_wme.wme_hipri_traffic++;
411                         rxseq = le16toh(*(uint16_t *)wh->i_seq);
412                         if ((ni->ni_flags & IEEE80211_NODE_HT) == 0 &&
413                             (wh->i_fc[1] & IEEE80211_FC1_RETRY) &&
414                             SEQ_LEQ(rxseq, ni->ni_rxseqs[tid])) {
415                                 /* duplicate, discard */
416                                 IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT,
417                                     bssid, "duplicate",
418                                     "seqno <%u,%u> fragno <%u,%u> tid %u",
419                                     rxseq >> IEEE80211_SEQ_SEQ_SHIFT,
420                                     ni->ni_rxseqs[tid] >>
421                                         IEEE80211_SEQ_SEQ_SHIFT,
422                                     rxseq & IEEE80211_SEQ_FRAG_MASK,
423                                     ni->ni_rxseqs[tid] &
424                                         IEEE80211_SEQ_FRAG_MASK,
425                                     tid);
426                                 vap->iv_stats.is_rx_dup++;
427                                 IEEE80211_NODE_STAT(ni, rx_dup);
428                                 goto out;
429                         }
430                         ni->ni_rxseqs[tid] = rxseq;
431                 }
432         }
433
434         switch (type) {
435         case IEEE80211_FC0_TYPE_DATA:
436                 hdrspace = ieee80211_hdrspace(ic, wh);
437                 if (m->m_len < hdrspace &&
438                     (m = m_pullup(m, hdrspace)) == NULL) {
439                         IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY,
440                             ni->ni_macaddr, NULL,
441                             "data too short: expecting %u", hdrspace);
442                         vap->iv_stats.is_rx_tooshort++;
443                         goto out;               /* XXX */
444                 }
445                 if (dir != IEEE80211_FC1_DIR_NODS) {
446                         IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT,
447                             wh, "data", "incorrect dir 0x%x", dir);
448                         vap->iv_stats.is_rx_wrongdir++;
449                         goto out;
450                 }
451                 /* XXX no power-save support */
452
453                 /*
454                  * Handle A-MPDU re-ordering.  If the frame is to be
455                  * processed directly then ieee80211_ampdu_reorder
456                  * will return 0; otherwise it has consumed the mbuf
457                  * and we should do nothing more with it.
458                  */
459                 if ((m->m_flags & M_AMPDU) &&
460                     ieee80211_ampdu_reorder(ni, m) != 0) {
461                         m = NULL;
462                         goto out;
463                 }
464         resubmit_ampdu:
465
466                 /*
467                  * Handle privacy requirements.  Note that we
468                  * must not be preempted from here until after
469                  * we (potentially) call ieee80211_crypto_demic;
470                  * otherwise we may violate assumptions in the
471                  * crypto cipher modules used to do delayed update
472                  * of replay sequence numbers.
473                  */
474                 if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
475                         if ((vap->iv_flags & IEEE80211_F_PRIVACY) == 0) {
476                                 /*
477                                  * Discard encrypted frames when privacy is off.
478                                  */
479                                 IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT,
480                                     wh, "WEP", "%s", "PRIVACY off");
481                                 vap->iv_stats.is_rx_noprivacy++;
482                                 IEEE80211_NODE_STAT(ni, rx_noprivacy);
483                                 goto out;
484                         }
485                         key = ieee80211_crypto_decap(ni, m, hdrspace);
486                         if (key == NULL) {
487                                 /* NB: stats+msgs handled in crypto_decap */
488                                 IEEE80211_NODE_STAT(ni, rx_wepfail);
489                                 goto out;
490                         }
491                         wh = mtod(m, struct ieee80211_frame *);
492                         wh->i_fc[1] &= ~IEEE80211_FC1_WEP;
493                 } else {
494                         /* XXX M_WEP and IEEE80211_F_PRIVACY */
495                         key = NULL;
496                 }
497
498                 /*
499                  * Save QoS bits for use below--before we strip the header.
500                  */
501                 if (subtype == IEEE80211_FC0_SUBTYPE_QOS) {
502                         qos = (dir == IEEE80211_FC1_DIR_DSTODS) ?
503                             ((struct ieee80211_qosframe_addr4 *)wh)->i_qos[0] :
504                             ((struct ieee80211_qosframe *)wh)->i_qos[0];
505                 } else
506                         qos = 0;
507
508                 /*
509                  * Next up, any fragmentation.
510                  */
511                 if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
512                         m = ieee80211_defrag(ni, m, hdrspace);
513                         if (m == NULL) {
514                                 /* Fragment dropped or frame not complete yet */
515                                 goto out;
516                         }
517                 }
518                 wh = NULL;              /* no longer valid, catch any uses */
519
520                 /*
521                  * Next strip any MSDU crypto bits.
522                  */
523                 if (key != NULL && !ieee80211_crypto_demic(vap, key, m, 0)) {
524                         IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT,
525                             ni->ni_macaddr, "data", "%s", "demic error");
526                         vap->iv_stats.is_rx_demicfail++;
527                         IEEE80211_NODE_STAT(ni, rx_demicfail);
528                         goto out;
529                 }
530
531                 /* copy to listener after decrypt */
532                 if (ieee80211_radiotap_active_vap(vap))
533                         ieee80211_radiotap_rx(vap, m);
534                 need_tap = 0;
535
536                 /*
537                  * Finally, strip the 802.11 header.
538                  */
539                 m = ieee80211_decap(vap, m, hdrspace);
540                 if (m == NULL) {
541                         /* XXX mask bit to check for both */
542                         /* don't count Null data frames as errors */
543                         if (subtype == IEEE80211_FC0_SUBTYPE_NODATA ||
544                             subtype == IEEE80211_FC0_SUBTYPE_QOS_NULL)
545                                 goto out;
546                         IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT,
547                             ni->ni_macaddr, "data", "%s", "decap error");
548                         vap->iv_stats.is_rx_decap++;
549                         IEEE80211_NODE_STAT(ni, rx_decap);
550                         goto err;
551                 }
552                 eh = mtod(m, struct ether_header *);
553                 if (!ieee80211_node_is_authorized(ni)) {
554                         /*
555                          * Deny any non-PAE frames received prior to
556                          * authorization.  For open/shared-key
557                          * authentication the port is mark authorized
558                          * after authentication completes.  For 802.1x
559                          * the port is not marked authorized by the
560                          * authenticator until the handshake has completed.
561                          */
562                         if (eh->ether_type != htons(ETHERTYPE_PAE)) {
563                                 IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT,
564                                     eh->ether_shost, "data",
565                                     "unauthorized port: ether type 0x%x len %u",
566                                     eh->ether_type, m->m_pkthdr.len);
567                                 vap->iv_stats.is_rx_unauth++;
568                                 IEEE80211_NODE_STAT(ni, rx_unauth);
569                                 goto err;
570                         }
571                 } else {
572                         /*
573                          * When denying unencrypted frames, discard
574                          * any non-PAE frames received without encryption.
575                          */
576                         if ((vap->iv_flags & IEEE80211_F_DROPUNENC) &&
577                             (key == NULL && (m->m_flags & M_WEP) == 0) &&
578                             eh->ether_type != htons(ETHERTYPE_PAE)) {
579                                 /*
580                                  * Drop unencrypted frames.
581                                  */
582                                 vap->iv_stats.is_rx_unencrypted++;
583                                 IEEE80211_NODE_STAT(ni, rx_unencrypted);
584                                 goto out;
585                         }
586                 }
587                 /* XXX require HT? */
588                 if (qos & IEEE80211_QOS_AMSDU) {
589                         m = ieee80211_decap_amsdu(ni, m);
590                         if (m == NULL)
591                                 return IEEE80211_FC0_TYPE_DATA;
592                 } else {
593 #ifdef IEEE80211_SUPPORT_SUPERG
594                         m = ieee80211_decap_fastframe(vap, ni, m);
595                         if (m == NULL)
596                                 return IEEE80211_FC0_TYPE_DATA;
597 #endif
598                 }
599                 if (dir == IEEE80211_FC1_DIR_DSTODS && ni->ni_wdsvap != NULL)
600                         ieee80211_deliver_data(ni->ni_wdsvap, ni, m);
601                 else
602                         ieee80211_deliver_data(vap, ni, m);
603                 return IEEE80211_FC0_TYPE_DATA;
604
605         case IEEE80211_FC0_TYPE_MGT:
606                 vap->iv_stats.is_rx_mgmt++;
607                 IEEE80211_NODE_STAT(ni, rx_mgmt);
608                 if (dir != IEEE80211_FC1_DIR_NODS) {
609                         IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT,
610                             wh, "data", "incorrect dir 0x%x", dir);
611                         vap->iv_stats.is_rx_wrongdir++;
612                         goto err;
613                 }
614                 if (m->m_pkthdr.len < sizeof(struct ieee80211_frame)) {
615                         IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY,
616                             ni->ni_macaddr, "mgt", "too short: len %u",
617                             m->m_pkthdr.len);
618                         vap->iv_stats.is_rx_tooshort++;
619                         goto out;
620                 }
621 #ifdef IEEE80211_DEBUG
622                 if ((ieee80211_msg_debug(vap) && doprint(vap, subtype)) ||
623                     ieee80211_msg_dumppkts(vap)) {
624                         if_printf(ifp, "received %s from %6D rssi %d\n",
625                             ieee80211_mgt_subtype_name[subtype >>
626                                 IEEE80211_FC0_SUBTYPE_SHIFT],
627                             wh->i_addr2, ":", rssi);
628                 }
629 #endif
630                 if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
631                         IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT,
632                             wh, NULL, "%s", "WEP set but not permitted");
633                         vap->iv_stats.is_rx_mgtdiscard++; /* XXX */
634                         goto out;
635                 }
636                 vap->iv_recv_mgmt(ni, m, subtype, rssi, nf);
637                 goto out;
638
639         case IEEE80211_FC0_TYPE_CTL:
640                 vap->iv_stats.is_rx_ctl++;
641                 IEEE80211_NODE_STAT(ni, rx_ctrl);
642                 vap->iv_recv_ctl(ni, m, subtype);
643                 goto out;
644
645         default:
646                 IEEE80211_DISCARD(vap, IEEE80211_MSG_ANY,
647                     wh, "bad", "frame type 0x%x", type);
648                 /* should not come here */
649                 break;
650         }
651 err:
652         ifp->if_ierrors++;
653 out:
654         if (m != NULL) {
655                 if (need_tap && ieee80211_radiotap_active_vap(vap))
656                         ieee80211_radiotap_rx(vap, m);
657                 m_freem(m);
658         }
659         return type;
660 #undef SEQ_LEQ
661 }
662
663 static int
664 is11bclient(const uint8_t *rates, const uint8_t *xrates)
665 {
666         static const uint32_t brates = (1<<2*1)|(1<<2*2)|(1<<11)|(1<<2*11);
667         int i;
668
669         /* NB: the 11b clients we care about will not have xrates */
670         if (xrates != NULL || rates == NULL)
671                 return 0;
672         for (i = 0; i < rates[1]; i++) {
673                 int r = rates[2+i] & IEEE80211_RATE_VAL;
674                 if (r > 2*11 || ((1<<r) & brates) == 0)
675                         return 0;
676         }
677         return 1;
678 }
679
680 static void
681 adhoc_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m0,
682         int subtype, int rssi, int nf)
683 {
684         struct ieee80211vap *vap = ni->ni_vap;
685         struct ieee80211com *ic = ni->ni_ic;
686         struct ieee80211_frame *wh;
687         uint8_t *frm, *efrm, *sfrm;
688         uint8_t *ssid, *rates, *xrates;
689
690         wh = mtod(m0, struct ieee80211_frame *);
691         frm = (uint8_t *)&wh[1];
692         efrm = mtod(m0, uint8_t *) + m0->m_len;
693         switch (subtype) {
694         case IEEE80211_FC0_SUBTYPE_PROBE_RESP:
695         case IEEE80211_FC0_SUBTYPE_BEACON: {
696                 struct ieee80211_scanparams scan;
697                 /*
698                  * We process beacon/probe response
699                  * frames to discover neighbors.
700                  */ 
701                 if (ieee80211_parse_beacon(ni, m0, &scan) != 0)
702                         return;
703                 /*
704                  * Count frame now that we know it's to be processed.
705                  */
706                 if (subtype == IEEE80211_FC0_SUBTYPE_BEACON) {
707                         vap->iv_stats.is_rx_beacon++;           /* XXX remove */
708                         IEEE80211_NODE_STAT(ni, rx_beacons);
709                 } else
710                         IEEE80211_NODE_STAT(ni, rx_proberesp);
711                 /*
712                  * If scanning, just pass information to the scan module.
713                  */
714                 if (ic->ic_flags & IEEE80211_F_SCAN) {
715                         if (ic->ic_flags_ext & IEEE80211_FEXT_PROBECHAN) {
716                                 /*
717                                  * Actively scanning a channel marked passive;
718                                  * send a probe request now that we know there
719                                  * is 802.11 traffic present.
720                                  *
721                                  * XXX check if the beacon we recv'd gives
722                                  * us what we need and suppress the probe req
723                                  */
724                                 ieee80211_probe_curchan(vap, 1);
725                                 ic->ic_flags_ext &= ~IEEE80211_FEXT_PROBECHAN;
726                         }
727                         ieee80211_add_scan(vap, &scan, wh, subtype, rssi, nf);
728                         return;
729                 }
730                 if (scan.capinfo & IEEE80211_CAPINFO_IBSS) {
731                         if (!IEEE80211_ADDR_EQ(wh->i_addr2, ni->ni_macaddr)) {
732                                 /*
733                                  * Create a new entry in the neighbor table.
734                                  */
735                                 ni = ieee80211_add_neighbor(vap, wh, &scan);
736                         } else if (ni->ni_capinfo == 0) {
737                                 /*
738                                  * Update faked node created on transmit.
739                                  * Note this also updates the tsf.
740                                  */
741                                 ieee80211_init_neighbor(ni, wh, &scan);
742                         } else {
743                                 /*
744                                  * Record tsf for potential resync.
745                                  */
746                                 memcpy(ni->ni_tstamp.data, scan.tstamp,
747                                         sizeof(ni->ni_tstamp));
748                         }
749                         if (ni != NULL) {
750                                 IEEE80211_RSSI_LPF(ni->ni_avgrssi, rssi);
751                                 ni->ni_noise = nf;
752                         }
753                 }
754                 break;
755         }
756
757         case IEEE80211_FC0_SUBTYPE_PROBE_REQ:
758                 if (vap->iv_state != IEEE80211_S_RUN) {
759                         IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT,
760                             wh, NULL, "wrong state %s",
761                             ieee80211_state_name[vap->iv_state]);
762                         vap->iv_stats.is_rx_mgtdiscard++;
763                         return;
764                 }
765                 if (IEEE80211_IS_MULTICAST(wh->i_addr2)) {
766                         /* frame must be directed */
767                         IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT,
768                             wh, NULL, "%s", "not unicast");
769                         vap->iv_stats.is_rx_mgtdiscard++;       /* XXX stat */
770                         return;
771                 }
772
773                 /*
774                  * prreq frame format
775                  *      [tlv] ssid
776                  *      [tlv] supported rates
777                  *      [tlv] extended supported rates
778                  */
779                 ssid = rates = xrates = NULL;
780                 sfrm = frm;
781                 while (efrm - frm > 1) {
782                         IEEE80211_VERIFY_LENGTH(efrm - frm, frm[1] + 2, return);
783                         switch (*frm) {
784                         case IEEE80211_ELEMID_SSID:
785                                 ssid = frm;
786                                 break;
787                         case IEEE80211_ELEMID_RATES:
788                                 rates = frm;
789                                 break;
790                         case IEEE80211_ELEMID_XRATES:
791                                 xrates = frm;
792                                 break;
793                         }
794                         frm += frm[1] + 2;
795                 }
796                 IEEE80211_VERIFY_ELEMENT(rates, IEEE80211_RATE_MAXSIZE, return);
797                 if (xrates != NULL)
798                         IEEE80211_VERIFY_ELEMENT(xrates,
799                                 IEEE80211_RATE_MAXSIZE - rates[1], return);
800                 IEEE80211_VERIFY_ELEMENT(ssid, IEEE80211_NWID_LEN, return);
801                 IEEE80211_VERIFY_SSID(vap->iv_bss, ssid, return);
802                 if ((vap->iv_flags & IEEE80211_F_HIDESSID) && ssid[1] == 0) {
803                         IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT,
804                             wh, NULL,
805                             "%s", "no ssid with ssid suppression enabled");
806                         vap->iv_stats.is_rx_ssidmismatch++; /*XXX*/
807                         return;
808                 }
809
810                 /* XXX find a better class or define it's own */
811                 IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_INPUT, wh->i_addr2,
812                     "%s", "recv probe req");
813                 /*
814                  * Some legacy 11b clients cannot hack a complete
815                  * probe response frame.  When the request includes
816                  * only a bare-bones rate set, communicate this to
817                  * the transmit side.
818                  */
819                 ieee80211_send_proberesp(vap, wh->i_addr2,
820                     is11bclient(rates, xrates) ? IEEE80211_SEND_LEGACY_11B : 0);
821                 break;
822
823         case IEEE80211_FC0_SUBTYPE_ACTION: {
824                 const struct ieee80211_action *ia;
825
826                 if (vap->iv_state != IEEE80211_S_RUN) {
827                         IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT,
828                             wh, NULL, "wrong state %s",
829                             ieee80211_state_name[vap->iv_state]);
830                         vap->iv_stats.is_rx_mgtdiscard++;
831                         return;
832                 }
833                 /*
834                  * action frame format:
835                  *      [1] category
836                  *      [1] action
837                  *      [tlv] parameters
838                  */
839                 IEEE80211_VERIFY_LENGTH(efrm - frm,
840                         sizeof(struct ieee80211_action), return);
841                 ia = (const struct ieee80211_action *) frm;
842
843                 vap->iv_stats.is_rx_action++;
844                 IEEE80211_NODE_STAT(ni, rx_action);
845
846                 /* verify frame payloads but defer processing */
847                 /* XXX maybe push this to method */
848                 switch (ia->ia_category) {
849                 case IEEE80211_ACTION_CAT_BA:
850                         switch (ia->ia_action) {
851                         case IEEE80211_ACTION_BA_ADDBA_REQUEST:
852                                 IEEE80211_VERIFY_LENGTH(efrm - frm,
853                                     sizeof(struct ieee80211_action_ba_addbarequest),
854                                     return);
855                                 break;
856                         case IEEE80211_ACTION_BA_ADDBA_RESPONSE:
857                                 IEEE80211_VERIFY_LENGTH(efrm - frm,
858                                     sizeof(struct ieee80211_action_ba_addbaresponse),
859                                     return);
860                                 break;
861                         case IEEE80211_ACTION_BA_DELBA:
862                                 IEEE80211_VERIFY_LENGTH(efrm - frm,
863                                     sizeof(struct ieee80211_action_ba_delba),
864                                     return);
865                                 break;
866                         }
867                         break;
868                 case IEEE80211_ACTION_CAT_HT:
869                         switch (ia->ia_action) {
870                         case IEEE80211_ACTION_HT_TXCHWIDTH:
871                                 IEEE80211_VERIFY_LENGTH(efrm - frm,
872                                     sizeof(struct ieee80211_action_ht_txchwidth),
873                                     return);
874                                 break;
875                         }
876                         break;
877                 }
878                 ic->ic_recv_action(ni, wh, frm, efrm);
879                 break;
880         }
881
882         case IEEE80211_FC0_SUBTYPE_AUTH:
883         case IEEE80211_FC0_SUBTYPE_ASSOC_REQ:
884         case IEEE80211_FC0_SUBTYPE_REASSOC_REQ:
885         case IEEE80211_FC0_SUBTYPE_ASSOC_RESP:
886         case IEEE80211_FC0_SUBTYPE_REASSOC_RESP:
887         case IEEE80211_FC0_SUBTYPE_DEAUTH:
888         case IEEE80211_FC0_SUBTYPE_DISASSOC:
889                 IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT,
890                      wh, NULL, "%s", "not handled");
891                 vap->iv_stats.is_rx_mgtdiscard++;
892                 return;
893
894         default:
895                 IEEE80211_DISCARD(vap, IEEE80211_MSG_ANY,
896                      wh, "mgt", "subtype 0x%x not handled", subtype);
897                 vap->iv_stats.is_rx_badsubtype++;
898                 break;
899         }
900 }
901 #undef IEEE80211_VERIFY_LENGTH
902 #undef IEEE80211_VERIFY_ELEMENT
903
904 static void
905 ahdemo_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m0,
906         int subtype, int rssi, int nf)
907 {
908         struct ieee80211vap *vap = ni->ni_vap;
909         struct ieee80211com *ic = ni->ni_ic;
910
911         /*
912          * Process management frames when scanning; useful for doing
913          * a site-survey.
914          */
915         if (ic->ic_flags & IEEE80211_F_SCAN)
916                 adhoc_recv_mgmt(ni, m0, subtype, rssi, nf);
917         else
918                 vap->iv_stats.is_rx_mgtdiscard++;
919 }
920
921 static void
922 adhoc_recv_ctl(struct ieee80211_node *ni, struct mbuf *m0, int subtype)
923 {
924 }