xref: /linux/drivers/net/wireless/virtual/mac80211_hwsim_nan.h (revision 0eaed89c18aeedf0898baf2dbf5ff027c6795152)
1340f2ab8SBenjamin Berg // SPDX-License-Identifier: GPL-2.0-only
2340f2ab8SBenjamin Berg /*
3340f2ab8SBenjamin Berg  * mac80211_hwsim_nan - NAN software simulation for mac80211_hwsim
4a6ea8948SDaniel Gabay  * Copyright (C) 2025-2026 Intel Corporation
5340f2ab8SBenjamin Berg  */
6340f2ab8SBenjamin Berg 
7340f2ab8SBenjamin Berg #ifndef __MAC80211_HWSIM_NAN_H
8340f2ab8SBenjamin Berg #define __MAC80211_HWSIM_NAN_H
9340f2ab8SBenjamin Berg 
1042d3002bSBenjamin Berg enum mac80211_hwsim_nan_phase {
1142d3002bSBenjamin Berg 	MAC80211_HWSIM_NAN_PHASE_SCAN,
1242d3002bSBenjamin Berg 	MAC80211_HWSIM_NAN_PHASE_WARMUP,
1342d3002bSBenjamin Berg 	MAC80211_HWSIM_NAN_PHASE_UP,
1442d3002bSBenjamin Berg };
1542d3002bSBenjamin Berg 
1642d3002bSBenjamin Berg enum mac80211_hwsim_nan_role {
1742d3002bSBenjamin Berg 	MAC80211_HWSIM_NAN_ROLE_MASTER,
1842d3002bSBenjamin Berg 	MAC80211_HWSIM_NAN_ROLE_SYNC,
1942d3002bSBenjamin Berg 	MAC80211_HWSIM_NAN_ROLE_NON_SYNC,
2042d3002bSBenjamin Berg };
2142d3002bSBenjamin Berg 
22340f2ab8SBenjamin Berg struct mac80211_hwsim_nan_data {
23340f2ab8SBenjamin Berg 	struct ieee80211_vif *device_vif;
24340f2ab8SBenjamin Berg 	u8 bands;
25340f2ab8SBenjamin Berg 
26df0cb6e2SBenjamin Berg 	struct hrtimer slot_timer;
27f9aeb3a2SBenjamin Berg 	struct hrtimer resume_txqs_timer;
28340f2ab8SBenjamin Berg 	bool notify_dw;
2942d3002bSBenjamin Berg 
3042d3002bSBenjamin Berg 	struct hrtimer discovery_beacon_timer;
3142d3002bSBenjamin Berg 
3242d3002bSBenjamin Berg 	/* Later members are protected by this lock */
3342d3002bSBenjamin Berg 	spinlock_t state_lock;
3442d3002bSBenjamin Berg 
3542d3002bSBenjamin Berg 	u8 master_pref;
3642d3002bSBenjamin Berg 	u8 random_factor;
3742d3002bSBenjamin Berg 
3842d3002bSBenjamin Berg 	u8 random_factor_valid_dwst;
3942d3002bSBenjamin Berg 
4042d3002bSBenjamin Berg 	enum mac80211_hwsim_nan_phase phase;
4142d3002bSBenjamin Berg 	enum mac80211_hwsim_nan_role role;
4242d3002bSBenjamin Berg 
4342d3002bSBenjamin Berg 	u8 cluster_id[ETH_ALEN];
4442d3002bSBenjamin Berg 
4542d3002bSBenjamin Berg 	struct ieee80211_nan_anchor_master_info current_ami;
4642d3002bSBenjamin Berg 	struct ieee80211_nan_anchor_master_info last_ami;
4742d3002bSBenjamin Berg 
4842d3002bSBenjamin Berg 	/* Wi-Fi Aware version 4.0, section 3.3.6.1 and 3.3.6.2 */
4942d3002bSBenjamin Berg 	int master_transition_score;
5042d3002bSBenjamin Berg 	/* Wi-Fi Aware version 4.0, section 3.3.6.3 and 3.3.6.4 */
5142d3002bSBenjamin Berg 	int sync_transition_score;
5242d3002bSBenjamin Berg 
5342d3002bSBenjamin Berg 	bool tsf_adjusted;
5442d3002bSBenjamin Berg 	bool tsf_discontinuity;
55a6ea8948SDaniel Gabay 
56a6ea8948SDaniel Gabay 	/*
57a6ea8948SDaniel Gabay 	 * Local schedule - stores channel definition for each 16TU slot.
58a6ea8948SDaniel Gabay 	 * Derived from NMI vif->cfg.nan_schedule. chan == NULL means not
59a6ea8948SDaniel Gabay 	 * available in that slot (except DW which is implicit).
60a6ea8948SDaniel Gabay 	 */
61a6ea8948SDaniel Gabay 	struct cfg80211_chan_def local_sched[CFG80211_NAN_SCHED_NUM_TIME_SLOTS];
62340f2ab8SBenjamin Berg };
63340f2ab8SBenjamin Berg 
64340f2ab8SBenjamin Berg enum hrtimer_restart
65df0cb6e2SBenjamin Berg mac80211_hwsim_nan_slot_timer(struct hrtimer *timer);
66f9aeb3a2SBenjamin Berg enum hrtimer_restart
67f9aeb3a2SBenjamin Berg mac80211_hwsim_nan_resume_txqs_timer(struct hrtimer *timer);
6842d3002bSBenjamin Berg enum hrtimer_restart
6942d3002bSBenjamin Berg mac80211_hwsim_nan_discovery_beacon_timer(struct hrtimer *timer);
70340f2ab8SBenjamin Berg 
71340f2ab8SBenjamin Berg int mac80211_hwsim_nan_start(struct ieee80211_hw *hw,
72340f2ab8SBenjamin Berg 			     struct ieee80211_vif *vif,
73340f2ab8SBenjamin Berg 			     struct cfg80211_nan_conf *conf);
74340f2ab8SBenjamin Berg 
75340f2ab8SBenjamin Berg int mac80211_hwsim_nan_stop(struct ieee80211_hw *hw,
76340f2ab8SBenjamin Berg 			    struct ieee80211_vif *vif);
77340f2ab8SBenjamin Berg 
78340f2ab8SBenjamin Berg int mac80211_hwsim_nan_change_config(struct ieee80211_hw *hw,
79340f2ab8SBenjamin Berg 				     struct ieee80211_vif *vif,
80340f2ab8SBenjamin Berg 				     struct cfg80211_nan_conf *conf,
81340f2ab8SBenjamin Berg 				     u32 changes);
82340f2ab8SBenjamin Berg 
83a6ea8948SDaniel Gabay int mac80211_hwsim_nan_peer_sched_changed(struct ieee80211_hw *hw,
84a6ea8948SDaniel Gabay 					  struct ieee80211_sta *sta);
85a6ea8948SDaniel Gabay 
86f9aeb3a2SBenjamin Berg bool mac80211_hwsim_nan_txq_transmitting(struct ieee80211_hw *hw,
87f9aeb3a2SBenjamin Berg 					 struct ieee80211_txq *txq);
88f9aeb3a2SBenjamin Berg 
89*2c8ec5a9SDaniel Gabay void mac80211_hwsim_nan_get_tx_chandef(struct ieee80211_hw *hw,
90*2c8ec5a9SDaniel Gabay 				       struct cfg80211_chan_def *chandef);
9161de252fSBenjamin Berg 
924f4b0f4eSBenjamin Berg bool mac80211_hwsim_nan_receive(struct ieee80211_hw *hw,
934f4b0f4eSBenjamin Berg 				struct ieee80211_channel *channel,
944f4b0f4eSBenjamin Berg 				struct ieee80211_rx_status *rx_status);
954f4b0f4eSBenjamin Berg 
9642d3002bSBenjamin Berg void mac80211_hwsim_nan_rx(struct ieee80211_hw *hw,
9742d3002bSBenjamin Berg 			   struct sk_buff *skb);
9842d3002bSBenjamin Berg 
99a6ea8948SDaniel Gabay void mac80211_hwsim_nan_local_sched_changed(struct ieee80211_hw *hw,
100a6ea8948SDaniel Gabay 					    struct ieee80211_vif *vif);
101a6ea8948SDaniel Gabay 
102340f2ab8SBenjamin Berg #endif /* __MAC80211_HWSIM_NAN_H */
103