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