Commit 0bb861e6 authored by Jouni Malinen's avatar Jouni Malinen Committed by Johannes Berg
Browse files

mac80211_hwsim: Fix tracking of beaconing for multi-vif



mac80211_hwsim canceled beacon_timer on any vif changing from enabled
to disabled beaconing. This breaks cases where there are multiple
beaconing vifs and only one of them is removed. Fix this by tracking
beaconing status per vif and disable beacon_timer only if no active vif
remain with beaconing enabled.
Signed-off-by: default avatarJouni Malinen <jouni@qca.qualcomm.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 0951ebb8
...@@ -167,6 +167,7 @@ struct hwsim_vif_priv { ...@@ -167,6 +167,7 @@ struct hwsim_vif_priv {
u32 magic; u32 magic;
u8 bssid[ETH_ALEN]; u8 bssid[ETH_ALEN];
bool assoc; bool assoc;
bool bcn_en;
u16 aid; u16 aid;
}; };
...@@ -1170,6 +1171,16 @@ static void mac80211_hwsim_configure_filter(struct ieee80211_hw *hw, ...@@ -1170,6 +1171,16 @@ static void mac80211_hwsim_configure_filter(struct ieee80211_hw *hw,
*total_flags = data->rx_filter; *total_flags = data->rx_filter;
} }
static void mac80211_hwsim_bcn_en_iter(void *data, u8 *mac,
struct ieee80211_vif *vif)
{
unsigned int *count = data;
struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
if (vp->bcn_en)
(*count)++;
}
static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw, static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_bss_conf *info, struct ieee80211_bss_conf *info,
...@@ -1180,7 +1191,8 @@ static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw, ...@@ -1180,7 +1191,8 @@ static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw,
hwsim_check_magic(vif); hwsim_check_magic(vif);
wiphy_debug(hw->wiphy, "%s(changed=0x%x)\n", __func__, changed); wiphy_debug(hw->wiphy, "%s(changed=0x%x vif->addr=%pM)\n",
__func__, changed, vif->addr);
if (changed & BSS_CHANGED_BSSID) { if (changed & BSS_CHANGED_BSSID) {
wiphy_debug(hw->wiphy, "%s: BSSID changed: %pM\n", wiphy_debug(hw->wiphy, "%s: BSSID changed: %pM\n",
...@@ -1202,6 +1214,7 @@ static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw, ...@@ -1202,6 +1214,7 @@ static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw,
if (changed & BSS_CHANGED_BEACON_ENABLED) { if (changed & BSS_CHANGED_BEACON_ENABLED) {
wiphy_debug(hw->wiphy, " BCN EN: %d\n", info->enable_beacon); wiphy_debug(hw->wiphy, " BCN EN: %d\n", info->enable_beacon);
vp->bcn_en = info->enable_beacon;
if (data->started && if (data->started &&
!hrtimer_is_queued(&data->beacon_timer.timer) && !hrtimer_is_queued(&data->beacon_timer.timer) &&
info->enable_beacon) { info->enable_beacon) {
...@@ -1215,8 +1228,16 @@ static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw, ...@@ -1215,8 +1228,16 @@ static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw,
tasklet_hrtimer_start(&data->beacon_timer, tasklet_hrtimer_start(&data->beacon_timer,
ns_to_ktime(until_tbtt * 1000), ns_to_ktime(until_tbtt * 1000),
HRTIMER_MODE_REL); HRTIMER_MODE_REL);
} else if (!info->enable_beacon) } else if (!info->enable_beacon) {
tasklet_hrtimer_cancel(&data->beacon_timer); unsigned int count = 0;
ieee80211_iterate_active_interfaces(
data->hw, IEEE80211_IFACE_ITER_NORMAL,
mac80211_hwsim_bcn_en_iter, &count);
wiphy_debug(hw->wiphy, " beaconing vifs remaining: %u",
count);
if (count == 0)
tasklet_hrtimer_cancel(&data->beacon_timer);
}
} }
if (changed & BSS_CHANGED_ERP_CTS_PROT) { if (changed & BSS_CHANGED_ERP_CTS_PROT) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment