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: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
9bb7e0f24e
commit
cee7013be9
|
@ -3623,6 +3623,9 @@ enum ieee80211_reconfig_type {
|
|||
* 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.
|
||||
* 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 {
|
||||
void (*tx)(struct ieee80211_hw *hw,
|
||||
|
@ -3911,6 +3914,10 @@ struct ieee80211_ops {
|
|||
int (*get_ftm_responder_stats)(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
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,
|
|||
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 = {
|
||||
.add_virtual_intf = ieee80211_add_iface,
|
||||
.del_virtual_intf = ieee80211_del_iface,
|
||||
|
@ -3944,4 +3964,6 @@ const struct cfg80211_ops mac80211_config_ops = {
|
|||
.tx_control_port = ieee80211_tx_control_port,
|
||||
.get_txq_stats = ieee80211_get_txq_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,
|
|||
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,
|
||||
struct ieee80211_sub_if_data *sdata,
|
||||
struct cfg80211_nan_conf *conf)
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue