Lines Matching +full:rates +full:- +full:mcs

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
5 * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting
69 CTASSERT((IEEE80211_NODE_HASHSIZE & (IEEE80211_NODE_HASHSIZE-1)) == 0);
75 ((_vap)->iv_aid_bitmap[IEEE80211_AID(b) / 32] |= \
78 ((_vap)->iv_aid_bitmap[IEEE80211_AID(b) / 32] &= \
81 ((_vap)->iv_aid_bitmap[IEEE80211_AID(b) / 32] & (1 << (IEEE80211_AID(b) % 32)))
117 /* XXX really want maxlen enforced per-sta */ in ieee80211_node_attach()
118 ieee80211_ageq_init(&ic->ic_stageq, ic->ic_max_keyix * 8, in ieee80211_node_attach()
120 ieee80211_node_table_init(ic, &ic->ic_sta, "station", in ieee80211_node_attach()
121 IEEE80211_INACT_INIT, ic->ic_max_keyix); in ieee80211_node_attach()
122 callout_init(&ic->ic_inact, 1); in ieee80211_node_attach()
123 callout_reset(&ic->ic_inact, IEEE80211_INACT_WAIT*hz, in ieee80211_node_attach()
126 ic->ic_node_alloc = node_alloc; in ieee80211_node_attach()
127 ic->ic_node_init = node_init; in ieee80211_node_attach()
128 ic->ic_node_free = node_free; in ieee80211_node_attach()
129 ic->ic_node_cleanup = node_cleanup; in ieee80211_node_attach()
130 ic->ic_node_age = node_age; in ieee80211_node_attach()
131 ic->ic_node_drain = node_age; /* NB: same as age */ in ieee80211_node_attach()
132 ic->ic_node_getrssi = node_getrssi; in ieee80211_node_attach()
133 ic->ic_node_getsignal = node_getsignal; in ieee80211_node_attach()
134 ic->ic_node_getmimoinfo = node_getmimoinfo; in ieee80211_node_attach()
140 ic->ic_flags_ext |= IEEE80211_FEXT_INACT; /* inactivity processing */ in ieee80211_node_attach()
147 callout_drain(&ic->ic_inact); in ieee80211_node_detach()
148 ieee80211_node_table_cleanup(&ic->ic_sta); in ieee80211_node_detach()
149 ieee80211_ageq_drain(&ic->ic_stageq); in ieee80211_node_detach()
150 ieee80211_ageq_cleanup(&ic->ic_stageq); in ieee80211_node_detach()
157 vap->iv_max_aid = IEEE80211_AID_DEF; in ieee80211_node_vattach()
160 vap->iv_inact_init = IEEE80211_INACT_INIT; in ieee80211_node_vattach()
161 vap->iv_inact_auth = IEEE80211_INACT_AUTH; in ieee80211_node_vattach()
162 vap->iv_inact_run = IEEE80211_INACT_RUN; in ieee80211_node_vattach()
163 vap->iv_inact_probe = IEEE80211_INACT_PROBE; in ieee80211_node_vattach()
167 vap->iv_inact_init, vap->iv_inact_auth, in ieee80211_node_vattach()
168 vap->iv_inact_run, vap->iv_inact_probe); in ieee80211_node_vattach()
176 IEEE80211_UNLOCK_ASSERT(vap->iv_ic); in ieee80211_node_latevattach()
178 if (vap->iv_opmode == IEEE80211_M_HOSTAP) { in ieee80211_node_latevattach()
180 if (vap->iv_max_aid < IEEE80211_AID_MIN) { in ieee80211_node_latevattach()
181 vap->iv_max_aid = IEEE80211_AID_MIN; in ieee80211_node_latevattach()
184 vap->iv_max_aid); in ieee80211_node_latevattach()
186 vap->iv_aid_bitmap = (uint32_t *) IEEE80211_MALLOC( in ieee80211_node_latevattach()
187 howmany(vap->iv_max_aid, 32) * sizeof(uint32_t), in ieee80211_node_latevattach()
190 if (vap->iv_aid_bitmap == NULL) { in ieee80211_node_latevattach()
194 __func__, vap->iv_max_aid); in ieee80211_node_latevattach()
195 vap->iv_max_aid = 0; in ieee80211_node_latevattach()
199 IEEE80211_LOCK(vap->iv_ic); in ieee80211_node_latevattach()
201 IEEE80211_UNLOCK(vap->iv_ic); in ieee80211_node_latevattach()
203 vap->iv_auth = ieee80211_authenticator_get(vap->iv_bss->ni_authmode); in ieee80211_node_latevattach()
209 struct ieee80211com *ic = vap->iv_ic; in ieee80211_node_vdetach()
212 IEEE80211_UNLOCK_ASSERT(vap->iv_ic); in ieee80211_node_vdetach()
214 ieee80211_node_table_reset(&ic->ic_sta, vap); in ieee80211_node_vdetach()
216 if (vap->iv_bss != NULL) { in ieee80211_node_vdetach()
217 ieee80211_free_node(vap->iv_bss); in ieee80211_node_vdetach()
218 vap->iv_update_bss(vap, NULL); in ieee80211_node_vdetach()
221 if (vap->iv_aid_bitmap != NULL) { in ieee80211_node_vdetach()
222 IEEE80211_FREE(vap->iv_aid_bitmap, M_80211_NODE); in ieee80211_node_vdetach()
223 vap->iv_aid_bitmap = NULL; in ieee80211_node_vdetach()
234 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_node_authorize()
236 ni->ni_flags |= IEEE80211_NODE_AUTH; in ieee80211_node_authorize()
237 ni->ni_inact_reload = vap->iv_inact_run; in ieee80211_node_authorize()
238 ni->ni_inact = ni->ni_inact_reload; in ieee80211_node_authorize()
241 "%s: inact_reload %u", __func__, ni->ni_inact_reload); in ieee80211_node_authorize()
247 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_node_unauthorize()
249 ni->ni_flags &= ~IEEE80211_NODE_AUTH; in ieee80211_node_unauthorize()
250 ni->ni_inact_reload = vap->iv_inact_auth; in ieee80211_node_unauthorize()
251 if (ni->ni_inact > ni->ni_inact_reload) in ieee80211_node_unauthorize()
252 ni->ni_inact = ni->ni_inact_reload; in ieee80211_node_unauthorize()
256 ni->ni_inact_reload, ni->ni_inact); in ieee80211_node_unauthorize()
265 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_node_setuptxparms()
268 if (ni->ni_flags & IEEE80211_NODE_VHT) { in ieee80211_node_setuptxparms()
269 if (IEEE80211_IS_CHAN_5GHZ(ni->ni_chan)) in ieee80211_node_setuptxparms()
273 } else if (ni->ni_flags & IEEE80211_NODE_HT) { in ieee80211_node_setuptxparms()
274 if (IEEE80211_IS_CHAN_5GHZ(ni->ni_chan)) in ieee80211_node_setuptxparms()
279 if (IEEE80211_IS_CHAN_ST(ni->ni_chan)) in ieee80211_node_setuptxparms()
281 else if (IEEE80211_IS_CHAN_HALF(ni->ni_chan)) in ieee80211_node_setuptxparms()
283 else if (IEEE80211_IS_CHAN_QUARTER(ni->ni_chan)) in ieee80211_node_setuptxparms()
286 else if (IEEE80211_IS_CHAN_A(ni->ni_chan)) in ieee80211_node_setuptxparms()
288 else if (IEEE80211_IS_CHAN_108G(ni->ni_chan) || in ieee80211_node_setuptxparms()
289 (ni->ni_flags & IEEE80211_NODE_ERP)) in ieee80211_node_setuptxparms()
294 ni->ni_txparms = &vap->iv_txparms[mode]; in ieee80211_node_setuptxparms()
306 struct ieee80211com *ic = ni->ni_ic; in ieee80211_node_set_chan()
307 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_node_set_chan()
312 ni->ni_chan = chan; in ieee80211_node_set_chan()
319 ni->ni_htrates = *ieee80211_get_suphtrates(ic, chan); in ieee80211_node_set_chan()
322 * use legacy rates when operating in a mixed HT+non-HT bss in ieee80211_node_set_chan()
323 * and non-ERP rates in 11g for mixed ERP+non-ERP bss. in ieee80211_node_set_chan()
326 (vap->iv_flags_ht & IEEE80211_FHT_PUREN) == 0) in ieee80211_node_set_chan()
329 (vap->iv_flags_ht & IEEE80211_FHT_PUREN) == 0) in ieee80211_node_set_chan()
332 (vap->iv_flags & IEEE80211_F_PUREG) == 0) in ieee80211_node_set_chan()
335 ni->ni_txparms = &vap->iv_txparms[mode]; in ieee80211_node_set_chan()
336 ni->ni_rates = *ieee80211_get_suprates(ic, chan); in ieee80211_node_set_chan()
343 nbss->ni_authmode = obss->ni_authmode; in copy_bss()
344 nbss->ni_txpower = obss->ni_txpower; in copy_bss()
345 nbss->ni_vlan = obss->ni_vlan; in copy_bss()
353 struct ieee80211com *ic = vap->iv_ic; in ieee80211_create_ibss()
358 ieee80211_opmode_name[vap->iv_opmode], in ieee80211_create_ibss()
361 chan->ic_flags); in ieee80211_create_ibss()
363 ni = ieee80211_alloc_node(&ic->ic_sta, vap, vap->iv_myaddr, in ieee80211_create_ibss()
369 IEEE80211_ADDR_COPY(ni->ni_bssid, vap->iv_myaddr); in ieee80211_create_ibss()
370 ni->ni_esslen = vap->iv_des_ssid[0].len; in ieee80211_create_ibss()
371 memcpy(ni->ni_essid, vap->iv_des_ssid[0].ssid, ni->ni_esslen); in ieee80211_create_ibss()
372 if (vap->iv_bss != NULL) in ieee80211_create_ibss()
373 copy_bss(ni, vap->iv_bss); in ieee80211_create_ibss()
374 ni->ni_intval = ic->ic_bintval; in ieee80211_create_ibss()
375 if (vap->iv_flags & IEEE80211_F_PRIVACY) in ieee80211_create_ibss()
376 ni->ni_capinfo |= IEEE80211_CAPINFO_PRIVACY; in ieee80211_create_ibss()
377 if (ic->ic_phytype == IEEE80211_T_FH) { in ieee80211_create_ibss()
378 ni->ni_fhdwell = 200; /* XXX */ in ieee80211_create_ibss()
379 ni->ni_fhindex = 1; in ieee80211_create_ibss()
381 if (vap->iv_opmode == IEEE80211_M_IBSS) { in ieee80211_create_ibss()
382 ni->ni_capinfo |= IEEE80211_CAPINFO_IBSS; /* XXX */ in ieee80211_create_ibss()
383 if (vap->iv_flags & IEEE80211_F_DESBSSID) in ieee80211_create_ibss()
384 IEEE80211_ADDR_COPY(ni->ni_bssid, vap->iv_des_bssid); in ieee80211_create_ibss()
386 net80211_get_random_bytes(ni->ni_bssid, in ieee80211_create_ibss()
389 ni->ni_bssid[0] = (ni->ni_bssid[0] &~ 0x01) | 0x02; in ieee80211_create_ibss()
391 } else if (vap->iv_opmode == IEEE80211_M_AHDEMO) { in ieee80211_create_ibss()
392 if (vap->iv_flags & IEEE80211_F_DESBSSID) in ieee80211_create_ibss()
393 IEEE80211_ADDR_COPY(ni->ni_bssid, vap->iv_des_bssid); in ieee80211_create_ibss()
396 if ((vap->iv_caps & IEEE80211_C_TDMA) == 0) in ieee80211_create_ibss()
398 memset(ni->ni_bssid, 0, IEEE80211_ADDR_LEN); in ieee80211_create_ibss()
400 } else if (vap->iv_opmode == IEEE80211_M_MBSS) { in ieee80211_create_ibss()
401 ni->ni_meshidlen = vap->iv_mesh->ms_idlen; in ieee80211_create_ibss()
402 memcpy(ni->ni_meshid, vap->iv_mesh->ms_id, ni->ni_meshidlen); in ieee80211_create_ibss()
409 if (ic->ic_bsschan != IEEE80211_CHAN_ANYC && in ieee80211_create_ibss()
410 ic->ic_bsschan->ic_freq != chan->ic_freq && in ieee80211_create_ibss()
411 IEEE80211_IS_CHAN_CACDONE(ic->ic_bsschan)) in ieee80211_create_ibss()
412 ieee80211_dfs_cac_clear(ic, ic->ic_bsschan); in ieee80211_create_ibss()
413 ic->ic_bsschan = chan; in ieee80211_create_ibss()
415 ic->ic_curmode = ieee80211_chan2mode(chan); in ieee80211_create_ibss()
417 * Do mode-specific setup. in ieee80211_create_ibss()
424 ieee80211_setbasicrates(&ni->ni_rates, in ieee80211_create_ibss()
426 if (vap->iv_flags & IEEE80211_F_PUREG) { in ieee80211_create_ibss()
428 * Also mark OFDM rates basic so 11b in ieee80211_create_ibss()
431 ieee80211_addbasicrates(&ni->ni_rates, in ieee80211_create_ibss()
438 ieee80211_setbasicrates(&ni->ni_rates, in ieee80211_create_ibss()
443 /* XXX TODO: other bits and pieces - eg fast-frames? */ in ieee80211_create_ibss()
446 if (IEEE80211_IS_CHAN_VHT(ni->ni_chan)) { in ieee80211_create_ibss()
450 } else if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) { in ieee80211_create_ibss()
467 struct ieee80211com *ic = vap->iv_ic; in ieee80211_reset_bss()
472 ieee80211_node_table_reset(&ic->ic_sta, vap); in ieee80211_reset_bss()
473 /* XXX multi-bss: wrong */ in ieee80211_reset_bss()
476 ni = ieee80211_alloc_node(&ic->ic_sta, vap, vap->iv_myaddr, in ieee80211_reset_bss()
479 obss = vap->iv_update_bss(vap, ieee80211_ref_node(ni)); in ieee80211_reset_bss()
482 ni->ni_intval = ic->ic_bintval; in ieee80211_reset_bss()
485 IEEE80211_ADDR_COPY(ni->ni_bssid, vap->iv_myaddr); in ieee80211_reset_bss()
495 if (ni->ni_esslen == ssids[i].len && in match_ssid()
496 memcmp(ni->ni_essid, ssids[i].ssid, ni->ni_esslen) == 0) in match_ssid()
508 struct ieee80211com *ic = ni->ni_ic; in check_bss()
511 if (isclr(ic->ic_chan_active, ieee80211_chan2ieee(ic, ni->ni_chan))) in check_bss()
513 if (vap->iv_opmode == IEEE80211_M_IBSS) { in check_bss()
514 if ((ni->ni_capinfo & IEEE80211_CAPINFO_IBSS) == 0) in check_bss()
517 if ((ni->ni_capinfo & IEEE80211_CAPINFO_ESS) == 0) in check_bss()
520 if (vap->iv_flags & IEEE80211_F_PRIVACY) { in check_bss()
521 if ((ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) == 0) in check_bss()
525 if (ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) in check_bss()
528 rate = ieee80211_fix_rate(ni, &ni->ni_rates, in check_bss()
532 if (vap->iv_des_nssid != 0 && in check_bss()
533 !match_ssid(ni, vap->iv_des_nssid, vap->iv_des_ssid)) in check_bss()
535 if ((vap->iv_flags & IEEE80211_F_DESBSSID) && in check_bss()
536 !IEEE80211_ADDR_EQ(vap->iv_des_bssid, ni->ni_bssid)) in check_bss()
548 struct ieee80211com *ic = ni->ni_ic; in check_bss_debug()
553 if (isclr(ic->ic_chan_active, ieee80211_chan2ieee(ic, ni->ni_chan))) in check_bss_debug()
555 if (vap->iv_opmode == IEEE80211_M_IBSS) { in check_bss_debug()
556 if ((ni->ni_capinfo & IEEE80211_CAPINFO_IBSS) == 0) in check_bss_debug()
559 if ((ni->ni_capinfo & IEEE80211_CAPINFO_ESS) == 0) in check_bss_debug()
562 if (vap->iv_flags & IEEE80211_F_PRIVACY) { in check_bss_debug()
563 if ((ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) == 0) in check_bss_debug()
567 if (ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) in check_bss_debug()
570 rate = ieee80211_fix_rate(ni, &ni->ni_rates, in check_bss_debug()
574 if (vap->iv_des_nssid != 0 && in check_bss_debug()
575 !match_ssid(ni, vap->iv_des_nssid, vap->iv_des_ssid)) in check_bss_debug()
577 if ((vap->iv_flags & IEEE80211_F_DESBSSID) && in check_bss_debug()
578 !IEEE80211_ADDR_EQ(vap->iv_des_bssid, ni->ni_bssid)) in check_bss_debug()
581 net80211_printf(" %c %s", fail ? '-' : '+', ether_sprintf(ni->ni_macaddr)); in check_bss_debug()
582 net80211_printf(" %s%c", ether_sprintf(ni->ni_bssid), fail & 0x20 ? '!' : ' '); in check_bss_debug()
584 ieee80211_chan2ieee(ic, ni->ni_chan), fail & 0x01 ? '!' : ' '); in check_bss_debug()
588 (ni->ni_capinfo & IEEE80211_CAPINFO_ESS) ? "ess" : in check_bss_debug()
589 (ni->ni_capinfo & IEEE80211_CAPINFO_IBSS) ? "ibss" : in check_bss_debug()
593 (ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) ? "wep" : "no", in check_bss_debug()
595 ieee80211_print_essid(ni->ni_essid, ni->ni_esslen); in check_bss_debug()
603 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_ibss_merge_check()
605 if (ni == vap->iv_bss || in ieee80211_ibss_merge_check()
606 IEEE80211_ADDR_EQ(ni->ni_bssid, vap->iv_bss->ni_bssid)) { in ieee80211_ibss_merge_check()
619 vap->iv_stats.is_ibss_capmismatch++; in ieee80211_ibss_merge_check()
640 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_ibss_node_check_new()
646 if (vap->iv_des_nssid == 0 && scan->ssid == NULL) in ieee80211_ibss_node_check_new()
652 if (!! (vap->iv_des_nssid == 0) != !! (scan->ssid == NULL)) in ieee80211_ibss_node_check_new()
656 * Double-check - we need scan SSID. in ieee80211_ibss_node_check_new()
658 if (scan->ssid == NULL) in ieee80211_ibss_node_check_new()
664 for (i = 0; i < vap->iv_des_nssid; i++) { in ieee80211_ibss_node_check_new()
666 if (vap->iv_des_ssid[i].len != scan->ssid[1]) in ieee80211_ibss_node_check_new()
670 if (memcmp(vap->iv_des_ssid[i].ssid, scan->ssid + 2, in ieee80211_ibss_node_check_new()
671 vap->iv_des_ssid[i].len) == 0) in ieee80211_ibss_node_check_new()
697 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_ibss_merge()
705 ether_sprintf(ni->ni_bssid), in ieee80211_ibss_merge()
706 vap->iv_flags&IEEE80211_F_SHPREAMBLE ? "short" : "long", in ieee80211_ibss_merge()
707 vap->iv_flags&IEEE80211_F_SHSLOT ? "short" : "long", in ieee80211_ibss_merge()
708 vap->iv_flags&IEEE80211_F_USEPROT ? ", protection" : "" in ieee80211_ibss_merge()
725 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) { in gethtadjustflags()
726 if (vap->iv_state < IEEE80211_S_RUN) in gethtadjustflags()
728 switch (vap->iv_opmode) { in gethtadjustflags()
735 flags |= ieee80211_htchanflags(vap->iv_bss->ni_chan); in gethtadjustflags()
756 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) { in getvhtadjustflags()
757 if (vap->iv_state < IEEE80211_S_RUN) in getvhtadjustflags()
759 switch (vap->iv_opmode) { in getvhtadjustflags()
766 flags |= ieee80211_vhtchanflags(vap->iv_bss->ni_chan); in getvhtadjustflags()
787 c = ieee80211_ht_adjust_channel(ic, ic->ic_curchan, gethtadjustflags(ic)); in ieee80211_sync_curchan()
790 if (c != ic->ic_curchan) { in ieee80211_sync_curchan()
791 ic->ic_curchan = c; in ieee80211_sync_curchan()
792 ic->ic_curmode = ieee80211_chan2mode(ic->ic_curchan); in ieee80211_sync_curchan()
793 ic->ic_rt = ieee80211_get_ratetable(ic->ic_curchan); in ieee80211_sync_curchan()
795 ic->ic_set_channel(ic); in ieee80211_sync_curchan()
808 if (ic->ic_htcaps & IEEE80211_HTC_HT) { in ieee80211_setupcurchan()
822 * VHT promotion - this will at least promote to VHT20/40 in ieee80211_setupcurchan()
826 if (ic->ic_vht_cap.vht_cap_info != 0) { in ieee80211_setupcurchan()
832 ic->ic_bsschan = ic->ic_curchan = c; in ieee80211_setupcurchan()
833 ic->ic_curmode = ieee80211_chan2mode(ic->ic_curchan); in ieee80211_setupcurchan()
834 ic->ic_rt = ieee80211_get_ratetable(ic->ic_curchan); in ieee80211_setupcurchan()
845 ieee80211_runtask(ic, &ic->ic_chan_task); in ieee80211_setcurchan()
852 ieee80211_setupcurchan(ic, ic->ic_curchan); in ieee80211_update_chw()
853 ieee80211_runtask(ic, &ic->ic_chw_task); in ieee80211_update_chw()
863 struct ieee80211vap *vap = selbs->ni_vap; in ieee80211_sta_join1()
864 struct ieee80211com *ic = selbs->ni_ic; in ieee80211_sta_join1()
872 obss = vap->iv_update_bss(vap, selbs); /* NB: caller assumed to bump refcnt */ in ieee80211_sta_join1()
880 vap->iv_state == IEEE80211_S_RUN && in ieee80211_sta_join1()
881 IEEE80211_ADDR_EQ(obss->ni_macaddr, selbs->ni_macaddr)); in ieee80211_sta_join1()
883 struct ieee80211_node_table *nt = obss->ni_table; in ieee80211_sta_join1()
899 * Delete unusable rates; we've already checked in ieee80211_sta_join1()
902 ieee80211_fix_rate(vap->iv_bss, &vap->iv_bss->ni_rates, in ieee80211_sta_join1()
905 ieee80211_setcurchan(ic, selbs->ni_chan); in ieee80211_sta_join1()
908 * the auto-select case; this should be redundant if the in ieee80211_sta_join1()
914 if (vap->iv_opmode == IEEE80211_M_STA) { in ieee80211_sta_join1()
922 * us to try to re-authenticate if we are operating in ieee80211_sta_join1()
926 "%s %p<%s> %s -> AUTH, FC0_SUBTYPE_DEAUTH\n", in ieee80211_sta_join1()
927 __func__, selbs, ether_sprintf(selbs->ni_macaddr), in ieee80211_sta_join1()
928 ieee80211_state_name[vap->iv_state]); in ieee80211_sta_join1()
933 ieee80211_new_state(vap, IEEE80211_S_RUN, -1); in ieee80211_sta_join1()
941 struct ieee80211com *ic = vap->iv_ic; in ieee80211_sta_join()
945 ni = ieee80211_alloc_node(&ic->ic_sta, vap, se->se_macaddr, in ieee80211_sta_join()
956 IEEE80211_ADDR_COPY(ni->ni_bssid, se->se_bssid); in ieee80211_sta_join()
957 ni->ni_esslen = se->se_ssid[1]; in ieee80211_sta_join()
958 memcpy(ni->ni_essid, se->se_ssid+2, ni->ni_esslen); in ieee80211_sta_join()
959 ni->ni_tstamp.tsf = se->se_tstamp.tsf; in ieee80211_sta_join()
960 ni->ni_intval = se->se_intval; in ieee80211_sta_join()
961 ni->ni_capinfo = se->se_capinfo; in ieee80211_sta_join()
962 ni->ni_chan = chan; in ieee80211_sta_join()
963 ni->ni_timoff = se->se_timoff; in ieee80211_sta_join()
964 ni->ni_fhdwell = se->se_fhdwell; in ieee80211_sta_join()
965 ni->ni_fhindex = se->se_fhindex; in ieee80211_sta_join()
966 ni->ni_erp = se->se_erp; in ieee80211_sta_join()
967 IEEE80211_RSSI_LPF(ni->ni_avgrssi, se->se_rssi); in ieee80211_sta_join()
968 ni->ni_noise = se->se_noise; in ieee80211_sta_join()
969 if (vap->iv_opmode == IEEE80211_M_STA) { in ieee80211_sta_join()
971 ni->ni_flags |= IEEE80211_NODE_ASSOCID; in ieee80211_sta_join()
974 if (ieee80211_ies_init(&ni->ni_ies, se->se_ies.data, se->se_ies.len)) { in ieee80211_sta_join()
975 ieee80211_ies_expand(&ni->ni_ies); in ieee80211_sta_join()
977 if (ni->ni_ies.ath_ie != NULL) in ieee80211_sta_join()
978 ieee80211_parse_ath(ni, ni->ni_ies.ath_ie); in ieee80211_sta_join()
980 if (ni->ni_ies.htcap_ie != NULL) in ieee80211_sta_join()
981 ieee80211_parse_htcap(ni, ni->ni_ies.htcap_ie); in ieee80211_sta_join()
982 if (ni->ni_ies.htinfo_ie != NULL) in ieee80211_sta_join()
983 ieee80211_parse_htinfo(ni, ni->ni_ies.htinfo_ie); in ieee80211_sta_join()
985 if (ni->ni_ies.meshid_ie != NULL) in ieee80211_sta_join()
986 ieee80211_parse_meshid(ni, ni->ni_ies.meshid_ie); in ieee80211_sta_join()
989 if (ni->ni_ies.tdma_ie != NULL) in ieee80211_sta_join()
990 ieee80211_parse_tdma(ni, ni->ni_ies.tdma_ie); in ieee80211_sta_join()
992 if (ni->ni_ies.vhtcap_ie != NULL) in ieee80211_sta_join()
993 ieee80211_parse_vhtcap(ni, ni->ni_ies.vhtcap_ie); in ieee80211_sta_join()
994 if (ni->ni_ies.vhtopmode_ie != NULL) in ieee80211_sta_join()
995 ieee80211_parse_vhtopmode(ni, ni->ni_ies.vhtopmode_ie); in ieee80211_sta_join()
1002 vap->iv_dtim_period = se->se_dtimperiod; in ieee80211_sta_join()
1003 vap->iv_dtim_count = 0; in ieee80211_sta_join()
1006 ieee80211_setup_rates(ni, se->se_rates, se->se_xrates, in ieee80211_sta_join()
1008 if (ieee80211_iserp_rateset(&ni->ni_rates)) in ieee80211_sta_join()
1009 ni->ni_flags |= IEEE80211_NODE_ERP; in ieee80211_sta_join()
1013 * non-STA modes won't pick this state up. in ieee80211_sta_join()
1020 if (ni->ni_ies.htinfo_ie != NULL && in ieee80211_sta_join()
1021 ni->ni_ies.htcap_ie != NULL && in ieee80211_sta_join()
1022 vap->iv_flags_ht & IEEE80211_FHT_HT) { in ieee80211_sta_join()
1025 ni->ni_ies.htcap_ie, in ieee80211_sta_join()
1026 ni->ni_ies.htinfo_ie); in ieee80211_sta_join()
1036 if (do_ht && ni->ni_ies.vhtopmode_ie != NULL && in ieee80211_sta_join()
1037 ni->ni_ies.vhtcap_ie != NULL && in ieee80211_sta_join()
1038 vap->iv_vht_flags & IEEE80211_FVHT_VHT) { in ieee80211_sta_join()
1039 if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) { in ieee80211_sta_join()
1040 net80211_vap_printf(ni->ni_vap, in ieee80211_sta_join()
1042 __func__, ni->ni_macaddr, ":"); in ieee80211_sta_join()
1046 ni->ni_ies.vhtcap_ie, in ieee80211_sta_join()
1047 ni->ni_ies.vhtopmode_ie); in ieee80211_sta_join()
1054 ieee80211_ht_updateparams_final(ni, ni->ni_ies.htcap_ie, in ieee80211_sta_join()
1055 ni->ni_ies.htinfo_ie); in ieee80211_sta_join()
1056 ieee80211_setup_htrates(ni, ni->ni_ies.htcap_ie, in ieee80211_sta_join()
1058 ieee80211_setup_basic_htrates(ni, ni->ni_ies.htinfo_ie); in ieee80211_sta_join()
1077 struct ieee80211com *ic = ni->ni_ic; in ieee80211_sta_leave()
1079 ic->ic_node_cleanup(ni); in ieee80211_sta_leave()
1091 if (ni->ni_associd != 0) in ieee80211_node_deauth()
1115 * data exists re-use the data block. As a side effect we clear
1124 if (ies->data != NULL && ies->len != len) { in ieee80211_ies_init()
1126 IEEE80211_FREE(ies->data, M_80211_NODE_IE); in ieee80211_ies_init()
1127 ies->data = NULL; in ieee80211_ies_init()
1129 if (ies->data == NULL) { in ieee80211_ies_init()
1130 ies->data = (uint8_t *) IEEE80211_MALLOC(len, M_80211_NODE_IE, in ieee80211_ies_init()
1132 if (ies->data == NULL) { in ieee80211_ies_init()
1133 ies->len = 0; in ieee80211_ies_init()
1138 memcpy(ies->data, data, len); in ieee80211_ies_init()
1139 ies->len = len; in ieee80211_ies_init()
1149 if (ies->data != NULL) in ieee80211_ies_cleanup()
1150 IEEE80211_FREE(ies->data, M_80211_NODE_IE); in ieee80211_ies_cleanup()
1155 * ie pointers. The data blob is assumed to be well-formed;
1164 ie = ies->data; in ieee80211_ies_expand()
1165 ielen = ies->len; in ieee80211_ies_expand()
1171 __func__, ies, ies->data, ies->len, in ieee80211_ies_expand()
1178 ies->wpa_ie = ie; in ieee80211_ies_expand()
1180 ies->wme_ie = ie; in ieee80211_ies_expand()
1183 ies->ath_ie = ie; in ieee80211_ies_expand()
1187 ies->tdma_ie = ie; in ieee80211_ies_expand()
1191 ies->rsn_ie = ie; in ieee80211_ies_expand()
1194 ies->htcap_ie = ie; in ieee80211_ies_expand()
1197 ies->htinfo_ie = ie; in ieee80211_ies_expand()
1201 ies->meshid_ie = ie; in ieee80211_ies_expand()
1205 ies->vhtcap_ie = ie; in ieee80211_ies_expand()
1208 ies->vhtopmode_ie = ie; in ieee80211_ies_expand()
1211 ies->vhtpwrenv_ie = ie; in ieee80211_ies_expand()
1214 ies->bssload_ie = ie; in ieee80211_ies_expand()
1217 ies->apchanrep_ie = ie; in ieee80211_ies_expand()
1220 ielen -= 2 + ie[1]; in ieee80211_ies_expand()
1234 struct ieee80211vap *vap = ni->ni_vap; in node_cleanup()
1235 struct ieee80211com *ic = ni->ni_ic; in node_cleanup()
1239 if (ni->ni_flags & IEEE80211_NODE_PWR_MGT) { in node_cleanup()
1240 if (vap->iv_opmode != IEEE80211_M_STA) in node_cleanup()
1241 vap->iv_ps_sta--; in node_cleanup()
1242 ni->ni_flags &= ~IEEE80211_NODE_PWR_MGT; in node_cleanup()
1244 "power save mode off, %u sta's in ps mode", vap->iv_ps_sta); in node_cleanup()
1247 * Cleanup any VHT and HT-related state. in node_cleanup()
1249 if (ni->ni_flags & IEEE80211_NODE_VHT) in node_cleanup()
1251 if (ni->ni_flags & IEEE80211_NODE_HT) in node_cleanup()
1254 /* Always do FF node cleanup; for A-MSDU */ in node_cleanup()
1259 * Cleanup any mesh-related state. in node_cleanup()
1261 if (vap->iv_opmode == IEEE80211_M_MBSS) in node_cleanup()
1267 ieee80211_ageq_drain_node(&ic->ic_stageq, ni); in node_cleanup()
1277 ni->ni_flags &= ~(IEEE80211_NODE_AREF | IEEE80211_NODE_ASSOCID); in node_cleanup()
1282 if (ieee80211_node_psq_drain(ni) != 0 && vap->iv_set_tim != NULL) in node_cleanup()
1283 vap->iv_set_tim(ni, 0); in node_cleanup()
1285 ni->ni_associd = 0; in node_cleanup()
1286 if (ni->ni_challenge != NULL) { in node_cleanup()
1287 IEEE80211_FREE(ni->ni_challenge, M_80211_NODE); in node_cleanup()
1288 ni->ni_challenge = NULL; in node_cleanup()
1292 * reusable during a re-auth/re-assoc state transition. in node_cleanup()
1294 * because they come from a probe-response or beacon frame in node_cleanup()
1295 * which cannot be expected prior to the association-response. in node_cleanup()
1302 for (i = 0; i < nitems(ni->ni_rxfrag); i++) in node_cleanup()
1303 if (ni->ni_rxfrag[i] != NULL) { in node_cleanup()
1304 m_freem(ni->ni_rxfrag[i]); in node_cleanup()
1305 ni->ni_rxfrag[i] = NULL; in node_cleanup()
1316 struct ieee80211com *ic = ni->ni_ic; in node_free()
1319 ic->ic_node_cleanup(ni); in node_free()
1320 ieee80211_ies_cleanup(&ni->ni_ies); in node_free()
1321 ieee80211_psq_cleanup(&ni->ni_psq); in node_free()
1328 struct ieee80211vap *vap = ni->ni_vap; in node_age()
1334 ni->ni_psq.psq_len == 0 && vap->iv_set_tim != NULL) in node_age()
1335 vap->iv_set_tim(ni, 0); in node_age()
1338 * A-MPDU reorder queues). in node_age()
1340 if (ni->ni_associd != 0 && (ni->ni_flags & IEEE80211_NODE_HT)) in node_age()
1347 uint32_t avgrssi = ni->ni_avgrssi; in node_getrssi()
1360 *noise = ni->ni_noise; in node_getsignal()
1373 for (i = 0; i < MIN(IEEE80211_MAX_CHAINS, ni->ni_mimo_chains); i++) { in node_getmimoinfo()
1375 avgrssi = ni->ni_mimo_rssi_ctl[i]; in node_getmimoinfo()
1377 info->ch[i].rssi[0] = 0; in node_getmimoinfo()
1380 info->ch[i].rssi[0] = rssi < 0 ? 0 : rssi > 127 ? 127 : rssi; in node_getmimoinfo()
1382 info->ch[i].noise[0] = ni->ni_mimo_noise_ctl[i]; in node_getmimoinfo()
1394 struct ieee80211com *ic = nt->nt_ic; in ieee80211_add_node_nt()
1399 hash = IEEE80211_NODE_HASH(ic, ni->ni_macaddr); in ieee80211_add_node_nt()
1401 TAILQ_INSERT_TAIL(&nt->nt_node, ni, ni_list); in ieee80211_add_node_nt()
1402 LIST_INSERT_HEAD(&nt->nt_hash[hash], ni, ni_hash); in ieee80211_add_node_nt()
1403 nt->nt_count++; in ieee80211_add_node_nt()
1404 ni->ni_table = nt; in ieee80211_add_node_nt()
1414 TAILQ_REMOVE(&nt->nt_node, ni, ni_list); in ieee80211_del_node_nt()
1416 nt->nt_count--; in ieee80211_del_node_nt()
1417 KASSERT(nt->nt_count >= 0, in ieee80211_del_node_nt()
1418 ("nt_count is negative (%d)!\n", nt->nt_count)); in ieee80211_del_node_nt()
1419 ni->ni_table = NULL; in ieee80211_del_node_nt()
1427 struct ieee80211com *ic = nt->nt_ic; in ieee80211_alloc_node()
1430 ni = ic->ic_node_alloc(vap, macaddr); in ieee80211_alloc_node()
1432 vap->iv_stats.is_rx_nodealloc++; in ieee80211_alloc_node()
1438 ether_sprintf(macaddr), nt->nt_name); in ieee80211_alloc_node()
1440 IEEE80211_ADDR_COPY(ni->ni_macaddr, macaddr); in ieee80211_alloc_node()
1445 ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)); in ieee80211_alloc_node()
1447 ni->ni_chan = IEEE80211_CHAN_ANYC; in ieee80211_alloc_node()
1448 ni->ni_authmode = IEEE80211_AUTH_OPEN; in ieee80211_alloc_node()
1449 ni->ni_txpower = ic->ic_txpowlimit; /* max power */ in ieee80211_alloc_node()
1450 ni->ni_txparms = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)]; in ieee80211_alloc_node()
1451 ieee80211_crypto_resetkey(vap, &ni->ni_ucastkey, IEEE80211_KEYIX_NONE); in ieee80211_alloc_node()
1452 ni->ni_avgrssi = IEEE80211_RSSI_DUMMY_MARKER; in ieee80211_alloc_node()
1453 ni->ni_inact_reload = nt->nt_inact_init; in ieee80211_alloc_node()
1454 ni->ni_inact = ni->ni_inact_reload; in ieee80211_alloc_node()
1455 ni->ni_ath_defkeyix = 0x7fff; in ieee80211_alloc_node()
1456 ieee80211_psq_init(&ni->ni_psq, "unknown"); in ieee80211_alloc_node()
1458 if (vap->iv_opmode == IEEE80211_M_MBSS) in ieee80211_alloc_node()
1463 ni->ni_vap = vap; in ieee80211_alloc_node()
1464 ni->ni_ic = ic; in ieee80211_alloc_node()
1468 if (ic->ic_node_init(ni) != 0) { in ieee80211_alloc_node()
1469 vap->iv_stats.is_rx_nodealloc++; in ieee80211_alloc_node()
1470 ieee80211_psq_cleanup(&ni->ni_psq); in ieee80211_alloc_node()
1477 "%s: inact_reload %u", __func__, ni->ni_inact_reload); in ieee80211_alloc_node()
1492 struct ieee80211com *ic = vap->iv_ic; in ieee80211_tmp_node()
1495 ni = ic->ic_node_alloc(vap, macaddr); in ieee80211_tmp_node()
1497 struct ieee80211_node *bss = vap->iv_bss; in ieee80211_tmp_node()
1502 ni->ni_table = NULL; /* NB: pedantic */ in ieee80211_tmp_node()
1503 ni->ni_ic = ic; /* NB: needed to set channel */ in ieee80211_tmp_node()
1504 ni->ni_vap = vap; in ieee80211_tmp_node()
1506 IEEE80211_ADDR_COPY(ni->ni_macaddr, macaddr); in ieee80211_tmp_node()
1507 IEEE80211_ADDR_COPY(ni->ni_bssid, bss->ni_bssid); in ieee80211_tmp_node()
1512 "%s (%s:%u) %p<%s> refcnt %d\n", __func__, "", -1, ni, in ieee80211_tmp_node()
1513 ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)); in ieee80211_tmp_node()
1516 ieee80211_node_set_chan(ni, bss->ni_chan); in ieee80211_tmp_node()
1517 ieee80211_crypto_resetkey(vap, &ni->ni_ucastkey, in ieee80211_tmp_node()
1519 ni->ni_txpower = bss->ni_txpower; in ieee80211_tmp_node()
1521 ieee80211_psq_init(&ni->ni_psq, "unknown"); in ieee80211_tmp_node()
1526 if (ic->ic_node_init(ni) != 0) { in ieee80211_tmp_node()
1527 vap->iv_stats.is_rx_nodealloc++; in ieee80211_tmp_node()
1528 ieee80211_psq_cleanup(&ni->ni_psq); in ieee80211_tmp_node()
1536 vap->iv_stats.is_rx_nodealloc++; in ieee80211_tmp_node()
1545 struct ieee80211com *ic = vap->iv_ic; in ieee80211_dup_bss()
1548 ni = ieee80211_alloc_node(&ic->ic_sta, vap, macaddr, __func__, __LINE__); in ieee80211_dup_bss()
1550 struct ieee80211_node *bss = vap->iv_bss; in ieee80211_dup_bss()
1555 IEEE80211_ADDR_COPY(ni->ni_bssid, bss->ni_bssid); in ieee80211_dup_bss()
1556 ieee80211_node_set_chan(ni, bss->ni_chan); in ieee80211_dup_bss()
1572 struct ieee80211com *ic = vap->iv_ic; in ieee80211_node_create_wds()
1576 ni = ieee80211_alloc_node(&ic->ic_sta, vap, bssid, __func__, __LINE__); in ieee80211_node_create_wds()
1578 ni->ni_wdsvap = vap; in ieee80211_node_create_wds()
1579 IEEE80211_ADDR_COPY(ni->ni_bssid, bssid); in ieee80211_node_create_wds()
1583 copy_bss(ni, vap->iv_bss); in ieee80211_node_create_wds()
1586 ni->ni_esslen = vap->iv_des_ssid[0].len; in ieee80211_node_create_wds()
1587 memcpy(ni->ni_essid, vap->iv_des_ssid[0].ssid, ni->ni_esslen); in ieee80211_node_create_wds()
1594 if (vap->iv_flags & IEEE80211_F_WME) in ieee80211_node_create_wds()
1595 ni->ni_flags |= IEEE80211_NODE_QOS; in ieee80211_node_create_wds()
1597 if (vap->iv_flags & IEEE80211_F_FF) in ieee80211_node_create_wds()
1598 ni->ni_flags |= IEEE80211_NODE_FF; in ieee80211_node_create_wds()
1601 if ((ic->ic_htcaps & IEEE80211_HTC_HT) && in ieee80211_node_create_wds()
1602 (vap->iv_flags_ht & IEEE80211_FHT_HT)) { in ieee80211_node_create_wds()
1604 * Device is HT-capable and HT is enabled for in ieee80211_node_create_wds()
1609 if (vap->iv_vht_flags & IEEE80211_FVHT_VHT) { in ieee80211_node_create_wds()
1614 struct ieee80211_channel *c = ni->ni_chan; in ieee80211_node_create_wds()
1619 c->ic_freq, c->ic_flags &~ IEEE80211_CHAN_HT); in ieee80211_node_create_wds()
1621 ni->ni_chan->ic_freq, ni->ni_chan->ic_flags)); in ieee80211_node_create_wds()
1622 ni->ni_chan = c; in ieee80211_node_create_wds()
1638 hash = IEEE80211_NODE_HASH(nt->nt_ic, macaddr); in _ieee80211_find_node_locked()
1639 LIST_FOREACH(ni, &nt->nt_hash[hash], ni_hash) { in _ieee80211_find_node_locked()
1640 if (IEEE80211_ADDR_EQ(ni->ni_macaddr, macaddr)) { in _ieee80211_find_node_locked()
1643 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE, in _ieee80211_find_node_locked()
1646 ni, ether_sprintf(ni->ni_macaddr), in _ieee80211_find_node_locked()
1678 hash = IEEE80211_NODE_HASH(nt->nt_ic, macaddr); in _ieee80211_find_vap_node_locked()
1679 LIST_FOREACH(ni, &nt->nt_hash[hash], ni_hash) { in _ieee80211_find_vap_node_locked()
1680 if (ni->ni_vap == vap && in _ieee80211_find_vap_node_locked()
1681 IEEE80211_ADDR_EQ(ni->ni_macaddr, macaddr)) { in _ieee80211_find_vap_node_locked()
1684 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE, in _ieee80211_find_vap_node_locked()
1687 ni, ether_sprintf(ni->ni_macaddr), in _ieee80211_find_vap_node_locked()
1725 struct ieee80211com *ic = vap->iv_ic; in ieee80211_fakeup_adhoc_node()
1728 ni->ni_rates = vap->iv_bss->ni_rates; in ieee80211_fakeup_adhoc_node()
1729 if (ieee80211_iserp_rateset(&ni->ni_rates)) in ieee80211_fakeup_adhoc_node()
1730 ni->ni_flags |= IEEE80211_NODE_ERP; in ieee80211_fakeup_adhoc_node()
1731 if (vap->iv_opmode == IEEE80211_M_AHDEMO) { in ieee80211_fakeup_adhoc_node()
1742 if (vap->iv_flags & IEEE80211_F_WME) in ieee80211_fakeup_adhoc_node()
1743 ni->ni_flags |= IEEE80211_NODE_QOS; in ieee80211_fakeup_adhoc_node()
1745 if (vap->iv_flags & IEEE80211_F_FF) in ieee80211_fakeup_adhoc_node()
1746 ni->ni_flags |= IEEE80211_NODE_FF; in ieee80211_fakeup_adhoc_node()
1753 * XXX TODO: 11n? At least 20MHz, at least A-MPDU RX, in ieee80211_fakeup_adhoc_node()
1754 * not A-MPDU TX; not 11n rates, etc. We'll cycle in ieee80211_fakeup_adhoc_node()
1762 if (ic->ic_newassoc != NULL) in ieee80211_fakeup_adhoc_node()
1763 ic->ic_newassoc(ni, 1); in ieee80211_fakeup_adhoc_node()
1780 if (vap->iv_opmode == IEEE80211_M_IBSS) { in ieee80211_fakeup_adhoc_node()
1782 vap->iv_myaddr, /* SA */ in ieee80211_fakeup_adhoc_node()
1783 ni->ni_macaddr, /* DA */ in ieee80211_fakeup_adhoc_node()
1784 vap->iv_bss->ni_bssid, /* BSSID */ in ieee80211_fakeup_adhoc_node()
1785 vap->iv_bss->ni_essid, in ieee80211_fakeup_adhoc_node()
1786 vap->iv_bss->ni_esslen); /* SSID */ in ieee80211_fakeup_adhoc_node()
1802 ni->ni_esslen = sp->ssid[1]; in ieee80211_init_neighbor()
1803 memcpy(ni->ni_essid, sp->ssid + 2, sp->ssid[1]); in ieee80211_init_neighbor()
1804 IEEE80211_ADDR_COPY(ni->ni_bssid, wh->i_addr3); in ieee80211_init_neighbor()
1805 memcpy(ni->ni_tstamp.data, sp->tstamp, sizeof(ni->ni_tstamp)); in ieee80211_init_neighbor()
1806 ni->ni_intval = sp->bintval; in ieee80211_init_neighbor()
1807 ni->ni_capinfo = sp->capinfo; in ieee80211_init_neighbor()
1808 ni->ni_chan = ni->ni_ic->ic_curchan; in ieee80211_init_neighbor()
1809 ni->ni_fhdwell = sp->fhdwell; in ieee80211_init_neighbor()
1810 ni->ni_fhindex = sp->fhindex; in ieee80211_init_neighbor()
1811 ni->ni_erp = sp->erp; in ieee80211_init_neighbor()
1812 ni->ni_timoff = sp->timoff; in ieee80211_init_neighbor()
1814 if (ni->ni_vap->iv_opmode == IEEE80211_M_MBSS) in ieee80211_init_neighbor()
1817 if (ieee80211_ies_init(&ni->ni_ies, sp->ies, sp->ies_len)) { in ieee80211_init_neighbor()
1818 ieee80211_ies_expand(&ni->ni_ies); in ieee80211_init_neighbor()
1819 if (ni->ni_ies.wme_ie != NULL) in ieee80211_init_neighbor()
1820 ni->ni_flags |= IEEE80211_NODE_QOS; in ieee80211_init_neighbor()
1822 ni->ni_flags &= ~IEEE80211_NODE_QOS; in ieee80211_init_neighbor()
1824 if (ni->ni_ies.ath_ie != NULL) in ieee80211_init_neighbor()
1825 ieee80211_parse_ath(ni, ni->ni_ies.ath_ie); in ieee80211_init_neighbor()
1827 if (ni->ni_ies.htcap_ie != NULL) in ieee80211_init_neighbor()
1828 ieee80211_parse_htcap(ni, ni->ni_ies.htcap_ie); in ieee80211_init_neighbor()
1829 if (ni->ni_ies.htinfo_ie != NULL) in ieee80211_init_neighbor()
1830 ieee80211_parse_htinfo(ni, ni->ni_ies.htinfo_ie); in ieee80211_init_neighbor()
1832 if (ni->ni_ies.vhtcap_ie != NULL) in ieee80211_init_neighbor()
1833 ieee80211_parse_vhtcap(ni, ni->ni_ies.vhtcap_ie); in ieee80211_init_neighbor()
1834 if (ni->ni_ies.vhtopmode_ie != NULL) in ieee80211_init_neighbor()
1835 ieee80211_parse_vhtopmode(ni, ni->ni_ies.vhtopmode_ie); in ieee80211_init_neighbor()
1837 if ((ni->ni_ies.htcap_ie != NULL) && in ieee80211_init_neighbor()
1838 (ni->ni_ies.htinfo_ie != NULL) && in ieee80211_init_neighbor()
1839 (ni->ni_vap->iv_flags_ht & IEEE80211_FHT_HT)) { in ieee80211_init_neighbor()
1843 if ((ni->ni_ies.vhtcap_ie != NULL) && in ieee80211_init_neighbor()
1844 (ni->ni_ies.vhtopmode_ie != NULL) && in ieee80211_init_neighbor()
1845 (ni->ni_vap->iv_vht_flags & IEEE80211_FVHT_VHT)) { in ieee80211_init_neighbor()
1851 ieee80211_setup_rates(ni, sp->rates, sp->xrates, in ieee80211_init_neighbor()
1859 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_ASSOC, in ieee80211_init_neighbor()
1863 ni->ni_ies.htcap_ie, in ieee80211_init_neighbor()
1864 ni->ni_ies.htinfo_ie); in ieee80211_init_neighbor()
1867 if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) { in ieee80211_init_neighbor()
1868 net80211_vap_printf(ni->ni_vap, in ieee80211_init_neighbor()
1870 __func__, ni->ni_macaddr, ":"); in ieee80211_init_neighbor()
1874 ni->ni_ies.vhtcap_ie, in ieee80211_init_neighbor()
1875 ni->ni_ies.vhtopmode_ie); in ieee80211_init_neighbor()
1884 ieee80211_ht_updateparams_final(ni, ni->ni_ies.htcap_ie, in ieee80211_init_neighbor()
1885 ni->ni_ies.htinfo_ie); in ieee80211_init_neighbor()
1887 ni->ni_ies.htcap_ie, in ieee80211_init_neighbor()
1890 ni->ni_ies.htinfo_ie); in ieee80211_init_neighbor()
1897 * XXX TODO: this is the wrong thing to do - in ieee80211_init_neighbor()
1907 if (ni->ni_ic->ic_newassoc) in ieee80211_init_neighbor()
1908 ni->ni_ic->ic_newassoc(ni, 1); in ieee80211_init_neighbor()
1926 "%s: mac<%s>\n", __func__, ether_sprintf(wh->i_addr2)); in ieee80211_add_neighbor()
1927 ni = ieee80211_dup_bss(vap, wh->i_addr2);/* XXX alloc_node? */ in ieee80211_add_neighbor()
1929 struct ieee80211com *ic = vap->iv_ic; in ieee80211_add_neighbor()
1932 if (ieee80211_iserp_rateset(&ni->ni_rates)) in ieee80211_add_neighbor()
1933 ni->ni_flags |= IEEE80211_NODE_ERP; in ieee80211_add_neighbor()
1936 if (ic->ic_newassoc != NULL) in ieee80211_add_neighbor()
1937 ic->ic_newassoc(ni, 1); in ieee80211_add_neighbor()
1945 ((wh->i_fc[0] & (IEEE80211_FC0_TYPE_MASK|IEEE80211_FC0_SUBTYPE_MASK)) \
1949 ((const struct ieee80211_frame *)(wh))->i_addr3))
1958 return _ieee80211_find_node_locked(nt, wh->i_addr2, func, line); in _find_rxnode()
1974 nt = &ic->ic_sta; in _ieee80211_find_rxnode()
1998 nt = &ic->ic_sta; in _ieee80211_find_rxnode_withkey()
2000 if (nt->nt_keyixmap != NULL && keyix < nt->nt_keyixmax) in _ieee80211_find_rxnode_withkey()
2001 ni = nt->nt_keyixmap[keyix]; in _ieee80211_find_rxnode_withkey()
2006 if (ni != NULL && nt->nt_keyixmap != NULL) { in _ieee80211_find_rxnode_withkey()
2009 * assigned update the key->node mapping table. in _ieee80211_find_rxnode_withkey()
2011 keyix = ni->ni_ucastkey.wk_rxkeyix; in _ieee80211_find_rxnode_withkey()
2013 if (keyix < nt->nt_keyixmax && in _ieee80211_find_rxnode_withkey()
2014 nt->nt_keyixmap[keyix] == NULL) { in _ieee80211_find_rxnode_withkey()
2015 IEEE80211_DPRINTF(ni->ni_vap, in _ieee80211_find_rxnode_withkey()
2018 __func__, ni, ether_sprintf(ni->ni_macaddr), in _ieee80211_find_rxnode_withkey()
2020 nt->nt_keyixmap[keyix] = ieee80211_ref_node(ni); in _ieee80211_find_rxnode_withkey()
2045 struct ieee80211_node_table *nt = &vap->iv_ic->ic_sta; in _ieee80211_find_txnode()
2056 if (vap->iv_opmode == IEEE80211_M_STA || in _ieee80211_find_txnode()
2057 vap->iv_opmode == IEEE80211_M_WDS || in _ieee80211_find_txnode()
2059 ni = ieee80211_ref_node(vap->iv_bss); in _ieee80211_find_txnode()
2065 if (vap->iv_opmode == IEEE80211_M_IBSS || in _ieee80211_find_txnode()
2066 vap->iv_opmode == IEEE80211_M_AHDEMO) { in _ieee80211_find_txnode()
2083 vap->iv_stats.is_tx_nonode++; in _ieee80211_find_txnode()
2095 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE, in _ieee80211_ref_node()
2097 ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)+1); in _ieee80211_ref_node()
2106 struct ieee80211_node_table *nt = ni->ni_table; in __ieee80211_free_node()
2117 ether_sprintf(ni->ni_macaddr), in __ieee80211_free_node()
2118 nt != NULL ? nt->nt_name : "<gone>"); in __ieee80211_free_node()
2120 if (ni->ni_associd != 0) { in __ieee80211_free_node()
2121 struct ieee80211vap *vap = ni->ni_vap; in __ieee80211_free_node()
2122 if (vap->iv_aid_bitmap != NULL) in __ieee80211_free_node()
2123 IEEE80211_AID_CLR(vap, ni->ni_associd); in __ieee80211_free_node()
2127 ni->ni_ic->ic_node_free(ni); in __ieee80211_free_node()
2138 keyix = ni->ni_ucastkey.wk_rxkeyix; in node_clear_keyixmap()
2139 if (nt->nt_keyixmap != NULL && keyix < nt->nt_keyixmax && in node_clear_keyixmap()
2140 nt->nt_keyixmap[keyix] == ni) { in node_clear_keyixmap()
2141 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE, in node_clear_keyixmap()
2143 __func__, ni, ether_sprintf(ni->ni_macaddr), keyix); in node_clear_keyixmap()
2144 nt->nt_keyixmap[keyix] = NULL; in node_clear_keyixmap()
2156 struct ieee80211_node_table *nt = ni->ni_table; in _ieee80211_free_node()
2159 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE, in _ieee80211_free_node()
2161 ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)-1); in _ieee80211_free_node()
2186 struct ieee80211com *ic = ni->ni_ic; in ieee80211_node_delucastkey()
2187 struct ieee80211_node_table *nt = &ic->ic_sta; in ieee80211_node_delucastkey()
2209 if (!IEEE80211_KEY_UNDEFINED(&ni->ni_ucastkey)) { in ieee80211_node_delucastkey()
2210 keyix = ni->ni_ucastkey.wk_rxkeyix; in ieee80211_node_delucastkey()
2211 status = ieee80211_crypto_delkey(ni->ni_vap, &ni->ni_ucastkey); in ieee80211_node_delucastkey()
2212 if (nt->nt_keyixmap != NULL && keyix < nt->nt_keyixmax) { in ieee80211_node_delucastkey()
2213 nikey = nt->nt_keyixmap[keyix]; in ieee80211_node_delucastkey()
2214 nt->nt_keyixmap[keyix] = NULL; in ieee80211_node_delucastkey()
2223 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE, in ieee80211_node_delucastkey()
2225 __func__, ni, ether_sprintf(ni->ni_macaddr), in ieee80211_node_delucastkey()
2226 ieee80211_node_refcnt(ni)-1); in ieee80211_node_delucastkey()
2235 * table and mark it gone by clearing the back-reference.
2243 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE, in node_reclaim()
2245 __func__, ni, ether_sprintf(ni->ni_macaddr), in node_reclaim()
2246 nt->nt_name, ieee80211_node_refcnt(ni)-1); in node_reclaim()
2277 nt->nt_ic = ic; in ieee80211_node_table_init()
2278 IEEE80211_NODE_LOCK_INIT(nt, ic->ic_name); in ieee80211_node_table_init()
2279 TAILQ_INIT(&nt->nt_node); in ieee80211_node_table_init()
2280 nt->nt_count = 0; in ieee80211_node_table_init()
2281 nt->nt_name = name; in ieee80211_node_table_init()
2282 nt->nt_inact_init = inact; in ieee80211_node_table_init()
2283 nt->nt_keyixmax = keyixmax; in ieee80211_node_table_init()
2284 if (nt->nt_keyixmax > 0) { in ieee80211_node_table_init()
2285 nt->nt_keyixmap = (struct ieee80211_node **) IEEE80211_MALLOC( in ieee80211_node_table_init()
2289 if (nt->nt_keyixmap == NULL) in ieee80211_node_table_init()
2294 nt->nt_keyixmap = NULL; in ieee80211_node_table_init()
2304 TAILQ_FOREACH_SAFE(ni, &nt->nt_node, ni_list, next) { in ieee80211_node_table_reset()
2305 if (match != NULL && ni->ni_vap != match) in ieee80211_node_table_reset()
2308 if (ni->ni_associd != 0) { in ieee80211_node_table_reset()
2309 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_node_table_reset()
2311 if (vap->iv_auth->ia_node_leave != NULL) in ieee80211_node_table_reset()
2312 vap->iv_auth->ia_node_leave(ni); in ieee80211_node_table_reset()
2313 if (vap->iv_aid_bitmap != NULL) in ieee80211_node_table_reset()
2314 IEEE80211_AID_CLR(vap, ni->ni_associd); in ieee80211_node_table_reset()
2316 ni->ni_wdsvap = NULL; /* clear reference */ in ieee80211_node_table_reset()
2319 if (match != NULL && match->iv_opmode == IEEE80211_M_WDS) { in ieee80211_node_table_reset()
2327 TAILQ_FOREACH_SAFE(ni, &nt->nt_node, ni_list, next) in ieee80211_node_table_reset()
2328 if (ni->ni_wdsvap == match) in ieee80211_node_table_reset()
2329 ni->ni_wdsvap = NULL; in ieee80211_node_table_reset()
2338 if (nt->nt_keyixmap != NULL) { in ieee80211_node_table_cleanup()
2342 for (i = 0; i < nt->nt_keyixmax; i++) in ieee80211_node_table_cleanup()
2343 if (nt->nt_keyixmap[i] != NULL) in ieee80211_node_table_cleanup()
2345 nt->nt_name, i); in ieee80211_node_table_cleanup()
2347 IEEE80211_FREE(nt->nt_keyixmap, M_80211_NODE); in ieee80211_node_table_cleanup()
2348 nt->nt_keyixmap = NULL; in ieee80211_node_table_cleanup()
2356 struct ieee80211com *ic = ni->ni_ic; in timeout_stations()
2357 struct ieee80211vap *vap = ni->ni_vap; in timeout_stations()
2366 if (vap->iv_state != IEEE80211_S_RUN) in timeout_stations()
2374 if ((vap->iv_opmode == IEEE80211_M_HOSTAP || in timeout_stations()
2375 vap->iv_opmode == IEEE80211_M_STA) && in timeout_stations()
2376 (ni->ni_flags & IEEE80211_NODE_AREF) == 0) in timeout_stations()
2383 if (ni->ni_rxfrag[0] != NULL && in timeout_stations()
2384 ticks > ni->ni_rxfragstamp + hz) { in timeout_stations()
2385 m_freem(ni->ni_rxfrag[0]); in timeout_stations()
2386 ni->ni_rxfrag[0] = NULL; in timeout_stations()
2388 if (ni->ni_inact > 0) { in timeout_stations()
2389 ni->ni_inact--; in timeout_stations()
2392 __func__, ni->ni_inact, ni->ni_inact_reload, in timeout_stations()
2393 ni->ni_rates.rs_nrates); in timeout_stations()
2401 if (ni == vap->iv_bss) in timeout_stations()
2403 if (ni->ni_associd != 0 || in timeout_stations()
2404 (vap->iv_opmode == IEEE80211_M_IBSS || in timeout_stations()
2405 vap->iv_opmode == IEEE80211_M_AHDEMO)) { in timeout_stations()
2409 ic->ic_node_age(ni); in timeout_stations()
2414 * for ps-poll support so it should be...). in timeout_stations()
2418 * some idea of the rates they are capable in timeout_stations()
2422 if ((vap->iv_flags_ext & IEEE80211_FEXT_INACT) && in timeout_stations()
2423 (0 < ni->ni_inact && in timeout_stations()
2424 ni->ni_inact <= vap->iv_inact_probe) && in timeout_stations()
2425 ni->ni_rates.rs_nrates != 0) { in timeout_stations()
2445 if ((vap->iv_flags_ext & IEEE80211_FEXT_INACT) && in timeout_stations()
2446 ni->ni_inact <= 0) { in timeout_stations()
2462 if (ni->ni_associd != 0) { in timeout_stations()
2468 vap->iv_stats.is_node_timeout++; in timeout_stations()
2478 struct ieee80211_node_table *nt = &ic->ic_sta; in ieee80211_timeout_stations()
2490 struct ieee80211_node_table *nt = &ic->ic_sta; in ieee80211_drain()
2495 TAILQ_FOREACH(ni, &nt->nt_node, ni_list) { in ieee80211_drain()
2502 vap = ni->ni_vap; in ieee80211_drain()
2510 if (vap->iv_state != IEEE80211_S_RUN) in ieee80211_drain()
2513 if ((vap->iv_opmode == IEEE80211_M_HOSTAP || in ieee80211_drain()
2514 vap->iv_opmode == IEEE80211_M_STA) && in ieee80211_drain()
2515 (ni->ni_flags & IEEE80211_NODE_AREF) == 0) in ieee80211_drain()
2521 if (ni->ni_rxfrag[0] != NULL) { in ieee80211_drain()
2522 m_freem(ni->ni_rxfrag[0]); in ieee80211_drain()
2523 ni->ni_rxfrag[0] = NULL; in ieee80211_drain()
2528 ic->ic_node_drain(ni); in ieee80211_drain()
2534 * Per-ieee80211vap inactivity timer callback.
2540 IEEE80211_LOCK_ASSERT(vap->iv_ic); in ieee80211_vap_timeout()
2548 * Per-ieee80211com inactivity timer callback.
2565 if ((ic->ic_flags & IEEE80211_F_CSAPENDING) == 0) { in ieee80211_node_timeout()
2568 ieee80211_ageq_age(&ic->ic_stageq, IEEE80211_INACT_WAIT); in ieee80211_node_timeout()
2571 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) in ieee80211_node_timeout()
2575 callout_reset(&ic->ic_inact, IEEE80211_INACT_WAIT*hz, in ieee80211_node_timeout()
2598 count = nt->nt_count; in ieee80211_iterate_nodes_vap()
2608 TAILQ_FOREACH(ni, &nt->nt_node, ni_list) { in ieee80211_iterate_nodes_vap()
2609 if (vap != NULL && ni->ni_vap != vap) in ieee80211_iterate_nodes_vap()
2649 ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)); in ieee80211_dump_node()
2651 ni->ni_authmode, ni->ni_flags); in ieee80211_dump_node()
2653 ni->ni_associd, ni->ni_txpower, ni->ni_vlan); in ieee80211_dump_node()
2655 ni->ni_txseqs[IEEE80211_NONQOS_TID], in ieee80211_dump_node()
2656 ni->ni_rxseqs[IEEE80211_NONQOS_TID] >> IEEE80211_SEQ_SEQ_SHIFT, in ieee80211_dump_node()
2657 ni->ni_rxseqs[IEEE80211_NONQOS_TID] & IEEE80211_SEQ_FRAG_MASK, in ieee80211_dump_node()
2658 ni->ni_rxfragstamp); in ieee80211_dump_node()
2660 node_getrssi(ni), ni->ni_noise, in ieee80211_dump_node()
2661 ni->ni_intval, ni->ni_capinfo); in ieee80211_dump_node()
2663 ether_sprintf(ni->ni_bssid), in ieee80211_dump_node()
2664 ni->ni_esslen, ni->ni_essid, in ieee80211_dump_node()
2665 (ni->ni_chan != IEEE80211_CHAN_ANYC) ? ni->ni_chan->ic_freq : 0, in ieee80211_dump_node()
2666 (ni->ni_chan != IEEE80211_CHAN_ANYC) ? ni->ni_chan->ic_flags : 0); in ieee80211_dump_node()
2668 ni->ni_inact, ni->ni_inact_reload, in ieee80211_dump_node()
2669 ni->ni_txrate.type, in ieee80211_dump_node()
2670 ni->ni_txrate.dot11rate); in ieee80211_dump_node()
2672 ni->ni_htcap, ni->ni_htparam, in ieee80211_dump_node()
2673 ni->ni_htctlchan, ni->ni_ht2ndchan); in ieee80211_dump_node()
2675 ni->ni_htopmode, ni->ni_htstbc, in ieee80211_dump_node()
2676 ni->ni_chw, net80211_ni_chw_to_str(ni->ni_chw)); in ieee80211_dump_node()
2678 ni->ni_vhtcap, (int) ni->ni_vht_chan1, (int) ni->ni_vht_chan2, in ieee80211_dump_node()
2679 (int) ni->ni_vht_basicmcs); in ieee80211_dump_node()
2702 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) in ieee80211_notify_erp_locked()
2703 if (vap->iv_opmode == IEEE80211_M_HOSTAP) in ieee80211_notify_erp_locked()
2713 struct ieee80211com *ic = ni->ni_ic; in ieee80211_node_join_11g()
2714 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_node_join_11g()
2725 if ((ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_SLOTTIME) == 0) { in ieee80211_node_join_11g()
2726 vap->iv_longslotsta++; in ieee80211_node_join_11g()
2727 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ASSOC, ni, in ieee80211_node_join_11g()
2729 vap->iv_longslotsta); in ieee80211_node_join_11g()
2733 if (!IEEE80211_IS_CHAN_108G(ic->ic_bsschan)) { in ieee80211_node_join_11g()
2736 * mode as non-ERP stations won't be present; this in ieee80211_node_join_11g()
2747 if (!ieee80211_iserp_rateset(&ni->ni_rates)) { in ieee80211_node_join_11g()
2748 vap->iv_nonerpsta++; in ieee80211_node_join_11g()
2749 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ASSOC, ni, in ieee80211_node_join_11g()
2750 "station is !ERP, %d non-ERP stations associated", in ieee80211_node_join_11g()
2751 vap->iv_nonerpsta); in ieee80211_node_join_11g()
2756 if ((ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE) == 0) { in ieee80211_node_join_11g()
2757 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ASSOC, ni, in ieee80211_node_join_11g()
2759 vap->iv_flags |= IEEE80211_F_USEBARKER; in ieee80211_node_join_11g()
2760 vap->iv_flags &= ~IEEE80211_F_SHPREAMBLE; in ieee80211_node_join_11g()
2767 if (vap->iv_protmode != IEEE80211_PROT_NONE && in ieee80211_node_join_11g()
2768 vap->iv_nonerpsta == 1 && in ieee80211_node_join_11g()
2769 (vap->iv_flags_ext & IEEE80211_FEXT_NONERP_PR) == 0) { in ieee80211_node_join_11g()
2770 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_ASSOC, in ieee80211_node_join_11g()
2772 vap->iv_flags |= IEEE80211_F_USEPROT; in ieee80211_node_join_11g()
2776 ni->ni_flags |= IEEE80211_NODE_ERP; in ieee80211_node_join_11g()
2782 struct ieee80211com *ic = ni->ni_ic; in ieee80211_node_join()
2783 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_node_join()
2786 if (ni->ni_associd == 0) { in ieee80211_node_join()
2789 KASSERT(vap->iv_aid_bitmap != NULL, ("no aid bitmap")); in ieee80211_node_join()
2794 for (aid = 1; aid < vap->iv_max_aid; aid++) { in ieee80211_node_join()
2798 if (aid >= vap->iv_max_aid) { in ieee80211_node_join()
2803 ni->ni_associd = aid | 0xc000; in ieee80211_node_join()
2804 ni->ni_jointime = time_uptime; in ieee80211_node_join()
2806 IEEE80211_AID_SET(vap, ni->ni_associd); in ieee80211_node_join()
2807 vap->iv_sta_assoc++; in ieee80211_node_join()
2809 if (IEEE80211_IS_CHAN_HT(ic->ic_bsschan)) in ieee80211_node_join()
2811 if (IEEE80211_IS_CHAN_VHT(ic->ic_bsschan)) in ieee80211_node_join()
2813 if (IEEE80211_IS_CHAN_ANYG(ic->ic_bsschan) && in ieee80211_node_join()
2814 IEEE80211_IS_CHAN_FULL(ic->ic_bsschan)) in ieee80211_node_join()
2823 * XXX VHT - should log VHT channel width, etc in ieee80211_node_join()
2828 vap->iv_flags & IEEE80211_F_SHPREAMBLE ? "short" : "long", in ieee80211_node_join()
2829 vap->iv_flags & IEEE80211_F_SHSLOT ? "short" : "long", in ieee80211_node_join()
2830 vap->iv_flags & IEEE80211_F_USEPROT ? ", protection" : "", in ieee80211_node_join()
2831 ni->ni_flags & IEEE80211_NODE_QOS ? ", QoS" : "", in ieee80211_node_join()
2833 ni->ni_flags & IEEE80211_NODE_HT ? in ieee80211_node_join()
2834 (ni->ni_chw == NET80211_STA_RX_BW_40 ? ", HT40" : ", HT20") : "", in ieee80211_node_join()
2835 ni->ni_flags & IEEE80211_NODE_AMPDU ? " (+AMPDU)" : "", in ieee80211_node_join()
2836 ni->ni_flags & IEEE80211_NODE_AMSDU ? " (+AMSDU)" : "", in ieee80211_node_join()
2837 ni->ni_flags & IEEE80211_NODE_MIMO_RTS ? " (+SMPS-DYN)" : in ieee80211_node_join()
2838 ni->ni_flags & IEEE80211_NODE_MIMO_PS ? " (+SMPS)" : "", in ieee80211_node_join()
2839 ni->ni_flags & IEEE80211_NODE_RIFS ? " (+RIFS)" : "", in ieee80211_node_join()
2841 ", fast-frames" : "", in ieee80211_node_join()
2849 if (ic->ic_newassoc != NULL) in ieee80211_node_join()
2850 ic->ic_newassoc(ni, newassoc); in ieee80211_node_join()
2853 if (vap->iv_auth->ia_node_join != NULL) in ieee80211_node_join()
2854 vap->iv_auth->ia_node_join(ni); in ieee80211_node_join()
2862 struct ieee80211com *ic = vap->iv_ic; in disable_protection()
2864 KASSERT(vap->iv_nonerpsta == 0 && in disable_protection()
2865 (vap->iv_flags_ext & IEEE80211_FEXT_NONERP_PR) == 0, in disable_protection()
2866 ("%d non ERP stations, flags 0x%x", vap->iv_nonerpsta, in disable_protection()
2867 vap->iv_flags_ext)); in disable_protection()
2869 vap->iv_flags &= ~IEEE80211_F_USEPROT; in disable_protection()
2871 if (ic->ic_caps & IEEE80211_C_SHPREAMBLE) { in disable_protection()
2872 vap->iv_flags |= IEEE80211_F_SHPREAMBLE; in disable_protection()
2873 vap->iv_flags &= ~IEEE80211_F_USEBARKER; in disable_protection()
2885 struct ieee80211com *ic = ni->ni_ic; in ieee80211_node_leave_11g()
2886 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_node_leave_11g()
2890 KASSERT(IEEE80211_IS_CHAN_ANYG(ic->ic_bsschan), in ieee80211_node_leave_11g()
2891 ("not in 11g, bss %u:0x%x", ic->ic_bsschan->ic_freq, in ieee80211_node_leave_11g()
2892 ic->ic_bsschan->ic_flags)); in ieee80211_node_leave_11g()
2897 if ((ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_SLOTTIME) == 0) { in ieee80211_node_leave_11g()
2898 KASSERT(vap->iv_longslotsta > 0, in ieee80211_node_leave_11g()
2899 ("bogus long slot station count %d", vap->iv_longslotsta)); in ieee80211_node_leave_11g()
2900 vap->iv_longslotsta--; in ieee80211_node_leave_11g()
2901 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ASSOC, ni, in ieee80211_node_leave_11g()
2903 vap->iv_longslotsta); in ieee80211_node_leave_11g()
2907 if (vap->iv_longslotsta == 0) { in ieee80211_node_leave_11g()
2909 * Re-enable use of short slot time if supported in ieee80211_node_leave_11g()
2912 if ((ic->ic_caps & IEEE80211_C_SHSLOT) && in ieee80211_node_leave_11g()
2913 ic->ic_opmode != IEEE80211_M_IBSS) { in ieee80211_node_leave_11g()
2914 IEEE80211_DPRINTF(ni->ni_vap, in ieee80211_node_leave_11g()
2916 "%s: re-enable use of short slot time\n", in ieee80211_node_leave_11g()
2923 * If a non-ERP station do the protection-related bookkeeping. in ieee80211_node_leave_11g()
2925 if ((ni->ni_flags & IEEE80211_NODE_ERP) == 0) { in ieee80211_node_leave_11g()
2926 KASSERT(vap->iv_nonerpsta > 0, in ieee80211_node_leave_11g()
2927 ("bogus non-ERP station count %d", vap->iv_nonerpsta)); in ieee80211_node_leave_11g()
2928 vap->iv_nonerpsta--; in ieee80211_node_leave_11g()
2929 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ASSOC, ni, in ieee80211_node_leave_11g()
2930 "non-ERP station leaves, count now %d%s", vap->iv_nonerpsta, in ieee80211_node_leave_11g()
2931 (vap->iv_flags_ext & IEEE80211_FEXT_NONERP_PR) ? in ieee80211_node_leave_11g()
2932 " (non-ERP sta present)" : ""); in ieee80211_node_leave_11g()
2933 if (vap->iv_nonerpsta == 0 && in ieee80211_node_leave_11g()
2934 (vap->iv_flags_ext & IEEE80211_FEXT_NONERP_PR) == 0) { in ieee80211_node_leave_11g()
2935 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_ASSOC, in ieee80211_node_leave_11g()
2943 * Time out presence of an overlapping bss with non-ERP
2945 * beacons from other stations and if we identify a non-ERP
2947 * when all non-ERP stations are gone we time out this
2954 IEEE80211_LOCK_ASSERT(vap->iv_ic); in ieee80211_vap_erp_timeout()
2956 if ((vap->iv_flags_ext & IEEE80211_FEXT_NONERP_PR) && in ieee80211_vap_erp_timeout()
2957 ieee80211_time_after(ticks, vap->iv_lastnonerp + IEEE80211_NONERP_PRESENT_AGE)) { in ieee80211_vap_erp_timeout()
2959 "%s", "age out non-ERP sta present on channel"); in ieee80211_vap_erp_timeout()
2960 vap->iv_flags_ext &= ~IEEE80211_FEXT_NONERP_PR; in ieee80211_vap_erp_timeout()
2961 if (vap->iv_nonerpsta == 0) in ieee80211_vap_erp_timeout()
2973 struct ieee80211com *ic = ni->ni_ic; in ieee80211_node_leave()
2974 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_node_leave()
2975 struct ieee80211_node_table *nt = ni->ni_table; in ieee80211_node_leave()
2980 KASSERT(vap->iv_opmode != IEEE80211_M_STA, in ieee80211_node_leave()
2981 ("unexpected operating mode %u", vap->iv_opmode)); in ieee80211_node_leave()
2987 if (ni->ni_associd == 0) in ieee80211_node_leave()
2995 if (vap->iv_auth->ia_node_leave != NULL) in ieee80211_node_leave()
2996 vap->iv_auth->ia_node_leave(ni); in ieee80211_node_leave()
2999 IEEE80211_AID_CLR(vap, ni->ni_associd); in ieee80211_node_leave()
3000 vap->iv_sta_assoc--; in ieee80211_node_leave()
3002 if (IEEE80211_IS_CHAN_VHT(ic->ic_bsschan)) in ieee80211_node_leave()
3004 if (IEEE80211_IS_CHAN_HT(ic->ic_bsschan)) in ieee80211_node_leave()
3006 if (IEEE80211_IS_CHAN_ANYG(ic->ic_bsschan) && in ieee80211_node_leave()
3007 IEEE80211_IS_CHAN_FULL(ic->ic_bsschan)) in ieee80211_node_leave()
3041 struct ieee80211vap *vap = ni->ni_vap; in get_hostap_rssi()
3045 if (ni->ni_associd == 0) in get_hostap_rssi()
3047 rssi = vap->iv_ic->ic_node_getrssi(ni); in get_hostap_rssi()
3049 info->rssi_samples++; in get_hostap_rssi()
3050 info->rssi_total += rssi; in get_hostap_rssi()
3058 struct ieee80211vap *vap = ni->ni_vap; in get_adhoc_rssi()
3063 if ((ni->ni_capinfo & IEEE80211_CAPINFO_IBSS) == 0) in get_adhoc_rssi()
3065 rssi = vap->iv_ic->ic_node_getrssi(ni); in get_adhoc_rssi()
3067 info->rssi_samples++; in get_adhoc_rssi()
3068 info->rssi_total += rssi; in get_adhoc_rssi()
3077 struct ieee80211vap *vap = ni->ni_vap; in get_mesh_rssi()
3081 if (ni->ni_mlstate != IEEE80211_NODE_MESH_ESTABLISHED) in get_mesh_rssi()
3083 rssi = vap->iv_ic->ic_node_getrssi(ni); in get_mesh_rssi()
3085 info->rssi_samples++; in get_mesh_rssi()
3086 info->rssi_total += rssi; in get_mesh_rssi()
3095 struct ieee80211com *ic = vap->iv_ic; in ieee80211_getrssi()
3100 switch (vap->iv_opmode) { in ieee80211_getrssi()
3103 ieee80211_iterate_nodes_vap(&ic->ic_sta, vap, get_adhoc_rssi, in ieee80211_getrssi()
3107 ieee80211_iterate_nodes_vap(&ic->ic_sta, vap, get_hostap_rssi, in ieee80211_getrssi()
3112 ieee80211_iterate_nodes_vap(&ic->ic_sta, vap, get_mesh_rssi, in ieee80211_getrssi()
3119 if (vap->iv_bss != NULL) in ieee80211_getrssi()
3120 info.rssi_total = ic->ic_node_getrssi(vap->iv_bss); in ieee80211_getrssi()
3132 if (vap->iv_bss == NULL) /* NB: shouldn't happen */ in ieee80211_getsignal()
3134 vap->iv_ic->ic_node_getsignal(vap->iv_bss, rssi, noise); in ieee80211_getsignal()
3135 /* for non-station mode return avg'd rssi accounting */ in ieee80211_getsignal()
3136 if (vap->iv_opmode != IEEE80211_M_STA) in ieee80211_getsignal()
3152 seq = ni->ni_txseqs[tid]; in ieee80211_tx_seqno_fetch_incr()
3153 ni->ni_txseqs[tid] = (ni->ni_txseqs[tid] + 1) % IEEE80211_SEQ_RANGE; in ieee80211_tx_seqno_fetch_incr()
3167 return (ni->ni_txseqs[tid]); in ieee80211_tx_seqno_fetch()
3174 * which expect a dot11rate / ratecode representation for legacy and HT MCS
3175 * rates.
3181 * @returns the dot11rate / ratecode for legacy/MCS, or the
3188 switch (ni->ni_txrate.type) { in ieee80211_node_get_txrate_dot11rate()
3191 return (ni->ni_txrate.dot11rate); in ieee80211_node_get_txrate_dot11rate()
3195 net80211_vap_printf(ni->ni_vap, in ieee80211_node_get_txrate_dot11rate()
3197 __func__, ni->ni_txrate.type); in ieee80211_node_get_txrate_dot11rate()
3206 * rates. It will populate a struct ieee80211_node_txrate with the
3219 *txr = ni->ni_txrate; in ieee80211_node_get_txrate()
3226 * rates. It will copy a struct ieee80211_node_txrate with the
3239 ni->ni_txrate = *txr; in ieee80211_node_set_txrate()
3246 * which expect a dot11rate / ratecode representation for legacy and HT MCS
3247 * rates.
3257 ni->ni_txrate.type = IEEE80211_NODE_TXRATE_HT; in ieee80211_node_set_txrate_dot11rate()
3258 ni->ni_txrate.mcs = dot11Rate & IEEE80211_RATE_VAL; in ieee80211_node_set_txrate_dot11rate()
3259 ni->ni_txrate.nss = 0; in ieee80211_node_set_txrate_dot11rate()
3260 ni->ni_txrate.dot11rate = dot11Rate; in ieee80211_node_set_txrate_dot11rate()
3262 ni->ni_txrate.type = IEEE80211_NODE_TXRATE_LEGACY; in ieee80211_node_set_txrate_dot11rate()
3263 ni->ni_txrate.mcs = ni->ni_txrate.nss = 0; in ieee80211_node_set_txrate_dot11rate()
3264 ni->ni_txrate.dot11rate = dot11Rate; in ieee80211_node_set_txrate_dot11rate()
3272 * which expect a dot11rate / ratecode representation for legacy and HT MCS
3273 * rates. It expects an MCS rate code from 0 .. 76.
3276 * @param mcs the MCS rate to select
3280 uint8_t mcs) in ieee80211_node_set_txrate_ht_mcsrate() argument
3282 KASSERT(mcs <= 76, ("%s: MCS is not 0..76 (%d)", __func__, mcs)); in ieee80211_node_set_txrate_ht_mcsrate()
3283 if (mcs > 76) { in ieee80211_node_set_txrate_ht_mcsrate()
3284 ic_printf(ni->ni_ic, "%s: invalid MCS (%d)\n", __func__, mcs); in ieee80211_node_set_txrate_ht_mcsrate()
3288 ni->ni_txrate.type = IEEE80211_NODE_TXRATE_HT; in ieee80211_node_set_txrate_ht_mcsrate()
3289 ni->ni_txrate.mcs = mcs; in ieee80211_node_set_txrate_ht_mcsrate()
3290 ni->ni_txrate.nss = 0; in ieee80211_node_set_txrate_ht_mcsrate()
3291 ni->ni_txrate.dot11rate = IEEE80211_RATE_MCS | mcs; in ieee80211_node_set_txrate_ht_mcsrate()
3297 * This sets the current transmit rate to the given VHT NSS/MCS.
3301 * @param mcs the MCS rate to select
3305 uint8_t nss, uint8_t mcs) in ieee80211_node_set_txrate_vht_rate() argument
3309 ni->ni_txrate.type = IEEE80211_NODE_TXRATE_VHT; in ieee80211_node_set_txrate_vht_rate()
3310 ni->ni_txrate.mcs = mcs; in ieee80211_node_set_txrate_vht_rate()
3311 ni->ni_txrate.nss = nss; in ieee80211_node_set_txrate_vht_rate()
3312 ni->ni_txrate.dot11rate = 0; in ieee80211_node_set_txrate_vht_rate()
3318 * This currently only works for CCK, OFDM and HT rates.
3328 switch (ni->ni_txrate.type) { in ieee80211_node_get_txrate_kbit()
3330 kbps = ni->ni_txrate.dot11rate * 500; in ieee80211_node_get_txrate_kbit()
3333 /* Note: Valid for MCS 0..76 */ in ieee80211_node_get_txrate_kbit()
3335 const struct ieee80211_mcs_rates *mcs = in ieee80211_node_get_txrate_kbit() local
3336 &ieee80211_htrates[ni->ni_txrate.dot11rate & in ieee80211_node_get_txrate_kbit()
3339 if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) { in ieee80211_node_get_txrate_kbit()
3340 if (ni->ni_flags & IEEE80211_NODE_SGI40) in ieee80211_node_get_txrate_kbit()
3341 kbps = mcs->ht40_rate_800ns * 500; in ieee80211_node_get_txrate_kbit()
3343 kbps = mcs->ht40_rate_400ns * 500; in ieee80211_node_get_txrate_kbit()
3345 if (ni->ni_flags & IEEE80211_NODE_SGI20) in ieee80211_node_get_txrate_kbit()
3346 kbps = mcs->ht20_rate_800ns * 500; in ieee80211_node_get_txrate_kbit()
3348 kbps = mcs->ht20_rate_400ns * 500; in ieee80211_node_get_txrate_kbit()
3353 /* Note: valid for VHT rates, assumes long-GI for now */ in ieee80211_node_get_txrate_kbit()
3354 kbps = ieee80211_phy_vht_get_mcs_kbit(ni->ni_chw, in ieee80211_node_get_txrate_kbit()
3355 ni->ni_txrate.nss, ni->ni_txrate.mcs, false); in ieee80211_node_get_txrate_kbit()
3358 net80211_vap_printf(ni->ni_vap, in ieee80211_node_get_txrate_kbit()
3360 ni->ni_txrate.type); in ieee80211_node_get_txrate_kbit()