mac80211: Drop DS Channel PARAM in directed probe
Do not send DS Channel parameter for directed probe requests in order to maximize the chance that we get a response. Some badly-behaved APs don't respond when this parameter is included. Signed-off-by: Paul Stewart <pstew@chromium.org> Reviewed-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Родитель
ce2dd3c2d5
Коммит
a806c558e0
|
@ -1350,10 +1350,12 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
|
||||||
struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
|
struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
|
||||||
u8 *dst,
|
u8 *dst,
|
||||||
const u8 *ssid, size_t ssid_len,
|
const u8 *ssid, size_t ssid_len,
|
||||||
const u8 *ie, size_t ie_len);
|
const u8 *ie, size_t ie_len,
|
||||||
|
bool directed);
|
||||||
void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
|
void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
|
||||||
const u8 *ssid, size_t ssid_len,
|
const u8 *ssid, size_t ssid_len,
|
||||||
const u8 *ie, size_t ie_len);
|
const u8 *ie, size_t ie_len,
|
||||||
|
bool directed);
|
||||||
|
|
||||||
void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata,
|
void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata,
|
||||||
const size_t supp_rates_len,
|
const size_t supp_rates_len,
|
||||||
|
|
|
@ -1204,7 +1204,8 @@ static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata)
|
||||||
ieee80211_send_nullfunc(sdata->local, sdata, 0);
|
ieee80211_send_nullfunc(sdata->local, sdata, 0);
|
||||||
} else {
|
} else {
|
||||||
ssid = ieee80211_bss_get_ie(ifmgd->associated, WLAN_EID_SSID);
|
ssid = ieee80211_bss_get_ie(ifmgd->associated, WLAN_EID_SSID);
|
||||||
ieee80211_send_probe_req(sdata, dst, ssid + 2, ssid[1], NULL, 0);
|
ieee80211_send_probe_req(sdata, dst, ssid + 2, ssid[1], NULL, 0,
|
||||||
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
ifmgd->probe_send_count++;
|
ifmgd->probe_send_count++;
|
||||||
|
@ -1289,7 +1290,7 @@ struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw,
|
||||||
|
|
||||||
ssid = ieee80211_bss_get_ie(ifmgd->associated, WLAN_EID_SSID);
|
ssid = ieee80211_bss_get_ie(ifmgd->associated, WLAN_EID_SSID);
|
||||||
skb = ieee80211_build_probe_req(sdata, ifmgd->associated->bssid,
|
skb = ieee80211_build_probe_req(sdata, ifmgd->associated->bssid,
|
||||||
ssid + 2, ssid[1], NULL, 0);
|
ssid + 2, ssid[1], NULL, 0, true);
|
||||||
|
|
||||||
return skb;
|
return skb;
|
||||||
}
|
}
|
||||||
|
|
|
@ -659,7 +659,8 @@ static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
|
||||||
sdata, NULL,
|
sdata, NULL,
|
||||||
local->scan_req->ssids[i].ssid,
|
local->scan_req->ssids[i].ssid,
|
||||||
local->scan_req->ssids[i].ssid_len,
|
local->scan_req->ssids[i].ssid_len,
|
||||||
local->scan_req->ie, local->scan_req->ie_len);
|
local->scan_req->ie, local->scan_req->ie_len,
|
||||||
|
false);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* After sending probe requests, wait for probe responses
|
* After sending probe requests, wait for probe responses
|
||||||
|
|
|
@ -1018,7 +1018,8 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
|
||||||
struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
|
struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
|
||||||
u8 *dst,
|
u8 *dst,
|
||||||
const u8 *ssid, size_t ssid_len,
|
const u8 *ssid, size_t ssid_len,
|
||||||
const u8 *ie, size_t ie_len)
|
const u8 *ie, size_t ie_len,
|
||||||
|
bool directed)
|
||||||
{
|
{
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
@ -1035,8 +1036,16 @@ struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
chan = ieee80211_frequency_to_channel(
|
/*
|
||||||
local->hw.conf.channel->center_freq);
|
* Do not send DS Channel parameter for directed probe requests
|
||||||
|
* in order to maximize the chance that we get a response. Some
|
||||||
|
* badly-behaved APs don't respond when this parameter is included.
|
||||||
|
*/
|
||||||
|
if (directed)
|
||||||
|
chan = 0;
|
||||||
|
else
|
||||||
|
chan = ieee80211_frequency_to_channel(
|
||||||
|
local->hw.conf.channel->center_freq);
|
||||||
|
|
||||||
buf_len = ieee80211_build_preq_ies(local, buf, ie, ie_len,
|
buf_len = ieee80211_build_preq_ies(local, buf, ie, ie_len,
|
||||||
local->hw.conf.channel->band,
|
local->hw.conf.channel->band,
|
||||||
|
@ -1062,11 +1071,13 @@ struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
|
void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
|
||||||
const u8 *ssid, size_t ssid_len,
|
const u8 *ssid, size_t ssid_len,
|
||||||
const u8 *ie, size_t ie_len)
|
const u8 *ie, size_t ie_len,
|
||||||
|
bool directed)
|
||||||
{
|
{
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
|
||||||
skb = ieee80211_build_probe_req(sdata, dst, ssid, ssid_len, ie, ie_len);
|
skb = ieee80211_build_probe_req(sdata, dst, ssid, ssid_len, ie, ie_len,
|
||||||
|
directed);
|
||||||
if (skb)
|
if (skb)
|
||||||
ieee80211_tx_skb(sdata, skb);
|
ieee80211_tx_skb(sdata, skb);
|
||||||
}
|
}
|
||||||
|
|
|
@ -450,7 +450,7 @@ ieee80211_direct_probe(struct ieee80211_work *wk)
|
||||||
* will not answer to direct packet in unassociated state.
|
* will not answer to direct packet in unassociated state.
|
||||||
*/
|
*/
|
||||||
ieee80211_send_probe_req(sdata, NULL, wk->probe_auth.ssid,
|
ieee80211_send_probe_req(sdata, NULL, wk->probe_auth.ssid,
|
||||||
wk->probe_auth.ssid_len, NULL, 0);
|
wk->probe_auth.ssid_len, NULL, 0, true);
|
||||||
|
|
||||||
wk->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;
|
wk->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;
|
||||||
run_again(local, wk->timeout);
|
run_again(local, wk->timeout);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче