summaryrefslogtreecommitdiffstats
path: root/sys/net80211
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2006-02-08 17:30:31 +0000
committersam <sam@FreeBSD.org>2006-02-08 17:30:31 +0000
commitdde9f675ff2ae100cb78e6b111eed8d00d41472d (patch)
tree684af010d9bb485583c8009e6afc88e15c8b5633 /sys/net80211
parentae6d6a4d2dafba1a879b5abde81f26b541b5bd3b (diff)
downloadFreeBSD-src-dde9f675ff2ae100cb78e6b111eed8d00d41472d.zip
FreeBSD-src-dde9f675ff2ae100cb78e6b111eed8d00d41472d.tar.gz
set the mgt frame tx timer before dispatching the frame to the
driver; this closes a race where a response could be processed before the timer was started and cause a RUN->SCAN state change when operating in station mode Reviewed by: avatar, dyoung MFC after: 1 week
Diffstat (limited to 'sys/net80211')
-rw-r--r--sys/net80211/ieee80211_output.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/sys/net80211/ieee80211_output.c b/sys/net80211/ieee80211_output.c
index fa2d529..8059444 100644
--- a/sys/net80211/ieee80211_output.c
+++ b/sys/net80211/ieee80211_output.c
@@ -142,7 +142,7 @@ ieee80211_send_setup(struct ieee80211com *ic,
*/
static int
ieee80211_mgmt_output(struct ieee80211com *ic, struct ieee80211_node *ni,
- struct mbuf *m, int type)
+ struct mbuf *m, int type, int timer)
{
struct ifnet *ifp = ic->ic_ifp;
struct ieee80211_frame *wh;
@@ -192,7 +192,13 @@ ieee80211_mgmt_output(struct ieee80211com *ic, struct ieee80211_node *ni,
#endif
IEEE80211_NODE_STAT(ni, tx_mgmt);
IF_ENQUEUE(&ic->ic_mgtq, m);
- ifp->if_timer = 1;
+ if (timer) {
+ /*
+ * Set the mgt frame timeout.
+ */
+ ic->ic_mgt_timer = timer;
+ ifp->if_timer = 1;
+ }
if_start(ifp);
return 0;
}
@@ -1366,12 +1372,8 @@ ieee80211_send_mgmt(struct ieee80211com *ic, struct ieee80211_node *ni,
senderr(EINVAL, is_tx_unknownmgt);
/* NOTREACHED */
}
-
- ret = ieee80211_mgmt_output(ic, ni, m, type);
- if (ret == 0) {
- if (timer)
- ic->ic_mgt_timer = timer;
- } else {
+ ret = ieee80211_mgmt_output(ic, ni, m, type, timer);
+ if (ret != 0) {
bad:
ieee80211_free_node(ni);
}
OpenPOWER on IntegriCloud