]> err.no Git - linux-2.6/blobdiff - net/mac80211/mlme.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[linux-2.6] / net / mac80211 / mlme.c
index 591e6331c42704503bd930ef5c9c4437d8163fda..e1d11c9b6729e0145866ab9df120ada75601fda1 100644 (file)
@@ -774,7 +774,8 @@ static void ieee80211_send_assoc(struct net_device *dev,
                mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
                                                   IEEE80211_STYPE_REASSOC_REQ);
                mgmt->u.reassoc_req.capab_info = cpu_to_le16(capab);
-               mgmt->u.reassoc_req.listen_interval = cpu_to_le16(1);
+               mgmt->u.reassoc_req.listen_interval =
+                               cpu_to_le16(local->hw.conf.listen_interval);
                memcpy(mgmt->u.reassoc_req.current_ap, ifsta->prev_bssid,
                       ETH_ALEN);
        } else {
@@ -782,7 +783,8 @@ static void ieee80211_send_assoc(struct net_device *dev,
                mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
                                                   IEEE80211_STYPE_ASSOC_REQ);
                mgmt->u.assoc_req.capab_info = cpu_to_le16(capab);
-               mgmt->u.assoc_req.listen_interval = cpu_to_le16(1);
+               mgmt->u.reassoc_req.listen_interval =
+                               cpu_to_le16(local->hw.conf.listen_interval);
        }
 
        /* SSID */
@@ -3661,11 +3663,21 @@ static int ieee80211_sta_find_ibss(struct net_device *dev,
                       "%s\n", print_mac(mac, bssid),
                       print_mac(mac2, ifsta->bssid));
 #endif /* CONFIG_MAC80211_IBSS_DEBUG */
-       if (found && memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0 &&
-           (bss = ieee80211_rx_bss_get(dev, bssid,
-                                       local->hw.conf.channel->center_freq,
-                                       ifsta->ssid, ifsta->ssid_len))) {
+
+       if (found && memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0) {
                int ret;
+               int search_freq;
+
+               if (ifsta->flags & IEEE80211_STA_AUTO_CHANNEL_SEL)
+                       search_freq = bss->freq;
+               else
+                       search_freq = local->hw.conf.channel->center_freq;
+
+               bss = ieee80211_rx_bss_get(dev, bssid, search_freq,
+                                          ifsta->ssid, ifsta->ssid_len);
+               if (!bss)
+                       goto dont_join;
+
                printk(KERN_DEBUG "%s: Selected IBSS BSSID %s"
                       " based on configured SSID\n",
                       dev->name, print_mac(mac, bssid));
@@ -3673,6 +3685,8 @@ static int ieee80211_sta_find_ibss(struct net_device *dev,
                ieee80211_rx_bss_put(local, bss);
                return ret;
        }
+
+dont_join:
 #ifdef CONFIG_MAC80211_IBSS_DEBUG
        printk(KERN_DEBUG "   did not try to join ibss\n");
 #endif /* CONFIG_MAC80211_IBSS_DEBUG */
@@ -3906,7 +3920,7 @@ done:
        if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS) {
                struct ieee80211_if_sta *ifsta = &sdata->u.sta;
                if (!(ifsta->flags & IEEE80211_STA_BSSID_SET) ||
-                   (!ifsta->state == IEEE80211_IBSS_JOINED &&
+                   (!(ifsta->state == IEEE80211_IBSS_JOINED) &&
                    !ieee80211_sta_active_ibss(dev)))
                        ieee80211_sta_find_ibss(dev, ifsta);
        }