Module Name: src Committed By: maxv Date: Thu Jan 18 17:59:29 UTC 2018
Modified Files: src/sys/net80211: ieee80211_node.c Log Message: Style, no functional change. To generate a diff of this commit: cvs rdiff -u -r1.74 -r1.75 src/sys/net80211/ieee80211_node.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net80211/ieee80211_node.c diff -u src/sys/net80211/ieee80211_node.c:1.74 src/sys/net80211/ieee80211_node.c:1.75 --- src/sys/net80211/ieee80211_node.c:1.74 Tue Jan 16 18:53:32 2018 +++ src/sys/net80211/ieee80211_node.c Thu Jan 18 17:59:29 2018 @@ -1,5 +1,6 @@ -/* $NetBSD: ieee80211_node.c,v 1.74 2018/01/16 18:53:32 maxv Exp $ */ -/*- +/* $NetBSD: ieee80211_node.c,v 1.75 2018/01/18 17:59:29 maxv Exp $ */ + +/* * Copyright (c) 2001 Atsushi Onoe * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting * All rights reserved. @@ -36,7 +37,7 @@ __FBSDID("$FreeBSD: src/sys/net80211/ieee80211_node.c,v 1.65 2005/08/13 17:50:21 sam Exp $"); #endif #ifdef __NetBSD__ -__KERNEL_RCSID(0, "$NetBSD: ieee80211_node.c,v 1.74 2018/01/16 18:53:32 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ieee80211_node.c,v 1.75 2018/01/18 17:59:29 maxv Exp $"); #endif #ifdef _KERNEL_OPT @@ -300,8 +301,8 @@ ieee80211_reset_scan(struct ieee80211com void ieee80211_begin_scan(struct ieee80211com *ic, int reset) { - ic->ic_scan.nt_scangen++; + /* * In all but hostap mode scanning starts off in * an active mode before switching to passive. @@ -315,6 +316,7 @@ ieee80211_begin_scan(struct ieee80211com "begin %s scan in %s mode, scangen %u\n", (ic->ic_flags & IEEE80211_F_ASCAN) ? "active" : "passive", ieee80211_phymode_name[ic->ic_curmode], ic->ic_scan.nt_scangen); + /* * Clear scan state and flush any previously seen AP's. */ @@ -365,6 +367,7 @@ ieee80211_next_scan(struct ieee80211com return 1; } } while (chan != ic->ic_curchan); + ieee80211_end_scan(ic); return 0; } @@ -455,12 +458,14 @@ ieee80211_create_ibss(struct ieee80211co else ni->ni_bssid[0] |= 0x02; /* local bit for IBSS */ } + /* * Fix the channel and related attributes. */ ieee80211_set_chan(ic, ni, chan); ic->ic_curchan = chan; ic->ic_curmode = ieee80211_chan2mode(ic, chan); + /* * Do mode-specific rate setup. */ @@ -476,7 +481,7 @@ ieee80211_create_ibss(struct ieee80211co ieee80211_set11gbasicrates(&ni->ni_rates, IEEE80211_MODE_11B); } - (void) ieee80211_sta_join(ic, ieee80211_ref_node(ni)); + (void)ieee80211_sta_join(ic, ieee80211_ref_node(ni)); } void @@ -504,8 +509,8 @@ ieee80211_reset_bss(struct ieee80211com static int ieee80211_match_bss(struct ieee80211com *ic, struct ieee80211_node *ni) { - u_int8_t rate; - int fail; + u_int8_t rate; + int fail; fail = 0; if (isclr(ic->ic_chan_active, ieee80211_chan2ieee(ic, ni->ni_chan))) @@ -513,6 +518,7 @@ ieee80211_match_bss(struct ieee80211com if (ic->ic_des_chan != IEEE80211_CHAN_ANYC && ni->ni_chan != ic->ic_des_chan) fail |= 0x01; + if (ic->ic_opmode == IEEE80211_M_IBSS) { if ((ni->ni_capinfo & IEEE80211_CAPINFO_IBSS) == 0) fail |= 0x02; @@ -520,6 +526,7 @@ ieee80211_match_bss(struct ieee80211com if ((ni->ni_capinfo & IEEE80211_CAPINFO_ESS) == 0) fail |= 0x02; } + if (ic->ic_flags & IEEE80211_F_PRIVACY) { if ((ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) == 0) fail |= 0x04; @@ -528,18 +535,23 @@ ieee80211_match_bss(struct ieee80211com if (ni->ni_capinfo & IEEE80211_CAPINFO_PRIVACY) fail |= 0x04; } + rate = ieee80211_fix_rate(ni, IEEE80211_R_DONEGO | IEEE80211_R_DOFRATE); if (rate & IEEE80211_RATE_BASIC) fail |= 0x08; + if (ic->ic_des_esslen != 0 && (ni->ni_esslen != ic->ic_des_esslen || memcmp(ni->ni_essid, ic->ic_des_essid, ic->ic_des_esslen) != 0)) fail |= 0x10; + if ((ic->ic_flags & IEEE80211_F_DESBSSID) && !IEEE80211_ADDR_EQ(ic->ic_des_bssid, ni->ni_bssid)) fail |= 0x20; + if (ni->ni_fails >= STA_FAILS_MAX) fail |= 0x40; + #ifdef IEEE80211_DEBUG if (ieee80211_msg_scan(ic)) { printf(" %c %s", @@ -565,6 +577,7 @@ ieee80211_match_bss(struct ieee80211com printf("%s\n", fail & 0x10 ? "!" : ""); } #endif + return fail; } @@ -584,9 +597,8 @@ maxrate(const struct ieee80211_node *ni) * Used to select the best scan candidate for association in a BSS. */ static int -ieee80211_node_compare(struct ieee80211com *ic, - const struct ieee80211_node *a, - const struct ieee80211_node *b) +ieee80211_node_compare(struct ieee80211com *ic, const struct ieee80211_node *a, + const struct ieee80211_node *b) { u_int8_t maxa, maxb; u_int8_t rssia, rssib; @@ -675,9 +687,10 @@ ieee80211_end_scan(struct ieee80211com * maxrssi[i] = rssi; } IEEE80211_NODE_UNLOCK(nt); + /* XXX select channel more intelligently */ bestchan = -1; - for (i = 0; i < IEEE80211_CHAN_MAX; i++) + for (i = 0; i < IEEE80211_CHAN_MAX; i++) { if (isset(ic->ic_chan_active, i)) { /* * If the channel is unoccupied the max rssi @@ -693,6 +706,7 @@ ieee80211_end_scan(struct ieee80211com * maxrssi[i] < maxrssi[bestchan]) bestchan = i; } + } if (bestchan != -1) { ieee80211_create_ibss(ic, &ic->ic_channels[bestchan]); return; @@ -709,6 +723,7 @@ ieee80211_end_scan(struct ieee80211com * */ if (ic->ic_roaming == IEEE80211_ROAMING_MANUAL) return; + /* * Automatic sequencing; look for a candidate and * if found join the network. @@ -717,13 +732,15 @@ ieee80211_end_scan(struct ieee80211com * if (TAILQ_FIRST(&nt->nt_node) == NULL) { IEEE80211_DPRINTF(ic, IEEE80211_MSG_SCAN, "%s: no scan candidate\n", __func__); - notfound: + +notfound: if (ic->ic_opmode == IEEE80211_M_IBSS && (ic->ic_flags & IEEE80211_F_IBSSON) && ic->ic_des_esslen != 0) { ieee80211_create_ibss(ic, ic->ic_ibss_chan); return; } + /* * Decrement the failure counts so entries will be * reconsidered the next time around. We really want @@ -731,10 +748,12 @@ ieee80211_end_scan(struct ieee80211com * * had some success. */ IEEE80211_NODE_LOCK(nt); - TAILQ_FOREACH(ni, &nt->nt_node, ni_list) + TAILQ_FOREACH(ni, &nt->nt_node, ni_list) { if (ni->ni_fails) ni->ni_fails--; + } IEEE80211_NODE_UNLOCK(nt); + /* * Reset the list of channels to scan and start again. */ @@ -743,9 +762,11 @@ ieee80211_end_scan(struct ieee80211com * ieee80211_next_scan(ic); return; } + selbs = NULL; IEEE80211_DPRINTF(ic, IEEE80211_MSG_SCAN, "\t%s\n", "macaddr bssid chan rssi rate flag wep essid"); + IEEE80211_NODE_LOCK(nt); TAILQ_FOREACH(ni, &nt->nt_node, ni_list) { if (ieee80211_match_bss(ic, ni) == 0) { @@ -756,8 +777,9 @@ ieee80211_end_scan(struct ieee80211com * } } if (selbs != NULL) /* NB: grab ref while dropping lock */ - (void) ieee80211_ref_node(selbs); + (void)ieee80211_ref_node(selbs); IEEE80211_NODE_UNLOCK(nt); + if (selbs == NULL) goto notfound; if (!ieee80211_sta_join(ic, selbs)) { @@ -818,13 +840,15 @@ ieee80211_sta_join(struct ieee80211com * if (ic->ic_opmode == IEEE80211_M_IBSS) { struct ieee80211_node_table *nt; + /* * Delete unusable rates; we've already checked * that the negotiated rate set is acceptable. */ ieee80211_fix_rate(selbs, IEEE80211_R_DODEL); + /* - * Fillin the neighbor table; it will already + * Fill in the neighbor table; it will already * exist if we are simply switching mastership. * XXX ic_sta always setup so this is unnecessary? */ @@ -844,6 +868,7 @@ ieee80211_sta_join(struct ieee80211com * copy_bss(selbs, obss); ieee80211_free_node(obss); } + /* * Set the erp state (mostly the slot time) to deal with * the auto-select case; this should be redundant if the @@ -884,6 +909,7 @@ ieee80211_get_rate(const struct ieee8021 IASSERT(ieee80211_node_refcnt(ni) > 0, ("refcnt(ni) == %d", ieee80211_node_refcnt(ni))); IASSERT(ic != NULL, ("ic != NULL")); + if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) { rs = &ic->ic_sup_rates[ic->ic_curmode]; rate = rs->rs_rates[ic->ic_fixed_rate] & IEEE80211_RATE_VAL; @@ -897,9 +923,9 @@ ieee80211_get_rate(const struct ieee8021 (rate * 5) % 10); goto no_rate; } - } else if (ic->ic_state == IEEE80211_S_RUN) + } else if (ic->ic_state == IEEE80211_S_RUN) { rate = ni->ni_rates.rs_rates[ni->ni_txrate]; - else { + } else { no_rate: rs = &ni->ni_rates; /* Choose node's lowest basic rate, or else its lowest rate. */ @@ -909,6 +935,7 @@ no_rate: } return ni->ni_rates.rs_rates[0] & IEEE80211_RATE_VAL; } + return rate & IEEE80211_RATE_VAL; } @@ -943,6 +970,7 @@ node_cleanup(struct ieee80211_node *ni) "[%s] power save mode off, %u sta's in ps mode\n", ether_sprintf(ni->ni_macaddr), ic->ic_ps_sta); } + /* * Clear AREF flag that marks the authorization refcnt bump * has happened. This is probably not needed as the node @@ -963,6 +991,7 @@ node_cleanup(struct ieee80211_node *ni) free(ni->ni_challenge, M_DEVBUF); ni->ni_challenge = NULL; } + /* * Preserve SSID, WPA, and WME ie's so the bss node is * reusable during a re-auth/re-assoc state transition. @@ -975,11 +1004,13 @@ node_cleanup(struct ieee80211_node *ni) * * XXX does this leave us open to inheriting old state? */ - for (i = 0; i < N(ni->ni_rxfrag); i++) + for (i = 0; i < N(ni->ni_rxfrag); i++) { if (ni->ni_rxfrag[i] != NULL) { m_freem(ni->ni_rxfrag[i]); ni->ni_rxfrag[i] = NULL; } + } + /* * Must be careful here to remove any key map entry w/o a LOR. */ @@ -1105,8 +1136,9 @@ ieee80211_dup_bss(struct ieee80211_node_ IEEE80211_ADDR_COPY(ni->ni_bssid, ic->ic_bss->ni_bssid); ieee80211_set_chan(ic, ni, ic->ic_bss->ni_chan); ni->ni_rsn = ic->ic_bss->ni_rsn; - } else + } else { ic->ic_stats.is_rx_nodealloc++; + } return ni; } @@ -1404,6 +1436,7 @@ ieee80211_find_rxnode(struct ieee80211co nt = &ic->ic_scan; else nt = &ic->ic_sta; + /* XXX check ic_bss first in station mode */ /* XXX 4-address frames? */ IEEE80211_NODE_LOCK(nt); @@ -1441,15 +1474,18 @@ ieee80211_find_rxnode_withkey(struct iee if (ic->ic_opmode == IEEE80211_M_STA || ic->ic_opmode == IEEE80211_M_MONITOR || - (ic->ic_flags & IEEE80211_F_SCAN)) + (ic->ic_flags & IEEE80211_F_SCAN)) { nt = &ic->ic_scan; - else + } else { nt = &ic->ic_sta; + } + IEEE80211_NODE_LOCK(nt); - if (nt->nt_keyixmap != NULL && keyix < nt->nt_keyixmax) + if (nt->nt_keyixmap != NULL && keyix < nt->nt_keyixmax) { ni = nt->nt_keyixmap[keyix]; - else + } else { ni = NULL; + } if (ni == NULL) { if (IS_CTL(wh) && !IS_PSPOLL(wh) /*&& !IS_RTS(ah)*/) ni = _ieee80211_find_node(nt, wh->i_addr1); @@ -1522,7 +1558,7 @@ ieee80211_find_txnode(struct ieee80211co */ ni = ieee80211_fakeup_adhoc_node(nt, macaddr); if (ni != NULL) - (void) ieee80211_ref_node(ni); + (void)ieee80211_ref_node(ni); } else { IEEE80211_DPRINTF(ic, IEEE80211_MSG_OUTPUT, "[%s] no node, discard frame (%s)\n", @@ -1550,6 +1586,7 @@ ieee80211_find_node_with_channel(struct int hash; hash = IEEE80211_NODE_HASH(macaddr); + IEEE80211_NODE_LOCK(nt); LIST_FOREACH(ni, &nt->nt_hash[hash], ni_hash) { if (IEEE80211_ADDR_EQ(ni->ni_macaddr, macaddr) && @@ -1571,6 +1608,7 @@ ieee80211_find_node_with_channel(struct } } IEEE80211_NODE_UNLOCK(nt); + return ni; } @@ -1616,6 +1654,7 @@ ieee80211_refine_node_for_beacon(struct } } IEEE80211_NODE_UNLOCK(nt); + return best; } @@ -1674,7 +1713,9 @@ ieee80211_find_node_with_ssid(struct iee ieee80211_node_refcnt(ni)); #endif } + IEEE80211_NODE_UNLOCK(nt); + return ni; #undef MATCH_SSID } @@ -1712,6 +1753,7 @@ ieee80211_free_node(struct ieee80211_nod "%s (%s:%u) %p<%s> refcnt %d\n", __func__, func, line, ni, ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)-1); #endif + if (nt != NULL) { IEEE80211_NODE_LOCK(nt); if (ieee80211_node_dectestref(ni)) { @@ -1722,6 +1764,7 @@ ieee80211_free_node(struct ieee80211_nod } else if (ieee80211_node_refcnt(ni) == 1 && nt->nt_keyixmap != NULL) { ieee80211_keyix keyix; + /* * Check for a last reference in the key mapping table. */ @@ -2148,6 +2191,7 @@ ieee80211_node_join_11g(struct ieee80211 /* XXX vap's w/ conflicting needs won't work */ ieee80211_set_shortslottime(ic, 0); } + /* * If the new station is not an ERP station * then bump the counter and enable protection @@ -2177,12 +2221,14 @@ ieee80211_node_join_11g(struct ieee80211 ic->ic_flags |= IEEE80211_F_USEBARKER; ic->ic_flags &= ~IEEE80211_F_SHPREAMBLE; } - } else + } else { ni->ni_flags |= IEEE80211_NODE_ERP; + } } void -ieee80211_node_join(struct ieee80211com *ic, struct ieee80211_node *ni, int resp) +ieee80211_node_join(struct ieee80211com *ic, struct ieee80211_node *ni, + int resp) { int newassoc; @@ -2270,6 +2316,7 @@ ieee80211_node_leave_11g(struct ieee8021 } } } + /* * If a non-ERP station do the protection-related bookkeeping. */ @@ -2308,11 +2355,11 @@ ieee80211_node_leave(struct ieee80211com IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC | IEEE80211_MSG_DEBUG, "[%s] station with aid %d leaves\n", ether_sprintf(ni->ni_macaddr), IEEE80211_NODE_AID(ni)); - IASSERT(ic->ic_opmode == IEEE80211_M_HOSTAP || ic->ic_opmode == IEEE80211_M_IBSS || ic->ic_opmode == IEEE80211_M_AHDEMO, ("unexpected operating mode %u", ic->ic_opmode)); + /* * If node wasn't previously associated all * we need to do is reclaim the reference. @@ -2320,6 +2367,7 @@ ieee80211_node_leave(struct ieee80211com /* XXX ibss mode bypasses 11g and notification */ if (ni->ni_associd == 0) goto done; + /* * Tell the authenticator the station is leaving. * Note that we must do this before yanking the @@ -2334,6 +2382,7 @@ ieee80211_node_leave(struct ieee80211com if (ic->ic_curmode == IEEE80211_MODE_11G) ieee80211_node_leave_11g(ic, ni); + /* * Cleanup station state. In particular clear various * state that might otherwise be reused if the node @@ -2341,6 +2390,7 @@ ieee80211_node_leave(struct ieee80211com * (and memory is reclaimed). */ ieee80211_sta_leave(ic, ni); + done: /* * Remove the node from any table it's recorded in and