diff mbox series

wifi: mac80211_hwsim: add control to skip beacons

Message ID 20240129200001.a267383709e6.I36f427d17c3478a7df46e205716f5ebc9b35a918@changeid
State New
Headers show
Series wifi: mac80211_hwsim: add control to skip beacons | expand

Commit Message

Johannes Berg Jan. 29, 2024, 7 p.m. UTC
From: Johannes Berg <johannes.berg@intel.com>

To test certain beacon loss scenarios it can be useful to
simply not send a couple of beacons. Add a simple debugfs
file (per vif) to skip sending the beacons. They're still
fully prepared etc. so their DTIM count etc. will appear
as if they were simply corrupt over the air or otherwise
not received.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
 drivers/net/wireless/virtual/mac80211_hwsim.c | 28 ++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

Comments

Jeff Johnson Feb. 1, 2024, 6:34 p.m. UTC | #1
On 1/29/2024 11:00 AM, Johannes Berg wrote:
> From: Johannes Berg <johannes.berg@intel.com>
> 
> To test certain beacon loss scenarios it can be useful to
> simply not send a couple of beacons. Add a simple debugfs
> file (per vif) to skip sending the beacons. They're still
> fully prepared etc. so their DTIM count etc. will appear
> as if they were simply corrupt over the air or otherwise
> not received.
> 
> Signed-off-by: Johannes Berg <johannes.berg@intel.com>

Reviewed-by: Jeff Johnson <quic_jjohnson@quicinc.com>

