// SPDX-License-Identifier: GPL-2.0-only /* * mac80211_hwsim - software simulator of 802.11 radio(s) for mac80211 * Copyright (c) 2008, Jouni Malinen * Copyright (c) 2011, Javier Lopez * Copyright (c) 2016 - 2017 Intel Deutschland GmbH * Copyright (C) 2018 - 2026 Intel Corporation */ #ifndef __MAC80211_HWSIM_I_H #define __MAC80211_HWSIM_I_H #include #include "mac80211_hwsim.h" #include "mac80211_hwsim_nan.h" struct hwsim_sta_nan_sched { /* Later members are protected by this lock */ spinlock_t lock; u16 committed_dw; struct { u8 map_id; struct cfg80211_chan_def chans[CFG80211_NAN_SCHED_NUM_TIME_SLOTS]; } maps[CFG80211_NAN_MAX_PEER_MAPS]; }; struct hwsim_sta_priv { u32 magic; unsigned int last_link; u16 active_links_rx; /* NAN peer schedule - must be accessed under nan_sched.lock */ struct hwsim_sta_nan_sched nan_sched; }; #define HWSIM_STA_MAGIC 0x6d537749 struct mac80211_hwsim_link_data { u32 link_id; u64 beacon_int /* beacon interval in us */; struct hrtimer beacon_timer; }; #define HWSIM_NUM_CHANNELS_2GHZ 14 #define HWSIM_NUM_CHANNELS_5GHZ 40 #define HWSIM_NUM_CHANNELS_6GHZ 59 #define HWSIM_NUM_S1G_CHANNELS_US 51 #define HWSIM_NUM_RATES 12 #define HWSIM_NUM_CIPHERS 11 struct mac80211_hwsim_data { struct list_head list; struct rhash_head rht; struct ieee80211_hw *hw; struct device *dev; struct ieee80211_supported_band bands[NUM_NL80211_BANDS]; struct ieee80211_channel channels_2ghz[HWSIM_NUM_CHANNELS_2GHZ]; struct ieee80211_channel channels_5ghz[HWSIM_NUM_CHANNELS_5GHZ]; struct ieee80211_channel channels_6ghz[HWSIM_NUM_CHANNELS_6GHZ]; struct ieee80211_channel channels_s1g[HWSIM_NUM_S1G_CHANNELS_US]; struct ieee80211_rate rates[HWSIM_NUM_RATES]; struct ieee80211_iface_combination if_combination; struct ieee80211_iface_limit if_limits[5]; int n_if_limits; /* Storage space for channels, etc. */ struct mac80211_hwsim_phy_data *phy_data; struct ieee80211_iface_combination if_combination_radio; struct wiphy_radio_freq_range radio_range[NUM_NL80211_BANDS]; struct wiphy_radio radio[NUM_NL80211_BANDS]; u32 ciphers[HWSIM_NUM_CIPHERS]; struct mac_address addresses[3]; int channels, idx; bool use_chanctx; bool destroy_on_close; u32 portid; char alpha2[2]; const struct ieee80211_regdomain *regd; struct ieee80211_channel *tmp_chan; struct ieee80211_channel *roc_chan; u32 roc_duration; struct delayed_work roc_start; struct delayed_work roc_done; struct delayed_work hw_scan; struct cfg80211_scan_request *hw_scan_request; struct ieee80211_vif *hw_scan_vif; int scan_chan_idx; u8 scan_addr[ETH_ALEN]; struct { struct ieee80211_channel *channel; unsigned long next_start, start, end; } survey_data[HWSIM_NUM_CHANNELS_2GHZ + HWSIM_NUM_CHANNELS_5GHZ + HWSIM_NUM_CHANNELS_6GHZ]; struct ieee80211_channel *channel; enum nl80211_chan_width bw; unsigned int rx_filter; bool started, idle, scanning; struct mutex mutex; enum ps_mode { PS_DISABLED, PS_ENABLED, PS_AUTO_POLL, PS_MANUAL_POLL } ps; bool ps_poll_pending; struct dentry *debugfs; struct cfg80211_chan_def radar_background_chandef; atomic_t pending_cookie; struct sk_buff_head pending; /* packets pending */ /* * Only radios in the same group can communicate together (the * channel has to match too). Each bit represents a group. A * radio can be in more than one group. */ u64 group; /* group shared by radios created in the same netns */ int netgroup; /* wmediumd portid responsible for netgroup of this radio */ u32 wmediumd; /* difference between this hw's clock and the real clock, in usecs */ spinlock_t tsf_offset_lock; s64 tsf_offset; /* Stats */ u64 tx_pkts; u64 rx_pkts; u64 tx_bytes; u64 rx_bytes; u64 tx_dropped; u64 tx_failed; /* RSSI in rx status of the receiver */ int rx_rssi; /* only used when pmsr capability is supplied */ struct cfg80211_pmsr_capabilities pmsr_capa; struct cfg80211_pmsr_request *pmsr_request; struct wireless_dev *pmsr_request_wdev; struct mac80211_hwsim_link_data link_data[IEEE80211_MLD_MAX_NUM_LINKS]; struct mac80211_hwsim_nan_data nan; }; extern spinlock_t hwsim_radio_lock; extern struct list_head hwsim_radios; ktime_t mac80211_hwsim_tsf_to_boottime(struct mac80211_hwsim_data *data, u64 tsf); u64 mac80211_hwsim_boottime_to_tsf(struct mac80211_hwsim_data *data, ktime_t ts); u64 mac80211_hwsim_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif); void mac80211_hwsim_tx_frame(struct ieee80211_hw *hw, struct sk_buff *skb, struct ieee80211_channel *chan); void ieee80211_hwsim_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *txq); #endif /* __MAC80211_HWSIM_I_H */