]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/net80211/ieee80211.c
Overhaul monitor mode handling:
[FreeBSD/FreeBSD.git] / sys / net80211 / ieee80211.c
1 /*-
2  * Copyright (c) 2001 Atsushi Onoe
3  * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include <sys/cdefs.h>
28 __FBSDID("$FreeBSD$");
29
30 /*
31  * IEEE 802.11 generic handler
32  */
33 #include "opt_wlan.h"
34
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 #include <sys/kernel.h>
38
39 #include <sys/socket.h>
40
41 #include <net/if.h>
42 #include <net/if_dl.h>
43 #include <net/if_media.h>
44 #include <net/if_types.h>
45 #include <net/ethernet.h>
46
47 #include <net80211/ieee80211_var.h>
48 #include <net80211/ieee80211_regdomain.h>
49 #ifdef IEEE80211_SUPPORT_SUPERG
50 #include <net80211/ieee80211_superg.h>
51 #endif
52
53 #include <net/bpf.h>
54
55 const char *ieee80211_phymode_name[IEEE80211_MODE_MAX] = {
56         [IEEE80211_MODE_AUTO]     = "auto",
57         [IEEE80211_MODE_11A]      = "11a",
58         [IEEE80211_MODE_11B]      = "11b",
59         [IEEE80211_MODE_11G]      = "11g",
60         [IEEE80211_MODE_FH]       = "FH",
61         [IEEE80211_MODE_TURBO_A]  = "turboA",
62         [IEEE80211_MODE_TURBO_G]  = "turboG",
63         [IEEE80211_MODE_STURBO_A] = "sturboA",
64         [IEEE80211_MODE_HALF]     = "half",
65         [IEEE80211_MODE_QUARTER]  = "quarter",
66         [IEEE80211_MODE_11NA]     = "11na",
67         [IEEE80211_MODE_11NG]     = "11ng",
68 };
69 /* map ieee80211_opmode to the corresponding capability bit */
70 const int ieee80211_opcap[IEEE80211_OPMODE_MAX] = {
71         [IEEE80211_M_IBSS]      = IEEE80211_C_IBSS,
72         [IEEE80211_M_WDS]       = IEEE80211_C_WDS,
73         [IEEE80211_M_STA]       = IEEE80211_C_STA,
74         [IEEE80211_M_AHDEMO]    = IEEE80211_C_AHDEMO,
75         [IEEE80211_M_HOSTAP]    = IEEE80211_C_HOSTAP,
76         [IEEE80211_M_MONITOR]   = IEEE80211_C_MONITOR,
77 };
78
79 static const uint8_t ieee80211broadcastaddr[IEEE80211_ADDR_LEN] =
80         { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
81
82 static  void ieee80211_syncflag_locked(struct ieee80211com *ic, int flag);
83 static  void ieee80211_syncflag_ext_locked(struct ieee80211com *ic, int flag);
84 static  int ieee80211_media_setup(struct ieee80211com *ic,
85                 struct ifmedia *media, int caps, int addsta,
86                 ifm_change_cb_t media_change, ifm_stat_cb_t media_stat);
87 static  void ieee80211com_media_status(struct ifnet *, struct ifmediareq *);
88 static  int ieee80211com_media_change(struct ifnet *);
89 static  int media_status(enum ieee80211_opmode,
90                 const struct ieee80211_channel *);
91
92 MALLOC_DEFINE(M_80211_VAP, "80211vap", "802.11 vap state");
93
94 /*
95  * Default supported rates for 802.11 operation (in IEEE .5Mb units).
96  */
97 #define B(r)    ((r) | IEEE80211_RATE_BASIC)
98 static const struct ieee80211_rateset ieee80211_rateset_11a =
99         { 8, { B(12), 18, B(24), 36, B(48), 72, 96, 108 } };
100 static const struct ieee80211_rateset ieee80211_rateset_half =
101         { 8, { B(6), 9, B(12), 18, B(24), 36, 48, 54 } };
102 static const struct ieee80211_rateset ieee80211_rateset_quarter =
103         { 8, { B(3), 4, B(6), 9, B(12), 18, 24, 27 } };
104 static const struct ieee80211_rateset ieee80211_rateset_11b =
105         { 4, { B(2), B(4), B(11), B(22) } };
106 /* NB: OFDM rates are handled specially based on mode */
107 static const struct ieee80211_rateset ieee80211_rateset_11g =
108         { 12, { B(2), B(4), B(11), B(22), 12, 18, 24, 36, 48, 72, 96, 108 } };
109 #undef B
110
111 /*
112  * Fill in 802.11 available channel set, mark
113  * all available channels as active, and pick
114  * a default channel if not already specified.
115  */
116 static void
117 ieee80211_chan_init(struct ieee80211com *ic)
118 {
119 #define DEFAULTRATES(m, def) do { \
120         if (ic->ic_sup_rates[m].rs_nrates == 0) \
121                 ic->ic_sup_rates[m] = def; \
122 } while (0)
123         struct ieee80211_channel *c;
124         int i;
125
126         KASSERT(0 < ic->ic_nchans && ic->ic_nchans <= IEEE80211_CHAN_MAX,
127                 ("invalid number of channels specified: %u", ic->ic_nchans));
128         memset(ic->ic_chan_avail, 0, sizeof(ic->ic_chan_avail));
129         memset(ic->ic_modecaps, 0, sizeof(ic->ic_modecaps));
130         setbit(ic->ic_modecaps, IEEE80211_MODE_AUTO);
131         for (i = 0; i < ic->ic_nchans; i++) {
132                 c = &ic->ic_channels[i];
133                 KASSERT(c->ic_flags != 0, ("channel with no flags"));
134                 /*
135                  * Help drivers that work only with frequencies by filling
136                  * in IEEE channel #'s if not already calculated.  Note this
137                  * mimics similar work done in ieee80211_setregdomain when
138                  * changing regulatory state.
139                  */
140                 if (c->ic_ieee == 0)
141                         c->ic_ieee = ieee80211_mhz2ieee(c->ic_freq,c->ic_flags);
142                 if (IEEE80211_IS_CHAN_HT40(c) && c->ic_extieee == 0)
143                         c->ic_extieee = ieee80211_mhz2ieee(c->ic_freq +
144                             (IEEE80211_IS_CHAN_HT40U(c) ? 20 : -20),
145                             c->ic_flags);
146                 /* default max tx power to max regulatory */
147                 if (c->ic_maxpower == 0)
148                         c->ic_maxpower = 2*c->ic_maxregpower;
149                 setbit(ic->ic_chan_avail, c->ic_ieee);
150                 /*
151                  * Identify mode capabilities.
152                  */
153                 if (IEEE80211_IS_CHAN_A(c))
154                         setbit(ic->ic_modecaps, IEEE80211_MODE_11A);
155                 if (IEEE80211_IS_CHAN_B(c))
156                         setbit(ic->ic_modecaps, IEEE80211_MODE_11B);
157                 if (IEEE80211_IS_CHAN_ANYG(c))
158                         setbit(ic->ic_modecaps, IEEE80211_MODE_11G);
159                 if (IEEE80211_IS_CHAN_FHSS(c))
160                         setbit(ic->ic_modecaps, IEEE80211_MODE_FH);
161                 if (IEEE80211_IS_CHAN_108A(c))
162                         setbit(ic->ic_modecaps, IEEE80211_MODE_TURBO_A);
163                 if (IEEE80211_IS_CHAN_108G(c))
164                         setbit(ic->ic_modecaps, IEEE80211_MODE_TURBO_G);
165                 if (IEEE80211_IS_CHAN_ST(c))
166                         setbit(ic->ic_modecaps, IEEE80211_MODE_STURBO_A);
167                 if (IEEE80211_IS_CHAN_HALF(c))
168                         setbit(ic->ic_modecaps, IEEE80211_MODE_HALF);
169                 if (IEEE80211_IS_CHAN_QUARTER(c))
170                         setbit(ic->ic_modecaps, IEEE80211_MODE_QUARTER);
171                 if (IEEE80211_IS_CHAN_HTA(c))
172                         setbit(ic->ic_modecaps, IEEE80211_MODE_11NA);
173                 if (IEEE80211_IS_CHAN_HTG(c))
174                         setbit(ic->ic_modecaps, IEEE80211_MODE_11NG);
175         }
176         /* initialize candidate channels to all available */
177         memcpy(ic->ic_chan_active, ic->ic_chan_avail,
178                 sizeof(ic->ic_chan_avail));
179
180         /* sort channel table to allow lookup optimizations */
181         ieee80211_sort_channels(ic->ic_channels, ic->ic_nchans);
182
183         /* invalidate any previous state */
184         ic->ic_bsschan = IEEE80211_CHAN_ANYC;
185         ic->ic_prevchan = NULL;
186         ic->ic_csa_newchan = NULL;
187         /* arbitrarily pick the first channel */
188         ic->ic_curchan = &ic->ic_channels[0];
189         ic->ic_rt = ieee80211_get_ratetable(ic->ic_curchan);
190
191         /* fillin well-known rate sets if driver has not specified */
192         DEFAULTRATES(IEEE80211_MODE_11B,         ieee80211_rateset_11b);
193         DEFAULTRATES(IEEE80211_MODE_11G,         ieee80211_rateset_11g);
194         DEFAULTRATES(IEEE80211_MODE_11A,         ieee80211_rateset_11a);
195         DEFAULTRATES(IEEE80211_MODE_TURBO_A,     ieee80211_rateset_11a);
196         DEFAULTRATES(IEEE80211_MODE_TURBO_G,     ieee80211_rateset_11g);
197         DEFAULTRATES(IEEE80211_MODE_STURBO_A,    ieee80211_rateset_11a);
198         DEFAULTRATES(IEEE80211_MODE_HALF,        ieee80211_rateset_half);
199         DEFAULTRATES(IEEE80211_MODE_QUARTER,     ieee80211_rateset_quarter);
200         DEFAULTRATES(IEEE80211_MODE_11NA,        ieee80211_rateset_11a);
201         DEFAULTRATES(IEEE80211_MODE_11NG,        ieee80211_rateset_11g);
202
203         /*
204          * Set auto mode to reset active channel state and any desired channel.
205          */
206         (void) ieee80211_setmode(ic, IEEE80211_MODE_AUTO);
207 #undef DEFAULTRATES
208 }
209
210 static void
211 null_update_mcast(struct ifnet *ifp)
212 {
213         if_printf(ifp, "need multicast update callback\n");
214 }
215
216 static void
217 null_update_promisc(struct ifnet *ifp)
218 {
219         if_printf(ifp, "need promiscuous mode update callback\n");
220 }
221
222 static int
223 null_output(struct ifnet *ifp, struct mbuf *m,
224         struct sockaddr *dst, struct route *ro)
225 {
226         if_printf(ifp, "discard raw packet\n");
227         m_freem(m);
228         return EIO;
229 }
230
231 static void
232 null_input(struct ifnet *ifp, struct mbuf *m)
233 {
234         if_printf(ifp, "if_input should not be called\n");
235         m_freem(m);
236 }
237
238 /*
239  * Attach/setup the common net80211 state.  Called by
240  * the driver on attach to prior to creating any vap's.
241  */
242 void
243 ieee80211_ifattach(struct ieee80211com *ic,
244         const uint8_t macaddr[IEEE80211_ADDR_LEN])
245 {
246         struct ifnet *ifp = ic->ic_ifp;
247         struct sockaddr_dl *sdl;
248         struct ifaddr *ifa;
249
250         KASSERT(ifp->if_type == IFT_IEEE80211, ("if_type %d", ifp->if_type));
251
252         IEEE80211_LOCK_INIT(ic, ifp->if_xname);
253         TAILQ_INIT(&ic->ic_vaps);
254
255         /* Create a taskqueue for all state changes */
256         ic->ic_tq = taskqueue_create("ic_taskq", M_WAITOK | M_ZERO,
257             taskqueue_thread_enqueue, &ic->ic_tq);
258         taskqueue_start_threads(&ic->ic_tq, 1, PI_NET, "%s taskq",
259             ifp->if_xname);
260         /*
261          * Fill in 802.11 available channel set, mark all
262          * available channels as active, and pick a default
263          * channel if not already specified.
264          */
265         ieee80211_media_init(ic);
266
267         ic->ic_update_mcast = null_update_mcast;
268         ic->ic_update_promisc = null_update_promisc;
269
270         ic->ic_bintval = IEEE80211_BINTVAL_DEFAULT;
271         ic->ic_lintval = ic->ic_bintval;
272         ic->ic_txpowlimit = IEEE80211_TXPOWER_MAX;
273
274         ieee80211_crypto_attach(ic);
275         ieee80211_node_attach(ic);
276         ieee80211_power_attach(ic);
277         ieee80211_proto_attach(ic);
278 #ifdef IEEE80211_SUPPORT_SUPERG
279         ieee80211_superg_attach(ic);
280 #endif
281         ieee80211_ht_attach(ic);
282         ieee80211_scan_attach(ic);
283         ieee80211_regdomain_attach(ic);
284
285         ieee80211_sysctl_attach(ic);
286
287         ifp->if_addrlen = IEEE80211_ADDR_LEN;
288         ifp->if_hdrlen = 0;
289         if_attach(ifp);
290         ifp->if_mtu = IEEE80211_MTU_MAX;
291         ifp->if_broadcastaddr = ieee80211broadcastaddr;
292         ifp->if_output = null_output;
293         ifp->if_input = null_input;     /* just in case */
294         ifp->if_resolvemulti = NULL;    /* NB: callers check */
295
296         ifa = ifaddr_byindex(ifp->if_index);
297         KASSERT(ifa != NULL, ("%s: no lladdr!\n", __func__));
298         sdl = (struct sockaddr_dl *)ifa->ifa_addr;
299         sdl->sdl_type = IFT_ETHER;              /* XXX IFT_IEEE80211? */
300         sdl->sdl_alen = IEEE80211_ADDR_LEN;
301         IEEE80211_ADDR_COPY(LLADDR(sdl), macaddr);
302 }
303
304 /*
305  * Detach net80211 state on device detach.  Tear down
306  * all vap's and reclaim all common state prior to the
307  * device state going away.  Note we may call back into
308  * driver; it must be prepared for this.
309  */
310 void
311 ieee80211_ifdetach(struct ieee80211com *ic)
312 {
313         struct ifnet *ifp = ic->ic_ifp;
314         struct ieee80211vap *vap;
315
316         while ((vap = TAILQ_FIRST(&ic->ic_vaps)) != NULL)
317                 ieee80211_vap_destroy(vap);
318         ieee80211_waitfor_parent(ic);
319
320         ieee80211_sysctl_detach(ic);
321         ieee80211_regdomain_detach(ic);
322         ieee80211_scan_detach(ic);
323 #ifdef IEEE80211_SUPPORT_SUPERG
324         ieee80211_superg_detach(ic);
325 #endif
326         ieee80211_ht_detach(ic);
327         /* NB: must be called before ieee80211_node_detach */
328         ieee80211_proto_detach(ic);
329         ieee80211_crypto_detach(ic);
330         ieee80211_power_detach(ic);
331         ieee80211_node_detach(ic);
332         ifmedia_removeall(&ic->ic_media);
333
334         taskqueue_free(ic->ic_tq);
335         IEEE80211_LOCK_DESTROY(ic);
336         if_detach(ifp);
337 }
338
339 /*
340  * Default reset method for use with the ioctl support.  This
341  * method is invoked after any state change in the 802.11
342  * layer that should be propagated to the hardware but not
343  * require re-initialization of the 802.11 state machine (e.g
344  * rescanning for an ap).  We always return ENETRESET which
345  * should cause the driver to re-initialize the device. Drivers
346  * can override this method to implement more optimized support.
347  */
348 static int
349 default_reset(struct ieee80211vap *vap, u_long cmd)
350 {
351         return ENETRESET;
352 }
353
354 /*
355  * Prepare a vap for use.  Drivers use this call to
356  * setup net80211 state in new vap's prior attaching
357  * them with ieee80211_vap_attach (below).
358  */
359 int
360 ieee80211_vap_setup(struct ieee80211com *ic, struct ieee80211vap *vap,
361         const char name[IFNAMSIZ], int unit, int opmode, int flags,
362         const uint8_t bssid[IEEE80211_ADDR_LEN],
363         const uint8_t macaddr[IEEE80211_ADDR_LEN])
364 {
365         struct ifnet *ifp;
366
367         ifp = if_alloc(IFT_ETHER);
368         if (ifp == NULL) {
369                 if_printf(ic->ic_ifp, "%s: unable to allocate ifnet\n",
370                     __func__);
371                 return ENOMEM;
372         }
373         if_initname(ifp, name, unit);
374         ifp->if_softc = vap;                    /* back pointer */
375         ifp->if_flags = IFF_SIMPLEX | IFF_BROADCAST | IFF_MULTICAST;
376         ifp->if_start = ieee80211_start;
377         ifp->if_ioctl = ieee80211_ioctl;
378         ifp->if_watchdog = NULL;                /* NB: no watchdog routine */
379         ifp->if_init = ieee80211_init;
380         /* NB: input+output filled in by ether_ifattach */
381         IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN);
382         ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN;
383         IFQ_SET_READY(&ifp->if_snd);
384
385         vap->iv_ifp = ifp;
386         vap->iv_ic = ic;
387         vap->iv_flags = ic->ic_flags;           /* propagate common flags */
388         vap->iv_flags_ext = ic->ic_flags_ext;
389         vap->iv_flags_ven = ic->ic_flags_ven;
390         vap->iv_caps = ic->ic_caps &~ IEEE80211_C_OPMODE;
391         vap->iv_htcaps = ic->ic_htcaps;
392         vap->iv_opmode = opmode;
393         vap->iv_caps |= ieee80211_opcap[opmode];
394         switch (opmode) {
395         case IEEE80211_M_WDS:
396                 /*
397                  * WDS links must specify the bssid of the far end.
398                  * For legacy operation this is a static relationship.
399                  * For non-legacy operation the station must associate
400                  * and be authorized to pass traffic.  Plumbing the
401                  * vap to the proper node happens when the vap
402                  * transitions to RUN state.
403                  */
404                 IEEE80211_ADDR_COPY(vap->iv_des_bssid, bssid);
405                 vap->iv_flags |= IEEE80211_F_DESBSSID;
406                 if (flags & IEEE80211_CLONE_WDSLEGACY)
407                         vap->iv_flags_ext |= IEEE80211_FEXT_WDSLEGACY;
408                 break;
409 #ifdef IEEE80211_SUPPORT_TDMA
410         case IEEE80211_M_AHDEMO:
411                 if (flags & IEEE80211_CLONE_TDMA) {
412                         /* NB: checked before clone operation allowed */
413                         KASSERT(ic->ic_caps & IEEE80211_C_TDMA,
414                             ("not TDMA capable, ic_caps 0x%x", ic->ic_caps));
415                         /*
416                          * Propagate TDMA capability to mark vap; this
417                          * cannot be removed and is used to distinguish
418                          * regular ahdemo operation from ahdemo+tdma.
419                          */
420                         vap->iv_caps |= IEEE80211_C_TDMA;
421                 }
422                 break;
423 #endif
424         }
425         /* auto-enable s/w beacon miss support */
426         if (flags & IEEE80211_CLONE_NOBEACONS)
427                 vap->iv_flags_ext |= IEEE80211_FEXT_SWBMISS;
428         /*
429          * Enable various functionality by default if we're
430          * capable; the driver can override us if it knows better.
431          */
432         if (vap->iv_caps & IEEE80211_C_WME)
433                 vap->iv_flags |= IEEE80211_F_WME;
434         if (vap->iv_caps & IEEE80211_C_BURST)
435                 vap->iv_flags |= IEEE80211_F_BURST;
436         /* NB: bg scanning only makes sense for station mode right now */
437         if (vap->iv_opmode == IEEE80211_M_STA &&
438             (vap->iv_caps & IEEE80211_C_BGSCAN))
439                 vap->iv_flags |= IEEE80211_F_BGSCAN;
440         vap->iv_flags |= IEEE80211_F_DOTH;      /* XXX no cap, just ena */
441         /* NB: DFS support only makes sense for ap mode right now */
442         if (vap->iv_opmode == IEEE80211_M_HOSTAP &&
443             (vap->iv_caps & IEEE80211_C_DFS))
444                 vap->iv_flags_ext |= IEEE80211_FEXT_DFS;
445
446         vap->iv_des_chan = IEEE80211_CHAN_ANYC;         /* any channel is ok */
447         vap->iv_bmissthreshold = IEEE80211_HWBMISS_DEFAULT;
448         vap->iv_dtim_period = IEEE80211_DTIM_DEFAULT;
449         /*
450          * Install a default reset method for the ioctl support;
451          * the driver can override this.
452          */
453         vap->iv_reset = default_reset;
454
455         IEEE80211_ADDR_COPY(vap->iv_myaddr, macaddr);
456
457         ieee80211_sysctl_vattach(vap);
458         ieee80211_crypto_vattach(vap);
459         ieee80211_node_vattach(vap);
460         ieee80211_power_vattach(vap);
461         ieee80211_proto_vattach(vap);
462 #ifdef IEEE80211_SUPPORT_SUPERG
463         ieee80211_superg_vattach(vap);
464 #endif
465         ieee80211_ht_vattach(vap);
466         ieee80211_scan_vattach(vap);
467         ieee80211_regdomain_vattach(vap);
468         ieee80211_radiotap_vattach(vap);
469
470         return 0;
471 }
472
473 /*
474  * Activate a vap.  State should have been prepared with a
475  * call to ieee80211_vap_setup and by the driver.  On return
476  * from this call the vap is ready for use.
477  */
478 int
479 ieee80211_vap_attach(struct ieee80211vap *vap,
480         ifm_change_cb_t media_change, ifm_stat_cb_t media_stat)
481 {
482         struct ifnet *ifp = vap->iv_ifp;
483         struct ieee80211com *ic = vap->iv_ic;
484         struct ifmediareq imr;
485         int maxrate;
486
487         IEEE80211_DPRINTF(vap, IEEE80211_MSG_STATE,
488             "%s: %s parent %s flags 0x%x flags_ext 0x%x\n",
489             __func__, ieee80211_opmode_name[vap->iv_opmode],
490             ic->ic_ifp->if_xname, vap->iv_flags, vap->iv_flags_ext);
491
492         /*
493          * Do late attach work that cannot happen until after
494          * the driver has had a chance to override defaults.
495          */
496         ieee80211_node_latevattach(vap);
497         ieee80211_power_latevattach(vap);
498
499         maxrate = ieee80211_media_setup(ic, &vap->iv_media, vap->iv_caps,
500             vap->iv_opmode == IEEE80211_M_STA, media_change, media_stat);
501         ieee80211_media_status(ifp, &imr);
502         /* NB: strip explicit mode; we're actually in autoselect */
503         ifmedia_set(&vap->iv_media,
504             imr.ifm_active &~ (IFM_MMASK | IFM_IEEE80211_TURBO));
505         if (maxrate)
506                 ifp->if_baudrate = IF_Mbps(maxrate);
507
508         ether_ifattach(ifp, vap->iv_myaddr);
509         /* hook output method setup by ether_ifattach */
510         vap->iv_output = ifp->if_output;
511         ifp->if_output = ieee80211_output;
512         /* NB: if_mtu set by ether_ifattach to ETHERMTU */
513
514         IEEE80211_LOCK(ic);
515         TAILQ_INSERT_TAIL(&ic->ic_vaps, vap, iv_next);
516         if (vap->iv_opmode == IEEE80211_M_MONITOR)
517                 ic->ic_monvaps++;
518         ieee80211_syncflag_locked(ic, IEEE80211_F_WME);
519 #ifdef IEEE80211_SUPPORT_SUPERG
520         ieee80211_syncflag_locked(ic, IEEE80211_F_TURBOP);
521 #endif
522         ieee80211_syncflag_locked(ic, IEEE80211_F_PCF);
523         ieee80211_syncflag_locked(ic, IEEE80211_F_BURST);
524         ieee80211_syncflag_ext_locked(ic, IEEE80211_FEXT_HT);
525         ieee80211_syncflag_ext_locked(ic, IEEE80211_FEXT_USEHT40);
526         ieee80211_syncifflag_locked(ic, IFF_PROMISC);
527         ieee80211_syncifflag_locked(ic, IFF_ALLMULTI);
528         IEEE80211_UNLOCK(ic);
529
530         return 1;
531 }
532
533 /* 
534  * Tear down vap state and reclaim the ifnet.
535  * The driver is assumed to have prepared for
536  * this; e.g. by turning off interrupts for the
537  * underlying device.
538  */
539 void
540 ieee80211_vap_detach(struct ieee80211vap *vap)
541 {
542         struct ieee80211com *ic = vap->iv_ic;
543         struct ifnet *ifp = vap->iv_ifp;
544
545         IEEE80211_DPRINTF(vap, IEEE80211_MSG_STATE, "%s: %s parent %s\n",
546             __func__, ieee80211_opmode_name[vap->iv_opmode],
547             ic->ic_ifp->if_xname);
548
549         IEEE80211_LOCK(ic);
550         /* block traffic from above */
551         ifp->if_drv_flags |= IFF_DRV_OACTIVE;
552         /*
553          * Evil hack.  Clear the backpointer from the ifnet to the
554          * vap so any requests from above will return an error or
555          * be ignored.  In particular this short-circuits requests
556          * by the bridge to turn off promiscuous mode as a result
557          * of calling ether_ifdetach.
558          */
559         ifp->if_softc = NULL;
560         /*
561          * Stop the vap before detaching the ifnet.  Ideally we'd
562          * do this in the other order so the ifnet is inaccessible
563          * while we cleanup internal state but that is hard.
564          */
565         ieee80211_stop_locked(vap);
566         IEEE80211_UNLOCK(ic);
567
568         /*
569          * Flush any deferred vap tasks.
570          * NB: must be before ether_ifdetach() and removal from ic_vaps list
571          */
572         ieee80211_draintask(ic, &vap->iv_nstate_task);
573         ieee80211_draintask(ic, &vap->iv_swbmiss_task);
574
575         IEEE80211_LOCK(ic);
576         KASSERT(vap->iv_state == IEEE80211_S_INIT , ("vap still running"));
577         TAILQ_REMOVE(&ic->ic_vaps, vap, iv_next);
578         if (vap->iv_opmode == IEEE80211_M_MONITOR)
579                 ic->ic_monvaps--;
580         ieee80211_syncflag_locked(ic, IEEE80211_F_WME);
581 #ifdef IEEE80211_SUPPORT_SUPERG
582         ieee80211_syncflag_locked(ic, IEEE80211_F_TURBOP);
583 #endif
584         ieee80211_syncflag_locked(ic, IEEE80211_F_PCF);
585         ieee80211_syncflag_locked(ic, IEEE80211_F_BURST);
586         ieee80211_syncflag_ext_locked(ic, IEEE80211_FEXT_HT);
587         ieee80211_syncflag_ext_locked(ic, IEEE80211_FEXT_USEHT40);
588         /* NB: this handles the bpfdetach done below */
589         ieee80211_syncflag_ext_locked(ic, IEEE80211_FEXT_BPF);
590         ieee80211_syncifflag_locked(ic, IFF_PROMISC);
591         ieee80211_syncifflag_locked(ic, IFF_ALLMULTI);
592         IEEE80211_UNLOCK(ic);
593
594         /* XXX can't hold com lock */
595         /* NB: bpfdetach is called by ether_ifdetach and claims all taps */
596         ether_ifdetach(ifp);
597
598         ifmedia_removeall(&vap->iv_media);
599
600         ieee80211_radiotap_vdetach(vap);
601         ieee80211_regdomain_vdetach(vap);
602         ieee80211_scan_vdetach(vap);
603 #ifdef IEEE80211_SUPPORT_SUPERG
604         ieee80211_superg_vdetach(vap);
605 #endif
606         ieee80211_ht_vdetach(vap);
607         /* NB: must be before ieee80211_node_vdetach */
608         ieee80211_proto_vdetach(vap);
609         ieee80211_crypto_vdetach(vap);
610         ieee80211_power_vdetach(vap);
611         ieee80211_node_vdetach(vap);
612         ieee80211_sysctl_vdetach(vap);
613
614         if_free(ifp);
615 }
616
617 /*
618  * Synchronize flag bit state in the parent ifnet structure
619  * according to the state of all vap ifnet's.  This is used,
620  * for example, to handle IFF_PROMISC and IFF_ALLMULTI.
621  */
622 void
623 ieee80211_syncifflag_locked(struct ieee80211com *ic, int flag)
624 {
625         struct ifnet *ifp = ic->ic_ifp;
626         struct ieee80211vap *vap;
627         int bit, oflags;
628
629         IEEE80211_LOCK_ASSERT(ic);
630
631         bit = 0;
632         TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
633                 if (vap->iv_ifp->if_flags & flag) {
634                         /*
635                          * XXX the bridge sets PROMISC but we don't want to
636                          * enable it on the device, discard here so all the
637                          * drivers don't need to special-case it
638                          */
639                         if (flag == IFF_PROMISC &&
640                             vap->iv_opmode == IEEE80211_M_HOSTAP)
641                                 continue;
642                         bit = 1;
643                         break;
644                 }
645         oflags = ifp->if_flags;
646         if (bit)
647                 ifp->if_flags |= flag;
648         else
649                 ifp->if_flags &= ~flag;
650         if ((ifp->if_flags ^ oflags) & flag) {
651                 /* XXX should we return 1/0 and let caller do this? */
652                 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
653                         if (flag == IFF_PROMISC)
654                                 ieee80211_runtask(ic, &ic->ic_promisc_task);
655                         else if (flag == IFF_ALLMULTI)
656                                 ieee80211_runtask(ic, &ic->ic_mcast_task);
657                 }
658         }
659 }
660
661 /*
662  * Synchronize flag bit state in the com structure
663  * according to the state of all vap's.  This is used,
664  * for example, to handle state changes via ioctls.
665  */
666 static void
667 ieee80211_syncflag_locked(struct ieee80211com *ic, int flag)
668 {
669         struct ieee80211vap *vap;
670         int bit;
671
672         IEEE80211_LOCK_ASSERT(ic);
673
674         bit = 0;
675         TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
676                 if (vap->iv_flags & flag) {
677                         bit = 1;
678                         break;
679                 }
680         if (bit)
681                 ic->ic_flags |= flag;
682         else
683                 ic->ic_flags &= ~flag;
684 }
685
686 void
687 ieee80211_syncflag(struct ieee80211vap *vap, int flag)
688 {
689         struct ieee80211com *ic = vap->iv_ic;
690
691         IEEE80211_LOCK(ic);
692         if (flag < 0) {
693                 flag = -flag;
694                 vap->iv_flags &= ~flag;
695         } else
696                 vap->iv_flags |= flag;
697         ieee80211_syncflag_locked(ic, flag);
698         IEEE80211_UNLOCK(ic);
699 }
700
701 /*
702  * Synchronize flag bit state in the com structure
703  * according to the state of all vap's.  This is used,
704  * for example, to handle state changes via ioctls.
705  */
706 static void
707 ieee80211_syncflag_ext_locked(struct ieee80211com *ic, int flag)
708 {
709         struct ieee80211vap *vap;
710         int bit;
711
712         IEEE80211_LOCK_ASSERT(ic);
713
714         bit = 0;
715         TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
716                 if (vap->iv_flags_ext & flag) {
717                         bit = 1;
718                         break;
719                 }
720         if (bit)
721                 ic->ic_flags_ext |= flag;
722         else
723                 ic->ic_flags_ext &= ~flag;
724 }
725
726 void
727 ieee80211_syncflag_ext(struct ieee80211vap *vap, int flag)
728 {
729         struct ieee80211com *ic = vap->iv_ic;
730
731         IEEE80211_LOCK(ic);
732         if (flag < 0) {
733                 flag = -flag;
734                 vap->iv_flags_ext &= ~flag;
735         } else
736                 vap->iv_flags_ext |= flag;
737         ieee80211_syncflag_ext_locked(ic, flag);
738         IEEE80211_UNLOCK(ic);
739 }
740
741 static __inline int
742 mapgsm(u_int freq, u_int flags)
743 {
744         freq *= 10;
745         if (flags & IEEE80211_CHAN_QUARTER)
746                 freq += 5;
747         else if (flags & IEEE80211_CHAN_HALF)
748                 freq += 10;
749         else
750                 freq += 20;
751         /* NB: there is no 907/20 wide but leave room */
752         return (freq - 906*10) / 5;
753 }
754
755 static __inline int
756 mappsb(u_int freq, u_int flags)
757 {
758         return 37 + ((freq * 10) + ((freq % 5) == 2 ? 5 : 0) - 49400) / 5;
759 }
760
761 /*
762  * Convert MHz frequency to IEEE channel number.
763  */
764 int
765 ieee80211_mhz2ieee(u_int freq, u_int flags)
766 {
767 #define IS_FREQ_IN_PSB(_freq) ((_freq) > 4940 && (_freq) < 4990)
768         if (flags & IEEE80211_CHAN_GSM)
769                 return mapgsm(freq, flags);
770         if (flags & IEEE80211_CHAN_2GHZ) {      /* 2GHz band */
771                 if (freq == 2484)
772                         return 14;
773                 if (freq < 2484)
774                         return ((int) freq - 2407) / 5;
775                 else
776                         return 15 + ((freq - 2512) / 20);
777         } else if (flags & IEEE80211_CHAN_5GHZ) {       /* 5Ghz band */
778                 if (freq <= 5000) {
779                         /* XXX check regdomain? */
780                         if (IS_FREQ_IN_PSB(freq))
781                                 return mappsb(freq, flags);
782                         return (freq - 4000) / 5;
783                 } else
784                         return (freq - 5000) / 5;
785         } else {                                /* either, guess */
786                 if (freq == 2484)
787                         return 14;
788                 if (freq < 2484) {
789                         if (907 <= freq && freq <= 922)
790                                 return mapgsm(freq, flags);
791                         return ((int) freq - 2407) / 5;
792                 }
793                 if (freq < 5000) {
794                         if (IS_FREQ_IN_PSB(freq))
795                                 return mappsb(freq, flags);
796                         else if (freq > 4900)
797                                 return (freq - 4000) / 5;
798                         else
799                                 return 15 + ((freq - 2512) / 20);
800                 }
801                 return (freq - 5000) / 5;
802         }
803 #undef IS_FREQ_IN_PSB
804 }
805
806 /*
807  * Convert channel to IEEE channel number.
808  */
809 int
810 ieee80211_chan2ieee(struct ieee80211com *ic, const struct ieee80211_channel *c)
811 {
812         if (c == NULL) {
813                 if_printf(ic->ic_ifp, "invalid channel (NULL)\n");
814                 return 0;               /* XXX */
815         }
816         return (c == IEEE80211_CHAN_ANYC ?  IEEE80211_CHAN_ANY : c->ic_ieee);
817 }
818
819 /*
820  * Convert IEEE channel number to MHz frequency.
821  */
822 u_int
823 ieee80211_ieee2mhz(u_int chan, u_int flags)
824 {
825         if (flags & IEEE80211_CHAN_GSM)
826                 return 907 + 5 * (chan / 10);
827         if (flags & IEEE80211_CHAN_2GHZ) {      /* 2GHz band */
828                 if (chan == 14)
829                         return 2484;
830                 if (chan < 14)
831                         return 2407 + chan*5;
832                 else
833                         return 2512 + ((chan-15)*20);
834         } else if (flags & IEEE80211_CHAN_5GHZ) {/* 5Ghz band */
835                 if (flags & (IEEE80211_CHAN_HALF|IEEE80211_CHAN_QUARTER)) {
836                         chan -= 37;
837                         return 4940 + chan*5 + (chan % 5 ? 2 : 0);
838                 }
839                 return 5000 + (chan*5);
840         } else {                                /* either, guess */
841                 /* XXX can't distinguish PSB+GSM channels */
842                 if (chan == 14)
843                         return 2484;
844                 if (chan < 14)                  /* 0-13 */
845                         return 2407 + chan*5;
846                 if (chan < 27)                  /* 15-26 */
847                         return 2512 + ((chan-15)*20);
848                 return 5000 + (chan*5);
849         }
850 }
851
852 /*
853  * Locate a channel given a frequency+flags.  We cache
854  * the previous lookup to optimize switching between two
855  * channels--as happens with dynamic turbo.
856  */
857 struct ieee80211_channel *
858 ieee80211_find_channel(struct ieee80211com *ic, int freq, int flags)
859 {
860         struct ieee80211_channel *c;
861         int i;
862
863         flags &= IEEE80211_CHAN_ALLTURBO;
864         c = ic->ic_prevchan;
865         if (c != NULL && c->ic_freq == freq &&
866             (c->ic_flags & IEEE80211_CHAN_ALLTURBO) == flags)
867                 return c;
868         /* brute force search */
869         for (i = 0; i < ic->ic_nchans; i++) {
870                 c = &ic->ic_channels[i];
871                 if (c->ic_freq == freq &&
872                     (c->ic_flags & IEEE80211_CHAN_ALLTURBO) == flags)
873                         return c;
874         }
875         return NULL;
876 }
877
878 /*
879  * Locate a channel given a channel number+flags.  We cache
880  * the previous lookup to optimize switching between two
881  * channels--as happens with dynamic turbo.
882  */
883 struct ieee80211_channel *
884 ieee80211_find_channel_byieee(struct ieee80211com *ic, int ieee, int flags)
885 {
886         struct ieee80211_channel *c;
887         int i;
888
889         flags &= IEEE80211_CHAN_ALLTURBO;
890         c = ic->ic_prevchan;
891         if (c != NULL && c->ic_ieee == ieee &&
892             (c->ic_flags & IEEE80211_CHAN_ALLTURBO) == flags)
893                 return c;
894         /* brute force search */
895         for (i = 0; i < ic->ic_nchans; i++) {
896                 c = &ic->ic_channels[i];
897                 if (c->ic_ieee == ieee &&
898                     (c->ic_flags & IEEE80211_CHAN_ALLTURBO) == flags)
899                         return c;
900         }
901         return NULL;
902 }
903
904 static void
905 addmedia(struct ifmedia *media, int caps, int addsta, int mode, int mword)
906 {
907 #define ADD(_ic, _s, _o) \
908         ifmedia_add(media, \
909                 IFM_MAKEWORD(IFM_IEEE80211, (_s), (_o), 0), 0, NULL)
910         static const u_int mopts[IEEE80211_MODE_MAX] = { 
911             [IEEE80211_MODE_AUTO]       = IFM_AUTO,
912             [IEEE80211_MODE_11A]        = IFM_IEEE80211_11A,
913             [IEEE80211_MODE_11B]        = IFM_IEEE80211_11B,
914             [IEEE80211_MODE_11G]        = IFM_IEEE80211_11G,
915             [IEEE80211_MODE_FH]         = IFM_IEEE80211_FH,
916             [IEEE80211_MODE_TURBO_A]    = IFM_IEEE80211_11A|IFM_IEEE80211_TURBO,
917             [IEEE80211_MODE_TURBO_G]    = IFM_IEEE80211_11G|IFM_IEEE80211_TURBO,
918             [IEEE80211_MODE_STURBO_A]   = IFM_IEEE80211_11A|IFM_IEEE80211_TURBO,
919             [IEEE80211_MODE_HALF]       = IFM_IEEE80211_11A,    /* XXX */
920             [IEEE80211_MODE_QUARTER]    = IFM_IEEE80211_11A,    /* XXX */
921             [IEEE80211_MODE_11NA]       = IFM_IEEE80211_11NA,
922             [IEEE80211_MODE_11NG]       = IFM_IEEE80211_11NG,
923         };
924         u_int mopt;
925
926         mopt = mopts[mode];
927         if (addsta)
928                 ADD(ic, mword, mopt);   /* STA mode has no cap */
929         if (caps & IEEE80211_C_IBSS)
930                 ADD(media, mword, mopt | IFM_IEEE80211_ADHOC);
931         if (caps & IEEE80211_C_HOSTAP)
932                 ADD(media, mword, mopt | IFM_IEEE80211_HOSTAP);
933         if (caps & IEEE80211_C_AHDEMO)
934                 ADD(media, mword, mopt | IFM_IEEE80211_ADHOC | IFM_FLAG0);
935         if (caps & IEEE80211_C_MONITOR)
936                 ADD(media, mword, mopt | IFM_IEEE80211_MONITOR);
937         if (caps & IEEE80211_C_WDS)
938                 ADD(media, mword, mopt | IFM_IEEE80211_WDS);
939 #undef ADD
940 }
941
942 /*
943  * Setup the media data structures according to the channel and
944  * rate tables.
945  */
946 static int
947 ieee80211_media_setup(struct ieee80211com *ic,
948         struct ifmedia *media, int caps, int addsta,
949         ifm_change_cb_t media_change, ifm_stat_cb_t media_stat)
950 {
951         int i, j, mode, rate, maxrate, mword, r;
952         const struct ieee80211_rateset *rs;
953         struct ieee80211_rateset allrates;
954
955         /*
956          * Fill in media characteristics.
957          */
958         ifmedia_init(media, 0, media_change, media_stat);
959         maxrate = 0;
960         /*
961          * Add media for legacy operating modes.
962          */
963         memset(&allrates, 0, sizeof(allrates));
964         for (mode = IEEE80211_MODE_AUTO; mode < IEEE80211_MODE_11NA; mode++) {
965                 if (isclr(ic->ic_modecaps, mode))
966                         continue;
967                 addmedia(media, caps, addsta, mode, IFM_AUTO);
968                 if (mode == IEEE80211_MODE_AUTO)
969                         continue;
970                 rs = &ic->ic_sup_rates[mode];
971                 for (i = 0; i < rs->rs_nrates; i++) {
972                         rate = rs->rs_rates[i];
973                         mword = ieee80211_rate2media(ic, rate, mode);
974                         if (mword == 0)
975                                 continue;
976                         addmedia(media, caps, addsta, mode, mword);
977                         /*
978                          * Add legacy rate to the collection of all rates.
979                          */
980                         r = rate & IEEE80211_RATE_VAL;
981                         for (j = 0; j < allrates.rs_nrates; j++)
982                                 if (allrates.rs_rates[j] == r)
983                                         break;
984                         if (j == allrates.rs_nrates) {
985                                 /* unique, add to the set */
986                                 allrates.rs_rates[j] = r;
987                                 allrates.rs_nrates++;
988                         }
989                         rate = (rate & IEEE80211_RATE_VAL) / 2;
990                         if (rate > maxrate)
991                                 maxrate = rate;
992                 }
993         }
994         for (i = 0; i < allrates.rs_nrates; i++) {
995                 mword = ieee80211_rate2media(ic, allrates.rs_rates[i],
996                                 IEEE80211_MODE_AUTO);
997                 if (mword == 0)
998                         continue;
999                 /* NB: remove media options from mword */
1000                 addmedia(media, caps, addsta,
1001                     IEEE80211_MODE_AUTO, IFM_SUBTYPE(mword));
1002         }
1003         /*
1004          * Add HT/11n media.  Note that we do not have enough
1005          * bits in the media subtype to express the MCS so we
1006          * use a "placeholder" media subtype and any fixed MCS
1007          * must be specified with a different mechanism.
1008          */
1009         for (; mode <= IEEE80211_MODE_11NG; mode++) {
1010                 if (isclr(ic->ic_modecaps, mode))
1011                         continue;
1012                 addmedia(media, caps, addsta, mode, IFM_AUTO);
1013                 addmedia(media, caps, addsta, mode, IFM_IEEE80211_MCS);
1014         }
1015         if (isset(ic->ic_modecaps, IEEE80211_MODE_11NA) ||
1016             isset(ic->ic_modecaps, IEEE80211_MODE_11NG)) {
1017                 addmedia(media, caps, addsta,
1018                     IEEE80211_MODE_AUTO, IFM_IEEE80211_MCS);
1019                 /* XXX could walk htrates */
1020                 /* XXX known array size */
1021                 if (ieee80211_htrates[15].ht40_rate_400ns > maxrate)
1022                         maxrate = ieee80211_htrates[15].ht40_rate_400ns;
1023         }
1024         return maxrate;
1025 }
1026
1027 void
1028 ieee80211_media_init(struct ieee80211com *ic)
1029 {
1030         struct ifnet *ifp = ic->ic_ifp;
1031         int maxrate;
1032
1033         /* NB: this works because the structure is initialized to zero */
1034         if (!LIST_EMPTY(&ic->ic_media.ifm_list)) {
1035                 /*
1036                  * We are re-initializing the channel list; clear
1037                  * the existing media state as the media routines
1038                  * don't suppress duplicates.
1039                  */
1040                 ifmedia_removeall(&ic->ic_media);
1041         }
1042         ieee80211_chan_init(ic);
1043
1044         /*
1045          * Recalculate media settings in case new channel list changes
1046          * the set of available modes.
1047          */
1048         maxrate = ieee80211_media_setup(ic, &ic->ic_media, ic->ic_caps, 1,
1049                 ieee80211com_media_change, ieee80211com_media_status);
1050         /* NB: strip explicit mode; we're actually in autoselect */
1051         ifmedia_set(&ic->ic_media,
1052             media_status(ic->ic_opmode, ic->ic_curchan) &~
1053                 (IFM_MMASK | IFM_IEEE80211_TURBO));
1054         if (maxrate)
1055                 ifp->if_baudrate = IF_Mbps(maxrate);
1056
1057         /* XXX need to propagate new media settings to vap's */
1058 }
1059
1060 /* XXX inline or eliminate? */
1061 const struct ieee80211_rateset *
1062 ieee80211_get_suprates(struct ieee80211com *ic, const struct ieee80211_channel *c)
1063 {
1064         /* XXX does this work for 11ng basic rates? */
1065         return &ic->ic_sup_rates[ieee80211_chan2mode(c)];
1066 }
1067
1068 void
1069 ieee80211_announce(struct ieee80211com *ic)
1070 {
1071         struct ifnet *ifp = ic->ic_ifp;
1072         int i, mode, rate, mword;
1073         const struct ieee80211_rateset *rs;
1074
1075         /* NB: skip AUTO since it has no rates */
1076         for (mode = IEEE80211_MODE_AUTO+1; mode < IEEE80211_MODE_11NA; mode++) {
1077                 if (isclr(ic->ic_modecaps, mode))
1078                         continue;
1079                 if_printf(ifp, "%s rates: ", ieee80211_phymode_name[mode]);
1080                 rs = &ic->ic_sup_rates[mode];
1081                 for (i = 0; i < rs->rs_nrates; i++) {
1082                         mword = ieee80211_rate2media(ic, rs->rs_rates[i], mode);
1083                         if (mword == 0)
1084                                 continue;
1085                         rate = ieee80211_media2rate(mword);
1086                         printf("%s%d%sMbps", (i != 0 ? " " : ""),
1087                             rate / 2, ((rate & 0x1) != 0 ? ".5" : ""));
1088                 }
1089                 printf("\n");
1090         }
1091         ieee80211_ht_announce(ic);
1092 }
1093
1094 void
1095 ieee80211_announce_channels(struct ieee80211com *ic)
1096 {
1097         const struct ieee80211_channel *c;
1098         char type;
1099         int i, cw;
1100
1101         printf("Chan  Freq  CW  RegPwr  MinPwr  MaxPwr\n");
1102         for (i = 0; i < ic->ic_nchans; i++) {
1103                 c = &ic->ic_channels[i];
1104                 if (IEEE80211_IS_CHAN_ST(c))
1105                         type = 'S';
1106                 else if (IEEE80211_IS_CHAN_108A(c))
1107                         type = 'T';
1108                 else if (IEEE80211_IS_CHAN_108G(c))
1109                         type = 'G';
1110                 else if (IEEE80211_IS_CHAN_HT(c))
1111                         type = 'n';
1112                 else if (IEEE80211_IS_CHAN_A(c))
1113                         type = 'a';
1114                 else if (IEEE80211_IS_CHAN_ANYG(c))
1115                         type = 'g';
1116                 else if (IEEE80211_IS_CHAN_B(c))
1117                         type = 'b';
1118                 else
1119                         type = 'f';
1120                 if (IEEE80211_IS_CHAN_HT40(c) || IEEE80211_IS_CHAN_TURBO(c))
1121                         cw = 40;
1122                 else if (IEEE80211_IS_CHAN_HALF(c))
1123                         cw = 10;
1124                 else if (IEEE80211_IS_CHAN_QUARTER(c))
1125                         cw = 5;
1126                 else
1127                         cw = 20;
1128                 printf("%4d  %4d%c %2d%c %6d  %4d.%d  %4d.%d\n"
1129                         , c->ic_ieee, c->ic_freq, type
1130                         , cw
1131                         , IEEE80211_IS_CHAN_HT40U(c) ? '+' :
1132                           IEEE80211_IS_CHAN_HT40D(c) ? '-' : ' '
1133                         , c->ic_maxregpower
1134                         , c->ic_minpower / 2, c->ic_minpower & 1 ? 5 : 0
1135                         , c->ic_maxpower / 2, c->ic_maxpower & 1 ? 5 : 0
1136                 );
1137         }
1138 }
1139
1140 static int
1141 media2mode(const struct ifmedia_entry *ime, uint32_t flags, uint16_t *mode)
1142 {
1143         switch (IFM_MODE(ime->ifm_media)) {
1144         case IFM_IEEE80211_11A:
1145                 *mode = IEEE80211_MODE_11A;
1146                 break;
1147         case IFM_IEEE80211_11B:
1148                 *mode = IEEE80211_MODE_11B;
1149                 break;
1150         case IFM_IEEE80211_11G:
1151                 *mode = IEEE80211_MODE_11G;
1152                 break;
1153         case IFM_IEEE80211_FH:
1154                 *mode = IEEE80211_MODE_FH;
1155                 break;
1156         case IFM_IEEE80211_11NA:
1157                 *mode = IEEE80211_MODE_11NA;
1158                 break;
1159         case IFM_IEEE80211_11NG:
1160                 *mode = IEEE80211_MODE_11NG;
1161                 break;
1162         case IFM_AUTO:
1163                 *mode = IEEE80211_MODE_AUTO;
1164                 break;
1165         default:
1166                 return 0;
1167         }
1168         /*
1169          * Turbo mode is an ``option''.
1170          * XXX does not apply to AUTO
1171          */
1172         if (ime->ifm_media & IFM_IEEE80211_TURBO) {
1173                 if (*mode == IEEE80211_MODE_11A) {
1174                         if (flags & IEEE80211_F_TURBOP)
1175                                 *mode = IEEE80211_MODE_TURBO_A;
1176                         else
1177                                 *mode = IEEE80211_MODE_STURBO_A;
1178                 } else if (*mode == IEEE80211_MODE_11G)
1179                         *mode = IEEE80211_MODE_TURBO_G;
1180                 else
1181                         return 0;
1182         }
1183         /* XXX HT40 +/- */
1184         return 1;
1185 }
1186
1187 /*
1188  * Handle a media change request on the underlying interface.
1189  */
1190 int
1191 ieee80211com_media_change(struct ifnet *ifp)
1192 {
1193         return EINVAL;
1194 }
1195
1196 /*
1197  * Handle a media change request on the vap interface.
1198  */
1199 int
1200 ieee80211_media_change(struct ifnet *ifp)
1201 {
1202         struct ieee80211vap *vap = ifp->if_softc;
1203         struct ifmedia_entry *ime = vap->iv_media.ifm_cur;
1204         uint16_t newmode;
1205
1206         if (!media2mode(ime, vap->iv_flags, &newmode))
1207                 return EINVAL;
1208         if (vap->iv_des_mode != newmode) {
1209                 vap->iv_des_mode = newmode;
1210                 return ENETRESET;
1211         }
1212         return 0;
1213 }
1214
1215 /*
1216  * Common code to calculate the media status word
1217  * from the operating mode and channel state.
1218  */
1219 static int
1220 media_status(enum ieee80211_opmode opmode, const struct ieee80211_channel *chan)
1221 {
1222         int status;
1223
1224         status = IFM_IEEE80211;
1225         switch (opmode) {
1226         case IEEE80211_M_STA:
1227                 break;
1228         case IEEE80211_M_IBSS:
1229                 status |= IFM_IEEE80211_ADHOC;
1230                 break;
1231         case IEEE80211_M_HOSTAP:
1232                 status |= IFM_IEEE80211_HOSTAP;
1233                 break;
1234         case IEEE80211_M_MONITOR:
1235                 status |= IFM_IEEE80211_MONITOR;
1236                 break;
1237         case IEEE80211_M_AHDEMO:
1238                 status |= IFM_IEEE80211_ADHOC | IFM_FLAG0;
1239                 break;
1240         case IEEE80211_M_WDS:
1241                 status |= IFM_IEEE80211_WDS;
1242                 break;
1243         }
1244         if (IEEE80211_IS_CHAN_HTA(chan)) {
1245                 status |= IFM_IEEE80211_11NA;
1246         } else if (IEEE80211_IS_CHAN_HTG(chan)) {
1247                 status |= IFM_IEEE80211_11NG;
1248         } else if (IEEE80211_IS_CHAN_A(chan)) {
1249                 status |= IFM_IEEE80211_11A;
1250         } else if (IEEE80211_IS_CHAN_B(chan)) {
1251                 status |= IFM_IEEE80211_11B;
1252         } else if (IEEE80211_IS_CHAN_ANYG(chan)) {
1253                 status |= IFM_IEEE80211_11G;
1254         } else if (IEEE80211_IS_CHAN_FHSS(chan)) {
1255                 status |= IFM_IEEE80211_FH;
1256         }
1257         /* XXX else complain? */
1258
1259         if (IEEE80211_IS_CHAN_TURBO(chan))
1260                 status |= IFM_IEEE80211_TURBO;
1261 #if 0
1262         if (IEEE80211_IS_CHAN_HT20(chan))
1263                 status |= IFM_IEEE80211_HT20;
1264         if (IEEE80211_IS_CHAN_HT40(chan))
1265                 status |= IFM_IEEE80211_HT40;
1266 #endif
1267         return status;
1268 }
1269
1270 static void
1271 ieee80211com_media_status(struct ifnet *ifp, struct ifmediareq *imr)
1272 {
1273         struct ieee80211com *ic = ifp->if_l2com;
1274         struct ieee80211vap *vap;
1275
1276         imr->ifm_status = IFM_AVALID;
1277         TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
1278                 if (vap->iv_ifp->if_flags & IFF_UP) {
1279                         imr->ifm_status |= IFM_ACTIVE;
1280                         break;
1281                 }
1282         imr->ifm_active = media_status(ic->ic_opmode, ic->ic_curchan);
1283         if (imr->ifm_status & IFM_ACTIVE)
1284                 imr->ifm_current = imr->ifm_active;
1285 }
1286
1287 void
1288 ieee80211_media_status(struct ifnet *ifp, struct ifmediareq *imr)
1289 {
1290         struct ieee80211vap *vap = ifp->if_softc;
1291         struct ieee80211com *ic = vap->iv_ic;
1292         enum ieee80211_phymode mode;
1293
1294         imr->ifm_status = IFM_AVALID;
1295         /*
1296          * NB: use the current channel's mode to lock down a xmit
1297          * rate only when running; otherwise we may have a mismatch
1298          * in which case the rate will not be convertible.
1299          */
1300         if (vap->iv_state == IEEE80211_S_RUN) {
1301                 imr->ifm_status |= IFM_ACTIVE;
1302                 mode = ieee80211_chan2mode(ic->ic_curchan);
1303         } else
1304                 mode = IEEE80211_MODE_AUTO;
1305         imr->ifm_active = media_status(vap->iv_opmode, ic->ic_curchan);
1306         /*
1307          * Calculate a current rate if possible.
1308          */
1309         if (vap->iv_txparms[mode].ucastrate != IEEE80211_FIXED_RATE_NONE) {
1310                 /*
1311                  * A fixed rate is set, report that.
1312                  */
1313                 imr->ifm_active |= ieee80211_rate2media(ic,
1314                         vap->iv_txparms[mode].ucastrate, mode);
1315         } else if (vap->iv_opmode == IEEE80211_M_STA) {
1316                 /*
1317                  * In station mode report the current transmit rate.
1318                  */
1319                 imr->ifm_active |= ieee80211_rate2media(ic,
1320                         vap->iv_bss->ni_txrate, mode);
1321         } else
1322                 imr->ifm_active |= IFM_AUTO;
1323         if (imr->ifm_status & IFM_ACTIVE)
1324                 imr->ifm_current = imr->ifm_active;
1325 }
1326
1327 /*
1328  * Set the current phy mode and recalculate the active channel
1329  * set based on the available channels for this mode.  Also
1330  * select a new default/current channel if the current one is
1331  * inappropriate for this mode.
1332  */
1333 int
1334 ieee80211_setmode(struct ieee80211com *ic, enum ieee80211_phymode mode)
1335 {
1336         /*
1337          * Adjust basic rates in 11b/11g supported rate set.
1338          * Note that if operating on a hal/quarter rate channel
1339          * this is a noop as those rates sets are different
1340          * and used instead.
1341          */
1342         if (mode == IEEE80211_MODE_11G || mode == IEEE80211_MODE_11B)
1343                 ieee80211_setbasicrates(&ic->ic_sup_rates[mode], mode);
1344
1345         ic->ic_curmode = mode;
1346         ieee80211_reset_erp(ic);        /* reset ERP state */
1347
1348         return 0;
1349 }
1350
1351 /*
1352  * Return the phy mode for with the specified channel.
1353  */
1354 enum ieee80211_phymode
1355 ieee80211_chan2mode(const struct ieee80211_channel *chan)
1356 {
1357
1358         if (IEEE80211_IS_CHAN_HTA(chan))
1359                 return IEEE80211_MODE_11NA;
1360         else if (IEEE80211_IS_CHAN_HTG(chan))
1361                 return IEEE80211_MODE_11NG;
1362         else if (IEEE80211_IS_CHAN_108G(chan))
1363                 return IEEE80211_MODE_TURBO_G;
1364         else if (IEEE80211_IS_CHAN_ST(chan))
1365                 return IEEE80211_MODE_STURBO_A;
1366         else if (IEEE80211_IS_CHAN_TURBO(chan))
1367                 return IEEE80211_MODE_TURBO_A;
1368         else if (IEEE80211_IS_CHAN_HALF(chan))
1369                 return IEEE80211_MODE_HALF;
1370         else if (IEEE80211_IS_CHAN_QUARTER(chan))
1371                 return IEEE80211_MODE_QUARTER;
1372         else if (IEEE80211_IS_CHAN_A(chan))
1373                 return IEEE80211_MODE_11A;
1374         else if (IEEE80211_IS_CHAN_ANYG(chan))
1375                 return IEEE80211_MODE_11G;
1376         else if (IEEE80211_IS_CHAN_B(chan))
1377                 return IEEE80211_MODE_11B;
1378         else if (IEEE80211_IS_CHAN_FHSS(chan))
1379                 return IEEE80211_MODE_FH;
1380
1381         /* NB: should not get here */
1382         printf("%s: cannot map channel to mode; freq %u flags 0x%x\n",
1383                 __func__, chan->ic_freq, chan->ic_flags);
1384         return IEEE80211_MODE_11B;
1385 }
1386
1387 struct ratemedia {
1388         u_int   match;  /* rate + mode */
1389         u_int   media;  /* if_media rate */
1390 };
1391
1392 static int
1393 findmedia(const struct ratemedia rates[], int n, u_int match)
1394 {
1395         int i;
1396
1397         for (i = 0; i < n; i++)
1398                 if (rates[i].match == match)
1399                         return rates[i].media;
1400         return IFM_AUTO;
1401 }
1402
1403 /*
1404  * Convert IEEE80211 rate value to ifmedia subtype.
1405  * Rate is either a legacy rate in units of 0.5Mbps
1406  * or an MCS index.
1407  */
1408 int
1409 ieee80211_rate2media(struct ieee80211com *ic, int rate, enum ieee80211_phymode mode)
1410 {
1411 #define N(a)    (sizeof(a) / sizeof(a[0]))
1412         static const struct ratemedia rates[] = {
1413                 {   2 | IFM_IEEE80211_FH, IFM_IEEE80211_FH1 },
1414                 {   4 | IFM_IEEE80211_FH, IFM_IEEE80211_FH2 },
1415                 {   2 | IFM_IEEE80211_11B, IFM_IEEE80211_DS1 },
1416                 {   4 | IFM_IEEE80211_11B, IFM_IEEE80211_DS2 },
1417                 {  11 | IFM_IEEE80211_11B, IFM_IEEE80211_DS5 },
1418                 {  22 | IFM_IEEE80211_11B, IFM_IEEE80211_DS11 },
1419                 {  44 | IFM_IEEE80211_11B, IFM_IEEE80211_DS22 },
1420                 {  12 | IFM_IEEE80211_11A, IFM_IEEE80211_OFDM6 },
1421                 {  18 | IFM_IEEE80211_11A, IFM_IEEE80211_OFDM9 },
1422                 {  24 | IFM_IEEE80211_11A, IFM_IEEE80211_OFDM12 },
1423                 {  36 | IFM_IEEE80211_11A, IFM_IEEE80211_OFDM18 },
1424                 {  48 | IFM_IEEE80211_11A, IFM_IEEE80211_OFDM24 },
1425                 {  72 | IFM_IEEE80211_11A, IFM_IEEE80211_OFDM36 },
1426                 {  96 | IFM_IEEE80211_11A, IFM_IEEE80211_OFDM48 },
1427                 { 108 | IFM_IEEE80211_11A, IFM_IEEE80211_OFDM54 },
1428                 {   2 | IFM_IEEE80211_11G, IFM_IEEE80211_DS1 },
1429                 {   4 | IFM_IEEE80211_11G, IFM_IEEE80211_DS2 },
1430                 {  11 | IFM_IEEE80211_11G, IFM_IEEE80211_DS5 },
1431                 {  22 | IFM_IEEE80211_11G, IFM_IEEE80211_DS11 },
1432                 {  12 | IFM_IEEE80211_11G, IFM_IEEE80211_OFDM6 },
1433                 {  18 | IFM_IEEE80211_11G, IFM_IEEE80211_OFDM9 },
1434                 {  24 | IFM_IEEE80211_11G, IFM_IEEE80211_OFDM12 },
1435                 {  36 | IFM_IEEE80211_11G, IFM_IEEE80211_OFDM18 },
1436                 {  48 | IFM_IEEE80211_11G, IFM_IEEE80211_OFDM24 },
1437                 {  72 | IFM_IEEE80211_11G, IFM_IEEE80211_OFDM36 },
1438                 {  96 | IFM_IEEE80211_11G, IFM_IEEE80211_OFDM48 },
1439                 { 108 | IFM_IEEE80211_11G, IFM_IEEE80211_OFDM54 },
1440                 {   6 | IFM_IEEE80211_11A, IFM_IEEE80211_OFDM3 },
1441                 {   9 | IFM_IEEE80211_11A, IFM_IEEE80211_OFDM4 },
1442                 {  54 | IFM_IEEE80211_11A, IFM_IEEE80211_OFDM27 },
1443                 /* NB: OFDM72 doesn't realy exist so we don't handle it */
1444         };
1445         static const struct ratemedia htrates[] = {
1446                 {   0, IFM_IEEE80211_MCS },
1447                 {   1, IFM_IEEE80211_MCS },
1448                 {   2, IFM_IEEE80211_MCS },
1449                 {   3, IFM_IEEE80211_MCS },
1450                 {   4, IFM_IEEE80211_MCS },
1451                 {   5, IFM_IEEE80211_MCS },
1452                 {   6, IFM_IEEE80211_MCS },
1453                 {   7, IFM_IEEE80211_MCS },
1454                 {   8, IFM_IEEE80211_MCS },
1455                 {   9, IFM_IEEE80211_MCS },
1456                 {  10, IFM_IEEE80211_MCS },
1457                 {  11, IFM_IEEE80211_MCS },
1458                 {  12, IFM_IEEE80211_MCS },
1459                 {  13, IFM_IEEE80211_MCS },
1460                 {  14, IFM_IEEE80211_MCS },
1461                 {  15, IFM_IEEE80211_MCS },
1462         };
1463         int m;
1464
1465         /*
1466          * Check 11n rates first for match as an MCS.
1467          */
1468         if (mode == IEEE80211_MODE_11NA) {
1469                 if (rate & IEEE80211_RATE_MCS) {
1470                         rate &= ~IEEE80211_RATE_MCS;
1471                         m = findmedia(htrates, N(htrates), rate);
1472                         if (m != IFM_AUTO)
1473                                 return m | IFM_IEEE80211_11NA;
1474                 }
1475         } else if (mode == IEEE80211_MODE_11NG) {
1476                 /* NB: 12 is ambiguous, it will be treated as an MCS */
1477                 if (rate & IEEE80211_RATE_MCS) {
1478                         rate &= ~IEEE80211_RATE_MCS;
1479                         m = findmedia(htrates, N(htrates), rate);
1480                         if (m != IFM_AUTO)
1481                                 return m | IFM_IEEE80211_11NG;
1482                 }
1483         }
1484         rate &= IEEE80211_RATE_VAL;
1485         switch (mode) {
1486         case IEEE80211_MODE_11A:
1487         case IEEE80211_MODE_HALF:               /* XXX good 'nuf */
1488         case IEEE80211_MODE_QUARTER:
1489         case IEEE80211_MODE_11NA:
1490         case IEEE80211_MODE_TURBO_A:
1491         case IEEE80211_MODE_STURBO_A:
1492                 return findmedia(rates, N(rates), rate | IFM_IEEE80211_11A);
1493         case IEEE80211_MODE_11B:
1494                 return findmedia(rates, N(rates), rate | IFM_IEEE80211_11B);
1495         case IEEE80211_MODE_FH:
1496                 return findmedia(rates, N(rates), rate | IFM_IEEE80211_FH);
1497         case IEEE80211_MODE_AUTO:
1498                 /* NB: ic may be NULL for some drivers */
1499                 if (ic != NULL && ic->ic_phytype == IEEE80211_T_FH)
1500                         return findmedia(rates, N(rates),
1501                             rate | IFM_IEEE80211_FH);
1502                 /* NB: hack, 11g matches both 11b+11a rates */
1503                 /* fall thru... */
1504         case IEEE80211_MODE_11G:
1505         case IEEE80211_MODE_11NG:
1506         case IEEE80211_MODE_TURBO_G:
1507                 return findmedia(rates, N(rates), rate | IFM_IEEE80211_11G);
1508         }
1509         return IFM_AUTO;
1510 #undef N
1511 }
1512
1513 int
1514 ieee80211_media2rate(int mword)
1515 {
1516 #define N(a)    (sizeof(a) / sizeof(a[0]))
1517         static const int ieeerates[] = {
1518                 -1,             /* IFM_AUTO */
1519                 0,              /* IFM_MANUAL */
1520                 0,              /* IFM_NONE */
1521                 2,              /* IFM_IEEE80211_FH1 */
1522                 4,              /* IFM_IEEE80211_FH2 */
1523                 2,              /* IFM_IEEE80211_DS1 */
1524                 4,              /* IFM_IEEE80211_DS2 */
1525                 11,             /* IFM_IEEE80211_DS5 */
1526                 22,             /* IFM_IEEE80211_DS11 */
1527                 44,             /* IFM_IEEE80211_DS22 */
1528                 12,             /* IFM_IEEE80211_OFDM6 */
1529                 18,             /* IFM_IEEE80211_OFDM9 */
1530                 24,             /* IFM_IEEE80211_OFDM12 */
1531                 36,             /* IFM_IEEE80211_OFDM18 */
1532                 48,             /* IFM_IEEE80211_OFDM24 */
1533                 72,             /* IFM_IEEE80211_OFDM36 */
1534                 96,             /* IFM_IEEE80211_OFDM48 */
1535                 108,            /* IFM_IEEE80211_OFDM54 */
1536                 144,            /* IFM_IEEE80211_OFDM72 */
1537                 0,              /* IFM_IEEE80211_DS354k */
1538                 0,              /* IFM_IEEE80211_DS512k */
1539                 6,              /* IFM_IEEE80211_OFDM3 */
1540                 9,              /* IFM_IEEE80211_OFDM4 */
1541                 54,             /* IFM_IEEE80211_OFDM27 */
1542                 -1,             /* IFM_IEEE80211_MCS */
1543         };
1544         return IFM_SUBTYPE(mword) < N(ieeerates) ?
1545                 ieeerates[IFM_SUBTYPE(mword)] : 0;
1546 #undef N
1547 }