diff mbox series

[v4,3/3] cfg80211: Handle driver updated MU-EDCA params

Message ID 1682471052-3452-3-git-send-email-quic_msinada@quicinc.com
State Superseded
Headers show
Series [v4,1/3] wifi: cfg80211: allow userspace to enable driver control of MU-EDCA | expand

Commit Message

Muna Sinada April 26, 2023, 1:04 a.m. UTC
Add necessary functions and attributes to receive updated MU-EDCA
parameters from driver and send to user space, where management
frame are updated to reflect latest parameters.

The updated parameters from driver are part of an AP mode feature
where firmware determines better MU-EDCA parameters based on channel
conditions. The updated parameters are used and reported to user space
to reflect in AP management frames. These dynamic parameter updates
are offloaded to firmware for better user experience, thus details on
algorithm are not provided. This is a driver specific feature, thus
no spec references.

Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
---

v4: Added tracing and added nla policy for new nl attr

v3: modified commit message

---
 include/net/cfg80211.h       | 12 ++++++++++++
 include/uapi/linux/nl80211.h | 11 +++++++++++
 net/wireless/nl80211.c       | 40 ++++++++++++++++++++++++++++++++++++++++
 net/wireless/trace.h         | 40 ++++++++++++++++++++++++++++++++++++++++
 4 files changed, 103 insertions(+)

Comments

kernel test robot April 26, 2023, 6:44 p.m. UTC | #1
Hi Muna,

kernel test robot noticed the following build errors:

[auto build test ERROR on wireless-next/main]
[also build test ERROR on next-20230426]
[cannot apply to wireless/main linus/master v6.3]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Muna-Sinada/wifi-mac80211-allow-userspace-to-enable-driver-control-of-MU-EDCA/20230426-090616
base:   https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git main
patch link:    https://lore.kernel.org/r/1682471052-3452-3-git-send-email-quic_msinada%40quicinc.com
patch subject: [PATCH v4 3/3] cfg80211: Handle driver updated MU-EDCA params
config: sh-allmodconfig (https://download.01.org/0day-ci/archive/20230427/202304270204.JgVVdj2h-lkp@intel.com/config)
compiler: sh4-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/c9d6aeb60bf675df0acddaa0a54159955e761861
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Muna-Sinada/wifi-mac80211-allow-userspace-to-enable-driver-control-of-MU-EDCA/20230426-090616
        git checkout c9d6aeb60bf675df0acddaa0a54159955e761861
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=sh olddefconfig
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=sh SHELL=/bin/bash net/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>
| Link: https://lore.kernel.org/oe-kbuild-all/202304270204.JgVVdj2h-lkp@intel.com/

All errors (new ones prefixed by >>):

   In file included from include/trace/define_trace.h:102,
                    from net/wireless/trace.h:3995,
                    from net/wireless/trace.c:5:
   net/wireless/./trace.h: In function 'trace_event_raw_event_cfg80211_update_muedca_params_event':
>> include/trace/stages/stage6_event_callback.h:9:17: error: expected ';' before 'entry'
       9 | #define __entry entry
         |                 ^~~~~
   include/trace/trace_events.h:402:11: note: in definition of macro 'DECLARE_EVENT_CLASS'
     402 |         { assign; }                                                     \
         |           ^~~~~~
   include/trace/trace_events.h:44:30: note: in expansion of macro 'PARAMS'
      44 |                              PARAMS(assign),                   \
         |                              ^~~~~~
   net/wireless/./trace.h:3788:1: note: in expansion of macro 'TRACE_EVENT'
    3788 | TRACE_EVENT(cfg80211_update_muedca_params_event,
         | ^~~~~~~~~~~
   net/wireless/./trace.h:3808:9: note: in expansion of macro 'TP_fast_assign'
    3808 |         TP_fast_assign(
         |         ^~~~~~~~~~~~~~
   net/wireless/./trace.h:3811:17: note: in expansion of macro '__entry'
    3811 |                 __entry->be_aifsn = params->ac_be.aifsn
         |                 ^~~~~~~
   In file included from include/trace/define_trace.h:103:
   net/wireless/./trace.h: In function 'perf_trace_cfg80211_update_muedca_params_event':
>> include/trace/stages/stage6_event_callback.h:9:17: error: expected ';' before 'entry'
       9 | #define __entry entry
         |                 ^~~~~
   include/trace/perf.h:51:11: note: in definition of macro 'DECLARE_EVENT_CLASS'
      51 |         { assign; }                                                     \
         |           ^~~~~~
   include/trace/trace_events.h:44:30: note: in expansion of macro 'PARAMS'
      44 |                              PARAMS(assign),                   \
         |                              ^~~~~~
   net/wireless/./trace.h:3788:1: note: in expansion of macro 'TRACE_EVENT'
    3788 | TRACE_EVENT(cfg80211_update_muedca_params_event,
         | ^~~~~~~~~~~
   net/wireless/./trace.h:3808:9: note: in expansion of macro 'TP_fast_assign'
    3808 |         TP_fast_assign(
         |         ^~~~~~~~~~~~~~
   net/wireless/./trace.h:3811:17: note: in expansion of macro '__entry'
    3811 |                 __entry->be_aifsn = params->ac_be.aifsn
         |                 ^~~~~~~


vim +9 include/trace/stages/stage6_event_callback.h

92a22cea4c847b include/trace/stages/stage6_event_callback.h Steven Rostedt (Google  2023-01-24   7) 
af6b9668e85ffd include/trace/stages/stage6_defines.h        Steven Rostedt (Google  2022-03-03   8) #undef __entry
af6b9668e85ffd include/trace/stages/stage6_defines.h        Steven Rostedt (Google  2022-03-03  @9) #define __entry entry
af6b9668e85ffd include/trace/stages/stage6_defines.h        Steven Rostedt (Google  2022-03-03  10)
diff mbox series

Patch

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index e56af095828e..fe4f416b85e1 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -9070,4 +9070,16 @@  static inline int cfg80211_color_change_notify(struct net_device *dev)
 bool cfg80211_valid_disable_subchannel_bitmap(u16 *bitmap,
 					      const struct cfg80211_chan_def *chandef);
 
+/**
+ * cfg80211_update_muedca_params_event - Notify userspace about updated
+ *	MU-EDCA parameters
+ *
+ * @wiphy: the wiphy
+ * @params: Updated MU-EDCA parameters
+ * @gfp: allocation flags
+ */
+void cfg80211_update_muedca_params_event(struct wiphy *wiphy,
+					 const struct ieee80211_mu_edca_param_set *params,
+					 gfp_t gfp);
+
 #endif /* __NET_CFG80211_H */
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index e68169130e7e..51c8a94bc411 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -1309,6 +1309,11 @@ 
  *	The number of peers that HW timestamping can be enabled for concurrently
  *	is indicated by %NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS.
  *
+ * @NL80211_CMD_UPDATE_HE_MUEDCA_PARAMS: Updated MU-EDCA parameters from
+ *	driver. This event is used to update dynamic MU-EDCA parameters in
+ *	management frames, coming from driver and now need to be reflected in
+ *	management frames.
+ *
  * @NL80211_CMD_MAX: highest used command number
  * @__NL80211_CMD_AFTER_LAST: internal use
  */
@@ -1562,6 +1567,8 @@  enum nl80211_commands {
 
 	NL80211_CMD_SET_HW_TIMESTAMP,
 
+	NL80211_CMD_UPDATE_HE_MUEDCA_PARAMS,
+
 	/* add new commands above here */
 
 	/* used to define NL80211_CMD_MAX below */
@@ -2807,6 +2814,9 @@  enum nl80211_commands {
  *
  * @NL80211_ATTR_DYN_MUEDCA_ENABLE: Flag attribute to indicate user space has
  *  enabled Driver control of dynamically updating MU-EDCA parameters.
+ * @NL80211_ATTR_HE_MUEDCA_PARAMS: MU-EDCA AC parameters for the
+ *	%NL80211_CMD_UPDATE_HE_MUEDCA_PARAMS command in format described in
+ *	P802.11ax_D4.0 section 9.4.2.245
  *
  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
  * @NL80211_ATTR_MAX: highest attribute number currently defined
@@ -3345,6 +3355,7 @@  enum nl80211_attrs {
 	NL80211_ATTR_EMA_RNR_ELEMS,
 
 	NL80211_ATTR_DYN_MUEDCA_ENABLE,
+	NL80211_ATTR_HE_MUEDCA_PARAMS,
 
 	/* add attributes here, update the policy in nl80211.c */
 
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index e9e939706630..af36440f2a51 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -816,6 +816,8 @@  static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
 	[NL80211_ATTR_HW_TIMESTAMP_ENABLED] = { .type = NLA_FLAG },
 	[NL80211_ATTR_EMA_RNR_ELEMS] = { .type = NLA_NESTED },
 	[NL80211_ATTR_DYN_MUEDCA_ENABLE] = { .type = NLA_FLAG },
+	[NL80211_ATTR_HE_MUEDCA_PARAMS] =
+	       NLA_POLICY_EXACT_LEN(sizeof(struct ieee80211_mu_edca_param_set)),
 };
 
 /* policy for the key attributes */
@@ -20017,6 +20019,44 @@  void cfg80211_update_owe_info_event(struct net_device *netdev,
 }
 EXPORT_SYMBOL(cfg80211_update_owe_info_event);
 
+void
+cfg80211_update_muedca_params_event(struct wiphy *wiphy,
+				    const struct ieee80211_mu_edca_param_set *params,
+				    gfp_t gfp)
+{
+	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
+	struct sk_buff *msg;
+	void *hdr;
+
+	trace_cfg80211_update_muedca_params_event(wiphy, params);
+
+	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
+	if (!msg)
+		return;
+
+	hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_UPDATE_HE_MUEDCA_PARAMS);
+	if (!hdr)
+		goto nla_put_failure;
+
+	if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx))
+		goto nla_put_failure;
+
+	if (nla_put(msg, NL80211_ATTR_HE_MUEDCA_PARAMS,
+		    sizeof(*params), params))
+		goto nla_put_failure;
+
+	genlmsg_end(msg, hdr);
+
+	genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
+				NL80211_MCGRP_MLME, gfp);
+	return;
+
+nla_put_failure:
+	genlmsg_cancel(msg, hdr);
+	nlmsg_free(msg);
+}
+EXPORT_SYMBOL(cfg80211_update_muedca_params_event);
+
 /* initialisation/exit functions */
 
 int __init nl80211_init(void)
diff --git a/net/wireless/trace.h b/net/wireless/trace.h
index 716a1fa70069..6b2c0c3b9ba9 100644
--- a/net/wireless/trace.h
+++ b/net/wireless/trace.h
@@ -3785,6 +3785,46 @@  TRACE_EVENT(cfg80211_update_owe_info_event,
 		  __entry->assoc_link_id, __entry->peer_mld_addr)
 );
 
+TRACE_EVENT(cfg80211_update_muedca_params_event,
+	TP_PROTO(struct wiphy *wiphy,
+		 const struct ieee80211_mu_edca_param_set *params),
+	TP_ARGS(wiphy, params),
+	TP_STRUCT__entry(
+		WIPHY_ENTRY
+		__field(u8, mu_qos_info)
+		__field(u8, be_aifsn)
+		__field(u8, be_ecw_min_max)
+		__field(u8, be_mu_edca_timer)
+		__field(u8, bk_aifsn)
+		__field(u8, bk_ecw_min_max)
+		__field(u8, bk_mu_edca_timer)
+		__field(u8, vi_aifsn)
+		__field(u8, vi_ecw_min_max)
+		__field(u8, vi_mu_edca_timer)
+		__field(u8, vo_aifsn)
+		__field(u8, vo_ecw_min_max)
+		__field(u8, vo_mu_edca_timer)
+	),
+	TP_fast_assign(
+		WIPHY_ASSIGN;
+		__entry->mu_qos_info = params->mu_qos_info
+		__entry->be_aifsn = params->ac_be.aifsn
+		__entry->be_ecw_min_max = params->ac_be.ecw_min_max
+		__entry->be_mu_edca_timer = params->ac_be.mu_edca_timer
+		__entry->bk_aifsn = params->ac_bk.aifsn
+		__entry->bk_ecw_min_max = params->ac_bk.ecw_min_max
+		__entry->bk_mu_edca_timer = params->ac_bk.mu_edca_timer
+		__entry->vi_aifsn = params->ac_vi.aifsn
+		__entry->vi_ecw_min_max = params->ac_vi.ecw_min_max
+		__entry->vi_mu_edca_timer = params->ac_vi.mu_edca_timer
+		__entry->vo_aifsn = params->ac_vo.aifsn
+		__entry->vo_ecw_min_max = params->ac_vo.ecw_min_max
+		__entry->vo_mu_edca_timer = params->ac_vo.mu_edca_timer
+	),
+	TP_printk(WIPHY_PR_FMT ", MU QOS info: %u", WIPHY_PR_ARG,
+		  __entry->mu_qos_info)
+);
+
 TRACE_EVENT(cfg80211_bss_color_notify,
 	TP_PROTO(struct net_device *netdev,
 		 enum nl80211_commands cmd,