wt., 16 lis 2021 o 12:46 Lorenzo Bianconi <lorenzo@xxxxxxxxxx> napisał(a): > > If necessary schedule offchan_cac_abort_wk work in cfg80211_radar_event > routine adding offchan parameter to cfg80211_radar_event signature. > Rename cfg80211_radar_event in __cfg80211_radar_event and introduce > the two following inline helpers: > - cfg80211_radar_event > - cfg80211_offchan_radar_event > Doing so the drv will not need to run cfg80211_offchan_cac_abort() after > radar detection on the offchannel chain. > > Tested-by: Owen Peng <owen.peng@xxxxxxxxxxxx> > Signed-off-by: Lorenzo Bianconi <lorenzo@xxxxxxxxxx> > --- > include/net/cfg80211.h | 24 +++++++++++++++++++++--- > net/wireless/mlme.c | 16 ++++++++++------ > net/wireless/trace.h | 11 +++++++---- > 3 files changed, 38 insertions(+), 13 deletions(-) > BTW, if we don't have user for this yet, maybe we should change name offchannel -> background. In ETSI spec https://www.etsi.org/deliver/etsi_en/301800_301899/301893/02.01.01_60/en_301893v020101p.pdf we have off-channel CAC defined little bit different: "Off-Channel CAC is performed by a number of non-continuous checks spread over a period in time. This period, which is required to determine the presence of radar signals, is defined as the Off-Channel CAC Time." And: "Minimum Off-Channel CAC Time 6 minutes (see note 2) Maximum Off-Channel CAC Time 4 hours (see note 2)" So, your implementation simple run "background CAC" - use one (or more) chain for that. BR Janusz > diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h > index 362da9f6bf39..a887086cb103 100644 > --- a/include/net/cfg80211.h > +++ b/include/net/cfg80211.h > @@ -7605,15 +7605,33 @@ void cfg80211_cqm_txe_notify(struct net_device *dev, const u8 *peer, > void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp); > > /** > - * cfg80211_radar_event - radar detection event > + * __cfg80211_radar_event - radar detection event > * @wiphy: the wiphy > * @chandef: chandef for the current channel > + * @offchan: the radar has been detected on the offchannel chain > * @gfp: context flags > * > * This function is called when a radar is detected on the current chanenl. > */ > -void cfg80211_radar_event(struct wiphy *wiphy, > - struct cfg80211_chan_def *chandef, gfp_t gfp); > +void __cfg80211_radar_event(struct wiphy *wiphy, > + struct cfg80211_chan_def *chandef, > + bool offchan, gfp_t gfp); > + > +static inline void > +cfg80211_radar_event(struct wiphy *wiphy, > + struct cfg80211_chan_def *chandef, > + gfp_t gfp) > +{ > + __cfg80211_radar_event(wiphy, chandef, false, gfp); > +} > + > +static inline void > +cfg80211_offchan_radar_event(struct wiphy *wiphy, > + struct cfg80211_chan_def *chandef, > + gfp_t gfp) > +{ > + __cfg80211_radar_event(wiphy, chandef, true, gfp); > +} > > /** > * cfg80211_sta_opmode_change_notify - STA's ht/vht operation mode change event > diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c > index ac2e5e732d94..450be1ec70b8 100644 > --- a/net/wireless/mlme.c > +++ b/net/wireless/mlme.c > @@ -905,13 +905,13 @@ void cfg80211_dfs_channels_update_work(struct work_struct *work) > } > > > -void cfg80211_radar_event(struct wiphy *wiphy, > - struct cfg80211_chan_def *chandef, > - gfp_t gfp) > +void __cfg80211_radar_event(struct wiphy *wiphy, > + struct cfg80211_chan_def *chandef, > + bool offchan, gfp_t gfp) > { > struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); > > - trace_cfg80211_radar_event(wiphy, chandef); > + trace_cfg80211_radar_event(wiphy, chandef, offchan); > > /* only set the chandef supplied channel to unavailable, in > * case the radar is detected on only one of multiple channels > @@ -919,6 +919,9 @@ void cfg80211_radar_event(struct wiphy *wiphy, > */ > cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_UNAVAILABLE); > > + if (offchan) > + queue_work(cfg80211_wq, &rdev->offchan_cac_abort_wk); > + > cfg80211_sched_dfs_chan_update(rdev); > > nl80211_radar_notify(rdev, chandef, NL80211_RADAR_DETECTED, NULL, gfp); > @@ -926,7 +929,7 @@ void cfg80211_radar_event(struct wiphy *wiphy, > memcpy(&rdev->radar_chandef, chandef, sizeof(struct cfg80211_chan_def)); > queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk); > } > -EXPORT_SYMBOL(cfg80211_radar_event); > +EXPORT_SYMBOL(__cfg80211_radar_event); > > void cfg80211_cac_event(struct net_device *netdev, > const struct cfg80211_chan_def *chandef, > @@ -998,7 +1001,8 @@ __cfg80211_offchan_cac_event(struct cfg80211_registered_device *rdev, > rdev->offchan_radar_wdev = NULL; > break; > case NL80211_RADAR_CAC_ABORTED: > - cancel_delayed_work(&rdev->offchan_cac_done_wk); > + if (!cancel_delayed_work(&rdev->offchan_cac_done_wk)) > + return; > wdev = rdev->offchan_radar_wdev; > rdev->offchan_radar_wdev = NULL; > break; > diff --git a/net/wireless/trace.h b/net/wireless/trace.h > index 0b27eaa14a18..e854d52db1a6 100644 > --- a/net/wireless/trace.h > +++ b/net/wireless/trace.h > @@ -3053,18 +3053,21 @@ TRACE_EVENT(cfg80211_ch_switch_started_notify, > ); > > TRACE_EVENT(cfg80211_radar_event, > - TP_PROTO(struct wiphy *wiphy, struct cfg80211_chan_def *chandef), > - TP_ARGS(wiphy, chandef), > + TP_PROTO(struct wiphy *wiphy, struct cfg80211_chan_def *chandef, > + bool offchan), > + TP_ARGS(wiphy, chandef, offchan), > TP_STRUCT__entry( > WIPHY_ENTRY > CHAN_DEF_ENTRY > + __field(bool, offchan) > ), > TP_fast_assign( > WIPHY_ASSIGN; > CHAN_DEF_ASSIGN(chandef); > + __entry->offchan = offchan; > ), > - TP_printk(WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT, > - WIPHY_PR_ARG, CHAN_DEF_PR_ARG) > + TP_printk(WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT ", offchan %d", > + WIPHY_PR_ARG, CHAN_DEF_PR_ARG, __entry->offchan) > ); > > TRACE_EVENT(cfg80211_cac_event, > -- > 2.31.1 > -- Janusz Dziedzic