Skip to content

Commit

Permalink
mac80211: clear ifmgd->bssid only after building DELBA
Browse files Browse the repository at this point in the history
ieee80211_set_disassoc() clears ifmgd->bssid before
building DELBA frames, resulting in frames with invalid
bssid ("00:00:00:00:00:00").

Fix it by clearing ifmgd->bssid only after building
all the needed frames.

After this change, we no longer need to save the
bssid (before clearing it), so remove the local array.

Reported-by: Ido Yariv <[email protected]>
Cc: [email protected]
Signed-off-by: Eliad Peller <[email protected]>
Signed-off-by: Johannes Berg <[email protected]>
  • Loading branch information
elp authored and jmberg-intel committed Jun 21, 2012
1 parent 79543d8 commit 88a9e31
Showing 1 changed file with 6 additions and 7 deletions.
13 changes: 6 additions & 7 deletions net/mac80211/mlme.c
Original file line number Diff line number Diff line change
Expand Up @@ -1342,7 +1342,6 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
struct ieee80211_local *local = sdata->local;
struct sta_info *sta;
u32 changed = 0;
u8 bssid[ETH_ALEN];

ASSERT_MGD_MTX(ifmgd);

Expand All @@ -1354,10 +1353,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,

ieee80211_stop_poll(sdata);

memcpy(bssid, ifmgd->associated->bssid, ETH_ALEN);

ifmgd->associated = NULL;
memset(ifmgd->bssid, 0, ETH_ALEN);

/*
* we need to commit the associated = NULL change because the
Expand All @@ -1377,7 +1373,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
netif_carrier_off(sdata->dev);

mutex_lock(&local->sta_mtx);
sta = sta_info_get(sdata, bssid);
sta = sta_info_get(sdata, ifmgd->bssid);
if (sta) {
set_sta_flag(sta, WLAN_STA_BLOCK_BA);
ieee80211_sta_tear_down_BA_sessions(sta, tx);
Expand All @@ -1386,13 +1382,16 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,

/* deauthenticate/disassociate now */
if (tx || frame_buf)
ieee80211_send_deauth_disassoc(sdata, bssid, stype, reason,
tx, frame_buf);
ieee80211_send_deauth_disassoc(sdata, ifmgd->bssid, stype,
reason, tx, frame_buf);

/* flush out frame */
if (tx)
drv_flush(local, false);

/* clear bssid only after building the needed mgmt frames */
memset(ifmgd->bssid, 0, ETH_ALEN);

/* remove AP and TDLS peers */
sta_info_flush(local, sdata);

Expand Down

0 comments on commit 88a9e31

Please sign in to comment.