Home | History | Annotate | Download | only in net80211

Lines Matching refs:ic

101 static void ieee80211_node_table_init(struct ieee80211com *ic,
110 ieee80211_node_attach(struct ieee80211com *ic)
113 ic->ic_node_alloc = node_alloc;
114 ic->ic_node_free = node_free;
115 ic->ic_node_cleanup = node_cleanup;
116 ic->ic_node_getrssi = node_getrssi;
119 ic->ic_inact_init = IEEE80211_INACT_INIT;
120 ic->ic_inact_auth = IEEE80211_INACT_AUTH;
121 ic->ic_inact_run = IEEE80211_INACT_RUN;
122 ic->ic_inact_probe = IEEE80211_INACT_PROBE;
125 ic->ic_max_aid = IEEE80211_AID_DEF;
126 ic->ic_set_tim = ieee80211_set_tim;
130 ieee80211_node_lateattach(struct ieee80211com *ic)
134 if (ic->ic_max_aid > IEEE80211_AID_MAX)
135 ic->ic_max_aid = IEEE80211_AID_MAX;
136 ic->ic_aid_bitmap = malloc(howmany(ic->ic_max_aid, 32) *
140 ic->ic_tim_len = howmany(ic->ic_max_aid, 8) * sizeof(u_int8_t);
141 ic->ic_tim_bitmap = malloc(ic->ic_tim_len, M_DEVBUF, M_WAITOK | M_ZERO);
143 ieee80211_node_table_init(ic, &ic->ic_sta, "station",
144 IEEE80211_INACT_INIT, ic->ic_crypto.cs_max_keyix,
146 ieee80211_node_table_init(ic, &ic->ic_scan, "scan",
150 ieee80211_reset_bss(ic);
155 rsn = &ic->ic_bss->ni_rsn;
160 if (ic->ic_caps & IEEE80211_C_AES)
162 if (ic->ic_caps & IEEE80211_C_CKIP)
187 ic->ic_auth = ieee80211_authenticator_get(ic->ic_bss->ni_authmode);
191 ieee80211_node_detach(struct ieee80211com *ic)
194 if (ic->ic_bss != NULL) {
195 ieee80211_free_node(ic->ic_bss);
196 ic->ic_bss = NULL;
198 ieee80211_node_table_cleanup(&ic->ic_scan);
199 ieee80211_node_table_cleanup(&ic->ic_sta);
200 if (ic->ic_aid_bitmap != NULL) {
201 free(ic->ic_aid_bitmap, M_DEVBUF);
202 ic->ic_aid_bitmap = NULL;
204 if (ic->ic_tim_bitmap != NULL) {
205 free(ic->ic_tim_bitmap, M_DEVBUF);
206 ic->ic_tim_bitmap = NULL;
217 struct ieee80211com *ic = ni->ni_ic;
220 ni->ni_inact_reload = ic->ic_inact_run;
234 ieee80211_set_chan(struct ieee80211com *ic,
238 chan = ic->ic_curchan;
240 ni->ni_rates = ic->ic_sup_rates[ieee80211_chan2mode(ic, chan)];
268 ieee80211_reset_scan(struct ieee80211com *ic)
272 if (ic->ic_des_chan != IEEE80211_CHAN_ANYC) {
273 memset(ic->ic_chan_scan, 0, sizeof(ic->ic_chan_scan));
274 setbit(ic->ic_chan_scan,
275 ieee80211_chan2ieee(ic, ic->ic_des_chan));
277 memcpy(ic->ic_chan_scan, ic->ic_chan_active,
278 sizeof(ic->ic_chan_active));
280 if (ieee80211_msg_scan(ic)) {
282 dump_chanlist(ic->ic_chan_scan);
284 ieee80211_chan2ieee(ic, ic->ic_curchan));
293 ieee80211_begin_scan(struct ieee80211com *ic, int reset)
295 ic->ic_scan.nt_scangen++;
301 if (ic->ic_opmode != IEEE80211_M_HOSTAP) {
302 ic->ic_flags |= IEEE80211_F_ASCAN;
303 ic->ic_stats.is_scan_active++;
305 ic->ic_stats.is_scan_passive++;
306 IEEE80211_DPRINTF(ic, IEEE80211_MSG_SCAN,
308 (ic->ic_flags & IEEE80211_F_ASCAN) ? "active" : "passive",
309 ieee80211_phymode_name[ic->ic_curmode], ic->ic_scan.nt_scangen);
314 ieee80211_reset_scan(ic);
316 ieee80211_free_allnodes(&ic->ic_scan);
318 ic->ic_flags |= IEEE80211_F_SCAN;
321 ieee80211_next_scan(ic);
328 ieee80211_next_scan1(struct ieee80211com *ic)
337 ic->ic_mgt_timer = 0;
338 ic->ic_flags_ext &= ~IEEE80211_FEXT_PROBECHAN;
340 chan = ic->ic_curchan;
344 chan = &ic->ic_channels[IEEE80211_CHAN_MAX];
345 ic->ic_curchan = chan;
349 if (++chan > &ic->ic_channels[IEEE80211_CHAN_MAX])
350 chan = &ic->ic_channels[0];
351 if (isset(ic->ic_chan_scan, ieee80211_chan2ieee(ic, chan))) {
352 clrbit(ic->ic_chan_scan, ieee80211_chan2ieee(ic, chan));
353 IEEE80211_DPRINTF(ic, IEEE80211_MSG_SCAN,
355 ieee80211_chan2ieee(ic, ic->ic_curchan),
356 ieee80211_chan2ieee(ic, chan));
357 ic->ic_curchan = chan;
362 ic->ic_bss->ni_rates =
363 ic->ic_sup_rates[ieee80211_chan2mode(ic, chan)];
364 ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
367 } while (chan != ic->ic_curchan);
373 ieee80211_next_scan(struct ieee80211com *ic)
377 rc = ieee80211_next_scan1(ic);
379 ieee80211_end_scan(ic);
392 ieee80211_probe_curchan(struct ieee80211com *ic, int force)
394 struct ifnet *ifp = ic->ic_ifp;
396 if ((ic->ic_curchan->ic_flags & IEEE80211_CHAN_PASSIVE) == 0 || force) {
400 ieee80211_send_probereq(ic->ic_bss,
401 ic->ic_myaddr, ifp->if_broadcastaddr,
403 ic->ic_des_essid, ic->ic_des_esslen,
404 ic->ic_opt_ie, ic->ic_opt_ie_len);
406 ic->ic_flags_ext |= IEEE80211_FEXT_PROBECHAN;
421 ieee80211_create_ibss(struct ieee80211com* ic, struct ieee80211_channel *chan)
426 IEEE80211_DPRINTF(ic, IEEE80211_MSG_SCAN,
435 nt = &ic->ic_sta;
437 if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
439 nt->nt_inact_init = ic->ic_inact_init;
442 nt->nt_inact_init = ic->ic_inact_run;
446 ni = ieee80211_alloc_node(&ic->ic_sta, ic->ic_myaddr);
451 IEEE80211_ADDR_COPY(ni->ni_bssid, ic->ic_myaddr);
452 ni->ni_esslen = ic->ic_des_esslen;
453 memcpy(ni->ni_essid, ic->ic_des_essid, ni->ni_esslen);
454 copy_bss(ni, ic->ic_bss);
455 ni->ni_intval = ic->ic_bintval;
456 if (ic->ic_flags & IEEE80211_F_PRIVACY)
458 if (ic->ic_phytype == IEEE80211_T_FH) {
462 if (ic->ic_opmode == IEEE80211_M_IBSS) {
463 ic->ic_flags |= IEEE80211_F_SIBSS;
465 if (ic->ic_flags & IEEE80211_F_DESBSSID)
466 IEEE80211_ADDR_COPY(ni->ni_bssid, ic->ic_des_bssid);
474 ieee80211_set_chan(ic, ni, chan);
475 ic->ic_curchan = chan;
476 ic->ic_curmode = ieee80211_chan2mode(ic, chan);
481 if (ic->ic_curmode == IEEE80211_MODE_11G) {
486 } else if (ic->ic_curmode == IEEE80211_MODE_11B) {
493 (void)ieee80211_sta_join(ic, ieee80211_ref_node(ni));
497 ieee80211_reset_bss(struct ieee80211com *ic)
501 ieee80211_node_table_reset(&ic->ic_scan);
502 ieee80211_node_table_reset(&ic->ic_sta);
504 ni = ieee80211_alloc_node(&ic->ic_scan, ic->ic_myaddr);
506 obss = ic->ic_bss;
507 ic->ic_bss = ieee80211_ref_node(ni);
510 ni->ni_intval = ic->ic_bintval;
519 ieee80211_match_bss(struct ieee80211com *ic, struct ieee80211_node *ni)
525 if (isclr(ic->ic_chan_active, ieee80211_chan2ieee(ic, ni->ni_chan)))
527 if (ic->ic_des_chan != IEEE80211_CHAN_ANYC &&
528 ni->ni_chan != ic->ic_des_chan)
531 if (ic->ic_opmode == IEEE80211_M_IBSS) {
539 if (ic->ic_flags & IEEE80211_F_PRIVACY) {
552 if (ic->ic_des_esslen != 0 &&
553 (ni->ni_esslen != ic->ic_des_esslen ||
554 memcmp(ni->ni_essid, ic->ic_des_essid, ic->ic_des_esslen) != 0))
557 if ((ic->ic_flags & IEEE80211_F_DESBSSID) &&
558 !IEEE80211_ADDR_EQ(ic->ic_des_bssid, ni->ni_bssid))
565 if (ic->ic_des_esslen == 0)
569 if (ieee80211_msg_scan(ic)) {
575 ic, ni->ni_chan),
613 ieee80211_node_compare(struct ieee80211com *ic, const struct ieee80211_node *a,
633 rssia = ic->ic_node_getrssi(a);
634 rssib = ic->ic_node_getrssi(b);
658 ieee80211_cancel_scan(struct ieee80211com *ic)
661 IEEE80211_DPRINTF(ic, IEEE80211_MSG_SCAN, "%s: end %s scan\n",
663 (ic->ic_flags & IEEE80211_F_ASCAN) ? "active" : "passive");
665 ic->ic_flags &= ~(IEEE80211_F_SCAN | IEEE80211_F_ASCAN);
666 ic->ic_flags_ext &= ~IEEE80211_FEXT_PROBECHAN;
673 ieee80211_end_scan(struct ieee80211com *ic)
675 struct ieee80211_node_table *nt = &ic->ic_scan;
678 ieee80211_cancel_scan(ic);
679 ieee80211_notify_scan_done(ic);
682 if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
697 rssi = ic->ic_node_getrssi(ni);
698 i = ieee80211_chan2ieee(ic, ni->ni_chan);
707 if (isset(ic->ic_chan_active, i)) {
724 ieee80211_create_ibss(ic, &ic->ic_channels[bestchan]);
737 if (ic->ic_roaming == IEEE80211_ROAMING_MANUAL)
746 IEEE80211_DPRINTF(ic, IEEE80211_MSG_SCAN,
750 if (ic->ic_opmode == IEEE80211_M_IBSS &&
751 (ic->ic_flags & IEEE80211_F_IBSSON) &&
752 ic->ic_des_esslen != 0) {
753 ieee80211_create_ibss(ic, ic->ic_ibss_chan);
773 ieee80211_reset_scan(ic);
774 ic->ic_flags |= IEEE80211_F_SCAN;
775 if (ieee80211_next_scan1(ic) == 0) {
776 ieee80211_cancel_scan(ic);
777 ieee80211_notify_scan_done(ic);
783 IEEE80211_DPRINTF(ic, IEEE80211_MSG_SCAN, "\t%s\n",
788 if (ieee80211_match_bss(ic, ni) == 0) {
791 else if (ieee80211_node_compare(ic, ni, selbs) > 0)
801 if (!ieee80211_sta_join(ic, selbs)) {
822 struct ieee80211com *ic = ni->ni_ic;
824 if (ni == ic->ic_bss ||
825 IEEE80211_ADDR_EQ(ni->ni_bssid, ic->ic_bss->ni_bssid)) {
829 if (ieee80211_match_bss(ic, ni) != 0) { /* capabilities mismatch */
830 IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC,
832 ic->ic_stats.is_ibss_capmismatch++;
835 if (!ieee80211_sta_join(ic, ieee80211_ref_node(ni)))
837 IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC,
840 ic->ic_flags&IEEE80211_F_SHPREAMBLE ? "short" : "long",
841 ic->ic_flags&IEEE80211_F_SHSLOT ? "short" : "long",
842 ic->ic_flags&IEEE80211_F_USEPROT ? ", protection" : ""
844 ic->ic_flags &= ~IEEE80211_F_SIBSS;
853 ieee80211_sta_join(struct ieee80211com *ic, struct ieee80211_node *selbs)
857 if (ic->ic_opmode == IEEE80211_M_IBSS) {
871 nt = &ic->ic_sta;
874 nt->nt_inact_init = ic->ic_inact_run;
881 obss = ic->ic_bss;
882 ic->ic_bss = selbs; /* NB: caller assumed to bump refcnt */
893 ic->ic_curmode = ieee80211_chan2mode(ic, selbs->ni_chan);
894 ic->ic_curchan = selbs->ni_chan;
895 ieee80211_reset_erp(ic);
896 ieee80211_wme_initparams(ic);
898 if (ic->ic_opmode == IEEE80211_M_STA)
899 ieee80211_new_state(ic, IEEE80211_S_AUTH, -1);
901 ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
910 ieee80211_sta_leave(struct ieee80211com *ic, struct ieee80211_node *ni)
912 ic->ic_node_cleanup(ni);
913 ieee80211_notify_node_leave(ic, ni);
921 struct ieee80211com *ic = ni->ni_ic;
927 IASSERT(ic != NULL, ("ic != NULL"));
929 if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) {
930 rs = &ic->ic_sup_rates[ic->ic_curmode];
931 rate = rs->rs_rates[ic->ic_fixed_rate] & IEEE80211_RATE_VAL;
936 IEEE80211_DPRINTF(ic, IEEE80211_MSG_DEBUG,
938 __func__, ic->ic_fixed_rate, (rate * 5) / 10,
942 } else if (ic->ic_state == IEEE80211_S_RUN) {
978 struct ieee80211com *ic = ni->ni_ic;
983 ic->ic_ps_sta--;
985 IEEE80211_DPRINTF(ic, IEEE80211_MSG_POWER,
987 ether_sprintf(ni->ni_macaddr), ic->ic_ps_sta);
1002 if (qlen != 0 && ic->ic_set_tim != NULL)
1003 ic->ic_set_tim(ni, 0);
1038 struct ieee80211com *ic = ni->ni_ic;
1040 ic->ic_node_cleanup(ni);
1059 struct ieee80211com *ic = nt->nt_ic;
1062 IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE,
1071 ni->ni_txpower = ic->ic_txpowlimit; /* max power */
1072 ieee80211_crypto_resetkey(ic, &ni->ni_ucastkey, IEEE80211_KEYIX_NONE);
1081 ni->ni_ic = ic;
1088 struct ieee80211com *ic = nt->nt_ic;
1091 ni = ic->ic_node_alloc(nt);
1095 ic->ic_stats.is_rx_nodealloc++;
1106 ieee80211_tmp_node(struct ieee80211com *ic, const u_int8_t *macaddr)
1110 ni = ic->ic_node_alloc(&ic->ic_sta);
1112 IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE,
1116 IEEE80211_ADDR_COPY(ni->ni_bssid, ic->ic_bss->ni_bssid);
1118 ni->ni_txpower = ic->ic_bss->ni_txpower;
1120 ieee80211_set_chan(ic, ni, ic->ic_bss->ni_chan);
1121 ieee80211_crypto_resetkey(ic, &ni->ni_ucastkey,
1127 ni->ni_ic = ic;
1130 ic->ic_stats.is_rx_nodealloc++;
1138 struct ieee80211com *ic = nt->nt_ic;
1141 ni = ic->ic_node_alloc(nt);
1147 ni->ni_authmode = ic->ic_bss->ni_authmode;
1148 ni->ni_txpower = ic->ic_bss->ni_txpower;
1149 ni->ni_vlan = ic->ic_bss->ni_vlan; /* XXX?? */
1150 IEEE80211_ADDR_COPY(ni->ni_bssid, ic->ic_bss->ni_bssid);
1151 ieee80211_set_chan(ic, ni, ic->ic_bss->ni_chan);
1152 ni->ni_rsn = ic->ic_bss->ni_rsn;
1154 ic->ic_stats.is_rx_nodealloc++;
1220 struct ieee80211com *ic = nt->nt_ic;
1226 ni->ni_rates = ic->ic_bss->ni_rates;
1227 if (ic->ic_newassoc != NULL)
1228 ic->ic_newassoc(ni, 1);
1283 ieee80211_add_scan(struct ieee80211com *ic,
1288 struct ieee80211_node_table *nt = &ic->ic_scan;
1297 ni = ic->ic_node_alloc(nt);
1299 ic->ic_stats.is_rx_nodealloc++;
1307 ni->ni_authmode = ic->ic_bss->ni_authmode;
1308 ni->ni_txpower = ic->ic_bss->ni_txpower;
1309 ni->ni_vlan = ic->ic_bss->ni_vlan; /* XXX?? */
1310 ieee80211_set_chan(ic, ni, ic->ic_curchan);
1311 ni->ni_rsn = ic->ic_bss->ni_rsn;
1316 if (ieee80211_msg_scan(ic) && (ic->ic_flags & IEEE80211_F_SCAN))
1327 ni->ni_scangen = ic->ic_scan.nt_scangen;
1334 ni->ni_chan = &ic->ic_channels[sp->sp_chan];
1372 ieee80211_init_neighbor(struct ieee80211com *ic, struct ieee80211_node *ni,
1382 ni->ni_chan = ic->ic_bss->ni_chan;
1396 if (ic->ic_newassoc != NULL)
1397 ic->ic_newassoc(ni, isnew);
1407 ieee80211_add_neighbor(struct ieee80211com *ic,
1413 ni = ieee80211_dup_bss(&ic->ic_sta, wh->i_addr2);/* XXX alloc_node? */
1415 ieee80211_init_neighbor(ic, ni, wh, sp, 1);
1436 ieee80211_find_rxnode_debug(struct ieee80211com *ic,
1439 ieee80211_find_rxnode(struct ieee80211com *ic,
1447 if (ic->ic_opmode == IEEE80211_M_STA ||
1448 ic->ic_opmode == IEEE80211_M_MONITOR ||
1449 (ic->ic_flags & IEEE80211_F_SCAN))
1450 nt = &ic->ic_scan;
1452 nt = &ic->ic_sta;
1462 ni = ieee80211_ref_node(ic->ic_bss);
1478 ieee80211_find_rxnode_withkey_debug(struct ieee80211com *ic,
1482 ieee80211_find_rxnode_withkey(struct ieee80211com *ic,
1489 if (ic->ic_opmode == IEEE80211_M_STA ||
1490 ic->ic_opmode == IEEE80211_M_MONITOR ||
1491 (ic->ic_flags & IEEE80211_F_SCAN)) {
1492 nt = &ic->ic_scan;
1494 nt = &ic->ic_sta;
1509 ni = ieee80211_ref_node(ic->ic_bss);
1542 ieee80211_find_txnode_debug(struct ieee80211com *ic, const u_int8_t *macaddr,
1545 ieee80211_find_txnode(struct ieee80211com *ic, const u_int8_t *macaddr)
1548 struct ieee80211_node_table *nt = &ic->ic_sta;
1559 if (ic->ic_opmode == IEEE80211_M_STA || IEEE80211_IS_MULTICAST(macaddr))
1560 ni = ieee80211_ref_node(ic->ic_bss);
1566 if (ic->ic_opmode == IEEE80211_M_IBSS ||
1567 ic->ic_opmode == IEEE80211_M_AHDEMO) {
1577 IEEE80211_DPRINTF(ic, IEEE80211_MSG_OUTPUT,
1580 ic->ic_stats.is_tx_nonode++;
1630 ieee80211_refine_node_for_beacon(struct ieee80211com *ic,
1691 struct ieee80211com *ic = nt->nt_ic;
1696 __USE(ic);
1718 IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE,
1724 IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE,
1740 struct ieee80211com *ic = ni->ni_ic;
1743 IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE,
1748 IEEE80211_AID_CLR(ni->ni_associd, ic->ic_aid_bitmap);
1753 ic->ic_node_free(ni);
1809 struct ieee80211com *ic = ni->ni_ic;
1810 struct ieee80211_node_table *nt = &ic->ic_sta;
1831 status = ieee80211_crypto_delkey(ic, &ni->ni_ucastkey);
1838 IEEE80211_NODE_UNLOCK(&ic->ic_sta);
1901 struct ieee80211com *ic = nt->nt_ic;
1904 IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE,
1909 if (ic->ic_auth->ia_node_leave != NULL)
1910 ic->ic_auth->ia_node_leave(ic, ni);
1911 IEEE80211_AID_CLR(ni->ni_associd, ic->ic_aid_bitmap);
1915 ieee80211_reset_erp(ic);
1933 struct ieee80211com *ic = nt->nt_ic;
1937 ni = ic->ic_bss;
1945 IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE,
1970 struct ieee80211com *ic = nt->nt_ic;
1975 isadhoc = (ic->ic_opmode == IEEE80211_M_IBSS ||
1976 ic->ic_opmode == IEEE80211_M_AHDEMO);
1980 IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE,
2002 if (ic->ic_opmode == IEEE80211_M_HOSTAP &&
2019 if (ni == ic->ic_bss)
2039 IEEE80211_DPRINTF(ic, IEEE80211_MSG_POWER, "[%s] discard frame, age %u\n", ether_sprintf(ni->ni_macaddr), M_AGE_GET(m));/*XXX*/
2049 IEEE80211_DPRINTF(ic,
2057 ic->ic_set_tim(ni, 0);
2067 ni->ni_inact <= ic->ic_inact_probe) {
2068 IEEE80211_NOTE(ic,
2087 IEEE80211_NOTE(ic,
2108 IEEE80211_SEND_MGMT(ic, ni,
2112 ieee80211_node_leave(ic, ni);
2113 ic->ic_stats.is_node_timeout++;
2190 ieee80211_node_join_11g(struct ieee80211com *ic, struct ieee80211_node *ni)
2201 ic->ic_longslotsta++;
2202 IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC,
2204 ether_sprintf(ni->ni_macaddr), ic->ic_longslotsta);
2206 ieee80211_set_shortslottime(ic, 0);
2214 if (!ieee80211_iserp_rateset(ic, &ni->ni_rates)) {
2215 ic->ic_nonerpsta++;
2216 IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC,
2218 ether_sprintf(ni->ni_macaddr), ic->ic_nonerpsta);
2222 if (ic->ic_protmode != IEEE80211_PROT_NONE) {
2223 IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC,
2225 ic->ic_flags |= IEEE80211_F_USEPROT;
2232 IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC,
2235 ic->ic_flags |= IEEE80211_F_USEBARKER;
2236 ic->ic_flags &= ~IEEE80211_F_SHPREAMBLE;
2244 ieee80211_node_join(struct ieee80211com *ic, struct ieee80211_node *ni,
2256 for (aid = 1; aid < ic->ic_max_aid; aid++) {
2258 ic->ic_aid_bitmap))
2261 if (aid >= ic->ic_max_aid) {
2262 IEEE80211_SEND_MGMT(ic, ni, resp,
2264 ieee80211_node_leave(ic, ni);
2268 IEEE80211_AID_SET(ni->ni_associd, ic->ic_aid_bitmap);
2269 ic->ic_sta_assoc++;
2271 if (ic->ic_curmode == IEEE80211_MODE_11G)
2272 ieee80211_node_join_11g(ic, ni);
2276 IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC | IEEE80211_MSG_DEBUG,
2280 ic->ic_flags & IEEE80211_F_SHPREAMBLE ? "short" : "long",
2281 ic->ic_flags & IEEE80211_F_SHSLOT ? "short" : "long",
2282 ic->ic_flags & IEEE80211_F_USEPROT ? ", protection" : "",
2287 if (ic->ic_newassoc != NULL)
2288 ic->ic_newassoc(ni, newassoc);
2289 ni->ni_inact_reload = ic->ic_inact_auth;
2291 IEEE80211_SEND_MGMT(ic, ni, resp, IEEE80211_STATUS_SUCCESS);
2293 if (ic->ic_auth->ia_node_join != NULL)
2294 ic->ic_auth->ia_node_join(ic, ni);
2295 ieee80211_notify_node_join(ic, ni, newassoc);
2302 ieee80211_node_leave_11g(struct ieee80211com *ic, struct ieee80211_node *ni)
2305 IASSERT(ic->ic_curmode == IEEE80211_MODE_11G,
2307 ni->ni_chan->ic_flags, ic->ic_curmode));
2313 IASSERT(ic->ic_longslotsta > 0,
2314 ("bogus long slot station count %d", ic->ic_longslotsta));
2315 ic->ic_longslotsta--;
2316 IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC,
2318 ether_sprintf(ni->ni_macaddr), ic->ic_longslotsta);
2319 if (ic->ic_longslotsta == 0) {
2324 if ((ic->ic_caps & IEEE80211_C_SHSLOT) &&
2325 ic->ic_opmode != IEEE80211_M_IBSS) {
2326 IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC,
2329 ieee80211_set_shortslottime(ic, 1);
2338 IASSERT(ic->ic_nonerpsta > 0,
2339 ("bogus non-ERP station count %d", ic->ic_nonerpsta));
2340 ic->ic_nonerpsta--;
2341 IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC,
2343 ether_sprintf(ni->ni_macaddr), ic->ic_nonerpsta);
2344 if (ic->ic_nonerpsta == 0) {
2345 IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC,
2347 ic->ic_flags &= ~IEEE80211_F_USEPROT;
2349 if (ic->ic_caps & IEEE80211_C_SHPREAMBLE) {
2350 IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC,
2353 ic->ic_flags |= IEEE80211_F_SHPREAMBLE;
2354 ic->ic_flags &= ~IEEE80211_F_USEBARKER;
2365 ieee80211_node_leave(struct ieee80211com *ic, struct ieee80211_node *ni)
2369 IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC | IEEE80211_MSG_DEBUG,
2372 IASSERT(ic->ic_opmode == IEEE80211_M_HOSTAP ||
2373 ic->ic_opmode == IEEE80211_M_IBSS ||
2374 ic->ic_opmode == IEEE80211_M_AHDEMO,
2375 ("unexpected operating mode %u", ic->ic_opmode));
2391 if (ic->ic_auth->ia_node_leave != NULL)
2392 ic->ic_auth->ia_node_leave(ic, ni);
2393 IEEE80211_AID_CLR(ni->ni_associd, ic->ic_aid_bitmap);
2395 ic->ic_sta_assoc--;
2397 if (ic->ic_curmode == IEEE80211_MODE_11G)
2398 ieee80211_node_leave_11g(ic, ni);
2406 ieee80211_sta_leave(ic, ni);
2424 ieee80211_getrssi(struct ieee80211com *ic)
2427 struct ieee80211_node_table *nt = &ic->ic_sta;
2433 switch (ic->ic_opmode) {
2439 rssi_total += ic->ic_node_getrssi(ni);
2446 rssi_total += ic->ic_node_getrssi(ni);
2455 rssi_total += ic->ic_node_getrssi(ni);
2462 if (ic->ic_bss != NULL)
2463 rssi_total = ic->ic_node_getrssi(ic->ic_bss);
2477 struct ieee80211com *ic = ni->ni_ic;
2480 IASSERT(ic->ic_opmode == IEEE80211_M_HOSTAP ||
2481 ic->ic_opmode == IEEE80211_M_IBSS,
2482 ("operating mode %u", ic->ic_opmode));
2485 IASSERT(aid < ic->ic_max_aid,
2486 ("bogus aid %u, max %u", aid, ic->ic_max_aid));
2488 IEEE80211_BEACON_LOCK(ic);
2489 if (set != (isset(ic->ic_tim_bitmap, aid) != 0)) {
2491 setbit(ic->ic_tim_bitmap, aid);
2492 ic->ic_ps_pending++;
2494 clrbit(ic->ic_tim_bitmap, aid);
2495 ic->ic_ps_pending--;
2497 ic->ic_flags |= IEEE80211_F_TIMUPDATE;
2499 IEEE80211_BEACON_UNLOCK(ic);
2507 ieee80211_node_table_init(struct ieee80211com *ic,
2513 IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE,
2516 nt->nt_ic = ic;
2518 IEEE80211_NODE_LOCK_INIT(nt, ic->ic_ifp->if_xname);
2519 IEEE80211_SCAN_LOCK_INIT(nt, ic->ic_ifp->if_xname);