mirror of https://gitee.com/openkylin/linux.git
ipw2200: expire and use oldest BSS on adhoc create
If there are no networks on the free list, expire the oldest one when creating a new adhoc network. Because ipw2200 and the ieee80211 stack don't actually cull old networks and place them back on the free list unless they are needed for new probe responses, over time the free list would become empty and creating an adhoc network would fail due to the ! list_empty(...) check. Signed-off-by: Dan Williams <dcbw@redhat.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
b212f3378a
commit
a6d4eae801
|
@ -7558,8 +7558,31 @@ static int ipw_associate(void *data)
|
|||
priv->ieee->iw_mode == IW_MODE_ADHOC &&
|
||||
priv->config & CFG_ADHOC_CREATE &&
|
||||
priv->config & CFG_STATIC_ESSID &&
|
||||
priv->config & CFG_STATIC_CHANNEL &&
|
||||
!list_empty(&priv->ieee->network_free_list)) {
|
||||
priv->config & CFG_STATIC_CHANNEL) {
|
||||
/* Use oldest network if the free list is empty */
|
||||
if (list_empty(&priv->ieee->network_free_list)) {
|
||||
struct ieee80211_network *oldest = NULL;
|
||||
struct ieee80211_network *target;
|
||||
DECLARE_MAC_BUF(mac);
|
||||
|
||||
list_for_each_entry(target, &priv->ieee->network_list, list) {
|
||||
if ((oldest == NULL) ||
|
||||
(target->last_scanned < oldest->last_scanned))
|
||||
oldest = target;
|
||||
}
|
||||
|
||||
/* If there are no more slots, expire the oldest */
|
||||
list_del(&oldest->list);
|
||||
target = oldest;
|
||||
IPW_DEBUG_ASSOC("Expired '%s' (%s) from "
|
||||
"network list.\n",
|
||||
escape_essid(target->ssid,
|
||||
target->ssid_len),
|
||||
print_mac(mac, target->bssid));
|
||||
list_add_tail(&target->list,
|
||||
&priv->ieee->network_free_list);
|
||||
}
|
||||
|
||||
element = priv->ieee->network_free_list.next;
|
||||
network = list_entry(element, struct ieee80211_network, list);
|
||||
ipw_adhoc_create(priv, network);
|
||||
|
|
Loading…
Reference in New Issue