diff options
Diffstat (limited to 'net/mac80211/ieee80211_sta.c')
-rw-r--r-- | net/mac80211/ieee80211_sta.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c index 0d99b685df5f..9aee1abae127 100644 --- a/net/mac80211/ieee80211_sta.c +++ b/net/mac80211/ieee80211_sta.c | |||
@@ -773,7 +773,7 @@ static void ieee80211_associated(struct net_device *dev, | |||
773 | "range\n", | 773 | "range\n", |
774 | dev->name, MAC_ARG(ifsta->bssid)); | 774 | dev->name, MAC_ARG(ifsta->bssid)); |
775 | disassoc = 1; | 775 | disassoc = 1; |
776 | sta_info_free(sta, 0); | 776 | sta_info_free(sta); |
777 | ifsta->probereq_poll = 0; | 777 | ifsta->probereq_poll = 0; |
778 | } else { | 778 | } else { |
779 | ieee80211_send_probe_req(dev, ifsta->bssid, | 779 | ieee80211_send_probe_req(dev, ifsta->bssid, |
@@ -1890,7 +1890,7 @@ static int ieee80211_sta_active_ibss(struct net_device *dev) | |||
1890 | int active = 0; | 1890 | int active = 0; |
1891 | struct sta_info *sta; | 1891 | struct sta_info *sta; |
1892 | 1892 | ||
1893 | spin_lock_bh(&local->sta_lock); | 1893 | read_lock_bh(&local->sta_lock); |
1894 | list_for_each_entry(sta, &local->sta_list, list) { | 1894 | list_for_each_entry(sta, &local->sta_list, list) { |
1895 | if (sta->dev == dev && | 1895 | if (sta->dev == dev && |
1896 | time_after(sta->last_rx + IEEE80211_IBSS_MERGE_INTERVAL, | 1896 | time_after(sta->last_rx + IEEE80211_IBSS_MERGE_INTERVAL, |
@@ -1899,7 +1899,7 @@ static int ieee80211_sta_active_ibss(struct net_device *dev) | |||
1899 | break; | 1899 | break; |
1900 | } | 1900 | } |
1901 | } | 1901 | } |
1902 | spin_unlock_bh(&local->sta_lock); | 1902 | read_unlock_bh(&local->sta_lock); |
1903 | 1903 | ||
1904 | return active; | 1904 | return active; |
1905 | } | 1905 | } |
@@ -1909,16 +1909,24 @@ static void ieee80211_sta_expire(struct net_device *dev) | |||
1909 | { | 1909 | { |
1910 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | 1910 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
1911 | struct sta_info *sta, *tmp; | 1911 | struct sta_info *sta, *tmp; |
1912 | LIST_HEAD(tmp_list); | ||
1912 | 1913 | ||
1913 | spin_lock_bh(&local->sta_lock); | 1914 | write_lock_bh(&local->sta_lock); |
1914 | list_for_each_entry_safe(sta, tmp, &local->sta_list, list) | 1915 | list_for_each_entry_safe(sta, tmp, &local->sta_list, list) |
1915 | if (time_after(jiffies, sta->last_rx + | 1916 | if (time_after(jiffies, sta->last_rx + |
1916 | IEEE80211_IBSS_INACTIVITY_LIMIT)) { | 1917 | IEEE80211_IBSS_INACTIVITY_LIMIT)) { |
1917 | printk(KERN_DEBUG "%s: expiring inactive STA " MAC_FMT | 1918 | printk(KERN_DEBUG "%s: expiring inactive STA " MAC_FMT |
1918 | "\n", dev->name, MAC_ARG(sta->addr)); | 1919 | "\n", dev->name, MAC_ARG(sta->addr)); |
1919 | sta_info_free(sta, 1); | 1920 | __sta_info_get(sta); |
1921 | sta_info_remove(sta); | ||
1922 | list_add(&sta->list, &tmp_list); | ||
1920 | } | 1923 | } |
1921 | spin_unlock_bh(&local->sta_lock); | 1924 | write_unlock_bh(&local->sta_lock); |
1925 | |||
1926 | list_for_each_entry_safe(sta, tmp, &tmp_list, list) { | ||
1927 | sta_info_free(sta); | ||
1928 | sta_info_put(sta); | ||
1929 | } | ||
1922 | } | 1930 | } |
1923 | 1931 | ||
1924 | 1932 | ||