Lines Matching full:ic
94 static void ieee80211_syncflag_locked(struct ieee80211com *ic, int flag);
95 static void ieee80211_syncflag_ht_locked(struct ieee80211com *ic, int flag);
96 static void ieee80211_syncflag_ext_locked(struct ieee80211com *ic, int flag);
97 static void ieee80211_syncflag_vht_locked(struct ieee80211com *ic, int flag);
98 static int ieee80211_media_setup(struct ieee80211com *ic,
132 ieee80211_chan_init(struct ieee80211com *ic)
135 if (ic->ic_sup_rates[m].rs_nrates == 0) \
136 ic->ic_sup_rates[m] = def; \
141 KASSERT(0 < ic->ic_nchans && ic->ic_nchans <= IEEE80211_CHAN_MAX,
142 ("invalid number of channels specified: %u", ic->ic_nchans));
143 memset(ic->ic_chan_avail, 0, sizeof(ic->ic_chan_avail));
144 memset(ic->ic_modecaps, 0, sizeof(ic->ic_modecaps));
145 setbit(ic->ic_modecaps, IEEE80211_MODE_AUTO);
146 for (i = 0; i < ic->ic_nchans; i++) {
147 c = &ic->ic_channels[i];
177 setbit(ic->ic_chan_avail, c->ic_ieee);
182 setbit(ic->ic_modecaps, IEEE80211_MODE_11A);
184 setbit(ic->ic_modecaps, IEEE80211_MODE_11B);
186 setbit(ic->ic_modecaps, IEEE80211_MODE_11G);
188 setbit(ic->ic_modecaps, IEEE80211_MODE_FH);
190 setbit(ic->ic_modecaps, IEEE80211_MODE_TURBO_A);
192 setbit(ic->ic_modecaps, IEEE80211_MODE_TURBO_G);
194 setbit(ic->ic_modecaps, IEEE80211_MODE_STURBO_A);
196 setbit(ic->ic_modecaps, IEEE80211_MODE_HALF);
198 setbit(ic->ic_modecaps, IEEE80211_MODE_QUARTER);
200 setbit(ic->ic_modecaps, IEEE80211_MODE_11NA);
202 setbit(ic->ic_modecaps, IEEE80211_MODE_11NG);
204 setbit(ic->ic_modecaps, IEEE80211_MODE_VHT_5GHZ);
206 setbit(ic->ic_modecaps, IEEE80211_MODE_VHT_2GHZ);
209 memcpy(ic->ic_chan_active, ic->ic_chan_avail,
210 sizeof(ic->ic_chan_avail));
213 ieee80211_sort_channels(ic->ic_channels, ic->ic_nchans);
216 ic->ic_bsschan = IEEE80211_CHAN_ANYC;
217 ic->ic_prevchan = NULL;
218 ic->ic_csa_newchan = NULL;
220 ic->ic_curchan = &ic->ic_channels[0];
221 ic->ic_rt = ieee80211_get_ratetable(ic->ic_curchan);
241 if (ic->ic_rxstream == 0)
242 ic->ic_rxstream = 2;
243 if (ic->ic_txstream == 0)
244 ic->ic_txstream = 2;
246 ieee80211_init_suphtrates(ic);
251 (void) ieee80211_setmode(ic, IEEE80211_MODE_AUTO);
256 null_update_mcast(struct ieee80211com *ic)
259 ic_printf(ic, "need multicast update callback\n");
263 null_update_promisc(struct ieee80211com *ic)
266 ic_printf(ic, "need promiscuous mode update callback\n");
270 null_update_chw(struct ieee80211com *ic)
273 ic_printf(ic, "%s: need callback\n", __func__);
277 ic_printf(struct ieee80211com *ic, const char * fmt, ...)
282 retval = printf("%s: ", ic->ic_name);
296 struct ieee80211com *ic;
308 LIST_FOREACH(ic, &ic_head, ic_next) {
309 sbuf_printf(&sb, "%s%s", sp, ic->ic_name);
327 ieee80211_ifattach(struct ieee80211com *ic)
330 IEEE80211_LOCK_INIT(ic, ic->ic_name);
331 IEEE80211_TX_LOCK_INIT(ic, ic->ic_name);
332 TAILQ_INIT(&ic->ic_vaps);
335 ic->ic_tq = taskqueue_create("ic_taskq",
337 taskqueue_thread_enqueue, &ic->ic_tq);
338 taskqueue_start_threads(&ic->ic_tq, 1, PI_NET, "%s net80211 taskq",
339 ic->ic_name);
340 ic->ic_ierrors = counter_u64_alloc(IEEE80211_M_WAITOK);
341 ic->ic_oerrors = counter_u64_alloc(IEEE80211_M_WAITOK);
347 ieee80211_chan_init(ic);
349 ic->ic_update_mcast = null_update_mcast;
350 ic->ic_update_promisc = null_update_promisc;
351 ic->ic_update_chw = null_update_chw;
353 ic->ic_hash_key = arc4random();
354 ic->ic_bintval = IEEE80211_BINTVAL_DEFAULT;
355 ic->ic_lintval = ic->ic_bintval;
356 ic->ic_txpowlimit = IEEE80211_TXPOWER_MAX;
358 ieee80211_crypto_attach(ic);
359 ieee80211_node_attach(ic);
360 ieee80211_power_attach(ic);
361 ieee80211_proto_attach(ic);
363 ieee80211_superg_attach(ic);
365 ieee80211_ht_attach(ic);
366 ieee80211_vht_attach(ic);
367 ieee80211_scan_attach(ic);
368 ieee80211_regdomain_attach(ic);
369 ieee80211_dfs_attach(ic);
371 ieee80211_sysctl_attach(ic);
374 LIST_INSERT_HEAD(&ic_head, ic, ic_next);
385 ieee80211_ifdetach(struct ieee80211com *ic)
395 if (ic->ic_tq == NULL)
399 LIST_REMOVE(ic, ic_next);
402 taskqueue_drain(taskqueue_thread, &ic->ic_restart_task);
408 while ((vap = TAILQ_FIRST(&ic->ic_vaps)) != NULL) {
412 ieee80211_waitfor_parent(ic);
414 ieee80211_sysctl_detach(ic);
415 ieee80211_dfs_detach(ic);
416 ieee80211_regdomain_detach(ic);
417 ieee80211_scan_detach(ic);
419 ieee80211_superg_detach(ic);
421 ieee80211_vht_detach(ic);
422 ieee80211_ht_detach(ic);
424 ieee80211_proto_detach(ic);
425 ieee80211_crypto_detach(ic);
426 ieee80211_power_detach(ic);
427 ieee80211_node_detach(ic);
429 counter_u64_free(ic->ic_ierrors);
430 counter_u64_free(ic->ic_oerrors);
432 taskqueue_free(ic->ic_tq);
433 IEEE80211_TX_LOCK_DESTROY(ic);
434 IEEE80211_LOCK_DESTROY(ic);
442 ieee80211_set_software_ciphers(struct ieee80211com *ic,
445 ieee80211_crypto_set_supported_software_ciphers(ic, cipher_suite);
453 ieee80211_set_hardware_ciphers(struct ieee80211com *ic,
456 ieee80211_crypto_set_supported_hardware_ciphers(ic, cipher_suite);
464 ieee80211_set_driver_keymgmt_suites(struct ieee80211com *ic,
467 ieee80211_crypto_set_supported_driver_keymgmt(ic,
474 struct ieee80211com *ic;
477 LIST_FOREACH(ic, &ic_head, ic_next)
478 if (strcmp(ic->ic_name, name) == 0)
482 return (ic);
488 struct ieee80211com *ic;
491 LIST_FOREACH(ic, &ic_head, ic_next)
492 (*f)(arg, ic);
534 struct ieee80211com *ic = vap->iv_ic;
540 rv += counter_u64_fetch(ic->ic_oerrors);
543 rv += counter_u64_fetch(ic->ic_ierrors);
558 ieee80211_vap_setup(struct ieee80211com *ic, struct ieee80211vap *vap,
575 vap->iv_ic = ic;
576 vap->iv_flags = ic->ic_flags; /* propagate common flags */
577 vap->iv_flags_ext = ic->ic_flags_ext;
578 vap->iv_flags_ven = ic->ic_flags_ven;
579 vap->iv_caps = ic->ic_caps &~ IEEE80211_C_OPMODE;
582 vap->iv_htcaps = ic->ic_htcaps;
583 vap->iv_htextcaps = ic->ic_htextcaps;
586 vap->iv_vht_cap.vht_cap_info = ic->ic_vht_cap.vht_cap_info;
587 vap->iv_vhtextcaps = ic->ic_vhtextcaps;
591 IEEE80211_ADDR_COPY(vap->iv_myaddr, ic->ic_macaddr);
611 KASSERT(ic->ic_caps & IEEE80211_C_TDMA,
612 ("not TDMA capable, ic_caps 0x%x", ic->ic_caps));
699 struct ieee80211com *ic = vap->iv_ic;
706 ic->ic_name, vap->iv_flags, vap->iv_flags_ext);
715 maxrate = ieee80211_media_setup(ic, &vap->iv_media, vap->iv_caps,
731 IEEE80211_LOCK(ic);
732 TAILQ_INSERT_TAIL(&ic->ic_vaps, vap, iv_next);
733 ieee80211_syncflag_locked(ic, IEEE80211_F_WME);
735 ieee80211_syncflag_locked(ic, IEEE80211_F_TURBOP);
737 ieee80211_syncflag_locked(ic, IEEE80211_F_PCF);
738 ieee80211_syncflag_locked(ic, IEEE80211_F_BURST);
739 ieee80211_syncflag_ht_locked(ic, IEEE80211_FHT_HT);
740 ieee80211_syncflag_ht_locked(ic, IEEE80211_FHT_USEHT40);
742 ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_VHT);
743 ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT40);
744 ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT80);
745 ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT160);
746 ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT80P80);
747 ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_STBC_TX);
748 ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_STBC_RX);
749 IEEE80211_UNLOCK(ic);
763 struct ieee80211com *ic = vap->iv_ic;
770 __func__, ieee80211_opmode_name[vap->iv_opmode], ic->ic_name);
781 ieee80211_draintask(ic, &vap->iv_nstate_task[i]);
782 ieee80211_draintask(ic, &vap->iv_swbmiss_task);
783 ieee80211_draintask(ic, &vap->iv_wme_task);
784 ieee80211_draintask(ic, &ic->ic_parent_task);
789 IEEE80211_LOCK(ic);
791 TAILQ_REMOVE(&ic->ic_vaps, vap, iv_next);
792 ieee80211_syncflag_locked(ic, IEEE80211_F_WME);
794 ieee80211_syncflag_locked(ic, IEEE80211_F_TURBOP);
796 ieee80211_syncflag_locked(ic, IEEE80211_F_PCF);
797 ieee80211_syncflag_locked(ic, IEEE80211_F_BURST);
798 ieee80211_syncflag_ht_locked(ic, IEEE80211_FHT_HT);
799 ieee80211_syncflag_ht_locked(ic, IEEE80211_FHT_USEHT40);
801 ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_VHT);
802 ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT40);
803 ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT80);
804 ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT160);
805 ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT80P80);
806 ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_STBC_TX);
807 ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_STBC_RX);
810 ieee80211_syncflag_ext_locked(ic, IEEE80211_FEXT_BPF);
815 IEEE80211_UNLOCK(ic);
846 struct ieee80211com *ic = vap->iv_ic;
848 IEEE80211_LOCK_ASSERT(ic);
851 if (++ic->ic_promisc == 1)
852 ieee80211_runtask(ic, &ic->ic_promisc_task);
854 KASSERT(ic->ic_promisc > 0, ("%s: ic %p not promisc",
855 __func__, ic));
856 if (--ic->ic_promisc == 0)
857 ieee80211_runtask(ic, &ic->ic_promisc_task);
868 struct ieee80211com *ic = vap->iv_ic;
870 IEEE80211_LOCK_ASSERT(ic);
873 if (++ic->ic_allmulti == 1)
874 ieee80211_runtask(ic, &ic->ic_mcast_task);
876 KASSERT(ic->ic_allmulti > 0, ("%s: ic %p not allmulti",
877 __func__, ic));
878 if (--ic->ic_allmulti == 0)
879 ieee80211_runtask(ic, &ic->ic_mcast_task);
889 ieee80211_syncflag_locked(struct ieee80211com *ic, int flag)
894 IEEE80211_LOCK_ASSERT(ic);
897 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
903 ic->ic_flags |= flag;
905 ic->ic_flags &= ~flag;
911 struct ieee80211com *ic = vap->iv_ic;
913 IEEE80211_LOCK(ic);
919 ieee80211_syncflag_locked(ic, flag);
920 IEEE80211_UNLOCK(ic);
929 ieee80211_syncflag_ht_locked(struct ieee80211com *ic, int flag)
934 IEEE80211_LOCK_ASSERT(ic);
937 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
943 ic->ic_flags_ht |= flag;
945 ic->ic_flags_ht &= ~flag;
951 struct ieee80211com *ic = vap->iv_ic;
953 IEEE80211_LOCK(ic);
959 ieee80211_syncflag_ht_locked(ic, flag);
960 IEEE80211_UNLOCK(ic);
969 ieee80211_syncflag_vht_locked(struct ieee80211com *ic, int flag)
974 IEEE80211_LOCK_ASSERT(ic);
977 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
983 ic->ic_vht_flags |= flag;
985 ic->ic_vht_flags &= ~flag;
991 struct ieee80211com *ic = vap->iv_ic;
993 IEEE80211_LOCK(ic);
999 ieee80211_syncflag_vht_locked(ic, flag);
1000 IEEE80211_UNLOCK(ic);
1009 ieee80211_syncflag_ext_locked(struct ieee80211com *ic, int flag)
1014 IEEE80211_LOCK_ASSERT(ic);
1017 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
1023 ic->ic_flags_ext |= flag;
1025 ic->ic_flags_ext &= ~flag;
1031 struct ieee80211com *ic = vap->iv_ic;
1033 IEEE80211_LOCK(ic);
1039 ieee80211_syncflag_ext_locked(ic, flag);
1040 IEEE80211_UNLOCK(ic);
1112 ieee80211_chan2ieee(struct ieee80211com *ic, const struct ieee80211_channel *c)
1115 ic_printf(ic, "invalid channel (NULL)\n");
1782 ieee80211_find_channel(struct ieee80211com *ic, int freq, int flags)
1787 c = ic->ic_prevchan;
1792 return (findchannel(ic->ic_channels, ic->ic_nchans, freq, flags));
1801 ieee80211_find_channel_byieee(struct ieee80211com *ic, int ieee, int flags)
1807 c = ic->ic_prevchan;
1812 for (i = 0; i < ic->ic_nchans; i++) {
1813 c = &ic->ic_channels[i];
1834 * Takes the ic and rxstatus; returns the channel or NULL
1843 struct ieee80211com *ic = vap->iv_ic;
1888 c = ieee80211_find_channel(ic, rxs->c_freq, flags);
1923 ADD(ic, mword, mopt); /* STA mode has no cap */
1944 ieee80211_media_setup(struct ieee80211com *ic,
1963 if (isclr(ic->ic_modecaps, mode))
1968 rs = &ic->ic_sup_rates[mode];
1971 mword = ieee80211_rate2media(ic, rate, mode);
1993 mword = ieee80211_rate2media(ic, allrates.rs_rates[i],
2008 if (isclr(ic->ic_modecaps, mode))
2013 if (isset(ic->ic_modecaps, IEEE80211_MODE_11NA) ||
2014 isset(ic->ic_modecaps, IEEE80211_MODE_11NG)) {
2017 i = ic->ic_txstream * 8 - 1;
2018 if ((ic->ic_htcaps & IEEE80211_HTCAP_CHWIDTH40) &&
2019 (ic->ic_htcaps & IEEE80211_HTCAP_SHORTGI40))
2021 else if ((ic->ic_htcaps & IEEE80211_HTCAP_CHWIDTH40))
2023 else if ((ic->ic_htcaps & IEEE80211_HTCAP_SHORTGI20))
2037 if (isclr(ic->ic_modecaps, mode))
2042 if (isset(ic->ic_modecaps, IEEE80211_MODE_VHT_5GHZ)) {
2054 ieee80211_get_suprates(struct ieee80211com *ic, const struct ieee80211_channel *c)
2057 return &ic->ic_sup_rates[ieee80211_chan2mode(c)];
2062 ieee80211_get_suphtrates(struct ieee80211com *ic,
2065 return &ic->ic_sup_htrates;
2069 ieee80211_announce(struct ieee80211com *ic)
2077 if (isclr(ic->ic_modecaps, mode))
2079 ic_printf(ic, "%s rates: ", ieee80211_phymode_name[mode]);
2080 rs = &ic->ic_sup_rates[mode];
2082 mword = ieee80211_rate2media(ic, rs->rs_rates[i], mode);
2091 ieee80211_ht_announce(ic);
2092 ieee80211_vht_announce(ic);
2096 ieee80211_announce_channels(struct ieee80211com *ic)
2103 for (i = 0; i < ic->ic_nchans; i++) {
2104 c = &ic->ic_channels[i];
2279 struct ieee80211com *ic = vap->iv_ic;
2291 mode = ieee80211_chan2mode(ic->ic_curchan);
2294 imr->ifm_active = media_status(vap->iv_opmode, ic->ic_curchan);
2302 imr->ifm_active |= ieee80211_rate2media(ic,
2308 imr->ifm_active |= ieee80211_rate2media(ic,
2323 ieee80211_setmode(struct ieee80211com *ic, enum ieee80211_phymode mode)
2332 ieee80211_setbasicrates(&ic->ic_sup_rates[mode], mode);
2334 ic->ic_curmode = mode;
2335 ieee80211_reset_erp(ic); /* reset global ERP state */
2402 ieee80211_rate2media(struct ieee80211com *ic, int rate, enum ieee80211_phymode mode)
2578 /* NB: ic may be NULL for some drivers */
2579 if (ic != NULL && ic->ic_phytype == IEEE80211_T_FH)
2649 ieee80211_mac_hash(const struct ieee80211com *ic,
2652 uint32_t a = 0x9e3779b9, b = 0x9e3779b9, c = ic->ic_hash_key;