wifi: mac80211_hwsim: add support for switch_vif_chanctx callback
authorAditya Kumar Singh <quic_adisi@quicinc.com>
Fri, 16 Feb 2024 14:46:21 +0000 (20:16 +0530)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 21 Feb 2024 14:19:03 +0000 (15:19 +0100)
Currently switch_vif_chanctx mac80211 callback is not supported for
MLO. Add it.

Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
Link: https://msgid.link/20240216144621.514385-3-quic_adisi@quicinc.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/virtual/mac80211_hwsim.c

index 2ea11a86d920a67937b289806b0869231991c913..b55fe320633c74b42618d37be6bc40a951f0c898 100644 (file)
@@ -3215,6 +3215,47 @@ static void mac80211_hwsim_unassign_vif_chanctx(struct ieee80211_hw *hw,
        }
 }
 
+static int mac80211_hwsim_switch_vif_chanctx(struct ieee80211_hw *hw,
+                                            struct ieee80211_vif_chanctx_switch *vifs,
+                                            int n_vifs,
+                                            enum ieee80211_chanctx_switch_mode mode)
+{
+       int i;
+
+       if (n_vifs <= 0)
+               return -EINVAL;
+
+       wiphy_dbg(hw->wiphy,
+                 "switch vif channel context mode: %u\n", mode);
+
+       for (i = 0; i < n_vifs; i++) {
+               hwsim_check_chanctx_magic(vifs[i].old_ctx);
+               wiphy_dbg(hw->wiphy,
+                         "switch vif channel context: %d MHz/width: %d/cfreqs:%d/%d MHz -> %d MHz/width: %d/cfreqs:%d/%d MHz\n",
+                         vifs[i].old_ctx->def.chan->center_freq,
+                         vifs[i].old_ctx->def.width,
+                         vifs[i].old_ctx->def.center_freq1,
+                         vifs[i].old_ctx->def.center_freq2,
+                         vifs[i].new_ctx->def.chan->center_freq,
+                         vifs[i].new_ctx->def.width,
+                         vifs[i].new_ctx->def.center_freq1,
+                         vifs[i].new_ctx->def.center_freq2);
+
+               switch (mode) {
+               case CHANCTX_SWMODE_REASSIGN_VIF:
+                       hwsim_check_chanctx_magic(vifs[i].new_ctx);
+                       break;
+               case CHANCTX_SWMODE_SWAP_CONTEXTS:
+                       hwsim_set_chanctx_magic(vifs[i].new_ctx);
+                       hwsim_clear_chanctx_magic(vifs[i].old_ctx);
+                       break;
+               default:
+                       WARN_ON("Invalid mode");
+               }
+       }
+       return 0;
+}
+
 static const char mac80211_hwsim_gstrings_stats[][ETH_GSTRING_LEN] = {
        "tx_pkts_nic",
        "tx_bytes_nic",
@@ -3940,7 +3981,8 @@ static const struct ieee80211_ops mac80211_hwsim_ops = {
        .remove_chanctx = mac80211_hwsim_remove_chanctx,        \
        .change_chanctx = mac80211_hwsim_change_chanctx,        \
        .assign_vif_chanctx = mac80211_hwsim_assign_vif_chanctx,\
-       .unassign_vif_chanctx = mac80211_hwsim_unassign_vif_chanctx,
+       .unassign_vif_chanctx = mac80211_hwsim_unassign_vif_chanctx, \
+       .switch_vif_chanctx = mac80211_hwsim_switch_vif_chanctx,
 
 static const struct ieee80211_ops mac80211_hwsim_mchan_ops = {
        HWSIM_COMMON_OPS