ath lor
PseudoCylon
moonlightakkiy at yahoo.ca
Tue Jul 31 05:33:28 UTC 2012
On Mon, Jul 30, 2012 at 7:22 PM, Adrian Chadd <adrian.chadd at gmail.com> wrote:
> Yeah, That's what I had in mind.
>
> Trouble is, the AID isn't fixed at that value:
>
> vap->iv_max_aid = IEEE80211_AID_DEF;
>
> So likely we should malloc (M_NOWAIT | M_ZERO) a temporary array of
> size iv_max_aid.
>
> Have you seen the scan/node LORs? Are you able to verify that your
> change fixes that?
>
Not yet. Though, I think we still need to do something with
ieee80211_timeout_stations() and com lock. driver/iterate lock LOR
seems gone. Will post when I find more.
Quick update (I haven't run it, yet). I'll set up a repository soon.
void
ieee80211_iterate_nt(struct node_table *nt, struct ieee80211_node **ni_arr,
u_int *gen)
{
struct ieee80211_node *ni;
int i = 0;
IEEE80211_NODE_ITERATE_LOCK(nt);
*gen = ++nt->nt_scangen;
TAILQ_FOREACH(ni, &nt->nt_node, ni_list)
(*(ni_arr + i++)) = ieee80211_ref_node(ni);
IEEE80211_NODE_ITERATE_UNLOCK(nt);
}
/*
* Just a wrapper, so we don't have to change every ieee80211_iterate_nodes()
* reference in the source.
*
* A caller may directly call ieee80211_iterate_nt() and do customized stuff.
* Only requirement is to decrement each node's ref count.
*/
void
ieee80211_iterate_nodes(struct ieee80211_node_table *nt,
ieee80211_iter_func *f, void *arg)
{
struct ieee80211_node **ni_arr;
unsigned long size;
u_int gen;
int i;
size = ni->ni_vap->iv_max_aid * sizeof(*ni_arr);
ni_arr = (struct ieee80211_node **)malloc(size, M_80211_NODE,
M_NOWAIT | M_ZERO);
if (ni_arr == NULL)
return;
ieee80211_iterate_nt(nt, ni_arr, &gen);
IEEE80211_NODE_LOCK(nt);
for (i = 0; i < IEEE80211_AID_DEF; i++) {
if (ni == NULL) /* end of the list */
break;
if (ni->ni_scangen == gen)
continue;
ni->ni_scangen = gen;
IEEE80211_NODE_UNLOCK(nt);
(*f)(arg, *(ni_arr + i));
/* ieee80211_free_node() locks by itself */
ieee80211_free_node(ni);
IEEE80211_NODE_LOCK(nt);
i = 0;
}
IEEE80211_NODE_UNLOCK(nt);
free(ni_addr, M_80211_NODE);
}
More information about the freebsd-wireless
mailing list