1340f2ab8SBenjamin Berg // SPDX-License-Identifier: GPL-2.0-only 2340f2ab8SBenjamin Berg /* 3340f2ab8SBenjamin Berg * mac80211_hwsim - software simulator of 802.11 radio(s) for mac80211 4340f2ab8SBenjamin Berg * Copyright (c) 2008, Jouni Malinen <j@w1.fi> 5340f2ab8SBenjamin Berg * Copyright (c) 2011, Javier Lopez <jlopex@gmail.com> 6340f2ab8SBenjamin Berg * Copyright (c) 2016 - 2017 Intel Deutschland GmbH 729de2775SDaniel Gabay * Copyright (C) 2018 - 2026 Intel Corporation 8340f2ab8SBenjamin Berg */ 9340f2ab8SBenjamin Berg 10340f2ab8SBenjamin Berg #ifndef __MAC80211_HWSIM_I_H 11340f2ab8SBenjamin Berg #define __MAC80211_HWSIM_I_H 12340f2ab8SBenjamin Berg 13340f2ab8SBenjamin Berg #include <net/mac80211.h> 14340f2ab8SBenjamin Berg #include "mac80211_hwsim.h" 15340f2ab8SBenjamin Berg #include "mac80211_hwsim_nan.h" 16340f2ab8SBenjamin Berg 17*a6ea8948SDaniel Gabay struct hwsim_sta_nan_sched { 18*a6ea8948SDaniel Gabay /* Later members are protected by this lock */ 19*a6ea8948SDaniel Gabay spinlock_t lock; 20*a6ea8948SDaniel Gabay u16 committed_dw; 21*a6ea8948SDaniel Gabay struct { 22*a6ea8948SDaniel Gabay u8 map_id; 23*a6ea8948SDaniel Gabay struct cfg80211_chan_def chans[CFG80211_NAN_SCHED_NUM_TIME_SLOTS]; 24*a6ea8948SDaniel Gabay } maps[CFG80211_NAN_MAX_PEER_MAPS]; 25*a6ea8948SDaniel Gabay }; 26*a6ea8948SDaniel Gabay 27*a6ea8948SDaniel Gabay struct hwsim_sta_priv { 28*a6ea8948SDaniel Gabay u32 magic; 29*a6ea8948SDaniel Gabay unsigned int last_link; 30*a6ea8948SDaniel Gabay u16 active_links_rx; 31*a6ea8948SDaniel Gabay 32*a6ea8948SDaniel Gabay /* NAN peer schedule - must be accessed under nan_sched.lock */ 33*a6ea8948SDaniel Gabay struct hwsim_sta_nan_sched nan_sched; 34*a6ea8948SDaniel Gabay }; 35*a6ea8948SDaniel Gabay 36*a6ea8948SDaniel Gabay #define HWSIM_STA_MAGIC 0x6d537749 37*a6ea8948SDaniel Gabay 38340f2ab8SBenjamin Berg struct mac80211_hwsim_link_data { 39340f2ab8SBenjamin Berg u32 link_id; 40340f2ab8SBenjamin Berg u64 beacon_int /* beacon interval in us */; 41340f2ab8SBenjamin Berg struct hrtimer beacon_timer; 42340f2ab8SBenjamin Berg }; 43340f2ab8SBenjamin Berg 44340f2ab8SBenjamin Berg #define HWSIM_NUM_CHANNELS_2GHZ 14 45340f2ab8SBenjamin Berg #define HWSIM_NUM_CHANNELS_5GHZ 40 46340f2ab8SBenjamin Berg #define HWSIM_NUM_CHANNELS_6GHZ 59 47340f2ab8SBenjamin Berg #define HWSIM_NUM_S1G_CHANNELS_US 51 48340f2ab8SBenjamin Berg #define HWSIM_NUM_RATES 12 49340f2ab8SBenjamin Berg #define HWSIM_NUM_CIPHERS 11 50340f2ab8SBenjamin Berg 51340f2ab8SBenjamin Berg struct mac80211_hwsim_data { 52340f2ab8SBenjamin Berg struct list_head list; 53340f2ab8SBenjamin Berg struct rhash_head rht; 54340f2ab8SBenjamin Berg struct ieee80211_hw *hw; 55340f2ab8SBenjamin Berg struct device *dev; 56340f2ab8SBenjamin Berg struct ieee80211_supported_band bands[NUM_NL80211_BANDS]; 57340f2ab8SBenjamin Berg struct ieee80211_channel channels_2ghz[HWSIM_NUM_CHANNELS_2GHZ]; 58340f2ab8SBenjamin Berg struct ieee80211_channel channels_5ghz[HWSIM_NUM_CHANNELS_5GHZ]; 59340f2ab8SBenjamin Berg struct ieee80211_channel channels_6ghz[HWSIM_NUM_CHANNELS_6GHZ]; 60340f2ab8SBenjamin Berg struct ieee80211_channel channels_s1g[HWSIM_NUM_S1G_CHANNELS_US]; 61340f2ab8SBenjamin Berg struct ieee80211_rate rates[HWSIM_NUM_RATES]; 62340f2ab8SBenjamin Berg struct ieee80211_iface_combination if_combination; 6329de2775SDaniel Gabay struct ieee80211_iface_limit if_limits[5]; 64340f2ab8SBenjamin Berg int n_if_limits; 65340f2ab8SBenjamin Berg /* Storage space for channels, etc. */ 66340f2ab8SBenjamin Berg struct mac80211_hwsim_phy_data *phy_data; 67340f2ab8SBenjamin Berg 68340f2ab8SBenjamin Berg struct ieee80211_iface_combination if_combination_radio; 69340f2ab8SBenjamin Berg struct wiphy_radio_freq_range radio_range[NUM_NL80211_BANDS]; 70340f2ab8SBenjamin Berg struct wiphy_radio radio[NUM_NL80211_BANDS]; 71340f2ab8SBenjamin Berg 72340f2ab8SBenjamin Berg u32 ciphers[HWSIM_NUM_CIPHERS]; 73340f2ab8SBenjamin Berg 74340f2ab8SBenjamin Berg struct mac_address addresses[3]; 75340f2ab8SBenjamin Berg int channels, idx; 76340f2ab8SBenjamin Berg bool use_chanctx; 77340f2ab8SBenjamin Berg bool destroy_on_close; 78340f2ab8SBenjamin Berg u32 portid; 79340f2ab8SBenjamin Berg char alpha2[2]; 80340f2ab8SBenjamin Berg const struct ieee80211_regdomain *regd; 81340f2ab8SBenjamin Berg 82340f2ab8SBenjamin Berg struct ieee80211_channel *tmp_chan; 83340f2ab8SBenjamin Berg struct ieee80211_channel *roc_chan; 84340f2ab8SBenjamin Berg u32 roc_duration; 85340f2ab8SBenjamin Berg struct delayed_work roc_start; 86340f2ab8SBenjamin Berg struct delayed_work roc_done; 87340f2ab8SBenjamin Berg struct delayed_work hw_scan; 88340f2ab8SBenjamin Berg struct cfg80211_scan_request *hw_scan_request; 89340f2ab8SBenjamin Berg struct ieee80211_vif *hw_scan_vif; 90340f2ab8SBenjamin Berg int scan_chan_idx; 91340f2ab8SBenjamin Berg u8 scan_addr[ETH_ALEN]; 92340f2ab8SBenjamin Berg struct { 93340f2ab8SBenjamin Berg struct ieee80211_channel *channel; 94340f2ab8SBenjamin Berg unsigned long next_start, start, end; 95340f2ab8SBenjamin Berg } survey_data[HWSIM_NUM_CHANNELS_2GHZ + 96340f2ab8SBenjamin Berg HWSIM_NUM_CHANNELS_5GHZ + 97340f2ab8SBenjamin Berg HWSIM_NUM_CHANNELS_6GHZ]; 98340f2ab8SBenjamin Berg 99340f2ab8SBenjamin Berg struct ieee80211_channel *channel; 100340f2ab8SBenjamin Berg enum nl80211_chan_width bw; 101340f2ab8SBenjamin Berg unsigned int rx_filter; 102340f2ab8SBenjamin Berg bool started, idle, scanning; 103340f2ab8SBenjamin Berg struct mutex mutex; 104340f2ab8SBenjamin Berg enum ps_mode { 105340f2ab8SBenjamin Berg PS_DISABLED, PS_ENABLED, PS_AUTO_POLL, PS_MANUAL_POLL 106340f2ab8SBenjamin Berg } ps; 107340f2ab8SBenjamin Berg bool ps_poll_pending; 108340f2ab8SBenjamin Berg struct dentry *debugfs; 109340f2ab8SBenjamin Berg struct cfg80211_chan_def radar_background_chandef; 110340f2ab8SBenjamin Berg 111340f2ab8SBenjamin Berg atomic_t pending_cookie; 112340f2ab8SBenjamin Berg struct sk_buff_head pending; /* packets pending */ 113340f2ab8SBenjamin Berg /* 114340f2ab8SBenjamin Berg * Only radios in the same group can communicate together (the 115340f2ab8SBenjamin Berg * channel has to match too). Each bit represents a group. A 116340f2ab8SBenjamin Berg * radio can be in more than one group. 117340f2ab8SBenjamin Berg */ 118340f2ab8SBenjamin Berg u64 group; 119340f2ab8SBenjamin Berg 120340f2ab8SBenjamin Berg /* group shared by radios created in the same netns */ 121340f2ab8SBenjamin Berg int netgroup; 122340f2ab8SBenjamin Berg /* wmediumd portid responsible for netgroup of this radio */ 123340f2ab8SBenjamin Berg u32 wmediumd; 124340f2ab8SBenjamin Berg 125340f2ab8SBenjamin Berg /* difference between this hw's clock and the real clock, in usecs */ 126d7b0798fSBenjamin Berg spinlock_t tsf_offset_lock; 127340f2ab8SBenjamin Berg s64 tsf_offset; 128340f2ab8SBenjamin Berg 129340f2ab8SBenjamin Berg /* Stats */ 130340f2ab8SBenjamin Berg u64 tx_pkts; 131340f2ab8SBenjamin Berg u64 rx_pkts; 132340f2ab8SBenjamin Berg u64 tx_bytes; 133340f2ab8SBenjamin Berg u64 rx_bytes; 134340f2ab8SBenjamin Berg u64 tx_dropped; 135340f2ab8SBenjamin Berg u64 tx_failed; 136340f2ab8SBenjamin Berg 137340f2ab8SBenjamin Berg /* RSSI in rx status of the receiver */ 138340f2ab8SBenjamin Berg int rx_rssi; 139340f2ab8SBenjamin Berg 140340f2ab8SBenjamin Berg /* only used when pmsr capability is supplied */ 141340f2ab8SBenjamin Berg struct cfg80211_pmsr_capabilities pmsr_capa; 142340f2ab8SBenjamin Berg struct cfg80211_pmsr_request *pmsr_request; 143340f2ab8SBenjamin Berg struct wireless_dev *pmsr_request_wdev; 144340f2ab8SBenjamin Berg 145340f2ab8SBenjamin Berg struct mac80211_hwsim_link_data link_data[IEEE80211_MLD_MAX_NUM_LINKS]; 146340f2ab8SBenjamin Berg 147340f2ab8SBenjamin Berg struct mac80211_hwsim_nan_data nan; 148340f2ab8SBenjamin Berg }; 149340f2ab8SBenjamin Berg 150340f2ab8SBenjamin Berg extern spinlock_t hwsim_radio_lock; 151340f2ab8SBenjamin Berg extern struct list_head hwsim_radios; 152340f2ab8SBenjamin Berg 153df0cb6e2SBenjamin Berg ktime_t mac80211_hwsim_tsf_to_boottime(struct mac80211_hwsim_data *data, 154df0cb6e2SBenjamin Berg u64 tsf); 155df0cb6e2SBenjamin Berg u64 mac80211_hwsim_boottime_to_tsf(struct mac80211_hwsim_data *data, 156df0cb6e2SBenjamin Berg ktime_t ts); 157df0cb6e2SBenjamin Berg 158340f2ab8SBenjamin Berg u64 mac80211_hwsim_get_tsf(struct ieee80211_hw *hw, 159340f2ab8SBenjamin Berg struct ieee80211_vif *vif); 160340f2ab8SBenjamin Berg 16142d3002bSBenjamin Berg void mac80211_hwsim_tx_frame(struct ieee80211_hw *hw, 16242d3002bSBenjamin Berg struct sk_buff *skb, 16342d3002bSBenjamin Berg struct ieee80211_channel *chan); 16442d3002bSBenjamin Berg 165f9aeb3a2SBenjamin Berg void ieee80211_hwsim_wake_tx_queue(struct ieee80211_hw *hw, 166f9aeb3a2SBenjamin Berg struct ieee80211_txq *txq); 167f9aeb3a2SBenjamin Berg 168340f2ab8SBenjamin Berg #endif /* __MAC80211_HWSIM_I_H */ 169