xref: /linux/drivers/net/wireless/virtual/mac80211_hwsim_i.h (revision 0eaed89c18aeedf0898baf2dbf5ff027c6795152)
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