Message ID | 20240129200001.a267383709e6.I36f427d17c3478a7df46e205716f5ebc9b35a918@changeid (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Johannes Berg |
Headers | show |
Series | wifi: mac80211_hwsim: add control to skip beacons | expand |
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 --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, \