Lines Matching refs:ic

90 static	void ieee80211_syncflag_locked(struct ieee80211com *ic, int flag);
91 static void ieee80211_syncflag_ht_locked(struct ieee80211com *ic, int flag);
92 static void ieee80211_syncflag_ext_locked(struct ieee80211com *ic, int flag);
93 static int ieee80211_media_setup(struct ieee80211com *ic,
125 ieee80211_chan_init(struct ieee80211com *ic)
128 if (ic->ic_sup_rates[m].rs_nrates == 0) \
129 ic->ic_sup_rates[m] = def; \
134 KASSERT(0 < ic->ic_nchans && ic->ic_nchans <= IEEE80211_CHAN_MAX,
135 ("invalid number of channels specified: %u", ic->ic_nchans));
136 memset(ic->ic_chan_avail, 0, sizeof(ic->ic_chan_avail));
137 memset(ic->ic_modecaps, 0, sizeof(ic->ic_modecaps));
138 setbit(ic->ic_modecaps, IEEE80211_MODE_AUTO);
139 for (i = 0; i < ic->ic_nchans; i++) {
140 c = &ic->ic_channels[i];
157 setbit(ic->ic_chan_avail, c->ic_ieee);
162 setbit(ic->ic_modecaps, IEEE80211_MODE_11A);
164 setbit(ic->ic_modecaps, IEEE80211_MODE_11B);
166 setbit(ic->ic_modecaps, IEEE80211_MODE_11G);
168 setbit(ic->ic_modecaps, IEEE80211_MODE_FH);
170 setbit(ic->ic_modecaps, IEEE80211_MODE_TURBO_A);
172 setbit(ic->ic_modecaps, IEEE80211_MODE_TURBO_G);
174 setbit(ic->ic_modecaps, IEEE80211_MODE_STURBO_A);
176 setbit(ic->ic_modecaps, IEEE80211_MODE_HALF);
178 setbit(ic->ic_modecaps, IEEE80211_MODE_QUARTER);
180 setbit(ic->ic_modecaps, IEEE80211_MODE_11NA);
182 setbit(ic->ic_modecaps, IEEE80211_MODE_11NG);
185 memcpy(ic->ic_chan_active, ic->ic_chan_avail,
186 sizeof(ic->ic_chan_avail));
189 ieee80211_sort_channels(ic->ic_channels, ic->ic_nchans);
192 ic->ic_bsschan = IEEE80211_CHAN_ANYC;
193 ic->ic_prevchan = NULL;
194 ic->ic_csa_newchan = NULL;
196 ic->ic_curchan = &ic->ic_channels[0];
197 ic->ic_rt = ieee80211_get_ratetable(ic->ic_curchan);
215 if (ic->ic_rxstream == 0)
216 ic->ic_rxstream = 2;
217 if (ic->ic_txstream == 0)
218 ic->ic_txstream = 2;
223 (void) ieee80211_setmode(ic, IEEE80211_MODE_AUTO);
228 null_update_mcast(struct ieee80211com *ic)
231 ic_printf(ic, "need multicast update callback\n");
235 null_update_promisc(struct ieee80211com *ic)
238 ic_printf(ic, "need promiscuous mode update callback\n");
242 null_update_chw(struct ieee80211com *ic)
245 ic_printf(ic, "%s: need callback\n", __func__);
249 ic_printf(struct ieee80211com *ic, const char * fmt, ...)
254 retval = printf("%s: ", ic->ic_name);
268 struct ieee80211com *ic;
280 LIST_FOREACH(ic, &ic_head, ic_next) {
281 sbuf_printf(&sb, "%s%s", sp, ic->ic_name);
299 ieee80211_ifattach(struct ieee80211com *ic)
302 IEEE80211_LOCK_INIT(ic, ic->ic_name);
303 IEEE80211_TX_LOCK_INIT(ic, ic->ic_name);
304 TAILQ_INIT(&ic->ic_vaps);
307 ic->ic_tq = taskqueue_create("ic_taskq", M_WAITOK | M_ZERO,
308 taskqueue_thread_enqueue, &ic->ic_tq);
309 taskqueue_start_threads(&ic->ic_tq, 1, PI_NET, "%s net80211 taskq",
310 ic->ic_name);
311 ic->ic_ierrors = counter_u64_alloc(M_WAITOK);
312 ic->ic_oerrors = counter_u64_alloc(M_WAITOK);
318 ieee80211_chan_init(ic);
320 ic->ic_update_mcast = null_update_mcast;
321 ic->ic_update_promisc = null_update_promisc;
322 ic->ic_update_chw = null_update_chw;
324 ic->ic_hash_key = arc4random();
325 ic->ic_bintval = IEEE80211_BINTVAL_DEFAULT;
326 ic->ic_lintval = ic->ic_bintval;
327 ic->ic_txpowlimit = IEEE80211_TXPOWER_MAX;
329 ieee80211_crypto_attach(ic);
330 ieee80211_node_attach(ic);
331 ieee80211_power_attach(ic);
332 ieee80211_proto_attach(ic);
334 ieee80211_superg_attach(ic);
336 ieee80211_ht_attach(ic);
337 ieee80211_scan_attach(ic);
338 ieee80211_regdomain_attach(ic);
339 ieee80211_dfs_attach(ic);
341 ieee80211_sysctl_attach(ic);
344 LIST_INSERT_HEAD(&ic_head, ic, ic_next);
355 ieee80211_ifdetach(struct ieee80211com *ic)
365 if (ic->ic_tq == NULL)
369 LIST_REMOVE(ic, ic_next);
372 taskqueue_drain(taskqueue_thread, &ic->ic_restart_task);
378 while ((vap = TAILQ_FIRST(&ic->ic_vaps)) != NULL) {
382 ieee80211_waitfor_parent(ic);
384 ieee80211_sysctl_detach(ic);
385 ieee80211_dfs_detach(ic);
386 ieee80211_regdomain_detach(ic);
387 ieee80211_scan_detach(ic);
389 ieee80211_superg_detach(ic);
391 ieee80211_ht_detach(ic);
393 ieee80211_proto_detach(ic);
394 ieee80211_crypto_detach(ic);
395 ieee80211_power_detach(ic);
396 ieee80211_node_detach(ic);
398 counter_u64_free(ic->ic_ierrors);
399 counter_u64_free(ic->ic_oerrors);
401 taskqueue_free(ic->ic_tq);
402 IEEE80211_TX_LOCK_DESTROY(ic);
403 IEEE80211_LOCK_DESTROY(ic);
409 struct ieee80211com *ic;
412 LIST_FOREACH(ic, &ic_head, ic_next)
413 if (strcmp(ic->ic_name, name) == 0)
417 return (ic);
423 struct ieee80211com *ic;
426 LIST_FOREACH(ic, &ic_head, ic_next)
427 (*f)(arg, ic);
453 struct ieee80211com *ic = vap->iv_ic;
459 rv += counter_u64_fetch(ic->ic_oerrors);
462 rv += counter_u64_fetch(ic->ic_ierrors);
477 ieee80211_vap_setup(struct ieee80211com *ic, struct ieee80211vap *vap,
485 ic_printf(ic, "%s: unable to allocate ifnet\n",
499 vap->iv_ic = ic;
500 vap->iv_flags = ic->ic_flags; /* propagate common flags */
501 vap->iv_flags_ext = ic->ic_flags_ext;
502 vap->iv_flags_ven = ic->ic_flags_ven;
503 vap->iv_caps = ic->ic_caps &~ IEEE80211_C_OPMODE;
504 vap->iv_htcaps = ic->ic_htcaps;
505 vap->iv_htextcaps = ic->ic_htextcaps;
508 IEEE80211_ADDR_COPY(vap->iv_myaddr, ic->ic_macaddr);
528 KASSERT(ic->ic_caps & IEEE80211_C_TDMA,
529 ("not TDMA capable, ic_caps 0x%x", ic->ic_caps));
602 struct ieee80211com *ic = vap->iv_ic;
609 ic->ic_name, vap->iv_flags, vap->iv_flags_ext);
618 maxrate = ieee80211_media_setup(ic, &vap->iv_media, vap->iv_caps,
634 IEEE80211_LOCK(ic);
635 TAILQ_INSERT_TAIL(&ic->ic_vaps, vap, iv_next);
636 ieee80211_syncflag_locked(ic, IEEE80211_F_WME);
638 ieee80211_syncflag_locked(ic, IEEE80211_F_TURBOP);
640 ieee80211_syncflag_locked(ic, IEEE80211_F_PCF);
641 ieee80211_syncflag_locked(ic, IEEE80211_F_BURST);
642 ieee80211_syncflag_ht_locked(ic, IEEE80211_FHT_HT);
643 ieee80211_syncflag_ht_locked(ic, IEEE80211_FHT_USEHT40);
644 IEEE80211_UNLOCK(ic);
658 struct ieee80211com *ic = vap->iv_ic;
664 __func__, ieee80211_opmode_name[vap->iv_opmode], ic->ic_name);
674 ieee80211_draintask(ic, &vap->iv_nstate_task);
675 ieee80211_draintask(ic, &vap->iv_swbmiss_task);
680 IEEE80211_LOCK(ic);
682 TAILQ_REMOVE(&ic->ic_vaps, vap, iv_next);
683 ieee80211_syncflag_locked(ic, IEEE80211_F_WME);
685 ieee80211_syncflag_locked(ic, IEEE80211_F_TURBOP);
687 ieee80211_syncflag_locked(ic, IEEE80211_F_PCF);
688 ieee80211_syncflag_locked(ic, IEEE80211_F_BURST);
689 ieee80211_syncflag_ht_locked(ic, IEEE80211_FHT_HT);
690 ieee80211_syncflag_ht_locked(ic, IEEE80211_FHT_USEHT40);
692 ieee80211_syncflag_ext_locked(ic, IEEE80211_FEXT_BPF);
697 IEEE80211_UNLOCK(ic);
727 struct ieee80211com *ic = vap->iv_ic;
729 IEEE80211_LOCK_ASSERT(ic);
732 if (++ic->ic_promisc == 1)
733 ieee80211_runtask(ic, &ic->ic_promisc_task);
735 KASSERT(ic->ic_promisc > 0, ("%s: ic %p not promisc",
736 __func__, ic));
737 if (--ic->ic_promisc == 0)
738 ieee80211_runtask(ic, &ic->ic_promisc_task);
749 struct ieee80211com *ic = vap->iv_ic;
751 IEEE80211_LOCK_ASSERT(ic);
754 if (++ic->ic_allmulti == 1)
755 ieee80211_runtask(ic, &ic->ic_mcast_task);
757 KASSERT(ic->ic_allmulti > 0, ("%s: ic %p not allmulti",
758 __func__, ic));
759 if (--ic->ic_allmulti == 0)
760 ieee80211_runtask(ic, &ic->ic_mcast_task);
770 ieee80211_syncflag_locked(struct ieee80211com *ic, int flag)
775 IEEE80211_LOCK_ASSERT(ic);
778 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
784 ic->ic_flags |= flag;
786 ic->ic_flags &= ~flag;
792 struct ieee80211com *ic = vap->iv_ic;
794 IEEE80211_LOCK(ic);
800 ieee80211_syncflag_locked(ic, flag);
801 IEEE80211_UNLOCK(ic);
810 ieee80211_syncflag_ht_locked(struct ieee80211com *ic, int flag)
815 IEEE80211_LOCK_ASSERT(ic);
818 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
824 ic->ic_flags_ht |= flag;
826 ic->ic_flags_ht &= ~flag;
832 struct ieee80211com *ic = vap->iv_ic;
834 IEEE80211_LOCK(ic);
840 ieee80211_syncflag_ht_locked(ic, flag);
841 IEEE80211_UNLOCK(ic);
850 ieee80211_syncflag_ext_locked(struct ieee80211com *ic, int flag)
855 IEEE80211_LOCK_ASSERT(ic);
858 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
864 ic->ic_flags_ext |= flag;
866 ic->ic_flags_ext &= ~flag;
872 struct ieee80211com *ic = vap->iv_ic;
874 IEEE80211_LOCK(ic);
880 ieee80211_syncflag_ext_locked(ic, flag);
881 IEEE80211_UNLOCK(ic);
953 ieee80211_chan2ieee(struct ieee80211com *ic, const struct ieee80211_channel *c)
956 ic_printf(ic, "invalid channel (NULL)\n");
1267 ieee80211_find_channel(struct ieee80211com *ic, int freq, int flags)
1272 c = ic->ic_prevchan;
1277 return (findchannel(ic->ic_channels, ic->ic_nchans, freq, flags));
1286 ieee80211_find_channel_byieee(struct ieee80211com *ic, int ieee, int flags)
1292 c = ic->ic_prevchan;
1297 for (i = 0; i < ic->ic_nchans; i++) {
1298 c = &ic->ic_channels[i];
1319 * Takes the ic and rxstatus; returns the channel or NULL
1328 struct ieee80211com *ic = vap->iv_ic;
1362 c = ieee80211_find_channel(ic, rxs->c_freq, flags);
1399 ADD(ic, mword, mopt); /* STA mode has no cap */
1420 ieee80211_media_setup(struct ieee80211com *ic,
1439 if (isclr(ic->ic_modecaps, mode))
1444 rs = &ic->ic_sup_rates[mode];
1447 mword = ieee80211_rate2media(ic, rate, mode);
1469 mword = ieee80211_rate2media(ic, allrates.rs_rates[i],
1484 if (isclr(ic->ic_modecaps, mode))
1489 if (isset(ic->ic_modecaps, IEEE80211_MODE_11NA) ||
1490 isset(ic->ic_modecaps, IEEE80211_MODE_11NG)) {
1493 i = ic->ic_txstream * 8 - 1;
1494 if ((ic->ic_htcaps & IEEE80211_HTCAP_CHWIDTH40) &&
1495 (ic->ic_htcaps & IEEE80211_HTCAP_SHORTGI40))
1497 else if ((ic->ic_htcaps & IEEE80211_HTCAP_CHWIDTH40))
1499 else if ((ic->ic_htcaps & IEEE80211_HTCAP_SHORTGI20))
1511 ieee80211_get_suprates(struct ieee80211com *ic, const struct ieee80211_channel *c)
1514 return &ic->ic_sup_rates[ieee80211_chan2mode(c)];
1518 ieee80211_announce(struct ieee80211com *ic)
1526 if (isclr(ic->ic_modecaps, mode))
1528 ic_printf(ic, "%s rates: ", ieee80211_phymode_name[mode]);
1529 rs = &ic->ic_sup_rates[mode];
1531 mword = ieee80211_rate2media(ic, rs->rs_rates[i], mode);
1540 ieee80211_ht_announce(ic);
1544 ieee80211_announce_channels(struct ieee80211com *ic)
1551 for (i = 0; i < ic->ic_nchans; i++) {
1552 c = &ic->ic_channels[i];
1717 struct ieee80211com *ic = vap->iv_ic;
1729 mode = ieee80211_chan2mode(ic->ic_curchan);
1732 imr->ifm_active = media_status(vap->iv_opmode, ic->ic_curchan);
1740 imr->ifm_active |= ieee80211_rate2media(ic,
1746 imr->ifm_active |= ieee80211_rate2media(ic,
1761 ieee80211_setmode(struct ieee80211com *ic, enum ieee80211_phymode mode)
1770 ieee80211_setbasicrates(&ic->ic_sup_rates[mode], mode);
1772 ic->ic_curmode = mode;
1773 ieee80211_reset_erp(ic); /* reset ERP state */
1836 ieee80211_rate2media(struct ieee80211com *ic, int rate, enum ieee80211_phymode mode)
1988 /* NB: ic may be NULL for some drivers */
1989 if (ic != NULL && ic->ic_phytype == IEEE80211_T_FH)
2054 ieee80211_mac_hash(const struct ieee80211com *ic,
2057 uint32_t a = 0x9e3779b9, b = 0x9e3779b9, c = ic->ic_hash_key;