mac80211: sample survey implementation for mac80211 & hwsim
Subsystems (2)
RFC 1/1 mac80211: sample survey implementation for mac80211 & hwsim
This adds the survey function to both mac80211 itself and to mac80211_hwsim. For the latter driver, we simply invent some noise level.A real driver which cannot determine the real channel noise MUST NOT report any noise, especially not a magically conjured one :-)
--- drivers/net/wireless/mac80211_hwsim.c | 28 ++++++++++++++++++++++++++++ include/net/mac80211.h | 3 ++- net/mac80211/cfg.c | 12 ++++++++++++ net/mac80211/driver-ops.h | 9 +++++++++ 4 files changed, 51 insertions(+), 1 deletion(-)
include/net/mac80211.h +2 -1
@@ -1673,7 +1673,8 @@ struct ieee80211_ops {struct ieee80211_vif *vif, enum ieee80211_ampdu_mlme_action action, struct ieee80211_sta *sta, u16 tid, u16 *ssn); - +int (*get_survey)(struct ieee80211_hw *hw,int idx, +struct survey_info *survey);void (*rfkill_poll)(struct ieee80211_hw *hw);void (*set_coverage_class)(struct ieee80211_hw *hw,u8 coverage_class);#ifdef CONFIG_NL80211_TESTMODE
net/mac80211/cfg.c +12 -0
@@ -411,6 +411,17 @@ static int ieee80211_dump_station(structreturn ret; } +static int ieee80211_dump_survey (struct wiphy *wiphy,struct net_device *dev, +int idx,struct survey_info *survey) +{ +struct ieee80211_local *local =wdev_priv (dev->ieee80211_ptr); + +if (!local->ops->get_survey) +return -EOPNOTSUPP ; + +return drv_get_survey (local, idx, survey); +} +static int ieee80211_get_station (struct wiphy *wiphy,struct net_device *dev,u8 *mac,struct station_info *sinfo) {
@@ -1508,6 +1519,7 @@ struct cfg80211_ops mac80211_config_ops .change_station = ieee80211_change_station, .get_station = ieee80211_get_station, .dump_station = ieee80211_dump_station, + .dump_survey = ieee80211_dump_survey, #ifdef CONFIG_MAC80211_MESH .add_mpath = ieee80211_add_mpath, .del_mpath = ieee80211_del_mpath,
net/mac80211/driver-ops.h +9 -0
@@ -346,6 +346,15 @@ static inline int drv_ampdu_action(strucreturn ret; } +static inline int drv_get_survey (struct ieee80211_local *local,int idx, +struct survey_info *survey) +{ +int ret = -EOPNOTSUPP ; +if (local->ops->conf_tx) + ret = local->ops->get_survey (&local->hw, idx, survey); +/* trace_drv_get_survey(local, idx, survey, ret); */ +return ret; +}static inline void drv_rfkill_poll (struct ieee80211_local *local) {
drivers/net/wireless/mac80211_hwsim.c +28 -0
@@ -830,6 +830,33 @@ static int mac80211_hwsim_conf_tx(return 0 ; } +static int mac80211_hwsim_get_survey ( +struct ieee80211_hw *hw,int idx, +struct survey_info *survey) +{ +struct ieee80211_conf *conf = &hw->conf; + +printk (KERN_DEBUG "%s:%s (idx=%d)\n" , +wiphy_name (hw->wiphy), __func__, idx); + +if (idx !=0 ) +return -ENOENT ; + +/* Current channel */ + survey->channel = conf->channel; + +/* +* Magically conjured noise level --- this is only ok for simulated hardware. +* +* A real driver which cannot determine the real channel noise MUST NOT +* report any noise, especially not a magically conjured one :-) +*/ + survey->filled =SURVEY_INFO_NOISE_DBM ; + survey->noise =-92 ; + +return 0 ; +} +#ifdef CONFIG_NL80211_TESTMODE /* * This section contains example code for using netlink
@@ -1013,6 +1040,7 @@ static struct ieee80211_ops mac80211_hws .sta_notify = mac80211_hwsim_sta_notify, .set_tim = mac80211_hwsim_set_tim, .conf_tx = mac80211_hwsim_conf_tx, + .get_survey = mac80211_hwsim_get_survey,CFG80211_TESTMODE_CMD (mac80211_hwsim_testmode_cmd) .ampdu_action = mac80211_hwsim_ampdu_action, .sw_scan_start = mac80211_hwsim_sw_scan,
Signature · 1 line
DH3HS, http://www.holgerschurig.de
Oh, that should have been [PATCH].
So much to copying subject lines from quilt patches without really reading.
Signature · 1 line
DH3HS, http://www.holgerschurig.de
Johannes Berg
maintainerHow does this work with multiple channels? And how about knowing how old the info is?
net/mac80211/driver-ops.h static inline int drv_ampdu_action(struc · line 355
Quoted 7 lines
net/mac80211/driver-ops.h +7
-0+static inline int drv_get_survey (struct ieee80211_local *local,int idx, +struct survey_info *survey) +{ +int ret = -EOPNOTSUPP ; +if (local->ops->conf_tx) + ret = local->ops->get_survey (&local->hw, idx, survey); +/* trace_drv_get_survey(local, idx, survey, ret); */
Lazy huh? :)
johannes
Re: [RFC] mac80211: sample survey implementation for mac80211 & hwsim
In reply to Holger Schurignet/mac80211/cfg.c static int ieee80211_dump_station(struct · line 420
Quoted 8 lines · Holger Schurig
net/mac80211/cfg.c +7
-0+static int ieee80211_dump_survey (struct wiphy *wiphy,struct net_device *dev, +int idx,struct survey_info *survey) +{ +struct ieee80211_local *local =wdev_priv (dev->ieee80211_ptr); + +if (!local->ops->get_survey) +return -EOPNOTSUPP ;
The check for the function is duplicated in drv_get_survey. I think the wrapper should be called unconditionally.
Quoted 4 lines
net/mac80211/cfg.c +4
-0+ +return drv_get_survey (local, idx, survey); +} +
Johannes Berg
maintainerRe: [RFC] mac80211: sample survey implementation for mac80211 & hwsim
Holger,
Quoted 10 lines
net/mac80211/cfg.c static int ieee80211_dump_station(struct · line 420
Quoted 7 lines
net/mac80211/cfg.c +7
-0+static int ieee80211_dump_survey (struct wiphy *wiphy,struct net_device *dev, +int idx,struct survey_info *survey) +{ +struct ieee80211_local *local =wdev_priv (dev->ieee80211_ptr); + +if (!local->ops->get_survey) +return -EOPNOTSUPP ;The check for the function is duplicated in
drv_get_survey. I think the wrapper should be called unconditionally.
Please address this comment and add tracing. Your patch was merged, so that needs to be an add-on patch.
johannes
PATCH 1/1 mac80211: add basic tracing to drv_get_survey
--- net/mac80211/driver-ops.h | 7 ++++++- net/mac80211/driver-trace.h | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletions(-)
net/mac80211/driver-ops.h +6 -1
@@ -375,9 +375,14 @@ static inline int drv_get_survey(struct ieee80211_local *local, int idx, struct survey_info *survey) {int ret = -EOPNOTSUPP ; + +trace_drv_get_survey (local, idx, survey); +if (local->ops->get_survey) ret = local->ops->get_survey (&local->hw, idx, survey); -/* trace_drv_get_survey(local, idx, survey, ret); */ + +trace_drv_return_int (local, ret); +return ret; }
net/mac80211/driver-trace.h +22 -0
@@ -761,6 +761,28 @@ TRACE_EVENT(drv_ampdu_action, ) ); +TRACE_EVENT (drv_get_survey, + TP_PROTO(struct ieee80211_local *local, int idx, + struct survey_info *survey), + +TP_ARGS (local, idx, survey), + +TP_STRUCT__entry ( + LOCAL_ENTRY +__field (int, idx) + ), + +TP_fast_assign ( + LOCAL_ASSIGN; + __entry->idx = idx; + ), + +TP_printk ( +LOCAL_PR_FMT " idx:%d" , +LOCAL_PR_ARG , __entry->idx + ) +); + TRACE_EVENT(drv_flush, TP_PROTO(struct ieee80211_local *local, bool drop),
Signature · 1 line
1.7.0.1
PATCH 1/1 mac80211: remove unnecessary check in ieee80211_dump_survey
In reply to Johannes BergThis check is duplicated in drv_get_survey.
--- net/mac80211/cfg.c | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-)
net/mac80211/cfg.c +0 -3
@@ -413,9 +413,6 @@ static int ieee80211_dump_survey(struct wiphy *wiphy, struct net_device *dev, {struct ieee80211_local *local =wdev_priv (dev->ieee80211_ptr); -if (!local->ops->get_survey) -return -EOPNOTSUPP ; -return drv_get_survey (local, idx, survey); }
Signature · 1 line
1.7.0.1