diff options
author | Johannes Berg <johannes.berg@intel.com> | 2023-08-28 13:59:36 +0200 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2023-09-11 11:27:19 +0200 |
commit | 5549b0885d6fbad79e0e471a9a863bd2f45af0c5 (patch) | |
tree | 08f6dab7bf4b1dc9e3f403fc7cc879c790b2eb59 /net | |
parent | 1b6721189570b7955ff745934fb0e428313e6e51 (diff) |
wifi: mac80211: add more ops assertions
Add more might_sleep() checks and check sdata-in-driver
for one additional place.
type=feature
ticket=jira:WIFI-314309
Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/mac80211/driver-ops.c | 2 | ||||
-rw-r--r-- | net/mac80211/driver-ops.h | 34 |
2 files changed, 36 insertions, 0 deletions
diff --git a/net/mac80211/driver-ops.c b/net/mac80211/driver-ops.c index 30cd0c905a24..376dae58b5a6 100644 --- a/net/mac80211/driver-ops.c +++ b/net/mac80211/driver-ops.c @@ -285,6 +285,8 @@ int drv_assign_vif_chanctx(struct ieee80211_local *local, { int ret = 0; + might_sleep(); + drv_verify_link_exists(sdata, link_conf); if (!check_sdata_in_driver(sdata)) return -EIO; diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h index c4505593ba7a..d95ff2282f54 100644 --- a/net/mac80211/driver-ops.h +++ b/net/mac80211/driver-ops.h @@ -40,6 +40,8 @@ static inline void drv_tx(struct ieee80211_local *local, static inline void drv_sync_rx_queues(struct ieee80211_local *local, struct sta_info *sta) { + might_sleep(); + if (local->ops->sync_rx_queues) { trace_drv_sync_rx_queues(local, sta->sdata, &sta->sta); local->ops->sync_rx_queues(&local->hw); @@ -569,6 +571,8 @@ static inline void drv_sta_statistics(struct ieee80211_local *local, struct ieee80211_sta *sta, struct station_info *sinfo) { + might_sleep(); + sdata = get_bss_sdata(sdata); if (!check_sdata_in_driver(sdata)) return; @@ -616,6 +620,8 @@ static inline int drv_get_survey(struct ieee80211_local *local, int idx, { int ret = -EOPNOTSUPP; + might_sleep(); + trace_drv_get_survey(local, idx, survey); if (local->ops->get_survey) @@ -797,6 +803,8 @@ static inline void drv_set_rekey_data(struct ieee80211_local *local, struct ieee80211_sub_if_data *sdata, struct cfg80211_gtk_rekey_data *data) { + might_sleep(); + if (!check_sdata_in_driver(sdata)) return; @@ -987,6 +995,8 @@ static inline void drv_stop_ap(struct ieee80211_local *local, struct ieee80211_sub_if_data *sdata, struct ieee80211_bss_conf *link_conf) { + might_sleep(); + /* make sure link_conf is protected */ drv_verify_link_exists(sdata, link_conf); @@ -1016,6 +1026,8 @@ drv_set_default_unicast_key(struct ieee80211_local *local, struct ieee80211_sub_if_data *sdata, int key_idx) { + might_sleep(); + if (!check_sdata_in_driver(sdata)) return; @@ -1046,6 +1058,8 @@ drv_channel_switch_beacon(struct ieee80211_sub_if_data *sdata, { struct ieee80211_local *local = sdata->local; + might_sleep(); + if (local->ops->channel_switch_beacon) { trace_drv_channel_switch_beacon(local, sdata, chandef); local->ops->channel_switch_beacon(&local->hw, &sdata->vif, @@ -1060,6 +1074,8 @@ drv_pre_channel_switch(struct ieee80211_sub_if_data *sdata, struct ieee80211_local *local = sdata->local; int ret = 0; + might_sleep(); + if (!check_sdata_in_driver(sdata)) return -EIO; @@ -1077,6 +1093,8 @@ drv_post_channel_switch(struct ieee80211_sub_if_data *sdata) struct ieee80211_local *local = sdata->local; int ret = 0; + might_sleep(); + if (!check_sdata_in_driver(sdata)) return -EIO; @@ -1092,6 +1110,8 @@ drv_abort_channel_switch(struct ieee80211_sub_if_data *sdata) { struct ieee80211_local *local = sdata->local; + might_sleep(); + if (!check_sdata_in_driver(sdata)) return; @@ -1107,6 +1127,8 @@ drv_channel_switch_rx_beacon(struct ieee80211_sub_if_data *sdata, { struct ieee80211_local *local = sdata->local; + might_sleep(); + if (!check_sdata_in_driver(sdata)) return; @@ -1163,6 +1185,8 @@ static inline int drv_get_txpower(struct ieee80211_local *local, { int ret; + might_sleep(); + if (!local->ops->get_txpower) return -EOPNOTSUPP; @@ -1267,6 +1291,10 @@ drv_get_ftm_responder_stats(struct ieee80211_local *local, { u32 ret = -EOPNOTSUPP; + might_sleep(); + if (!check_sdata_in_driver(sdata)) + return -EIO; + if (local->ops->get_ftm_responder_stats) ret = local->ops->get_ftm_responder_stats(&local->hw, &sdata->vif, @@ -1436,6 +1464,8 @@ static inline void drv_sta_set_4addr(struct ieee80211_local *local, struct ieee80211_sta *sta, bool enabled) { sdata = get_bss_sdata(sdata); + + might_sleep(); if (!check_sdata_in_driver(sdata)) return; @@ -1451,6 +1481,8 @@ static inline void drv_sta_set_decap_offload(struct ieee80211_local *local, bool enabled) { sdata = get_bss_sdata(sdata); + + might_sleep(); if (!check_sdata_in_driver(sdata)) return; @@ -1526,6 +1558,8 @@ static inline int drv_net_setup_tc(struct ieee80211_local *local, { int ret = -EOPNOTSUPP; + might_sleep(); + sdata = get_bss_sdata(sdata); trace_drv_net_setup_tc(local, sdata, type); if (local->ops->net_setup_tc) |