diff options
author | sam <sam@FreeBSD.org> | 2009-02-10 23:51:18 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2009-02-10 23:51:18 +0000 |
commit | 78cd28584afadc83e4e9628681ed6a423a265706 (patch) | |
tree | 76acc6d9f700b27fa41ed3c005c2d6da57c301f5 /sys/net80211 | |
parent | 7388d289a61c941999536b26990623faa452a0ae (diff) | |
download | FreeBSD-src-78cd28584afadc83e4e9628681ed6a423a265706.zip FreeBSD-src-78cd28584afadc83e4e9628681ed6a423a265706.tar.gz |
clean neighbor entries on beacon miss
Diffstat (limited to 'sys/net80211')
-rw-r--r-- | sys/net80211/ieee80211_adhoc.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/sys/net80211/ieee80211_adhoc.c b/sys/net80211/ieee80211_adhoc.c index 7e64964..e72aef1 100644 --- a/sys/net80211/ieee80211_adhoc.c +++ b/sys/net80211/ieee80211_adhoc.c @@ -110,6 +110,15 @@ adhoc_vattach(struct ieee80211vap *vap) #endif } +static void +sta_leave(void *arg, struct ieee80211_node *ni) +{ + struct ieee80211vap *vap = arg; + + if (ni->ni_vap == vap && ni != vap->iv_bss) + ieee80211_node_leave(ni); +} + /* * IEEE80211_M_IBSS+IEEE80211_M_AHDEMO vap state machine handler. */ @@ -146,8 +155,11 @@ adhoc_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) break; case IEEE80211_S_SCAN: switch (ostate) { - case IEEE80211_S_INIT: case IEEE80211_S_RUN: /* beacon miss */ + /* purge station table; entries are stale */ + ieee80211_iterate_nodes(&ic->ic_sta, sta_leave, vap); + /* fall thru... */ + case IEEE80211_S_INIT: if (vap->iv_des_chan != IEEE80211_CHAN_ANYC && !IEEE80211_IS_CHAN_RADAR(vap->iv_des_chan)) { /* |