|
@@ -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)
|