Commit cee7013b authored by Johannes Berg's avatar Johannes Berg

mac80211: allow drivers to use peer measurement API

There's nothing much for mac80211 to do, so only pass through
the requests with minimal checks and tracing. The driver must
call cfg80211's results APIs.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 9bb7e0f2
...@@ -3623,6 +3623,9 @@ enum ieee80211_reconfig_type { ...@@ -3623,6 +3623,9 @@ enum ieee80211_reconfig_type {
* skb is always a real frame, head may or may not be an A-MSDU. * skb is always a real frame, head may or may not be an A-MSDU.
* @get_ftm_responder_stats: Retrieve FTM responder statistics, if available. * @get_ftm_responder_stats: Retrieve FTM responder statistics, if available.
* Statistics should be cumulative, currently no way to reset is provided. * Statistics should be cumulative, currently no way to reset is provided.
*
* @start_pmsr: start peer measurement (e.g. FTM) (this call can sleep)
* @abort_pmsr: abort peer measurement (this call can sleep)
*/ */
struct ieee80211_ops { struct ieee80211_ops {
void (*tx)(struct ieee80211_hw *hw, void (*tx)(struct ieee80211_hw *hw,
...@@ -3911,6 +3914,10 @@ struct ieee80211_ops { ...@@ -3911,6 +3914,10 @@ struct ieee80211_ops {
int (*get_ftm_responder_stats)(struct ieee80211_hw *hw, int (*get_ftm_responder_stats)(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct cfg80211_ftm_responder_stats *ftm_stats); struct cfg80211_ftm_responder_stats *ftm_stats);
int (*start_pmsr)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct cfg80211_pmsr_request *request);
void (*abort_pmsr)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct cfg80211_pmsr_request *request);
}; };
/** /**
......
...@@ -3849,6 +3849,26 @@ ieee80211_get_ftm_responder_stats(struct wiphy *wiphy, ...@@ -3849,6 +3849,26 @@ ieee80211_get_ftm_responder_stats(struct wiphy *wiphy,
return drv_get_ftm_responder_stats(local, sdata, ftm_stats); return drv_get_ftm_responder_stats(local, sdata, ftm_stats);
} }
static int
ieee80211_start_pmsr(struct wiphy *wiphy, struct wireless_dev *dev,
struct cfg80211_pmsr_request *request)
{
struct ieee80211_local *local = wiphy_priv(wiphy);
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(dev);
return drv_start_pmsr(local, sdata, request);
}
static void
ieee80211_abort_pmsr(struct wiphy *wiphy, struct wireless_dev *dev,
struct cfg80211_pmsr_request *request)
{
struct ieee80211_local *local = wiphy_priv(wiphy);
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(dev);
return drv_abort_pmsr(local, sdata, request);
}
const struct cfg80211_ops mac80211_config_ops = { const struct cfg80211_ops mac80211_config_ops = {
.add_virtual_intf = ieee80211_add_iface, .add_virtual_intf = ieee80211_add_iface,
.del_virtual_intf = ieee80211_del_iface, .del_virtual_intf = ieee80211_del_iface,
...@@ -3944,4 +3964,6 @@ const struct cfg80211_ops mac80211_config_ops = { ...@@ -3944,4 +3964,6 @@ const struct cfg80211_ops mac80211_config_ops = {
.tx_control_port = ieee80211_tx_control_port, .tx_control_port = ieee80211_tx_control_port,
.get_txq_stats = ieee80211_get_txq_stats, .get_txq_stats = ieee80211_get_txq_stats,
.get_ftm_responder_stats = ieee80211_get_ftm_responder_stats, .get_ftm_responder_stats = ieee80211_get_ftm_responder_stats,
.start_pmsr = ieee80211_start_pmsr,
.abort_pmsr = ieee80211_abort_pmsr,
}; };
...@@ -1199,6 +1199,40 @@ drv_get_ftm_responder_stats(struct ieee80211_local *local, ...@@ -1199,6 +1199,40 @@ drv_get_ftm_responder_stats(struct ieee80211_local *local,
return ret; return ret;
} }
static inline int drv_start_pmsr(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
struct cfg80211_pmsr_request *request)
{
int ret = -EOPNOTSUPP;
might_sleep();
if (!check_sdata_in_driver(sdata))
return -EIO;
trace_drv_start_pmsr(local, sdata);
if (local->ops->start_pmsr)
ret = local->ops->start_pmsr(&local->hw, &sdata->vif, request);
trace_drv_return_int(local, ret);
return ret;
}
static inline void drv_abort_pmsr(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
struct cfg80211_pmsr_request *request)
{
trace_drv_abort_pmsr(local, sdata);
might_sleep();
if (!check_sdata_in_driver(sdata))
return;
if (local->ops->abort_pmsr)
local->ops->abort_pmsr(&local->hw, &sdata->vif, request);
trace_drv_return_void(local);
}
static inline int drv_start_nan(struct ieee80211_local *local, static inline int drv_start_nan(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata, struct ieee80211_sub_if_data *sdata,
struct cfg80211_nan_conf *conf) struct cfg80211_nan_conf *conf)
......
...@@ -1882,6 +1882,18 @@ TRACE_EVENT(drv_del_nan_func, ...@@ -1882,6 +1882,18 @@ TRACE_EVENT(drv_del_nan_func,
) )
); );
DEFINE_EVENT(local_sdata_evt, drv_start_pmsr,
TP_PROTO(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata),
TP_ARGS(local, sdata)
);
DEFINE_EVENT(local_sdata_evt, drv_abort_pmsr,
TP_PROTO(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata),
TP_ARGS(local, sdata)
);
/* /*
* Tracing for API calls that drivers call. * Tracing for API calls that drivers call.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment