OSDN Git Service

wifi: mac80211_hwsim: EMA support
authorAloka Dixit <quic_alokad@quicinc.com>
Tue, 6 Dec 2022 00:50:40 +0000 (16:50 -0800)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 22 Mar 2023 12:55:03 +0000 (13:55 +0100)
Add support enhanced multi-BSS advertisements (EMA)
for profile periodicity up to 3 beacons.

Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
Link: https://lore.kernel.org/r/20221206005040.3177-5-quic_alokad@quicinc.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/virtual/mac80211_hwsim.c

index 58ceabb..2aa7b74 100644 (file)
@@ -2125,11 +2125,27 @@ static void mac80211_hwsim_beacon_tx(void *arg, u8 *mac,
        if (vif->mbssid_tx_vif && vif->mbssid_tx_vif != vif)
                return;
 
-       skb = ieee80211_beacon_get(hw, vif, link_id);
-       if (!skb)
-               return;
+       if (vif->bss_conf.ema_ap) {
+               struct ieee80211_ema_beacons *ema;
+               u8 i = 0;
+
+               ema = ieee80211_beacon_get_template_ema_list(hw, vif, link_id);
+               if (!ema || !ema->cnt)
+                       return;
+
+               for (i = 0; i < ema->cnt; i++) {
+                       __mac80211_hwsim_beacon_tx(link_conf, data, hw, vif,
+                                                  ema->bcn[i].skb);
+                       ema->bcn[i].skb = NULL; /* Already freed */
+               }
+               ieee80211_beacon_free_ema_list(ema);
+       } else {
+               skb = ieee80211_beacon_get(hw, vif, link_id);
+               if (!skb)
+                       return;
 
-       __mac80211_hwsim_beacon_tx(link_conf, data, hw, vif, skb);
+               __mac80211_hwsim_beacon_tx(link_conf, data, hw, vif, skb);
+       }
 
        while ((skb = ieee80211_get_buffered_bc(hw, vif)) != NULL) {
                mac80211_hwsim_tx_frame(hw, skb,
@@ -4409,6 +4425,7 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
        }
 
        hw->wiphy->mbssid_max_interfaces = 8;
+       hw->wiphy->ema_max_profile_periodicity = 3;
 
        data->rx_rssi = DEFAULT_RX_RSSI;