diff options
author | sam <sam@FreeBSD.org> | 2008-10-26 00:48:20 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2008-10-26 00:48:20 +0000 |
commit | 8e7745ccc63630c2e78ef7e5119d070d1f50a8f2 (patch) | |
tree | c942e4b5b616a67f4838394d9fcb5e198a05d8ca /sys/net80211/ieee80211_output.c | |
parent | 1a02c34468f1d2b73d9595b5d3a6269813d8fca8 (diff) | |
download | FreeBSD-src-8e7745ccc63630c2e78ef7e5119d070d1f50a8f2.zip FreeBSD-src-8e7745ccc63630c2e78ef7e5119d070d1f50a8f2.tar.gz |
change ieee80211_send_probereq to supply raw xmit parameters so it can
control how frames are handled by the driver
Diffstat (limited to 'sys/net80211/ieee80211_output.c')
-rw-r--r-- | sys/net80211/ieee80211_output.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/sys/net80211/ieee80211_output.c b/sys/net80211/ieee80211_output.c index f5561de..3b46d0b 100644 --- a/sys/net80211/ieee80211_output.c +++ b/sys/net80211/ieee80211_output.c @@ -1688,6 +1688,8 @@ ieee80211_send_probereq(struct ieee80211_node *ni, { struct ieee80211vap *vap = ni->ni_vap; struct ieee80211com *ic = ni->ni_ic; + const struct ieee80211_txparam *tp; + struct ieee80211_bpf_params params; struct ieee80211_frame *wh; const struct ieee80211_rateset *rs; struct mbuf *m; @@ -1755,9 +1757,14 @@ ieee80211_send_probereq(struct ieee80211_node *ni, frm = add_appie(frm, vap->iv_appie_probereq); m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); + KASSERT(M_LEADINGSPACE(m) >= sizeof(struct ieee80211_frame), + ("leading space %zd", M_LEADINGSPACE(m))); M_PREPEND(m, sizeof(struct ieee80211_frame), M_DONTWAIT); - if (m == NULL) + if (m == NULL) { + /* NB: cannot happen */ + ieee80211_free_node(ni); return ENOMEM; + } wh = mtod(m, struct ieee80211_frame *); ieee80211_send_setup(ni, wh, @@ -1775,7 +1782,17 @@ ieee80211_send_probereq(struct ieee80211_node *ni, ieee80211_chan2ieee(ic, ic->ic_curchan), ether_sprintf(bssid), ssidlen, ssid); - return ic->ic_raw_xmit(ni, m, NULL); + memset(¶ms, 0, sizeof(params)); + params.ibp_pri = M_WME_GETAC(m); + tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)]; + params.ibp_rate0 = tp->mgmtrate; + if (IEEE80211_IS_MULTICAST(da)) { + params.ibp_flags |= IEEE80211_BPF_NOACK; + params.ibp_try0 = 1; + } else + params.ibp_try0 = tp->maxretry; + params.ibp_power = ni->ni_txpower; + return ic->ic_raw_xmit(ni, m, ¶ms); } /* |