[PATCH] softmac: fix SIOCSIWAP
There are some bugs in the current implementation of the SIOCSIWAP wext, for example that when you do it twice and it fails, it may still try another access point for some reason. This patch fixes this by introducing a new flag that tells the association code that the bssid that is in use was fixed by the user and shouldn't be deviated from. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
dac322e39a
commit
818667f7c4
@ -144,6 +144,12 @@ network_matches_request(struct ieee80211softmac_device *mac, struct ieee80211_ne
|
||||
if (!we_support_all_basic_rates(mac, net->rates_ex, net->rates_ex_len))
|
||||
return 0;
|
||||
|
||||
/* assume that users know what they're doing ...
|
||||
* (note we don't let them select a net we're incompatible with) */
|
||||
if (mac->associnfo.bssfixed) {
|
||||
return !memcmp(mac->associnfo.bssid, net->bssid, ETH_ALEN);
|
||||
}
|
||||
|
||||
/* if 'ANY' network requested, take any that doesn't have privacy enabled */
|
||||
if (mac->associnfo.req_essid.len == 0
|
||||
&& !(net->capability & WLAN_CAPABILITY_PRIVACY))
|
||||
@ -176,7 +182,7 @@ ieee80211softmac_assoc_work(void *d)
|
||||
ieee80211softmac_disassoc(mac, WLAN_REASON_DISASSOC_STA_HAS_LEFT);
|
||||
|
||||
/* try to find the requested network in our list, if we found one already */
|
||||
if (mac->associnfo.bssvalid)
|
||||
if (mac->associnfo.bssvalid || mac->associnfo.bssfixed)
|
||||
found = ieee80211softmac_get_network_by_bssid(mac, mac->associnfo.bssid);
|
||||
|
||||
/* Search the ieee80211 networks for this network if we didn't find it by bssid,
|
||||
@ -241,19 +247,25 @@ ieee80211softmac_assoc_work(void *d)
|
||||
if (ieee80211softmac_start_scan(mac))
|
||||
dprintk(KERN_INFO PFX "Associate: failed to initiate scan. Is device up?\n");
|
||||
return;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
spin_lock_irqsave(&mac->lock, flags);
|
||||
mac->associnfo.associating = 0;
|
||||
mac->associated = 0;
|
||||
spin_unlock_irqrestore(&mac->lock, flags);
|
||||
|
||||
dprintk(KERN_INFO PFX "Unable to find matching network after scan!\n");
|
||||
/* reset the retry counter for the next user request since we
|
||||
* break out and don't reschedule ourselves after this point. */
|
||||
mac->associnfo.scan_retry = IEEE80211SOFTMAC_ASSOC_SCAN_RETRY_LIMIT;
|
||||
ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_NET_NOT_FOUND, NULL);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* reset the retry counter for the next user request since we
|
||||
* now found a net and will try to associate to it, but not
|
||||
* schedule this function again. */
|
||||
mac->associnfo.scan_retry = IEEE80211SOFTMAC_ASSOC_SCAN_RETRY_LIMIT;
|
||||
mac->associnfo.bssvalid = 1;
|
||||
memcpy(mac->associnfo.bssid, found->bssid, ETH_ALEN);
|
||||
/* copy the ESSID for displaying it */
|
||||
|
Reference in New Issue
Block a user