Lines 2160-2177
ieee80211_node_timeout(void *arg)
Link Here
|
2160 |
* May directly be called and do customized iterate functions. |
2160 |
* May directly be called and do customized iterate functions. |
2161 |
* Only requirement is to decrement each node's ref count. |
2161 |
* Only requirement is to decrement each node's ref count. |
2162 |
*/ |
2162 |
*/ |
2163 |
void |
2163 |
int |
2164 |
ieee80211_iterate_nt(struct ieee80211_node_table *nt, |
2164 |
ieee80211_iterate_nt(struct ieee80211_node_table *nt, |
2165 |
struct ieee80211_node **ni_arr, uint16_t max_aid) |
2165 |
struct ieee80211_node **ni_arr, uint16_t max_aid) |
2166 |
{ |
2166 |
{ |
2167 |
struct ieee80211_node *ni; |
2167 |
struct ieee80211_node *ni; |
2168 |
u_int gen; |
2168 |
u_int gen; |
2169 |
int i = 0; |
2169 |
int i, ret; |
2170 |
|
2170 |
|
2171 |
IEEE80211_NODE_ITERATE_LOCK(nt); |
2171 |
IEEE80211_NODE_ITERATE_LOCK(nt); |
2172 |
IEEE80211_NODE_LOCK(nt); |
2172 |
IEEE80211_NODE_LOCK(nt); |
2173 |
|
2173 |
|
2174 |
gen = ++nt->nt_scangen; |
2174 |
gen = ++nt->nt_scangen; |
|
|
2175 |
i = ret = 0; |
2175 |
|
2176 |
|
2176 |
restart: |
2177 |
restart: |
2177 |
TAILQ_FOREACH(ni, &nt->nt_node, ni_list) { |
2178 |
TAILQ_FOREACH(ni, &nt->nt_node, ni_list) { |
Lines 2179-2184
restart:
Link Here
|
2179 |
continue; |
2180 |
continue; |
2180 |
|
2181 |
|
2181 |
if (i >= max_aid) { |
2182 |
if (i >= max_aid) { |
|
|
2183 |
ret = E2BIG; |
2182 |
if_printf(nt->nt_ic->ic_ifp, |
2184 |
if_printf(nt->nt_ic->ic_ifp, |
2183 |
"Node array overflow: max=%u", max_aid); |
2185 |
"Node array overflow: max=%u", max_aid); |
2184 |
break; |
2186 |
break; |
Lines 2189-2196
restart:
Link Here
|
2189 |
goto restart; |
2191 |
goto restart; |
2190 |
} |
2192 |
} |
2191 |
|
2193 |
|
|
|
2194 |
if (ret) { |
2195 |
nt->nt_scangen--; |
2196 |
for (i = 0; i < max_aid; i++) { |
2197 |
ni = *(ni_arr + i); |
2198 |
ni->ni_scangen--; |
2199 |
/* node lock is recursive */ |
2200 |
ieee80211_free_node(ni); |
2201 |
} |
2202 |
free(ni_arr, M_80211_NODE); |
2203 |
} |
2204 |
|
2192 |
IEEE80211_NODE_UNLOCK(nt); |
2205 |
IEEE80211_NODE_UNLOCK(nt); |
2193 |
IEEE80211_NODE_ITERATE_UNLOCK(nt); |
2206 |
IEEE80211_NODE_ITERATE_UNLOCK(nt); |
|
|
2207 |
|
2208 |
return (ret); |
2194 |
} |
2209 |
} |
2195 |
|
2210 |
|
2196 |
/* |
2211 |
/* |
Lines 2214-2220
ieee80211_iterate_nodes(struct ieee80211_node_table *nt,
Link Here
|
2214 |
if (ni_arr == NULL) |
2229 |
if (ni_arr == NULL) |
2215 |
return; |
2230 |
return; |
2216 |
|
2231 |
|
2217 |
ieee80211_iterate_nt(nt, ni_arr, max_aid); |
2232 |
if (!ieee80211_iterate_nt(nt, ni_arr, max_aid)) |
|
|
2233 |
return; |
2218 |
|
2234 |
|
2219 |
for (i = 0; i < max_aid; i++) { |
2235 |
for (i = 0; i < max_aid; i++) { |
2220 |
ni = *(ni_arr + i); |
2236 |
ni = *(ni_arr + i); |