Lines Matching +full:convert +full:- +full:channels
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
5 * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting
127 * all available channels as active, and pick
134 if (ic->ic_sup_rates[m].rs_nrates == 0) \ in ieee80211_chan_init()
135 ic->ic_sup_rates[m] = def; \ in ieee80211_chan_init()
140 KASSERT(0 < ic->ic_nchans && ic->ic_nchans <= IEEE80211_CHAN_MAX, in ieee80211_chan_init()
141 ("invalid number of channels specified: %u", ic->ic_nchans)); in ieee80211_chan_init()
142 memset(ic->ic_chan_avail, 0, sizeof(ic->ic_chan_avail)); in ieee80211_chan_init()
143 memset(ic->ic_modecaps, 0, sizeof(ic->ic_modecaps)); in ieee80211_chan_init()
144 setbit(ic->ic_modecaps, IEEE80211_MODE_AUTO); in ieee80211_chan_init()
145 for (i = 0; i < ic->ic_nchans; i++) { in ieee80211_chan_init()
146 c = &ic->ic_channels[i]; in ieee80211_chan_init()
147 KASSERT(c->ic_flags != 0, ("channel with no flags")); in ieee80211_chan_init()
154 if (c->ic_ieee == 0) in ieee80211_chan_init()
155 c->ic_ieee = ieee80211_mhz2ieee(c->ic_freq,c->ic_flags); in ieee80211_chan_init()
161 if (IEEE80211_IS_CHAN_HT40(c) && c->ic_extieee == 0) in ieee80211_chan_init()
162 c->ic_extieee = ieee80211_mhz2ieee(c->ic_freq + in ieee80211_chan_init()
163 (IEEE80211_IS_CHAN_HT40U(c) ? 20 : -20), in ieee80211_chan_init()
164 c->ic_flags); in ieee80211_chan_init()
168 * XXX VHT again, note that this assumes VHT80/... channels in ieee80211_chan_init()
174 if (c->ic_maxpower == 0) in ieee80211_chan_init()
175 c->ic_maxpower = 2*c->ic_maxregpower; in ieee80211_chan_init()
176 setbit(ic->ic_chan_avail, c->ic_ieee); in ieee80211_chan_init()
181 setbit(ic->ic_modecaps, IEEE80211_MODE_11A); in ieee80211_chan_init()
183 setbit(ic->ic_modecaps, IEEE80211_MODE_11B); in ieee80211_chan_init()
185 setbit(ic->ic_modecaps, IEEE80211_MODE_11G); in ieee80211_chan_init()
187 setbit(ic->ic_modecaps, IEEE80211_MODE_FH); in ieee80211_chan_init()
189 setbit(ic->ic_modecaps, IEEE80211_MODE_TURBO_A); in ieee80211_chan_init()
191 setbit(ic->ic_modecaps, IEEE80211_MODE_TURBO_G); in ieee80211_chan_init()
193 setbit(ic->ic_modecaps, IEEE80211_MODE_STURBO_A); in ieee80211_chan_init()
195 setbit(ic->ic_modecaps, IEEE80211_MODE_HALF); in ieee80211_chan_init()
197 setbit(ic->ic_modecaps, IEEE80211_MODE_QUARTER); in ieee80211_chan_init()
199 setbit(ic->ic_modecaps, IEEE80211_MODE_11NA); in ieee80211_chan_init()
201 setbit(ic->ic_modecaps, IEEE80211_MODE_11NG); in ieee80211_chan_init()
203 setbit(ic->ic_modecaps, IEEE80211_MODE_VHT_5GHZ); in ieee80211_chan_init()
205 setbit(ic->ic_modecaps, IEEE80211_MODE_VHT_2GHZ); in ieee80211_chan_init()
207 /* initialize candidate channels to all available */ in ieee80211_chan_init()
208 memcpy(ic->ic_chan_active, ic->ic_chan_avail, in ieee80211_chan_init()
209 sizeof(ic->ic_chan_avail)); in ieee80211_chan_init()
212 ieee80211_sort_channels(ic->ic_channels, ic->ic_nchans); in ieee80211_chan_init()
215 ic->ic_bsschan = IEEE80211_CHAN_ANYC; in ieee80211_chan_init()
216 ic->ic_prevchan = NULL; in ieee80211_chan_init()
217 ic->ic_csa_newchan = NULL; in ieee80211_chan_init()
219 ic->ic_curchan = &ic->ic_channels[0]; in ieee80211_chan_init()
220 ic->ic_rt = ieee80211_get_ratetable(ic->ic_curchan); in ieee80211_chan_init()
222 /* fillin well-known rate sets if driver has not specified */ in ieee80211_chan_init()
240 if (ic->ic_rxstream == 0) in ieee80211_chan_init()
241 ic->ic_rxstream = 2; in ieee80211_chan_init()
242 if (ic->ic_txstream == 0) in ieee80211_chan_init()
243 ic->ic_txstream = 2; in ieee80211_chan_init()
295 sbuf_printf(&sb, "%s%s", sp, ic->ic_name); in sysctl_ieee80211coms()
316 IEEE80211_LOCK_INIT(ic, ic->ic_name); in ieee80211_ifattach()
317 IEEE80211_TX_LOCK_INIT(ic, ic->ic_name); in ieee80211_ifattach()
318 TAILQ_INIT(&ic->ic_vaps); in ieee80211_ifattach()
321 ic->ic_tq = taskqueue_create("ic_taskq", in ieee80211_ifattach()
323 taskqueue_thread_enqueue, &ic->ic_tq); in ieee80211_ifattach()
324 taskqueue_start_threads(&ic->ic_tq, 1, PI_NET, "%s net80211 taskq", in ieee80211_ifattach()
325 ic->ic_name); in ieee80211_ifattach()
326 ic->ic_ierrors = counter_u64_alloc(IEEE80211_M_WAITOK); in ieee80211_ifattach()
327 ic->ic_oerrors = counter_u64_alloc(IEEE80211_M_WAITOK); in ieee80211_ifattach()
330 * available channels as active, and pick a default in ieee80211_ifattach()
335 ic->ic_update_mcast = null_update_mcast; in ieee80211_ifattach()
336 ic->ic_update_promisc = null_update_promisc; in ieee80211_ifattach()
337 ic->ic_update_chw = null_update_chw; in ieee80211_ifattach()
339 ic->ic_hash_key = arc4random(); in ieee80211_ifattach()
340 ic->ic_bintval = IEEE80211_BINTVAL_DEFAULT; in ieee80211_ifattach()
341 ic->ic_lintval = ic->ic_bintval; in ieee80211_ifattach()
342 ic->ic_txpowlimit = IEEE80211_TXPOWER_MAX; in ieee80211_ifattach()
381 if (ic->ic_tq == NULL) in ieee80211_ifdetach()
388 taskqueue_drain(taskqueue_thread, &ic->ic_restart_task); in ieee80211_ifdetach()
394 while ((vap = TAILQ_FIRST(&ic->ic_vaps)) != NULL) { in ieee80211_ifdetach()
415 counter_u64_free(ic->ic_ierrors); in ieee80211_ifdetach()
416 counter_u64_free(ic->ic_oerrors); in ieee80211_ifdetach()
418 taskqueue_free(ic->ic_tq); in ieee80211_ifdetach()
464 if (strcmp(ic->ic_name, name) == 0) in ieee80211_find_com()
486 * require re-initialization of the 802.11 state machine (e.g
488 * should cause the driver to re-initialize the device. Drivers
510 vap->iv_def_txkey = kid; in default_update_deftxkey()
519 struct ieee80211vap *vap = ifp->if_softc; in ieee80211_get_counter()
520 struct ieee80211com *ic = vap->iv_ic; in ieee80211_get_counter()
526 rv += counter_u64_fetch(ic->ic_oerrors); in ieee80211_get_counter()
529 rv += counter_u64_fetch(ic->ic_ierrors); in ieee80211_get_counter()
552 ifp->if_softc = vap; /* back pointer */ in ieee80211_vap_setup()
554 ifp->if_transmit = ieee80211_vap_transmit; in ieee80211_vap_setup()
555 ifp->if_qflush = ieee80211_vap_qflush; in ieee80211_vap_setup()
556 ifp->if_ioctl = ieee80211_ioctl; in ieee80211_vap_setup()
557 ifp->if_init = ieee80211_init; in ieee80211_vap_setup()
558 ifp->if_get_counter = ieee80211_get_counter; in ieee80211_vap_setup()
560 vap->iv_ifp = ifp; in ieee80211_vap_setup()
561 vap->iv_ic = ic; in ieee80211_vap_setup()
562 vap->iv_flags = ic->ic_flags; /* propagate common flags */ in ieee80211_vap_setup()
563 vap->iv_flags_ext = ic->ic_flags_ext; in ieee80211_vap_setup()
564 vap->iv_flags_ven = ic->ic_flags_ven; in ieee80211_vap_setup()
565 vap->iv_caps = ic->ic_caps &~ IEEE80211_C_OPMODE; in ieee80211_vap_setup()
567 /* 11n capabilities - XXX methodize */ in ieee80211_vap_setup()
568 vap->iv_htcaps = ic->ic_htcaps; in ieee80211_vap_setup()
569 vap->iv_htextcaps = ic->ic_htextcaps; in ieee80211_vap_setup()
571 /* 11ac capabilities - XXX methodize */ in ieee80211_vap_setup()
572 vap->iv_vht_cap.vht_cap_info = ic->ic_vht_cap.vht_cap_info; in ieee80211_vap_setup()
573 vap->iv_vhtextcaps = ic->ic_vhtextcaps; in ieee80211_vap_setup()
575 vap->iv_opmode = opmode; in ieee80211_vap_setup()
576 vap->iv_caps |= ieee80211_opcap[opmode]; in ieee80211_vap_setup()
577 IEEE80211_ADDR_COPY(vap->iv_myaddr, ic->ic_macaddr); in ieee80211_vap_setup()
583 * For non-legacy operation the station must associate in ieee80211_vap_setup()
588 IEEE80211_ADDR_COPY(vap->iv_des_bssid, bssid); in ieee80211_vap_setup()
589 vap->iv_flags |= IEEE80211_F_DESBSSID; in ieee80211_vap_setup()
591 vap->iv_flags_ext |= IEEE80211_FEXT_WDSLEGACY; in ieee80211_vap_setup()
597 KASSERT(ic->ic_caps & IEEE80211_C_TDMA, in ieee80211_vap_setup()
598 ("not TDMA capable, ic_caps 0x%x", ic->ic_caps)); in ieee80211_vap_setup()
604 vap->iv_caps |= IEEE80211_C_TDMA; in ieee80211_vap_setup()
611 /* auto-enable s/w beacon miss support */ in ieee80211_vap_setup()
613 vap->iv_flags_ext |= IEEE80211_FEXT_SWBMISS; in ieee80211_vap_setup()
614 /* auto-generated or user supplied MAC address */ in ieee80211_vap_setup()
616 vap->iv_flags_ext |= IEEE80211_FEXT_UNIQMAC; in ieee80211_vap_setup()
621 if (vap->iv_caps & IEEE80211_C_WME) in ieee80211_vap_setup()
622 vap->iv_flags |= IEEE80211_F_WME; in ieee80211_vap_setup()
623 if (vap->iv_caps & IEEE80211_C_BURST) in ieee80211_vap_setup()
624 vap->iv_flags |= IEEE80211_F_BURST; in ieee80211_vap_setup()
626 if (vap->iv_opmode == IEEE80211_M_STA && in ieee80211_vap_setup()
627 (vap->iv_caps & IEEE80211_C_BGSCAN)) in ieee80211_vap_setup()
628 vap->iv_flags |= IEEE80211_F_BGSCAN; in ieee80211_vap_setup()
629 vap->iv_flags |= IEEE80211_F_DOTH; /* XXX no cap, just ena */ in ieee80211_vap_setup()
631 if (vap->iv_opmode == IEEE80211_M_HOSTAP && in ieee80211_vap_setup()
632 (vap->iv_caps & IEEE80211_C_DFS)) in ieee80211_vap_setup()
633 vap->iv_flags_ext |= IEEE80211_FEXT_DFS; in ieee80211_vap_setup()
634 /* NB: only flip on U-APSD for hostap/sta for now */ in ieee80211_vap_setup()
635 if ((vap->iv_opmode == IEEE80211_M_STA) in ieee80211_vap_setup()
636 || (vap->iv_opmode == IEEE80211_M_HOSTAP)) { in ieee80211_vap_setup()
637 if (vap->iv_caps & IEEE80211_C_UAPSD) in ieee80211_vap_setup()
638 vap->iv_flags_ext |= IEEE80211_FEXT_UAPSD; in ieee80211_vap_setup()
641 vap->iv_des_chan = IEEE80211_CHAN_ANYC; /* any channel is ok */ in ieee80211_vap_setup()
642 vap->iv_bmissthreshold = IEEE80211_HWBMISS_DEFAULT; in ieee80211_vap_setup()
643 vap->iv_dtim_period = IEEE80211_DTIM_DEFAULT; in ieee80211_vap_setup()
648 vap->iv_reset = default_reset; in ieee80211_vap_setup()
654 vap->iv_update_deftxkey = default_update_deftxkey; in ieee80211_vap_setup()
684 struct ifnet *ifp = vap->iv_ifp; in ieee80211_vap_attach()
685 struct ieee80211com *ic = vap->iv_ic; in ieee80211_vap_attach()
691 __func__, ieee80211_opmode_name[vap->iv_opmode], in ieee80211_vap_attach()
692 ic->ic_name, vap->iv_flags, vap->iv_flags_ext); in ieee80211_vap_attach()
701 maxrate = ieee80211_media_setup(ic, &vap->iv_media, vap->iv_caps, in ieee80211_vap_attach()
702 vap->iv_opmode == IEEE80211_M_STA, media_change, media_stat); in ieee80211_vap_attach()
705 ifmedia_set(&vap->iv_media, in ieee80211_vap_attach()
708 ifp->if_baudrate = IF_Mbps(maxrate); in ieee80211_vap_attach()
714 vap->iv_output = ifp->if_output; in ieee80211_vap_attach()
715 ifp->if_output = ieee80211_output; in ieee80211_vap_attach()
719 TAILQ_INSERT_TAIL(&ic->ic_vaps, vap, iv_next); in ieee80211_vap_attach()
750 struct ieee80211com *ic = vap->iv_ic; in ieee80211_vap_detach()
751 struct ifnet *ifp = vap->iv_ifp; in ieee80211_vap_detach()
754 CURVNET_SET(ifp->if_vnet); in ieee80211_vap_detach()
757 __func__, ieee80211_opmode_name[vap->iv_opmode], ic->ic_name); in ieee80211_vap_detach()
768 ieee80211_draintask(ic, &vap->iv_nstate_task[i]); in ieee80211_vap_detach()
769 ieee80211_draintask(ic, &vap->iv_swbmiss_task); in ieee80211_vap_detach()
770 ieee80211_draintask(ic, &vap->iv_wme_task); in ieee80211_vap_detach()
771 ieee80211_draintask(ic, &ic->ic_parent_task); in ieee80211_vap_detach()
773 /* XXX band-aid until ifnet handles this for us */ in ieee80211_vap_detach()
774 taskqueue_drain(taskqueue_swi, &ifp->if_linktask); in ieee80211_vap_detach()
777 KASSERT(vap->iv_state == IEEE80211_S_INIT , ("vap still running")); in ieee80211_vap_detach()
778 TAILQ_REMOVE(&ic->ic_vaps, vap, iv_next); in ieee80211_vap_detach()
798 if (vap->iv_ifflags & IFF_PROMISC) in ieee80211_vap_detach()
800 if (vap->iv_ifflags & IFF_ALLMULTI) in ieee80211_vap_detach()
804 ifmedia_removeall(&vap->iv_media); in ieee80211_vap_detach()
833 struct ieee80211com *ic = vap->iv_ic; in ieee80211_promisc()
838 if (++ic->ic_promisc == 1) in ieee80211_promisc()
839 ieee80211_runtask(ic, &ic->ic_promisc_task); in ieee80211_promisc()
841 KASSERT(ic->ic_promisc > 0, ("%s: ic %p not promisc", in ieee80211_promisc()
843 if (--ic->ic_promisc == 0) in ieee80211_promisc()
844 ieee80211_runtask(ic, &ic->ic_promisc_task); in ieee80211_promisc()
855 struct ieee80211com *ic = vap->iv_ic; in ieee80211_allmulti()
860 if (++ic->ic_allmulti == 1) in ieee80211_allmulti()
861 ieee80211_runtask(ic, &ic->ic_mcast_task); in ieee80211_allmulti()
863 KASSERT(ic->ic_allmulti > 0, ("%s: ic %p not allmulti", in ieee80211_allmulti()
865 if (--ic->ic_allmulti == 0) in ieee80211_allmulti()
866 ieee80211_runtask(ic, &ic->ic_mcast_task); in ieee80211_allmulti()
884 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) in ieee80211_syncflag_locked()
885 if (vap->iv_flags & flag) { in ieee80211_syncflag_locked()
890 ic->ic_flags |= flag; in ieee80211_syncflag_locked()
892 ic->ic_flags &= ~flag; in ieee80211_syncflag_locked()
898 struct ieee80211com *ic = vap->iv_ic; in ieee80211_syncflag()
902 flag = -flag; in ieee80211_syncflag()
903 vap->iv_flags &= ~flag; in ieee80211_syncflag()
905 vap->iv_flags |= flag; in ieee80211_syncflag()
924 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) in ieee80211_syncflag_ht_locked()
925 if (vap->iv_flags_ht & flag) { in ieee80211_syncflag_ht_locked()
930 ic->ic_flags_ht |= flag; in ieee80211_syncflag_ht_locked()
932 ic->ic_flags_ht &= ~flag; in ieee80211_syncflag_ht_locked()
938 struct ieee80211com *ic = vap->iv_ic; in ieee80211_syncflag_ht()
942 flag = -flag; in ieee80211_syncflag_ht()
943 vap->iv_flags_ht &= ~flag; in ieee80211_syncflag_ht()
945 vap->iv_flags_ht |= flag; in ieee80211_syncflag_ht()
964 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) in ieee80211_syncflag_vht_locked()
965 if (vap->iv_vht_flags & flag) { in ieee80211_syncflag_vht_locked()
970 ic->ic_vht_flags |= flag; in ieee80211_syncflag_vht_locked()
972 ic->ic_vht_flags &= ~flag; in ieee80211_syncflag_vht_locked()
978 struct ieee80211com *ic = vap->iv_ic; in ieee80211_syncflag_vht()
982 flag = -flag; in ieee80211_syncflag_vht()
983 vap->iv_vht_flags &= ~flag; in ieee80211_syncflag_vht()
985 vap->iv_vht_flags |= flag; in ieee80211_syncflag_vht()
1004 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) in ieee80211_syncflag_ext_locked()
1005 if (vap->iv_flags_ext & flag) { in ieee80211_syncflag_ext_locked()
1010 ic->ic_flags_ext |= flag; in ieee80211_syncflag_ext_locked()
1012 ic->ic_flags_ext &= ~flag; in ieee80211_syncflag_ext_locked()
1018 struct ieee80211com *ic = vap->iv_ic; in ieee80211_syncflag_ext()
1022 flag = -flag; in ieee80211_syncflag_ext()
1023 vap->iv_flags_ext &= ~flag; in ieee80211_syncflag_ext()
1025 vap->iv_flags_ext |= flag; in ieee80211_syncflag_ext()
1041 return (freq - 906*10) / 5; in mapgsm()
1047 return 37 + ((freq * 10) + ((freq % 5) == 2 ? 5 : 0) - 49400) / 5; in mappsb()
1051 * Convert MHz frequency to IEEE channel number.
1063 return ((int) freq - 2407) / 5; in ieee80211_mhz2ieee()
1065 return 15 + ((freq - 2512) / 20); in ieee80211_mhz2ieee()
1071 return (freq - 4000) / 5; in ieee80211_mhz2ieee()
1073 return (freq - 5000) / 5; in ieee80211_mhz2ieee()
1080 return ((int) freq - 2407) / 5; in ieee80211_mhz2ieee()
1086 return (freq - 4000) / 5; in ieee80211_mhz2ieee()
1088 return 15 + ((freq - 2512) / 20); in ieee80211_mhz2ieee()
1090 return (freq - 5000) / 5; in ieee80211_mhz2ieee()
1096 * Convert channel to IEEE channel number.
1105 return (c == IEEE80211_CHAN_ANYC ? IEEE80211_CHAN_ANY : c->ic_ieee); in ieee80211_chan2ieee()
1109 * Convert IEEE channel number to MHz frequency.
1122 return 2512 + ((chan-15)*20); in ieee80211_ieee2mhz()
1125 chan -= 37; in ieee80211_ieee2mhz()
1130 /* XXX can't distinguish PSB+GSM channels */ in ieee80211_ieee2mhz()
1133 if (chan < 14) /* 0-13 */ in ieee80211_ieee2mhz()
1135 if (chan < 27) /* 15-26 */ in ieee80211_ieee2mhz()
1136 return 2512 + ((chan-15)*20); in ieee80211_ieee2mhz()
1146 * IEEE Std 802.11-2012, page 1738, subclause 20.3.15.4: in set_extchan()
1147 * "the secondary channel number shall be 'N + [1,-1] * 4' in set_extchan()
1149 if (c->ic_flags & IEEE80211_CHAN_HT40U) in set_extchan()
1150 c->ic_extieee = c->ic_ieee + 4; in set_extchan()
1151 else if (c->ic_flags & IEEE80211_CHAN_HT40D) in set_extchan()
1152 c->ic_extieee = c->ic_ieee - 4; in set_extchan()
1154 c->ic_extieee = 0; in set_extchan()
1158 * Populate the freq1/freq2 fields as appropriate for VHT channels.
1160 * This for now uses a hard-coded list of 80MHz wide channels.
1166 * 80/160MHz wide channels, so we just use those.
1168 * This is all likely very very wrong - both the regulatory code
1169 * and this code needs to ensure that all four channels are
1207 __func__, c->ic_ieee, c->ic_flags); in set_vht_extchan()
1212 if (c->ic_freq >= vht160_chan_ranges[i].freq_start && in set_vht_extchan()
1213 c->ic_freq < vht160_chan_ranges[i].freq_end) { in set_vht_extchan()
1217 c->ic_vht_ch_freq1 = in set_vht_extchan()
1218 ieee80211_mhz2ieee(midpoint, c->ic_flags); in set_vht_extchan()
1219 c->ic_vht_ch_freq2 = 0; in set_vht_extchan()
1222 __func__, c->ic_ieee, c->ic_freq, midpoint, in set_vht_extchan()
1223 c->ic_vht_ch_freq1, c->ic_vht_ch_freq2); in set_vht_extchan()
1233 if (c->ic_freq >= vht80_chan_ranges[i].freq_start && in set_vht_extchan()
1234 c->ic_freq < vht80_chan_ranges[i].freq_end) { in set_vht_extchan()
1238 c->ic_vht_ch_freq1 = in set_vht_extchan()
1239 ieee80211_mhz2ieee(midpoint, c->ic_flags); in set_vht_extchan()
1240 c->ic_vht_ch_freq2 = 0; in set_vht_extchan()
1243 __func__, c->ic_ieee, c->ic_freq, midpoint, in set_vht_extchan()
1244 c->ic_vht_ch_freq1, c->ic_vht_ch_freq2); in set_vht_extchan()
1254 c->ic_vht_ch_freq1 = c->ic_ieee + 2; in set_vht_extchan()
1256 c->ic_vht_ch_freq1 = c->ic_ieee - 2; in set_vht_extchan()
1263 c->ic_vht_ch_freq1 = c->ic_ieee; in set_vht_extchan()
1268 __func__, c->ic_ieee, c->ic_flags); in set_vht_extchan()
1320 c->ic_ieee = ieee; in addchan()
1321 c->ic_freq = freq != 0 ? freq : ieee80211_ieee2mhz(ieee, flags); in addchan()
1322 c->ic_maxregpower = maxregpower; in addchan()
1323 c->ic_maxpower = 2 * maxregpower; in addchan()
1324 c->ic_flags = flags; in addchan()
1325 c->ic_vht_ch_freq1 = 0; in addchan()
1326 c->ic_vht_ch_freq2 = 0; in addchan()
1350 c[0] = c[-1]; in copychan_prev()
1351 c->ic_flags = flags; in copychan_prev()
1352 c->ic_vht_ch_freq1 = 0; in copychan_prev()
1353 c->ic_vht_ch_freq2 = 0; in copychan_prev()
1361 * XXX VHT-2GHz
1472 * channels if you have any B/G/N band bit set.
1517 if (c->ic_freq == freq && in findchannel()
1518 (c->ic_flags & IEEE80211_CHAN_ALLTURBO) == flags) in findchannel()
1552 error = addchan(chans, maxchans, nchans, cent->ic_ieee, cent->ic_freq, in ieee80211_add_channel_ht40()
1557 error = addchan(chans, maxchans, nchans, extc->ic_ieee, extc->ic_freq, in ieee80211_add_channel_ht40()
1570 return (c->ic_freq); in ieee80211_get_channel_center_freq()
1576 * For 5, 10, 20MHz channels it'll be the normally configured channel
1579 * For 40MHz, 80MHz, 160MHz channels it will be the centre of the
1582 * For 80+80MHz channels this will be the centre of the primary
1590 * VHT - use the pre-calculated centre frequency in ieee80211_get_channel_center_freq1()
1594 return (ieee80211_ieee2mhz(c->ic_vht_ch_freq1, c->ic_flags)); in ieee80211_get_channel_center_freq1()
1597 return (c->ic_freq + 10); in ieee80211_get_channel_center_freq1()
1600 return (c->ic_freq - 10); in ieee80211_get_channel_center_freq1()
1603 return (c->ic_freq); in ieee80211_get_channel_center_freq1()
1613 if (IEEE80211_IS_CHAN_VHT(c) && (c->ic_vht_ch_freq2 != 0)) in ieee80211_get_channel_center_freq2()
1614 return (ieee80211_ieee2mhz(c->ic_vht_ch_freq2, c->ic_flags)); in ieee80211_get_channel_center_freq2()
1620 * Adds channels into specified channel list (ieee[] array must be sorted).
1621 * Channels are already sorted.
1636 * + HT40 and VHT40 channels occur together, so in add_chanlist()
1658 * + the other 3 channels in the list are actually in add_chanlist()
1685 freq - 20 != in add_chanlist()
1686 ieee80211_ieee2mhz(ieee[i] - 4, flags[j])) in add_chanlist()
1700 if (i == nieee - 1 || in add_chanlist()
1701 ieee[i] + 4 > ieee[nieee - 1] || in add_chanlist()
1752 * XXX-BZ with HT and VHT there is no 1:1 mapping anymore. Review all in ieee80211_add_channel_list_5ghz()
1766 * channels--as happens with dynamic turbo.
1774 c = ic->ic_prevchan; in ieee80211_find_channel()
1775 if (c != NULL && c->ic_freq == freq && in ieee80211_find_channel()
1776 (c->ic_flags & IEEE80211_CHAN_ALLTURBO) == flags) in ieee80211_find_channel()
1779 return (findchannel(ic->ic_channels, ic->ic_nchans, freq, flags)); in ieee80211_find_channel()
1785 * channels--as happens with dynamic turbo.
1794 c = ic->ic_prevchan; in ieee80211_find_channel_byieee()
1795 if (c != NULL && c->ic_ieee == ieee && in ieee80211_find_channel_byieee()
1796 (c->ic_flags & IEEE80211_CHAN_ALLTURBO) == flags) in ieee80211_find_channel_byieee()
1799 for (i = 0; i < ic->ic_nchans; i++) { in ieee80211_find_channel_byieee()
1800 c = &ic->ic_channels[i]; in ieee80211_find_channel_byieee()
1801 if (c->ic_ieee == ieee && in ieee80211_find_channel_byieee()
1802 (c->ic_flags & IEEE80211_CHAN_ALLTURBO) == flags) in ieee80211_find_channel_byieee()
1816 * but it will not be enough for GSM, PSB channels and the
1817 * like. It also doesn't know about legacy-turbog and
1818 * legacy-turbo modes, which some offload NICs actually
1830 struct ieee80211com *ic = vap->iv_ic; in ieee80211_lookup_channel_rxstatus()
1842 if ((rxs->r_flags & IEEE80211_R_FREQ) == 0) in ieee80211_lookup_channel_rxstatus()
1844 if ((rxs->r_flags & IEEE80211_R_IEEE) == 0) in ieee80211_lookup_channel_rxstatus()
1846 if ((rxs->r_flags & IEEE80211_R_BAND) == 0) in ieee80211_lookup_channel_rxstatus()
1853 * Offload NICs will pass up beacons from all channels in ieee80211_lookup_channel_rxstatus()
1858 switch (rxs->c_band) { in ieee80211_lookup_channel_rxstatus()
1866 if (rxs->c_freq < 3000) { in ieee80211_lookup_channel_rxstatus()
1875 c = ieee80211_find_channel(ic, rxs->c_freq, flags); in ieee80211_lookup_channel_rxstatus()
1879 __func__, (int) rxs->c_freq, (int) rxs->c_ieee, flags, c); in ieee80211_lookup_channel_rxstatus()
1951 if (isclr(ic->ic_modecaps, mode)) in ieee80211_media_setup()
1956 rs = &ic->ic_sup_rates[mode]; in ieee80211_media_setup()
1957 for (i = 0; i < rs->rs_nrates; i++) { in ieee80211_media_setup()
1958 rate = rs->rs_rates[i]; in ieee80211_media_setup()
1997 if (isclr(ic->ic_modecaps, mode)) in ieee80211_media_setup()
2002 if (isset(ic->ic_modecaps, IEEE80211_MODE_11NA) || in ieee80211_media_setup()
2003 isset(ic->ic_modecaps, IEEE80211_MODE_11NG)) { in ieee80211_media_setup()
2006 i = ic->ic_txstream * 8 - 1; in ieee80211_media_setup()
2007 if ((ic->ic_htcaps & IEEE80211_HTCAP_CHWIDTH40) && in ieee80211_media_setup()
2008 (ic->ic_htcaps & IEEE80211_HTCAP_SHORTGI40)) in ieee80211_media_setup()
2010 else if ((ic->ic_htcaps & IEEE80211_HTCAP_CHWIDTH40)) in ieee80211_media_setup()
2012 else if ((ic->ic_htcaps & IEEE80211_HTCAP_SHORTGI20)) in ieee80211_media_setup()
2022 * XXX-BZ skip "VHT_2GHZ" for now. in ieee80211_media_setup()
2026 if (isclr(ic->ic_modecaps, mode)) in ieee80211_media_setup()
2031 if (isset(ic->ic_modecaps, IEEE80211_MODE_VHT_5GHZ)) { in ieee80211_media_setup()
2046 return &ic->ic_sup_rates[ieee80211_chan2mode(c)]; in ieee80211_get_suprates()
2054 return &ic->ic_sup_htrates; in ieee80211_get_suphtrates()
2067 if (isclr(ic->ic_modecaps, mode)) in ieee80211_announce()
2070 rs = &ic->ic_sup_rates[mode]; in ieee80211_announce()
2071 for (i = 0; i < rs->rs_nrates; i++) { in ieee80211_announce()
2072 tn = IEEE80211_NODE_TXRATE_INIT_LEGACY(rs->rs_rates[i]); in ieee80211_announce()
2094 for (i = 0; i < ic->ic_nchans; i++) { in ieee80211_announce_channels()
2095 c = &ic->ic_channels[i]; in ieee80211_announce_channels()
2121 , c->ic_ieee, c->ic_freq, type in ieee80211_announce_channels()
2124 IEEE80211_IS_CHAN_HT40D(c) ? '-' : ' ' in ieee80211_announce_channels()
2125 , c->ic_maxregpower in ieee80211_announce_channels()
2126 , c->ic_minpower / 2, c->ic_minpower & 1 ? 5 : 0 in ieee80211_announce_channels()
2127 , c->ic_maxpower / 2, c->ic_maxpower & 1 ? 5 : 0 in ieee80211_announce_channels()
2135 switch (IFM_MODE(ime->ifm_media)) { in media2mode()
2170 if (ime->ifm_media & IFM_IEEE80211_TURBO) { in media2mode()
2181 /* XXX HT40 +/- */ in media2mode()
2191 struct ieee80211vap *vap = ifp->if_softc; in ieee80211_media_change()
2192 struct ifmedia_entry *ime = vap->iv_media.ifm_cur; in ieee80211_media_change()
2195 if (!media2mode(ime, vap->iv_flags, &newmode)) in ieee80211_media_change()
2197 if (vap->iv_des_mode != newmode) { in ieee80211_media_change()
2198 vap->iv_des_mode = newmode; in ieee80211_media_change()
2269 struct ieee80211vap *vap = ifp->if_softc; in ieee80211_media_status()
2270 struct ieee80211com *ic = vap->iv_ic; in ieee80211_media_status()
2274 imr->ifm_status = IFM_AVALID; in ieee80211_media_status()
2280 if (vap->iv_state == IEEE80211_S_RUN || in ieee80211_media_status()
2281 vap->iv_state == IEEE80211_S_SLEEP) { in ieee80211_media_status()
2282 imr->ifm_status |= IFM_ACTIVE; in ieee80211_media_status()
2283 mode = ieee80211_chan2mode(ic->ic_curchan); in ieee80211_media_status()
2286 imr->ifm_active = media_status(vap->iv_opmode, ic->ic_curchan); in ieee80211_media_status()
2290 if (vap->iv_txparms[mode].ucastrate != IEEE80211_FIXED_RATE_NONE) { in ieee80211_media_status()
2295 vap->iv_txparms[mode].ucastrate); in ieee80211_media_status()
2296 imr->ifm_active |= ieee80211_rate2media(ic, &tn, mode); in ieee80211_media_status()
2297 } else if (vap->iv_opmode == IEEE80211_M_STA) { in ieee80211_media_status()
2301 ieee80211_node_get_txrate(vap->iv_bss, &tn); in ieee80211_media_status()
2302 imr->ifm_active |= ieee80211_rate2media(ic, &tn, mode); in ieee80211_media_status()
2304 imr->ifm_active |= IFM_AUTO; in ieee80211_media_status()
2305 if (imr->ifm_status & IFM_ACTIVE) in ieee80211_media_status()
2306 imr->ifm_current = imr->ifm_active; in ieee80211_media_status()
2311 * set based on the available channels for this mode. Also
2325 ieee80211_setbasicrates(&ic->ic_sup_rates[mode], mode); in ieee80211_setmode()
2327 ic->ic_curmode = mode; in ieee80211_setmode()
2369 __func__, chan->ic_freq, chan->ic_flags); in ieee80211_chan2mode()
2390 * Convert IEEE80211 rate value to ifmedia subtype.
2533 if (tr->type == IEEE80211_NODE_TXRATE_VHT) { in ieee80211_rate2media()
2534 m = findmedia(vhtrates, nitems(vhtrates), tr->mcs); in ieee80211_rate2media()
2540 if (tr->type == IEEE80211_NODE_TXRATE_HT) { in ieee80211_rate2media()
2542 tr->dot11rate & ~IEEE80211_RATE_MCS); in ieee80211_rate2media()
2548 if (tr->type == IEEE80211_NODE_TXRATE_HT) { in ieee80211_rate2media()
2550 tr->dot11rate & ~IEEE80211_RATE_MCS); in ieee80211_rate2media()
2560 if ((tr->type != IEEE80211_NODE_TXRATE_LEGACY) && in ieee80211_rate2media()
2561 (tr->type != IEEE80211_NODE_TXRATE_HT)) in ieee80211_rate2media()
2563 rate = tr->dot11rate & IEEE80211_RATE_VAL; in ieee80211_rate2media()
2582 if (ic != NULL && ic->ic_phytype == IEEE80211_T_FH) in ieee80211_rate2media()
2603 -1, /* IFM_AUTO */ in ieee80211_media2rate()
2627 -1, /* IFM_IEEE80211_MCS */ in ieee80211_media2rate()
2628 -1, /* IFM_IEEE80211_VHT */ in ieee80211_media2rate()
2640 a -= b; a -= c; a ^= (c >> 13); \
2641 b -= c; b -= a; b ^= (a << 8); \
2642 c -= a; c -= b; c ^= (b >> 13); \
2643 a -= b; a -= c; a ^= (c >> 12); \
2644 b -= c; b -= a; b ^= (a << 16); \
2645 c -= a; c -= b; c ^= (b >> 5); \
2646 a -= b; a -= c; a ^= (c >> 3); \
2647 b -= c; b -= a; b ^= (a << 10); \
2648 c -= a; c -= b; c ^= (b >> 15); \
2655 uint32_t a = 0x9e3779b9, b = 0x9e3779b9, c = ic->ic_hash_key; in ieee80211_mac_hash()
2704 return (&vap->iv_nw_keys[0] <= key && in ieee80211_is_key_global()
2705 key < &vap->iv_nw_keys[IEEE80211_WEP_NKID]); in ieee80211_is_key_global()
2716 * This is a short-cut for now; eventually we will need in ieee80211_is_key_unicast()
2739 const struct ieee80211vap *vap = ni->ni_vap; in ieee80211_is_ctl_frame_for_vap()
2744 subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; in ieee80211_is_ctl_frame_for_vap()
2748 __func__, wh->i_fc[0])); in ieee80211_is_ctl_frame_for_vap()
2752 __func__, wh->i_fc[0]); in ieee80211_is_ctl_frame_for_vap()
2764 * Verify TA matches ni->ni_macaddr; for unknown in ieee80211_is_ctl_frame_for_vap()
2765 * sources it will be the BSS node and ni->ni_macaddr in ieee80211_is_ctl_frame_for_vap()
2768 if (!IEEE80211_ADDR_EQ(wh->i_addr2, ni->ni_macaddr)) in ieee80211_is_ctl_frame_for_vap()
2774 return (IEEE80211_ADDR_EQ(wh->i_addr1, vap->iv_myaddr)); in ieee80211_is_ctl_frame_for_vap()