Commit 1ccfd8db authored by Andrei Otcheretianski's avatar Andrei Otcheretianski Committed by Johannes Berg
Browse files

wifi: cfg80211: Add cluster joined notification APIs



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: default avatarAndrei Otcheretianski <andrei.otcheretianski@intel.com>
Signed-off-by: default avatarMiri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250908140015.ad27b7b6e4d9.I70b213a2a49f18d1ba2ad325e67e8eff51cc7a1f@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent ba9b2cea
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -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
+8 −0
Original line number Diff line number Diff line
@@ -1357,6 +1357,9 @@
 *	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 */

+41 −0
Original line number Diff line number Diff line
@@ -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)
+19 −0
Original line number Diff line number Diff line
@@ -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