> ---
>  drivers/net/wireless/virtual/mac80211_hwsim.c | 28 ++++++++++++++++++-
>  1 file changed, 27 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c
> index 62a5839f5385..59ec6aa5ac26 100644
> --- a/drivers/net/wireless/virtual/mac80211_hwsim.c
> +++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
> @@ -213,6 +213,7 @@ static const struct ieee80211_regdomain *hwsim_world_regdom_custom[] = {
>  
>  struct hwsim_vif_priv {
>  	u32 magic;
> +	u32 skip_beacons;
>  	u8 bssid[ETH_ALEN];
>  	bool assoc;
>  	bool bcn_en;
> @@ -2128,6 +2129,16 @@ static int mac80211_hwsim_add_interface(struct ieee80211_hw *hw,
>  	return 0;
>  }
>  
> +#ifdef CONFIG_MAC80211_DEBUGFS
> +static void mac80211_hwsim_vif_add_debugfs(struct ieee80211_hw *hw,
> +					   struct ieee80211_vif *vif)
> +{
> +	struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
> +
> +	debugfs_create_u32("skip_beacons", 0600, vif->debugfs_dir,
> +			   &vp->skip_beacons);
> +}
> +#endif
>  
>  static int mac80211_hwsim_change_interface(struct ieee80211_hw *hw,
>  					   struct ieee80211_vif *vif,
> @@ -2193,12 +2204,19 @@ static void __mac80211_hwsim_beacon_tx(struct ieee80211_bss_conf *link_conf,
>  				       struct ieee80211_vif *vif,
>  				       struct sk_buff *skb)
>  {
> +	struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
>  	struct ieee80211_tx_info *info;
>  	struct ieee80211_rate *txrate;
>  	struct ieee80211_mgmt *mgmt;
>  	/* TODO: get MCS */
>  	int bitrate = 100;
>  
> +	if (vp->skip_beacons) {
> +		vp->skip_beacons--;
> +		dev_kfree_skb(skb);
> +		return;
> +	}
> +
>  	info = IEEE80211_SKB_CB(skb);
>  	if (ieee80211_hw_check(hw, SUPPORTS_RC_TABLE))
>  		ieee80211_get_tx_rates(vif, NULL, skb,
> @@ -3857,6 +3875,13 @@ static int hwsim_pmsr_report_nl(struct sk_buff *msg, struct genl_info *info)
>  	return err;
>  }
>  
> +#ifdef CONFIG_MAC80211_DEBUGFS
> +#define HWSIM_DEBUGFS_OPS					\
> +	.vif_add_debugfs = mac80211_hwsim_vif_add_debugfs,
> +#else
> +#define HWSIM_DEBUGFS_OPS
> +#endif
> +
>  #define HWSIM_COMMON_OPS					\
>  	.tx = mac80211_hwsim_tx,				\
>  	.wake_tx_queue = ieee80211_handle_wake_tx_queue,	\
> @@ -3881,7 +3906,8 @@ static int hwsim_pmsr_report_nl(struct sk_buff *msg, struct genl_info *info)
>  	.get_et_stats = mac80211_hwsim_get_et_stats,		\
>  	.get_et_strings = mac80211_hwsim_get_et_strings,	\
>  	.start_pmsr = mac80211_hwsim_start_pmsr,		\
> -	.abort_pmsr = mac80211_hwsim_abort_pmsr,
> +	.abort_pmsr = mac80211_hwsim_abort_pmsr,		\
> +	HWSIM_DEBUGFS_OPS
>  
>  #define HWSIM_NON_MLO_OPS					\
>  	.sta_add = mac80211_hwsim_sta_add,			\
diff mbox series

Patch

diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c
index 62a5839f5385..59ec6aa5ac26 100644
--- a/drivers/net/wireless/virtual/mac80211_hwsim.c
+++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
@@ -213,6 +213,7 @@  static const struct ieee80211_regdomain *hwsim_world_regdom_custom[] = {
 
 struct hwsim_vif_priv {
 	u32 magic;
+	u32 skip_beacons;
 	u8 bssid[ETH_ALEN];
 	bool assoc;
 	bool bcn_en;
@@ -2128,6 +2129,16 @@  static int mac80211_hwsim_add_interface(struct ieee80211_hw *hw,
 	return 0;
 }
 
+#ifdef CONFIG_MAC80211_DEBUGFS
+static void mac80211_hwsim_vif_add_debugfs(struct ieee80211_hw *hw,
+					   struct ieee80211_vif *vif)
+{
+	struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
+
+	debugfs_create_u32("skip_beacons", 0600, vif->debugfs_dir,
+			   &vp->skip_beacons);
+}
+#endif
 
 static int mac80211_hwsim_change_interface(struct ieee80211_hw *hw,
 					   struct ieee80211_vif *vif,
@@ -2193,12 +2204,19 @@  static void __mac80211_hwsim_beacon_tx(struct ieee80211_bss_conf *link_conf,
 				       struct ieee80211_vif *vif,
 				       struct sk_buff *skb)
 {
+	struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
 	struct ieee80211_tx_info *info;
 	struct ieee80211_rate *txrate;
 	struct ieee80211_mgmt *mgmt;
 	/* TODO: get MCS */
 	int bitrate = 100;
 
+	if (vp->skip_beacons) {
+		vp->skip_beacons--;
+		dev_kfree_skb(skb);
+		return;
+	}
+
 	info = IEEE80211_SKB_CB(skb);
 	if (ieee80211_hw_check(hw, SUPPORTS_RC_TABLE))
 		ieee80211_get_tx_rates(vif, NULL, skb,
@@ -3857,6 +3875,13 @@  static int hwsim_pmsr_report_nl(struct sk_buff *msg, struct genl_info *info)
 	return err;
 }
 
+#ifdef CONFIG_MAC80211_DEBUGFS
+#define HWSIM_DEBUGFS_OPS					\
+	.vif_add_debugfs = mac80211_hwsim_vif_add_debugfs,
+#else
+#define HWSIM_DEBUGFS_OPS
+#endif
+
 #define HWSIM_COMMON_OPS					\
 	.tx = mac80211_hwsim_tx,				\
 	.wake_tx_queue = ieee80211_handle_wake_tx_queue,	\
@@ -3881,7 +3906,8 @@  static int hwsim_pmsr_report_nl(struct sk_buff *msg, struct genl_info *info)
 	.get_et_stats = mac80211_hwsim_get_et_stats,		\
 	.get_et_strings = mac80211_hwsim_get_et_strings,	\
 	.start_pmsr = mac80211_hwsim_start_pmsr,		\
-	.abort_pmsr = mac80211_hwsim_abort_pmsr,
+	.abort_pmsr = mac80211_hwsim_abort_pmsr,		\
+	HWSIM_DEBUGFS_OPS
 
 #define HWSIM_NON_MLO_OPS					\
 	.sta_add = mac80211_hwsim_sta_add,			\