mac80211: IBSS join rework
I hold back this patch for around a week to avoid confusion. This is the second step of "mac80211: Fixed BSSID handling revisited". With it, in the situation of a strange merge to the same BSSID (e.g. caused by a TSF overflow) only reset_tsf() is called. And sta_info_flush_delayed() is only called if you change the network manually, not on an automatic BSSID merge. Signed-off-by: Alina Friedrichsen <x-alina@gmx.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Родитель
f2bffa7ea0
Коммит
c4e3a58448
|
@ -1503,13 +1503,22 @@ static int ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
|||
struct ieee80211_bss *bss)
|
||||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
int res, rates, i, j;
|
||||
int res = 0, rates, i, j;
|
||||
struct sk_buff *skb;
|
||||
struct ieee80211_mgmt *mgmt;
|
||||
u8 *pos;
|
||||
struct ieee80211_supported_band *sband;
|
||||
union iwreq_data wrqu;
|
||||
|
||||
if (local->ops->reset_tsf) {
|
||||
/* Reset own TSF to allow time synchronization work. */
|
||||
local->ops->reset_tsf(local_to_hw(local));
|
||||
}
|
||||
|
||||
if ((ifsta->flags & IEEE80211_STA_PREV_BSSID_SET) &&
|
||||
memcmp(ifsta->bssid, bss->bssid, ETH_ALEN) == 0)
|
||||
return res;
|
||||
|
||||
skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400 +
|
||||
sdata->u.sta.ie_proberesp_len);
|
||||
if (!skb) {
|
||||
|
@ -1520,13 +1529,11 @@ static int ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
|||
|
||||
sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
|
||||
|
||||
/* Remove possible STA entries from other IBSS networks. */
|
||||
sta_info_flush_delayed(sdata);
|
||||
|
||||
if (local->ops->reset_tsf) {
|
||||
/* Reset own TSF to allow time synchronization work. */
|
||||
local->ops->reset_tsf(local_to_hw(local));
|
||||
if (!(ifsta->flags & IEEE80211_STA_PREV_BSSID_SET)) {
|
||||
/* Remove possible STA entries from other IBSS networks. */
|
||||
sta_info_flush_delayed(sdata);
|
||||
}
|
||||
|
||||
memcpy(ifsta->bssid, bss->bssid, ETH_ALEN);
|
||||
res = ieee80211_if_config(sdata, IEEE80211_IFCC_BSSID);
|
||||
if (res)
|
||||
|
|
Загрузка…
Ссылка в новой задаче