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