]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: cfg80211: Add cluster joined notification APIs
authorAndrei Otcheretianski <andrei.otcheretianski@intel.com>
Mon, 8 Sep 2025 11:12:57 +0000 (14:12 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 19 Sep 2025 09:26:21 +0000 (11:26 +0200)
The drivers should notify upper layers and user space when a NAN device
joins a cluster. This is needed, for example, to set the correct addr3
in SDF frames. Add API to report cluster join event.

Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250908140015.ad27b7b6e4d9.I70b213a2a49f18d1ba2ad325e67e8eff51cc7a1f@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
include/uapi/linux/nl80211.h
net/wireless/nl80211.c
net/wireless/trace.h

index 0c1311d254be12d3b5da59b2a43b30321f2a97cd..1b10bd31bdd6c0c179dd00dc28dd77a2461210c6 100644 (file)
@@ -10074,6 +10074,20 @@ void cfg80211_epcs_changed(struct net_device *netdev, bool enabled);
 void cfg80211_next_nan_dw_notif(struct wireless_dev *wdev,
                                struct ieee80211_channel *chan, gfp_t gfp);
 
+/**
+ * cfg80211_nan_cluster_joined - Notify about NAN cluster join
+ * @wdev: Pointer to the wireless device structure
+ * @cluster_id: Cluster ID of the NAN cluster that was joined or started
+ * @new_cluster: Indicates if this is a new cluster or an existing one
+ * @gfp: Memory allocation flags
+ *
+ * This function is used to notify user space when a NAN cluster has been
+ * joined, providing the cluster ID and a flag whether it is a new cluster.
+ */
+void cfg80211_nan_cluster_joined(struct wireless_dev *wdev,
+                                const u8 *cluster_id, bool new_cluster,
+                                gfp_t gfp);
+
 #ifdef CONFIG_CFG80211_DEBUGFS
 /**
  * wiphy_locked_debugfs_read - do a locked read in debugfs
index d674608e2635df1f879fa6ea695031df050453a2..c5a7658b7297092d8e02cc8c840471f3f4729a56 100644 (file)
  *     the device/driver shall take care of the actual transmission timing.
  *     This notification is only sent to the NAN interface owning socket
  *     (see %NL80211_ATTR_SOCKET_OWNER flag).
+ * @NL80211_CMD_NAN_CLUSTER_JOINED: This command is used to notify
+ *     user space that the NAN new cluster has been joined. The cluster ID is
+ *     indicated by %NL80211_ATTR_MAC.
  *
  * @NL80211_CMD_MAX: highest used command number
  * @__NL80211_CMD_AFTER_LAST: internal use
@@ -1619,6 +1622,7 @@ enum nl80211_commands {
        NL80211_CMD_EPCS_CFG,
 
        NL80211_CMD_NAN_NEXT_DW_NOTIFICATION,
+       NL80211_CMD_NAN_CLUSTER_JOINED,
 
        /* add new commands above here */
 
@@ -2957,6 +2961,9 @@ enum nl80211_commands {
  *     %NL80211_CMD_START_NAN and %NL80211_CMD_CHANGE_NAN_CONFIG.
  *     See &enum nl80211_nan_conf_attributes for details.
  *     This attribute is optional.
+ * @NL80211_ATTR_NAN_NEW_CLUSTER: Flag attribute indicating that a new
+ *     NAN cluster has been created. This is used with
+ *     %NL80211_CMD_NAN_CLUSTER_JOINED
  *
  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
  * @NL80211_ATTR_MAX: highest attribute number currently defined
@@ -3521,6 +3528,7 @@ enum nl80211_attrs {
        NL80211_ATTR_S1G_SHORT_BEACON,
        NL80211_ATTR_BSS_PARAM,
        NL80211_ATTR_NAN_CONFIG,
+       NL80211_ATTR_NAN_NEW_CLUSTER,
 
        /* add attributes here, update the policy in nl80211.c */
 
index d64145746b65d6691cc049f024f8aa0ae6d5e62e..904a725a4f4ab8a26df0d85d22f9894fad383496 100644 (file)
@@ -21809,6 +21809,47 @@ void cfg80211_next_nan_dw_notif(struct wireless_dev *wdev,
 }
 EXPORT_SYMBOL(cfg80211_next_nan_dw_notif);
 
+void cfg80211_nan_cluster_joined(struct wireless_dev *wdev,
+                                const u8 *cluster_id, bool new_cluster,
+                                gfp_t gfp)
+{
+       struct wiphy *wiphy = wdev->wiphy;
+       struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
+       struct sk_buff *msg;
+       void *hdr;
+
+       trace_cfg80211_nan_cluster_joined(wdev, cluster_id, new_cluster);
+
+       msg = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
+       if (!msg)
+               return;
+
+       hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_NAN_CLUSTER_JOINED);
+       if (!hdr)
+               goto nla_put_failure;
+
+       if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
+           nla_put_u64_64bit(msg, NL80211_ATTR_WDEV, wdev_id(wdev),
+                             NL80211_ATTR_PAD) ||
+           nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, cluster_id) ||
+           (new_cluster && nla_put_flag(msg, NL80211_ATTR_NAN_NEW_CLUSTER)))
+               goto nla_put_failure;
+
+       genlmsg_end(msg, hdr);
+
+       if (!wdev->owner_nlportid)
+               genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy),
+                                       msg, 0, NL80211_MCGRP_NAN, gfp);
+       else
+               genlmsg_unicast(wiphy_net(wiphy), msg,
+                               wdev->owner_nlportid);
+       return;
+
+ nla_put_failure:
+       nlmsg_free(msg);
+}
+EXPORT_SYMBOL(cfg80211_nan_cluster_joined);
+
 /* initialisation/exit functions */
 
 int __init nl80211_init(void)
index ff47e9bffd4fb5fb10deffa965102a017d719014..8a4c34112eb5ff4b7e70d7a1f5279192aad1fb0d 100644 (file)
@@ -4182,6 +4182,25 @@ TRACE_EVENT(cfg80211_next_nan_dw_notif,
                  WDEV_PR_ARG, CHAN_PR_ARG)
 );
 
+TRACE_EVENT(cfg80211_nan_cluster_joined,
+       TP_PROTO(struct wireless_dev *wdev,
+                const u8 *cluster_id,
+                bool new_cluster),
+       TP_ARGS(wdev, cluster_id, new_cluster),
+       TP_STRUCT__entry(
+               WDEV_ENTRY
+               MAC_ENTRY(cluster_id)
+               __field(bool, new_cluster)
+       ),
+       TP_fast_assign(
+               WDEV_ASSIGN;
+               MAC_ASSIGN(cluster_id, cluster_id);
+               __entry->new_cluster = new_cluster;
+       ),
+       TP_printk(WDEV_PR_FMT " cluster_id %pMF%s",
+                 WDEV_PR_ARG, __entry->cluster_id,
+                 __entry->new_cluster ? " [new]" : "")
+);
 #endif /* !__RDEV_OPS_TRACE || TRACE_HEADER_MULTI_READ */
 
 #undef TRACE_INCLUDE_PATH