freebsd11_wlan: Drain ageq before cleaning it up.

The comment above ieee80211_ageq_cleanup specifically notes that the queue
is assumed to be empty, and in order to make it so, ieee80211_ageq_drain
must be used.

Possibly helps with #3180, as this might be a source of mbuf leakage.
This commit is contained in:
Augustin Cavalier
2018-07-16 20:00:17 -04:00
parent 8959d55643
commit dffc3e2353
@@ -30,13 +30,13 @@ __FBSDID("$FreeBSD: releng/11.1/sys/net80211/ieee80211_node.c 302018 2016-06-19
#include "opt_wlan.h" #include "opt_wlan.h"
#include <sys/param.h> #include <sys/param.h>
#include <sys/systm.h> #include <sys/systm.h>
#include <sys/mbuf.h> #include <sys/mbuf.h>
#include <sys/malloc.h> #include <sys/malloc.h>
#include <sys/kernel.h> #include <sys/kernel.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <net/if.h> #include <net/if.h>
#include <net/if_var.h> #include <net/if_var.h>
#include <net/if_media.h> #include <net/if_media.h>
@@ -134,6 +134,9 @@ ieee80211_node_detach(struct ieee80211com *ic)
callout_drain(&ic->ic_inact); callout_drain(&ic->ic_inact);
ieee80211_node_table_cleanup(&ic->ic_sta); ieee80211_node_table_cleanup(&ic->ic_sta);
#ifdef __HAIKU__
ieee80211_ageq_drain(&ic->ic_stageq);
#endif
ieee80211_ageq_cleanup(&ic->ic_stageq); ieee80211_ageq_cleanup(&ic->ic_stageq);
} }
@@ -199,7 +202,7 @@ ieee80211_node_vdetach(struct ieee80211vap *vap)
} }
} }
/* /*
* Port authorize/unauthorize interfaces for use by an authenticator. * Port authorize/unauthorize interfaces for use by an authenticator.
*/ */
@@ -370,7 +373,7 @@ ieee80211_create_ibss(struct ieee80211vap* vap, struct ieee80211_channel *chan)
memcpy(ni->ni_meshid, vap->iv_mesh->ms_id, ni->ni_meshidlen); memcpy(ni->ni_meshid, vap->iv_mesh->ms_id, ni->ni_meshidlen);
#endif #endif
} }
/* /*
* Fix the channel and related attributes. * Fix the channel and related attributes.
*/ */
/* clear DFS CAC state on previous channel */ /* clear DFS CAC state on previous channel */
@@ -550,7 +553,7 @@ check_bss_debug(struct ieee80211vap *vap, struct ieee80211_node *ni)
printf("%s\n", fail & 0x10 ? "!" : ""); printf("%s\n", fail & 0x10 ? "!" : "");
} }
#endif /* IEEE80211_DEBUG */ #endif /* IEEE80211_DEBUG */
int int
ieee80211_ibss_merge_check(struct ieee80211_node *ni) ieee80211_ibss_merge_check(struct ieee80211_node *ni)
@@ -755,7 +758,7 @@ ieee80211_sta_join1(struct ieee80211_node *selbs)
* Set the erp state (mostly the slot time) to deal with * Set the erp state (mostly the slot time) to deal with
* the auto-select case; this should be redundant if the * the auto-select case; this should be redundant if the
* mode is locked. * mode is locked.
*/ */
ieee80211_reset_erp(ic); ieee80211_reset_erp(ic);
ieee80211_wme_initparams(vap); ieee80211_wme_initparams(vap);
@@ -1461,7 +1464,7 @@ ieee80211_fakeup_adhoc_node(struct ieee80211vap *vap,
/* /*
* In adhoc demo mode there are no management * In adhoc demo mode there are no management
* frames to use to discover neighbor capabilities, * frames to use to discover neighbor capabilities,
* so blindly propagate the local configuration * so blindly propagate the local configuration
* so we can do interesting things (e.g. use * so we can do interesting things (e.g. use
* WME to disable ACK's). * WME to disable ACK's).
*/ */
@@ -2043,7 +2046,7 @@ timeout_stations(void *arg __unused, struct ieee80211_node *ni)
/* XXX before inact decrement? */ /* XXX before inact decrement? */
if (ni == vap->iv_bss) if (ni == vap->iv_bss)
return; return;
if (ni->ni_associd != 0 || if (ni->ni_associd != 0 ||
(vap->iv_opmode == IEEE80211_M_IBSS || (vap->iv_opmode == IEEE80211_M_IBSS ||
vap->iv_opmode == IEEE80211_M_AHDEMO)) { vap->iv_opmode == IEEE80211_M_AHDEMO)) {
/* /*