* [PATCH v4 0/3] wifi: MBSSID support in MLO
@ 2025-03-10 20:02 Aloka Dixit
2025-03-10 20:02 ` [PATCH v4 1/3] wifi: nl80211: add link id of transmitted profile for MLO MBSSID Aloka Dixit
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Aloka Dixit @ 2025-03-10 20:02 UTC (permalink / raw)
To: linux-wireless, ath12k, ath11k; +Cc: Aloka Dixit
During non-transmitted (nontx) profile configuration, interface
index of the transmitted (tx) profile is used to retrieve the
wireless device (wdev) associated with it. With MLO, this 'wdev'
may be part of an MLD with more than one link, hence only
interface index is not sufficient anymore to retrieve the correct
tx profile. Add a new attribute to configure link id of tx profile.
Similarly, storing 'vif' of tx profile inside 'vif' for nontx
profiles is not sufficient for MLO, instead store tx link data
inside each nontx link data structure.
v4:
(1) Pre-requisite driver patches are merged in wireless-next
hence this series should apply cleanly now.
(2) Refactored possible driver changes into a separate patch.
(3) Found a change missed in HWSIM causing compilation errors,
replaced mbssid_tx_bss by tx_bss_conf and confirmed
successful compilation.
(4) Replaced vif->bss_conf->ema_ap by link_conf->ema_ap.
Aloka Dixit (1):
wifi: ath12k: pass link_conf for tx_arvif retrieval
Rameshkumar Sundaram (2):
wifi: nl80211: add link id of transmitted profile for MLO MBSSID
wifi: mac80211: restructure tx profile retrieval for MLO MBSSID
drivers/net/wireless/ath/ath11k/mac.c | 10 ++-
drivers/net/wireless/ath/ath12k/mac.c | 35 ++++++---
drivers/net/wireless/virtual/mac80211_hwsim.c | 7 +-
include/net/cfg80211.h | 2 +
include/net/mac80211.h | 7 +-
include/uapi/linux/nl80211.h | 6 ++
net/mac80211/cfg.c | 64 ++++++++++------
net/mac80211/ieee80211_i.h | 2 +
net/mac80211/iface.c | 73 +++++++++++++------
net/wireless/nl80211.c | 14 ++++
10 files changed, 158 insertions(+), 62 deletions(-)
base-commit: fc56639937ce95a73c9876e39f8d18d1a8dd6a95
--
2.34.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v4 1/3] wifi: nl80211: add link id of transmitted profile for MLO MBSSID
2025-03-10 20:02 [PATCH v4 0/3] wifi: MBSSID support in MLO Aloka Dixit
@ 2025-03-10 20:02 ` Aloka Dixit
2025-03-12 8:55 ` Johannes Berg
2025-03-10 20:02 ` [PATCH v4 2/3] wifi: mac80211: restructure tx profile retrieval " Aloka Dixit
2025-03-10 20:02 ` [PATCH v4 3/3] wifi: ath12k: pass link_conf for tx_arvif retrieval Aloka Dixit
2 siblings, 1 reply; 11+ messages in thread
From: Aloka Dixit @ 2025-03-10 20:02 UTC (permalink / raw)
To: linux-wireless, ath12k, ath11k
Cc: Rameshkumar Sundaram, Muna Sinada, Aloka Dixit
From: Rameshkumar Sundaram <rameshkumar.sundaram@oss.qualcomm.com>
During non-transmitted (nontx) profile configuration, interface
index of the transmitted (tx) profile is used to retrieve the
wireless device (wdev) associated with it. With MLO, this 'wdev'
may be part of an MLD with more than one link, hence only
interface index is not sufficient anymore to retrieve the correct
tx profile. Add a new attribute to configure link id of tx profile.
Signed-off-by: Rameshkumar Sundaram <rameshkumar.sundaram@oss.qualcomm.com>
Co-developed-by: Muna Sinada <muna.sinada@oss.qualcomm.com>
Signed-off-by: Muna Sinada <muna.sinada@oss.qualcomm.com>
Co-developed-by: Aloka Dixit <aloka.dixit@oss.qualcomm.com>
Signed-off-by: Aloka Dixit <aloka.dixit@oss.qualcomm.com>
---
include/net/cfg80211.h | 2 ++
include/uapi/linux/nl80211.h | 6 ++++++
net/wireless/nl80211.c | 14 ++++++++++++++
3 files changed, 22 insertions(+)
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 6b170a8d086c..0f7a4f410d45 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -1286,11 +1286,13 @@ struct cfg80211_crypto_settings {
* struct cfg80211_mbssid_config - AP settings for multi bssid
*
* @tx_wdev: pointer to the transmitted interface in the MBSSID set
+ * @tx_link_id: link ID of the transmitted profile in an MLD, default is 0.
* @index: index of this AP in the multi bssid group.
* @ema: set to true if the beacons should be sent out in EMA mode.
*/
struct cfg80211_mbssid_config {
struct wireless_dev *tx_wdev;
+ u8 tx_link_id;
u8 index;
bool ema;
};
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index 9d8ecf20ef0d..ed2a181a2557 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -8022,6 +8022,11 @@ enum nl80211_sar_specs_attrs {
* Setting this flag is permitted only if the driver advertises EMA support
* by setting wiphy->ema_max_profile_periodicity to non-zero.
*
+ * @NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID: Link ID of the transmitted profile.
+ * This parameter is mandatory if the transmitted profile is part of an MLD
+ * and the interface getting configured is a non-transmitted profile. For all
+ * other cases it will be ignored.
+ *
* @__NL80211_MBSSID_CONFIG_ATTR_LAST: Internal
* @NL80211_MBSSID_CONFIG_ATTR_MAX: highest attribute
*/
@@ -8033,6 +8038,7 @@ enum nl80211_mbssid_config_attributes {
NL80211_MBSSID_CONFIG_ATTR_INDEX,
NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX,
NL80211_MBSSID_CONFIG_ATTR_EMA,
+ NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID,
/* keep last */
__NL80211_MBSSID_CONFIG_ATTR_LAST,
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 2c4e06610a79..0ebbce9fbaf4 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -469,6 +469,8 @@ nl80211_mbssid_config_policy[NL80211_MBSSID_CONFIG_ATTR_MAX + 1] = {
[NL80211_MBSSID_CONFIG_ATTR_INDEX] = { .type = NLA_U8 },
[NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX] = { .type = NLA_U32 },
[NL80211_MBSSID_CONFIG_ATTR_EMA] = { .type = NLA_FLAG },
+ [NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID] =
+ NLA_POLICY_MAX(NLA_U8, IEEE80211_MLD_MAX_NUM_LINKS),
};
static const struct nla_policy
@@ -5561,6 +5563,18 @@ static int nl80211_parse_mbssid_config(struct wiphy *wiphy,
}
config->tx_wdev = tx_netdev->ieee80211_ptr;
+
+ if (config->tx_wdev->valid_links) {
+ if (!tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID])
+ return -ENOLINK;
+
+ config->tx_link_id =
+ nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]);
+
+ if (!(config->tx_wdev->valid_links &
+ BIT(config->tx_link_id)))
+ return -ENOLINK;
+ }
} else {
config->tx_wdev = dev->ieee80211_ptr;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v4 2/3] wifi: mac80211: restructure tx profile retrieval for MLO MBSSID
2025-03-10 20:02 [PATCH v4 0/3] wifi: MBSSID support in MLO Aloka Dixit
2025-03-10 20:02 ` [PATCH v4 1/3] wifi: nl80211: add link id of transmitted profile for MLO MBSSID Aloka Dixit
@ 2025-03-10 20:02 ` Aloka Dixit
2025-03-10 20:02 ` [PATCH v4 3/3] wifi: ath12k: pass link_conf for tx_arvif retrieval Aloka Dixit
2 siblings, 0 replies; 11+ messages in thread
From: Aloka Dixit @ 2025-03-10 20:02 UTC (permalink / raw)
To: linux-wireless, ath12k, ath11k
Cc: Rameshkumar Sundaram, Muna Sinada, Aloka Dixit
From: Rameshkumar Sundaram <rameshkumar.sundaram@oss.qualcomm.com>
For MBSSID, each vif (struct ieee80211_vif) stores another vif
pointer for the transmitting profile of MBSSID set. This won't
suffice for MLO as there may be multiple links, each of which can
be part of different MBSSID sets. Hence the information needs to
be stored per-link. Additionally, the transmitted profile itself
may be part of an MLD hence storing vif will not suffice either.
Fix MLO by storing an instance of struct ieee80211_bss_conf
for each link.
Modify following operations to reflect the above structure updates:
- channel switch completion
- BSS color change completion
- Removing nontransmitted links in ieee80211_stop_mbssid()
- drivers retrieving the transmitted link for beacon templates.
Signed-off-by: Rameshkumar Sundaram <rameshkumar.sundaram@oss.qualcomm.com>
Co-developed-by: Muna Sinada <muna.sinada@oss.qualcomm.com>
Signed-off-by: Muna Sinada <muna.sinada@oss.qualcomm.com>
Co-developed-by: Aloka Dixit <aloka.dixit@oss.qualcomm.com>
Signed-off-by: Aloka Dixit <aloka.dixit@oss.qualcomm.com>
---
drivers/net/wireless/ath/ath11k/mac.c | 10 ++-
drivers/net/wireless/ath/ath12k/mac.c | 22 +++++-
drivers/net/wireless/virtual/mac80211_hwsim.c | 7 +-
include/net/mac80211.h | 7 +-
net/mac80211/cfg.c | 64 ++++++++++------
net/mac80211/ieee80211_i.h | 2 +
net/mac80211/iface.c | 73 +++++++++++++------
7 files changed, 128 insertions(+), 57 deletions(-)
diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
index 97816916abac..8191ee14a1fd 100644
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
@@ -1531,8 +1531,14 @@ static int ath11k_mac_set_vif_params(struct ath11k_vif *arvif,
static struct ath11k_vif *ath11k_mac_get_tx_arvif(struct ath11k_vif *arvif)
{
- if (arvif->vif->mbssid_tx_vif)
- return ath11k_vif_to_arvif(arvif->vif->mbssid_tx_vif);
+ struct ieee80211_bss_conf *link_conf, *tx_bss_conf;
+
+ lockdep_assert_wiphy(arvif->ar->hw->wiphy);
+
+ link_conf = &arvif->vif->bss_conf;
+ tx_bss_conf = wiphy_dereference(arvif->ar->hw->wiphy, link_conf->tx_bss_conf);
+ if (tx_bss_conf)
+ return ath11k_vif_to_arvif(tx_bss_conf->vif);
return NULL;
}
diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
index dfa05f0ee6c9..84da77bf245b 100644
--- a/drivers/net/wireless/ath/ath12k/mac.c
+++ b/drivers/net/wireless/ath/ath12k/mac.c
@@ -582,12 +582,26 @@ static int ath12k_mac_vif_link_chan(struct ieee80211_vif *vif, u8 link_id,
static struct ath12k_link_vif *ath12k_mac_get_tx_arvif(struct ath12k_link_vif *arvif)
{
+ struct ieee80211_bss_conf *link_conf, *tx_bss_conf;
+ struct ath12k *ar = arvif->ar;
struct ath12k_vif *tx_ahvif;
- if (arvif->ahvif->vif->mbssid_tx_vif) {
- tx_ahvif = ath12k_vif_to_ahvif(arvif->ahvif->vif->mbssid_tx_vif);
- if (tx_ahvif)
- return &tx_ahvif->deflink;
+ lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
+
+ link_conf = ath12k_mac_get_link_bss_conf(arvif);
+ if (!link_conf) {
+ ath12k_warn(ar->ab,
+ "unable to access bss link conf for link %u required to retrieve transmitting link conf\n",
+ arvif->link_id);
+ return NULL;
+ }
+
+ tx_bss_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
+ link_conf->tx_bss_conf);
+ if (tx_bss_conf) {
+ tx_ahvif = ath12k_vif_to_ahvif(tx_bss_conf->vif);
+ return wiphy_dereference(tx_ahvif->ah->hw->wiphy,
+ tx_ahvif->link[tx_bss_conf->link_id]);
}
return NULL;
diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c
index d0d9dab7f11f..40866098b531 100644
--- a/drivers/net/wireless/virtual/mac80211_hwsim.c
+++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
@@ -2271,7 +2271,7 @@ static void mac80211_hwsim_beacon_tx(void *arg, u8 *mac,
{
struct mac80211_hwsim_link_data *link_data = arg;
u32 link_id = link_data->link_id;
- struct ieee80211_bss_conf *link_conf;
+ struct ieee80211_bss_conf *link_conf, *tx_bss_conf;
struct mac80211_hwsim_data *data =
container_of(link_data, struct mac80211_hwsim_data,
link_data[link_id]);
@@ -2290,10 +2290,11 @@ static void mac80211_hwsim_beacon_tx(void *arg, u8 *mac,
vif->type != NL80211_IFTYPE_OCB)
return;
- if (vif->mbssid_tx_vif && vif->mbssid_tx_vif != vif)
+ tx_bss_conf = rcu_access_pointer(link_conf->tx_bss_conf);
+ if (tx_bss_conf && tx_bss_conf != link_conf)
return;
- if (vif->bss_conf.ema_ap) {
+ if (link_conf->ema_ap) {
struct ieee80211_ema_beacons *ema;
u8 i = 0;
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index c498f685d01f..f7ceba974749 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -682,6 +682,9 @@ struct ieee80211_parsed_tpe {
* responder functionality.
* @ftmr_params: configurable lci/civic parameter when enabling FTM responder.
* @nontransmitted: this BSS is a nontransmitted BSS profile
+ * @tx_bss_conf: Pointer to the BSS configuration of transmitting interface
+ * if MBSSID is enabled. This pointer is RCU-protected due to CSA finish
+ * and BSS color change flows accessing it.
* @transmitter_bssid: the address of transmitter AP
* @bssid_index: index inside the multiple BSSID set
* @bssid_indicator: 2^bssid_indicator is the maximum number of APs in set
@@ -804,6 +807,7 @@ struct ieee80211_bss_conf {
struct ieee80211_ftm_responder_params *ftmr_params;
/* Multiple BSSID data */
bool nontransmitted;
+ struct ieee80211_bss_conf __rcu *tx_bss_conf;
u8 transmitter_bssid[ETH_ALEN];
u8 bssid_index;
u8 bssid_indicator;
@@ -2023,7 +2027,6 @@ enum ieee80211_neg_ttlm_res {
* @txq: the multicast data TX queue
* @offload_flags: 802.3 -> 802.11 enapsulation offload flags, see
* &enum ieee80211_offload_flags.
- * @mbssid_tx_vif: Pointer to the transmitting interface if MBSSID is enabled.
*/
struct ieee80211_vif {
enum nl80211_iftype type;
@@ -2052,8 +2055,6 @@ struct ieee80211_vif {
bool probe_req_reg;
bool rx_mcast_action_reg;
- struct ieee80211_vif *mbssid_tx_vif;
-
/* must be last */
u8 drv_priv[] __aligned(sizeof(void *));
};
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 09708a060bb7..eeaead57e556 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -146,8 +146,8 @@ static int ieee80211_set_ap_mbssid_options(struct ieee80211_sub_if_data *sdata,
struct ieee80211_bss_conf *link_conf)
{
struct ieee80211_sub_if_data *tx_sdata;
+ struct ieee80211_bss_conf *old;
- sdata->vif.mbssid_tx_vif = NULL;
link_conf->bssid_index = 0;
link_conf->nontransmitted = false;
link_conf->ema_ap = false;
@@ -156,14 +156,26 @@ static int ieee80211_set_ap_mbssid_options(struct ieee80211_sub_if_data *sdata,
if (sdata->vif.type != NL80211_IFTYPE_AP || !params->tx_wdev)
return -EINVAL;
+ old = sdata_dereference(link_conf->tx_bss_conf, sdata);
+ if (old)
+ return -EALREADY;
+
tx_sdata = IEEE80211_WDEV_TO_SUB_IF(params->tx_wdev);
if (!tx_sdata)
return -EINVAL;
if (tx_sdata == sdata) {
- sdata->vif.mbssid_tx_vif = &sdata->vif;
+ rcu_assign_pointer(link_conf->tx_bss_conf, link_conf);
} else {
- sdata->vif.mbssid_tx_vif = &tx_sdata->vif;
+ struct ieee80211_bss_conf *tx_bss_conf;
+
+ tx_bss_conf = sdata_dereference(tx_sdata->vif.link_conf[params->tx_link_id],
+ sdata);
+ if (rcu_access_pointer(tx_bss_conf->tx_bss_conf) != tx_bss_conf)
+ return -EINVAL;
+
+ rcu_assign_pointer(link_conf->tx_bss_conf, tx_bss_conf);
+
link_conf->nontransmitted = true;
link_conf->bssid_index = params->index;
}
@@ -1669,7 +1681,6 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev,
kfree(link_conf->ftmr_params);
link_conf->ftmr_params = NULL;
- sdata->vif.mbssid_tx_vif = NULL;
link_conf->bssid_index = 0;
link_conf->nontransmitted = false;
link_conf->ema_ap = false;
@@ -1683,6 +1694,9 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev,
ieee80211_free_key_list(local, &keys);
}
+ ieee80211_stop_mbssid(sdata);
+ RCU_INIT_POINTER(link_conf->tx_bss_conf, NULL);
+
link_conf->enable_beacon = false;
sdata->beacon_rate_set = false;
sdata->vif.cfg.ssid_len = 0;
@@ -3700,6 +3714,7 @@ void ieee80211_csa_finish(struct ieee80211_vif *vif, unsigned int link_id)
{
struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
struct ieee80211_local *local = sdata->local;
+ struct ieee80211_bss_conf *tx_bss_conf;
struct ieee80211_link_data *link_data;
if (WARN_ON(link_id >= IEEE80211_MLD_MAX_NUM_LINKS))
@@ -3713,25 +3728,24 @@ void ieee80211_csa_finish(struct ieee80211_vif *vif, unsigned int link_id)
return;
}
- /* TODO: MBSSID with MLO changes */
- if (vif->mbssid_tx_vif == vif) {
+ tx_bss_conf = rcu_dereference(link_data->conf->tx_bss_conf);
+ if (tx_bss_conf == link_data->conf) {
/* Trigger ieee80211_csa_finish() on the non-transmitting
* interfaces when channel switch is received on
* transmitting interface
*/
- struct ieee80211_sub_if_data *iter;
-
- list_for_each_entry_rcu(iter, &local->interfaces, list) {
- if (!ieee80211_sdata_running(iter))
- continue;
+ struct ieee80211_link_data *iter;
- if (iter == sdata || iter->vif.mbssid_tx_vif != vif)
+ for_each_sdata_link(local, iter) {
+ if (iter->sdata == sdata ||
+ rcu_access_pointer(iter->conf->tx_bss_conf) != tx_bss_conf)
continue;
- wiphy_work_queue(iter->local->hw.wiphy,
- &iter->deflink.csa.finalize_work);
+ wiphy_work_queue(iter->sdata->local->hw.wiphy,
+ &iter->csa.finalize_work);
}
}
+
wiphy_work_queue(local->hw.wiphy, &link_data->csa.finalize_work);
rcu_read_unlock();
@@ -4833,17 +4847,19 @@ ieee80211_color_change_bss_config_notify(struct ieee80211_link_data *link,
ieee80211_link_info_change_notify(sdata, link, changed);
- if (!sdata->vif.bss_conf.nontransmitted && sdata->vif.mbssid_tx_vif) {
- struct ieee80211_sub_if_data *child;
+ if (!link->conf->nontransmitted &&
+ rcu_access_pointer(link->conf->tx_bss_conf)) {
+ struct ieee80211_link_data *tmp;
- list_for_each_entry(child, &sdata->local->interfaces, list) {
- if (child != sdata && child->vif.mbssid_tx_vif == &sdata->vif) {
- child->vif.bss_conf.he_bss_color.color = color;
- child->vif.bss_conf.he_bss_color.enabled = enable;
- ieee80211_link_info_change_notify(child,
- &child->deflink,
- BSS_CHANGED_HE_BSS_COLOR);
- }
+ for_each_sdata_link(sdata->local, tmp) {
+ if (tmp->sdata == sdata ||
+ rcu_access_pointer(tmp->conf->tx_bss_conf) != link->conf)
+ continue;
+
+ tmp->conf->he_bss_color.color = color;
+ tmp->conf->he_bss_color.enabled = enable;
+ ieee80211_link_info_change_notify(tmp->sdata, tmp,
+ BSS_CHANGED_HE_BSS_COLOR);
}
}
}
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 845888ac3d2c..68c6be894a28 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -2794,6 +2794,8 @@ int ieee80211_mgd_assoc_ml_reconf(struct ieee80211_sub_if_data *sdata,
void ieee80211_process_ml_reconf_resp(struct ieee80211_sub_if_data *sdata,
struct ieee80211_mgmt *mgmt, size_t len);
+void ieee80211_stop_mbssid(struct ieee80211_sub_if_data *sdata);
+
#if IS_ENABLED(CONFIG_MAC80211_KUNIT_TEST)
#define EXPORT_SYMBOL_IF_MAC80211_KUNIT(sym) EXPORT_SYMBOL_IF_KUNIT(sym)
#define VISIBLE_IF_MAC80211_KUNIT
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index 33c7c62d19f5..540fccb58c1f 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -726,30 +726,57 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_do
ieee80211_add_virtual_monitor(local);
}
-static void ieee80211_stop_mbssid(struct ieee80211_sub_if_data *sdata)
+void ieee80211_stop_mbssid(struct ieee80211_sub_if_data *sdata)
{
- struct ieee80211_sub_if_data *tx_sdata, *non_tx_sdata, *tmp_sdata;
- struct ieee80211_vif *tx_vif = sdata->vif.mbssid_tx_vif;
+ struct ieee80211_sub_if_data *tx_sdata;
+ struct ieee80211_bss_conf *link_conf, *tx_bss_conf;
+ struct ieee80211_link_data *tx_link, *link;
+ unsigned int link_id;
- if (!tx_vif)
- return;
+ lockdep_assert_wiphy(sdata->local->hw.wiphy);
+
+ /* Check if any of the links of current sdata is an MBSSID. */
+ for_each_vif_active_link(&sdata->vif, link_conf, link_id) {
+ tx_bss_conf = sdata_dereference(link_conf->tx_bss_conf, sdata);
+ if (!tx_bss_conf)
+ continue;
- tx_sdata = vif_to_sdata(tx_vif);
- sdata->vif.mbssid_tx_vif = NULL;
+ tx_sdata = vif_to_sdata(tx_bss_conf->vif);
+ RCU_INIT_POINTER(link_conf->tx_bss_conf, NULL);
- list_for_each_entry_safe(non_tx_sdata, tmp_sdata,
- &tx_sdata->local->interfaces, list) {
- if (non_tx_sdata != sdata && non_tx_sdata != tx_sdata &&
- non_tx_sdata->vif.mbssid_tx_vif == tx_vif &&
- ieee80211_sdata_running(non_tx_sdata)) {
- non_tx_sdata->vif.mbssid_tx_vif = NULL;
- dev_close(non_tx_sdata->wdev.netdev);
+ /* If we are not tx sdata reset tx sdata's tx_bss_conf to avoid recusrion while
+ * closing tx sdata at the end of outer loop below.
+ */
+ if (sdata != tx_sdata) {
+ tx_link = sdata_dereference(tx_sdata->link[tx_bss_conf->link_id], tx_sdata);
+ if (!tx_link)
+ continue;
+
+ RCU_INIT_POINTER(tx_link->conf->tx_bss_conf, NULL);
+ }
+
+ /* loop through sdatas to find if any of their links
+ * belong to same MBSSID set as the one getting deleted.
+ */
+ for_each_sdata_link(tx_sdata->local, link) {
+ struct ieee80211_sub_if_data *link_sdata = link->sdata;
+
+ if (link_sdata == sdata || link_sdata == tx_sdata ||
+ rcu_access_pointer(link->conf->tx_bss_conf) != tx_bss_conf)
+ continue;
+
+ RCU_INIT_POINTER(link->conf->tx_bss_conf, NULL);
+
+ /* Remove all links of matching MLD until dynamic link
+ * removal can be supported.
+ */
+ cfg80211_stop_iface(link_sdata->wdev.wiphy, &link_sdata->wdev, GFP_KERNEL);
}
- }
- if (sdata != tx_sdata && ieee80211_sdata_running(tx_sdata)) {
- tx_sdata->vif.mbssid_tx_vif = NULL;
- dev_close(tx_sdata->wdev.netdev);
+ /* If we are not tx sdata, remove links of tx sdata and proceed */
+ if (sdata != tx_sdata && ieee80211_sdata_running(tx_sdata))
+ cfg80211_stop_iface(tx_sdata->wdev.wiphy,
+ &tx_sdata->wdev, GFP_KERNEL);
}
}
@@ -757,21 +784,25 @@ static int ieee80211_stop(struct net_device *dev)
{
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
- /* close dependent VLAN and MBSSID interfaces before locking wiphy */
+ /* close dependent VLAN interfaces before locking wiphy */
if (sdata->vif.type == NL80211_IFTYPE_AP) {
struct ieee80211_sub_if_data *vlan, *tmpsdata;
list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans,
u.vlan.list)
dev_close(vlan->dev);
-
- ieee80211_stop_mbssid(sdata);
}
guard(wiphy)(sdata->local->hw.wiphy);
wiphy_work_cancel(sdata->local->hw.wiphy, &sdata->activate_links_work);
+ /* Close the dependent MBSSID interfaces with wiphy lock as we may be
+ * terminating its partner links too in case of MLD.
+ */
+ if (sdata->vif.type == NL80211_IFTYPE_AP)
+ ieee80211_stop_mbssid(sdata);
+
ieee80211_do_stop(sdata, true);
return 0;
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v4 3/3] wifi: ath12k: pass link_conf for tx_arvif retrieval
2025-03-10 20:02 [PATCH v4 0/3] wifi: MBSSID support in MLO Aloka Dixit
2025-03-10 20:02 ` [PATCH v4 1/3] wifi: nl80211: add link id of transmitted profile for MLO MBSSID Aloka Dixit
2025-03-10 20:02 ` [PATCH v4 2/3] wifi: mac80211: restructure tx profile retrieval " Aloka Dixit
@ 2025-03-10 20:02 ` Aloka Dixit
2025-03-10 20:06 ` Aloka Dixit
2 siblings, 1 reply; 11+ messages in thread
From: Aloka Dixit @ 2025-03-10 20:02 UTC (permalink / raw)
To: linux-wireless, ath12k, ath11k; +Cc: Aloka Dixit
Three out of four callers to ath12k_mac_get_tx_arvif() have
link_conf pointer already set for other operations. Pass it
as a parameter. Modify ath12k_control_beaconing() to set
link_conf first.
Signed-off-by: Aloka Dixit <aloka.dixit@oss.qualcomm.com>
---
drivers/net/wireless/ath/ath12k/mac.c | 31 +++++++++++++++------------
1 file changed, 17 insertions(+), 14 deletions(-)
diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
index 84da77bf245b..200a2a8ff166 100644
--- a/drivers/net/wireless/ath/ath12k/mac.c
+++ b/drivers/net/wireless/ath/ath12k/mac.c
@@ -580,22 +580,16 @@ static int ath12k_mac_vif_link_chan(struct ieee80211_vif *vif, u8 link_id,
return 0;
}
-static struct ath12k_link_vif *ath12k_mac_get_tx_arvif(struct ath12k_link_vif *arvif)
+static struct ath12k_link_vif *
+ath12k_mac_get_tx_arvif(struct ath12k_link_vif *arvif,
+ struct ieee80211_bss_conf *link_conf)
{
- struct ieee80211_bss_conf *link_conf, *tx_bss_conf;
+ struct ieee80211_bss_conf *tx_bss_conf;
struct ath12k *ar = arvif->ar;
struct ath12k_vif *tx_ahvif;
lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
- link_conf = ath12k_mac_get_link_bss_conf(arvif);
- if (!link_conf) {
- ath12k_warn(ar->ab,
- "unable to access bss link conf for link %u required to retrieve transmitting link conf\n",
- arvif->link_id);
- return NULL;
- }
-
tx_bss_conf = wiphy_dereference(ath12k_ar_to_hw(ar)->wiphy,
link_conf->tx_bss_conf);
if (tx_bss_conf) {
@@ -1729,7 +1723,7 @@ static int ath12k_mac_setup_bcn_tmpl(struct ath12k_link_vif *arvif)
return -ENOLINK;
}
- tx_arvif = ath12k_mac_get_tx_arvif(arvif);
+ tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
if (tx_arvif) {
if (tx_arvif != arvif && arvif->is_up)
return 0;
@@ -1799,6 +1793,7 @@ static void ath12k_control_beaconing(struct ath12k_link_vif *arvif,
{
struct ath12k_wmi_vdev_up_params params = {};
struct ath12k_vif *ahvif = arvif->ahvif;
+ struct ieee80211_bss_conf *link_conf;
struct ath12k_link_vif *tx_arvif;
struct ath12k *ar = arvif->ar;
int ret;
@@ -1831,7 +1826,15 @@ static void ath12k_control_beaconing(struct ath12k_link_vif *arvif,
params.aid = ahvif->aid;
params.bssid = arvif->bssid;
- tx_arvif = ath12k_mac_get_tx_arvif(arvif);
+ link_conf = ath12k_mac_get_link_bss_conf(arvif);
+ if (!link_conf) {
+ ath12k_warn(ar->ab,
+ "unable to access bss link conf for link %u required to retrieve transmitting link conf\n",
+ arvif->link_id);
+ return;
+ }
+
+ tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
if (tx_arvif) {
params.tx_bssid = tx_arvif->bssid;
params.nontx_profile_idx = info->bssid_index;
@@ -7868,7 +7871,7 @@ static int ath12k_mac_setup_vdev_params_mbssid(struct ath12k_link_vif *arvif,
return -ENOLINK;
}
- tx_arvif = ath12k_mac_get_tx_arvif(arvif);
+ tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
if (!tx_arvif)
return 0;
@@ -9322,7 +9325,7 @@ ath12k_mac_update_vif_chan(struct ath12k *ar,
params.aid = ahvif->aid;
params.bssid = arvif->bssid;
- tx_arvif = ath12k_mac_get_tx_arvif(arvif);
+ tx_arvif = ath12k_mac_get_tx_arvif(arvif, link_conf);
if (tx_arvif) {
params.tx_bssid = tx_arvif->bssid;
params.nontx_profile_idx = link_conf->bssid_index;
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v4 3/3] wifi: ath12k: pass link_conf for tx_arvif retrieval
2025-03-10 20:02 ` [PATCH v4 3/3] wifi: ath12k: pass link_conf for tx_arvif retrieval Aloka Dixit
@ 2025-03-10 20:06 ` Aloka Dixit
2025-03-10 23:18 ` Jeff Johnson
0 siblings, 1 reply; 11+ messages in thread
From: Aloka Dixit @ 2025-03-10 20:06 UTC (permalink / raw)
To: linux-wireless, ath12k, ath11k
On 3/10/2025 1:02 PM, Aloka Dixit wrote:
> Three out of four callers to ath12k_mac_get_tx_arvif() have
> link_conf pointer already set for other operations. Pass it
> as a parameter. Modify ath12k_control_beaconing() to set
> link_conf first.
>
> Signed-off-by: Aloka Dixit <aloka.dixit@oss.qualcomm.com>
> ---
> drivers/net/wireless/ath/ath12k/mac.c | 31 +++++++++++++++------------
> 1 file changed, 17 insertions(+), 14 deletions(-)
>
Forgot to add tested on tag:
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
Will send the driver changes again with the tag if required once
nl80211/mac80211 review completes.
- Aloka
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 3/3] wifi: ath12k: pass link_conf for tx_arvif retrieval
2025-03-10 20:06 ` Aloka Dixit
@ 2025-03-10 23:18 ` Jeff Johnson
2025-03-11 16:45 ` Aloka Dixit
0 siblings, 1 reply; 11+ messages in thread
From: Jeff Johnson @ 2025-03-10 23:18 UTC (permalink / raw)
To: Aloka Dixit, linux-wireless, ath12k, ath11k
On 3/10/2025 1:06 PM, Aloka Dixit wrote:
> On 3/10/2025 1:02 PM, Aloka Dixit wrote:
>> Three out of four callers to ath12k_mac_get_tx_arvif() have
>> link_conf pointer already set for other operations. Pass it
>> as a parameter. Modify ath12k_control_beaconing() to set
>> link_conf first.
>>
>> Signed-off-by: Aloka Dixit <aloka.dixit@oss.qualcomm.com>
>> ---
>> drivers/net/wireless/ath/ath12k/mac.c | 31 +++++++++++++++------------
>> 1 file changed, 17 insertions(+), 14 deletions(-)
>>
>
> Forgot to add tested on tag:
> Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
>
> Will send the driver changes again with the tag if required once
> nl80211/mac80211 review completes.
If Johannes accepts the first two patches I can add this to the ath12k patch.
Note, however, that you forgot the wireless-next subject prefix tag ;)
/jeff
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 3/3] wifi: ath12k: pass link_conf for tx_arvif retrieval
2025-03-10 23:18 ` Jeff Johnson
@ 2025-03-11 16:45 ` Aloka Dixit
0 siblings, 0 replies; 11+ messages in thread
From: Aloka Dixit @ 2025-03-11 16:45 UTC (permalink / raw)
To: Jeff Johnson, linux-wireless, ath12k, ath11k
On 3/10/2025 4:18 PM, Jeff Johnson wrote:
> On 3/10/2025 1:06 PM, Aloka Dixit wrote:
>> On 3/10/2025 1:02 PM, Aloka Dixit wrote:
>>> Three out of four callers to ath12k_mac_get_tx_arvif() have
>>> link_conf pointer already set for other operations. Pass it
>>> as a parameter. Modify ath12k_control_beaconing() to set
>>> link_conf first.
>>>
>>> Signed-off-by: Aloka Dixit <aloka.dixit@oss.qualcomm.com>
>>> ---
>>> drivers/net/wireless/ath/ath12k/mac.c | 31 +++++++++++++++------------
>>> 1 file changed, 17 insertions(+), 14 deletions(-)
>>>
>>
>> Forgot to add tested on tag:
>> Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
>>
>> Will send the driver changes again with the tag if required once
>> nl80211/mac80211 review completes.
>
> If Johannes accepts the first two patches I can add this to the ath12k patch.
>
> Note, however, that you forgot the wireless-next subject prefix tag ;)
>
> /jeff
Yeah, I see a nice table with warnings now,
will take care of it once the technical review is done :-)
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 1/3] wifi: nl80211: add link id of transmitted profile for MLO MBSSID
2025-03-10 20:02 ` [PATCH v4 1/3] wifi: nl80211: add link id of transmitted profile for MLO MBSSID Aloka Dixit
@ 2025-03-12 8:55 ` Johannes Berg
2025-03-13 22:59 ` Aloka Dixit
0 siblings, 1 reply; 11+ messages in thread
From: Johannes Berg @ 2025-03-12 8:55 UTC (permalink / raw)
To: Aloka Dixit, linux-wireless, ath12k, ath11k
Cc: Rameshkumar Sundaram, Muna Sinada
Hi Aloka, all,
> + * @NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID: Link ID of the transmitted profile.
> + * This parameter is mandatory if the transmitted profile is part of an MLD
> + * and the interface getting configured is a non-transmitted profile. For all
> + * other cases it will be ignored.
So I guess it's a question of what "the interface getting configured"
means, but I guess you could set up the transmitting interface?
> @@ -5561,6 +5563,18 @@ static int nl80211_parse_mbssid_config(struct wiphy *wiphy,
> }
>
> config->tx_wdev = tx_netdev->ieee80211_ptr;
> +
> + if (config->tx_wdev->valid_links) {
> + if (!tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID])
> + return -ENOLINK;
> +
> + config->tx_link_id =
> + nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]);
> +
> + if (!(config->tx_wdev->valid_links &
> + BIT(config->tx_link_id)))
> + return -ENOLINK;
> + }
> } else {
> config->tx_wdev = dev->ieee80211_ptr;
> }
So shouldn't that be one layer out, so the link ID can also apply if no
interface index was given, i.e. we took the else branch? Seems like that
should be applicable, or is there a specific reason not to apply in that
case?
johannes
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 1/3] wifi: nl80211: add link id of transmitted profile for MLO MBSSID
2025-03-12 8:55 ` Johannes Berg
@ 2025-03-13 22:59 ` Aloka Dixit
2025-03-22 9:04 ` Johannes Berg
0 siblings, 1 reply; 11+ messages in thread
From: Aloka Dixit @ 2025-03-13 22:59 UTC (permalink / raw)
To: Johannes Berg, linux-wireless, ath12k, ath11k
Cc: Rameshkumar Sundaram, Muna Sinada
On 3/12/2025 1:55 AM, Johannes Berg wrote:
> Hi Aloka, all,
>
>> + * @NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID: Link ID of the transmitted profile.
>> + * This parameter is mandatory if the transmitted profile is part of an MLD
>> + * and the interface getting configured is a non-transmitted profile. For all
>> + * other cases it will be ignored.
>
> So I guess it's a question of what "the interface getting configured"
> means, but I guess you could set up the transmitting interface?
>
Right, if the interface getting configured is the transmitted profile
the link_id is ignored.
>> @@ -5561,6 +5563,18 @@ static int nl80211_parse_mbssid_config(struct wiphy *wiphy,
>> }
>>
>> config->tx_wdev = tx_netdev->ieee80211_ptr;
>> +
>> + if (config->tx_wdev->valid_links) {
>> + if (!tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID])
>> + return -ENOLINK;
>> +
>> + config->tx_link_id =
>> + nla_get_u8(tb[NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID]);
>> +
>> + if (!(config->tx_wdev->valid_links &
>> + BIT(config->tx_link_id)))
>> + return -ENOLINK;
>> + }
>> } else {
>> config->tx_wdev = dev->ieee80211_ptr;
>> }
>
> So shouldn't that be one layer out, so the link ID can also apply if no
> interface index was given, i.e. we took the else branch? Seems like that
> should be applicable, or is there a specific reason not to apply in that
> case?
The 'else' case in the highlighted snippet above is the same scenario as
the 'else' case you referred to, which is one layer out: "else if
(!config->index) {".
Both are executed when the interface getting configured is the
transmitting interface. The difference between these two 'else's is that
in one case userspace explicitly provides
"NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX" and in other it hasn't.
Similarly, for MLO, mac80211 does not need the link_id of the tx
interface because it already has the link_conf for it as part of basic
AP configuration parameters, hence link_id is ignored in both 'else's.
Thanks.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 1/3] wifi: nl80211: add link id of transmitted profile for MLO MBSSID
2025-03-13 22:59 ` Aloka Dixit
@ 2025-03-22 9:04 ` Johannes Berg
2025-04-01 19:24 ` Aloka Dixit
0 siblings, 1 reply; 11+ messages in thread
From: Johannes Berg @ 2025-03-22 9:04 UTC (permalink / raw)
To: Aloka Dixit, linux-wireless, ath12k, ath11k
Cc: Rameshkumar Sundaram, Muna Sinada
On Thu, 2025-03-13 at 15:59 -0700, Aloka Dixit wrote:
> On 3/12/2025 1:55 AM, Johannes Berg wrote:
> > Hi Aloka, all,
> >
> > > + * @NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID: Link ID of the transmitted profile.
> > > + * This parameter is mandatory if the transmitted profile is part of an MLD
> > > + * and the interface getting configured is a non-transmitted profile. For all
> > > + * other cases it will be ignored.
> >
> > So I guess it's a question of what "the interface getting configured"
> > means, but I guess you could set up the transmitting interface?
> >
> Right, if the interface getting configured is the transmitted profile
> the link_id is ignored.
But I guess I don't understand yet why it's not needed? If you want to
configure MBSSID stuff for the transmitting profile it seems you'd need
the right link anyway?
But if it's not needed, should we at least validate it's correct or so?
> The 'else' case in the highlighted snippet above is the same scenario as
> the 'else' case you referred to, which is one layer out: "else if
> (!config->index) {".
>
> Both are executed when the interface getting configured is the
> transmitting interface. The difference between these two 'else's is that
> in one case userspace explicitly provides
> "NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX" and in other it hasn't.
Right.
> Similarly, for MLO, mac80211 does not need the link_id of the tx
> interface because it already has the link_conf for it as part of basic
> AP configuration parameters, hence link_id is ignored in both 'else's.
Oh so you're saying that you have an outer link_id already in
nl80211_start_ap() (or other callers). So then I guess we're back to
validating it, in line with how we say:
if ((!config->index && tx_ifindex != dev->ifindex) ||
(config->index && tx_ifindex == dev->ifindex))
return -EINVAL;
now?
johannes
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v4 1/3] wifi: nl80211: add link id of transmitted profile for MLO MBSSID
2025-03-22 9:04 ` Johannes Berg
@ 2025-04-01 19:24 ` Aloka Dixit
0 siblings, 0 replies; 11+ messages in thread
From: Aloka Dixit @ 2025-04-01 19:24 UTC (permalink / raw)
To: Johannes Berg, linux-wireless, ath12k, ath11k
Cc: Rameshkumar Sundaram, Muna Sinada
On 3/22/2025 2:04 AM, Johannes Berg wrote:
> On Thu, 2025-03-13 at 15:59 -0700, Aloka Dixit wrote:
>> On 3/12/2025 1:55 AM, Johannes Berg wrote:
>>> Hi Aloka, all,
>>>
>>>> + * @NL80211_MBSSID_CONFIG_ATTR_TX_LINK_ID: Link ID of the transmitted profile.
>>>> + * This parameter is mandatory if the transmitted profile is part of an MLD
>>>> + * and the interface getting configured is a non-transmitted profile. For all
>>>> + * other cases it will be ignored.
>>>
>>> So I guess it's a question of what "the interface getting configured"
>>> means, but I guess you could set up the transmitting interface?
>>>
>> Right, if the interface getting configured is the transmitted profile
>> the link_id is ignored.
>
> But I guess I don't understand yet why it's not needed? If you want to
> configure MBSSID stuff for the transmitting profile it seems you'd need
> the right link anyway?
>
> But if it's not needed, should we at least validate it's correct or so?
>
>> The 'else' case in the highlighted snippet above is the same scenario as
>> the 'else' case you referred to, which is one layer out: "else if
>> (!config->index) {".
>>
>> Both are executed when the interface getting configured is the
>> transmitting interface. The difference between these two 'else's is that
>> in one case userspace explicitly provides
>> "NL80211_MBSSID_CONFIG_ATTR_TX_IFINDEX" and in other it hasn't.
>
> Right.
>
>> Similarly, for MLO, mac80211 does not need the link_id of the tx
>> interface because it already has the link_conf for it as part of basic
>> AP configuration parameters, hence link_id is ignored in both 'else's.
>
> Oh so you're saying that you have an outer link_id already in
> nl80211_start_ap() (or other callers). So then I guess we're back to
> validating it, in line with how we say:
>
> if ((!config->index && tx_ifindex != dev->ifindex) ||
> (config->index && tx_ifindex == dev->ifindex))
> return -EINVAL;
>
> now?
>
Sure, let me know if any more comments regarding this patch ant 2/2, I
will send a new version together for all.
Thanks.
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2025-04-01 19:34 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-10 20:02 [PATCH v4 0/3] wifi: MBSSID support in MLO Aloka Dixit
2025-03-10 20:02 ` [PATCH v4 1/3] wifi: nl80211: add link id of transmitted profile for MLO MBSSID Aloka Dixit
2025-03-12 8:55 ` Johannes Berg
2025-03-13 22:59 ` Aloka Dixit
2025-03-22 9:04 ` Johannes Berg
2025-04-01 19:24 ` Aloka Dixit
2025-03-10 20:02 ` [PATCH v4 2/3] wifi: mac80211: restructure tx profile retrieval " Aloka Dixit
2025-03-10 20:02 ` [PATCH v4 3/3] wifi: ath12k: pass link_conf for tx_arvif retrieval Aloka Dixit
2025-03-10 20:06 ` Aloka Dixit
2025-03-10 23:18 ` Jeff Johnson
2025-03-11 16:45 ` Aloka Dixit
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox