diff options
author | sam <sam@FreeBSD.org> | 2006-02-08 17:30:31 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2006-02-08 17:30:31 +0000 |
commit | dde9f675ff2ae100cb78e6b111eed8d00d41472d (patch) | |
tree | 684af010d9bb485583c8009e6afc88e15c8b5633 /sys/net80211 | |
parent | ae6d6a4d2dafba1a879b5abde81f26b541b5bd3b (diff) | |
download | FreeBSD-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.c | 18 |
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); } |