mac80211: Drop DS Channel PARAM in directed probe
authorPaul Stewart <pstew@chromium.org>
Thu, 23 Jun 2011 17:00:11 +0000 (09:00 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 27 Jun 2011 19:09:41 +0000 (15:09 -0400)
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>
net/mac80211/ieee80211_i.h
net/mac80211/mlme.c
net/mac80211/scan.c
net/mac80211/util.c
net/mac80211/work.c

index 090b0ec1e05653c246973a74de8fe4c6057f261e..25c15cc63319a13f304ec809f3fea03d86320e65 100644 (file)
@@ -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,
                                          u8 *dst,
                                          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,
                              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,
                                  const size_t supp_rates_len,
index faca5033f061cd8d125256d7633781cd437b2666..0f6052faeb457c1126875f6fbdc26d5589dbe2ce 100644 (file)
@@ -1204,7 +1204,8 @@ static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata)
                ieee80211_send_nullfunc(sdata->local, sdata, 0);
        } else {
                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++;
@@ -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);
        skb = ieee80211_build_probe_req(sdata, ifmgd->associated->bssid,
-                                       ssid + 2, ssid[1], NULL, 0);
+                                       ssid + 2, ssid[1], NULL, 0, true);
 
        return skb;
 }
index 6403722da6035863e74c55b1440da051c7fe9d77..e5a6ea4a94ea5d830af138aefa78e43e288a6a2d 100644 (file)
@@ -659,7 +659,8 @@ static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
                        sdata, NULL,
                        local->scan_req->ssids[i].ssid,
                        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
index 05e3fb889d772af508153d39c631571b7eebc541..652e5695225ab969b1941eb3743071f8303d7b61 100644 (file)
@@ -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,
                                          u8 *dst,
                                          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 sk_buff *skb;
@@ -1035,8 +1036,16 @@ struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
                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,
                                           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,
                              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;
 
-       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)
                ieee80211_tx_skb(sdata, skb);
 }
index d2e7f0e866772ed0fb3969837d9aab62d27bd755..edf8583280c9a0a39908be10e8e8fb2f81690709 100644 (file)
@@ -450,7 +450,7 @@ ieee80211_direct_probe(struct ieee80211_work *wk)
         * will not answer to direct packet in unassociated state.
         */
        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;
        run_again(local, wk->timeout);