View | Details | Raw Unified | Return to bug 170098 | Differences between
and this patch

Collapse All | Expand All

(-)b/ieee80211_node.c (-3 / +19 lines)
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);
(-)b/ieee80211_node.h (-1 / +1 lines)
Lines 438-444 int ieee80211_node_delucastkey(struct ieee80211_node *); Link Here
438
void	ieee80211_node_timeout(void *arg);
438
void	ieee80211_node_timeout(void *arg);
439
439
440
typedef void ieee80211_iter_func(void *, struct ieee80211_node *);
440
typedef void ieee80211_iter_func(void *, struct ieee80211_node *);
441
void	ieee80211_iterate_nt(struct ieee80211_node_table *,
441
int	ieee80211_iterate_nt(struct ieee80211_node_table *,
442
		struct ieee80211_node **, uint16_t);
442
		struct ieee80211_node **, uint16_t);
443
void	ieee80211_iterate_nodes(struct ieee80211_node_table *,
443
void	ieee80211_iterate_nodes(struct ieee80211_node_table *,
444
		ieee80211_iter_func *, void *);
444
		ieee80211_iter_func *, void *);

Return to bug 170098