Lines Matching refs:ni

105 	struct ieee80211_node *ni, *next_ni;
109 for (ni = RBT_MIN(ieee80211_tree, &ic->ic_tree);
110 ni != NULL; ni = next_ni) {
111 next_ni = RBT_NEXT(ieee80211_tree, ni);
112 if (ni->ni_refcnt > 0)
114 if (ni->ni_inact < IEEE80211_INACT_MAX)
115 ni->ni_inact++;
432 ieee80211_ess_adjust_rssi(struct ieee80211com *ic, struct ieee80211_node *ni)
434 uint8_t rssi = ni->ni_rssi;
440 if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) {
456 struct ieee80211_node *ni)
467 if (ieee80211_get_ess(ic, ni->ni_essid, ni->ni_esslen))
471 if (ni->ni_rsnprotos & IEEE80211_PROTO_RSN)
473 if (ni->ni_rsnprotos & IEEE80211_PROTO_WPA)
475 if (ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY)
479 if (IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) &&
480 ni->ni_rssi > min_5ghz_rssi)
484 if (ieee80211_node_supports_ht(ni))
486 if (ieee80211_node_supports_vht(ni))
490 if (ni->ni_fails == 0)
537 ieee80211_match_ess(struct ieee80211_ess *ess, struct ieee80211_node *ni)
540 (ess->esslen != ni->ni_esslen ||
541 memcmp(ess->essid, ni->ni_essid, ess->esslen) != 0)) {
542 ni->ni_assoc_fail |= IEEE80211_NODE_ASSOCFAIL_ESSID;
548 if ((ni->ni_rsnprotos & IEEE80211_PROTO_RSN) &&
550 ni->ni_assoc_fail |= IEEE80211_NODE_ASSOCFAIL_WPA_PROTO;
553 if ((ni->ni_rsnprotos & IEEE80211_PROTO_WPA) &&
555 ni->ni_assoc_fail |= IEEE80211_NODE_ASSOCFAIL_WPA_PROTO;
559 if ((ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) == 0) {
560 ni->ni_assoc_fail |= IEEE80211_NODE_ASSOCFAIL_PRIVACY;
564 if ((ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) != 0) {
565 ni->ni_assoc_fail |= IEEE80211_NODE_ASSOCFAIL_PRIVACY;
571 (ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) != 0) {
572 ni->ni_assoc_fail |= IEEE80211_NODE_ASSOCFAIL_PRIVACY;
584 struct ieee80211_node *ni, *selni = NULL;
590 RBT_FOREACH(ni, ieee80211_tree, &ic->ic_tree) {
592 !IEEE80211_ADDR_EQ(ic->ic_des_bssid, ni->ni_bssid))
596 if (ieee80211_match_ess(ess, ni))
607 if (ic->ic_des_esslen == ni->ni_esslen &&
608 memcmp(ic->ic_des_essid, ni->ni_essid,
609 ni->ni_esslen) == 0) {
610 ieee80211_set_ess(ic, ess, ni);
618 selni = ni;
622 if (ieee80211_ess_is_better(ic, selni, ni)) {
624 selni = ni;
652 struct ieee80211_node *ni)
655 ic->ic_des_esslen = ni->ni_esslen;
656 memcpy(ic->ic_des_essid, ni->ni_essid, ic->ic_des_esslen);
751 struct ieee80211_node *ni;
756 ni = (*ic->ic_node_alloc)(ic);
757 return ni;
764 struct ieee80211_node *ni;
766 ni = ieee80211_alloc_node_helper(ic);
767 if (ni == NULL)
769 ni->ni_chan = IEEE80211_CHAN_ANYC;
770 ic->ic_bss = ieee80211_ref_node(ni);
773 mq_init(&ni->ni_savedq, IEEE80211_PS_MAX_QUEUE, IPL_NET);
826 ieee80211_node_raise_inact(void *arg, struct ieee80211_node *ni)
828 if (ni->ni_refcnt == 0 && ni->ni_inact < IEEE80211_INACT_SCAN)
829 ni->ni_inact++;
920 struct ieee80211_node *ni;
923 ni = ic->ic_bss;
927 ni->ni_chan = chan;
933 mode = ieee80211_chan2mode(ic, ni->ni_chan);
946 ni->ni_rates = ic->ic_sup_rates[mode];
947 ni->ni_txrate = 0;
948 IEEE80211_ADDR_COPY(ni->ni_macaddr, ic->ic_myaddr);
949 IEEE80211_ADDR_COPY(ni->ni_bssid, ic->ic_myaddr);
952 IEEE80211_ADDR_COPY(ni->ni_bssid, ic->ic_des_bssid);
954 ni->ni_bssid[0] |= 0x02; /* local bit for IBSS */
956 ni->ni_esslen = ic->ic_des_esslen;
957 memcpy(ni->ni_essid, ic->ic_des_essid, ni->ni_esslen);
958 ni->ni_rssi = 0;
959 ni->ni_rstamp = 0;
960 memset(ni->ni_tstamp, 0, sizeof(ni->ni_tstamp));
961 ni->ni_intval = ic->ic_lintval;
962 ni->ni_capinfo = IEEE80211_CAPINFO_IBSS;
964 ni->ni_capinfo |= IEEE80211_CAPINFO_PRIVACY;
975 ni->ni_htop1 = IEEE80211_HTPROT_NONE;
977 ni->ni_htop1 |= IEEE80211_HTOP1_NONGF_STA;
1000 ni->ni_rsnprotos = ic->ic_rsnprotos;
1001 ni->ni_rsnakms = ic->ic_rsnakms;
1002 ni->ni_rsnciphers = ic->ic_rsnciphers;
1003 ni->ni_rsngroupcipher = ic->ic_rsngroupcipher;
1004 ni->ni_rsngroupmgmtcipher = ic->ic_rsngroupmgmtcipher;
1005 ni->ni_rsncaps = 0;
1007 ni->ni_rsncaps |= IEEE80211_RSNCAP_MFPC;
1009 ni->ni_rsncaps |= IEEE80211_RSNCAP_MFPR;
1017 k->k_cipher = ni->ni_rsngroupcipher;
1021 (*ic->ic_set_key)(ic, ni, k); /* XXX */
1028 k->k_cipher = ni->ni_rsngroupmgmtcipher;
1032 (*ic->ic_set_key)(ic, ni, k); /* XXX */
1039 ni->ni_port_valid = 1;
1040 ni->ni_flags |= IEEE80211_NODE_TXPROT;
1052 ieee80211_match_bss(struct ieee80211com *ic, struct ieee80211_node *ni,
1060 isclr(ic->ic_chan_active, ieee80211_chan2ieee(ic, ni->ni_chan)))
1063 ni->ni_chan != ic->ic_des_chan)
1067 if ((ni->ni_capinfo & IEEE80211_CAPINFO_IBSS) == 0)
1072 if ((ni->ni_capinfo & IEEE80211_CAPINFO_ESS) == 0)
1076 if ((ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) == 0)
1079 if (ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY)
1083 rate = ieee80211_fix_rate(ic, ni, IEEE80211_F_DONEGO);
1089 (ni->ni_esslen != ic->ic_des_esslen ||
1090 memcmp(ni->ni_essid, ic->ic_des_essid, ic->ic_des_esslen) != 0))
1093 !IEEE80211_ADDR_EQ(ic->ic_des_bssid, ni->ni_bssid))
1102 if ((ni->ni_rsnprotos & ic->ic_rsnprotos) == 0)
1104 if ((ni->ni_rsnakms & ic->ic_rsnakms) == 0)
1106 if ((ni->ni_rsnakms & ic->ic_rsnakms &
1112 if (ni->ni_rsngroupcipher != IEEE80211_CIPHER_WEP40 &&
1113 ni->ni_rsngroupcipher != IEEE80211_CIPHER_TKIP &&
1114 ni->ni_rsngroupcipher != IEEE80211_CIPHER_CCMP &&
1115 ni->ni_rsngroupcipher != IEEE80211_CIPHER_WEP104)
1117 if ((ni->ni_rsnciphers & ic->ic_rsnciphers) == 0)
1121 if ((ni->ni_rsncaps & IEEE80211_RSNCAP_MFPC) &&
1122 ni->ni_rsngroupmgmtcipher != IEEE80211_CIPHER_BIP)
1127 (ni->ni_rsncaps & IEEE80211_RSNCAP_MFPR))
1133 !(ni->ni_rsncaps & IEEE80211_RSNCAP_MFPC))
1139 ether_sprintf(ni->ni_bssid),
1141 printf(" %3d%c", ieee80211_chan2ieee(ic, ni->ni_chan),
1143 printf(" %+4d", ni->ni_rssi);
1147 (ni->ni_capinfo & IEEE80211_CAPINFO_ESS) ? "ess" :
1148 (ni->ni_capinfo & IEEE80211_CAPINFO_IBSS) ? "ibss" :
1152 (ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) ?
1159 ieee80211_print_essid(ni->ni_essid, ni->ni_esslen);
1167 ni->ni_assoc_fail = fail;
1169 ni->ni_assoc_fail = fail;
1171 ic->ic_bss->ni_assoc_fail = ni->ni_assoc_fail;
1182 ieee80211_node_free_unref_cb(struct ieee80211_node *ni)
1184 free(ni->ni_unref_arg, M_DEVBUF, ni->ni_unref_arg_size);
1187 ni->ni_unref_cb = NULL;
1188 ni->ni_unref_arg = NULL;
1189 ni->ni_unref_arg_size = 0;
1192 /* Implements ni->ni_unref_cb(). */
1195 struct ieee80211_node *ni)
1205 * Pass on the existing ni->ni_unref_arg argument.
1218 ieee80211_node_free_unref_cb(ni);
1226 /* Implements ni->ni_unref_cb(). */
1228 ieee80211_node_tx_flushed(struct ieee80211com *ic, struct ieee80211_node *ni)
1241 * Pass on the existing ni->ni_unref_arg argument.
1247 ieee80211_node_tx_stopped(ic, ni);
1250 /* Implements ni->ni_unref_cb(). */
1252 ieee80211_node_switch_bss(struct ieee80211com *ic, struct ieee80211_node *ni)
1255 struct ieee80211_node_switch_bss_arg *sba = ni->ni_unref_arg;
1267 ieee80211_node_free_unref_cb(ni);
1275 ieee80211_node_free_unref_cb(ni);
1300 struct ieee80211_node *ni;
1315 ni = ic->ic_bss;
1316 ni->ni_assoc_fail |= assoc_fail;
1318 ic->ic_curmode = ieee80211_chan2mode(ic, ni->ni_chan);
1322 ieee80211_fix_rate(ic, ni,
1329 ni->ni_rsncipher = IEEE80211_CIPHER_USEGROUP;
1334 ieee80211_fix_rate(ic, ni, IEEE80211_F_DOFRATE |
1336 if (ni->ni_rates.rs_nrates == 0) {
1378 struct ieee80211_node *ni, *nextbs, *selbs = NULL,
1382 ni = RBT_MIN(ieee80211_tree, &ic->ic_tree);
1384 for (; ni != NULL; ni = nextbs) {
1385 nextbs = RBT_NEXT(ieee80211_tree, ni);
1386 if (ni->ni_fails) {
1392 if (ni->ni_fails++ > 2)
1393 ieee80211_free_node(ic, ni);
1397 if (curbs && ieee80211_node_cmp(ic->ic_bss, ni) == 0)
1398 *curbs = ni;
1400 if (ieee80211_match_bss(ic, ni, bgscan) != 0)
1404 if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan) &&
1405 (selbs2 == NULL || ni->ni_rssi > selbs2->ni_rssi))
1406 selbs2 = ni;
1407 else if (IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) &&
1408 (selbs5 == NULL || ni->ni_rssi > selbs5->ni_rssi))
1409 selbs5 = ni;
1410 } else if (selbs == NULL || ni->ni_rssi > selbs->ni_rssi)
1411 selbs = ni;
1443 struct ieee80211_node *ni, *selbs = NULL, *curbs = NULL;
1460 ni = RBT_MIN(ieee80211_tree, &ic->ic_tree);
1476 RBT_FOREACH(ni, ieee80211_tree, &ic->ic_tree)
1477 setbit(occupied, ieee80211_chan2ieee(ic, ni->ni_chan));
1491 if (ni == NULL) {
1555 ni = ic->ic_bss;
1556 if (ni->ni_flags & IEEE80211_NODE_VHT)
1558 else if (ni->ni_flags & IEEE80211_NODE_HT)
1562 ieee80211_chan2mode(ic, ni->ni_chan));
1599 ieee80211_node_tx_flushed(ic, ni);
1615 struct ieee80211_node *ni = ic->ic_bss;
1619 ni->ni_rsnprotos &= ic->ic_rsnprotos;
1621 if (ni->ni_rsnprotos & IEEE80211_PROTO_RSN)
1622 ni->ni_rsnprotos = IEEE80211_PROTO_RSN;
1624 ni->ni_rsnprotos = IEEE80211_PROTO_WPA;
1627 ni->ni_rsnakms &= ic->ic_rsnakms;
1629 if ((ic->ic_flags & IEEE80211_F_PSK) && (ni->ni_rsnakms &
1632 if (ni->ni_rsnakms & IEEE80211_AKM_SHA256_PSK)
1633 ni->ni_rsnakms = IEEE80211_AKM_SHA256_PSK;
1635 ni->ni_rsnakms = IEEE80211_AKM_PSK;
1637 if (ni->ni_rsnakms & IEEE80211_AKM_SHA256_8021X)
1638 ni->ni_rsnakms = IEEE80211_AKM_SHA256_8021X;
1640 ni->ni_rsnakms = IEEE80211_AKM_8021X;
1642 if (ni->ni_rsnprotos == IEEE80211_PROTO_RSN &&
1643 (pmk = ieee80211_pmksa_find(ic, ni, NULL)) != NULL) {
1644 memcpy(ni->ni_pmkid, pmk->pmk_pmkid,
1646 ni->ni_flags |= IEEE80211_NODE_PMKID;
1651 ni->ni_rsnciphers &= ic->ic_rsnciphers;
1653 if (ni->ni_rsnciphers & IEEE80211_CIPHER_CCMP)
1654 ni->ni_rsnciphers = IEEE80211_CIPHER_CCMP;
1656 ni->ni_rsnciphers = IEEE80211_CIPHER_TKIP;
1657 ni->ni_rsncipher = ni->ni_rsnciphers;
1661 (ni->ni_rsncaps & IEEE80211_RSNCAP_MFPC))
1662 ni->ni_flags |= IEEE80211_NODE_MFP;
1691 ieee80211_node_cleanup(struct ieee80211com *ic, struct ieee80211_node *ni)
1693 if (ni->ni_rsnie != NULL) {
1694 free(ni->ni_rsnie, M_DEVBUF, 2 + ni->ni_rsnie[1]);
1695 ni->ni_rsnie = NULL;
1697 ieee80211_ba_del(ni);
1699 mq_purge(&ni->ni_savedq);
1701 ieee80211_node_free_unref_cb(ni);
1705 ieee80211_node_free(struct ieee80211com *ic, struct ieee80211_node *ni)
1707 ieee80211_node_cleanup(ic, ni);
1708 free(ni, M_DEVBUF, 0);
1728 const struct ieee80211_node *ni)
1730 return ni->ni_rssi;
1735 const struct ieee80211_node *ni)
1739 if (ni->ni_chan == IEEE80211_CHAN_ANYC)
1743 thres = (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) ?
1746 return ((ni->ni_rssi * 100) / ic->ic_max_rssi >= thres);
1749 thres = (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) ?
1752 return (ni->ni_rssi >= (u_int8_t)thres);
1756 ieee80211_node_set_timeouts(struct ieee80211_node *ni)
1761 timeout_set(&ni->ni_eapol_to, ieee80211_eapol_timeout, ni);
1762 timeout_set(&ni->ni_sa_query_to, ieee80211_sa_query_timeout, ni);
1764 timeout_set(&ni->ni_addba_req_to[EDCA_AC_BE],
1765 ieee80211_node_addba_request_ac_be_to, ni);
1766 timeout_set(&ni->ni_addba_req_to[EDCA_AC_BK],
1767 ieee80211_node_addba_request_ac_bk_to, ni);
1768 timeout_set(&ni->ni_addba_req_to[EDCA_AC_VI],
1769 ieee80211_node_addba_request_ac_vi_to, ni);
1770 timeout_set(&ni->ni_addba_req_to[EDCA_AC_VO],
1771 ieee80211_node_addba_request_ac_vo_to, ni);
1772 for (i = 0; i < nitems(ni->ni_addba_req_intval); i++)
1773 ni->ni_addba_req_intval[i] = 1;
1778 struct ieee80211_node *ni, const u_int8_t *macaddr)
1783 IEEE80211_ADDR_COPY(ni->ni_macaddr, macaddr);
1784 ieee80211_node_newstate(ni, IEEE80211_STA_CACHE);
1786 ni->ni_ic = ic; /* back-pointer */
1788 ni->ni_rxseq = 0xffffU;
1790 ni->ni_qos_rxseqs[i] = 0xffffU;
1792 mq_init(&ni->ni_savedq, IEEE80211_PS_MAX_QUEUE, IPL_NET);
1794 ieee80211_node_set_timeouts(ni);
1797 RBT_INSERT(ieee80211_tree, &ic->ic_tree, ni);
1805 struct ieee80211_node *ni = ieee80211_alloc_node_helper(ic);
1806 if (ni != NULL)
1807 ieee80211_setup_node(ic, ni, macaddr);
1810 return ni;
1816 struct ieee80211_node *ni = ieee80211_alloc_node_helper(ic);
1817 if (ni != NULL) {
1818 ieee80211_setup_node(ic, ni, macaddr);
1822 IEEE80211_ADDR_COPY(ni->ni_bssid, ic->ic_bss->ni_bssid);
1823 ni->ni_chan = ic->ic_bss->ni_chan;
1826 return ni;
1832 struct ieee80211_node *ni;
1836 ni = RBT_ROOT(ieee80211_tree, &ic->ic_tree);
1837 while (ni != NULL) {
1838 cmp = memcmp(macaddr, ni->ni_macaddr, IEEE80211_ADDR_LEN);
1840 ni = RBT_LEFT(ieee80211_tree, ni);
1842 ni = RBT_RIGHT(ieee80211_tree, ni);
1846 return ni;
1860 struct ieee80211_node *ni;
1874 ni = ieee80211_find_node(ic, macaddr);
1876 if (ni == NULL) {
1890 if ((ni = ieee80211_dup_bss(ic, macaddr)) == NULL)
1893 ni->ni_rates = ic->ic_bss->ni_rates;
1894 ni->ni_txrate = 0;
1896 (*ic->ic_newassoc)(ic, ni, 1);
1898 return ieee80211_ref_node(ni);
2002 struct ieee80211_node *ni;
2010 ni = ieee80211_find_node(ic, wh->i_addr2);
2013 if (ni != NULL)
2014 return ieee80211_ref_node(ni);
2021 if ((ni = ieee80211_dup_bss(ic, wh->i_addr2)) == NULL)
2024 IEEE80211_ADDR_COPY(ni->ni_bssid, (bssid != NULL) ? bssid : zero);
2026 ni->ni_rates = ic->ic_bss->ni_rates;
2027 ni->ni_txrate = 0;
2029 (*ic->ic_newassoc)(ic, ni, 1);
2031 DPRINTF(("faked-up node %p for %s\n", ni,
2034 return ieee80211_ref_node(ni);
2038 ieee80211_node_tx_ba_clear(struct ieee80211_node *ni, int tid)
2040 struct ieee80211_tx_ba *ba = &ni->ni_tx_ba[tid];
2050 ieee80211_ba_del(struct ieee80211_node *ni)
2054 for (tid = 0; tid < nitems(ni->ni_rx_ba); tid++) {
2055 struct ieee80211_rx_ba *ba = &ni->ni_rx_ba[tid];
2065 for (tid = 0; tid < nitems(ni->ni_tx_ba); tid++)
2066 ieee80211_node_tx_ba_clear(ni, tid);
2068 timeout_del(&ni->ni_addba_req_to[EDCA_AC_BE]);
2069 timeout_del(&ni->ni_addba_req_to[EDCA_AC_BK]);
2070 timeout_del(&ni->ni_addba_req_to[EDCA_AC_VI]);
2071 timeout_del(&ni->ni_addba_req_to[EDCA_AC_VO]);
2075 ieee80211_free_node(struct ieee80211com *ic, struct ieee80211_node *ni)
2077 if (ni == ic->ic_bss)
2082 DPRINTF(("%s\n", ether_sprintf(ni->ni_macaddr)));
2084 timeout_del(&ni->ni_eapol_to);
2085 timeout_del(&ni->ni_sa_query_to);
2086 IEEE80211_AID_CLR(ni->ni_associd, ic->ic_aid_bitmap);
2088 ieee80211_ba_del(ni);
2089 RBT_REMOVE(ieee80211_tree, &ic->ic_tree, ni);
2092 if (mq_purge(&ni->ni_savedq) > 0) {
2094 (*ic->ic_set_tim)(ic, ni->ni_associd, 0);
2097 (*ic->ic_node_free)(ic, ni);
2102 ieee80211_release_node(struct ieee80211com *ic, struct ieee80211_node *ni)
2107 DPRINTF(("%s refcnt %u\n", ether_sprintf(ni->ni_macaddr),
2108 ni->ni_refcnt));
2110 if (ieee80211_node_decref(ni) == 0) {
2111 if (ni->ni_unref_cb) {
2112 /* The callback may set ni->ni_unref_cb again. */
2113 ni_unref_cb = ni->ni_unref_cb;
2114 ni->ni_unref_cb = NULL;
2116 (*ni_unref_cb)(ic, ni);
2118 if (ni->ni_state == IEEE80211_STA_COLLECT)
2119 ieee80211_free_node(ic, ni);
2127 struct ieee80211_node *ni;
2132 while ((ni = RBT_MIN(ieee80211_tree, &ic->ic_tree)) != NULL)
2133 ieee80211_free_node(ic, ni);
2143 struct ieee80211_node *ni, *next_ni;
2147 for (ni = RBT_MIN(ieee80211_tree, &ic->ic_tree);
2148 ni != NULL; ni = next_ni) {
2149 next_ni = RBT_NEXT(ieee80211_tree, ni);
2150 if (ni->ni_state == IEEE80211_STA_CACHE)
2151 ieee80211_free_node(ic, ni);
2171 struct ieee80211_node *ni, *next_ni;
2182 for (ni = RBT_MIN(ieee80211_tree, &ic->ic_tree);
2183 ni != NULL; ni = next_ni) {
2184 next_ni = RBT_NEXT(ieee80211_tree, ni);
2187 if (ni->ni_scangen == gen) /* previously handled */
2199 if ((ni->ni_flags & IEEE80211_NODE_HTCAP) == 0) {
2201 if (ni->ni_state == IEEE80211_STA_ASSOC)
2206 ni->ni_scangen = gen;
2207 if (ni->ni_refcnt > 0)
2214 if (ni->ni_state != IEEE80211_STA_COLLECT &&
2215 (ni->ni_state == IEEE80211_STA_ASSOC ||
2216 ni->ni_inact < IEEE80211_INACT_MAX))
2220 ((ni->ni_state == IEEE80211_STA_ASSOC &&
2221 ni->ni_inact < IEEE80211_INACT_MAX) ||
2222 (ni->ni_state == IEEE80211_STA_AUTH &&
2223 ni->ni_inact == 0)))
2227 ni->ni_state != IEEE80211_STA_COLLECT &&
2228 ni->ni_state != IEEE80211_STA_CACHE &&
2229 ni->ni_inact < IEEE80211_INACT_MAX)
2235 ifp->if_xname, ether_sprintf(ni->ni_macaddr));
2245 if ((ni->ni_flags & IEEE80211_NODE_HTCAP) == 0) {
2247 if (ni->ni_state == IEEE80211_STA_ASSOC)
2252 ni->ni_state >= IEEE80211_STA_AUTH &&
2253 ni->ni_state != IEEE80211_STA_COLLECT) {
2254 IEEE80211_SEND_MGMT(ic, ni,
2257 ieee80211_node_leave(ic, ni);
2260 ieee80211_free_node(ic, ni);
2304 struct ieee80211_node *ni, *next_ni;
2309 for (ni = RBT_MIN(ieee80211_tree, &ic->ic_tree);
2310 ni != NULL; ni = next_ni) {
2311 next_ni = RBT_NEXT(ieee80211_tree, ni);
2312 if (ni->ni_scangen == gen) /* previously handled */
2314 ni->ni_scangen = gen;
2315 if (ni->ni_refcnt > 0 || ni->ni_inact < inact_max)
2317 ieee80211_free_node(ic, ni);
2328 struct ieee80211_node *ni;
2332 RBT_FOREACH(ni, ieee80211_tree, &ic->ic_tree)
2333 (*f)(arg, ni);
2342 ieee80211_setup_htcaps(struct ieee80211_node *ni, const uint8_t *data,
2350 ni->ni_htcaps = (data[0] | (data[1] << 8));
2351 ni->ni_ampdu_param = data[2];
2353 memcpy(ni->ni_rxmcs, &data[3], sizeof(ni->ni_rxmcs));
2355 clrbit(ni->ni_rxmcs, 77);
2356 clrbit(ni->ni_rxmcs, 78);
2357 clrbit(ni->ni_rxmcs, 79);
2362 ni->ni_max_rxrate = rxrate;
2364 ni->ni_tx_mcs_set = data[15];
2365 ni->ni_htxcaps = (data[19] | (data[20] << 8));
2366 ni->ni_txbfcaps = (data[21] | (data[22] << 8) | (data[23] << 16) |
2368 ni->ni_aselcaps = data[25];
2370 ni->ni_flags |= IEEE80211_NODE_HTCAP;
2378 ieee80211_clear_htcaps(struct ieee80211_node *ni)
2380 ni->ni_htcaps = 0;
2381 ni->ni_ampdu_param = 0;
2382 memset(ni->ni_rxmcs, 0, sizeof(ni->ni_rxmcs));
2383 ni->ni_max_rxrate = 0;
2384 ni->ni_tx_mcs_set = 0;
2385 ni->ni_htxcaps = 0;
2386 ni->ni_txbfcaps = 0;
2387 ni->ni_aselcaps = 0;
2389 ni->ni_flags &= ~(IEEE80211_NODE_HT | IEEE80211_NODE_HT_SGI20 |
2474 ieee80211_setup_htop(struct ieee80211_node *ni, const uint8_t *data,
2480 ni->ni_primary_chan = data[0]; /* corresponds to ni_chan */
2481 ni->ni_htop0 = data[1];
2483 ni->ni_htop0 &= ~IEEE80211_HTOP0_SCO_MASK;
2484 ni->ni_htop1 = (data[2] | (data[3] << 8));
2485 ni->ni_htop2 = (data[3] | (data[4] << 8));
2493 memcpy(ni->ni_basic_mcs, &data[6], sizeof(ni->ni_basic_mcs));
2502 ieee80211_setup_vhtcaps(struct ieee80211_node *ni, const uint8_t *data,
2508 ni->ni_vhtcaps = (data[0] | (data[1] << 8) | data[2] << 16 |
2510 ni->ni_vht_rxmcs = (data[4] | (data[5] << 8));
2511 ni->ni_vht_rx_max_lgi_mbit_s = ((data[6] | (data[7] << 8)) &
2513 ni->ni_vht_txmcs = (data[8] | (data[9] << 8));
2514 ni->ni_vht_tx_max_lgi_mbit_s = ((data[10] | (data[11] << 8)) &
2517 ni->ni_flags |= IEEE80211_NODE_VHTCAP;
2549 ieee80211_setup_vhtop(struct ieee80211_node *ni, const uint8_t *data,
2564 sco = ((ni->ni_htop0 & IEEE80211_HTOP0_SCO_MASK) >>
2570 ni->ni_vht_chan_width = data[0];
2571 ni->ni_vht_chan_center_freq_idx0 = data[1];
2575 ni->ni_vht_chan_center_freq_idx1 = data[2];
2577 ni->ni_vht_chan_center_freq_idx1 = 0;
2579 ni->ni_vht_chan_width = IEEE80211_VHTOP0_CHAN_WIDTH_HT;
2580 ni->ni_vht_chan_center_freq_idx0 = 0;
2581 ni->ni_vht_chan_center_freq_idx1 = 0;
2584 ni->ni_vht_basic_mcs = (data[3] | data[4] << 8);
2593 ieee80211_clear_vhtcaps(struct ieee80211_node *ni)
2595 ni->ni_vhtcaps = 0;
2596 ni->ni_vht_rxmcs = 0;
2597 ni->ni_vht_rx_max_lgi_mbit_s = 0;
2598 ni->ni_vht_txmcs = 0;
2599 ni->ni_vht_tx_max_lgi_mbit_s = 0;
2601 ni->ni_flags &= ~(IEEE80211_NODE_VHT | IEEE80211_NODE_VHT_SGI80 |
2611 ieee80211_setup_rates(struct ieee80211com *ic, struct ieee80211_node *ni,
2614 struct ieee80211_rateset *rs = &ni->ni_rates;
2635 return ieee80211_fix_rate(ic, ni, flags);
2639 ieee80211_node_trigger_addba_req(struct ieee80211_node *ni, int tid)
2641 if (ni->ni_tx_ba[tid].ba_state == IEEE80211_BA_INIT &&
2642 !timeout_pending(&ni->ni_addba_req_to[tid])) {
2643 timeout_add_sec(&ni->ni_addba_req_to[tid],
2644 ni->ni_addba_req_intval[tid]);
2649 ieee80211_node_addba_request(struct ieee80211_node *ni, int tid)
2651 struct ieee80211com *ic = ni->ni_ic;
2652 uint16_t ssn = ni->ni_qos_txseqs[tid];
2654 ieee80211_addba_request(ic, ni, ssn, tid);
2660 struct ieee80211_node *ni = arg;
2661 ieee80211_node_addba_request(ni, EDCA_AC_BE);
2667 struct ieee80211_node *ni = arg;
2668 ieee80211_node_addba_request(ni, EDCA_AC_BK);
2674 struct ieee80211_node *ni = arg;
2675 ieee80211_node_addba_request(ni, EDCA_AC_VI);
2681 struct ieee80211_node *ni = arg;
2682 ieee80211_node_addba_request(ni, EDCA_AC_VO);
2690 ieee80211_iserp_sta(const struct ieee80211_node *ni)
2693 const struct ieee80211_rateset *rs = &ni->ni_rates;
2718 ieee80211_needs_auth(struct ieee80211com *ic, struct ieee80211_node *ni)
2731 ieee80211_node_join_ht(struct ieee80211com *ic, struct ieee80211_node *ni)
2736 if ((ni->ni_flags & IEEE80211_NODE_HT) == 0) {
2750 ieee80211_node_join_rsn(struct ieee80211com *ic, struct ieee80211_node *ni)
2753 "cipher 0x%x groupcipher 0x%x\n", ether_sprintf(ni->ni_macaddr),
2754 ni->ni_rsnprotos, ni->ni_rsnakms, ni->ni_rsnciphers,
2755 ni->ni_rsngroupcipher));
2757 ni->ni_rsn_state = RSNA_AUTHENTICATION;
2759 ni->ni_key_count = 0;
2760 ni->ni_port_valid = 0;
2761 ni->ni_flags &= ~IEEE80211_NODE_TXRXPROT;
2762 ni->ni_flags &= ~IEEE80211_NODE_RSN_NEW_PTK;
2763 ni->ni_replaycnt = -1; /* XXX */
2764 ni->ni_rsn_retries = 0;
2765 ni->ni_rsncipher = ni->ni_rsnciphers;
2767 ni->ni_rsn_state = RSNA_AUTHENTICATION_2;
2770 arc4random_buf(ni->ni_nonce, EAPOL_KEY_NONCE_LEN);
2772 if (!ieee80211_is_8021x_akm(ni->ni_rsnakms)) {
2773 memcpy(ni->ni_pmk, ic->ic_psk, IEEE80211_PMK_LEN);
2774 ni->ni_flags |= IEEE80211_NODE_PMK;
2775 (void)ieee80211_send_4way_msg1(ic, ni);
2776 } else if (ni->ni_flags & IEEE80211_NODE_PMK) {
2778 (void)ieee80211_send_4way_msg1(ic, ni);
2781 ieee80211_needs_auth(ic, ni);
2786 ieee80211_count_longslotsta(void *arg, struct ieee80211_node *ni)
2790 if (ni->ni_associd == 0 || ni->ni_state == IEEE80211_STA_COLLECT)
2793 if (!(ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_SLOTTIME))
2798 ieee80211_count_nonerpsta(void *arg, struct ieee80211_node *ni)
2802 if (ni->ni_associd == 0 || ni->ni_state == IEEE80211_STA_COLLECT)
2805 if (!ieee80211_iserp_sta(ni))
2810 ieee80211_count_pssta(void *arg, struct ieee80211_node *ni)
2814 if (ni->ni_associd == 0 || ni->ni_state == IEEE80211_STA_COLLECT)
2817 if (ni->ni_pwrsave == IEEE80211_PS_DOZE)
2822 ieee80211_count_rekeysta(void *arg, struct ieee80211_node *ni)
2826 if (ni->ni_associd == 0 || ni->ni_state == IEEE80211_STA_COLLECT)
2829 if (ni->ni_flags & IEEE80211_NODE_REKEY)
2837 ieee80211_node_join_11g(struct ieee80211com *ic, struct ieee80211_node *ni)
2841 if (!(ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_SLOTTIME)) {
2855 ether_sprintf(ni->ni_macaddr), longslotsta));
2858 if (!ieee80211_iserp_sta(ni)) {
2865 "stations associated\n", ether_sprintf(ni->ni_macaddr),
2873 if (!(ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE))
2876 ni->ni_flags |= IEEE80211_NODE_ERP;
2880 ieee80211_node_join(struct ieee80211com *ic, struct ieee80211_node *ni,
2883 int newassoc = (ni->ni_state != IEEE80211_STA_ASSOC);
2885 if (ni->ni_associd == 0) {
2898 IEEE80211_SEND_MGMT(ic, ni, resp,
2900 ieee80211_node_leave(ic, ni);
2903 ni->ni_associd = aid | 0xc000;
2904 IEEE80211_AID_SET(ni->ni_associd, ic->ic_aid_bitmap);
2908 ieee80211_node_join_11g(ic, ni);
2912 ether_sprintf(ni->ni_macaddr), newassoc ? "newly" : "already",
2913 ni->ni_associd & ~0xc000));
2915 ieee80211_ht_negotiate(ic, ni);
2917 ieee80211_node_join_ht(ic, ni);
2921 (*ic->ic_newassoc)(ic, ni, newassoc);
2922 IEEE80211_SEND_MGMT(ic, ni, resp, IEEE80211_STATUS_SUCCESS);
2923 ieee80211_node_newstate(ni, IEEE80211_STA_ASSOC);
2926 ni->ni_port_valid = 1;
2927 ni->ni_rsncipher = IEEE80211_CIPHER_USEGROUP;
2929 ieee80211_node_join_rsn(ic, ni);
2938 (struct ether_addr *)ni->ni_macaddr, 0);
2946 ieee80211_node_leave_ht(struct ieee80211com *ic, struct ieee80211_node *ni)
2953 ieee80211_ba_del(ni);
2955 ba = &ni->ni_rx_ba[tid];
2965 ieee80211_clear_htcaps(ni);
2972 ieee80211_node_leave_vht(struct ieee80211com *ic, struct ieee80211_node *ni)
2974 ieee80211_clear_vhtcaps(ni);
2981 ieee80211_node_leave_rsn(struct ieee80211com *ic, struct ieee80211_node *ni)
2985 ni->ni_rsn_state = RSNA_INITIALIZE;
2986 if (ni->ni_flags & IEEE80211_NODE_REKEY) {
2987 ni->ni_flags &= ~IEEE80211_NODE_REKEY;
2993 ni->ni_flags &= ~IEEE80211_NODE_PMK;
2994 ni->ni_rsn_gstate = RSNA_IDLE;
2996 timeout_del(&ni->ni_eapol_to);
2997 timeout_del(&ni->ni_sa_query_to);
2999 ni->ni_rsn_retries = 0;
3000 ni->ni_flags &= ~IEEE80211_NODE_TXRXPROT;
3001 ni->ni_port_valid = 0;
3002 (*ic->ic_delete_key)(ic, ni, &ni->ni_pairwise_key);
3009 ieee80211_node_leave_11g(struct ieee80211com *ic, struct ieee80211_node *ni)
3013 if (!(ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_SLOTTIME)) {
3029 ether_sprintf(ni->ni_macaddr), longslotsta));
3032 if (!(ni->ni_flags & IEEE80211_NODE_ERP)) {
3046 ether_sprintf(ni->ni_macaddr), nonerpsta));
3052 struct ieee80211_node *ni)
3057 if (ni->ni_pwrsave == IEEE80211_PS_DOZE)
3058 ni->ni_pwrsave = IEEE80211_PS_AWAKE;
3060 if (mq_len(&ni->ni_savedq) > 0) {
3062 (*ic->ic_set_tim)(ic, ni->ni_associd, 0);
3064 while ((m = mq_dequeue(&ni->ni_savedq)) != NULL) {
3065 if (ni->ni_refcnt > 0)
3066 ieee80211_node_decref(ni);
3072 if (m->m_pkthdr.ph_cookie == ni) {
3073 if (ni->ni_refcnt > 0)
3074 ieee80211_node_decref(ni);
3088 ieee80211_node_leave(struct ieee80211com *ic, struct ieee80211_node *ni)
3093 if (ni->ni_state == IEEE80211_STA_COLLECT)
3099 if (ni->ni_associd == 0) {
3100 ieee80211_node_newstate(ni, IEEE80211_STA_COLLECT);
3104 ieee80211_node_leave_pwrsave(ic, ni);
3107 ieee80211_node_leave_rsn(ic, ni);
3112 ieee80211_node_leave_11g(ic, ni);
3114 if (ni->ni_flags & IEEE80211_NODE_HT)
3115 ieee80211_node_leave_ht(ic, ni);
3116 if (ni->ni_flags & IEEE80211_NODE_VHT)
3117 ieee80211_node_leave_vht(ic, ni);
3120 (*ic->ic_node_leave)(ic, ni);
3122 ieee80211_node_newstate(ni, IEEE80211_STA_COLLECT);
3131 (struct ether_addr *)ni->ni_macaddr, 1);
3165 ieee80211_ibss_merge(struct ieee80211com *ic, struct ieee80211_node *ni,
3176 (void)memcpy(&u, &ni->ni_tstamp[0], sizeof(u));
3185 if (IEEE80211_ADDR_EQ(ni->ni_bssid, ic->ic_bss->ni_bssid)) {
3199 if (ieee80211_match_bss(ic, ni, 0) != 0)
3204 ic->ic_if.if_xname, ether_sprintf(ni->ni_bssid));
3208 ic->ic_if.if_xname, ether_sprintf(ni->ni_macaddr));
3214 ieee80211_fix_rate(ic, ni, IEEE80211_F_DOFRATE |
3216 if (ni->ni_rates.rs_nrates == 0) {
3219 ic->ic_if.if_xname, ether_sprintf(ni->ni_bssid));
3227 printf("%s ", ether_sprintf(ni->ni_bssid));
3228 printf("(from %s)\n", ether_sprintf(ni->ni_macaddr));
3231 ieee80211_node_newstate(ni, IEEE80211_STA_BSS);
3232 (*ic->ic_node_copy)(ic, ic->ic_bss, ni);
3254 struct ieee80211_node *ni = ic->ic_bss;
3261 while ((m = mq_dequeue(&ni->ni_savedq)) != NULL) {
3262 if (!mq_empty(&ni->ni_savedq)) {