Lines Matching refs:ni

95 	struct ieee80211_node *ni);
213 ieee80211_node_authorize(struct ieee80211_node *ni)
215 struct ieee80211vap *vap = ni->ni_vap;
217 ni->ni_flags |= IEEE80211_NODE_AUTH;
218 ni->ni_inact_reload = vap->iv_inact_run;
219 ni->ni_inact = ni->ni_inact_reload;
221 IEEE80211_NOTE(vap, IEEE80211_MSG_INACT, ni,
222 "%s: inact_reload %u", __func__, ni->ni_inact_reload);
226 ieee80211_node_unauthorize(struct ieee80211_node *ni)
228 struct ieee80211vap *vap = ni->ni_vap;
230 ni->ni_flags &= ~IEEE80211_NODE_AUTH;
231 ni->ni_inact_reload = vap->iv_inact_auth;
232 if (ni->ni_inact > ni->ni_inact_reload)
233 ni->ni_inact = ni->ni_inact_reload;
235 IEEE80211_NOTE(vap, IEEE80211_MSG_INACT, ni,
237 ni->ni_inact_reload, ni->ni_inact);
244 ieee80211_node_setuptxparms(struct ieee80211_node *ni)
246 struct ieee80211vap *vap = ni->ni_vap;
249 if (ni->ni_flags & IEEE80211_NODE_VHT) {
250 if (IEEE80211_IS_CHAN_5GHZ(ni->ni_chan))
254 } else if (ni->ni_flags & IEEE80211_NODE_HT) {
255 if (IEEE80211_IS_CHAN_5GHZ(ni->ni_chan))
260 if (IEEE80211_IS_CHAN_ST(ni->ni_chan))
262 else if (IEEE80211_IS_CHAN_HALF(ni->ni_chan))
264 else if (IEEE80211_IS_CHAN_QUARTER(ni->ni_chan))
267 else if (IEEE80211_IS_CHAN_A(ni->ni_chan))
269 else if (IEEE80211_IS_CHAN_108G(ni->ni_chan) ||
270 (ni->ni_flags & IEEE80211_NODE_ERP))
275 ni->ni_txparms = &vap->iv_txparms[mode];
284 ieee80211_node_set_chan(struct ieee80211_node *ni,
287 struct ieee80211com *ic = ni->ni_ic;
288 struct ieee80211vap *vap = ni->ni_vap;
293 ni->ni_chan = chan;
300 ni->ni_htrates = *ieee80211_get_suphtrates(ic, chan);
316 ni->ni_txparms = &vap->iv_txparms[mode];
317 ni->ni_rates = *ieee80211_get_suprates(ic, chan);
335 struct ieee80211_node *ni;
344 ni = ieee80211_alloc_node(&ic->ic_sta, vap, vap->iv_myaddr);
345 if (ni == NULL) {
349 IEEE80211_ADDR_COPY(ni->ni_bssid, vap->iv_myaddr);
350 ni->ni_esslen = vap->iv_des_ssid[0].len;
351 memcpy(ni->ni_essid, vap->iv_des_ssid[0].ssid, ni->ni_esslen);
353 copy_bss(ni, vap->iv_bss);
354 ni->ni_intval = ic->ic_bintval;
356 ni->ni_capinfo |= IEEE80211_CAPINFO_PRIVACY;
358 ni->ni_fhdwell = 200; /* XXX */
359 ni->ni_fhindex = 1;
362 ni->ni_capinfo |= IEEE80211_CAPINFO_IBSS; /* XXX */
364 IEEE80211_ADDR_COPY(ni->ni_bssid, vap->iv_des_bssid);
366 get_random_bytes(ni->ni_bssid, IEEE80211_ADDR_LEN);
368 ni->ni_bssid[0] = (ni->ni_bssid[0] &~ 0x01) | 0x02;
372 IEEE80211_ADDR_COPY(ni->ni_bssid, vap->iv_des_bssid);
377 memset(ni->ni_bssid, 0, IEEE80211_ADDR_LEN);
380 ni->ni_meshidlen = vap->iv_mesh->ms_idlen;
381 memcpy(ni->ni_meshid, vap->iv_mesh->ms_id, ni->ni_meshidlen);
393 ieee80211_node_set_chan(ni, chan);
403 ieee80211_setbasicrates(&ni->ni_rates,
410 ieee80211_addbasicrates(&ni->ni_rates,
417 ieee80211_setbasicrates(&ni->ni_rates,
425 if (IEEE80211_IS_CHAN_VHT(ni->ni_chan)) {
427 ieee80211_ht_node_init(ni);
428 ieee80211_vht_node_init(ni);
429 } else if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) {
431 ieee80211_ht_node_init(ni);
434 (void) ieee80211_sta_join1(ieee80211_ref_node(ni));
447 struct ieee80211_node *ni, *obss;
453 ni = ieee80211_alloc_node(&ic->ic_sta, vap, vap->iv_myaddr);
454 KASSERT(ni != NULL, ("unable to setup initial BSS node"));
456 vap->iv_bss = ieee80211_ref_node(ni);
458 copy_bss(ni, obss);
459 ni->ni_intval = ic->ic_bintval;
462 IEEE80211_ADDR_COPY(ni->ni_bssid, vap->iv_myaddr);
466 match_ssid(const struct ieee80211_node *ni,
472 if (ni->ni_esslen == ssids[i].len &&
473 memcmp(ni->ni_essid, ssids[i].ssid, ni->ni_esslen) == 0)
483 check_bss(struct ieee80211vap *vap, struct ieee80211_node *ni)
485 struct ieee80211com *ic = ni->ni_ic;
488 if (isclr(ic->ic_chan_active, ieee80211_chan2ieee(ic, ni->ni_chan)))
491 if ((ni->ni_capinfo & IEEE80211_CAPINFO_IBSS) == 0)
494 if ((ni->ni_capinfo & IEEE80211_CAPINFO_ESS) == 0)
498 if ((ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) == 0)
502 if (ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY)
505 rate = ieee80211_fix_rate(ni, &ni->ni_rates,
510 !match_ssid(ni, vap->iv_des_nssid, vap->iv_des_ssid))
513 !IEEE80211_ADDR_EQ(vap->iv_des_bssid, ni->ni_bssid))
523 check_bss_debug(struct ieee80211vap *vap, struct ieee80211_node *ni)
525 struct ieee80211com *ic = ni->ni_ic;
530 if (isclr(ic->ic_chan_active, ieee80211_chan2ieee(ic, ni->ni_chan)))
533 if ((ni->ni_capinfo & IEEE80211_CAPINFO_IBSS) == 0)
536 if ((ni->ni_capinfo & IEEE80211_CAPINFO_ESS) == 0)
540 if ((ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) == 0)
544 if (ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY)
547 rate = ieee80211_fix_rate(ni, &ni->ni_rates,
552 !match_ssid(ni, vap->iv_des_nssid, vap->iv_des_ssid))
555 !IEEE80211_ADDR_EQ(vap->iv_des_bssid, ni->ni_bssid))
558 printf(" %c %s", fail ? '-' : '+', ether_sprintf(ni->ni_macaddr));
559 printf(" %s%c", ether_sprintf(ni->ni_bssid), fail & 0x20 ? '!' : ' ');
561 ieee80211_chan2ieee(ic, ni->ni_chan), fail & 0x01 ? '!' : ' ');
565 (ni->ni_capinfo & IEEE80211_CAPINFO_ESS) ? "ess" :
566 (ni->ni_capinfo & IEEE80211_CAPINFO_IBSS) ? "ibss" :
570 (ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) ? "wep" : "no",
572 ieee80211_print_essid(ni->ni_essid, ni->ni_esslen);
578 ieee80211_ibss_merge_check(struct ieee80211_node *ni)
580 struct ieee80211vap *vap = ni->ni_vap;
582 if (ni == vap->iv_bss ||
583 IEEE80211_ADDR_EQ(ni->ni_bssid, vap->iv_bss->ni_bssid)) {
588 if (!check_bss(vap, ni)) {
594 check_bss_debug(vap, ni);
614 ieee80211_ibss_node_check_new(struct ieee80211_node *ni,
617 struct ieee80211vap *vap = ni->ni_vap;
671 ieee80211_ibss_merge(struct ieee80211_node *ni)
674 struct ieee80211vap *vap = ni->ni_vap;
677 if (! ieee80211_ibss_merge_check(ni))
682 ether_sprintf(ni->ni_bssid),
687 return ieee80211_sta_join1(ieee80211_ref_node(ni));
910 struct ieee80211_node *ni;
913 ni = ieee80211_alloc_node(&ic->ic_sta, vap, se->se_macaddr);
914 if (ni == NULL) {
923 IEEE80211_ADDR_COPY(ni->ni_bssid, se->se_bssid);
924 ni->ni_esslen = se->se_ssid[1];
925 memcpy(ni->ni_essid, se->se_ssid+2, ni->ni_esslen);
926 ni->ni_tstamp.tsf = se->se_tstamp.tsf;
927 ni->ni_intval = se->se_intval;
928 ni->ni_capinfo = se->se_capinfo;
929 ni->ni_chan = chan;
930 ni->ni_timoff = se->se_timoff;
931 ni->ni_fhdwell = se->se_fhdwell;
932 ni->ni_fhindex = se->se_fhindex;
933 ni->ni_erp = se->se_erp;
934 IEEE80211_RSSI_LPF(ni->ni_avgrssi, se->se_rssi);
935 ni->ni_noise = se->se_noise;
938 ni->ni_flags |= IEEE80211_NODE_ASSOCID;
941 if (ieee80211_ies_init(&ni->ni_ies, se->se_ies.data, se->se_ies.len)) {
942 ieee80211_ies_expand(&ni->ni_ies);
944 if (ni->ni_ies.ath_ie != NULL)
945 ieee80211_parse_ath(ni, ni->ni_ies.ath_ie);
947 if (ni->ni_ies.htcap_ie != NULL)
948 ieee80211_parse_htcap(ni, ni->ni_ies.htcap_ie);
949 if (ni->ni_ies.htinfo_ie != NULL)
950 ieee80211_parse_htinfo(ni, ni->ni_ies.htinfo_ie);
952 if (ni->ni_ies.meshid_ie != NULL)
953 ieee80211_parse_meshid(ni, ni->ni_ies.meshid_ie);
956 if (ni->ni_ies.tdma_ie != NULL)
957 ieee80211_parse_tdma(ni, ni->ni_ies.tdma_ie);
959 if (ni->ni_ies.vhtcap_ie != NULL)
960 ieee80211_parse_vhtcap(ni, ni->ni_ies.vhtcap_ie);
961 if (ni->ni_ies.vhtopmode_ie != NULL)
962 ieee80211_parse_vhtopmode(ni, ni->ni_ies.vhtopmode_ie);
973 ieee80211_setup_rates(ni, se->se_rates, se->se_xrates,
975 if (ieee80211_iserp_rateset(&ni->ni_rates))
976 ni->ni_flags |= IEEE80211_NODE_ERP;
986 if (ni->ni_ies.htinfo_ie != NULL &&
987 ni->ni_ies.htcap_ie != NULL &&
989 ieee80211_ht_node_init(ni);
990 ieee80211_ht_updateparams(ni,
991 ni->ni_ies.htcap_ie,
992 ni->ni_ies.htinfo_ie);
1002 if (ni->ni_ies.vhtopmode_ie != NULL &&
1003 ni->ni_ies.vhtcap_ie != NULL &&
1005 if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) {
1008 ni->ni_macaddr,
1011 ieee80211_vht_node_init(ni);
1012 ieee80211_vht_updateparams(ni,
1013 ni->ni_ies.vhtcap_ie,
1014 ni->ni_ies.vhtopmode_ie);
1015 ieee80211_setup_vht_rates(ni, ni->ni_ies.vhtcap_ie,
1016 ni->ni_ies.vhtopmode_ie);
1023 ieee80211_ht_updateparams_final(ni, ni->ni_ies.htcap_ie,
1024 ni->ni_ies.htinfo_ie);
1025 ieee80211_setup_htrates(ni, ni->ni_ies.htcap_ie,
1027 ieee80211_setup_basic_htrates(ni, ni->ni_ies.htinfo_ie);
1033 ieee80211_node_setuptxparms(ni);
1034 ieee80211_ratectl_node_init(ni);
1036 return ieee80211_sta_join1(ieee80211_ref_node(ni));
1044 ieee80211_sta_leave(struct ieee80211_node *ni)
1046 struct ieee80211com *ic = ni->ni_ic;
1048 ic->ic_node_cleanup(ni);
1049 ieee80211_notify_node_leave(ni);
1056 ieee80211_node_deauth(struct ieee80211_node *ni, int reason)
1059 ieee80211_ref_node(ni);
1060 if (ni->ni_associd != 0)
1061 IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_DEAUTH, reason);
1062 ieee80211_node_leave(ni);
1063 ieee80211_free_node(ni);
1069 struct ieee80211_node *ni;
1071 ni = (struct ieee80211_node *) IEEE80211_MALLOC(sizeof(struct ieee80211_node),
1073 return ni;
1077 node_init(struct ieee80211_node *ni)
1193 node_cleanup(struct ieee80211_node *ni)
1195 struct ieee80211vap *vap = ni->ni_vap;
1196 struct ieee80211com *ic = ni->ni_ic;
1200 if (ni->ni_flags & IEEE80211_NODE_PWR_MGT) {
1203 ni->ni_flags &= ~IEEE80211_NODE_PWR_MGT;
1204 IEEE80211_NOTE(vap, IEEE80211_MSG_POWER, ni,
1210 if (ni->ni_flags & IEEE80211_NODE_VHT)
1211 ieee80211_vht_node_cleanup(ni);
1212 if (ni->ni_flags & IEEE80211_NODE_HT)
1213 ieee80211_ht_node_cleanup(ni);
1216 ieee80211_ff_node_cleanup(ni);
1223 ieee80211_mesh_node_cleanup(ni);
1228 ieee80211_ageq_drain_node(&ic->ic_stageq, ni);
1238 ni->ni_flags &= ~(IEEE80211_NODE_AREF | IEEE80211_NODE_ASSOCID);
1243 if (ieee80211_node_psq_drain(ni) != 0 && vap->iv_set_tim != NULL)
1244 vap->iv_set_tim(ni, 0);
1246 ni->ni_associd = 0;
1247 if (ni->ni_challenge != NULL) {
1248 IEEE80211_FREE(ni->ni_challenge, M_80211_NODE);
1249 ni->ni_challenge = NULL;
1263 for (i = 0; i < nitems(ni->ni_rxfrag); i++)
1264 if (ni->ni_rxfrag[i] != NULL) {
1265 m_freem(ni->ni_rxfrag[i]);
1266 ni->ni_rxfrag[i] = NULL;
1271 ieee80211_node_delucastkey(ni);
1275 node_free(struct ieee80211_node *ni)
1277 struct ieee80211com *ic = ni->ni_ic;
1279 ieee80211_ratectl_node_deinit(ni);
1280 ic->ic_node_cleanup(ni);
1281 ieee80211_ies_cleanup(&ni->ni_ies);
1282 ieee80211_psq_cleanup(&ni->ni_psq);
1283 IEEE80211_FREE(ni, M_80211_NODE);
1287 node_age(struct ieee80211_node *ni)
1289 struct ieee80211vap *vap = ni->ni_vap;
1294 if (ieee80211_node_psq_age(ni) != 0 &&
1295 ni->ni_psq.psq_len == 0 && vap->iv_set_tim != NULL)
1296 vap->iv_set_tim(ni, 0);
1301 if (ni->ni_associd != 0 && (ni->ni_flags & IEEE80211_NODE_HT))
1302 ieee80211_ht_node_age(ni);
1306 node_getrssi(const struct ieee80211_node *ni)
1308 uint32_t avgrssi = ni->ni_avgrssi;
1318 node_getsignal(const struct ieee80211_node *ni, int8_t *rssi, int8_t *noise)
1320 *rssi = node_getrssi(ni);
1321 *noise = ni->ni_noise;
1325 node_getmimoinfo(const struct ieee80211_node *ni,
1334 for (i = 0; i < MIN(IEEE80211_MAX_CHAINS, ni->ni_mimo_chains); i++) {
1336 avgrssi = ni->ni_mimo_rssi_ctl[i];
1343 info->ch[i].noise[0] = ni->ni_mimo_noise_ctl[i];
1353 struct ieee80211_node *ni)
1360 hash = IEEE80211_NODE_HASH(ic, ni->ni_macaddr);
1362 TAILQ_INSERT_TAIL(&nt->nt_node, ni, ni_list);
1363 LIST_INSERT_HEAD(&nt->nt_hash[hash], ni, ni_hash);
1365 ni->ni_table = nt;
1370 struct ieee80211_node *ni)
1375 TAILQ_REMOVE(&nt->nt_node, ni, ni_list);
1376 LIST_REMOVE(ni, ni_hash);
1380 ni->ni_table = NULL;
1388 struct ieee80211_node *ni;
1390 ni = ic->ic_node_alloc(vap, macaddr);
1391 if (ni == NULL) {
1397 "%s %p<%s> in %s table\n", __func__, ni,
1400 IEEE80211_ADDR_COPY(ni->ni_macaddr, macaddr);
1401 ieee80211_node_initref(ni); /* mark referenced */
1402 ni->ni_chan = IEEE80211_CHAN_ANYC;
1403 ni->ni_authmode = IEEE80211_AUTH_OPEN;
1404 ni->ni_txpower = ic->ic_txpowlimit; /* max power */
1405 ni->ni_txparms = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)];
1406 ieee80211_crypto_resetkey(vap, &ni->ni_ucastkey, IEEE80211_KEYIX_NONE);
1407 ni->ni_avgrssi = IEEE80211_RSSI_DUMMY_MARKER;
1408 ni->ni_inact_reload = nt->nt_inact_init;
1409 ni->ni_inact = ni->ni_inact_reload;
1410 ni->ni_ath_defkeyix = 0x7fff;
1411 ieee80211_psq_init(&ni->ni_psq, "unknown");
1414 ieee80211_mesh_node_init(vap, ni);
1417 ieee80211_add_node_nt(nt, ni);
1418 ni->ni_vap = vap;
1419 ni->ni_ic = ic;
1423 if (ic->ic_node_init(ni) != 0) {
1425 ieee80211_psq_cleanup(&ni->ni_psq);
1426 ieee80211_ratectl_node_deinit(ni);
1427 _ieee80211_free_node(ni);
1431 IEEE80211_NOTE(vap, IEEE80211_MSG_INACT, ni,
1432 "%s: inact_reload %u", __func__, ni->ni_inact_reload);
1434 return ni;
1448 struct ieee80211_node *ni;
1450 ni = ic->ic_node_alloc(vap, macaddr);
1451 if (ni != NULL) {
1455 "%s %p<%s>\n", __func__, ni, ether_sprintf(macaddr));
1457 ni->ni_table = NULL; /* NB: pedantic */
1458 ni->ni_ic = ic; /* NB: needed to set channel */
1459 ni->ni_vap = vap;
1461 IEEE80211_ADDR_COPY(ni->ni_macaddr, macaddr);
1462 IEEE80211_ADDR_COPY(ni->ni_bssid, bss->ni_bssid);
1463 ieee80211_node_initref(ni); /* mark referenced */
1465 ieee80211_node_set_chan(ni, bss->ni_chan);
1466 ieee80211_crypto_resetkey(vap, &ni->ni_ucastkey,
1468 ni->ni_txpower = bss->ni_txpower;
1470 ieee80211_psq_init(&ni->ni_psq, "unknown");
1472 ieee80211_ratectl_node_init(ni);
1475 if (ic->ic_node_init(ni) != 0) {
1477 ieee80211_psq_cleanup(&ni->ni_psq);
1478 ieee80211_ratectl_node_deinit(ni);
1479 _ieee80211_free_node(ni);
1487 return ni;
1495 struct ieee80211_node *ni;
1497 ni = ieee80211_alloc_node(&ic->ic_sta, vap, macaddr);
1498 if (ni != NULL) {
1503 copy_bss(ni, bss);
1504 IEEE80211_ADDR_COPY(ni->ni_bssid, bss->ni_bssid);
1505 ieee80211_node_set_chan(ni, bss->ni_chan);
1507 return ni;
1522 struct ieee80211_node *ni;
1525 ni = ieee80211_alloc_node(&ic->ic_sta, vap, bssid);
1526 if (ni != NULL) {
1527 ni->ni_wdsvap = vap;
1528 IEEE80211_ADDR_COPY(ni->ni_bssid, bssid);
1532 copy_bss(ni, vap->iv_bss);
1533 ieee80211_node_set_chan(ni, chan);
1535 ni->ni_esslen = vap->iv_des_ssid[0].len;
1536 memcpy(ni->ni_essid, vap->iv_des_ssid[0].ssid, ni->ni_esslen);
1544 ni->ni_flags |= IEEE80211_NODE_QOS;
1547 ni->ni_flags |= IEEE80211_NODE_FF;
1557 ieee80211_ht_wds_init(ni);
1562 struct ieee80211_channel *c = ni->ni_chan;
1569 ni->ni_chan->ic_freq, ni->ni_chan->ic_flags));
1570 ni->ni_chan = c;
1573 return ni;
1585 struct ieee80211_node *ni;
1591 LIST_FOREACH(ni, &nt->nt_hash[hash], ni_hash) {
1592 if (IEEE80211_ADDR_EQ(ni->ni_macaddr, macaddr)) {
1593 ieee80211_ref_node(ni); /* mark referenced */
1595 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE,
1598 ni, ether_sprintf(ni->ni_macaddr),
1599 ieee80211_node_refcnt(ni));
1601 return ni;
1616 struct ieee80211_node *ni;
1619 ni = ieee80211_find_node_locked(nt, macaddr);
1621 return ni;
1635 struct ieee80211_node *ni;
1641 LIST_FOREACH(ni, &nt->nt_hash[hash], ni_hash) {
1642 if (ni->ni_vap == vap &&
1643 IEEE80211_ADDR_EQ(ni->ni_macaddr, macaddr)) {
1644 ieee80211_ref_node(ni); /* mark referenced */
1646 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE,
1649 ni, ether_sprintf(ni->ni_macaddr),
1650 ieee80211_node_refcnt(ni));
1652 return ni;
1669 struct ieee80211_node *ni;
1672 ni = ieee80211_find_vap_node_locked(nt, vap, macaddr);
1674 return ni;
1687 struct ieee80211_node *ni;
1691 ni = ieee80211_dup_bss(vap, macaddr);
1692 if (ni != NULL) {
1696 ni->ni_rates = vap->iv_bss->ni_rates;
1697 if (ieee80211_iserp_rateset(&ni->ni_rates))
1698 ni->ni_flags |= IEEE80211_NODE_ERP;
1711 ni->ni_flags |= IEEE80211_NODE_QOS;
1714 ni->ni_flags |= IEEE80211_NODE_FF;
1717 ieee80211_node_setuptxparms(ni);
1718 ieee80211_ratectl_node_init(ni);
1731 ic->ic_newassoc(ni, 1);
1749 ieee80211_send_probereq(ni, /* node */
1751 ni->ni_macaddr, /* DA */
1758 ieee80211_node_authorize(ni);
1760 return ni;
1764 ieee80211_init_neighbor(struct ieee80211_node *ni,
1770 ni->ni_esslen = sp->ssid[1];
1771 memcpy(ni->ni_essid, sp->ssid + 2, sp->ssid[1]);
1772 IEEE80211_ADDR_COPY(ni->ni_bssid, wh->i_addr3);
1773 memcpy(ni->ni_tstamp.data, sp->tstamp, sizeof(ni->ni_tstamp));
1774 ni->ni_intval = sp->bintval;
1775 ni->ni_capinfo = sp->capinfo;
1776 ni->ni_chan = ni->ni_ic->ic_curchan;
1777 ni->ni_fhdwell = sp->fhdwell;
1778 ni->ni_fhindex = sp->fhindex;
1779 ni->ni_erp = sp->erp;
1780 ni->ni_timoff = sp->timoff;
1782 if (ni->ni_vap->iv_opmode == IEEE80211_M_MBSS)
1783 ieee80211_mesh_init_neighbor(ni, wh, sp);
1785 if (ieee80211_ies_init(&ni->ni_ies, sp->ies, sp->ies_len)) {
1786 ieee80211_ies_expand(&ni->ni_ies);
1787 if (ni->ni_ies.wme_ie != NULL)
1788 ni->ni_flags |= IEEE80211_NODE_QOS;
1790 ni->ni_flags &= ~IEEE80211_NODE_QOS;
1792 if (ni->ni_ies.ath_ie != NULL)
1793 ieee80211_parse_ath(ni, ni->ni_ies.ath_ie);
1795 if (ni->ni_ies.htcap_ie != NULL)
1796 ieee80211_parse_htcap(ni, ni->ni_ies.htcap_ie);
1797 if (ni->ni_ies.htinfo_ie != NULL)
1798 ieee80211_parse_htinfo(ni, ni->ni_ies.htinfo_ie);
1800 if (ni->ni_ies.vhtcap_ie != NULL)
1801 ieee80211_parse_vhtcap(ni, ni->ni_ies.vhtcap_ie);
1802 if (ni->ni_ies.vhtopmode_ie != NULL)
1803 ieee80211_parse_vhtopmode(ni, ni->ni_ies.vhtopmode_ie);
1805 if ((ni->ni_ies.htcap_ie != NULL) &&
1806 (ni->ni_ies.htinfo_ie != NULL) &&
1807 (ni->ni_vap->iv_flags_ht & IEEE80211_FHT_HT)) {
1811 if ((ni->ni_ies.vhtcap_ie != NULL) &&
1812 (ni->ni_ies.vhtopmode_ie != NULL) &&
1813 (ni->ni_vap->iv_flags_vht & IEEE80211_FVHT_VHT)) {
1819 ieee80211_setup_rates(ni, sp->rates, sp->xrates,
1827 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_ASSOC,
1829 ieee80211_ht_node_init(ni);
1830 ieee80211_ht_updateparams(ni,
1831 ni->ni_ies.htcap_ie,
1832 ni->ni_ies.htinfo_ie);
1835 if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) {
1838 ni->ni_macaddr,
1841 ieee80211_vht_node_init(ni);
1842 ieee80211_vht_updateparams(ni,
1843 ni->ni_ies.vhtcap_ie,
1844 ni->ni_ies.vhtopmode_ie);
1845 ieee80211_setup_vht_rates(ni,
1846 ni->ni_ies.vhtcap_ie,
1847 ni->ni_ies.vhtopmode_ie);
1855 ieee80211_ht_updateparams_final(ni, ni->ni_ies.htcap_ie,
1856 ni->ni_ies.htinfo_ie);
1857 ieee80211_setup_htrates(ni,
1858 ni->ni_ies.htcap_ie,
1860 ieee80211_setup_basic_htrates(ni,
1861 ni->ni_ies.htinfo_ie);
1863 ieee80211_node_setuptxparms(ni);
1864 ieee80211_ratectl_node_init(ni);
1878 if (ni->ni_ic->ic_newassoc)
1879 ni->ni_ic->ic_newassoc(ni, 1);
1894 struct ieee80211_node *ni;
1898 ni = ieee80211_dup_bss(vap, wh->i_addr2);/* XXX alloc_node? */
1899 if (ni != NULL) {
1902 ieee80211_init_neighbor(ni, wh, sp);
1903 if (ieee80211_iserp_rateset(&ni->ni_rates))
1904 ni->ni_flags |= IEEE80211_NODE_ERP;
1905 ieee80211_node_setuptxparms(ni);
1906 ieee80211_ratectl_node_init(ni);
1908 ic->ic_newassoc(ni, 1);
1910 ieee80211_node_authorize(ni);
1912 return ni;
1946 struct ieee80211_node *ni;
1950 ni = _find_rxnode(nt, wh);
1953 return ni;
1975 struct ieee80211_node *ni;
1980 ni = nt->nt_keyixmap[keyix];
1982 ni = NULL;
1983 if (ni == NULL) {
1984 ni = _find_rxnode(nt, wh);
1985 if (ni != NULL && nt->nt_keyixmap != NULL) {
1990 keyix = ni->ni_ucastkey.wk_rxkeyix;
1994 IEEE80211_DPRINTF(ni->ni_vap,
1997 __func__, ni, ether_sprintf(ni->ni_macaddr),
1998 ieee80211_node_refcnt(ni)+1);
1999 nt->nt_keyixmap[keyix] = ieee80211_ref_node(ni);
2004 ni = NULL; /* spam bcast probe req to all vap's */
2006 ieee80211_ref_node(ni);
2010 return ni;
2030 struct ieee80211_node *ni;
2043 ni = ieee80211_ref_node(vap->iv_bss);
2045 ni = ieee80211_find_node_locked(nt, macaddr);
2048 if (ni == NULL) {
2061 ni = ieee80211_fakeup_adhoc_node(vap, macaddr);
2062 if (ni != NULL)
2063 (void) ieee80211_ref_node(ni);
2070 return ni;
2074 _ieee80211_free_node(struct ieee80211_node *ni)
2076 struct ieee80211_node_table *nt = ni->ni_table;
2086 "%s %p<%s> in %s table\n", __func__, ni,
2087 ether_sprintf(ni->ni_macaddr),
2090 if (ni->ni_associd != 0) {
2091 struct ieee80211vap *vap = ni->ni_vap;
2093 IEEE80211_AID_CLR(vap, ni->ni_associd);
2096 ieee80211_del_node_nt(nt, ni);
2097 ni->ni_ic->ic_node_free(ni);
2104 node_clear_keyixmap(struct ieee80211_node_table *nt, struct ieee80211_node *ni)
2108 keyix = ni->ni_ucastkey.wk_rxkeyix;
2110 nt->nt_keyixmap[keyix] == ni) {
2111 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE,
2113 __func__, ni, ether_sprintf(ni->ni_macaddr), keyix);
2115 ieee80211_node_decref(ni);
2124 ieee80211_free_node_debug(struct ieee80211_node *ni, const char *func, int line)
2126 ieee80211_free_node(struct ieee80211_node *ni)
2129 struct ieee80211_node_table *nt = ni->ni_table;
2132 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE,
2133 "%s (%s:%u) %p<%s> refcnt %d\n", __func__, func, line, ni,
2134 ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)-1);
2138 if (ieee80211_node_dectestref(ni)) {
2142 _ieee80211_free_node(ni);
2143 } else if (ieee80211_node_refcnt(ni) == 1)
2144 if (node_clear_keyixmap(nt, ni))
2145 _ieee80211_free_node(ni);
2148 if (ieee80211_node_dectestref(ni))
2149 _ieee80211_free_node(ni);
2157 ieee80211_node_delucastkey(struct ieee80211_node *ni)
2159 struct ieee80211com *ic = ni->ni_ic;
2182 if (ni->ni_ucastkey.wk_keyix != IEEE80211_KEYIX_NONE) {
2183 keyix = ni->ni_ucastkey.wk_rxkeyix;
2184 status = ieee80211_crypto_delkey(ni->ni_vap, &ni->ni_ucastkey);
2194 KASSERT(nikey == ni,
2195 ("key map out of sync, ni %p nikey %p", ni, nikey));
2196 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE,
2198 __func__, ni, ether_sprintf(ni->ni_macaddr),
2199 ieee80211_node_refcnt(ni)-1);
2200 ieee80211_free_node(ni);
2211 node_reclaim(struct ieee80211_node_table *nt, struct ieee80211_node *ni)
2216 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE,
2218 __func__, ni, ether_sprintf(ni->ni_macaddr),
2219 nt->nt_name, ieee80211_node_refcnt(ni)-1);
2227 (void)node_clear_keyixmap(nt, ni);
2228 if (!ieee80211_node_dectestref(ni)) {
2235 ieee80211_del_node_nt(nt, ni);
2237 _ieee80211_free_node(ni);
2274 struct ieee80211_node *ni, *next;
2277 TAILQ_FOREACH_SAFE(ni, &nt->nt_node, ni_list, next) {
2278 if (match != NULL && ni->ni_vap != match)
2281 if (ni->ni_associd != 0) {
2282 struct ieee80211vap *vap = ni->ni_vap;
2285 vap->iv_auth->ia_node_leave(ni);
2287 IEEE80211_AID_CLR(vap, ni->ni_associd);
2289 ni->ni_wdsvap = NULL; /* clear reference */
2290 node_reclaim(nt, ni);
2300 TAILQ_FOREACH_SAFE(ni, &nt->nt_node, ni_list, next)
2301 if (ni->ni_wdsvap == match)
2302 ni->ni_wdsvap = NULL;
2327 timeout_stations(void *arg __unused, struct ieee80211_node *ni)
2329 struct ieee80211com *ic = ni->ni_ic;
2330 struct ieee80211vap *vap = ni->ni_vap;
2349 (ni->ni_flags & IEEE80211_NODE_AREF) == 0)
2356 if (ni->ni_rxfrag[0] != NULL &&
2357 ticks > ni->ni_rxfragstamp + hz) {
2358 m_freem(ni->ni_rxfrag[0]);
2359 ni->ni_rxfrag[0] = NULL;
2361 if (ni->ni_inact > 0) {
2362 ni->ni_inact--;
2363 IEEE80211_NOTE(vap, IEEE80211_MSG_INACT, ni,
2365 __func__, ni->ni_inact, ni->ni_inact_reload,
2366 ni->ni_rates.rs_nrates);
2374 if (ni == vap->iv_bss)
2376 if (ni->ni_associd != 0 ||
2382 ic->ic_node_age(ni);
2396 (0 < ni->ni_inact &&
2397 ni->ni_inact <= vap->iv_inact_probe) &&
2398 ni->ni_rates.rs_nrates != 0) {
2401 ni, "%s",
2411 ieee80211_ref_node(ni);
2413 ieee80211_send_nulldata(ni);
2419 ni->ni_inact <= 0) {
2421 IEEE80211_MSG_INACT | IEEE80211_MSG_NODE, ni,
2423 "(refcnt %u)", ieee80211_node_refcnt(ni));
2435 if (ni->ni_associd != 0) {
2436 IEEE80211_SEND_MGMT(ni,
2440 ieee80211_node_leave(ni);
2465 struct ieee80211_node *ni;
2468 TAILQ_FOREACH(ni, &nt->nt_node, ni_list) {
2475 vap = ni->ni_vap;
2488 (ni->ni_flags & IEEE80211_NODE_AREF) == 0)
2494 if (ni->ni_rxfrag[0] != NULL) {
2495 m_freem(ni->ni_rxfrag[0]);
2496 ni->ni_rxfrag[0] = NULL;
2501 ic->ic_node_drain(ni);
2560 struct ieee80211_node *ni;
2581 TAILQ_FOREACH(ni, &nt->nt_node, ni_list) {
2582 if (vap != NULL && ni->ni_vap != vap)
2587 ni_arr[i] = ieee80211_ref_node(ni);
2618 ieee80211_dump_node(struct ieee80211_node_table *nt, struct ieee80211_node *ni)
2620 printf("0x%p: mac %s refcnt %d\n", ni,
2621 ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni));
2623 ni->ni_authmode, ni->ni_flags);
2625 ni->ni_associd, ni->ni_txpower, ni->ni_vlan);
2627 ni->ni_txseqs[IEEE80211_NONQOS_TID],
2628 ni->ni_rxseqs[IEEE80211_NONQOS_TID] >> IEEE80211_SEQ_SEQ_SHIFT,
2629 ni->ni_rxseqs[IEEE80211_NONQOS_TID] & IEEE80211_SEQ_FRAG_MASK,
2630 ni->ni_rxfragstamp);
2632 node_getrssi(ni), ni->ni_noise,
2633 ni->ni_intval, ni->ni_capinfo);
2635 ether_sprintf(ni->ni_bssid),
2636 ni->ni_esslen, ni->ni_essid,
2637 ni->ni_chan->ic_freq, ni->ni_chan->ic_flags);
2639 ni->ni_inact, ni->ni_inact_reload, ni->ni_txrate);
2641 ni->ni_htcap, ni->ni_htparam,
2642 ni->ni_htctlchan, ni->ni_ht2ndchan);
2644 ni->ni_htopmode, ni->ni_htstbc, ni->ni_chw);
2646 ni->ni_vhtcap, (int) ni->ni_vht_chan1, (int) ni->ni_vht_chan2,
2647 (int) ni->ni_vht_basicmcs);
2679 ieee80211_node_join_11g(struct ieee80211_node *ni)
2681 struct ieee80211com *ic = ni->ni_ic;
2682 struct ieee80211vap *vap = ni->ni_vap;
2693 if ((ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_SLOTTIME) == 0) {
2695 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ASSOC, ni,
2715 if (!ieee80211_iserp_rateset(&ni->ni_rates)) {
2717 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ASSOC, ni,
2724 if ((ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE) == 0) {
2725 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ASSOC, ni,
2738 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_ASSOC,
2744 ni->ni_flags |= IEEE80211_NODE_ERP;
2748 ieee80211_node_join(struct ieee80211_node *ni, int resp)
2750 struct ieee80211com *ic = ni->ni_ic;
2751 struct ieee80211vap *vap = ni->ni_vap;
2754 if (ni->ni_associd == 0) {
2767 IEEE80211_SEND_MGMT(ni, resp, IEEE80211_STATUS_TOOMANY);
2768 ieee80211_node_leave(ni);
2771 ni->ni_associd = aid | 0xc000;
2772 ni->ni_jointime = time_uptime;
2774 IEEE80211_AID_SET(vap, ni->ni_associd);
2778 ieee80211_ht_node_join(ni);
2780 ieee80211_vht_node_join(ni);
2783 ieee80211_node_join_11g(ni);
2793 IEEE80211_NOTE(vap, IEEE80211_MSG_ASSOC | IEEE80211_MSG_DEBUG, ni,
2795 IEEE80211_NODE_AID(ni),
2799 ni->ni_flags & IEEE80211_NODE_QOS ? ", QoS" : "",
2801 ni->ni_flags & IEEE80211_NODE_HT ?
2802 (ni->ni_chw == 40 ? ", HT40" : ", HT20") : "",
2803 ni->ni_flags & IEEE80211_NODE_AMPDU ? " (+AMPDU)" : "",
2804 ni->ni_flags & IEEE80211_NODE_AMSDU ? " (+AMSDU)" : "",
2805 ni->ni_flags & IEEE80211_NODE_MIMO_RTS ? " (+SMPS-DYN)" :
2806 ni->ni_flags & IEEE80211_NODE_MIMO_PS ? " (+SMPS)" : "",
2807 ni->ni_flags & IEEE80211_NODE_RIFS ? " (+RIFS)" : "",
2808 IEEE80211_ATH_CAP(vap, ni, IEEE80211_NODE_FF) ?
2810 IEEE80211_ATH_CAP(vap, ni, IEEE80211_NODE_TURBOP) ?
2814 ieee80211_node_setuptxparms(ni);
2815 ieee80211_ratectl_node_init(ni);
2818 ic->ic_newassoc(ni, newassoc);
2819 IEEE80211_SEND_MGMT(ni, resp, IEEE80211_STATUS_SUCCESS);
2822 vap->iv_auth->ia_node_join(ni);
2823 ieee80211_notify_node_join(ni,
2851 ieee80211_node_leave_11g(struct ieee80211_node *ni)
2853 struct ieee80211com *ic = ni->ni_ic;
2854 struct ieee80211vap *vap = ni->ni_vap;
2865 if ((ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_SLOTTIME) == 0) {
2869 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ASSOC, ni,
2882 IEEE80211_DPRINTF(ni->ni_vap,
2893 if ((ni->ni_flags & IEEE80211_NODE_ERP) == 0) {
2897 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ASSOC, ni,
2903 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_ASSOC,
2939 ieee80211_node_leave(struct ieee80211_node *ni)
2941 struct ieee80211com *ic = ni->ni_ic;
2942 struct ieee80211vap *vap = ni->ni_vap;
2943 struct ieee80211_node_table *nt = ni->ni_table;
2945 IEEE80211_NOTE(vap, IEEE80211_MSG_ASSOC | IEEE80211_MSG_DEBUG, ni,
2946 "station with aid %d leaves", IEEE80211_NODE_AID(ni));
2955 if (ni->ni_associd == 0)
2964 vap->iv_auth->ia_node_leave(ni);
2967 IEEE80211_AID_CLR(vap, ni->ni_associd);
2971 ieee80211_vht_node_leave(ni);
2973 ieee80211_ht_node_leave(ni);
2976 ieee80211_node_leave_11g(ni);
2984 ieee80211_sta_leave(ni);
2994 node_reclaim(nt, ni);
2997 ieee80211_free_node(ni);
3006 get_hostap_rssi(void *arg, struct ieee80211_node *ni)
3009 struct ieee80211vap *vap = ni->ni_vap;
3013 if (ni->ni_associd == 0)
3015 rssi = vap->iv_ic->ic_node_getrssi(ni);
3023 get_adhoc_rssi(void *arg, struct ieee80211_node *ni)
3026 struct ieee80211vap *vap = ni->ni_vap;
3031 if ((ni->ni_capinfo & IEEE80211_CAPINFO_IBSS) == 0)
3033 rssi = vap->iv_ic->ic_node_getrssi(ni);
3042 get_mesh_rssi(void *arg, struct ieee80211_node *ni)
3045 struct ieee80211vap *vap = ni->ni_vap;
3049 if (ni->ni_mlstate != IEEE80211_NODE_MESH_ESTABLISHED)
3051 rssi = vap->iv_ic->ic_node_getrssi(ni);