1 // SPDX-License-Identifier: GPL-2.0-only
3 * mac80211_hwsim - software simulator of 802.11 radio(s) for mac80211
4 * Copyright (c) 2008, Jouni Malinen <j@w1.fi>
5 * Copyright (c) 2011, Javier Lopez <jlopex@gmail.com>
6 * Copyright (c) 2016 - 2017 Intel Deutschland GmbH
7 * Copyright (C) 2018 - 2024 Intel Corporation
12 * - Add TSF sync and fix IBSS beacon transmission by adding
13 * competition for "air time" at TBTT
14 * - RX filtering based on filter configuration (data->rx_filter)
17 #include <linux/list.h>
18 #include <linux/slab.h>
19 #include <linux/spinlock.h>
22 #include <net/mac80211.h>
23 #include <net/ieee80211_radiotap.h>
24 #include <linux/if_arp.h>
25 #include <linux/rtnetlink.h>
26 #include <linux/etherdevice.h>
27 #include <linux/platform_device.h>
28 #include <linux/debugfs.h>
29 #include <linux/module.h>
30 #include <linux/ktime.h>
31 #include <net/genetlink.h>
32 #include <net/net_namespace.h>
33 #include <net/netns/generic.h>
34 #include <linux/rhashtable.h>
35 #include <linux/nospec.h>
36 #include <linux/virtio.h>
37 #include <linux/virtio_ids.h>
38 #include <linux/virtio_config.h>
39 #include "mac80211_hwsim.h"
41 #define WARN_QUEUE 100
44 MODULE_AUTHOR("Jouni Malinen");
45 MODULE_DESCRIPTION("Software simulator of 802.11 radio(s) for mac80211");
46 MODULE_LICENSE("GPL");
48 static int radios
= 2;
49 module_param(radios
, int, 0444);
50 MODULE_PARM_DESC(radios
, "Number of simulated radios");
52 static int channels
= 1;
53 module_param(channels
, int, 0444);
54 MODULE_PARM_DESC(channels
, "Number of concurrent channels");
56 static bool paged_rx
= false;
57 module_param(paged_rx
, bool, 0644);
58 MODULE_PARM_DESC(paged_rx
, "Use paged SKBs for RX instead of linear ones");
60 static bool rctbl
= false;
61 module_param(rctbl
, bool, 0444);
62 MODULE_PARM_DESC(rctbl
, "Handle rate control table");
64 static bool support_p2p_device
= true;
65 module_param(support_p2p_device
, bool, 0444);
66 MODULE_PARM_DESC(support_p2p_device
, "Support P2P-Device interface type");
69 module_param(mlo
, bool, 0444);
70 MODULE_PARM_DESC(mlo
, "Support MLO");
72 static bool multi_radio
;
73 module_param(multi_radio
, bool, 0444);
74 MODULE_PARM_DESC(multi_radio
, "Support Multiple Radios per wiphy");
77 * enum hwsim_regtest - the type of regulatory tests we offer
79 * @HWSIM_REGTEST_DISABLED: No regulatory tests are performed,
80 * this is the default value.
81 * @HWSIM_REGTEST_DRIVER_REG_FOLLOW: Used for testing the driver regulatory
82 * hint, only one driver regulatory hint will be sent as such the
83 * secondary radios are expected to follow.
84 * @HWSIM_REGTEST_DRIVER_REG_ALL: Used for testing the driver regulatory
85 * request with all radios reporting the same regulatory domain.
86 * @HWSIM_REGTEST_DIFF_COUNTRY: Used for testing the drivers calling
87 * different regulatory domains requests. Expected behaviour is for
88 * an intersection to occur but each device will still use their
89 * respective regulatory requested domains. Subsequent radios will
90 * use the resulting intersection.
91 * @HWSIM_REGTEST_WORLD_ROAM: Used for testing the world roaming. We accomplish
92 * this by using a custom beacon-capable regulatory domain for the first
93 * radio. All other device world roam.
94 * @HWSIM_REGTEST_CUSTOM_WORLD: Used for testing the custom world regulatory
95 * domain requests. All radios will adhere to this custom world regulatory
97 * @HWSIM_REGTEST_CUSTOM_WORLD_2: Used for testing 2 custom world regulatory
98 * domain requests. The first radio will adhere to the first custom world
99 * regulatory domain, the second one to the second custom world regulatory
100 * domain. All other devices will world roam.
101 * @HWSIM_REGTEST_STRICT_FOLLOW: Used for testing strict regulatory domain
102 * settings, only the first radio will send a regulatory domain request
103 * and use strict settings. The rest of the radios are expected to follow.
104 * @HWSIM_REGTEST_STRICT_ALL: Used for testing strict regulatory domain
105 * settings. All radios will adhere to this.
106 * @HWSIM_REGTEST_STRICT_AND_DRIVER_REG: Used for testing strict regulatory
107 * domain settings, combined with secondary driver regulatory domain
108 * settings. The first radio will get a strict regulatory domain setting
109 * using the first driver regulatory request and the second radio will use
110 * non-strict settings using the second driver regulatory request. All
111 * other devices should follow the intersection created between the
113 * @HWSIM_REGTEST_ALL: Used for testing every possible mix. You will need
114 * at least 6 radios for a complete test. We will test in this order:
115 * 1 - driver custom world regulatory domain
116 * 2 - second custom world regulatory domain
117 * 3 - first driver regulatory domain request
118 * 4 - second driver regulatory domain request
119 * 5 - strict regulatory domain settings using the third driver regulatory
121 * 6 and on - should follow the intersection of the 3rd, 4rth and 5th radio
122 * regulatory requests.
124 * These are the different values you can use for the regtest
125 * module parameter. This is useful to help test world roaming
126 * and the driver regulatory_hint() call and combinations of these.
127 * If you want to do specific alpha2 regulatory domain tests simply
128 * use the userspace regulatory request as that will be respected as
129 * well without the need of this module parameter. This is designed
130 * only for testing the driver regulatory request, world roaming
131 * and all possible combinations.
134 HWSIM_REGTEST_DISABLED
= 0,
135 HWSIM_REGTEST_DRIVER_REG_FOLLOW
= 1,
136 HWSIM_REGTEST_DRIVER_REG_ALL
= 2,
137 HWSIM_REGTEST_DIFF_COUNTRY
= 3,
138 HWSIM_REGTEST_WORLD_ROAM
= 4,
139 HWSIM_REGTEST_CUSTOM_WORLD
= 5,
140 HWSIM_REGTEST_CUSTOM_WORLD_2
= 6,
141 HWSIM_REGTEST_STRICT_FOLLOW
= 7,
142 HWSIM_REGTEST_STRICT_ALL
= 8,
143 HWSIM_REGTEST_STRICT_AND_DRIVER_REG
= 9,
144 HWSIM_REGTEST_ALL
= 10,
147 /* Set to one of the HWSIM_REGTEST_* values above */
148 static int regtest
= HWSIM_REGTEST_DISABLED
;
149 module_param(regtest
, int, 0444);
150 MODULE_PARM_DESC(regtest
, "The type of regulatory test we want to run");
152 static const char *hwsim_alpha2s
[] = {
161 static const struct ieee80211_regdomain hwsim_world_regdom_custom_01
= {
165 REG_RULE(2412-10, 2462+10, 40, 0, 20, 0),
166 REG_RULE(2484-10, 2484+10, 40, 0, 20, 0),
167 REG_RULE(5150-10, 5240+10, 40, 0, 30, 0),
168 REG_RULE(5745-10, 5825+10, 40, 0, 30, 0),
169 REG_RULE(5855-10, 5925+10, 40, 0, 33, 0),
173 static const struct ieee80211_regdomain hwsim_world_regdom_custom_02
= {
177 REG_RULE(2412-10, 2462+10, 40, 0, 20, 0),
178 REG_RULE(5725-10, 5850+10, 40, 0, 30,
180 REG_RULE(5855-10, 5925+10, 40, 0, 33, 0),
184 static const struct ieee80211_regdomain hwsim_world_regdom_custom_03
= {
188 REG_RULE(2412 - 10, 2462 + 10, 40, 0, 20, 0),
189 REG_RULE(2484 - 10, 2484 + 10, 40, 0, 20, 0),
190 REG_RULE(5150 - 10, 5240 + 10, 40, 0, 30, 0),
191 REG_RULE(5745 - 10, 5825 + 10, 40, 0, 30, 0),
192 REG_RULE(5855 - 10, 5925 + 10, 40, 0, 33, 0),
193 REG_RULE(5955 - 10, 7125 + 10, 320, 0, 33, 0),
197 static const struct ieee80211_regdomain hwsim_world_regdom_custom_04
= {
201 REG_RULE(2412 - 10, 2462 + 10, 40, 0, 20, 0),
202 REG_RULE(2484 - 10, 2484 + 10, 40, 0, 20, 0),
203 REG_RULE(5150 - 10, 5240 + 10, 80, 0, 30, NL80211_RRF_AUTO_BW
),
204 REG_RULE(5260 - 10, 5320 + 10, 80, 0, 30,
205 NL80211_RRF_DFS_CONCURRENT
| NL80211_RRF_DFS
|
206 NL80211_RRF_AUTO_BW
),
207 REG_RULE(5500 - 10, 5720 + 10, 160, 0, 30,
208 NL80211_RRF_DFS_CONCURRENT
| NL80211_RRF_DFS
),
209 REG_RULE(5745 - 10, 5825 + 10, 80, 0, 30, 0),
210 REG_RULE(5855 - 10, 5925 + 10, 80, 0, 33, 0),
214 static const struct ieee80211_regdomain
*hwsim_world_regdom_custom
[] = {
215 &hwsim_world_regdom_custom_01
,
216 &hwsim_world_regdom_custom_02
,
217 &hwsim_world_regdom_custom_03
,
218 &hwsim_world_regdom_custom_04
,
221 struct hwsim_vif_priv
{
223 u32 skip_beacons
[IEEE80211_MLD_MAX_NUM_LINKS
];
230 #define HWSIM_VIF_MAGIC 0x69537748
232 static inline void hwsim_check_magic(struct ieee80211_vif
*vif
)
234 struct hwsim_vif_priv
*vp
= (void *)vif
->drv_priv
;
235 WARN(vp
->magic
!= HWSIM_VIF_MAGIC
,
236 "Invalid VIF (%p) magic %#x, %pM, %d/%d\n",
237 vif
, vp
->magic
, vif
->addr
, vif
->type
, vif
->p2p
);
240 static inline void hwsim_set_magic(struct ieee80211_vif
*vif
)
242 struct hwsim_vif_priv
*vp
= (void *)vif
->drv_priv
;
243 vp
->magic
= HWSIM_VIF_MAGIC
;
246 static inline void hwsim_clear_magic(struct ieee80211_vif
*vif
)
248 struct hwsim_vif_priv
*vp
= (void *)vif
->drv_priv
;
252 struct hwsim_sta_priv
{
254 unsigned int last_link
;
258 #define HWSIM_STA_MAGIC 0x6d537749
260 static inline void hwsim_check_sta_magic(struct ieee80211_sta
*sta
)
262 struct hwsim_sta_priv
*sp
= (void *)sta
->drv_priv
;
263 WARN_ON(sp
->magic
!= HWSIM_STA_MAGIC
);
266 static inline void hwsim_set_sta_magic(struct ieee80211_sta
*sta
)
268 struct hwsim_sta_priv
*sp
= (void *)sta
->drv_priv
;
269 sp
->magic
= HWSIM_STA_MAGIC
;
272 static inline void hwsim_clear_sta_magic(struct ieee80211_sta
*sta
)
274 struct hwsim_sta_priv
*sp
= (void *)sta
->drv_priv
;
278 struct hwsim_chanctx_priv
{
282 #define HWSIM_CHANCTX_MAGIC 0x6d53774a
284 static inline void hwsim_check_chanctx_magic(struct ieee80211_chanctx_conf
*c
)
286 struct hwsim_chanctx_priv
*cp
= (void *)c
->drv_priv
;
287 WARN_ON(cp
->magic
!= HWSIM_CHANCTX_MAGIC
);
290 static inline void hwsim_set_chanctx_magic(struct ieee80211_chanctx_conf
*c
)
292 struct hwsim_chanctx_priv
*cp
= (void *)c
->drv_priv
;
293 cp
->magic
= HWSIM_CHANCTX_MAGIC
;
296 static inline void hwsim_clear_chanctx_magic(struct ieee80211_chanctx_conf
*c
)
298 struct hwsim_chanctx_priv
*cp
= (void *)c
->drv_priv
;
302 static unsigned int hwsim_net_id
;
304 static DEFINE_IDA(hwsim_netgroup_ida
);
311 static inline int hwsim_net_get_netgroup(struct net
*net
)
313 struct hwsim_net
*hwsim_net
= net_generic(net
, hwsim_net_id
);
315 return hwsim_net
->netgroup
;
318 static inline int hwsim_net_set_netgroup(struct net
*net
)
320 struct hwsim_net
*hwsim_net
= net_generic(net
, hwsim_net_id
);
322 hwsim_net
->netgroup
= ida_alloc(&hwsim_netgroup_ida
, GFP_KERNEL
);
323 return hwsim_net
->netgroup
>= 0 ? 0 : -ENOMEM
;
326 static inline u32
hwsim_net_get_wmediumd(struct net
*net
)
328 struct hwsim_net
*hwsim_net
= net_generic(net
, hwsim_net_id
);
330 return hwsim_net
->wmediumd
;
333 static inline void hwsim_net_set_wmediumd(struct net
*net
, u32 portid
)
335 struct hwsim_net
*hwsim_net
= net_generic(net
, hwsim_net_id
);
337 hwsim_net
->wmediumd
= portid
;
340 static struct class *hwsim_class
;
342 static struct net_device
*hwsim_mon
; /* global monitor netdev */
344 #define CHAN2G(_freq) { \
345 .band = NL80211_BAND_2GHZ, \
346 .center_freq = (_freq), \
347 .hw_value = (_freq), \
350 #define CHAN5G(_freq) { \
351 .band = NL80211_BAND_5GHZ, \
352 .center_freq = (_freq), \
353 .hw_value = (_freq), \
356 #define CHAN6G(_freq) { \
357 .band = NL80211_BAND_6GHZ, \
358 .center_freq = (_freq), \
359 .hw_value = (_freq), \
362 static const struct ieee80211_channel hwsim_channels_2ghz
[] = {
363 CHAN2G(2412), /* Channel 1 */
364 CHAN2G(2417), /* Channel 2 */
365 CHAN2G(2422), /* Channel 3 */
366 CHAN2G(2427), /* Channel 4 */
367 CHAN2G(2432), /* Channel 5 */
368 CHAN2G(2437), /* Channel 6 */
369 CHAN2G(2442), /* Channel 7 */
370 CHAN2G(2447), /* Channel 8 */
371 CHAN2G(2452), /* Channel 9 */
372 CHAN2G(2457), /* Channel 10 */
373 CHAN2G(2462), /* Channel 11 */
374 CHAN2G(2467), /* Channel 12 */
375 CHAN2G(2472), /* Channel 13 */
376 CHAN2G(2484), /* Channel 14 */
379 static const struct ieee80211_channel hwsim_channels_5ghz
[] = {
380 CHAN5G(5180), /* Channel 36 */
381 CHAN5G(5200), /* Channel 40 */
382 CHAN5G(5220), /* Channel 44 */
383 CHAN5G(5240), /* Channel 48 */
385 CHAN5G(5260), /* Channel 52 */
386 CHAN5G(5280), /* Channel 56 */
387 CHAN5G(5300), /* Channel 60 */
388 CHAN5G(5320), /* Channel 64 */
390 CHAN5G(5500), /* Channel 100 */
391 CHAN5G(5520), /* Channel 104 */
392 CHAN5G(5540), /* Channel 108 */
393 CHAN5G(5560), /* Channel 112 */
394 CHAN5G(5580), /* Channel 116 */
395 CHAN5G(5600), /* Channel 120 */
396 CHAN5G(5620), /* Channel 124 */
397 CHAN5G(5640), /* Channel 128 */
398 CHAN5G(5660), /* Channel 132 */
399 CHAN5G(5680), /* Channel 136 */
400 CHAN5G(5700), /* Channel 140 */
402 CHAN5G(5745), /* Channel 149 */
403 CHAN5G(5765), /* Channel 153 */
404 CHAN5G(5785), /* Channel 157 */
405 CHAN5G(5805), /* Channel 161 */
406 CHAN5G(5825), /* Channel 165 */
407 CHAN5G(5845), /* Channel 169 */
409 CHAN5G(5855), /* Channel 171 */
410 CHAN5G(5860), /* Channel 172 */
411 CHAN5G(5865), /* Channel 173 */
412 CHAN5G(5870), /* Channel 174 */
414 CHAN5G(5875), /* Channel 175 */
415 CHAN5G(5880), /* Channel 176 */
416 CHAN5G(5885), /* Channel 177 */
417 CHAN5G(5890), /* Channel 178 */
418 CHAN5G(5895), /* Channel 179 */
419 CHAN5G(5900), /* Channel 180 */
420 CHAN5G(5905), /* Channel 181 */
422 CHAN5G(5910), /* Channel 182 */
423 CHAN5G(5915), /* Channel 183 */
424 CHAN5G(5920), /* Channel 184 */
425 CHAN5G(5925), /* Channel 185 */
428 static const struct ieee80211_channel hwsim_channels_6ghz
[] = {
429 CHAN6G(5955), /* Channel 1 */
430 CHAN6G(5975), /* Channel 5 */
431 CHAN6G(5995), /* Channel 9 */
432 CHAN6G(6015), /* Channel 13 */
433 CHAN6G(6035), /* Channel 17 */
434 CHAN6G(6055), /* Channel 21 */
435 CHAN6G(6075), /* Channel 25 */
436 CHAN6G(6095), /* Channel 29 */
437 CHAN6G(6115), /* Channel 33 */
438 CHAN6G(6135), /* Channel 37 */
439 CHAN6G(6155), /* Channel 41 */
440 CHAN6G(6175), /* Channel 45 */
441 CHAN6G(6195), /* Channel 49 */
442 CHAN6G(6215), /* Channel 53 */
443 CHAN6G(6235), /* Channel 57 */
444 CHAN6G(6255), /* Channel 61 */
445 CHAN6G(6275), /* Channel 65 */
446 CHAN6G(6295), /* Channel 69 */
447 CHAN6G(6315), /* Channel 73 */
448 CHAN6G(6335), /* Channel 77 */
449 CHAN6G(6355), /* Channel 81 */
450 CHAN6G(6375), /* Channel 85 */
451 CHAN6G(6395), /* Channel 89 */
452 CHAN6G(6415), /* Channel 93 */
453 CHAN6G(6435), /* Channel 97 */
454 CHAN6G(6455), /* Channel 181 */
455 CHAN6G(6475), /* Channel 105 */
456 CHAN6G(6495), /* Channel 109 */
457 CHAN6G(6515), /* Channel 113 */
458 CHAN6G(6535), /* Channel 117 */
459 CHAN6G(6555), /* Channel 121 */
460 CHAN6G(6575), /* Channel 125 */
461 CHAN6G(6595), /* Channel 129 */
462 CHAN6G(6615), /* Channel 133 */
463 CHAN6G(6635), /* Channel 137 */
464 CHAN6G(6655), /* Channel 141 */
465 CHAN6G(6675), /* Channel 145 */
466 CHAN6G(6695), /* Channel 149 */
467 CHAN6G(6715), /* Channel 153 */
468 CHAN6G(6735), /* Channel 157 */
469 CHAN6G(6755), /* Channel 161 */
470 CHAN6G(6775), /* Channel 165 */
471 CHAN6G(6795), /* Channel 169 */
472 CHAN6G(6815), /* Channel 173 */
473 CHAN6G(6835), /* Channel 177 */
474 CHAN6G(6855), /* Channel 181 */
475 CHAN6G(6875), /* Channel 185 */
476 CHAN6G(6895), /* Channel 189 */
477 CHAN6G(6915), /* Channel 193 */
478 CHAN6G(6935), /* Channel 197 */
479 CHAN6G(6955), /* Channel 201 */
480 CHAN6G(6975), /* Channel 205 */
481 CHAN6G(6995), /* Channel 209 */
482 CHAN6G(7015), /* Channel 213 */
483 CHAN6G(7035), /* Channel 217 */
484 CHAN6G(7055), /* Channel 221 */
485 CHAN6G(7075), /* Channel 225 */
486 CHAN6G(7095), /* Channel 229 */
487 CHAN6G(7115), /* Channel 233 */
490 #define NUM_S1G_CHANS_US 51
491 static struct ieee80211_channel hwsim_channels_s1g
[NUM_S1G_CHANS_US
];
493 static const struct ieee80211_sta_s1g_cap hwsim_s1g_cap
= {
495 .cap
= { S1G_CAP0_SGI_1MHZ
| S1G_CAP0_SGI_2MHZ
,
498 S1G_CAP3_MAX_MPDU_LEN
,
503 S1G_CAP8_TWT_RESPOND
| S1G_CAP8_TWT_REQUEST
,
505 .nss_mcs
= { 0xfc | 1, /* MCS 7 for 1 SS */
506 /* RX Highest Supported Long GI Data Rate 0:7 */
508 /* RX Highest Supported Long GI Data Rate 0:7 */
509 /* TX S1G MCS Map 0:6 */
511 /* TX S1G MCS Map :7 */
512 /* TX Highest Supported Long GI Data Rate 0:6 */
514 /* TX Highest Supported Long GI Data Rate 7:8 */
515 /* Rx Single spatial stream and S1G-MCS Map for 1MHz */
516 /* Tx Single spatial stream and S1G-MCS Map for 1MHz */
520 static void hwsim_init_s1g_channels(struct ieee80211_channel
*chans
)
524 for (ch
= 0; ch
< NUM_S1G_CHANS_US
; ch
++) {
525 freq
= 902000 + (ch
+ 1) * 500;
526 chans
[ch
].band
= NL80211_BAND_S1GHZ
;
527 chans
[ch
].center_freq
= KHZ_TO_MHZ(freq
);
528 chans
[ch
].freq_offset
= freq
% 1000;
529 chans
[ch
].hw_value
= ch
+ 1;
533 static const struct ieee80211_rate hwsim_rates
[] = {
535 { .bitrate
= 20, .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
536 { .bitrate
= 55, .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
537 { .bitrate
= 110, .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
548 #define DEFAULT_RX_RSSI -50
550 static const u32 hwsim_ciphers
[] = {
551 WLAN_CIPHER_SUITE_WEP40
,
552 WLAN_CIPHER_SUITE_WEP104
,
553 WLAN_CIPHER_SUITE_TKIP
,
554 WLAN_CIPHER_SUITE_CCMP
,
555 WLAN_CIPHER_SUITE_CCMP_256
,
556 WLAN_CIPHER_SUITE_GCMP
,
557 WLAN_CIPHER_SUITE_GCMP_256
,
558 WLAN_CIPHER_SUITE_AES_CMAC
,
559 WLAN_CIPHER_SUITE_BIP_CMAC_256
,
560 WLAN_CIPHER_SUITE_BIP_GMAC_128
,
561 WLAN_CIPHER_SUITE_BIP_GMAC_256
,
564 #define OUI_QCA 0x001374
565 #define QCA_NL80211_SUBCMD_TEST 1
566 enum qca_nl80211_vendor_subcmds
{
567 QCA_WLAN_VENDOR_ATTR_TEST
= 8,
568 QCA_WLAN_VENDOR_ATTR_MAX
= QCA_WLAN_VENDOR_ATTR_TEST
571 static const struct nla_policy
572 hwsim_vendor_test_policy
[QCA_WLAN_VENDOR_ATTR_MAX
+ 1] = {
573 [QCA_WLAN_VENDOR_ATTR_MAX
] = { .type
= NLA_U32
},
576 static int mac80211_hwsim_vendor_cmd_test(struct wiphy
*wiphy
,
577 struct wireless_dev
*wdev
,
578 const void *data
, int data_len
)
581 struct nlattr
*tb
[QCA_WLAN_VENDOR_ATTR_MAX
+ 1];
585 err
= nla_parse_deprecated(tb
, QCA_WLAN_VENDOR_ATTR_MAX
, data
,
586 data_len
, hwsim_vendor_test_policy
, NULL
);
589 if (!tb
[QCA_WLAN_VENDOR_ATTR_TEST
])
591 val
= nla_get_u32(tb
[QCA_WLAN_VENDOR_ATTR_TEST
]);
592 wiphy_dbg(wiphy
, "%s: test=%u\n", __func__
, val
);
594 /* Send a vendor event as a test. Note that this would not normally be
595 * done within a command handler, but rather, based on some other
596 * trigger. For simplicity, this command is used to trigger the event
599 * event_idx = 0 (index in mac80211_hwsim_vendor_commands)
601 skb
= cfg80211_vendor_event_alloc(wiphy
, wdev
, 100, 0, GFP_KERNEL
);
603 /* skb_put() or nla_put() will fill up data within
604 * NL80211_ATTR_VENDOR_DATA.
607 /* Add vendor data */
608 nla_put_u32(skb
, QCA_WLAN_VENDOR_ATTR_TEST
, val
+ 1);
610 /* Send the event - this will call nla_nest_end() */
611 cfg80211_vendor_event(skb
, GFP_KERNEL
);
614 /* Send a response to the command */
615 skb
= cfg80211_vendor_cmd_alloc_reply_skb(wiphy
, 10);
619 /* skb_put() or nla_put() will fill up data within
620 * NL80211_ATTR_VENDOR_DATA
622 nla_put_u32(skb
, QCA_WLAN_VENDOR_ATTR_TEST
, val
+ 2);
624 return cfg80211_vendor_cmd_reply(skb
);
627 static struct wiphy_vendor_command mac80211_hwsim_vendor_commands
[] = {
629 .info
= { .vendor_id
= OUI_QCA
,
630 .subcmd
= QCA_NL80211_SUBCMD_TEST
},
631 .flags
= WIPHY_VENDOR_CMD_NEED_NETDEV
,
632 .doit
= mac80211_hwsim_vendor_cmd_test
,
633 .policy
= hwsim_vendor_test_policy
,
634 .maxattr
= QCA_WLAN_VENDOR_ATTR_MAX
,
638 /* Advertise support vendor specific events */
639 static const struct nl80211_vendor_cmd_info mac80211_hwsim_vendor_events
[] = {
640 { .vendor_id
= OUI_QCA
, .subcmd
= 1 },
643 static DEFINE_SPINLOCK(hwsim_radio_lock
);
644 static LIST_HEAD(hwsim_radios
);
645 static struct rhashtable hwsim_radios_rht
;
646 static int hwsim_radio_idx
;
647 static int hwsim_radios_generation
= 1;
649 static struct platform_driver mac80211_hwsim_driver
= {
651 .name
= "mac80211_hwsim",
655 struct mac80211_hwsim_link_data
{
657 u64 beacon_int
/* beacon interval in us */;
658 struct hrtimer beacon_timer
;
661 struct mac80211_hwsim_data
{
662 struct list_head list
;
663 struct rhash_head rht
;
664 struct ieee80211_hw
*hw
;
666 struct ieee80211_supported_band bands
[NUM_NL80211_BANDS
];
667 struct ieee80211_channel channels_2ghz
[ARRAY_SIZE(hwsim_channels_2ghz
)];
668 struct ieee80211_channel channels_5ghz
[ARRAY_SIZE(hwsim_channels_5ghz
)];
669 struct ieee80211_channel channels_6ghz
[ARRAY_SIZE(hwsim_channels_6ghz
)];
670 struct ieee80211_channel channels_s1g
[ARRAY_SIZE(hwsim_channels_s1g
)];
671 struct ieee80211_rate rates
[ARRAY_SIZE(hwsim_rates
)];
672 struct ieee80211_iface_combination if_combination
;
673 struct ieee80211_iface_limit if_limits
[3];
676 struct ieee80211_iface_combination if_combination_radio
;
677 struct wiphy_radio_freq_range radio_range
[NUM_NL80211_BANDS
];
678 struct wiphy_radio radio
[NUM_NL80211_BANDS
];
680 u32 ciphers
[ARRAY_SIZE(hwsim_ciphers
)];
682 struct mac_address addresses
[2];
685 bool destroy_on_close
;
688 const struct ieee80211_regdomain
*regd
;
690 struct ieee80211_channel
*tmp_chan
;
691 struct ieee80211_channel
*roc_chan
;
693 struct delayed_work roc_start
;
694 struct delayed_work roc_done
;
695 struct delayed_work hw_scan
;
696 struct cfg80211_scan_request
*hw_scan_request
;
697 struct ieee80211_vif
*hw_scan_vif
;
699 u8 scan_addr
[ETH_ALEN
];
701 struct ieee80211_channel
*channel
;
702 unsigned long next_start
, start
, end
;
703 } survey_data
[ARRAY_SIZE(hwsim_channels_2ghz
) +
704 ARRAY_SIZE(hwsim_channels_5ghz
) +
705 ARRAY_SIZE(hwsim_channels_6ghz
)];
707 struct ieee80211_channel
*channel
;
708 enum nl80211_chan_width bw
;
709 unsigned int rx_filter
;
710 bool started
, idle
, scanning
;
713 PS_DISABLED
, PS_ENABLED
, PS_AUTO_POLL
, PS_MANUAL_POLL
715 bool ps_poll_pending
;
716 struct dentry
*debugfs
;
718 atomic_t pending_cookie
;
719 struct sk_buff_head pending
; /* packets pending */
721 * Only radios in the same group can communicate together (the
722 * channel has to match too). Each bit represents a group. A
723 * radio can be in more than one group.
727 /* group shared by radios created in the same netns */
729 /* wmediumd portid responsible for netgroup of this radio */
732 /* difference between this hw's clock and the real clock, in usecs */
735 /* absolute beacon transmission time. Used to cover up "tx" delay. */
746 /* RSSI in rx status of the receiver */
749 /* only used when pmsr capability is supplied */
750 struct cfg80211_pmsr_capabilities pmsr_capa
;
751 struct cfg80211_pmsr_request
*pmsr_request
;
752 struct wireless_dev
*pmsr_request_wdev
;
754 struct mac80211_hwsim_link_data link_data
[IEEE80211_MLD_MAX_NUM_LINKS
];
757 static const struct rhashtable_params hwsim_rht_params
= {
759 .automatic_shrinking
= true,
761 .key_offset
= offsetof(struct mac80211_hwsim_data
, addresses
[1]),
762 .head_offset
= offsetof(struct mac80211_hwsim_data
, rht
),
765 struct hwsim_radiotap_hdr
{
766 struct ieee80211_radiotap_header_fixed hdr
;
774 struct hwsim_radiotap_ack_hdr
{
775 struct ieee80211_radiotap_header_fixed hdr
;
782 static struct mac80211_hwsim_data
*get_hwsim_data_ref_from_addr(const u8
*addr
)
784 return rhashtable_lookup_fast(&hwsim_radios_rht
, addr
, hwsim_rht_params
);
787 /* MAC80211_HWSIM netlink family */
788 static struct genl_family hwsim_genl_family
;
790 enum hwsim_multicast_groups
{
794 static const struct genl_multicast_group hwsim_mcgrps
[] = {
795 [HWSIM_MCGRP_CONFIG
] = { .name
= "config", },
798 /* MAC80211_HWSIM netlink policy */
800 static const struct nla_policy
801 hwsim_rate_info_policy
[HWSIM_RATE_INFO_ATTR_MAX
+ 1] = {
802 [HWSIM_RATE_INFO_ATTR_FLAGS
] = { .type
= NLA_U8
},
803 [HWSIM_RATE_INFO_ATTR_MCS
] = { .type
= NLA_U8
},
804 [HWSIM_RATE_INFO_ATTR_LEGACY
] = { .type
= NLA_U16
},
805 [HWSIM_RATE_INFO_ATTR_NSS
] = { .type
= NLA_U8
},
806 [HWSIM_RATE_INFO_ATTR_BW
] = { .type
= NLA_U8
},
807 [HWSIM_RATE_INFO_ATTR_HE_GI
] = { .type
= NLA_U8
},
808 [HWSIM_RATE_INFO_ATTR_HE_DCM
] = { .type
= NLA_U8
},
809 [HWSIM_RATE_INFO_ATTR_HE_RU_ALLOC
] = { .type
= NLA_U8
},
810 [HWSIM_RATE_INFO_ATTR_N_BOUNDED_CH
] = { .type
= NLA_U8
},
811 [HWSIM_RATE_INFO_ATTR_EHT_GI
] = { .type
= NLA_U8
},
812 [HWSIM_RATE_INFO_ATTR_EHT_RU_ALLOC
] = { .type
= NLA_U8
},
815 static const struct nla_policy
816 hwsim_ftm_result_policy
[NL80211_PMSR_FTM_RESP_ATTR_MAX
+ 1] = {
817 [NL80211_PMSR_FTM_RESP_ATTR_FAIL_REASON
] = { .type
= NLA_U32
},
818 [NL80211_PMSR_FTM_RESP_ATTR_BURST_INDEX
] = { .type
= NLA_U16
},
819 [NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_ATTEMPTS
] = { .type
= NLA_U32
},
820 [NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_SUCCESSES
] = { .type
= NLA_U32
},
821 [NL80211_PMSR_FTM_RESP_ATTR_BUSY_RETRY_TIME
] = { .type
= NLA_U8
},
822 [NL80211_PMSR_FTM_RESP_ATTR_NUM_BURSTS_EXP
] = { .type
= NLA_U8
},
823 [NL80211_PMSR_FTM_RESP_ATTR_BURST_DURATION
] = { .type
= NLA_U8
},
824 [NL80211_PMSR_FTM_RESP_ATTR_FTMS_PER_BURST
] = { .type
= NLA_U8
},
825 [NL80211_PMSR_FTM_RESP_ATTR_RSSI_AVG
] = { .type
= NLA_U32
},
826 [NL80211_PMSR_FTM_RESP_ATTR_RSSI_SPREAD
] = { .type
= NLA_U32
},
827 [NL80211_PMSR_FTM_RESP_ATTR_TX_RATE
] = NLA_POLICY_NESTED(hwsim_rate_info_policy
),
828 [NL80211_PMSR_FTM_RESP_ATTR_RX_RATE
] = NLA_POLICY_NESTED(hwsim_rate_info_policy
),
829 [NL80211_PMSR_FTM_RESP_ATTR_RTT_AVG
] = { .type
= NLA_U64
},
830 [NL80211_PMSR_FTM_RESP_ATTR_RTT_VARIANCE
] = { .type
= NLA_U64
},
831 [NL80211_PMSR_FTM_RESP_ATTR_RTT_SPREAD
] = { .type
= NLA_U64
},
832 [NL80211_PMSR_FTM_RESP_ATTR_DIST_AVG
] = { .type
= NLA_U64
},
833 [NL80211_PMSR_FTM_RESP_ATTR_DIST_VARIANCE
] = { .type
= NLA_U64
},
834 [NL80211_PMSR_FTM_RESP_ATTR_DIST_SPREAD
] = { .type
= NLA_U64
},
835 [NL80211_PMSR_FTM_RESP_ATTR_LCI
] = { .type
= NLA_STRING
},
836 [NL80211_PMSR_FTM_RESP_ATTR_CIVICLOC
] = { .type
= NLA_STRING
},
839 static const struct nla_policy
840 hwsim_pmsr_resp_type_policy
[NL80211_PMSR_TYPE_MAX
+ 1] = {
841 [NL80211_PMSR_TYPE_FTM
] = NLA_POLICY_NESTED(hwsim_ftm_result_policy
),
844 static const struct nla_policy
845 hwsim_pmsr_resp_policy
[NL80211_PMSR_RESP_ATTR_MAX
+ 1] = {
846 [NL80211_PMSR_RESP_ATTR_STATUS
] = { .type
= NLA_U32
},
847 [NL80211_PMSR_RESP_ATTR_HOST_TIME
] = { .type
= NLA_U64
},
848 [NL80211_PMSR_RESP_ATTR_AP_TSF
] = { .type
= NLA_U64
},
849 [NL80211_PMSR_RESP_ATTR_FINAL
] = { .type
= NLA_FLAG
},
850 [NL80211_PMSR_RESP_ATTR_DATA
] = NLA_POLICY_NESTED(hwsim_pmsr_resp_type_policy
),
853 static const struct nla_policy
854 hwsim_pmsr_peer_result_policy
[NL80211_PMSR_PEER_ATTR_MAX
+ 1] = {
855 [NL80211_PMSR_PEER_ATTR_ADDR
] = NLA_POLICY_ETH_ADDR_COMPAT
,
856 [NL80211_PMSR_PEER_ATTR_CHAN
] = { .type
= NLA_REJECT
},
857 [NL80211_PMSR_PEER_ATTR_REQ
] = { .type
= NLA_REJECT
},
858 [NL80211_PMSR_PEER_ATTR_RESP
] = NLA_POLICY_NESTED(hwsim_pmsr_resp_policy
),
861 static const struct nla_policy
862 hwsim_pmsr_peers_result_policy
[NL80211_PMSR_ATTR_MAX
+ 1] = {
863 [NL80211_PMSR_ATTR_MAX_PEERS
] = { .type
= NLA_REJECT
},
864 [NL80211_PMSR_ATTR_REPORT_AP_TSF
] = { .type
= NLA_REJECT
},
865 [NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR
] = { .type
= NLA_REJECT
},
866 [NL80211_PMSR_ATTR_TYPE_CAPA
] = { .type
= NLA_REJECT
},
867 [NL80211_PMSR_ATTR_PEERS
] = NLA_POLICY_NESTED_ARRAY(hwsim_pmsr_peer_result_policy
),
870 static const struct nla_policy
871 hwsim_ftm_capa_policy
[NL80211_PMSR_FTM_CAPA_ATTR_MAX
+ 1] = {
872 [NL80211_PMSR_FTM_CAPA_ATTR_ASAP
] = { .type
= NLA_FLAG
},
873 [NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP
] = { .type
= NLA_FLAG
},
874 [NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI
] = { .type
= NLA_FLAG
},
875 [NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC
] = { .type
= NLA_FLAG
},
876 [NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES
] = { .type
= NLA_U32
},
877 [NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS
] = { .type
= NLA_U32
},
878 [NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT
] = NLA_POLICY_MAX(NLA_U8
, 15),
879 [NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST
] = NLA_POLICY_MAX(NLA_U8
, 31),
880 [NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED
] = { .type
= NLA_FLAG
},
881 [NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED
] = { .type
= NLA_FLAG
},
884 static const struct nla_policy
885 hwsim_pmsr_capa_type_policy
[NL80211_PMSR_TYPE_MAX
+ 1] = {
886 [NL80211_PMSR_TYPE_FTM
] = NLA_POLICY_NESTED(hwsim_ftm_capa_policy
),
889 static const struct nla_policy
890 hwsim_pmsr_capa_policy
[NL80211_PMSR_ATTR_MAX
+ 1] = {
891 [NL80211_PMSR_ATTR_MAX_PEERS
] = { .type
= NLA_U32
},
892 [NL80211_PMSR_ATTR_REPORT_AP_TSF
] = { .type
= NLA_FLAG
},
893 [NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR
] = { .type
= NLA_FLAG
},
894 [NL80211_PMSR_ATTR_TYPE_CAPA
] = NLA_POLICY_NESTED(hwsim_pmsr_capa_type_policy
),
895 [NL80211_PMSR_ATTR_PEERS
] = { .type
= NLA_REJECT
}, // only for request.
898 static const struct nla_policy hwsim_genl_policy
[HWSIM_ATTR_MAX
+ 1] = {
899 [HWSIM_ATTR_ADDR_RECEIVER
] = NLA_POLICY_ETH_ADDR_COMPAT
,
900 [HWSIM_ATTR_ADDR_TRANSMITTER
] = NLA_POLICY_ETH_ADDR_COMPAT
,
901 [HWSIM_ATTR_FRAME
] = { .type
= NLA_BINARY
,
902 .len
= IEEE80211_MAX_DATA_LEN
},
903 [HWSIM_ATTR_FLAGS
] = { .type
= NLA_U32
},
904 [HWSIM_ATTR_RX_RATE
] = { .type
= NLA_U32
},
905 [HWSIM_ATTR_SIGNAL
] = { .type
= NLA_U32
},
906 [HWSIM_ATTR_TX_INFO
] = { .type
= NLA_BINARY
,
907 .len
= IEEE80211_TX_MAX_RATES
*
908 sizeof(struct hwsim_tx_rate
)},
909 [HWSIM_ATTR_COOKIE
] = { .type
= NLA_U64
},
910 [HWSIM_ATTR_CHANNELS
] = { .type
= NLA_U32
},
911 [HWSIM_ATTR_RADIO_ID
] = { .type
= NLA_U32
},
912 [HWSIM_ATTR_REG_HINT_ALPHA2
] = { .type
= NLA_STRING
, .len
= 2 },
913 [HWSIM_ATTR_REG_CUSTOM_REG
] = { .type
= NLA_U32
},
914 [HWSIM_ATTR_REG_STRICT_REG
] = { .type
= NLA_FLAG
},
915 [HWSIM_ATTR_SUPPORT_P2P_DEVICE
] = { .type
= NLA_FLAG
},
916 [HWSIM_ATTR_USE_CHANCTX
] = { .type
= NLA_FLAG
},
917 [HWSIM_ATTR_DESTROY_RADIO_ON_CLOSE
] = { .type
= NLA_FLAG
},
918 [HWSIM_ATTR_RADIO_NAME
] = { .type
= NLA_STRING
},
919 [HWSIM_ATTR_NO_VIF
] = { .type
= NLA_FLAG
},
920 [HWSIM_ATTR_FREQ
] = { .type
= NLA_U32
},
921 [HWSIM_ATTR_TX_INFO_FLAGS
] = { .type
= NLA_BINARY
},
922 [HWSIM_ATTR_PERM_ADDR
] = NLA_POLICY_ETH_ADDR_COMPAT
,
923 [HWSIM_ATTR_IFTYPE_SUPPORT
] = { .type
= NLA_U32
},
924 [HWSIM_ATTR_CIPHER_SUPPORT
] = { .type
= NLA_BINARY
},
925 [HWSIM_ATTR_MLO_SUPPORT
] = { .type
= NLA_FLAG
},
926 [HWSIM_ATTR_PMSR_SUPPORT
] = NLA_POLICY_NESTED(hwsim_pmsr_capa_policy
),
927 [HWSIM_ATTR_PMSR_RESULT
] = NLA_POLICY_NESTED(hwsim_pmsr_peers_result_policy
),
928 [HWSIM_ATTR_MULTI_RADIO
] = { .type
= NLA_FLAG
},
931 #if IS_REACHABLE(CONFIG_VIRTIO)
933 /* MAC80211_HWSIM virtio queues */
934 static struct virtqueue
*hwsim_vqs
[HWSIM_NUM_VQS
];
935 static bool hwsim_virtio_enabled
;
936 static DEFINE_SPINLOCK(hwsim_virtio_lock
);
938 static void hwsim_virtio_rx_work(struct work_struct
*work
);
939 static DECLARE_WORK(hwsim_virtio_rx
, hwsim_virtio_rx_work
);
941 static int hwsim_tx_virtio(struct mac80211_hwsim_data
*data
,
944 struct scatterlist sg
[1];
948 spin_lock_irqsave(&hwsim_virtio_lock
, flags
);
949 if (!hwsim_virtio_enabled
) {
954 sg_init_one(sg
, skb
->head
, skb_end_offset(skb
));
955 err
= virtqueue_add_outbuf(hwsim_vqs
[HWSIM_VQ_TX
], sg
, 1, skb
,
959 virtqueue_kick(hwsim_vqs
[HWSIM_VQ_TX
]);
960 spin_unlock_irqrestore(&hwsim_virtio_lock
, flags
);
964 spin_unlock_irqrestore(&hwsim_virtio_lock
, flags
);
969 /* cause a linker error if this ends up being needed */
970 extern int hwsim_tx_virtio(struct mac80211_hwsim_data
*data
,
971 struct sk_buff
*skb
);
972 #define hwsim_virtio_enabled false
975 static int hwsim_get_chanwidth(enum nl80211_chan_width bw
)
978 case NL80211_CHAN_WIDTH_20_NOHT
:
979 case NL80211_CHAN_WIDTH_20
:
981 case NL80211_CHAN_WIDTH_40
:
983 case NL80211_CHAN_WIDTH_80
:
985 case NL80211_CHAN_WIDTH_80P80
:
986 case NL80211_CHAN_WIDTH_160
:
988 case NL80211_CHAN_WIDTH_320
:
990 case NL80211_CHAN_WIDTH_5
:
992 case NL80211_CHAN_WIDTH_10
:
994 case NL80211_CHAN_WIDTH_1
:
996 case NL80211_CHAN_WIDTH_2
:
998 case NL80211_CHAN_WIDTH_4
:
1000 case NL80211_CHAN_WIDTH_8
:
1002 case NL80211_CHAN_WIDTH_16
:
1009 static void mac80211_hwsim_tx_frame(struct ieee80211_hw
*hw
,
1010 struct sk_buff
*skb
,
1011 struct ieee80211_channel
*chan
);
1013 /* sysfs attributes */
1014 static void hwsim_send_ps_poll(void *dat
, u8
*mac
, struct ieee80211_vif
*vif
)
1016 struct mac80211_hwsim_data
*data
= dat
;
1017 struct hwsim_vif_priv
*vp
= (void *)vif
->drv_priv
;
1018 struct sk_buff
*skb
;
1019 struct ieee80211_pspoll
*pspoll
;
1024 wiphy_dbg(data
->hw
->wiphy
,
1025 "%s: send PS-Poll to %pM for aid %d\n",
1026 __func__
, vp
->bssid
, vp
->aid
);
1028 skb
= dev_alloc_skb(sizeof(*pspoll
));
1031 pspoll
= skb_put(skb
, sizeof(*pspoll
));
1032 pspoll
->frame_control
= cpu_to_le16(IEEE80211_FTYPE_CTL
|
1033 IEEE80211_STYPE_PSPOLL
|
1035 pspoll
->aid
= cpu_to_le16(0xc000 | vp
->aid
);
1036 memcpy(pspoll
->bssid
, vp
->bssid
, ETH_ALEN
);
1037 memcpy(pspoll
->ta
, mac
, ETH_ALEN
);
1040 mac80211_hwsim_tx_frame(data
->hw
, skb
,
1041 rcu_dereference(vif
->bss_conf
.chanctx_conf
)->def
.chan
);
1045 static void hwsim_send_nullfunc(struct mac80211_hwsim_data
*data
, u8
*mac
,
1046 struct ieee80211_vif
*vif
, int ps
)
1048 struct hwsim_vif_priv
*vp
= (void *)vif
->drv_priv
;
1049 struct sk_buff
*skb
;
1050 struct ieee80211_hdr
*hdr
;
1051 struct ieee80211_tx_info
*cb
;
1056 wiphy_dbg(data
->hw
->wiphy
,
1057 "%s: send data::nullfunc to %pM ps=%d\n",
1058 __func__
, vp
->bssid
, ps
);
1060 skb
= dev_alloc_skb(sizeof(*hdr
));
1063 hdr
= skb_put(skb
, sizeof(*hdr
) - ETH_ALEN
);
1064 hdr
->frame_control
= cpu_to_le16(IEEE80211_FTYPE_DATA
|
1065 IEEE80211_STYPE_NULLFUNC
|
1066 IEEE80211_FCTL_TODS
|
1067 (ps
? IEEE80211_FCTL_PM
: 0));
1068 hdr
->duration_id
= cpu_to_le16(0);
1069 memcpy(hdr
->addr1
, vp
->bssid
, ETH_ALEN
);
1070 memcpy(hdr
->addr2
, mac
, ETH_ALEN
);
1071 memcpy(hdr
->addr3
, vp
->bssid
, ETH_ALEN
);
1073 cb
= IEEE80211_SKB_CB(skb
);
1074 cb
->control
.rates
[0].count
= 1;
1075 cb
->control
.rates
[1].idx
= -1;
1078 mac80211_hwsim_tx_frame(data
->hw
, skb
,
1079 rcu_dereference(vif
->bss_conf
.chanctx_conf
)->def
.chan
);
1084 static void hwsim_send_nullfunc_ps(void *dat
, u8
*mac
,
1085 struct ieee80211_vif
*vif
)
1087 struct mac80211_hwsim_data
*data
= dat
;
1088 hwsim_send_nullfunc(data
, mac
, vif
, 1);
1091 static void hwsim_send_nullfunc_no_ps(void *dat
, u8
*mac
,
1092 struct ieee80211_vif
*vif
)
1094 struct mac80211_hwsim_data
*data
= dat
;
1095 hwsim_send_nullfunc(data
, mac
, vif
, 0);
1098 static int hwsim_fops_ps_read(void *dat
, u64
*val
)
1100 struct mac80211_hwsim_data
*data
= dat
;
1105 static int hwsim_fops_ps_write(void *dat
, u64 val
)
1107 struct mac80211_hwsim_data
*data
= dat
;
1108 enum ps_mode old_ps
;
1110 if (val
!= PS_DISABLED
&& val
!= PS_ENABLED
&& val
!= PS_AUTO_POLL
&&
1111 val
!= PS_MANUAL_POLL
)
1114 if (val
== PS_MANUAL_POLL
) {
1115 if (data
->ps
!= PS_ENABLED
)
1118 ieee80211_iterate_active_interfaces_atomic(
1119 data
->hw
, IEEE80211_IFACE_ITER_NORMAL
,
1120 hwsim_send_ps_poll
, data
);
1128 if (old_ps
== PS_DISABLED
&& val
!= PS_DISABLED
) {
1129 ieee80211_iterate_active_interfaces_atomic(
1130 data
->hw
, IEEE80211_IFACE_ITER_NORMAL
,
1131 hwsim_send_nullfunc_ps
, data
);
1132 } else if (old_ps
!= PS_DISABLED
&& val
== PS_DISABLED
) {
1133 ieee80211_iterate_active_interfaces_atomic(
1134 data
->hw
, IEEE80211_IFACE_ITER_NORMAL
,
1135 hwsim_send_nullfunc_no_ps
, data
);
1142 DEFINE_DEBUGFS_ATTRIBUTE(hwsim_fops_ps
, hwsim_fops_ps_read
, hwsim_fops_ps_write
,
1145 static int hwsim_write_simulate_radar(void *dat
, u64 val
)
1147 struct mac80211_hwsim_data
*data
= dat
;
1149 ieee80211_radar_detected(data
->hw
, NULL
);
1154 DEFINE_DEBUGFS_ATTRIBUTE(hwsim_simulate_radar
, NULL
,
1155 hwsim_write_simulate_radar
, "%llu\n");
1157 static int hwsim_fops_group_read(void *dat
, u64
*val
)
1159 struct mac80211_hwsim_data
*data
= dat
;
1164 static int hwsim_fops_group_write(void *dat
, u64 val
)
1166 struct mac80211_hwsim_data
*data
= dat
;
1171 DEFINE_DEBUGFS_ATTRIBUTE(hwsim_fops_group
,
1172 hwsim_fops_group_read
, hwsim_fops_group_write
,
1175 static int hwsim_fops_rx_rssi_read(void *dat
, u64
*val
)
1177 struct mac80211_hwsim_data
*data
= dat
;
1178 *val
= data
->rx_rssi
;
1182 static int hwsim_fops_rx_rssi_write(void *dat
, u64 val
)
1184 struct mac80211_hwsim_data
*data
= dat
;
1185 int rssi
= (int)val
;
1187 if (rssi
>= 0 || rssi
< -100)
1190 data
->rx_rssi
= rssi
;
1194 DEFINE_DEBUGFS_ATTRIBUTE(hwsim_fops_rx_rssi
,
1195 hwsim_fops_rx_rssi_read
, hwsim_fops_rx_rssi_write
,
1198 static netdev_tx_t
hwsim_mon_xmit(struct sk_buff
*skb
,
1199 struct net_device
*dev
)
1201 /* TODO: allow packet injection */
1203 return NETDEV_TX_OK
;
1206 static inline u64
mac80211_hwsim_get_tsf_raw(void)
1208 return ktime_to_us(ktime_get_real());
1211 static __le64
__mac80211_hwsim_get_tsf(struct mac80211_hwsim_data
*data
)
1213 u64 now
= mac80211_hwsim_get_tsf_raw();
1214 return cpu_to_le64(now
+ data
->tsf_offset
);
1217 static u64
mac80211_hwsim_get_tsf(struct ieee80211_hw
*hw
,
1218 struct ieee80211_vif
*vif
)
1220 struct mac80211_hwsim_data
*data
= hw
->priv
;
1221 return le64_to_cpu(__mac80211_hwsim_get_tsf(data
));
1224 static void mac80211_hwsim_set_tsf(struct ieee80211_hw
*hw
,
1225 struct ieee80211_vif
*vif
, u64 tsf
)
1227 struct mac80211_hwsim_data
*data
= hw
->priv
;
1228 u64 now
= mac80211_hwsim_get_tsf(hw
, vif
);
1229 /* MLD not supported here */
1230 u32 bcn_int
= data
->link_data
[0].beacon_int
;
1231 u64 delta
= abs(tsf
- now
);
1233 /* adjust after beaconing with new timestamp at old TBTT */
1235 data
->tsf_offset
+= delta
;
1236 data
->bcn_delta
= do_div(delta
, bcn_int
);
1238 data
->tsf_offset
-= delta
;
1239 data
->bcn_delta
= -(s64
)do_div(delta
, bcn_int
);
1243 static void mac80211_hwsim_monitor_rx(struct ieee80211_hw
*hw
,
1244 struct sk_buff
*tx_skb
,
1245 struct ieee80211_channel
*chan
)
1247 struct mac80211_hwsim_data
*data
= hw
->priv
;
1248 struct sk_buff
*skb
;
1249 struct hwsim_radiotap_hdr
*hdr
;
1251 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(tx_skb
);
1252 struct ieee80211_rate
*txrate
= ieee80211_get_tx_rate(hw
, info
);
1257 bitrate
= txrate
->bitrate
;
1259 if (!netif_running(hwsim_mon
))
1262 skb
= skb_copy_expand(tx_skb
, sizeof(*hdr
), 0, GFP_ATOMIC
);
1266 hdr
= skb_push(skb
, sizeof(*hdr
));
1267 hdr
->hdr
.it_version
= PKTHDR_RADIOTAP_VERSION
;
1268 hdr
->hdr
.it_pad
= 0;
1269 hdr
->hdr
.it_len
= cpu_to_le16(sizeof(*hdr
));
1270 hdr
->hdr
.it_present
= cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS
) |
1271 (1 << IEEE80211_RADIOTAP_RATE
) |
1272 (1 << IEEE80211_RADIOTAP_TSFT
) |
1273 (1 << IEEE80211_RADIOTAP_CHANNEL
));
1274 hdr
->rt_tsft
= __mac80211_hwsim_get_tsf(data
);
1276 hdr
->rt_rate
= bitrate
/ 5;
1277 hdr
->rt_channel
= cpu_to_le16(chan
->center_freq
);
1278 flags
= IEEE80211_CHAN_2GHZ
;
1279 if (txrate
&& txrate
->flags
& IEEE80211_RATE_ERP_G
)
1280 flags
|= IEEE80211_CHAN_OFDM
;
1282 flags
|= IEEE80211_CHAN_CCK
;
1283 hdr
->rt_chbitmask
= cpu_to_le16(flags
);
1285 skb
->dev
= hwsim_mon
;
1286 skb_reset_mac_header(skb
);
1287 skb
->ip_summed
= CHECKSUM_UNNECESSARY
;
1288 skb
->pkt_type
= PACKET_OTHERHOST
;
1289 skb
->protocol
= htons(ETH_P_802_2
);
1290 memset(skb
->cb
, 0, sizeof(skb
->cb
));
1295 static void mac80211_hwsim_monitor_ack(struct ieee80211_channel
*chan
,
1298 struct sk_buff
*skb
;
1299 struct hwsim_radiotap_ack_hdr
*hdr
;
1301 struct ieee80211_hdr
*hdr11
;
1303 if (!netif_running(hwsim_mon
))
1306 skb
= dev_alloc_skb(100);
1310 hdr
= skb_put(skb
, sizeof(*hdr
));
1311 hdr
->hdr
.it_version
= PKTHDR_RADIOTAP_VERSION
;
1312 hdr
->hdr
.it_pad
= 0;
1313 hdr
->hdr
.it_len
= cpu_to_le16(sizeof(*hdr
));
1314 hdr
->hdr
.it_present
= cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS
) |
1315 (1 << IEEE80211_RADIOTAP_CHANNEL
));
1318 hdr
->rt_channel
= cpu_to_le16(chan
->center_freq
);
1319 flags
= IEEE80211_CHAN_2GHZ
;
1320 hdr
->rt_chbitmask
= cpu_to_le16(flags
);
1322 hdr11
= skb_put(skb
, 10);
1323 hdr11
->frame_control
= cpu_to_le16(IEEE80211_FTYPE_CTL
|
1324 IEEE80211_STYPE_ACK
);
1325 hdr11
->duration_id
= cpu_to_le16(0);
1326 memcpy(hdr11
->addr1
, addr
, ETH_ALEN
);
1328 skb
->dev
= hwsim_mon
;
1329 skb_reset_mac_header(skb
);
1330 skb
->ip_summed
= CHECKSUM_UNNECESSARY
;
1331 skb
->pkt_type
= PACKET_OTHERHOST
;
1332 skb
->protocol
= htons(ETH_P_802_2
);
1333 memset(skb
->cb
, 0, sizeof(skb
->cb
));
1337 struct mac80211_hwsim_addr_match_data
{
1342 static void mac80211_hwsim_addr_iter(void *data
, u8
*mac
,
1343 struct ieee80211_vif
*vif
)
1346 struct mac80211_hwsim_addr_match_data
*md
= data
;
1348 if (memcmp(mac
, md
->addr
, ETH_ALEN
) == 0) {
1353 /* Match the link address */
1354 for (i
= 0; i
< ARRAY_SIZE(vif
->link_conf
); i
++) {
1355 struct ieee80211_bss_conf
*conf
;
1357 conf
= rcu_dereference(vif
->link_conf
[i
]);
1361 if (memcmp(conf
->addr
, md
->addr
, ETH_ALEN
) == 0) {
1368 static bool mac80211_hwsim_addr_match(struct mac80211_hwsim_data
*data
,
1371 struct mac80211_hwsim_addr_match_data md
= {
1375 if (data
->scanning
&& memcmp(addr
, data
->scan_addr
, ETH_ALEN
) == 0)
1378 memcpy(md
.addr
, addr
, ETH_ALEN
);
1380 ieee80211_iterate_active_interfaces_atomic(data
->hw
,
1381 IEEE80211_IFACE_ITER_NORMAL
,
1382 mac80211_hwsim_addr_iter
,
1388 static bool hwsim_ps_rx_ok(struct mac80211_hwsim_data
*data
,
1389 struct sk_buff
*skb
)
1397 /* TODO: accept (some) Beacons by default and other frames only
1398 * if pending PS-Poll has been sent */
1400 case PS_MANUAL_POLL
:
1401 /* Allow unicast frames to own address if there is a pending
1403 if (data
->ps_poll_pending
&&
1404 mac80211_hwsim_addr_match(data
, skb
->data
+ 4)) {
1405 data
->ps_poll_pending
= false;
1414 static int hwsim_unicast_netgroup(struct mac80211_hwsim_data
*data
,
1415 struct sk_buff
*skb
, int portid
)
1422 for_each_net_rcu(net
) {
1423 if (data
->netgroup
== hwsim_net_get_netgroup(net
)) {
1424 res
= genlmsg_unicast(net
, skb
, portid
);
1437 static void mac80211_hwsim_config_mac_nl(struct ieee80211_hw
*hw
,
1438 const u8
*addr
, bool add
)
1440 struct mac80211_hwsim_data
*data
= hw
->priv
;
1441 u32 _portid
= READ_ONCE(data
->wmediumd
);
1442 struct sk_buff
*skb
;
1445 WARN_ON(!is_valid_ether_addr(addr
));
1447 if (!_portid
&& !hwsim_virtio_enabled
)
1450 skb
= genlmsg_new(GENLMSG_DEFAULT_SIZE
, GFP_ATOMIC
);
1454 msg_head
= genlmsg_put(skb
, 0, 0, &hwsim_genl_family
, 0,
1455 add
? HWSIM_CMD_ADD_MAC_ADDR
:
1456 HWSIM_CMD_DEL_MAC_ADDR
);
1458 pr_debug("mac80211_hwsim: problem with msg_head\n");
1459 goto nla_put_failure
;
1462 if (nla_put(skb
, HWSIM_ATTR_ADDR_TRANSMITTER
,
1463 ETH_ALEN
, data
->addresses
[1].addr
))
1464 goto nla_put_failure
;
1466 if (nla_put(skb
, HWSIM_ATTR_ADDR_RECEIVER
, ETH_ALEN
, addr
))
1467 goto nla_put_failure
;
1469 genlmsg_end(skb
, msg_head
);
1471 if (hwsim_virtio_enabled
)
1472 hwsim_tx_virtio(data
, skb
);
1474 hwsim_unicast_netgroup(data
, skb
, _portid
);
1480 static inline u16
trans_tx_rate_flags_ieee2hwsim(struct ieee80211_tx_rate
*rate
)
1484 if (rate
->flags
& IEEE80211_TX_RC_USE_RTS_CTS
)
1485 result
|= MAC80211_HWSIM_TX_RC_USE_RTS_CTS
;
1486 if (rate
->flags
& IEEE80211_TX_RC_USE_CTS_PROTECT
)
1487 result
|= MAC80211_HWSIM_TX_RC_USE_CTS_PROTECT
;
1488 if (rate
->flags
& IEEE80211_TX_RC_USE_SHORT_PREAMBLE
)
1489 result
|= MAC80211_HWSIM_TX_RC_USE_SHORT_PREAMBLE
;
1490 if (rate
->flags
& IEEE80211_TX_RC_MCS
)
1491 result
|= MAC80211_HWSIM_TX_RC_MCS
;
1492 if (rate
->flags
& IEEE80211_TX_RC_GREEN_FIELD
)
1493 result
|= MAC80211_HWSIM_TX_RC_GREEN_FIELD
;
1494 if (rate
->flags
& IEEE80211_TX_RC_40_MHZ_WIDTH
)
1495 result
|= MAC80211_HWSIM_TX_RC_40_MHZ_WIDTH
;
1496 if (rate
->flags
& IEEE80211_TX_RC_DUP_DATA
)
1497 result
|= MAC80211_HWSIM_TX_RC_DUP_DATA
;
1498 if (rate
->flags
& IEEE80211_TX_RC_SHORT_GI
)
1499 result
|= MAC80211_HWSIM_TX_RC_SHORT_GI
;
1500 if (rate
->flags
& IEEE80211_TX_RC_VHT_MCS
)
1501 result
|= MAC80211_HWSIM_TX_RC_VHT_MCS
;
1502 if (rate
->flags
& IEEE80211_TX_RC_80_MHZ_WIDTH
)
1503 result
|= MAC80211_HWSIM_TX_RC_80_MHZ_WIDTH
;
1504 if (rate
->flags
& IEEE80211_TX_RC_160_MHZ_WIDTH
)
1505 result
|= MAC80211_HWSIM_TX_RC_160_MHZ_WIDTH
;
1510 static void mac80211_hwsim_tx_frame_nl(struct ieee80211_hw
*hw
,
1511 struct sk_buff
*my_skb
,
1513 struct ieee80211_channel
*channel
)
1515 struct sk_buff
*skb
;
1516 struct mac80211_hwsim_data
*data
= hw
->priv
;
1517 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*) my_skb
->data
;
1518 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(my_skb
);
1520 unsigned int hwsim_flags
= 0;
1522 struct hwsim_tx_rate tx_attempts
[IEEE80211_TX_MAX_RATES
];
1523 struct hwsim_tx_rate_flag tx_attempts_flags
[IEEE80211_TX_MAX_RATES
];
1526 if (data
->ps
!= PS_DISABLED
)
1527 hdr
->frame_control
|= cpu_to_le16(IEEE80211_FCTL_PM
);
1528 /* If the queue contains MAX_QUEUE skb's drop some */
1529 if (skb_queue_len(&data
->pending
) >= MAX_QUEUE
) {
1530 /* Dropping until WARN_QUEUE level */
1531 while (skb_queue_len(&data
->pending
) >= WARN_QUEUE
) {
1532 ieee80211_free_txskb(hw
, skb_dequeue(&data
->pending
));
1537 skb
= genlmsg_new(GENLMSG_DEFAULT_SIZE
, GFP_ATOMIC
);
1539 goto nla_put_failure
;
1541 msg_head
= genlmsg_put(skb
, 0, 0, &hwsim_genl_family
, 0,
1543 if (msg_head
== NULL
) {
1544 pr_debug("mac80211_hwsim: problem with msg_head\n");
1545 goto nla_put_failure
;
1548 if (nla_put(skb
, HWSIM_ATTR_ADDR_TRANSMITTER
,
1549 ETH_ALEN
, data
->addresses
[1].addr
))
1550 goto nla_put_failure
;
1552 /* We get the skb->data */
1553 if (nla_put(skb
, HWSIM_ATTR_FRAME
, my_skb
->len
, my_skb
->data
))
1554 goto nla_put_failure
;
1556 /* We get the flags for this transmission, and we translate them to
1559 if (info
->flags
& IEEE80211_TX_CTL_REQ_TX_STATUS
)
1560 hwsim_flags
|= HWSIM_TX_CTL_REQ_TX_STATUS
;
1562 if (info
->flags
& IEEE80211_TX_CTL_NO_ACK
)
1563 hwsim_flags
|= HWSIM_TX_CTL_NO_ACK
;
1565 if (nla_put_u32(skb
, HWSIM_ATTR_FLAGS
, hwsim_flags
))
1566 goto nla_put_failure
;
1568 if (nla_put_u32(skb
, HWSIM_ATTR_FREQ
, channel
->center_freq
))
1569 goto nla_put_failure
;
1571 /* We get the tx control (rate and retries) info*/
1573 for (i
= 0; i
< IEEE80211_TX_MAX_RATES
; i
++) {
1574 tx_attempts
[i
].idx
= info
->status
.rates
[i
].idx
;
1575 tx_attempts_flags
[i
].idx
= info
->status
.rates
[i
].idx
;
1576 tx_attempts
[i
].count
= info
->status
.rates
[i
].count
;
1577 tx_attempts_flags
[i
].flags
=
1578 trans_tx_rate_flags_ieee2hwsim(
1579 &info
->status
.rates
[i
]);
1582 if (nla_put(skb
, HWSIM_ATTR_TX_INFO
,
1583 sizeof(struct hwsim_tx_rate
)*IEEE80211_TX_MAX_RATES
,
1585 goto nla_put_failure
;
1587 if (nla_put(skb
, HWSIM_ATTR_TX_INFO_FLAGS
,
1588 sizeof(struct hwsim_tx_rate_flag
) * IEEE80211_TX_MAX_RATES
,
1590 goto nla_put_failure
;
1592 /* We create a cookie to identify this skb */
1593 cookie
= atomic_inc_return(&data
->pending_cookie
);
1594 info
->rate_driver_data
[0] = (void *)cookie
;
1595 if (nla_put_u64_64bit(skb
, HWSIM_ATTR_COOKIE
, cookie
, HWSIM_ATTR_PAD
))
1596 goto nla_put_failure
;
1598 genlmsg_end(skb
, msg_head
);
1600 if (hwsim_virtio_enabled
) {
1601 if (hwsim_tx_virtio(data
, skb
))
1602 goto err_free_txskb
;
1604 if (hwsim_unicast_netgroup(data
, skb
, dst_portid
))
1605 goto err_free_txskb
;
1608 /* Enqueue the packet */
1609 skb_queue_tail(&data
->pending
, my_skb
);
1611 data
->tx_bytes
+= my_skb
->len
;
1617 pr_debug("mac80211_hwsim: error occurred in %s\n", __func__
);
1618 ieee80211_free_txskb(hw
, my_skb
);
1622 static bool hwsim_chans_compat(struct ieee80211_channel
*c1
,
1623 struct ieee80211_channel
*c2
)
1628 return c1
->center_freq
== c2
->center_freq
;
1631 struct tx_iter_data
{
1632 struct ieee80211_channel
*channel
;
1636 static void mac80211_hwsim_tx_iter(void *_data
, u8
*addr
,
1637 struct ieee80211_vif
*vif
)
1639 struct tx_iter_data
*data
= _data
;
1642 for (i
= 0; i
< ARRAY_SIZE(vif
->link_conf
); i
++) {
1643 struct ieee80211_bss_conf
*conf
;
1644 struct ieee80211_chanctx_conf
*chanctx
;
1646 conf
= rcu_dereference(vif
->link_conf
[i
]);
1650 chanctx
= rcu_dereference(conf
->chanctx_conf
);
1654 if (!hwsim_chans_compat(data
->channel
, chanctx
->def
.chan
))
1657 data
->receive
= true;
1662 static void mac80211_hwsim_add_vendor_rtap(struct sk_buff
*skb
)
1665 * To enable this code, #define the HWSIM_RADIOTAP_OUI,
1667 * #define HWSIM_RADIOTAP_OUI "\x02\x00\x00"
1668 * (but you should use a valid OUI, not that)
1670 * If anyone wants to 'donate' a radiotap OUI/subns code
1671 * please send a patch removing this #ifdef and changing
1672 * the values accordingly.
1674 #ifdef HWSIM_RADIOTAP_OUI
1675 struct ieee80211_radiotap_vendor_tlv
*rtap
;
1676 static const char vendor_data
[8] = "ABCDEFGH";
1678 // Make sure no padding is needed
1679 BUILD_BUG_ON(sizeof(vendor_data
) % 4);
1680 /* this is last radiotap info before the mac header, so
1681 * skb_reset_mac_header for mac8022 to know the end of
1682 * the radiotap TLV/beginning of the 802.11 header
1684 skb_reset_mac_header(skb
);
1687 * Note that this code requires the headroom in the SKB
1688 * that was allocated earlier.
1690 rtap
= skb_push(skb
, sizeof(*rtap
) + sizeof(vendor_data
));
1692 rtap
->len
= cpu_to_le16(sizeof(*rtap
) -
1693 sizeof(struct ieee80211_radiotap_tlv
) +
1694 sizeof(vendor_data
));
1695 rtap
->type
= cpu_to_le16(IEEE80211_RADIOTAP_VENDOR_NAMESPACE
);
1697 rtap
->content
.oui
[0] = HWSIM_RADIOTAP_OUI
[0];
1698 rtap
->content
.oui
[1] = HWSIM_RADIOTAP_OUI
[1];
1699 rtap
->content
.oui
[2] = HWSIM_RADIOTAP_OUI
[2];
1700 rtap
->content
.oui_subtype
= 127;
1701 /* clear reserved field */
1702 rtap
->content
.reserved
= 0;
1703 rtap
->content
.vendor_type
= 0;
1704 memcpy(rtap
->content
.data
, vendor_data
, sizeof(vendor_data
));
1706 IEEE80211_SKB_RXCB(skb
)->flag
|= RX_FLAG_RADIOTAP_TLV_AT_END
;
1710 static void mac80211_hwsim_rx(struct mac80211_hwsim_data
*data
,
1711 struct ieee80211_rx_status
*rx_status
,
1712 struct sk_buff
*skb
)
1714 struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
1716 if (!ieee80211_has_morefrags(hdr
->frame_control
) &&
1717 !is_multicast_ether_addr(hdr
->addr1
) &&
1718 (ieee80211_is_mgmt(hdr
->frame_control
) ||
1719 ieee80211_is_data(hdr
->frame_control
))) {
1720 struct ieee80211_sta
*sta
;
1721 unsigned int link_id
;
1724 sta
= ieee80211_find_sta_by_link_addrs(data
->hw
, hdr
->addr2
,
1725 hdr
->addr1
, &link_id
);
1727 struct hwsim_sta_priv
*sp
= (void *)sta
->drv_priv
;
1729 if (ieee80211_has_pm(hdr
->frame_control
))
1730 sp
->active_links_rx
&= ~BIT(link_id
);
1732 sp
->active_links_rx
|= BIT(link_id
);
1734 rx_status
->link_valid
= true;
1735 rx_status
->link_id
= link_id
;
1740 memcpy(IEEE80211_SKB_RXCB(skb
), rx_status
, sizeof(*rx_status
));
1742 mac80211_hwsim_add_vendor_rtap(skb
);
1745 data
->rx_bytes
+= skb
->len
;
1746 ieee80211_rx_irqsafe(data
->hw
, skb
);
1749 static bool mac80211_hwsim_tx_frame_no_nl(struct ieee80211_hw
*hw
,
1750 struct sk_buff
*skb
,
1751 struct ieee80211_channel
*chan
)
1753 struct mac80211_hwsim_data
*data
= hw
->priv
, *data2
;
1755 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*) skb
->data
;
1756 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
1757 struct ieee80211_rx_status rx_status
;
1760 memset(&rx_status
, 0, sizeof(rx_status
));
1761 rx_status
.flag
|= RX_FLAG_MACTIME_START
;
1762 rx_status
.freq
= chan
->center_freq
;
1763 rx_status
.freq_offset
= chan
->freq_offset
? 1 : 0;
1764 rx_status
.band
= chan
->band
;
1765 if (info
->control
.rates
[0].flags
& IEEE80211_TX_RC_VHT_MCS
) {
1766 rx_status
.rate_idx
=
1767 ieee80211_rate_get_vht_mcs(&info
->control
.rates
[0]);
1769 ieee80211_rate_get_vht_nss(&info
->control
.rates
[0]);
1770 rx_status
.encoding
= RX_ENC_VHT
;
1772 rx_status
.rate_idx
= info
->control
.rates
[0].idx
;
1773 if (info
->control
.rates
[0].flags
& IEEE80211_TX_RC_MCS
)
1774 rx_status
.encoding
= RX_ENC_HT
;
1776 if (info
->control
.rates
[0].flags
& IEEE80211_TX_RC_40_MHZ_WIDTH
)
1777 rx_status
.bw
= RATE_INFO_BW_40
;
1778 else if (info
->control
.rates
[0].flags
& IEEE80211_TX_RC_80_MHZ_WIDTH
)
1779 rx_status
.bw
= RATE_INFO_BW_80
;
1780 else if (info
->control
.rates
[0].flags
& IEEE80211_TX_RC_160_MHZ_WIDTH
)
1781 rx_status
.bw
= RATE_INFO_BW_160
;
1783 rx_status
.bw
= RATE_INFO_BW_20
;
1784 if (info
->control
.rates
[0].flags
& IEEE80211_TX_RC_SHORT_GI
)
1785 rx_status
.enc_flags
|= RX_ENC_FLAG_SHORT_GI
;
1786 /* TODO: simulate optional packet loss */
1787 rx_status
.signal
= data
->rx_rssi
;
1788 if (info
->control
.vif
)
1789 rx_status
.signal
+= info
->control
.vif
->bss_conf
.txpower
;
1791 if (data
->ps
!= PS_DISABLED
)
1792 hdr
->frame_control
|= cpu_to_le16(IEEE80211_FCTL_PM
);
1794 /* release the skb's source info */
1802 * Get absolute mactime here so all HWs RX at the "same time", and
1803 * absolute TX time for beacon mactime so the timestamp matches.
1804 * Giving beacons a different mactime than non-beacons looks messy, but
1805 * it helps the Toffset be exact and a ~10us mactime discrepancy
1806 * probably doesn't really matter.
1808 if (ieee80211_is_beacon(hdr
->frame_control
) ||
1809 ieee80211_is_probe_resp(hdr
->frame_control
)) {
1810 rx_status
.boottime_ns
= ktime_get_boottime_ns();
1811 now
= data
->abs_bcn_ts
;
1813 now
= mac80211_hwsim_get_tsf_raw();
1816 /* Copy skb to all enabled radios that are on the current frequency */
1817 spin_lock(&hwsim_radio_lock
);
1818 list_for_each_entry(data2
, &hwsim_radios
, list
) {
1819 struct sk_buff
*nskb
;
1820 struct tx_iter_data tx_iter_data
= {
1828 if (!data2
->started
|| (data2
->idle
&& !data2
->tmp_chan
) ||
1829 !hwsim_ps_rx_ok(data2
, skb
))
1832 if (!(data
->group
& data2
->group
))
1835 if (data
->netgroup
!= data2
->netgroup
)
1838 if (!hwsim_chans_compat(chan
, data2
->tmp_chan
) &&
1839 !hwsim_chans_compat(chan
, data2
->channel
)) {
1840 ieee80211_iterate_active_interfaces_atomic(
1841 data2
->hw
, IEEE80211_IFACE_ITER_NORMAL
,
1842 mac80211_hwsim_tx_iter
, &tx_iter_data
);
1843 if (!tx_iter_data
.receive
)
1848 * reserve some space for our vendor and the normal
1849 * radiotap header, since we're copying anyway
1851 if (skb
->len
< PAGE_SIZE
&& paged_rx
) {
1852 struct page
*page
= alloc_page(GFP_ATOMIC
);
1857 nskb
= dev_alloc_skb(128);
1863 memcpy(page_address(page
), skb
->data
, skb
->len
);
1864 skb_add_rx_frag(nskb
, 0, page
, 0, skb
->len
, skb
->len
);
1866 nskb
= skb_copy(skb
, GFP_ATOMIC
);
1871 if (mac80211_hwsim_addr_match(data2
, hdr
->addr1
))
1874 rx_status
.mactime
= now
+ data2
->tsf_offset
;
1876 mac80211_hwsim_rx(data2
, &rx_status
, nskb
);
1878 spin_unlock(&hwsim_radio_lock
);
1883 static struct ieee80211_bss_conf
*
1884 mac80211_hwsim_select_tx_link(struct mac80211_hwsim_data
*data
,
1885 struct ieee80211_vif
*vif
,
1886 struct ieee80211_sta
*sta
,
1887 struct ieee80211_hdr
*hdr
,
1888 struct ieee80211_link_sta
**link_sta
)
1890 struct hwsim_sta_priv
*sp
= (void *)sta
->drv_priv
;
1893 if (!ieee80211_vif_is_mld(vif
))
1894 return &vif
->bss_conf
;
1896 WARN_ON(is_multicast_ether_addr(hdr
->addr1
));
1898 if (WARN_ON_ONCE(!sta
|| !sta
->valid_links
))
1899 return &vif
->bss_conf
;
1901 for (i
= 0; i
< ARRAY_SIZE(vif
->link_conf
); i
++) {
1902 struct ieee80211_bss_conf
*bss_conf
;
1903 unsigned int link_id
;
1905 /* round-robin the available link IDs */
1906 link_id
= (sp
->last_link
+ i
+ 1) % ARRAY_SIZE(vif
->link_conf
);
1908 if (!(vif
->active_links
& BIT(link_id
)))
1911 if (!(sp
->active_links_rx
& BIT(link_id
)))
1914 *link_sta
= rcu_dereference(sta
->link
[link_id
]);
1918 bss_conf
= rcu_dereference(vif
->link_conf
[link_id
]);
1919 if (WARN_ON_ONCE(!bss_conf
))
1922 /* can happen while switching links */
1923 if (!rcu_access_pointer(bss_conf
->chanctx_conf
))
1926 sp
->last_link
= link_id
;
1933 static void mac80211_hwsim_tx(struct ieee80211_hw
*hw
,
1934 struct ieee80211_tx_control
*control
,
1935 struct sk_buff
*skb
)
1937 struct mac80211_hwsim_data
*data
= hw
->priv
;
1938 struct ieee80211_tx_info
*txi
= IEEE80211_SKB_CB(skb
);
1939 struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
1940 struct ieee80211_chanctx_conf
*chanctx_conf
;
1941 struct ieee80211_channel
*channel
;
1943 enum nl80211_chan_width confbw
= NL80211_CHAN_WIDTH_20_NOHT
;
1946 if (WARN_ON(skb
->len
< 10)) {
1947 /* Should not happen; just a sanity check for addr1 use */
1948 ieee80211_free_txskb(hw
, skb
);
1952 if (!data
->use_chanctx
) {
1953 channel
= data
->channel
;
1955 } else if (txi
->hw_queue
== 4) {
1956 channel
= data
->tmp_chan
;
1958 u8 link
= u32_get_bits(IEEE80211_SKB_CB(skb
)->control
.flags
,
1959 IEEE80211_TX_CTRL_MLO_LINK
);
1960 struct ieee80211_vif
*vif
= txi
->control
.vif
;
1961 struct ieee80211_link_sta
*link_sta
= NULL
;
1962 struct ieee80211_sta
*sta
= control
->sta
;
1963 struct ieee80211_bss_conf
*bss_conf
;
1965 if (link
!= IEEE80211_LINK_UNSPECIFIED
) {
1966 bss_conf
= rcu_dereference(txi
->control
.vif
->link_conf
[link
]);
1968 link_sta
= rcu_dereference(sta
->link
[link
]);
1970 bss_conf
= mac80211_hwsim_select_tx_link(data
, vif
, sta
,
1974 if (unlikely(!bss_conf
)) {
1975 /* if it's an MLO STA, it might have deactivated all
1976 * links temporarily - but we don't handle real PS in
1977 * this code yet, so just drop the frame in that case
1979 WARN(link
!= IEEE80211_LINK_UNSPECIFIED
|| !sta
|| !sta
->mlo
,
1980 "link:%d, sta:%pM, sta->mlo:%d\n",
1981 link
, sta
? sta
->addr
: NULL
, sta
? sta
->mlo
: -1);
1982 ieee80211_free_txskb(hw
, skb
);
1986 if (sta
&& sta
->mlo
) {
1987 if (WARN_ON(!link_sta
)) {
1988 ieee80211_free_txskb(hw
, skb
);
1991 /* address translation to link addresses on TX */
1992 ether_addr_copy(hdr
->addr1
, link_sta
->addr
);
1993 ether_addr_copy(hdr
->addr2
, bss_conf
->addr
);
1994 /* translate A3 only if it's the BSSID */
1995 if (!ieee80211_has_tods(hdr
->frame_control
) &&
1996 !ieee80211_has_fromds(hdr
->frame_control
)) {
1997 if (ether_addr_equal(hdr
->addr3
, sta
->addr
))
1998 ether_addr_copy(hdr
->addr3
, link_sta
->addr
);
1999 else if (ether_addr_equal(hdr
->addr3
, vif
->addr
))
2000 ether_addr_copy(hdr
->addr3
, bss_conf
->addr
);
2002 /* no need to look at A4, if present it's SA */
2005 chanctx_conf
= rcu_dereference(bss_conf
->chanctx_conf
);
2007 channel
= chanctx_conf
->def
.chan
;
2008 confbw
= chanctx_conf
->def
.width
;
2014 if (WARN(!channel
, "TX w/o channel - queue = %d\n", txi
->hw_queue
)) {
2015 ieee80211_free_txskb(hw
, skb
);
2019 if (data
->idle
&& !data
->tmp_chan
) {
2020 wiphy_dbg(hw
->wiphy
, "Trying to TX when idle - reject\n");
2021 ieee80211_free_txskb(hw
, skb
);
2025 if (txi
->control
.vif
)
2026 hwsim_check_magic(txi
->control
.vif
);
2028 hwsim_check_sta_magic(control
->sta
);
2030 if (ieee80211_hw_check(hw
, SUPPORTS_RC_TABLE
))
2031 ieee80211_get_tx_rates(txi
->control
.vif
, control
->sta
, skb
,
2033 ARRAY_SIZE(txi
->control
.rates
));
2035 for (i
= 0; i
< ARRAY_SIZE(txi
->control
.rates
); i
++) {
2036 u16 rflags
= txi
->control
.rates
[i
].flags
;
2037 /* initialize to data->bw for 5/10 MHz handling */
2038 enum nl80211_chan_width bw
= data
->bw
;
2040 if (txi
->control
.rates
[i
].idx
== -1)
2043 if (rflags
& IEEE80211_TX_RC_40_MHZ_WIDTH
)
2044 bw
= NL80211_CHAN_WIDTH_40
;
2045 else if (rflags
& IEEE80211_TX_RC_80_MHZ_WIDTH
)
2046 bw
= NL80211_CHAN_WIDTH_80
;
2047 else if (rflags
& IEEE80211_TX_RC_160_MHZ_WIDTH
)
2048 bw
= NL80211_CHAN_WIDTH_160
;
2050 if (WARN_ON(hwsim_get_chanwidth(bw
) > hwsim_get_chanwidth(confbw
)))
2054 if (skb
->len
>= 24 + 8 &&
2055 ieee80211_is_probe_resp(hdr
->frame_control
)) {
2056 /* fake header transmission time */
2057 struct ieee80211_mgmt
*mgmt
;
2058 struct ieee80211_rate
*txrate
;
2063 mgmt
= (struct ieee80211_mgmt
*)skb
->data
;
2064 txrate
= ieee80211_get_tx_rate(hw
, txi
);
2066 bitrate
= txrate
->bitrate
;
2067 ts
= mac80211_hwsim_get_tsf_raw();
2068 mgmt
->u
.probe_resp
.timestamp
=
2069 cpu_to_le64(ts
+ data
->tsf_offset
+
2070 24 * 8 * 10 / bitrate
);
2073 mac80211_hwsim_monitor_rx(hw
, skb
, channel
);
2075 /* wmediumd mode check */
2076 _portid
= READ_ONCE(data
->wmediumd
);
2078 if (_portid
|| hwsim_virtio_enabled
)
2079 return mac80211_hwsim_tx_frame_nl(hw
, skb
, _portid
, channel
);
2081 /* NO wmediumd detected, perfect medium simulation */
2083 data
->tx_bytes
+= skb
->len
;
2084 ack
= mac80211_hwsim_tx_frame_no_nl(hw
, skb
, channel
);
2086 if (ack
&& skb
->len
>= 16)
2087 mac80211_hwsim_monitor_ack(channel
, hdr
->addr2
);
2089 ieee80211_tx_info_clear_status(txi
);
2091 /* frame was transmitted at most favorable rate at first attempt */
2092 txi
->control
.rates
[0].count
= 1;
2093 txi
->control
.rates
[1].idx
= -1;
2095 if (!(txi
->flags
& IEEE80211_TX_CTL_NO_ACK
) && ack
)
2096 txi
->flags
|= IEEE80211_TX_STAT_ACK
;
2097 ieee80211_tx_status_irqsafe(hw
, skb
);
2101 static int mac80211_hwsim_start(struct ieee80211_hw
*hw
)
2103 struct mac80211_hwsim_data
*data
= hw
->priv
;
2104 wiphy_dbg(hw
->wiphy
, "%s\n", __func__
);
2105 data
->started
= true;
2110 static void mac80211_hwsim_stop(struct ieee80211_hw
*hw
, bool suspend
)
2112 struct mac80211_hwsim_data
*data
= hw
->priv
;
2115 data
->started
= false;
2117 for (i
= 0; i
< ARRAY_SIZE(data
->link_data
); i
++)
2118 hrtimer_cancel(&data
->link_data
[i
].beacon_timer
);
2120 while (!skb_queue_empty(&data
->pending
))
2121 ieee80211_free_txskb(hw
, skb_dequeue(&data
->pending
));
2123 wiphy_dbg(hw
->wiphy
, "%s\n", __func__
);
2127 static int mac80211_hwsim_add_interface(struct ieee80211_hw
*hw
,
2128 struct ieee80211_vif
*vif
)
2130 wiphy_dbg(hw
->wiphy
, "%s (type=%d mac_addr=%pM)\n",
2131 __func__
, ieee80211_vif_type_p2p(vif
),
2133 hwsim_set_magic(vif
);
2135 if (vif
->type
!= NL80211_IFTYPE_MONITOR
)
2136 mac80211_hwsim_config_mac_nl(hw
, vif
->addr
, true);
2139 vif
->hw_queue
[IEEE80211_AC_VO
] = 0;
2140 vif
->hw_queue
[IEEE80211_AC_VI
] = 1;
2141 vif
->hw_queue
[IEEE80211_AC_BE
] = 2;
2142 vif
->hw_queue
[IEEE80211_AC_BK
] = 3;
2147 #ifdef CONFIG_MAC80211_DEBUGFS
2149 mac80211_hwsim_link_add_debugfs(struct ieee80211_hw
*hw
,
2150 struct ieee80211_vif
*vif
,
2151 struct ieee80211_bss_conf
*link_conf
,
2154 struct hwsim_vif_priv
*vp
= (void *)vif
->drv_priv
;
2156 debugfs_create_u32("skip_beacons", 0600, dir
,
2157 &vp
->skip_beacons
[link_conf
->link_id
]);
2161 static int mac80211_hwsim_change_interface(struct ieee80211_hw
*hw
,
2162 struct ieee80211_vif
*vif
,
2163 enum nl80211_iftype newtype
,
2166 newtype
= ieee80211_iftype_p2p(newtype
, newp2p
);
2167 wiphy_dbg(hw
->wiphy
,
2168 "%s (old type=%d, new type=%d, mac_addr=%pM)\n",
2169 __func__
, ieee80211_vif_type_p2p(vif
),
2170 newtype
, vif
->addr
);
2171 hwsim_check_magic(vif
);
2174 * interface may change from non-AP to AP in
2175 * which case this needs to be set up again
2182 static void mac80211_hwsim_remove_interface(
2183 struct ieee80211_hw
*hw
, struct ieee80211_vif
*vif
)
2185 wiphy_dbg(hw
->wiphy
, "%s (type=%d mac_addr=%pM)\n",
2186 __func__
, ieee80211_vif_type_p2p(vif
),
2188 hwsim_check_magic(vif
);
2189 hwsim_clear_magic(vif
);
2190 if (vif
->type
!= NL80211_IFTYPE_MONITOR
)
2191 mac80211_hwsim_config_mac_nl(hw
, vif
->addr
, false);
2194 static void mac80211_hwsim_tx_frame(struct ieee80211_hw
*hw
,
2195 struct sk_buff
*skb
,
2196 struct ieee80211_channel
*chan
)
2198 struct mac80211_hwsim_data
*data
= hw
->priv
;
2199 u32 _portid
= READ_ONCE(data
->wmediumd
);
2201 if (ieee80211_hw_check(hw
, SUPPORTS_RC_TABLE
)) {
2202 struct ieee80211_tx_info
*txi
= IEEE80211_SKB_CB(skb
);
2203 ieee80211_get_tx_rates(txi
->control
.vif
, NULL
, skb
,
2205 ARRAY_SIZE(txi
->control
.rates
));
2208 mac80211_hwsim_monitor_rx(hw
, skb
, chan
);
2210 if (_portid
|| hwsim_virtio_enabled
)
2211 return mac80211_hwsim_tx_frame_nl(hw
, skb
, _portid
, chan
);
2214 data
->tx_bytes
+= skb
->len
;
2215 mac80211_hwsim_tx_frame_no_nl(hw
, skb
, chan
);
2219 static void __mac80211_hwsim_beacon_tx(struct ieee80211_bss_conf
*link_conf
,
2220 struct mac80211_hwsim_data
*data
,
2221 struct ieee80211_hw
*hw
,
2222 struct ieee80211_vif
*vif
,
2223 struct sk_buff
*skb
)
2225 struct hwsim_vif_priv
*vp
= (void *)vif
->drv_priv
;
2226 struct ieee80211_tx_info
*info
;
2227 struct ieee80211_rate
*txrate
;
2228 struct ieee80211_mgmt
*mgmt
;
2232 if (vp
->skip_beacons
[link_conf
->link_id
]) {
2233 vp
->skip_beacons
[link_conf
->link_id
]--;
2238 info
= IEEE80211_SKB_CB(skb
);
2239 if (ieee80211_hw_check(hw
, SUPPORTS_RC_TABLE
))
2240 ieee80211_get_tx_rates(vif
, NULL
, skb
,
2241 info
->control
.rates
,
2242 ARRAY_SIZE(info
->control
.rates
));
2244 txrate
= ieee80211_get_tx_rate(hw
, info
);
2246 bitrate
= txrate
->bitrate
;
2248 mgmt
= (struct ieee80211_mgmt
*) skb
->data
;
2249 /* fake header transmission time */
2250 data
->abs_bcn_ts
= mac80211_hwsim_get_tsf_raw();
2251 if (ieee80211_is_s1g_beacon(mgmt
->frame_control
)) {
2252 struct ieee80211_ext
*ext
= (void *) mgmt
;
2254 ext
->u
.s1g_beacon
.timestamp
= cpu_to_le32(data
->abs_bcn_ts
+
2259 mgmt
->u
.beacon
.timestamp
= cpu_to_le64(data
->abs_bcn_ts
+
2265 mac80211_hwsim_tx_frame(hw
, skb
,
2266 rcu_dereference(link_conf
->chanctx_conf
)->def
.chan
);
2269 static void mac80211_hwsim_beacon_tx(void *arg
, u8
*mac
,
2270 struct ieee80211_vif
*vif
)
2272 struct mac80211_hwsim_link_data
*link_data
= arg
;
2273 u32 link_id
= link_data
->link_id
;
2274 struct ieee80211_bss_conf
*link_conf
;
2275 struct mac80211_hwsim_data
*data
=
2276 container_of(link_data
, struct mac80211_hwsim_data
,
2277 link_data
[link_id
]);
2278 struct ieee80211_hw
*hw
= data
->hw
;
2279 struct sk_buff
*skb
;
2281 hwsim_check_magic(vif
);
2283 link_conf
= rcu_dereference(vif
->link_conf
[link_id
]);
2287 if (vif
->type
!= NL80211_IFTYPE_AP
&&
2288 vif
->type
!= NL80211_IFTYPE_MESH_POINT
&&
2289 vif
->type
!= NL80211_IFTYPE_ADHOC
&&
2290 vif
->type
!= NL80211_IFTYPE_OCB
)
2293 if (vif
->mbssid_tx_vif
&& vif
->mbssid_tx_vif
!= vif
)
2296 if (vif
->bss_conf
.ema_ap
) {
2297 struct ieee80211_ema_beacons
*ema
;
2300 ema
= ieee80211_beacon_get_template_ema_list(hw
, vif
, link_id
);
2301 if (!ema
|| !ema
->cnt
)
2304 for (i
= 0; i
< ema
->cnt
; i
++) {
2305 __mac80211_hwsim_beacon_tx(link_conf
, data
, hw
, vif
,
2307 ema
->bcn
[i
].skb
= NULL
; /* Already freed */
2309 ieee80211_beacon_free_ema_list(ema
);
2311 skb
= ieee80211_beacon_get(hw
, vif
, link_id
);
2315 __mac80211_hwsim_beacon_tx(link_conf
, data
, hw
, vif
, skb
);
2318 while ((skb
= ieee80211_get_buffered_bc(hw
, vif
)) != NULL
) {
2319 mac80211_hwsim_tx_frame(hw
, skb
,
2320 rcu_dereference(link_conf
->chanctx_conf
)->def
.chan
);
2323 if (link_conf
->csa_active
&& ieee80211_beacon_cntdwn_is_complete(vif
, link_id
))
2324 ieee80211_csa_finish(vif
, link_id
);
2326 if (link_conf
->color_change_active
&&
2327 ieee80211_beacon_cntdwn_is_complete(vif
, link_id
))
2328 ieee80211_color_change_finish(vif
, link_id
);
2331 static enum hrtimer_restart
2332 mac80211_hwsim_beacon(struct hrtimer
*timer
)
2334 struct mac80211_hwsim_link_data
*link_data
=
2335 container_of(timer
, struct mac80211_hwsim_link_data
, beacon_timer
);
2336 struct mac80211_hwsim_data
*data
=
2337 container_of(link_data
, struct mac80211_hwsim_data
,
2338 link_data
[link_data
->link_id
]);
2339 struct ieee80211_hw
*hw
= data
->hw
;
2340 u64 bcn_int
= link_data
->beacon_int
;
2343 return HRTIMER_NORESTART
;
2345 ieee80211_iterate_active_interfaces_atomic(
2346 hw
, IEEE80211_IFACE_ITER_NORMAL
,
2347 mac80211_hwsim_beacon_tx
, link_data
);
2349 /* beacon at new TBTT + beacon interval */
2350 if (data
->bcn_delta
) {
2351 bcn_int
-= data
->bcn_delta
;
2352 data
->bcn_delta
= 0;
2354 hrtimer_forward_now(&link_data
->beacon_timer
,
2355 ns_to_ktime(bcn_int
* NSEC_PER_USEC
));
2356 return HRTIMER_RESTART
;
2359 static const char * const hwsim_chanwidths
[] = {
2360 [NL80211_CHAN_WIDTH_5
] = "ht5",
2361 [NL80211_CHAN_WIDTH_10
] = "ht10",
2362 [NL80211_CHAN_WIDTH_20_NOHT
] = "noht",
2363 [NL80211_CHAN_WIDTH_20
] = "ht20",
2364 [NL80211_CHAN_WIDTH_40
] = "ht40",
2365 [NL80211_CHAN_WIDTH_80
] = "vht80",
2366 [NL80211_CHAN_WIDTH_80P80
] = "vht80p80",
2367 [NL80211_CHAN_WIDTH_160
] = "vht160",
2368 [NL80211_CHAN_WIDTH_1
] = "1MHz",
2369 [NL80211_CHAN_WIDTH_2
] = "2MHz",
2370 [NL80211_CHAN_WIDTH_4
] = "4MHz",
2371 [NL80211_CHAN_WIDTH_8
] = "8MHz",
2372 [NL80211_CHAN_WIDTH_16
] = "16MHz",
2373 [NL80211_CHAN_WIDTH_320
] = "eht320",
2376 static int mac80211_hwsim_config(struct ieee80211_hw
*hw
, u32 changed
)
2378 struct mac80211_hwsim_data
*data
= hw
->priv
;
2379 struct ieee80211_conf
*conf
= &hw
->conf
;
2380 static const char *smps_modes
[IEEE80211_SMPS_NUM_MODES
] = {
2381 [IEEE80211_SMPS_AUTOMATIC
] = "auto",
2382 [IEEE80211_SMPS_OFF
] = "off",
2383 [IEEE80211_SMPS_STATIC
] = "static",
2384 [IEEE80211_SMPS_DYNAMIC
] = "dynamic",
2388 if (conf
->chandef
.chan
)
2389 wiphy_dbg(hw
->wiphy
,
2390 "%s (freq=%d(%d - %d)/%s idle=%d ps=%d smps=%s)\n",
2392 conf
->chandef
.chan
->center_freq
,
2393 conf
->chandef
.center_freq1
,
2394 conf
->chandef
.center_freq2
,
2395 hwsim_chanwidths
[conf
->chandef
.width
],
2396 !!(conf
->flags
& IEEE80211_CONF_IDLE
),
2397 !!(conf
->flags
& IEEE80211_CONF_PS
),
2398 smps_modes
[conf
->smps_mode
]);
2400 wiphy_dbg(hw
->wiphy
,
2401 "%s (freq=0 idle=%d ps=%d smps=%s)\n",
2403 !!(conf
->flags
& IEEE80211_CONF_IDLE
),
2404 !!(conf
->flags
& IEEE80211_CONF_PS
),
2405 smps_modes
[conf
->smps_mode
]);
2407 data
->idle
= !!(conf
->flags
& IEEE80211_CONF_IDLE
);
2409 WARN_ON(conf
->chandef
.chan
&& data
->use_chanctx
);
2411 mutex_lock(&data
->mutex
);
2412 if (data
->scanning
&& conf
->chandef
.chan
) {
2413 for (idx
= 0; idx
< ARRAY_SIZE(data
->survey_data
); idx
++) {
2414 if (data
->survey_data
[idx
].channel
== data
->channel
) {
2415 data
->survey_data
[idx
].start
=
2416 data
->survey_data
[idx
].next_start
;
2417 data
->survey_data
[idx
].end
= jiffies
;
2422 data
->channel
= conf
->chandef
.chan
;
2423 data
->bw
= conf
->chandef
.width
;
2425 for (idx
= 0; idx
< ARRAY_SIZE(data
->survey_data
); idx
++) {
2426 if (data
->survey_data
[idx
].channel
&&
2427 data
->survey_data
[idx
].channel
!= data
->channel
)
2429 data
->survey_data
[idx
].channel
= data
->channel
;
2430 data
->survey_data
[idx
].next_start
= jiffies
;
2434 data
->channel
= conf
->chandef
.chan
;
2435 data
->bw
= conf
->chandef
.width
;
2437 mutex_unlock(&data
->mutex
);
2439 for (idx
= 0; idx
< ARRAY_SIZE(data
->link_data
); idx
++) {
2440 struct mac80211_hwsim_link_data
*link_data
=
2441 &data
->link_data
[idx
];
2443 if (!data
->started
|| !link_data
->beacon_int
) {
2444 hrtimer_cancel(&link_data
->beacon_timer
);
2445 } else if (!hrtimer_active(&link_data
->beacon_timer
)) {
2446 u64 tsf
= mac80211_hwsim_get_tsf(hw
, NULL
);
2447 u32 bcn_int
= link_data
->beacon_int
;
2448 u64 until_tbtt
= bcn_int
- do_div(tsf
, bcn_int
);
2450 hrtimer_start(&link_data
->beacon_timer
,
2451 ns_to_ktime(until_tbtt
* NSEC_PER_USEC
),
2452 HRTIMER_MODE_REL_SOFT
);
2460 static void mac80211_hwsim_configure_filter(struct ieee80211_hw
*hw
,
2461 unsigned int changed_flags
,
2462 unsigned int *total_flags
,u64 multicast
)
2464 struct mac80211_hwsim_data
*data
= hw
->priv
;
2466 wiphy_dbg(hw
->wiphy
, "%s\n", __func__
);
2468 data
->rx_filter
= 0;
2469 if (*total_flags
& FIF_ALLMULTI
)
2470 data
->rx_filter
|= FIF_ALLMULTI
;
2471 if (*total_flags
& FIF_MCAST_ACTION
)
2472 data
->rx_filter
|= FIF_MCAST_ACTION
;
2474 *total_flags
= data
->rx_filter
;
2477 static void mac80211_hwsim_bcn_en_iter(void *data
, u8
*mac
,
2478 struct ieee80211_vif
*vif
)
2480 unsigned int *count
= data
;
2481 struct hwsim_vif_priv
*vp
= (void *)vif
->drv_priv
;
2487 static void mac80211_hwsim_vif_info_changed(struct ieee80211_hw
*hw
,
2488 struct ieee80211_vif
*vif
,
2491 struct hwsim_vif_priv
*vp
= (void *)vif
->drv_priv
;
2493 hwsim_check_magic(vif
);
2495 wiphy_dbg(hw
->wiphy
, "%s(changed=0x%llx vif->addr=%pM)\n",
2496 __func__
, changed
, vif
->addr
);
2498 if (changed
& BSS_CHANGED_ASSOC
) {
2499 wiphy_dbg(hw
->wiphy
, " ASSOC: assoc=%d aid=%d\n",
2500 vif
->cfg
.assoc
, vif
->cfg
.aid
);
2501 vp
->assoc
= vif
->cfg
.assoc
;
2502 vp
->aid
= vif
->cfg
.aid
;
2505 if (vif
->type
== NL80211_IFTYPE_STATION
&&
2506 changed
& (BSS_CHANGED_MLD_VALID_LINKS
| BSS_CHANGED_MLD_TTLM
)) {
2507 u16 usable_links
= ieee80211_vif_usable_links(vif
);
2509 if (vif
->active_links
!= usable_links
)
2510 ieee80211_set_active_links_async(vif
, usable_links
);
2514 static void mac80211_hwsim_link_info_changed(struct ieee80211_hw
*hw
,
2515 struct ieee80211_vif
*vif
,
2516 struct ieee80211_bss_conf
*info
,
2519 struct hwsim_vif_priv
*vp
= (void *)vif
->drv_priv
;
2520 struct mac80211_hwsim_data
*data
= hw
->priv
;
2521 unsigned int link_id
= info
->link_id
;
2522 struct mac80211_hwsim_link_data
*link_data
= &data
->link_data
[link_id
];
2524 hwsim_check_magic(vif
);
2526 wiphy_dbg(hw
->wiphy
, "%s(changed=0x%llx vif->addr=%pM, link id %u)\n",
2527 __func__
, (unsigned long long)changed
, vif
->addr
, link_id
);
2529 if (changed
& BSS_CHANGED_BSSID
) {
2530 wiphy_dbg(hw
->wiphy
, "%s: BSSID changed: %pM\n",
2531 __func__
, info
->bssid
);
2532 memcpy(vp
->bssid
, info
->bssid
, ETH_ALEN
);
2535 if (changed
& BSS_CHANGED_BEACON_ENABLED
) {
2536 wiphy_dbg(hw
->wiphy
, " BCN EN: %d (BI=%u)\n",
2537 info
->enable_beacon
, info
->beacon_int
);
2538 vp
->bcn_en
= info
->enable_beacon
;
2539 if (data
->started
&&
2540 !hrtimer_active(&link_data
->beacon_timer
) &&
2541 info
->enable_beacon
) {
2542 u64 tsf
, until_tbtt
;
2544 link_data
->beacon_int
= info
->beacon_int
* 1024;
2545 tsf
= mac80211_hwsim_get_tsf(hw
, vif
);
2546 bcn_int
= link_data
->beacon_int
;
2547 until_tbtt
= bcn_int
- do_div(tsf
, bcn_int
);
2549 hrtimer_start(&link_data
->beacon_timer
,
2550 ns_to_ktime(until_tbtt
* NSEC_PER_USEC
),
2551 HRTIMER_MODE_REL_SOFT
);
2552 } else if (!info
->enable_beacon
) {
2553 unsigned int count
= 0;
2554 ieee80211_iterate_active_interfaces_atomic(
2555 data
->hw
, IEEE80211_IFACE_ITER_NORMAL
,
2556 mac80211_hwsim_bcn_en_iter
, &count
);
2557 wiphy_dbg(hw
->wiphy
, " beaconing vifs remaining: %u",
2560 hrtimer_cancel(&link_data
->beacon_timer
);
2561 link_data
->beacon_int
= 0;
2566 if (changed
& BSS_CHANGED_ERP_CTS_PROT
) {
2567 wiphy_dbg(hw
->wiphy
, " ERP_CTS_PROT: %d\n",
2568 info
->use_cts_prot
);
2571 if (changed
& BSS_CHANGED_ERP_PREAMBLE
) {
2572 wiphy_dbg(hw
->wiphy
, " ERP_PREAMBLE: %d\n",
2573 info
->use_short_preamble
);
2576 if (changed
& BSS_CHANGED_ERP_SLOT
) {
2577 wiphy_dbg(hw
->wiphy
, " ERP_SLOT: %d\n", info
->use_short_slot
);
2580 if (changed
& BSS_CHANGED_HT
) {
2581 wiphy_dbg(hw
->wiphy
, " HT: op_mode=0x%x\n",
2582 info
->ht_operation_mode
);
2585 if (changed
& BSS_CHANGED_BASIC_RATES
) {
2586 wiphy_dbg(hw
->wiphy
, " BASIC_RATES: 0x%llx\n",
2587 (unsigned long long) info
->basic_rates
);
2590 if (changed
& BSS_CHANGED_TXPOWER
)
2591 wiphy_dbg(hw
->wiphy
, " TX Power: %d dBm\n", info
->txpower
);
2595 mac80211_hwsim_sta_rc_update(struct ieee80211_hw
*hw
,
2596 struct ieee80211_vif
*vif
,
2597 struct ieee80211_link_sta
*link_sta
,
2600 struct mac80211_hwsim_data
*data
= hw
->priv
;
2601 struct ieee80211_sta
*sta
= link_sta
->sta
;
2607 link_id
< ARRAY_SIZE(vif
->link_conf
);
2609 enum nl80211_chan_width confbw
= NL80211_CHAN_WIDTH_20_NOHT
;
2610 struct ieee80211_bss_conf
*vif_conf
;
2612 link_sta
= rcu_dereference(sta
->link
[link_id
]);
2617 switch (link_sta
->bandwidth
) {
2618 #define C(_bw) case IEEE80211_STA_RX_BW_##_bw: bw = _bw; break
2627 if (!data
->use_chanctx
) {
2630 struct ieee80211_chanctx_conf
*chanctx_conf
;
2632 vif_conf
= rcu_dereference(vif
->link_conf
[link_id
]);
2633 if (WARN_ON(!vif_conf
))
2636 chanctx_conf
= rcu_dereference(vif_conf
->chanctx_conf
);
2638 if (!WARN_ON(!chanctx_conf
))
2639 confbw
= chanctx_conf
->def
.width
;
2642 WARN(bw
> hwsim_get_chanwidth(confbw
),
2643 "intf %pM [link=%d]: bad STA %pM bandwidth %d MHz (%d) > channel config %d MHz (%d)\n",
2644 vif
->addr
, link_id
, sta
->addr
, bw
, sta
->deflink
.bandwidth
,
2645 hwsim_get_chanwidth(data
->bw
), data
->bw
);
2654 static int mac80211_hwsim_sta_add(struct ieee80211_hw
*hw
,
2655 struct ieee80211_vif
*vif
,
2656 struct ieee80211_sta
*sta
)
2658 struct hwsim_sta_priv
*sp
= (void *)sta
->drv_priv
;
2660 hwsim_check_magic(vif
);
2661 hwsim_set_sta_magic(sta
);
2662 mac80211_hwsim_sta_rc_update(hw
, vif
, &sta
->deflink
, 0);
2664 if (sta
->valid_links
) {
2665 WARN(hweight16(sta
->valid_links
) > 1,
2666 "expect to add STA with single link, have 0x%x\n",
2668 sp
->active_links_rx
= sta
->valid_links
;
2674 static int mac80211_hwsim_sta_remove(struct ieee80211_hw
*hw
,
2675 struct ieee80211_vif
*vif
,
2676 struct ieee80211_sta
*sta
)
2678 hwsim_check_magic(vif
);
2679 hwsim_clear_sta_magic(sta
);
2684 static int mac80211_hwsim_sta_state(struct ieee80211_hw
*hw
,
2685 struct ieee80211_vif
*vif
,
2686 struct ieee80211_sta
*sta
,
2687 enum ieee80211_sta_state old_state
,
2688 enum ieee80211_sta_state new_state
)
2690 if (new_state
== IEEE80211_STA_NOTEXIST
)
2691 return mac80211_hwsim_sta_remove(hw
, vif
, sta
);
2693 if (old_state
== IEEE80211_STA_NOTEXIST
)
2694 return mac80211_hwsim_sta_add(hw
, vif
, sta
);
2697 * in an MLO connection, when client is authorized
2698 * (AP station marked as such), enable all links
2700 if (ieee80211_vif_is_mld(vif
) &&
2701 vif
->type
== NL80211_IFTYPE_STATION
&&
2702 new_state
== IEEE80211_STA_AUTHORIZED
&& !sta
->tdls
)
2703 ieee80211_set_active_links_async(vif
,
2704 ieee80211_vif_usable_links(vif
));
2709 static void mac80211_hwsim_sta_notify(struct ieee80211_hw
*hw
,
2710 struct ieee80211_vif
*vif
,
2711 enum sta_notify_cmd cmd
,
2712 struct ieee80211_sta
*sta
)
2714 hwsim_check_magic(vif
);
2717 case STA_NOTIFY_SLEEP
:
2718 case STA_NOTIFY_AWAKE
:
2719 /* TODO: make good use of these flags */
2722 WARN(1, "Invalid sta notify: %d\n", cmd
);
2727 static int mac80211_hwsim_set_tim(struct ieee80211_hw
*hw
,
2728 struct ieee80211_sta
*sta
,
2731 hwsim_check_sta_magic(sta
);
2735 static int mac80211_hwsim_conf_tx(struct ieee80211_hw
*hw
,
2736 struct ieee80211_vif
*vif
,
2737 unsigned int link_id
, u16 queue
,
2738 const struct ieee80211_tx_queue_params
*params
)
2740 wiphy_dbg(hw
->wiphy
,
2741 "%s (queue=%d txop=%d cw_min=%d cw_max=%d aifs=%d)\n",
2743 params
->txop
, params
->cw_min
,
2744 params
->cw_max
, params
->aifs
);
2748 static int mac80211_hwsim_get_survey(struct ieee80211_hw
*hw
, int idx
,
2749 struct survey_info
*survey
)
2751 struct mac80211_hwsim_data
*hwsim
= hw
->priv
;
2753 if (idx
< 0 || idx
>= ARRAY_SIZE(hwsim
->survey_data
))
2756 mutex_lock(&hwsim
->mutex
);
2757 survey
->channel
= hwsim
->survey_data
[idx
].channel
;
2758 if (!survey
->channel
) {
2759 mutex_unlock(&hwsim
->mutex
);
2764 * Magically conjured dummy values --- this is only ok for simulated hardware.
2766 * A real driver which cannot determine real values noise MUST NOT
2767 * report any, especially not a magically conjured ones :-)
2769 survey
->filled
= SURVEY_INFO_NOISE_DBM
|
2771 SURVEY_INFO_TIME_BUSY
;
2772 survey
->noise
= -92;
2774 jiffies_to_msecs(hwsim
->survey_data
[idx
].end
-
2775 hwsim
->survey_data
[idx
].start
);
2776 /* report 12.5% of channel time is used */
2777 survey
->time_busy
= survey
->time
/8;
2778 mutex_unlock(&hwsim
->mutex
);
2783 static enum ieee80211_neg_ttlm_res
2784 mac80211_hwsim_can_neg_ttlm(struct ieee80211_hw
*hw
, struct ieee80211_vif
*vif
,
2785 struct ieee80211_neg_ttlm
*neg_ttlm
)
2789 /* For testing purposes, accept if all TIDs are mapped to the same links
2790 * set, otherwise reject.
2792 for (i
= 0; i
< IEEE80211_TTLM_NUM_TIDS
; i
++) {
2793 if (neg_ttlm
->downlink
[i
] != neg_ttlm
->uplink
[i
] ||
2794 neg_ttlm
->downlink
[i
] != neg_ttlm
->downlink
[0])
2795 return NEG_TTLM_RES_REJECT
;
2798 return NEG_TTLM_RES_ACCEPT
;
2801 #ifdef CONFIG_NL80211_TESTMODE
2803 * This section contains example code for using netlink
2804 * attributes with the testmode command in nl80211.
2807 /* These enums need to be kept in sync with userspace */
2808 enum hwsim_testmode_attr
{
2809 __HWSIM_TM_ATTR_INVALID
= 0,
2810 HWSIM_TM_ATTR_CMD
= 1,
2811 HWSIM_TM_ATTR_PS
= 2,
2814 __HWSIM_TM_ATTR_AFTER_LAST
,
2815 HWSIM_TM_ATTR_MAX
= __HWSIM_TM_ATTR_AFTER_LAST
- 1
2818 enum hwsim_testmode_cmd
{
2819 HWSIM_TM_CMD_SET_PS
= 0,
2820 HWSIM_TM_CMD_GET_PS
= 1,
2821 HWSIM_TM_CMD_STOP_QUEUES
= 2,
2822 HWSIM_TM_CMD_WAKE_QUEUES
= 3,
2825 static const struct nla_policy hwsim_testmode_policy
[HWSIM_TM_ATTR_MAX
+ 1] = {
2826 [HWSIM_TM_ATTR_CMD
] = { .type
= NLA_U32
},
2827 [HWSIM_TM_ATTR_PS
] = { .type
= NLA_U32
},
2830 static int mac80211_hwsim_testmode_cmd(struct ieee80211_hw
*hw
,
2831 struct ieee80211_vif
*vif
,
2832 void *data
, int len
)
2834 struct mac80211_hwsim_data
*hwsim
= hw
->priv
;
2835 struct nlattr
*tb
[HWSIM_TM_ATTR_MAX
+ 1];
2836 struct sk_buff
*skb
;
2839 err
= nla_parse_deprecated(tb
, HWSIM_TM_ATTR_MAX
, data
, len
,
2840 hwsim_testmode_policy
, NULL
);
2844 if (!tb
[HWSIM_TM_ATTR_CMD
])
2847 switch (nla_get_u32(tb
[HWSIM_TM_ATTR_CMD
])) {
2848 case HWSIM_TM_CMD_SET_PS
:
2849 if (!tb
[HWSIM_TM_ATTR_PS
])
2851 ps
= nla_get_u32(tb
[HWSIM_TM_ATTR_PS
]);
2852 return hwsim_fops_ps_write(hwsim
, ps
);
2853 case HWSIM_TM_CMD_GET_PS
:
2854 skb
= cfg80211_testmode_alloc_reply_skb(hw
->wiphy
,
2855 nla_total_size(sizeof(u32
)));
2858 if (nla_put_u32(skb
, HWSIM_TM_ATTR_PS
, hwsim
->ps
))
2859 goto nla_put_failure
;
2860 return cfg80211_testmode_reply(skb
);
2861 case HWSIM_TM_CMD_STOP_QUEUES
:
2862 ieee80211_stop_queues(hw
);
2864 case HWSIM_TM_CMD_WAKE_QUEUES
:
2865 ieee80211_wake_queues(hw
);
2877 static int mac80211_hwsim_ampdu_action(struct ieee80211_hw
*hw
,
2878 struct ieee80211_vif
*vif
,
2879 struct ieee80211_ampdu_params
*params
)
2881 struct ieee80211_sta
*sta
= params
->sta
;
2882 enum ieee80211_ampdu_mlme_action action
= params
->action
;
2883 u16 tid
= params
->tid
;
2886 case IEEE80211_AMPDU_TX_START
:
2887 return IEEE80211_AMPDU_TX_START_IMMEDIATE
;
2888 case IEEE80211_AMPDU_TX_STOP_CONT
:
2889 case IEEE80211_AMPDU_TX_STOP_FLUSH
:
2890 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT
:
2891 ieee80211_stop_tx_ba_cb_irqsafe(vif
, sta
->addr
, tid
);
2893 case IEEE80211_AMPDU_TX_OPERATIONAL
:
2895 case IEEE80211_AMPDU_RX_START
:
2896 case IEEE80211_AMPDU_RX_STOP
:
2905 static void mac80211_hwsim_flush(struct ieee80211_hw
*hw
,
2906 struct ieee80211_vif
*vif
,
2907 u32 queues
, bool drop
)
2909 /* Not implemented, queues only on kernel side */
2912 static void hw_scan_work(struct work_struct
*work
)
2914 struct mac80211_hwsim_data
*hwsim
=
2915 container_of(work
, struct mac80211_hwsim_data
, hw_scan
.work
);
2916 struct cfg80211_scan_request
*req
= hwsim
->hw_scan_request
;
2919 mutex_lock(&hwsim
->mutex
);
2920 if (hwsim
->scan_chan_idx
>= req
->n_channels
) {
2921 struct cfg80211_scan_info info
= {
2925 wiphy_dbg(hwsim
->hw
->wiphy
, "hw scan complete\n");
2926 ieee80211_scan_completed(hwsim
->hw
, &info
);
2927 hwsim
->hw_scan_request
= NULL
;
2928 hwsim
->hw_scan_vif
= NULL
;
2929 hwsim
->tmp_chan
= NULL
;
2930 mutex_unlock(&hwsim
->mutex
);
2931 mac80211_hwsim_config_mac_nl(hwsim
->hw
, hwsim
->scan_addr
,
2936 wiphy_dbg(hwsim
->hw
->wiphy
, "hw scan %d MHz\n",
2937 req
->channels
[hwsim
->scan_chan_idx
]->center_freq
);
2939 hwsim
->tmp_chan
= req
->channels
[hwsim
->scan_chan_idx
];
2940 if (hwsim
->tmp_chan
->flags
& (IEEE80211_CHAN_NO_IR
|
2941 IEEE80211_CHAN_RADAR
) ||
2947 for (i
= 0; i
< req
->n_ssids
; i
++) {
2948 struct sk_buff
*probe
;
2949 struct ieee80211_mgmt
*mgmt
;
2951 probe
= ieee80211_probereq_get(hwsim
->hw
,
2954 req
->ssids
[i
].ssid_len
,
2959 mgmt
= (struct ieee80211_mgmt
*) probe
->data
;
2960 memcpy(mgmt
->da
, req
->bssid
, ETH_ALEN
);
2961 memcpy(mgmt
->bssid
, req
->bssid
, ETH_ALEN
);
2964 skb_put_data(probe
, req
->ie
, req
->ie_len
);
2967 if (!ieee80211_tx_prepare_skb(hwsim
->hw
,
2970 hwsim
->tmp_chan
->band
,
2978 mac80211_hwsim_tx_frame(hwsim
->hw
, probe
,
2984 ieee80211_queue_delayed_work(hwsim
->hw
, &hwsim
->hw_scan
,
2985 msecs_to_jiffies(dwell
));
2986 hwsim
->survey_data
[hwsim
->scan_chan_idx
].channel
= hwsim
->tmp_chan
;
2987 hwsim
->survey_data
[hwsim
->scan_chan_idx
].start
= jiffies
;
2988 hwsim
->survey_data
[hwsim
->scan_chan_idx
].end
=
2989 jiffies
+ msecs_to_jiffies(dwell
);
2990 hwsim
->scan_chan_idx
++;
2991 mutex_unlock(&hwsim
->mutex
);
2994 static int mac80211_hwsim_hw_scan(struct ieee80211_hw
*hw
,
2995 struct ieee80211_vif
*vif
,
2996 struct ieee80211_scan_request
*hw_req
)
2998 struct mac80211_hwsim_data
*hwsim
= hw
->priv
;
2999 struct cfg80211_scan_request
*req
= &hw_req
->req
;
3001 mutex_lock(&hwsim
->mutex
);
3002 if (WARN_ON(hwsim
->tmp_chan
|| hwsim
->hw_scan_request
)) {
3003 mutex_unlock(&hwsim
->mutex
);
3006 hwsim
->hw_scan_request
= req
;
3007 hwsim
->hw_scan_vif
= vif
;
3008 hwsim
->scan_chan_idx
= 0;
3009 if (req
->flags
& NL80211_SCAN_FLAG_RANDOM_ADDR
)
3010 get_random_mask_addr(hwsim
->scan_addr
,
3011 hw_req
->req
.mac_addr
,
3012 hw_req
->req
.mac_addr_mask
);
3014 memcpy(hwsim
->scan_addr
, vif
->addr
, ETH_ALEN
);
3015 memset(hwsim
->survey_data
, 0, sizeof(hwsim
->survey_data
));
3016 mutex_unlock(&hwsim
->mutex
);
3018 mac80211_hwsim_config_mac_nl(hw
, hwsim
->scan_addr
, true);
3019 wiphy_dbg(hw
->wiphy
, "hwsim hw_scan request\n");
3021 ieee80211_queue_delayed_work(hwsim
->hw
, &hwsim
->hw_scan
, 0);
3026 static void mac80211_hwsim_cancel_hw_scan(struct ieee80211_hw
*hw
,
3027 struct ieee80211_vif
*vif
)
3029 struct mac80211_hwsim_data
*hwsim
= hw
->priv
;
3030 struct cfg80211_scan_info info
= {
3034 wiphy_dbg(hw
->wiphy
, "hwsim cancel_hw_scan\n");
3036 cancel_delayed_work_sync(&hwsim
->hw_scan
);
3038 mutex_lock(&hwsim
->mutex
);
3039 ieee80211_scan_completed(hwsim
->hw
, &info
);
3040 hwsim
->tmp_chan
= NULL
;
3041 hwsim
->hw_scan_request
= NULL
;
3042 hwsim
->hw_scan_vif
= NULL
;
3043 mutex_unlock(&hwsim
->mutex
);
3046 static void mac80211_hwsim_sw_scan(struct ieee80211_hw
*hw
,
3047 struct ieee80211_vif
*vif
,
3050 struct mac80211_hwsim_data
*hwsim
= hw
->priv
;
3052 mutex_lock(&hwsim
->mutex
);
3054 if (hwsim
->scanning
) {
3055 pr_debug("two hwsim sw_scans detected!\n");
3059 pr_debug("hwsim sw_scan request, prepping stuff\n");
3061 memcpy(hwsim
->scan_addr
, mac_addr
, ETH_ALEN
);
3062 mac80211_hwsim_config_mac_nl(hw
, hwsim
->scan_addr
, true);
3063 hwsim
->scanning
= true;
3064 memset(hwsim
->survey_data
, 0, sizeof(hwsim
->survey_data
));
3067 mutex_unlock(&hwsim
->mutex
);
3070 static void mac80211_hwsim_sw_scan_complete(struct ieee80211_hw
*hw
,
3071 struct ieee80211_vif
*vif
)
3073 struct mac80211_hwsim_data
*hwsim
= hw
->priv
;
3075 mutex_lock(&hwsim
->mutex
);
3077 pr_debug("hwsim sw_scan_complete\n");
3078 hwsim
->scanning
= false;
3079 mac80211_hwsim_config_mac_nl(hw
, hwsim
->scan_addr
, false);
3080 eth_zero_addr(hwsim
->scan_addr
);
3082 mutex_unlock(&hwsim
->mutex
);
3085 static void hw_roc_start(struct work_struct
*work
)
3087 struct mac80211_hwsim_data
*hwsim
=
3088 container_of(work
, struct mac80211_hwsim_data
, roc_start
.work
);
3090 mutex_lock(&hwsim
->mutex
);
3092 wiphy_dbg(hwsim
->hw
->wiphy
, "hwsim ROC begins\n");
3093 hwsim
->tmp_chan
= hwsim
->roc_chan
;
3094 ieee80211_ready_on_channel(hwsim
->hw
);
3096 ieee80211_queue_delayed_work(hwsim
->hw
, &hwsim
->roc_done
,
3097 msecs_to_jiffies(hwsim
->roc_duration
));
3099 mutex_unlock(&hwsim
->mutex
);
3102 static void hw_roc_done(struct work_struct
*work
)
3104 struct mac80211_hwsim_data
*hwsim
=
3105 container_of(work
, struct mac80211_hwsim_data
, roc_done
.work
);
3107 mutex_lock(&hwsim
->mutex
);
3108 ieee80211_remain_on_channel_expired(hwsim
->hw
);
3109 hwsim
->tmp_chan
= NULL
;
3110 mutex_unlock(&hwsim
->mutex
);
3112 wiphy_dbg(hwsim
->hw
->wiphy
, "hwsim ROC expired\n");
3115 static int mac80211_hwsim_roc(struct ieee80211_hw
*hw
,
3116 struct ieee80211_vif
*vif
,
3117 struct ieee80211_channel
*chan
,
3119 enum ieee80211_roc_type type
)
3121 struct mac80211_hwsim_data
*hwsim
= hw
->priv
;
3123 mutex_lock(&hwsim
->mutex
);
3124 if (WARN_ON(hwsim
->tmp_chan
|| hwsim
->hw_scan_request
)) {
3125 mutex_unlock(&hwsim
->mutex
);
3129 hwsim
->roc_chan
= chan
;
3130 hwsim
->roc_duration
= duration
;
3131 mutex_unlock(&hwsim
->mutex
);
3133 wiphy_dbg(hw
->wiphy
, "hwsim ROC (%d MHz, %d ms)\n",
3134 chan
->center_freq
, duration
);
3135 ieee80211_queue_delayed_work(hw
, &hwsim
->roc_start
, HZ
/50);
3140 static int mac80211_hwsim_croc(struct ieee80211_hw
*hw
,
3141 struct ieee80211_vif
*vif
)
3143 struct mac80211_hwsim_data
*hwsim
= hw
->priv
;
3145 cancel_delayed_work_sync(&hwsim
->roc_start
);
3146 cancel_delayed_work_sync(&hwsim
->roc_done
);
3148 mutex_lock(&hwsim
->mutex
);
3149 hwsim
->tmp_chan
= NULL
;
3150 mutex_unlock(&hwsim
->mutex
);
3152 wiphy_dbg(hw
->wiphy
, "hwsim ROC canceled\n");
3157 static int mac80211_hwsim_add_chanctx(struct ieee80211_hw
*hw
,
3158 struct ieee80211_chanctx_conf
*ctx
)
3160 hwsim_set_chanctx_magic(ctx
);
3161 wiphy_dbg(hw
->wiphy
,
3162 "add channel context control: %d MHz/width: %d/cfreqs:%d/%d MHz\n",
3163 ctx
->def
.chan
->center_freq
, ctx
->def
.width
,
3164 ctx
->def
.center_freq1
, ctx
->def
.center_freq2
);
3168 static void mac80211_hwsim_remove_chanctx(struct ieee80211_hw
*hw
,
3169 struct ieee80211_chanctx_conf
*ctx
)
3171 wiphy_dbg(hw
->wiphy
,
3172 "remove channel context control: %d MHz/width: %d/cfreqs:%d/%d MHz\n",
3173 ctx
->def
.chan
->center_freq
, ctx
->def
.width
,
3174 ctx
->def
.center_freq1
, ctx
->def
.center_freq2
);
3175 hwsim_check_chanctx_magic(ctx
);
3176 hwsim_clear_chanctx_magic(ctx
);
3179 static void mac80211_hwsim_change_chanctx(struct ieee80211_hw
*hw
,
3180 struct ieee80211_chanctx_conf
*ctx
,
3183 hwsim_check_chanctx_magic(ctx
);
3184 wiphy_dbg(hw
->wiphy
,
3185 "change channel context control: %d MHz/width: %d/cfreqs:%d/%d MHz\n",
3186 ctx
->def
.chan
->center_freq
, ctx
->def
.width
,
3187 ctx
->def
.center_freq1
, ctx
->def
.center_freq2
);
3190 static int mac80211_hwsim_assign_vif_chanctx(struct ieee80211_hw
*hw
,
3191 struct ieee80211_vif
*vif
,
3192 struct ieee80211_bss_conf
*link_conf
,
3193 struct ieee80211_chanctx_conf
*ctx
)
3195 hwsim_check_magic(vif
);
3196 hwsim_check_chanctx_magic(ctx
);
3198 /* if we activate a link while already associated wake it up */
3199 if (vif
->type
== NL80211_IFTYPE_STATION
&& vif
->cfg
.assoc
) {
3200 struct sk_buff
*skb
;
3202 skb
= ieee80211_nullfunc_get(hw
, vif
, link_conf
->link_id
, true);
3205 mac80211_hwsim_tx_frame(hw
, skb
, ctx
->def
.chan
);
3213 static void mac80211_hwsim_unassign_vif_chanctx(struct ieee80211_hw
*hw
,
3214 struct ieee80211_vif
*vif
,
3215 struct ieee80211_bss_conf
*link_conf
,
3216 struct ieee80211_chanctx_conf
*ctx
)
3218 hwsim_check_magic(vif
);
3219 hwsim_check_chanctx_magic(ctx
);
3221 /* if we deactivate a link while associated suspend it first */
3222 if (vif
->type
== NL80211_IFTYPE_STATION
&& vif
->cfg
.assoc
) {
3223 struct sk_buff
*skb
;
3225 skb
= ieee80211_nullfunc_get(hw
, vif
, link_conf
->link_id
, true);
3227 struct ieee80211_hdr
*hdr
= (void *)skb
->data
;
3229 hdr
->frame_control
|= cpu_to_le16(IEEE80211_FCTL_PM
);
3232 mac80211_hwsim_tx_frame(hw
, skb
, ctx
->def
.chan
);
3238 static int mac80211_hwsim_switch_vif_chanctx(struct ieee80211_hw
*hw
,
3239 struct ieee80211_vif_chanctx_switch
*vifs
,
3241 enum ieee80211_chanctx_switch_mode mode
)
3248 wiphy_dbg(hw
->wiphy
,
3249 "switch vif channel context mode: %u\n", mode
);
3251 for (i
= 0; i
< n_vifs
; i
++) {
3252 hwsim_check_chanctx_magic(vifs
[i
].old_ctx
);
3253 wiphy_dbg(hw
->wiphy
,
3254 "switch vif channel context: %d MHz/width: %d/cfreqs:%d/%d MHz -> %d MHz/width: %d/cfreqs:%d/%d MHz\n",
3255 vifs
[i
].old_ctx
->def
.chan
->center_freq
,
3256 vifs
[i
].old_ctx
->def
.width
,
3257 vifs
[i
].old_ctx
->def
.center_freq1
,
3258 vifs
[i
].old_ctx
->def
.center_freq2
,
3259 vifs
[i
].new_ctx
->def
.chan
->center_freq
,
3260 vifs
[i
].new_ctx
->def
.width
,
3261 vifs
[i
].new_ctx
->def
.center_freq1
,
3262 vifs
[i
].new_ctx
->def
.center_freq2
);
3265 case CHANCTX_SWMODE_REASSIGN_VIF
:
3266 hwsim_check_chanctx_magic(vifs
[i
].new_ctx
);
3268 case CHANCTX_SWMODE_SWAP_CONTEXTS
:
3269 hwsim_set_chanctx_magic(vifs
[i
].new_ctx
);
3270 hwsim_clear_chanctx_magic(vifs
[i
].old_ctx
);
3273 WARN(1, "Invalid mode %d\n", mode
);
3279 static const char mac80211_hwsim_gstrings_stats
[][ETH_GSTRING_LEN
] = {
3290 #define MAC80211_HWSIM_SSTATS_LEN ARRAY_SIZE(mac80211_hwsim_gstrings_stats)
3292 static void mac80211_hwsim_get_et_strings(struct ieee80211_hw
*hw
,
3293 struct ieee80211_vif
*vif
,
3296 if (sset
== ETH_SS_STATS
)
3297 memcpy(data
, mac80211_hwsim_gstrings_stats
,
3298 sizeof(mac80211_hwsim_gstrings_stats
));
3301 static int mac80211_hwsim_get_et_sset_count(struct ieee80211_hw
*hw
,
3302 struct ieee80211_vif
*vif
, int sset
)
3304 if (sset
== ETH_SS_STATS
)
3305 return MAC80211_HWSIM_SSTATS_LEN
;
3309 static void mac80211_hwsim_get_et_stats(struct ieee80211_hw
*hw
,
3310 struct ieee80211_vif
*vif
,
3311 struct ethtool_stats
*stats
, u64
*data
)
3313 struct mac80211_hwsim_data
*ar
= hw
->priv
;
3316 data
[i
++] = ar
->tx_pkts
;
3317 data
[i
++] = ar
->tx_bytes
;
3318 data
[i
++] = ar
->rx_pkts
;
3319 data
[i
++] = ar
->rx_bytes
;
3320 data
[i
++] = ar
->tx_dropped
;
3321 data
[i
++] = ar
->tx_failed
;
3323 data
[i
++] = ar
->group
;
3325 WARN_ON(i
!= MAC80211_HWSIM_SSTATS_LEN
);
3328 static int mac80211_hwsim_tx_last_beacon(struct ieee80211_hw
*hw
)
3333 static int mac80211_hwsim_set_rts_threshold(struct ieee80211_hw
*hw
, u32 value
)
3338 static int mac80211_hwsim_change_vif_links(struct ieee80211_hw
*hw
,
3339 struct ieee80211_vif
*vif
,
3340 u16 old_links
, u16 new_links
,
3341 struct ieee80211_bss_conf
*old
[IEEE80211_MLD_MAX_NUM_LINKS
])
3343 unsigned long rem
= old_links
& ~new_links
;
3344 unsigned long add
= new_links
& ~old_links
;
3352 for_each_set_bit(i
, &rem
, IEEE80211_MLD_MAX_NUM_LINKS
)
3353 mac80211_hwsim_config_mac_nl(hw
, old
[i
]->addr
, false);
3355 for_each_set_bit(i
, &add
, IEEE80211_MLD_MAX_NUM_LINKS
) {
3356 struct ieee80211_bss_conf
*link_conf
;
3358 link_conf
= link_conf_dereference_protected(vif
, i
);
3359 if (WARN_ON(!link_conf
))
3362 mac80211_hwsim_config_mac_nl(hw
, link_conf
->addr
, true);
3368 static int mac80211_hwsim_change_sta_links(struct ieee80211_hw
*hw
,
3369 struct ieee80211_vif
*vif
,
3370 struct ieee80211_sta
*sta
,
3371 u16 old_links
, u16 new_links
)
3373 struct hwsim_sta_priv
*sp
= (void *)sta
->drv_priv
;
3375 hwsim_check_sta_magic(sta
);
3377 if (vif
->type
== NL80211_IFTYPE_STATION
)
3378 sp
->active_links_rx
= new_links
;
3383 static int mac80211_hwsim_send_pmsr_ftm_request_peer(struct sk_buff
*msg
,
3384 struct cfg80211_pmsr_ftm_request_peer
*request
)
3388 if (!request
->requested
)
3391 ftm
= nla_nest_start(msg
, NL80211_PMSR_TYPE_FTM
);
3395 if (nla_put_u32(msg
, NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE
, request
->preamble
))
3398 if (nla_put_u16(msg
, NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD
, request
->burst_period
))
3401 if (request
->asap
&& nla_put_flag(msg
, NL80211_PMSR_FTM_REQ_ATTR_ASAP
))
3404 if (request
->request_lci
&& nla_put_flag(msg
, NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI
))
3407 if (request
->request_civicloc
&&
3408 nla_put_flag(msg
, NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC
))
3411 if (request
->trigger_based
&& nla_put_flag(msg
, NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED
))
3414 if (request
->non_trigger_based
&&
3415 nla_put_flag(msg
, NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED
))
3418 if (request
->lmr_feedback
&& nla_put_flag(msg
, NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK
))
3421 if (nla_put_u8(msg
, NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP
, request
->num_bursts_exp
))
3424 if (nla_put_u8(msg
, NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION
, request
->burst_duration
))
3427 if (nla_put_u8(msg
, NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST
, request
->ftms_per_burst
))
3430 if (nla_put_u8(msg
, NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES
, request
->ftmr_retries
))
3433 if (nla_put_u8(msg
, NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION
, request
->burst_duration
))
3436 if (nla_put_u8(msg
, NL80211_PMSR_FTM_REQ_ATTR_BSS_COLOR
, request
->bss_color
))
3439 nla_nest_end(msg
, ftm
);
3444 static int mac80211_hwsim_send_pmsr_request_peer(struct sk_buff
*msg
,
3445 struct cfg80211_pmsr_request_peer
*request
)
3447 struct nlattr
*peer
, *chandef
, *req
, *data
;
3450 peer
= nla_nest_start(msg
, NL80211_PMSR_ATTR_PEERS
);
3454 if (nla_put(msg
, NL80211_PMSR_PEER_ATTR_ADDR
, ETH_ALEN
,
3458 chandef
= nla_nest_start(msg
, NL80211_PMSR_PEER_ATTR_CHAN
);
3462 err
= nl80211_send_chandef(msg
, &request
->chandef
);
3466 nla_nest_end(msg
, chandef
);
3468 req
= nla_nest_start(msg
, NL80211_PMSR_PEER_ATTR_REQ
);
3472 if (request
->report_ap_tsf
&& nla_put_flag(msg
, NL80211_PMSR_REQ_ATTR_GET_AP_TSF
))
3475 data
= nla_nest_start(msg
, NL80211_PMSR_REQ_ATTR_DATA
);
3479 err
= mac80211_hwsim_send_pmsr_ftm_request_peer(msg
, &request
->ftm
);
3483 nla_nest_end(msg
, data
);
3484 nla_nest_end(msg
, req
);
3485 nla_nest_end(msg
, peer
);
3490 static int mac80211_hwsim_send_pmsr_request(struct sk_buff
*msg
,
3491 struct cfg80211_pmsr_request
*request
)
3493 struct nlattr
*pmsr
;
3496 pmsr
= nla_nest_start(msg
, NL80211_ATTR_PEER_MEASUREMENTS
);
3500 if (nla_put_u32(msg
, NL80211_ATTR_TIMEOUT
, request
->timeout
))
3503 if (!is_zero_ether_addr(request
->mac_addr
)) {
3504 if (nla_put(msg
, NL80211_ATTR_MAC
, ETH_ALEN
, request
->mac_addr
))
3506 if (nla_put(msg
, NL80211_ATTR_MAC_MASK
, ETH_ALEN
, request
->mac_addr_mask
))
3510 for (int i
= 0; i
< request
->n_peers
; i
++) {
3511 err
= mac80211_hwsim_send_pmsr_request_peer(msg
, &request
->peers
[i
]);
3516 nla_nest_end(msg
, pmsr
);
3521 static int mac80211_hwsim_start_pmsr(struct ieee80211_hw
*hw
,
3522 struct ieee80211_vif
*vif
,
3523 struct cfg80211_pmsr_request
*request
)
3525 struct mac80211_hwsim_data
*data
;
3526 struct sk_buff
*skb
= NULL
;
3527 struct nlattr
*pmsr
;
3533 _portid
= READ_ONCE(data
->wmediumd
);
3534 if (!_portid
&& !hwsim_virtio_enabled
)
3537 mutex_lock(&data
->mutex
);
3539 if (data
->pmsr_request
) {
3544 skb
= genlmsg_new(GENLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
3551 msg_head
= genlmsg_put(skb
, 0, 0, &hwsim_genl_family
, 0, HWSIM_CMD_START_PMSR
);
3553 if (nla_put(skb
, HWSIM_ATTR_ADDR_TRANSMITTER
,
3554 ETH_ALEN
, data
->addresses
[1].addr
)) {
3559 pmsr
= nla_nest_start(skb
, HWSIM_ATTR_PMSR_REQUEST
);
3565 err
= mac80211_hwsim_send_pmsr_request(skb
, request
);
3569 nla_nest_end(skb
, pmsr
);
3571 genlmsg_end(skb
, msg_head
);
3572 if (hwsim_virtio_enabled
)
3573 hwsim_tx_virtio(data
, skb
);
3575 hwsim_unicast_netgroup(data
, skb
, _portid
);
3577 data
->pmsr_request
= request
;
3578 data
->pmsr_request_wdev
= ieee80211_vif_to_wdev(vif
);
3584 mutex_unlock(&data
->mutex
);
3588 static void mac80211_hwsim_abort_pmsr(struct ieee80211_hw
*hw
,
3589 struct ieee80211_vif
*vif
,
3590 struct cfg80211_pmsr_request
*request
)
3592 struct mac80211_hwsim_data
*data
;
3593 struct sk_buff
*skb
= NULL
;
3594 struct nlattr
*pmsr
;
3600 _portid
= READ_ONCE(data
->wmediumd
);
3601 if (!_portid
&& !hwsim_virtio_enabled
)
3604 mutex_lock(&data
->mutex
);
3606 if (data
->pmsr_request
!= request
) {
3611 skb
= genlmsg_new(GENLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
3617 msg_head
= genlmsg_put(skb
, 0, 0, &hwsim_genl_family
, 0, HWSIM_CMD_ABORT_PMSR
);
3619 if (nla_put(skb
, HWSIM_ATTR_ADDR_TRANSMITTER
, ETH_ALEN
, data
->addresses
[1].addr
))
3622 pmsr
= nla_nest_start(skb
, HWSIM_ATTR_PMSR_REQUEST
);
3628 err
= mac80211_hwsim_send_pmsr_request(skb
, request
);
3632 err
= nla_nest_end(skb
, pmsr
);
3636 genlmsg_end(skb
, msg_head
);
3637 if (hwsim_virtio_enabled
)
3638 hwsim_tx_virtio(data
, skb
);
3640 hwsim_unicast_netgroup(data
, skb
, _portid
);
3646 mutex_unlock(&data
->mutex
);
3649 static int mac80211_hwsim_parse_rate_info(struct nlattr
*rateattr
,
3650 struct rate_info
*rate_info
,
3651 struct genl_info
*info
)
3653 struct nlattr
*tb
[HWSIM_RATE_INFO_ATTR_MAX
+ 1];
3656 ret
= nla_parse_nested(tb
, HWSIM_RATE_INFO_ATTR_MAX
,
3657 rateattr
, hwsim_rate_info_policy
, info
->extack
);
3661 if (tb
[HWSIM_RATE_INFO_ATTR_FLAGS
])
3662 rate_info
->flags
= nla_get_u8(tb
[HWSIM_RATE_INFO_ATTR_FLAGS
]);
3664 if (tb
[HWSIM_RATE_INFO_ATTR_MCS
])
3665 rate_info
->mcs
= nla_get_u8(tb
[HWSIM_RATE_INFO_ATTR_MCS
]);
3667 if (tb
[HWSIM_RATE_INFO_ATTR_LEGACY
])
3668 rate_info
->legacy
= nla_get_u16(tb
[HWSIM_RATE_INFO_ATTR_LEGACY
]);
3670 if (tb
[HWSIM_RATE_INFO_ATTR_NSS
])
3671 rate_info
->nss
= nla_get_u8(tb
[HWSIM_RATE_INFO_ATTR_NSS
]);
3673 if (tb
[HWSIM_RATE_INFO_ATTR_BW
])
3674 rate_info
->bw
= nla_get_u8(tb
[HWSIM_RATE_INFO_ATTR_BW
]);
3676 if (tb
[HWSIM_RATE_INFO_ATTR_HE_GI
])
3677 rate_info
->he_gi
= nla_get_u8(tb
[HWSIM_RATE_INFO_ATTR_HE_GI
]);
3679 if (tb
[HWSIM_RATE_INFO_ATTR_HE_DCM
])
3680 rate_info
->he_dcm
= nla_get_u8(tb
[HWSIM_RATE_INFO_ATTR_HE_DCM
]);
3682 if (tb
[HWSIM_RATE_INFO_ATTR_HE_RU_ALLOC
])
3683 rate_info
->he_ru_alloc
=
3684 nla_get_u8(tb
[HWSIM_RATE_INFO_ATTR_HE_RU_ALLOC
]);
3686 if (tb
[HWSIM_RATE_INFO_ATTR_N_BOUNDED_CH
])
3687 rate_info
->n_bonded_ch
= nla_get_u8(tb
[HWSIM_RATE_INFO_ATTR_N_BOUNDED_CH
]);
3689 if (tb
[HWSIM_RATE_INFO_ATTR_EHT_GI
])
3690 rate_info
->eht_gi
= nla_get_u8(tb
[HWSIM_RATE_INFO_ATTR_EHT_GI
]);
3692 if (tb
[HWSIM_RATE_INFO_ATTR_EHT_RU_ALLOC
])
3693 rate_info
->eht_ru_alloc
= nla_get_u8(tb
[HWSIM_RATE_INFO_ATTR_EHT_RU_ALLOC
]);
3698 static int mac80211_hwsim_parse_ftm_result(struct nlattr
*ftm
,
3699 struct cfg80211_pmsr_ftm_result
*result
,
3700 struct genl_info
*info
)
3702 struct nlattr
*tb
[NL80211_PMSR_FTM_RESP_ATTR_MAX
+ 1];
3705 ret
= nla_parse_nested(tb
, NL80211_PMSR_FTM_RESP_ATTR_MAX
,
3706 ftm
, hwsim_ftm_result_policy
, info
->extack
);
3710 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_FAIL_REASON
])
3711 result
->failure_reason
= nla_get_u32(tb
[NL80211_PMSR_FTM_RESP_ATTR_FAIL_REASON
]);
3713 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_BURST_INDEX
])
3714 result
->burst_index
= nla_get_u16(tb
[NL80211_PMSR_FTM_RESP_ATTR_BURST_INDEX
]);
3716 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_ATTEMPTS
]) {
3717 result
->num_ftmr_attempts_valid
= 1;
3718 result
->num_ftmr_attempts
=
3719 nla_get_u32(tb
[NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_ATTEMPTS
]);
3722 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_SUCCESSES
]) {
3723 result
->num_ftmr_successes_valid
= 1;
3724 result
->num_ftmr_successes
=
3725 nla_get_u32(tb
[NL80211_PMSR_FTM_RESP_ATTR_NUM_FTMR_SUCCESSES
]);
3728 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_BUSY_RETRY_TIME
])
3729 result
->busy_retry_time
=
3730 nla_get_u8(tb
[NL80211_PMSR_FTM_RESP_ATTR_BUSY_RETRY_TIME
]);
3732 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_NUM_BURSTS_EXP
])
3733 result
->num_bursts_exp
= nla_get_u8(tb
[NL80211_PMSR_FTM_RESP_ATTR_NUM_BURSTS_EXP
]);
3735 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_BURST_DURATION
])
3736 result
->burst_duration
= nla_get_u8(tb
[NL80211_PMSR_FTM_RESP_ATTR_BURST_DURATION
]);
3738 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_FTMS_PER_BURST
])
3739 result
->ftms_per_burst
= nla_get_u8(tb
[NL80211_PMSR_FTM_RESP_ATTR_FTMS_PER_BURST
]);
3741 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_RSSI_AVG
]) {
3742 result
->rssi_avg_valid
= 1;
3743 result
->rssi_avg
= nla_get_s32(tb
[NL80211_PMSR_FTM_RESP_ATTR_RSSI_AVG
]);
3745 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_RSSI_SPREAD
]) {
3746 result
->rssi_spread_valid
= 1;
3747 result
->rssi_spread
=
3748 nla_get_s32(tb
[NL80211_PMSR_FTM_RESP_ATTR_RSSI_SPREAD
]);
3751 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_TX_RATE
]) {
3752 result
->tx_rate_valid
= 1;
3753 ret
= mac80211_hwsim_parse_rate_info(tb
[NL80211_PMSR_FTM_RESP_ATTR_TX_RATE
],
3754 &result
->tx_rate
, info
);
3759 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_RX_RATE
]) {
3760 result
->rx_rate_valid
= 1;
3761 ret
= mac80211_hwsim_parse_rate_info(tb
[NL80211_PMSR_FTM_RESP_ATTR_RX_RATE
],
3762 &result
->rx_rate
, info
);
3767 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_RTT_AVG
]) {
3768 result
->rtt_avg_valid
= 1;
3770 nla_get_u64(tb
[NL80211_PMSR_FTM_RESP_ATTR_RTT_AVG
]);
3772 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_RTT_VARIANCE
]) {
3773 result
->rtt_variance_valid
= 1;
3774 result
->rtt_variance
=
3775 nla_get_u64(tb
[NL80211_PMSR_FTM_RESP_ATTR_RTT_VARIANCE
]);
3777 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_RTT_SPREAD
]) {
3778 result
->rtt_spread_valid
= 1;
3779 result
->rtt_spread
=
3780 nla_get_u64(tb
[NL80211_PMSR_FTM_RESP_ATTR_RTT_SPREAD
]);
3782 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_DIST_AVG
]) {
3783 result
->dist_avg_valid
= 1;
3785 nla_get_u64(tb
[NL80211_PMSR_FTM_RESP_ATTR_DIST_AVG
]);
3787 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_DIST_VARIANCE
]) {
3788 result
->dist_variance_valid
= 1;
3789 result
->dist_variance
=
3790 nla_get_u64(tb
[NL80211_PMSR_FTM_RESP_ATTR_DIST_VARIANCE
]);
3792 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_DIST_SPREAD
]) {
3793 result
->dist_spread_valid
= 1;
3794 result
->dist_spread
=
3795 nla_get_u64(tb
[NL80211_PMSR_FTM_RESP_ATTR_DIST_SPREAD
]);
3798 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_LCI
]) {
3799 result
->lci
= nla_data(tb
[NL80211_PMSR_FTM_RESP_ATTR_LCI
]);
3800 result
->lci_len
= nla_len(tb
[NL80211_PMSR_FTM_RESP_ATTR_LCI
]);
3803 if (tb
[NL80211_PMSR_FTM_RESP_ATTR_CIVICLOC
]) {
3804 result
->civicloc
= nla_data(tb
[NL80211_PMSR_FTM_RESP_ATTR_CIVICLOC
]);
3805 result
->civicloc_len
= nla_len(tb
[NL80211_PMSR_FTM_RESP_ATTR_CIVICLOC
]);
3811 static int mac80211_hwsim_parse_pmsr_resp(struct nlattr
*resp
,
3812 struct cfg80211_pmsr_result
*result
,
3813 struct genl_info
*info
)
3815 struct nlattr
*tb
[NL80211_PMSR_RESP_ATTR_MAX
+ 1];
3816 struct nlattr
*pmsr
;
3820 ret
= nla_parse_nested(tb
, NL80211_PMSR_RESP_ATTR_MAX
, resp
, hwsim_pmsr_resp_policy
,
3825 if (tb
[NL80211_PMSR_RESP_ATTR_STATUS
])
3826 result
->status
= nla_get_u32(tb
[NL80211_PMSR_RESP_ATTR_STATUS
]);
3828 if (tb
[NL80211_PMSR_RESP_ATTR_HOST_TIME
])
3829 result
->host_time
= nla_get_u64(tb
[NL80211_PMSR_RESP_ATTR_HOST_TIME
]);
3831 if (tb
[NL80211_PMSR_RESP_ATTR_AP_TSF
]) {
3832 result
->ap_tsf_valid
= 1;
3833 result
->ap_tsf
= nla_get_u64(tb
[NL80211_PMSR_RESP_ATTR_AP_TSF
]);
3836 result
->final
= !!tb
[NL80211_PMSR_RESP_ATTR_FINAL
];
3838 if (!tb
[NL80211_PMSR_RESP_ATTR_DATA
])
3841 nla_for_each_nested(pmsr
, tb
[NL80211_PMSR_RESP_ATTR_DATA
], rem
) {
3842 switch (nla_type(pmsr
)) {
3843 case NL80211_PMSR_TYPE_FTM
:
3844 result
->type
= NL80211_PMSR_TYPE_FTM
;
3845 ret
= mac80211_hwsim_parse_ftm_result(pmsr
, &result
->ftm
, info
);
3850 NL_SET_ERR_MSG_ATTR(info
->extack
, pmsr
, "Unknown pmsr resp type");
3858 static int mac80211_hwsim_parse_pmsr_result(struct nlattr
*peer
,
3859 struct cfg80211_pmsr_result
*result
,
3860 struct genl_info
*info
)
3862 struct nlattr
*tb
[NL80211_PMSR_PEER_ATTR_MAX
+ 1];
3868 ret
= nla_parse_nested(tb
, NL80211_PMSR_PEER_ATTR_MAX
, peer
,
3869 hwsim_pmsr_peer_result_policy
, info
->extack
);
3873 if (tb
[NL80211_PMSR_PEER_ATTR_ADDR
])
3874 memcpy(result
->addr
, nla_data(tb
[NL80211_PMSR_PEER_ATTR_ADDR
]),
3877 if (tb
[NL80211_PMSR_PEER_ATTR_RESP
]) {
3878 ret
= mac80211_hwsim_parse_pmsr_resp(tb
[NL80211_PMSR_PEER_ATTR_RESP
], result
, info
);
3886 static int hwsim_pmsr_report_nl(struct sk_buff
*msg
, struct genl_info
*info
)
3888 struct mac80211_hwsim_data
*data
;
3889 struct nlattr
*peers
, *peer
;
3890 struct nlattr
*reqattr
;
3895 if (!info
->attrs
[HWSIM_ATTR_ADDR_TRANSMITTER
])
3898 src
= nla_data(info
->attrs
[HWSIM_ATTR_ADDR_TRANSMITTER
]);
3899 data
= get_hwsim_data_ref_from_addr(src
);
3903 mutex_lock(&data
->mutex
);
3904 if (!data
->pmsr_request
) {
3909 reqattr
= info
->attrs
[HWSIM_ATTR_PMSR_RESULT
];
3915 peers
= nla_find_nested(reqattr
, NL80211_PMSR_ATTR_PEERS
);
3921 nla_for_each_nested(peer
, peers
, rem
) {
3922 struct cfg80211_pmsr_result result
= {};
3924 err
= mac80211_hwsim_parse_pmsr_result(peer
, &result
, info
);
3928 cfg80211_pmsr_report(data
->pmsr_request_wdev
,
3929 data
->pmsr_request
, &result
, GFP_KERNEL
);
3932 cfg80211_pmsr_complete(data
->pmsr_request_wdev
, data
->pmsr_request
, GFP_KERNEL
);
3936 data
->pmsr_request
= NULL
;
3937 data
->pmsr_request_wdev
= NULL
;
3939 mutex_unlock(&data
->mutex
);
3943 #ifdef CONFIG_MAC80211_DEBUGFS
3944 #define HWSIM_DEBUGFS_OPS \
3945 .link_add_debugfs = mac80211_hwsim_link_add_debugfs,
3947 #define HWSIM_DEBUGFS_OPS
3950 #define HWSIM_COMMON_OPS \
3951 .tx = mac80211_hwsim_tx, \
3952 .wake_tx_queue = ieee80211_handle_wake_tx_queue, \
3953 .start = mac80211_hwsim_start, \
3954 .stop = mac80211_hwsim_stop, \
3955 .add_interface = mac80211_hwsim_add_interface, \
3956 .change_interface = mac80211_hwsim_change_interface, \
3957 .remove_interface = mac80211_hwsim_remove_interface, \
3958 .config = mac80211_hwsim_config, \
3959 .configure_filter = mac80211_hwsim_configure_filter, \
3960 .vif_cfg_changed = mac80211_hwsim_vif_info_changed, \
3961 .link_info_changed = mac80211_hwsim_link_info_changed, \
3962 .tx_last_beacon = mac80211_hwsim_tx_last_beacon, \
3963 .sta_notify = mac80211_hwsim_sta_notify, \
3964 .link_sta_rc_update = mac80211_hwsim_sta_rc_update, \
3965 .conf_tx = mac80211_hwsim_conf_tx, \
3966 .get_survey = mac80211_hwsim_get_survey, \
3967 CFG80211_TESTMODE_CMD(mac80211_hwsim_testmode_cmd) \
3968 .ampdu_action = mac80211_hwsim_ampdu_action, \
3969 .flush = mac80211_hwsim_flush, \
3970 .get_et_sset_count = mac80211_hwsim_get_et_sset_count, \
3971 .get_et_stats = mac80211_hwsim_get_et_stats, \
3972 .get_et_strings = mac80211_hwsim_get_et_strings, \
3973 .start_pmsr = mac80211_hwsim_start_pmsr, \
3974 .abort_pmsr = mac80211_hwsim_abort_pmsr, \
3977 #define HWSIM_NON_MLO_OPS \
3978 .sta_add = mac80211_hwsim_sta_add, \
3979 .sta_remove = mac80211_hwsim_sta_remove, \
3980 .set_tim = mac80211_hwsim_set_tim, \
3981 .get_tsf = mac80211_hwsim_get_tsf, \
3982 .set_tsf = mac80211_hwsim_set_tsf,
3984 static const struct ieee80211_ops mac80211_hwsim_ops
= {
3987 .sw_scan_start
= mac80211_hwsim_sw_scan
,
3988 .sw_scan_complete
= mac80211_hwsim_sw_scan_complete
,
3989 .add_chanctx
= ieee80211_emulate_add_chanctx
,
3990 .remove_chanctx
= ieee80211_emulate_remove_chanctx
,
3991 .change_chanctx
= ieee80211_emulate_change_chanctx
,
3992 .switch_vif_chanctx
= ieee80211_emulate_switch_vif_chanctx
,
3995 #define HWSIM_CHANCTX_OPS \
3996 .hw_scan = mac80211_hwsim_hw_scan, \
3997 .cancel_hw_scan = mac80211_hwsim_cancel_hw_scan, \
3998 .remain_on_channel = mac80211_hwsim_roc, \
3999 .cancel_remain_on_channel = mac80211_hwsim_croc, \
4000 .add_chanctx = mac80211_hwsim_add_chanctx, \
4001 .remove_chanctx = mac80211_hwsim_remove_chanctx, \
4002 .change_chanctx = mac80211_hwsim_change_chanctx, \
4003 .assign_vif_chanctx = mac80211_hwsim_assign_vif_chanctx,\
4004 .unassign_vif_chanctx = mac80211_hwsim_unassign_vif_chanctx, \
4005 .switch_vif_chanctx = mac80211_hwsim_switch_vif_chanctx,
4007 static const struct ieee80211_ops mac80211_hwsim_mchan_ops
= {
4013 static const struct ieee80211_ops mac80211_hwsim_mlo_ops
= {
4016 .set_rts_threshold
= mac80211_hwsim_set_rts_threshold
,
4017 .change_vif_links
= mac80211_hwsim_change_vif_links
,
4018 .change_sta_links
= mac80211_hwsim_change_sta_links
,
4019 .sta_state
= mac80211_hwsim_sta_state
,
4020 .can_neg_ttlm
= mac80211_hwsim_can_neg_ttlm
,
4023 struct hwsim_new_radio_params
{
4024 unsigned int channels
;
4025 const char *reg_alpha2
;
4026 const struct ieee80211_regdomain
*regd
;
4031 bool destroy_on_close
;
4034 const u8
*perm_addr
;
4039 const struct cfg80211_pmsr_capabilities
*pmsr_capa
;
4042 static void hwsim_mcast_config_msg(struct sk_buff
*mcast_skb
,
4043 struct genl_info
*info
)
4046 genl_notify(&hwsim_genl_family
, mcast_skb
, info
,
4047 HWSIM_MCGRP_CONFIG
, GFP_KERNEL
);
4049 genlmsg_multicast(&hwsim_genl_family
, mcast_skb
, 0,
4050 HWSIM_MCGRP_CONFIG
, GFP_KERNEL
);
4053 static int append_radio_msg(struct sk_buff
*skb
, int id
,
4054 struct hwsim_new_radio_params
*param
)
4058 ret
= nla_put_u32(skb
, HWSIM_ATTR_RADIO_ID
, id
);
4062 if (param
->channels
) {
4063 ret
= nla_put_u32(skb
, HWSIM_ATTR_CHANNELS
, param
->channels
);
4068 if (param
->reg_alpha2
) {
4069 ret
= nla_put(skb
, HWSIM_ATTR_REG_HINT_ALPHA2
, 2,
4078 for (i
= 0; i
< ARRAY_SIZE(hwsim_world_regdom_custom
); i
++) {
4079 if (hwsim_world_regdom_custom
[i
] != param
->regd
)
4082 ret
= nla_put_u32(skb
, HWSIM_ATTR_REG_CUSTOM_REG
, i
);
4089 if (param
->reg_strict
) {
4090 ret
= nla_put_flag(skb
, HWSIM_ATTR_REG_STRICT_REG
);
4095 if (param
->p2p_device
) {
4096 ret
= nla_put_flag(skb
, HWSIM_ATTR_SUPPORT_P2P_DEVICE
);
4101 if (param
->use_chanctx
) {
4102 ret
= nla_put_flag(skb
, HWSIM_ATTR_USE_CHANCTX
);
4107 if (param
->multi_radio
) {
4108 ret
= nla_put_flag(skb
, HWSIM_ATTR_MULTI_RADIO
);
4113 if (param
->hwname
) {
4114 ret
= nla_put(skb
, HWSIM_ATTR_RADIO_NAME
,
4115 strlen(param
->hwname
), param
->hwname
);
4123 static void hwsim_mcast_new_radio(int id
, struct genl_info
*info
,
4124 struct hwsim_new_radio_params
*param
)
4126 struct sk_buff
*mcast_skb
;
4129 mcast_skb
= genlmsg_new(GENLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
4133 data
= genlmsg_put(mcast_skb
, 0, 0, &hwsim_genl_family
, 0,
4134 HWSIM_CMD_NEW_RADIO
);
4138 if (append_radio_msg(mcast_skb
, id
, param
) < 0)
4141 genlmsg_end(mcast_skb
, data
);
4143 hwsim_mcast_config_msg(mcast_skb
, info
);
4147 nlmsg_free(mcast_skb
);
4150 static const struct ieee80211_sband_iftype_data sband_capa_2ghz
[] = {
4152 .types_mask
= BIT(NL80211_IFTYPE_STATION
) |
4153 BIT(NL80211_IFTYPE_P2P_CLIENT
),
4158 IEEE80211_HE_MAC_CAP0_HTC_HE
,
4160 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US
|
4161 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8
,
4163 IEEE80211_HE_MAC_CAP2_BSR
|
4164 IEEE80211_HE_MAC_CAP2_MU_CASCADING
|
4165 IEEE80211_HE_MAC_CAP2_ACK_EN
,
4167 IEEE80211_HE_MAC_CAP3_OMI_CONTROL
|
4168 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3
,
4169 .mac_cap_info
[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU
,
4171 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G
,
4173 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK
|
4174 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A
|
4175 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD
|
4176 IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS
,
4178 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US
|
4179 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ
|
4180 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ
|
4181 IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO
|
4182 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO
,
4184 /* Leave all the other PHY capability bytes
4185 * unset, as DCM, beam forming, RU and PPE
4186 * threshold information are not supported
4189 .he_mcs_nss_supp
= {
4190 .rx_mcs_80
= cpu_to_le16(0xfffa),
4191 .tx_mcs_80
= cpu_to_le16(0xfffa),
4192 .rx_mcs_160
= cpu_to_le16(0xffff),
4193 .tx_mcs_160
= cpu_to_le16(0xffff),
4194 .rx_mcs_80p80
= cpu_to_le16(0xffff),
4195 .tx_mcs_80p80
= cpu_to_le16(0xffff),
4202 IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS
|
4203 IEEE80211_EHT_MAC_CAP0_OM_CONTROL
|
4204 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1
,
4206 IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ
|
4207 IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI
|
4208 IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO
|
4209 IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER
|
4210 IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE
,
4212 IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK
|
4213 IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK
|
4214 IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK
|
4215 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK
|
4216 IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK
|
4217 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK
|
4218 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK
,
4220 IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO
|
4221 IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP
|
4222 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP
|
4223 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI
|
4224 IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK
,
4226 IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK
|
4227 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP
|
4228 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP
|
4229 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT
|
4230 IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK
|
4231 IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK
,
4233 IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK
|
4234 IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK
,
4236 IEEE80211_EHT_PHY_CAP7_20MHZ_STA_RX_NDP_WIDER_BW
,
4239 /* For all MCS and bandwidth, set 8 NSS for both Tx and
4242 .eht_mcs_nss_supp
= {
4244 * Since B0, B1, B2 and B3 are not set in
4245 * the supported channel width set field in the
4246 * HE PHY capabilities information field the
4247 * device is a 20MHz only device on 2.4GHz band.
4250 .rx_tx_mcs7_max_nss
= 0x88,
4251 .rx_tx_mcs9_max_nss
= 0x88,
4252 .rx_tx_mcs11_max_nss
= 0x88,
4253 .rx_tx_mcs13_max_nss
= 0x88,
4256 /* PPE threshold information is not supported */
4260 .types_mask
= BIT(NL80211_IFTYPE_AP
) |
4261 BIT(NL80211_IFTYPE_P2P_GO
),
4266 IEEE80211_HE_MAC_CAP0_HTC_HE
,
4268 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US
|
4269 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8
,
4271 IEEE80211_HE_MAC_CAP2_BSR
|
4272 IEEE80211_HE_MAC_CAP2_MU_CASCADING
|
4273 IEEE80211_HE_MAC_CAP2_ACK_EN
,
4275 IEEE80211_HE_MAC_CAP3_OMI_CONTROL
|
4276 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3
,
4277 .mac_cap_info
[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU
,
4279 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G
,
4281 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK
|
4282 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A
|
4283 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD
|
4284 IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS
,
4286 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US
|
4287 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ
|
4288 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ
|
4289 IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO
|
4290 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO
,
4292 /* Leave all the other PHY capability bytes
4293 * unset, as DCM, beam forming, RU and PPE
4294 * threshold information are not supported
4297 .he_mcs_nss_supp
= {
4298 .rx_mcs_80
= cpu_to_le16(0xfffa),
4299 .tx_mcs_80
= cpu_to_le16(0xfffa),
4300 .rx_mcs_160
= cpu_to_le16(0xffff),
4301 .tx_mcs_160
= cpu_to_le16(0xffff),
4302 .rx_mcs_80p80
= cpu_to_le16(0xffff),
4303 .tx_mcs_80p80
= cpu_to_le16(0xffff),
4310 IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS
|
4311 IEEE80211_EHT_MAC_CAP0_OM_CONTROL
|
4312 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1
,
4314 IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ
|
4315 IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI
|
4316 IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO
|
4317 IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER
|
4318 IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE
,
4320 IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK
|
4321 IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK
|
4322 IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK
|
4323 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK
|
4324 IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK
|
4325 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK
|
4326 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK
,
4328 IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO
|
4329 IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP
|
4330 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP
|
4331 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI
|
4332 IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK
,
4334 IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK
|
4335 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP
|
4336 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP
|
4337 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT
|
4338 IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK
|
4339 IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK
,
4341 IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK
|
4342 IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK
,
4344 IEEE80211_EHT_PHY_CAP7_20MHZ_STA_RX_NDP_WIDER_BW
,
4347 /* For all MCS and bandwidth, set 8 NSS for both Tx and
4350 .eht_mcs_nss_supp
= {
4352 * Since B0, B1, B2 and B3 are not set in
4353 * the supported channel width set field in the
4354 * HE PHY capabilities information field the
4355 * device is a 20MHz only device on 2.4GHz band.
4358 .rx_tx_mcs7_max_nss
= 0x88,
4359 .rx_tx_mcs9_max_nss
= 0x88,
4360 .rx_tx_mcs11_max_nss
= 0x88,
4361 .rx_tx_mcs13_max_nss
= 0x88,
4364 /* PPE threshold information is not supported */
4367 #ifdef CONFIG_MAC80211_MESH
4369 .types_mask
= BIT(NL80211_IFTYPE_MESH_POINT
),
4374 IEEE80211_HE_MAC_CAP0_HTC_HE
,
4376 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8
,
4378 IEEE80211_HE_MAC_CAP2_ACK_EN
,
4380 IEEE80211_HE_MAC_CAP3_OMI_CONTROL
|
4381 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3
,
4382 .mac_cap_info
[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU
,
4384 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G
,
4386 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK
|
4387 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A
|
4388 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD
|
4389 IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS
,
4390 .phy_cap_info
[2] = 0,
4392 /* Leave all the other PHY capability bytes
4393 * unset, as DCM, beam forming, RU and PPE
4394 * threshold information are not supported
4397 .he_mcs_nss_supp
= {
4398 .rx_mcs_80
= cpu_to_le16(0xfffa),
4399 .tx_mcs_80
= cpu_to_le16(0xfffa),
4400 .rx_mcs_160
= cpu_to_le16(0xffff),
4401 .tx_mcs_160
= cpu_to_le16(0xffff),
4402 .rx_mcs_80p80
= cpu_to_le16(0xffff),
4403 .tx_mcs_80p80
= cpu_to_le16(0xffff),
4410 static const struct ieee80211_sband_iftype_data sband_capa_5ghz
[] = {
4412 .types_mask
= BIT(NL80211_IFTYPE_STATION
) |
4413 BIT(NL80211_IFTYPE_P2P_CLIENT
),
4418 IEEE80211_HE_MAC_CAP0_HTC_HE
,
4420 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US
|
4421 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8
,
4423 IEEE80211_HE_MAC_CAP2_BSR
|
4424 IEEE80211_HE_MAC_CAP2_MU_CASCADING
|
4425 IEEE80211_HE_MAC_CAP2_ACK_EN
,
4427 IEEE80211_HE_MAC_CAP3_OMI_CONTROL
|
4428 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3
,
4429 .mac_cap_info
[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU
,
4431 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G
|
4432 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G
|
4433 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G
,
4435 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK
|
4436 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A
|
4437 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD
|
4438 IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS
,
4440 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US
|
4441 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ
|
4442 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ
|
4443 IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO
|
4444 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO
,
4446 /* Leave all the other PHY capability bytes
4447 * unset, as DCM, beam forming, RU and PPE
4448 * threshold information are not supported
4451 .he_mcs_nss_supp
= {
4452 .rx_mcs_80
= cpu_to_le16(0xfffa),
4453 .tx_mcs_80
= cpu_to_le16(0xfffa),
4454 .rx_mcs_160
= cpu_to_le16(0xfffa),
4455 .tx_mcs_160
= cpu_to_le16(0xfffa),
4456 .rx_mcs_80p80
= cpu_to_le16(0xfffa),
4457 .tx_mcs_80p80
= cpu_to_le16(0xfffa),
4464 IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS
|
4465 IEEE80211_EHT_MAC_CAP0_OM_CONTROL
|
4466 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1
,
4468 IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ
|
4469 IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI
|
4470 IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO
|
4471 IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER
|
4472 IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE
|
4473 IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK
,
4475 IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK
|
4476 IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK
,
4478 IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK
|
4479 IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK
,
4481 IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK
|
4482 IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK
|
4483 IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK
|
4484 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK
|
4485 IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK
|
4486 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK
|
4487 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK
,
4489 IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO
|
4490 IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP
|
4491 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP
|
4492 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI
|
4493 IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK
,
4495 IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK
|
4496 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP
|
4497 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP
|
4498 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT
|
4499 IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK
|
4500 IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK
,
4502 IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK
|
4503 IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK
,
4505 IEEE80211_EHT_PHY_CAP7_20MHZ_STA_RX_NDP_WIDER_BW
|
4506 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ
|
4507 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ
|
4508 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ
|
4509 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ
,
4512 /* For all MCS and bandwidth, set 8 NSS for both Tx and
4515 .eht_mcs_nss_supp
= {
4517 * As B1 and B2 are set in the supported
4518 * channel width set field in the HE PHY
4519 * capabilities information field include all
4520 * the following MCS/NSS.
4523 .rx_tx_mcs9_max_nss
= 0x88,
4524 .rx_tx_mcs11_max_nss
= 0x88,
4525 .rx_tx_mcs13_max_nss
= 0x88,
4528 .rx_tx_mcs9_max_nss
= 0x88,
4529 .rx_tx_mcs11_max_nss
= 0x88,
4530 .rx_tx_mcs13_max_nss
= 0x88,
4533 /* PPE threshold information is not supported */
4537 .types_mask
= BIT(NL80211_IFTYPE_AP
) |
4538 BIT(NL80211_IFTYPE_P2P_GO
),
4543 IEEE80211_HE_MAC_CAP0_HTC_HE
,
4545 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US
|
4546 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8
,
4548 IEEE80211_HE_MAC_CAP2_BSR
|
4549 IEEE80211_HE_MAC_CAP2_MU_CASCADING
|
4550 IEEE80211_HE_MAC_CAP2_ACK_EN
,
4552 IEEE80211_HE_MAC_CAP3_OMI_CONTROL
|
4553 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3
,
4554 .mac_cap_info
[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU
,
4556 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G
|
4557 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G
|
4558 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G
,
4560 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK
|
4561 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A
|
4562 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD
|
4563 IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS
,
4565 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US
|
4566 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ
|
4567 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ
|
4568 IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO
|
4569 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO
,
4571 /* Leave all the other PHY capability bytes
4572 * unset, as DCM, beam forming, RU and PPE
4573 * threshold information are not supported
4576 .he_mcs_nss_supp
= {
4577 .rx_mcs_80
= cpu_to_le16(0xfffa),
4578 .tx_mcs_80
= cpu_to_le16(0xfffa),
4579 .rx_mcs_160
= cpu_to_le16(0xfffa),
4580 .tx_mcs_160
= cpu_to_le16(0xfffa),
4581 .rx_mcs_80p80
= cpu_to_le16(0xfffa),
4582 .tx_mcs_80p80
= cpu_to_le16(0xfffa),
4589 IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS
|
4590 IEEE80211_EHT_MAC_CAP0_OM_CONTROL
|
4591 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1
,
4593 IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ
|
4594 IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI
|
4595 IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO
|
4596 IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER
|
4597 IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE
|
4598 IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK
,
4600 IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK
|
4601 IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK
,
4603 IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK
|
4604 IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK
,
4606 IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK
|
4607 IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK
|
4608 IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK
|
4609 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK
|
4610 IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK
|
4611 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK
|
4612 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK
,
4614 IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO
|
4615 IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP
|
4616 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP
|
4617 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI
|
4618 IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK
,
4620 IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK
|
4621 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP
|
4622 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP
|
4623 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT
|
4624 IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK
|
4625 IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK
,
4627 IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK
|
4628 IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK
,
4630 IEEE80211_EHT_PHY_CAP7_20MHZ_STA_RX_NDP_WIDER_BW
|
4631 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ
|
4632 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ
|
4633 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ
|
4634 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ
,
4637 /* For all MCS and bandwidth, set 8 NSS for both Tx and
4640 .eht_mcs_nss_supp
= {
4642 * As B1 and B2 are set in the supported
4643 * channel width set field in the HE PHY
4644 * capabilities information field include all
4645 * the following MCS/NSS.
4648 .rx_tx_mcs9_max_nss
= 0x88,
4649 .rx_tx_mcs11_max_nss
= 0x88,
4650 .rx_tx_mcs13_max_nss
= 0x88,
4653 .rx_tx_mcs9_max_nss
= 0x88,
4654 .rx_tx_mcs11_max_nss
= 0x88,
4655 .rx_tx_mcs13_max_nss
= 0x88,
4658 /* PPE threshold information is not supported */
4661 #ifdef CONFIG_MAC80211_MESH
4663 /* TODO: should we support other types, e.g., IBSS?*/
4664 .types_mask
= BIT(NL80211_IFTYPE_MESH_POINT
),
4669 IEEE80211_HE_MAC_CAP0_HTC_HE
,
4671 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8
,
4673 IEEE80211_HE_MAC_CAP2_ACK_EN
,
4675 IEEE80211_HE_MAC_CAP3_OMI_CONTROL
|
4676 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3
,
4677 .mac_cap_info
[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU
,
4679 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G
|
4680 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G
|
4681 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G
,
4683 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK
|
4684 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A
|
4685 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD
|
4686 IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS
,
4687 .phy_cap_info
[2] = 0,
4689 /* Leave all the other PHY capability bytes
4690 * unset, as DCM, beam forming, RU and PPE
4691 * threshold information are not supported
4694 .he_mcs_nss_supp
= {
4695 .rx_mcs_80
= cpu_to_le16(0xfffa),
4696 .tx_mcs_80
= cpu_to_le16(0xfffa),
4697 .rx_mcs_160
= cpu_to_le16(0xfffa),
4698 .tx_mcs_160
= cpu_to_le16(0xfffa),
4699 .rx_mcs_80p80
= cpu_to_le16(0xfffa),
4700 .tx_mcs_80p80
= cpu_to_le16(0xfffa),
4707 static const struct ieee80211_sband_iftype_data sband_capa_6ghz
[] = {
4709 .types_mask
= BIT(NL80211_IFTYPE_STATION
) |
4710 BIT(NL80211_IFTYPE_P2P_CLIENT
),
4712 .capa
= cpu_to_le16(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START
|
4713 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP
|
4714 IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN
|
4715 IEEE80211_HE_6GHZ_CAP_SM_PS
|
4716 IEEE80211_HE_6GHZ_CAP_RD_RESPONDER
|
4717 IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS
|
4718 IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS
),
4724 IEEE80211_HE_MAC_CAP0_HTC_HE
,
4726 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US
|
4727 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8
,
4729 IEEE80211_HE_MAC_CAP2_BSR
|
4730 IEEE80211_HE_MAC_CAP2_MU_CASCADING
|
4731 IEEE80211_HE_MAC_CAP2_ACK_EN
,
4733 IEEE80211_HE_MAC_CAP3_OMI_CONTROL
|
4734 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3
,
4735 .mac_cap_info
[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU
,
4737 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G
|
4738 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G
|
4739 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G
,
4741 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK
|
4742 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A
|
4743 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD
|
4744 IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS
,
4746 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US
|
4747 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ
|
4748 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ
|
4749 IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO
|
4750 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO
,
4752 /* Leave all the other PHY capability bytes
4753 * unset, as DCM, beam forming, RU and PPE
4754 * threshold information are not supported
4757 .he_mcs_nss_supp
= {
4758 .rx_mcs_80
= cpu_to_le16(0xfffa),
4759 .tx_mcs_80
= cpu_to_le16(0xfffa),
4760 .rx_mcs_160
= cpu_to_le16(0xfffa),
4761 .tx_mcs_160
= cpu_to_le16(0xfffa),
4762 .rx_mcs_80p80
= cpu_to_le16(0xfffa),
4763 .tx_mcs_80p80
= cpu_to_le16(0xfffa),
4770 IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS
|
4771 IEEE80211_EHT_MAC_CAP0_OM_CONTROL
|
4772 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1
,
4774 IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ
|
4775 IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ
|
4776 IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI
|
4777 IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO
|
4778 IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER
|
4779 IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE
|
4780 IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK
,
4782 IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK
|
4783 IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK
|
4784 IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK
,
4786 IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK
|
4787 IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK
|
4788 IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK
,
4790 IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK
|
4791 IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK
|
4792 IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK
|
4793 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK
|
4794 IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK
|
4795 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK
|
4796 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK
,
4798 IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO
|
4799 IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP
|
4800 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP
|
4801 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI
|
4802 IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK
,
4804 IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK
|
4805 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP
|
4806 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP
|
4807 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT
|
4808 IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK
|
4809 IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK
,
4811 IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK
|
4812 IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK
|
4813 IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP
,
4815 IEEE80211_EHT_PHY_CAP7_20MHZ_STA_RX_NDP_WIDER_BW
|
4816 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ
|
4817 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ
|
4818 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ
|
4819 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ
|
4820 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ
|
4821 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ
,
4824 /* For all MCS and bandwidth, set 8 NSS for both Tx and
4827 .eht_mcs_nss_supp
= {
4829 * As B1 and B2 are set in the supported
4830 * channel width set field in the HE PHY
4831 * capabilities information field and 320MHz in
4832 * 6GHz is supported include all the following
4836 .rx_tx_mcs9_max_nss
= 0x88,
4837 .rx_tx_mcs11_max_nss
= 0x88,
4838 .rx_tx_mcs13_max_nss
= 0x88,
4841 .rx_tx_mcs9_max_nss
= 0x88,
4842 .rx_tx_mcs11_max_nss
= 0x88,
4843 .rx_tx_mcs13_max_nss
= 0x88,
4846 .rx_tx_mcs9_max_nss
= 0x88,
4847 .rx_tx_mcs11_max_nss
= 0x88,
4848 .rx_tx_mcs13_max_nss
= 0x88,
4851 /* PPE threshold information is not supported */
4855 .types_mask
= BIT(NL80211_IFTYPE_AP
) |
4856 BIT(NL80211_IFTYPE_P2P_GO
),
4858 .capa
= cpu_to_le16(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START
|
4859 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP
|
4860 IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN
|
4861 IEEE80211_HE_6GHZ_CAP_SM_PS
|
4862 IEEE80211_HE_6GHZ_CAP_RD_RESPONDER
|
4863 IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS
|
4864 IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS
),
4870 IEEE80211_HE_MAC_CAP0_HTC_HE
,
4872 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US
|
4873 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8
,
4875 IEEE80211_HE_MAC_CAP2_BSR
|
4876 IEEE80211_HE_MAC_CAP2_MU_CASCADING
|
4877 IEEE80211_HE_MAC_CAP2_ACK_EN
,
4879 IEEE80211_HE_MAC_CAP3_OMI_CONTROL
|
4880 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3
,
4881 .mac_cap_info
[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU
,
4883 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G
|
4884 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G
|
4885 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G
,
4887 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK
|
4888 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A
|
4889 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD
|
4890 IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS
,
4892 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US
|
4893 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ
|
4894 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ
|
4895 IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO
|
4896 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO
,
4898 /* Leave all the other PHY capability bytes
4899 * unset, as DCM, beam forming, RU and PPE
4900 * threshold information are not supported
4903 .he_mcs_nss_supp
= {
4904 .rx_mcs_80
= cpu_to_le16(0xfffa),
4905 .tx_mcs_80
= cpu_to_le16(0xfffa),
4906 .rx_mcs_160
= cpu_to_le16(0xfffa),
4907 .tx_mcs_160
= cpu_to_le16(0xfffa),
4908 .rx_mcs_80p80
= cpu_to_le16(0xfffa),
4909 .tx_mcs_80p80
= cpu_to_le16(0xfffa),
4916 IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS
|
4917 IEEE80211_EHT_MAC_CAP0_OM_CONTROL
|
4918 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1
,
4920 IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ
|
4921 IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ
|
4922 IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI
|
4923 IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO
|
4924 IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER
|
4925 IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE
|
4926 IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK
,
4928 IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK
|
4929 IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK
|
4930 IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK
,
4932 IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK
|
4933 IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK
|
4934 IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK
,
4936 IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK
|
4937 IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK
|
4938 IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK
|
4939 IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK
|
4940 IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK
|
4941 IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK
|
4942 IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK
,
4944 IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO
|
4945 IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP
|
4946 IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP
|
4947 IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI
|
4948 IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK
,
4950 IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK
|
4951 IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP
|
4952 IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP
|
4953 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT
|
4954 IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK
|
4955 IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK
,
4957 IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK
|
4958 IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK
|
4959 IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP
,
4961 IEEE80211_EHT_PHY_CAP7_20MHZ_STA_RX_NDP_WIDER_BW
|
4962 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ
|
4963 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ
|
4964 IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ
|
4965 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ
|
4966 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ
|
4967 IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ
,
4970 /* For all MCS and bandwidth, set 8 NSS for both Tx and
4973 .eht_mcs_nss_supp
= {
4975 * As B1 and B2 are set in the supported
4976 * channel width set field in the HE PHY
4977 * capabilities information field and 320MHz in
4978 * 6GHz is supported include all the following
4982 .rx_tx_mcs9_max_nss
= 0x88,
4983 .rx_tx_mcs11_max_nss
= 0x88,
4984 .rx_tx_mcs13_max_nss
= 0x88,
4987 .rx_tx_mcs9_max_nss
= 0x88,
4988 .rx_tx_mcs11_max_nss
= 0x88,
4989 .rx_tx_mcs13_max_nss
= 0x88,
4992 .rx_tx_mcs9_max_nss
= 0x88,
4993 .rx_tx_mcs11_max_nss
= 0x88,
4994 .rx_tx_mcs13_max_nss
= 0x88,
4997 /* PPE threshold information is not supported */
5000 #ifdef CONFIG_MAC80211_MESH
5002 /* TODO: should we support other types, e.g., IBSS?*/
5003 .types_mask
= BIT(NL80211_IFTYPE_MESH_POINT
),
5005 .capa
= cpu_to_le16(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START
|
5006 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP
|
5007 IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN
|
5008 IEEE80211_HE_6GHZ_CAP_SM_PS
|
5009 IEEE80211_HE_6GHZ_CAP_RD_RESPONDER
|
5010 IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS
|
5011 IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS
),
5017 IEEE80211_HE_MAC_CAP0_HTC_HE
,
5019 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8
,
5021 IEEE80211_HE_MAC_CAP2_ACK_EN
,
5023 IEEE80211_HE_MAC_CAP3_OMI_CONTROL
|
5024 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3
,
5025 .mac_cap_info
[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU
,
5027 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G
|
5028 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G
|
5029 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G
,
5031 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK
|
5032 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A
|
5033 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD
|
5034 IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS
,
5035 .phy_cap_info
[2] = 0,
5037 /* Leave all the other PHY capability bytes
5038 * unset, as DCM, beam forming, RU and PPE
5039 * threshold information are not supported
5042 .he_mcs_nss_supp
= {
5043 .rx_mcs_80
= cpu_to_le16(0xfffa),
5044 .tx_mcs_80
= cpu_to_le16(0xfffa),
5045 .rx_mcs_160
= cpu_to_le16(0xfffa),
5046 .tx_mcs_160
= cpu_to_le16(0xfffa),
5047 .rx_mcs_80p80
= cpu_to_le16(0xfffa),
5048 .tx_mcs_80p80
= cpu_to_le16(0xfffa),
5055 static void mac80211_hwsim_sband_capab(struct ieee80211_supported_band
*sband
)
5057 switch (sband
->band
) {
5058 case NL80211_BAND_2GHZ
:
5059 ieee80211_set_sband_iftype_data(sband
, sband_capa_2ghz
);
5061 case NL80211_BAND_5GHZ
:
5062 ieee80211_set_sband_iftype_data(sband
, sband_capa_5ghz
);
5064 case NL80211_BAND_6GHZ
:
5065 ieee80211_set_sband_iftype_data(sband
, sband_capa_6ghz
);
5072 #ifdef CONFIG_MAC80211_MESH
5073 #define HWSIM_MESH_BIT BIT(NL80211_IFTYPE_MESH_POINT)
5075 #define HWSIM_MESH_BIT 0
5078 #define HWSIM_DEFAULT_IF_LIMIT \
5079 (BIT(NL80211_IFTYPE_STATION) | \
5080 BIT(NL80211_IFTYPE_P2P_CLIENT) | \
5081 BIT(NL80211_IFTYPE_AP) | \
5082 BIT(NL80211_IFTYPE_P2P_GO) | \
5085 #define HWSIM_IFTYPE_SUPPORT_MASK \
5086 (BIT(NL80211_IFTYPE_STATION) | \
5087 BIT(NL80211_IFTYPE_AP) | \
5088 BIT(NL80211_IFTYPE_P2P_CLIENT) | \
5089 BIT(NL80211_IFTYPE_P2P_GO) | \
5090 BIT(NL80211_IFTYPE_ADHOC) | \
5091 BIT(NL80211_IFTYPE_MESH_POINT) | \
5092 BIT(NL80211_IFTYPE_OCB))
5094 static const u8 iftypes_ext_capa_ap
[] = {
5095 [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING
,
5096 [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT
,
5097 [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF
|
5098 WLAN_EXT_CAPA8_MAX_MSDU_IN_AMSDU_LSB
,
5099 [8] = WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB
,
5100 [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT
,
5103 #define MAC80211_HWSIM_MLD_CAPA_OPS \
5104 FIELD_PREP_CONST(IEEE80211_MLD_CAP_OP_TID_TO_LINK_MAP_NEG_SUPP, \
5105 IEEE80211_MLD_CAP_OP_TID_TO_LINK_MAP_NEG_SUPP_SAME) | \
5106 FIELD_PREP_CONST(IEEE80211_MLD_CAP_OP_MAX_SIMUL_LINKS, \
5107 IEEE80211_MLD_MAX_NUM_LINKS - 1)
5109 static const struct wiphy_iftype_ext_capab mac80211_hwsim_iftypes_ext_capa
[] = {
5111 .iftype
= NL80211_IFTYPE_AP
,
5112 .extended_capabilities
= iftypes_ext_capa_ap
,
5113 .extended_capabilities_mask
= iftypes_ext_capa_ap
,
5114 .extended_capabilities_len
= sizeof(iftypes_ext_capa_ap
),
5115 .eml_capabilities
= IEEE80211_EML_CAP_EMLSR_SUPP
|
5116 IEEE80211_EML_CAP_EMLMR_SUPPORT
,
5117 .mld_capa_and_ops
= MAC80211_HWSIM_MLD_CAPA_OPS
,
5121 static int mac80211_hwsim_new_radio(struct genl_info
*info
,
5122 struct hwsim_new_radio_params
*param
)
5126 struct mac80211_hwsim_data
*data
;
5127 struct ieee80211_hw
*hw
;
5128 enum nl80211_band band
;
5129 const struct ieee80211_ops
*ops
= &mac80211_hwsim_ops
;
5135 if (WARN_ON(param
->channels
> 1 && !param
->use_chanctx
))
5138 spin_lock_bh(&hwsim_radio_lock
);
5139 idx
= hwsim_radio_idx
++;
5140 spin_unlock_bh(&hwsim_radio_lock
);
5143 ops
= &mac80211_hwsim_mlo_ops
;
5144 else if (param
->use_chanctx
)
5145 ops
= &mac80211_hwsim_mchan_ops
;
5146 hw
= ieee80211_alloc_hw_nm(sizeof(*data
), ops
, param
->hwname
);
5148 pr_debug("mac80211_hwsim: ieee80211_alloc_hw failed\n");
5153 /* ieee80211_alloc_hw_nm may have used a default name */
5154 param
->hwname
= wiphy_name(hw
->wiphy
);
5157 net
= genl_info_net(info
);
5160 wiphy_net_set(hw
->wiphy
, net
);
5165 data
->dev
= device_create(hwsim_class
, NULL
, 0, hw
, "hwsim%d", idx
);
5166 if (IS_ERR(data
->dev
)) {
5168 "mac80211_hwsim: device_create failed (%ld)\n",
5169 PTR_ERR(data
->dev
));
5171 goto failed_drvdata
;
5173 data
->dev
->driver
= &mac80211_hwsim_driver
.driver
;
5174 err
= device_bind_driver(data
->dev
);
5176 pr_debug("mac80211_hwsim: device_bind_driver failed (%d)\n",
5181 skb_queue_head_init(&data
->pending
);
5183 SET_IEEE80211_DEV(hw
, data
->dev
);
5184 if (!param
->perm_addr
) {
5185 eth_zero_addr(addr
);
5189 memcpy(data
->addresses
[0].addr
, addr
, ETH_ALEN
);
5190 /* Why need here second address ? */
5191 memcpy(data
->addresses
[1].addr
, addr
, ETH_ALEN
);
5192 data
->addresses
[1].addr
[0] |= 0x40;
5193 hw
->wiphy
->n_addresses
= 2;
5194 hw
->wiphy
->addresses
= data
->addresses
;
5195 /* possible address clash is checked at hash table insertion */
5197 memcpy(data
->addresses
[0].addr
, param
->perm_addr
, ETH_ALEN
);
5198 /* compatibility with automatically generated mac addr */
5199 memcpy(data
->addresses
[1].addr
, param
->perm_addr
, ETH_ALEN
);
5200 hw
->wiphy
->n_addresses
= 2;
5201 hw
->wiphy
->addresses
= data
->addresses
;
5204 data
->channels
= param
->channels
;
5205 data
->use_chanctx
= param
->use_chanctx
;
5207 data
->destroy_on_close
= param
->destroy_on_close
;
5209 data
->portid
= info
->snd_portid
;
5211 /* setup interface limits, only on interface types we support */
5212 if (param
->iftypes
& BIT(NL80211_IFTYPE_ADHOC
)) {
5213 data
->if_limits
[n_limits
].max
= 1;
5214 data
->if_limits
[n_limits
].types
= BIT(NL80211_IFTYPE_ADHOC
);
5218 if (param
->iftypes
& HWSIM_DEFAULT_IF_LIMIT
) {
5219 data
->if_limits
[n_limits
].max
= 2048;
5221 * For this case, we may only support a subset of
5222 * HWSIM_DEFAULT_IF_LIMIT, therefore we only want to add the
5223 * bits that both param->iftype & HWSIM_DEFAULT_IF_LIMIT have.
5225 data
->if_limits
[n_limits
].types
=
5226 HWSIM_DEFAULT_IF_LIMIT
& param
->iftypes
;
5230 if (param
->iftypes
& BIT(NL80211_IFTYPE_P2P_DEVICE
)) {
5231 data
->if_limits
[n_limits
].max
= 1;
5232 data
->if_limits
[n_limits
].types
=
5233 BIT(NL80211_IFTYPE_P2P_DEVICE
);
5237 data
->if_combination
.radar_detect_widths
=
5238 BIT(NL80211_CHAN_WIDTH_5
) |
5239 BIT(NL80211_CHAN_WIDTH_10
) |
5240 BIT(NL80211_CHAN_WIDTH_20_NOHT
) |
5241 BIT(NL80211_CHAN_WIDTH_20
) |
5242 BIT(NL80211_CHAN_WIDTH_40
) |
5243 BIT(NL80211_CHAN_WIDTH_80
) |
5244 BIT(NL80211_CHAN_WIDTH_160
);
5246 if (data
->use_chanctx
) {
5247 hw
->wiphy
->max_scan_ssids
= 255;
5248 hw
->wiphy
->max_scan_ie_len
= IEEE80211_MAX_DATA_LEN
;
5249 hw
->wiphy
->max_remain_on_channel_duration
= 1000;
5250 data
->if_combination
.num_different_channels
= data
->channels
;
5252 data
->if_combination
.num_different_channels
= 1;
5260 data
->if_combination
.max_interfaces
= 0;
5261 for (i
= 0; i
< n_limits
; i
++)
5262 data
->if_combination
.max_interfaces
+=
5263 data
->if_limits
[i
].max
;
5265 data
->if_combination
.n_limits
= n_limits
;
5266 data
->if_combination
.limits
= data
->if_limits
;
5269 * If we actually were asked to support combinations,
5270 * advertise them - if there's only a single thing like
5271 * only IBSS then don't advertise it as combinations.
5273 if (data
->if_combination
.max_interfaces
> 1) {
5274 hw
->wiphy
->iface_combinations
= &data
->if_combination
;
5275 hw
->wiphy
->n_iface_combinations
= 1;
5278 if (param
->ciphers
) {
5279 memcpy(data
->ciphers
, param
->ciphers
,
5280 param
->n_ciphers
* sizeof(u32
));
5281 hw
->wiphy
->cipher_suites
= data
->ciphers
;
5282 hw
->wiphy
->n_cipher_suites
= param
->n_ciphers
;
5285 hw
->wiphy
->mbssid_max_interfaces
= 8;
5286 hw
->wiphy
->ema_max_profile_periodicity
= 3;
5288 data
->rx_rssi
= DEFAULT_RX_RSSI
;
5290 INIT_DELAYED_WORK(&data
->roc_start
, hw_roc_start
);
5291 INIT_DELAYED_WORK(&data
->roc_done
, hw_roc_done
);
5292 INIT_DELAYED_WORK(&data
->hw_scan
, hw_scan_work
);
5295 hw
->offchannel_tx_hw_queue
= 4;
5297 ieee80211_hw_set(hw
, SUPPORT_FAST_XMIT
);
5298 ieee80211_hw_set(hw
, CHANCTX_STA_CSA
);
5299 ieee80211_hw_set(hw
, SUPPORTS_HT_CCK_RATES
);
5300 ieee80211_hw_set(hw
, QUEUE_CONTROL
);
5301 ieee80211_hw_set(hw
, WANT_MONITOR_VIF
);
5302 ieee80211_hw_set(hw
, AMPDU_AGGREGATION
);
5303 ieee80211_hw_set(hw
, MFP_CAPABLE
);
5304 ieee80211_hw_set(hw
, SIGNAL_DBM
);
5305 ieee80211_hw_set(hw
, SUPPORTS_PS
);
5306 ieee80211_hw_set(hw
, REPORTS_TX_ACK_STATUS
);
5307 ieee80211_hw_set(hw
, TDLS_WIDER_BW
);
5308 ieee80211_hw_set(hw
, SUPPORTS_MULTI_BSSID
);
5311 hw
->wiphy
->flags
|= WIPHY_FLAG_SUPPORTS_MLO
;
5312 ieee80211_hw_set(hw
, HAS_RATE_CONTROL
);
5313 ieee80211_hw_set(hw
, SUPPORTS_DYNAMIC_PS
);
5314 ieee80211_hw_set(hw
, CONNECTION_MONITOR
);
5315 ieee80211_hw_set(hw
, AP_LINK_PS
);
5317 hw
->wiphy
->iftype_ext_capab
= mac80211_hwsim_iftypes_ext_capa
;
5318 hw
->wiphy
->num_iftype_ext_capab
=
5319 ARRAY_SIZE(mac80211_hwsim_iftypes_ext_capa
);
5321 ieee80211_hw_set(hw
, HOST_BROADCAST_PS_BUFFERING
);
5322 ieee80211_hw_set(hw
, PS_NULLFUNC_STACK
);
5324 ieee80211_hw_set(hw
, SUPPORTS_RC_TABLE
);
5327 hw
->wiphy
->flags
&= ~WIPHY_FLAG_PS_ON_BY_DEFAULT
;
5328 hw
->wiphy
->flags
|= WIPHY_FLAG_SUPPORTS_TDLS
|
5329 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL
|
5330 WIPHY_FLAG_AP_UAPSD
|
5331 WIPHY_FLAG_SUPPORTS_5_10_MHZ
|
5332 WIPHY_FLAG_HAS_CHANNEL_SWITCH
;
5333 hw
->wiphy
->features
|= NL80211_FEATURE_ACTIVE_MONITOR
|
5334 NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE
|
5335 NL80211_FEATURE_STATIC_SMPS
|
5336 NL80211_FEATURE_DYNAMIC_SMPS
|
5337 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR
;
5338 wiphy_ext_feature_set(hw
->wiphy
, NL80211_EXT_FEATURE_VHT_IBSS
);
5339 wiphy_ext_feature_set(hw
->wiphy
, NL80211_EXT_FEATURE_BEACON_PROTECTION
);
5340 wiphy_ext_feature_set(hw
->wiphy
,
5341 NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS
);
5342 wiphy_ext_feature_set(hw
->wiphy
,
5343 NL80211_EXT_FEATURE_BEACON_RATE_LEGACY
);
5344 wiphy_ext_feature_set(hw
->wiphy
, NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER
);
5346 wiphy_ext_feature_set(hw
->wiphy
,
5347 NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT
);
5348 wiphy_ext_feature_set(hw
->wiphy
,
5349 NL80211_EXT_FEATURE_BSS_COLOR
);
5351 hw
->wiphy
->interface_modes
= param
->iftypes
;
5353 /* ask mac80211 to reserve space for magic */
5354 hw
->vif_data_size
= sizeof(struct hwsim_vif_priv
);
5355 hw
->sta_data_size
= sizeof(struct hwsim_sta_priv
);
5356 hw
->chanctx_data_size
= sizeof(struct hwsim_chanctx_priv
);
5358 memcpy(data
->channels_2ghz
, hwsim_channels_2ghz
,
5359 sizeof(hwsim_channels_2ghz
));
5360 memcpy(data
->channels_5ghz
, hwsim_channels_5ghz
,
5361 sizeof(hwsim_channels_5ghz
));
5362 memcpy(data
->channels_6ghz
, hwsim_channels_6ghz
,
5363 sizeof(hwsim_channels_6ghz
));
5364 memcpy(data
->channels_s1g
, hwsim_channels_s1g
,
5365 sizeof(hwsim_channels_s1g
));
5366 memcpy(data
->rates
, hwsim_rates
, sizeof(hwsim_rates
));
5368 for (band
= NL80211_BAND_2GHZ
; band
< NUM_NL80211_BANDS
; band
++) {
5369 struct ieee80211_supported_band
*sband
= &data
->bands
[band
];
5370 struct wiphy_radio_freq_range
*radio_range
;
5371 const struct ieee80211_channel
*c
;
5372 struct wiphy_radio
*radio
;
5377 case NL80211_BAND_2GHZ
:
5378 sband
->channels
= data
->channels_2ghz
;
5379 sband
->n_channels
= ARRAY_SIZE(hwsim_channels_2ghz
);
5380 sband
->bitrates
= data
->rates
;
5381 sband
->n_bitrates
= ARRAY_SIZE(hwsim_rates
);
5383 case NL80211_BAND_5GHZ
:
5384 sband
->channels
= data
->channels_5ghz
;
5385 sband
->n_channels
= ARRAY_SIZE(hwsim_channels_5ghz
);
5386 sband
->bitrates
= data
->rates
+ 4;
5387 sband
->n_bitrates
= ARRAY_SIZE(hwsim_rates
) - 4;
5389 sband
->vht_cap
.vht_supported
= true;
5390 sband
->vht_cap
.cap
=
5391 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454
|
5392 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ
|
5393 IEEE80211_VHT_CAP_RXLDPC
|
5394 IEEE80211_VHT_CAP_SHORT_GI_80
|
5395 IEEE80211_VHT_CAP_SHORT_GI_160
|
5396 IEEE80211_VHT_CAP_TXSTBC
|
5397 IEEE80211_VHT_CAP_RXSTBC_4
|
5398 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK
;
5399 sband
->vht_cap
.vht_mcs
.rx_mcs_map
=
5400 cpu_to_le16(IEEE80211_VHT_MCS_SUPPORT_0_9
<< 0 |
5401 IEEE80211_VHT_MCS_SUPPORT_0_9
<< 2 |
5402 IEEE80211_VHT_MCS_SUPPORT_0_9
<< 4 |
5403 IEEE80211_VHT_MCS_SUPPORT_0_9
<< 6 |
5404 IEEE80211_VHT_MCS_SUPPORT_0_9
<< 8 |
5405 IEEE80211_VHT_MCS_SUPPORT_0_9
<< 10 |
5406 IEEE80211_VHT_MCS_SUPPORT_0_9
<< 12 |
5407 IEEE80211_VHT_MCS_SUPPORT_0_9
<< 14);
5408 sband
->vht_cap
.vht_mcs
.tx_mcs_map
=
5409 sband
->vht_cap
.vht_mcs
.rx_mcs_map
;
5411 case NL80211_BAND_6GHZ
:
5412 sband
->channels
= data
->channels_6ghz
;
5413 sband
->n_channels
= ARRAY_SIZE(hwsim_channels_6ghz
);
5414 sband
->bitrates
= data
->rates
+ 4;
5415 sband
->n_bitrates
= ARRAY_SIZE(hwsim_rates
) - 4;
5417 case NL80211_BAND_S1GHZ
:
5418 memcpy(&sband
->s1g_cap
, &hwsim_s1g_cap
,
5419 sizeof(sband
->s1g_cap
));
5420 sband
->channels
= data
->channels_s1g
;
5421 sband
->n_channels
= ARRAY_SIZE(hwsim_channels_s1g
);
5427 if (band
!= NL80211_BAND_6GHZ
){
5428 sband
->ht_cap
.ht_supported
= true;
5429 sband
->ht_cap
.cap
= IEEE80211_HT_CAP_SUP_WIDTH_20_40
|
5430 IEEE80211_HT_CAP_GRN_FLD
|
5431 IEEE80211_HT_CAP_SGI_20
|
5432 IEEE80211_HT_CAP_SGI_40
|
5433 IEEE80211_HT_CAP_DSSSCCK40
;
5434 sband
->ht_cap
.ampdu_factor
= 0x3;
5435 sband
->ht_cap
.ampdu_density
= 0x6;
5436 memset(&sband
->ht_cap
.mcs
, 0,
5437 sizeof(sband
->ht_cap
.mcs
));
5438 sband
->ht_cap
.mcs
.rx_mask
[0] = 0xff;
5439 sband
->ht_cap
.mcs
.rx_mask
[1] = 0xff;
5440 sband
->ht_cap
.mcs
.tx_params
= IEEE80211_HT_MCS_TX_DEFINED
;
5443 mac80211_hwsim_sband_capab(sband
);
5445 hw
->wiphy
->bands
[band
] = sband
;
5447 if (!param
->multi_radio
)
5450 c
= sband
->channels
;
5451 radio_range
= &data
->radio_range
[n_bands
];
5452 radio_range
->start_freq
= ieee80211_channel_to_khz(c
) - 10000;
5454 c
+= sband
->n_channels
- 1;
5455 radio_range
->end_freq
= ieee80211_channel_to_khz(c
) + 10000;
5457 radio
= &data
->radio
[n_bands
++];
5458 radio
->freq_range
= radio_range
;
5459 radio
->n_freq_range
= 1;
5460 radio
->iface_combinations
= &data
->if_combination_radio
;
5461 radio
->n_iface_combinations
= 1;
5464 if (param
->multi_radio
) {
5465 hw
->wiphy
->radio
= data
->radio
;
5466 hw
->wiphy
->n_radio
= n_bands
;
5468 memcpy(&data
->if_combination_radio
, &data
->if_combination
,
5469 sizeof(data
->if_combination
));
5470 data
->if_combination
.num_different_channels
*= n_bands
;
5473 if (data
->use_chanctx
)
5474 data
->if_combination
.radar_detect_widths
= 0;
5476 /* By default all radios belong to the first group */
5478 mutex_init(&data
->mutex
);
5480 data
->netgroup
= hwsim_net_get_netgroup(net
);
5481 data
->wmediumd
= hwsim_net_get_wmediumd(net
);
5483 /* Enable frame retransmissions for lossy channels */
5485 hw
->max_rate_tries
= 11;
5487 hw
->wiphy
->vendor_commands
= mac80211_hwsim_vendor_commands
;
5488 hw
->wiphy
->n_vendor_commands
=
5489 ARRAY_SIZE(mac80211_hwsim_vendor_commands
);
5490 hw
->wiphy
->vendor_events
= mac80211_hwsim_vendor_events
;
5491 hw
->wiphy
->n_vendor_events
= ARRAY_SIZE(mac80211_hwsim_vendor_events
);
5493 if (param
->reg_strict
)
5494 hw
->wiphy
->regulatory_flags
|= REGULATORY_STRICT_REG
;
5496 data
->regd
= param
->regd
;
5497 hw
->wiphy
->regulatory_flags
|= REGULATORY_CUSTOM_REG
;
5498 wiphy_apply_custom_regulatory(hw
->wiphy
, param
->regd
);
5499 /* give the regulatory workqueue a chance to run */
5500 schedule_timeout_interruptible(1);
5503 wiphy_ext_feature_set(hw
->wiphy
,
5504 NL80211_EXT_FEATURE_DFS_CONCURRENT
);
5507 ieee80211_hw_set(hw
, NO_AUTO_VIF
);
5509 wiphy_ext_feature_set(hw
->wiphy
, NL80211_EXT_FEATURE_CQM_RSSI_LIST
);
5511 for (i
= 0; i
< ARRAY_SIZE(data
->link_data
); i
++) {
5512 hrtimer_init(&data
->link_data
[i
].beacon_timer
, CLOCK_MONOTONIC
,
5513 HRTIMER_MODE_ABS_SOFT
);
5514 data
->link_data
[i
].beacon_timer
.function
=
5515 mac80211_hwsim_beacon
;
5516 data
->link_data
[i
].link_id
= i
;
5519 err
= ieee80211_register_hw(hw
);
5521 pr_debug("mac80211_hwsim: ieee80211_register_hw failed (%d)\n",
5526 wiphy_dbg(hw
->wiphy
, "hwaddr %pM registered\n", hw
->wiphy
->perm_addr
);
5528 if (param
->reg_alpha2
) {
5529 data
->alpha2
[0] = param
->reg_alpha2
[0];
5530 data
->alpha2
[1] = param
->reg_alpha2
[1];
5531 regulatory_hint(hw
->wiphy
, param
->reg_alpha2
);
5534 data
->debugfs
= debugfs_create_dir("hwsim", hw
->wiphy
->debugfsdir
);
5535 debugfs_create_file("ps", 0666, data
->debugfs
, data
, &hwsim_fops_ps
);
5536 debugfs_create_file("group", 0666, data
->debugfs
, data
,
5538 debugfs_create_file("rx_rssi", 0666, data
->debugfs
, data
,
5539 &hwsim_fops_rx_rssi
);
5540 if (!data
->use_chanctx
)
5541 debugfs_create_file("dfs_simulate_radar", 0222,
5543 data
, &hwsim_simulate_radar
);
5545 if (param
->pmsr_capa
) {
5546 data
->pmsr_capa
= *param
->pmsr_capa
;
5547 hw
->wiphy
->pmsr_capa
= &data
->pmsr_capa
;
5550 spin_lock_bh(&hwsim_radio_lock
);
5551 err
= rhashtable_insert_fast(&hwsim_radios_rht
, &data
->rht
,
5555 GENL_SET_ERR_MSG(info
, "perm addr already present");
5556 NL_SET_BAD_ATTR(info
->extack
,
5557 info
->attrs
[HWSIM_ATTR_PERM_ADDR
]);
5559 spin_unlock_bh(&hwsim_radio_lock
);
5560 goto failed_final_insert
;
5563 list_add_tail(&data
->list
, &hwsim_radios
);
5564 hwsim_radios_generation
++;
5565 spin_unlock_bh(&hwsim_radio_lock
);
5567 hwsim_mcast_new_radio(idx
, info
, param
);
5571 failed_final_insert
:
5572 debugfs_remove_recursive(data
->debugfs
);
5573 ieee80211_unregister_hw(data
->hw
);
5575 device_release_driver(data
->dev
);
5577 device_unregister(data
->dev
);
5579 ieee80211_free_hw(hw
);
5584 static void hwsim_mcast_del_radio(int id
, const char *hwname
,
5585 struct genl_info
*info
)
5587 struct sk_buff
*skb
;
5591 skb
= genlmsg_new(GENLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
5595 data
= genlmsg_put(skb
, 0, 0, &hwsim_genl_family
, 0,
5596 HWSIM_CMD_DEL_RADIO
);
5600 ret
= nla_put_u32(skb
, HWSIM_ATTR_RADIO_ID
, id
);
5604 ret
= nla_put(skb
, HWSIM_ATTR_RADIO_NAME
, strlen(hwname
),
5609 genlmsg_end(skb
, data
);
5611 hwsim_mcast_config_msg(skb
, info
);
5619 static void mac80211_hwsim_del_radio(struct mac80211_hwsim_data
*data
,
5621 struct genl_info
*info
)
5623 hwsim_mcast_del_radio(data
->idx
, hwname
, info
);
5624 debugfs_remove_recursive(data
->debugfs
);
5625 ieee80211_unregister_hw(data
->hw
);
5626 device_release_driver(data
->dev
);
5627 device_unregister(data
->dev
);
5628 ieee80211_free_hw(data
->hw
);
5631 static int mac80211_hwsim_get_radio(struct sk_buff
*skb
,
5632 struct mac80211_hwsim_data
*data
,
5633 u32 portid
, u32 seq
,
5634 struct netlink_callback
*cb
, int flags
)
5637 struct hwsim_new_radio_params param
= { };
5638 int res
= -EMSGSIZE
;
5640 hdr
= genlmsg_put(skb
, portid
, seq
, &hwsim_genl_family
, flags
,
5641 HWSIM_CMD_GET_RADIO
);
5646 genl_dump_check_consistent(cb
, hdr
);
5648 if (data
->alpha2
[0] && data
->alpha2
[1])
5649 param
.reg_alpha2
= data
->alpha2
;
5651 param
.reg_strict
= !!(data
->hw
->wiphy
->regulatory_flags
&
5652 REGULATORY_STRICT_REG
);
5653 param
.p2p_device
= !!(data
->hw
->wiphy
->interface_modes
&
5654 BIT(NL80211_IFTYPE_P2P_DEVICE
));
5655 param
.use_chanctx
= data
->use_chanctx
;
5656 param
.regd
= data
->regd
;
5657 param
.channels
= data
->channels
;
5658 param
.hwname
= wiphy_name(data
->hw
->wiphy
);
5659 param
.pmsr_capa
= &data
->pmsr_capa
;
5661 res
= append_radio_msg(skb
, data
->idx
, ¶m
);
5665 genlmsg_end(skb
, hdr
);
5669 genlmsg_cancel(skb
, hdr
);
5673 static void mac80211_hwsim_free(void)
5675 struct mac80211_hwsim_data
*data
;
5677 spin_lock_bh(&hwsim_radio_lock
);
5678 while ((data
= list_first_entry_or_null(&hwsim_radios
,
5679 struct mac80211_hwsim_data
,
5681 list_del(&data
->list
);
5682 spin_unlock_bh(&hwsim_radio_lock
);
5683 mac80211_hwsim_del_radio(data
, wiphy_name(data
->hw
->wiphy
),
5685 spin_lock_bh(&hwsim_radio_lock
);
5687 spin_unlock_bh(&hwsim_radio_lock
);
5688 class_destroy(hwsim_class
);
5691 static const struct net_device_ops hwsim_netdev_ops
= {
5692 .ndo_start_xmit
= hwsim_mon_xmit
,
5693 .ndo_set_mac_address
= eth_mac_addr
,
5694 .ndo_validate_addr
= eth_validate_addr
,
5697 static void hwsim_mon_setup(struct net_device
*dev
)
5701 dev
->netdev_ops
= &hwsim_netdev_ops
;
5702 dev
->needs_free_netdev
= true;
5704 dev
->priv_flags
|= IFF_NO_QUEUE
;
5705 dev
->type
= ARPHRD_IEEE80211_RADIOTAP
;
5706 eth_zero_addr(addr
);
5708 eth_hw_addr_set(dev
, addr
);
5711 static void hwsim_register_wmediumd(struct net
*net
, u32 portid
)
5713 struct mac80211_hwsim_data
*data
;
5715 hwsim_net_set_wmediumd(net
, portid
);
5717 spin_lock_bh(&hwsim_radio_lock
);
5718 list_for_each_entry(data
, &hwsim_radios
, list
) {
5719 if (data
->netgroup
== hwsim_net_get_netgroup(net
))
5720 data
->wmediumd
= portid
;
5722 spin_unlock_bh(&hwsim_radio_lock
);
5725 static int hwsim_tx_info_frame_received_nl(struct sk_buff
*skb_2
,
5726 struct genl_info
*info
)
5729 struct ieee80211_hdr
*hdr
;
5730 struct mac80211_hwsim_data
*data2
;
5731 struct ieee80211_tx_info
*txi
;
5732 struct hwsim_tx_rate
*tx_attempts
;
5734 struct sk_buff
*skb
, *tmp
;
5736 unsigned int hwsim_flags
;
5738 unsigned long flags
;
5741 if (!info
->attrs
[HWSIM_ATTR_ADDR_TRANSMITTER
] ||
5742 !info
->attrs
[HWSIM_ATTR_FLAGS
] ||
5743 !info
->attrs
[HWSIM_ATTR_COOKIE
] ||
5744 !info
->attrs
[HWSIM_ATTR_SIGNAL
] ||
5745 !info
->attrs
[HWSIM_ATTR_TX_INFO
])
5748 src
= (void *)nla_data(info
->attrs
[HWSIM_ATTR_ADDR_TRANSMITTER
]);
5749 hwsim_flags
= nla_get_u32(info
->attrs
[HWSIM_ATTR_FLAGS
]);
5750 ret_skb_cookie
= nla_get_u64(info
->attrs
[HWSIM_ATTR_COOKIE
]);
5752 data2
= get_hwsim_data_ref_from_addr(src
);
5756 if (!hwsim_virtio_enabled
) {
5757 if (hwsim_net_get_netgroup(genl_info_net(info
)) !=
5761 if (info
->snd_portid
!= data2
->wmediumd
)
5765 /* look for the skb matching the cookie passed back from user */
5766 spin_lock_irqsave(&data2
->pending
.lock
, flags
);
5767 skb_queue_walk_safe(&data2
->pending
, skb
, tmp
) {
5768 uintptr_t skb_cookie
;
5770 txi
= IEEE80211_SKB_CB(skb
);
5771 skb_cookie
= (uintptr_t)txi
->rate_driver_data
[0];
5773 if (skb_cookie
== ret_skb_cookie
) {
5774 __skb_unlink(skb
, &data2
->pending
);
5779 spin_unlock_irqrestore(&data2
->pending
.lock
, flags
);
5785 /* Tx info received because the frame was broadcasted on user space,
5786 so we get all the necessary info: tx attempts and skb control buff */
5788 tx_attempts
= (struct hwsim_tx_rate
*)nla_data(
5789 info
->attrs
[HWSIM_ATTR_TX_INFO
]);
5791 /* now send back TX status */
5792 txi
= IEEE80211_SKB_CB(skb
);
5794 ieee80211_tx_info_clear_status(txi
);
5796 for (i
= 0; i
< IEEE80211_TX_MAX_RATES
; i
++) {
5797 txi
->status
.rates
[i
].idx
= tx_attempts
[i
].idx
;
5798 txi
->status
.rates
[i
].count
= tx_attempts
[i
].count
;
5801 txi
->status
.ack_signal
= nla_get_u32(info
->attrs
[HWSIM_ATTR_SIGNAL
]);
5803 if (!(hwsim_flags
& HWSIM_TX_CTL_NO_ACK
) &&
5804 (hwsim_flags
& HWSIM_TX_STAT_ACK
)) {
5805 if (skb
->len
>= 16) {
5806 hdr
= (struct ieee80211_hdr
*) skb
->data
;
5807 mac80211_hwsim_monitor_ack(data2
->channel
,
5810 txi
->flags
|= IEEE80211_TX_STAT_ACK
;
5813 if (hwsim_flags
& HWSIM_TX_CTL_NO_ACK
)
5814 txi
->flags
|= IEEE80211_TX_STAT_NOACK_TRANSMITTED
;
5816 ieee80211_tx_status_irqsafe(data2
->hw
, skb
);
5823 static int hwsim_cloned_frame_received_nl(struct sk_buff
*skb_2
,
5824 struct genl_info
*info
)
5826 struct mac80211_hwsim_data
*data2
;
5827 struct ieee80211_rx_status rx_status
;
5828 struct ieee80211_hdr
*hdr
;
5832 struct sk_buff
*skb
= NULL
;
5833 struct ieee80211_channel
*channel
= NULL
;
5835 if (!info
->attrs
[HWSIM_ATTR_ADDR_RECEIVER
] ||
5836 !info
->attrs
[HWSIM_ATTR_FRAME
] ||
5837 !info
->attrs
[HWSIM_ATTR_RX_RATE
] ||
5838 !info
->attrs
[HWSIM_ATTR_SIGNAL
])
5841 dst
= (void *)nla_data(info
->attrs
[HWSIM_ATTR_ADDR_RECEIVER
]);
5842 frame_data_len
= nla_len(info
->attrs
[HWSIM_ATTR_FRAME
]);
5843 frame_data
= (void *)nla_data(info
->attrs
[HWSIM_ATTR_FRAME
]);
5845 if (frame_data_len
< sizeof(struct ieee80211_hdr_3addr
) ||
5846 frame_data_len
> IEEE80211_MAX_DATA_LEN
)
5849 /* Allocate new skb here */
5850 skb
= alloc_skb(frame_data_len
, GFP_KERNEL
);
5855 skb_put_data(skb
, frame_data
, frame_data_len
);
5857 data2
= get_hwsim_data_ref_from_addr(dst
);
5861 if (data2
->use_chanctx
) {
5862 if (data2
->tmp_chan
)
5863 channel
= data2
->tmp_chan
;
5865 channel
= data2
->channel
;
5868 if (!hwsim_virtio_enabled
) {
5869 if (hwsim_net_get_netgroup(genl_info_net(info
)) !=
5873 if (info
->snd_portid
!= data2
->wmediumd
)
5877 /* check if radio is configured properly */
5879 if ((data2
->idle
&& !data2
->tmp_chan
) || !data2
->started
)
5882 /* A frame is received from user space */
5883 memset(&rx_status
, 0, sizeof(rx_status
));
5884 if (info
->attrs
[HWSIM_ATTR_FREQ
]) {
5885 struct tx_iter_data iter_data
= {};
5887 /* throw away off-channel packets, but allow both the temporary
5888 * ("hw" scan/remain-on-channel), regular channels and links,
5889 * since the internal datapath also allows this
5891 rx_status
.freq
= nla_get_u32(info
->attrs
[HWSIM_ATTR_FREQ
]);
5893 iter_data
.channel
= ieee80211_get_channel(data2
->hw
->wiphy
,
5895 if (!iter_data
.channel
)
5897 rx_status
.band
= iter_data
.channel
->band
;
5899 mutex_lock(&data2
->mutex
);
5900 if (!hwsim_chans_compat(iter_data
.channel
, channel
)) {
5901 ieee80211_iterate_active_interfaces_atomic(
5902 data2
->hw
, IEEE80211_IFACE_ITER_NORMAL
,
5903 mac80211_hwsim_tx_iter
, &iter_data
);
5904 if (!iter_data
.receive
) {
5905 mutex_unlock(&data2
->mutex
);
5909 mutex_unlock(&data2
->mutex
);
5910 } else if (!channel
) {
5913 rx_status
.freq
= channel
->center_freq
;
5914 rx_status
.band
= channel
->band
;
5917 rx_status
.rate_idx
= nla_get_u32(info
->attrs
[HWSIM_ATTR_RX_RATE
]);
5918 if (rx_status
.rate_idx
>= data2
->hw
->wiphy
->bands
[rx_status
.band
]->n_bitrates
)
5920 rx_status
.signal
= nla_get_u32(info
->attrs
[HWSIM_ATTR_SIGNAL
]);
5922 hdr
= (void *)skb
->data
;
5924 if (ieee80211_is_beacon(hdr
->frame_control
) ||
5925 ieee80211_is_probe_resp(hdr
->frame_control
))
5926 rx_status
.boottime_ns
= ktime_get_boottime_ns();
5928 mac80211_hwsim_rx(data2
, &rx_status
, skb
);
5932 pr_debug("mac80211_hwsim: error occurred in %s\n", __func__
);
5938 static int hwsim_register_received_nl(struct sk_buff
*skb_2
,
5939 struct genl_info
*info
)
5941 struct net
*net
= genl_info_net(info
);
5942 struct mac80211_hwsim_data
*data
;
5945 spin_lock_bh(&hwsim_radio_lock
);
5946 list_for_each_entry(data
, &hwsim_radios
, list
)
5947 chans
= max(chans
, data
->channels
);
5948 spin_unlock_bh(&hwsim_radio_lock
);
5950 /* In the future we should revise the userspace API and allow it
5951 * to set a flag that it does support multi-channel, then we can
5952 * let this pass conditionally on the flag.
5953 * For current userspace, prohibit it since it won't work right.
5958 if (hwsim_net_get_wmediumd(net
))
5961 hwsim_register_wmediumd(net
, info
->snd_portid
);
5963 pr_debug("mac80211_hwsim: received a REGISTER, "
5964 "switching to wmediumd mode with pid %d\n", info
->snd_portid
);
5969 /* ensures ciphers only include ciphers listed in 'hwsim_ciphers' array */
5970 static bool hwsim_known_ciphers(const u32
*ciphers
, int n_ciphers
)
5974 for (i
= 0; i
< n_ciphers
; i
++) {
5978 for (j
= 0; j
< ARRAY_SIZE(hwsim_ciphers
); j
++) {
5979 if (ciphers
[i
] == hwsim_ciphers
[j
]) {
5992 static int parse_ftm_capa(const struct nlattr
*ftm_capa
, struct cfg80211_pmsr_capabilities
*out
,
5993 struct genl_info
*info
)
5995 struct nlattr
*tb
[NL80211_PMSR_FTM_CAPA_ATTR_MAX
+ 1];
5998 ret
= nla_parse_nested(tb
, NL80211_PMSR_FTM_CAPA_ATTR_MAX
, ftm_capa
, hwsim_ftm_capa_policy
,
6001 NL_SET_ERR_MSG_ATTR(info
->extack
, ftm_capa
, "malformed FTM capability");
6005 out
->ftm
.supported
= 1;
6006 if (tb
[NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES
])
6007 out
->ftm
.preambles
= nla_get_u32(tb
[NL80211_PMSR_FTM_CAPA_ATTR_PREAMBLES
]);
6008 if (tb
[NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS
])
6009 out
->ftm
.bandwidths
= nla_get_u32(tb
[NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS
]);
6010 if (tb
[NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT
])
6011 out
->ftm
.max_bursts_exponent
=
6012 nla_get_u8(tb
[NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT
]);
6013 if (tb
[NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST
])
6014 out
->ftm
.max_ftms_per_burst
=
6015 nla_get_u8(tb
[NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST
]);
6016 out
->ftm
.asap
= !!tb
[NL80211_PMSR_FTM_CAPA_ATTR_ASAP
];
6017 out
->ftm
.non_asap
= !!tb
[NL80211_PMSR_FTM_CAPA_ATTR_NON_ASAP
];
6018 out
->ftm
.request_lci
= !!tb
[NL80211_PMSR_FTM_CAPA_ATTR_REQ_LCI
];
6019 out
->ftm
.request_civicloc
= !!tb
[NL80211_PMSR_FTM_CAPA_ATTR_REQ_CIVICLOC
];
6020 out
->ftm
.trigger_based
= !!tb
[NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED
];
6021 out
->ftm
.non_trigger_based
= !!tb
[NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED
];
6026 static int parse_pmsr_capa(const struct nlattr
*pmsr_capa
, struct cfg80211_pmsr_capabilities
*out
,
6027 struct genl_info
*info
)
6029 struct nlattr
*tb
[NL80211_PMSR_ATTR_MAX
+ 1];
6034 ret
= nla_parse_nested(tb
, NL80211_PMSR_ATTR_MAX
, pmsr_capa
, hwsim_pmsr_capa_policy
, NULL
);
6036 NL_SET_ERR_MSG_ATTR(info
->extack
, pmsr_capa
, "malformed PMSR capability");
6040 if (tb
[NL80211_PMSR_ATTR_MAX_PEERS
])
6041 out
->max_peers
= nla_get_u32(tb
[NL80211_PMSR_ATTR_MAX_PEERS
]);
6042 out
->report_ap_tsf
= !!tb
[NL80211_PMSR_ATTR_REPORT_AP_TSF
];
6043 out
->randomize_mac_addr
= !!tb
[NL80211_PMSR_ATTR_RANDOMIZE_MAC_ADDR
];
6045 if (!tb
[NL80211_PMSR_ATTR_TYPE_CAPA
]) {
6046 NL_SET_ERR_MSG_ATTR(info
->extack
, tb
[NL80211_PMSR_ATTR_TYPE_CAPA
],
6047 "malformed PMSR type");
6051 nla_for_each_nested(nla
, tb
[NL80211_PMSR_ATTR_TYPE_CAPA
], size
) {
6052 switch (nla_type(nla
)) {
6053 case NL80211_PMSR_TYPE_FTM
:
6054 parse_ftm_capa(nla
, out
, info
);
6057 NL_SET_ERR_MSG_ATTR(info
->extack
, nla
, "unsupported measurement type");
6065 static int hwsim_new_radio_nl(struct sk_buff
*msg
, struct genl_info
*info
)
6067 struct hwsim_new_radio_params param
= { 0 };
6068 const char *hwname
= NULL
;
6071 param
.reg_strict
= info
->attrs
[HWSIM_ATTR_REG_STRICT_REG
];
6072 param
.p2p_device
= info
->attrs
[HWSIM_ATTR_SUPPORT_P2P_DEVICE
];
6073 param
.channels
= channels
;
6074 param
.destroy_on_close
=
6075 info
->attrs
[HWSIM_ATTR_DESTROY_RADIO_ON_CLOSE
];
6077 if (info
->attrs
[HWSIM_ATTR_CHANNELS
])
6078 param
.channels
= nla_get_u32(info
->attrs
[HWSIM_ATTR_CHANNELS
]);
6080 if (param
.channels
< 1) {
6081 GENL_SET_ERR_MSG(info
, "must have at least one channel");
6085 if (info
->attrs
[HWSIM_ATTR_NO_VIF
])
6086 param
.no_vif
= true;
6088 if (info
->attrs
[HWSIM_ATTR_USE_CHANCTX
])
6089 param
.use_chanctx
= true;
6091 param
.use_chanctx
= (param
.channels
> 1);
6093 if (info
->attrs
[HWSIM_ATTR_MULTI_RADIO
])
6094 param
.multi_radio
= true;
6096 if (info
->attrs
[HWSIM_ATTR_REG_HINT_ALPHA2
])
6098 nla_data(info
->attrs
[HWSIM_ATTR_REG_HINT_ALPHA2
]);
6100 if (info
->attrs
[HWSIM_ATTR_REG_CUSTOM_REG
]) {
6101 u32 idx
= nla_get_u32(info
->attrs
[HWSIM_ATTR_REG_CUSTOM_REG
]);
6103 if (idx
>= ARRAY_SIZE(hwsim_world_regdom_custom
))
6106 idx
= array_index_nospec(idx
,
6107 ARRAY_SIZE(hwsim_world_regdom_custom
));
6108 param
.regd
= hwsim_world_regdom_custom
[idx
];
6111 if (info
->attrs
[HWSIM_ATTR_PERM_ADDR
]) {
6112 if (!is_valid_ether_addr(
6113 nla_data(info
->attrs
[HWSIM_ATTR_PERM_ADDR
]))) {
6114 GENL_SET_ERR_MSG(info
,"MAC is no valid source addr");
6115 NL_SET_BAD_ATTR(info
->extack
,
6116 info
->attrs
[HWSIM_ATTR_PERM_ADDR
]);
6120 param
.perm_addr
= nla_data(info
->attrs
[HWSIM_ATTR_PERM_ADDR
]);
6123 if (info
->attrs
[HWSIM_ATTR_IFTYPE_SUPPORT
]) {
6125 nla_get_u32(info
->attrs
[HWSIM_ATTR_IFTYPE_SUPPORT
]);
6127 if (param
.iftypes
& ~HWSIM_IFTYPE_SUPPORT_MASK
) {
6128 NL_SET_ERR_MSG_ATTR(info
->extack
,
6129 info
->attrs
[HWSIM_ATTR_IFTYPE_SUPPORT
],
6130 "cannot support more iftypes than kernel");
6134 param
.iftypes
= HWSIM_IFTYPE_SUPPORT_MASK
;
6137 /* ensure both flag and iftype support is honored */
6138 if (param
.p2p_device
||
6139 param
.iftypes
& BIT(NL80211_IFTYPE_P2P_DEVICE
)) {
6140 param
.iftypes
|= BIT(NL80211_IFTYPE_P2P_DEVICE
);
6141 param
.p2p_device
= true;
6144 if (info
->attrs
[HWSIM_ATTR_CIPHER_SUPPORT
]) {
6145 u32 len
= nla_len(info
->attrs
[HWSIM_ATTR_CIPHER_SUPPORT
]);
6148 nla_data(info
->attrs
[HWSIM_ATTR_CIPHER_SUPPORT
]);
6150 if (len
% sizeof(u32
)) {
6151 NL_SET_ERR_MSG_ATTR(info
->extack
,
6152 info
->attrs
[HWSIM_ATTR_CIPHER_SUPPORT
],
6153 "bad cipher list length");
6157 param
.n_ciphers
= len
/ sizeof(u32
);
6159 if (param
.n_ciphers
> ARRAY_SIZE(hwsim_ciphers
)) {
6160 NL_SET_ERR_MSG_ATTR(info
->extack
,
6161 info
->attrs
[HWSIM_ATTR_CIPHER_SUPPORT
],
6162 "too many ciphers specified");
6166 if (!hwsim_known_ciphers(param
.ciphers
, param
.n_ciphers
)) {
6167 NL_SET_ERR_MSG_ATTR(info
->extack
,
6168 info
->attrs
[HWSIM_ATTR_CIPHER_SUPPORT
],
6169 "unsupported ciphers specified");
6174 param
.mlo
= info
->attrs
[HWSIM_ATTR_MLO_SUPPORT
];
6176 if (param
.mlo
|| param
.multi_radio
)
6177 param
.use_chanctx
= true;
6179 if (info
->attrs
[HWSIM_ATTR_RADIO_NAME
]) {
6180 hwname
= kstrndup((char *)nla_data(info
->attrs
[HWSIM_ATTR_RADIO_NAME
]),
6181 nla_len(info
->attrs
[HWSIM_ATTR_RADIO_NAME
]),
6185 param
.hwname
= hwname
;
6188 if (info
->attrs
[HWSIM_ATTR_PMSR_SUPPORT
]) {
6189 struct cfg80211_pmsr_capabilities
*pmsr_capa
;
6191 pmsr_capa
= kmalloc(sizeof(*pmsr_capa
), GFP_KERNEL
);
6196 param
.pmsr_capa
= pmsr_capa
;
6198 ret
= parse_pmsr_capa(info
->attrs
[HWSIM_ATTR_PMSR_SUPPORT
], pmsr_capa
, info
);
6203 ret
= mac80211_hwsim_new_radio(info
, ¶m
);
6207 kfree(param
.pmsr_capa
);
6211 static int hwsim_del_radio_nl(struct sk_buff
*msg
, struct genl_info
*info
)
6213 struct mac80211_hwsim_data
*data
;
6215 const char *hwname
= NULL
;
6217 if (info
->attrs
[HWSIM_ATTR_RADIO_ID
]) {
6218 idx
= nla_get_u32(info
->attrs
[HWSIM_ATTR_RADIO_ID
]);
6219 } else if (info
->attrs
[HWSIM_ATTR_RADIO_NAME
]) {
6220 hwname
= kstrndup((char *)nla_data(info
->attrs
[HWSIM_ATTR_RADIO_NAME
]),
6221 nla_len(info
->attrs
[HWSIM_ATTR_RADIO_NAME
]),
6228 spin_lock_bh(&hwsim_radio_lock
);
6229 list_for_each_entry(data
, &hwsim_radios
, list
) {
6231 if (data
->idx
!= idx
)
6235 strcmp(hwname
, wiphy_name(data
->hw
->wiphy
)))
6239 if (!net_eq(wiphy_net(data
->hw
->wiphy
), genl_info_net(info
)))
6242 list_del(&data
->list
);
6243 rhashtable_remove_fast(&hwsim_radios_rht
, &data
->rht
,
6245 hwsim_radios_generation
++;
6246 spin_unlock_bh(&hwsim_radio_lock
);
6247 mac80211_hwsim_del_radio(data
, wiphy_name(data
->hw
->wiphy
),
6252 spin_unlock_bh(&hwsim_radio_lock
);
6258 static int hwsim_get_radio_nl(struct sk_buff
*msg
, struct genl_info
*info
)
6260 struct mac80211_hwsim_data
*data
;
6261 struct sk_buff
*skb
;
6262 int idx
, res
= -ENODEV
;
6264 if (!info
->attrs
[HWSIM_ATTR_RADIO_ID
])
6266 idx
= nla_get_u32(info
->attrs
[HWSIM_ATTR_RADIO_ID
]);
6268 spin_lock_bh(&hwsim_radio_lock
);
6269 list_for_each_entry(data
, &hwsim_radios
, list
) {
6270 if (data
->idx
!= idx
)
6273 if (!net_eq(wiphy_net(data
->hw
->wiphy
), genl_info_net(info
)))
6276 skb
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_ATOMIC
);
6282 res
= mac80211_hwsim_get_radio(skb
, data
, info
->snd_portid
,
6283 info
->snd_seq
, NULL
, 0);
6289 res
= genlmsg_reply(skb
, info
);
6294 spin_unlock_bh(&hwsim_radio_lock
);
6299 static int hwsim_dump_radio_nl(struct sk_buff
*skb
,
6300 struct netlink_callback
*cb
)
6302 int last_idx
= cb
->args
[0] - 1;
6303 struct mac80211_hwsim_data
*data
= NULL
;
6307 spin_lock_bh(&hwsim_radio_lock
);
6308 cb
->seq
= hwsim_radios_generation
;
6310 if (last_idx
>= hwsim_radio_idx
-1)
6313 list_for_each_entry(data
, &hwsim_radios
, list
) {
6314 if (data
->idx
<= last_idx
)
6317 if (!net_eq(wiphy_net(data
->hw
->wiphy
), sock_net(skb
->sk
)))
6320 res
= mac80211_hwsim_get_radio(skb
, data
,
6321 NETLINK_CB(cb
->skb
).portid
,
6322 cb
->nlh
->nlmsg_seq
, cb
,
6327 last_idx
= data
->idx
;
6330 cb
->args
[0] = last_idx
+ 1;
6332 /* list changed, but no new element sent, set interrupted flag */
6333 if (skb
->len
== 0 && cb
->prev_seq
&& cb
->seq
!= cb
->prev_seq
) {
6334 hdr
= genlmsg_put(skb
, NETLINK_CB(cb
->skb
).portid
,
6335 cb
->nlh
->nlmsg_seq
, &hwsim_genl_family
,
6336 NLM_F_MULTI
, HWSIM_CMD_GET_RADIO
);
6338 genl_dump_check_consistent(cb
, hdr
);
6339 genlmsg_end(skb
, hdr
);
6346 spin_unlock_bh(&hwsim_radio_lock
);
6347 return res
?: skb
->len
;
6350 /* Generic Netlink operations array */
6351 static const struct genl_small_ops hwsim_ops
[] = {
6353 .cmd
= HWSIM_CMD_REGISTER
,
6354 .validate
= GENL_DONT_VALIDATE_STRICT
| GENL_DONT_VALIDATE_DUMP
,
6355 .doit
= hwsim_register_received_nl
,
6356 .flags
= GENL_UNS_ADMIN_PERM
,
6359 .cmd
= HWSIM_CMD_FRAME
,
6360 .validate
= GENL_DONT_VALIDATE_STRICT
| GENL_DONT_VALIDATE_DUMP
,
6361 .doit
= hwsim_cloned_frame_received_nl
,
6364 .cmd
= HWSIM_CMD_TX_INFO_FRAME
,
6365 .validate
= GENL_DONT_VALIDATE_STRICT
| GENL_DONT_VALIDATE_DUMP
,
6366 .doit
= hwsim_tx_info_frame_received_nl
,
6369 .cmd
= HWSIM_CMD_NEW_RADIO
,
6370 .validate
= GENL_DONT_VALIDATE_STRICT
| GENL_DONT_VALIDATE_DUMP
,
6371 .doit
= hwsim_new_radio_nl
,
6372 .flags
= GENL_UNS_ADMIN_PERM
,
6375 .cmd
= HWSIM_CMD_DEL_RADIO
,
6376 .validate
= GENL_DONT_VALIDATE_STRICT
| GENL_DONT_VALIDATE_DUMP
,
6377 .doit
= hwsim_del_radio_nl
,
6378 .flags
= GENL_UNS_ADMIN_PERM
,
6381 .cmd
= HWSIM_CMD_GET_RADIO
,
6382 .validate
= GENL_DONT_VALIDATE_STRICT
| GENL_DONT_VALIDATE_DUMP
,
6383 .doit
= hwsim_get_radio_nl
,
6384 .dumpit
= hwsim_dump_radio_nl
,
6387 .cmd
= HWSIM_CMD_REPORT_PMSR
,
6388 .validate
= GENL_DONT_VALIDATE_STRICT
| GENL_DONT_VALIDATE_DUMP
,
6389 .doit
= hwsim_pmsr_report_nl
,
6393 static struct genl_family hwsim_genl_family __ro_after_init
= {
6394 .name
= "MAC80211_HWSIM",
6396 .maxattr
= HWSIM_ATTR_MAX
,
6397 .policy
= hwsim_genl_policy
,
6399 .module
= THIS_MODULE
,
6400 .small_ops
= hwsim_ops
,
6401 .n_small_ops
= ARRAY_SIZE(hwsim_ops
),
6402 .resv_start_op
= HWSIM_CMD_REPORT_PMSR
+ 1, // match with __HWSIM_CMD_MAX
6403 .mcgrps
= hwsim_mcgrps
,
6404 .n_mcgrps
= ARRAY_SIZE(hwsim_mcgrps
),
6407 static void remove_user_radios(u32 portid
)
6409 struct mac80211_hwsim_data
*entry
, *tmp
;
6412 spin_lock_bh(&hwsim_radio_lock
);
6413 list_for_each_entry_safe(entry
, tmp
, &hwsim_radios
, list
) {
6414 if (entry
->destroy_on_close
&& entry
->portid
== portid
) {
6415 list_move(&entry
->list
, &list
);
6416 rhashtable_remove_fast(&hwsim_radios_rht
, &entry
->rht
,
6418 hwsim_radios_generation
++;
6421 spin_unlock_bh(&hwsim_radio_lock
);
6423 list_for_each_entry_safe(entry
, tmp
, &list
, list
) {
6424 list_del(&entry
->list
);
6425 mac80211_hwsim_del_radio(entry
, wiphy_name(entry
->hw
->wiphy
),
6430 static int mac80211_hwsim_netlink_notify(struct notifier_block
*nb
,
6431 unsigned long state
,
6434 struct netlink_notify
*notify
= _notify
;
6436 if (state
!= NETLINK_URELEASE
)
6439 remove_user_radios(notify
->portid
);
6441 if (notify
->portid
== hwsim_net_get_wmediumd(notify
->net
)) {
6442 printk(KERN_INFO
"mac80211_hwsim: wmediumd released netlink"
6443 " socket, switching to perfect channel medium\n");
6444 hwsim_register_wmediumd(notify
->net
, 0);
6450 static struct notifier_block hwsim_netlink_notifier
= {
6451 .notifier_call
= mac80211_hwsim_netlink_notify
,
6454 static int __init
hwsim_init_netlink(void)
6458 printk(KERN_INFO
"mac80211_hwsim: initializing netlink\n");
6460 rc
= genl_register_family(&hwsim_genl_family
);
6464 rc
= netlink_register_notifier(&hwsim_netlink_notifier
);
6466 genl_unregister_family(&hwsim_genl_family
);
6473 pr_debug("mac80211_hwsim: error occurred in %s\n", __func__
);
6477 static __net_init
int hwsim_init_net(struct net
*net
)
6479 return hwsim_net_set_netgroup(net
);
6482 static void __net_exit
hwsim_exit_net(struct net
*net
)
6484 struct mac80211_hwsim_data
*data
, *tmp
;
6487 spin_lock_bh(&hwsim_radio_lock
);
6488 list_for_each_entry_safe(data
, tmp
, &hwsim_radios
, list
) {
6489 if (!net_eq(wiphy_net(data
->hw
->wiphy
), net
))
6492 /* Radios created in init_net are returned to init_net. */
6493 if (data
->netgroup
== hwsim_net_get_netgroup(&init_net
))
6496 list_move(&data
->list
, &list
);
6497 rhashtable_remove_fast(&hwsim_radios_rht
, &data
->rht
,
6499 hwsim_radios_generation
++;
6501 spin_unlock_bh(&hwsim_radio_lock
);
6503 list_for_each_entry_safe(data
, tmp
, &list
, list
) {
6504 list_del(&data
->list
);
6505 mac80211_hwsim_del_radio(data
,
6506 wiphy_name(data
->hw
->wiphy
),
6510 ida_free(&hwsim_netgroup_ida
, hwsim_net_get_netgroup(net
));
6513 static struct pernet_operations hwsim_net_ops
= {
6514 .init
= hwsim_init_net
,
6515 .exit
= hwsim_exit_net
,
6516 .id
= &hwsim_net_id
,
6517 .size
= sizeof(struct hwsim_net
),
6520 static void hwsim_exit_netlink(void)
6522 /* unregister the notifier */
6523 netlink_unregister_notifier(&hwsim_netlink_notifier
);
6524 /* unregister the family */
6525 genl_unregister_family(&hwsim_genl_family
);
6528 #if IS_REACHABLE(CONFIG_VIRTIO)
6529 static void hwsim_virtio_tx_done(struct virtqueue
*vq
)
6532 struct sk_buff
*skb
;
6533 unsigned long flags
;
6535 spin_lock_irqsave(&hwsim_virtio_lock
, flags
);
6536 while ((skb
= virtqueue_get_buf(vq
, &len
)))
6537 dev_kfree_skb_irq(skb
);
6538 spin_unlock_irqrestore(&hwsim_virtio_lock
, flags
);
6541 static int hwsim_virtio_handle_cmd(struct sk_buff
*skb
)
6543 struct nlmsghdr
*nlh
;
6544 struct genlmsghdr
*gnlh
;
6545 struct nlattr
*tb
[HWSIM_ATTR_MAX
+ 1];
6546 struct genl_info info
= {};
6549 nlh
= nlmsg_hdr(skb
);
6550 gnlh
= nlmsg_data(nlh
);
6552 if (skb
->len
< nlh
->nlmsg_len
)
6555 err
= genlmsg_parse(nlh
, &hwsim_genl_family
, tb
, HWSIM_ATTR_MAX
,
6556 hwsim_genl_policy
, NULL
);
6558 pr_err_ratelimited("hwsim: genlmsg_parse returned %d\n", err
);
6564 switch (gnlh
->cmd
) {
6565 case HWSIM_CMD_FRAME
:
6566 hwsim_cloned_frame_received_nl(skb
, &info
);
6568 case HWSIM_CMD_TX_INFO_FRAME
:
6569 hwsim_tx_info_frame_received_nl(skb
, &info
);
6571 case HWSIM_CMD_REPORT_PMSR
:
6572 hwsim_pmsr_report_nl(skb
, &info
);
6575 pr_err_ratelimited("hwsim: invalid cmd: %d\n", gnlh
->cmd
);
6581 static void hwsim_virtio_rx_work(struct work_struct
*work
)
6583 struct virtqueue
*vq
;
6585 struct sk_buff
*skb
;
6586 struct scatterlist sg
[1];
6588 unsigned long flags
;
6590 spin_lock_irqsave(&hwsim_virtio_lock
, flags
);
6591 if (!hwsim_virtio_enabled
)
6594 skb
= virtqueue_get_buf(hwsim_vqs
[HWSIM_VQ_RX
], &len
);
6597 spin_unlock_irqrestore(&hwsim_virtio_lock
, flags
);
6599 skb
->data
= skb
->head
;
6600 skb_reset_tail_pointer(skb
);
6602 hwsim_virtio_handle_cmd(skb
);
6604 spin_lock_irqsave(&hwsim_virtio_lock
, flags
);
6605 if (!hwsim_virtio_enabled
) {
6606 dev_kfree_skb_irq(skb
);
6609 vq
= hwsim_vqs
[HWSIM_VQ_RX
];
6610 sg_init_one(sg
, skb
->head
, skb_end_offset(skb
));
6611 err
= virtqueue_add_inbuf(vq
, sg
, 1, skb
, GFP_ATOMIC
);
6612 if (WARN(err
, "virtqueue_add_inbuf returned %d\n", err
))
6613 dev_kfree_skb_irq(skb
);
6616 schedule_work(&hwsim_virtio_rx
);
6619 spin_unlock_irqrestore(&hwsim_virtio_lock
, flags
);
6622 static void hwsim_virtio_rx_done(struct virtqueue
*vq
)
6624 schedule_work(&hwsim_virtio_rx
);
6627 static int init_vqs(struct virtio_device
*vdev
)
6629 struct virtqueue_info vqs_info
[HWSIM_NUM_VQS
] = {
6630 [HWSIM_VQ_TX
] = { "tx", hwsim_virtio_tx_done
},
6631 [HWSIM_VQ_RX
] = { "rx", hwsim_virtio_rx_done
},
6634 return virtio_find_vqs(vdev
, HWSIM_NUM_VQS
,
6635 hwsim_vqs
, vqs_info
, NULL
);
6638 static int fill_vq(struct virtqueue
*vq
)
6641 struct sk_buff
*skb
;
6642 struct scatterlist sg
[1];
6644 for (i
= 0; i
< virtqueue_get_vring_size(vq
); i
++) {
6645 skb
= genlmsg_new(GENLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
6649 sg_init_one(sg
, skb
->head
, skb_end_offset(skb
));
6650 err
= virtqueue_add_inbuf(vq
, sg
, 1, skb
, GFP_KERNEL
);
6660 static void remove_vqs(struct virtio_device
*vdev
)
6664 virtio_reset_device(vdev
);
6666 for (i
= 0; i
< ARRAY_SIZE(hwsim_vqs
); i
++) {
6667 struct virtqueue
*vq
= hwsim_vqs
[i
];
6668 struct sk_buff
*skb
;
6670 while ((skb
= virtqueue_detach_unused_buf(vq
)))
6674 vdev
->config
->del_vqs(vdev
);
6677 static int hwsim_virtio_probe(struct virtio_device
*vdev
)
6680 unsigned long flags
;
6682 spin_lock_irqsave(&hwsim_virtio_lock
, flags
);
6683 if (hwsim_virtio_enabled
) {
6684 spin_unlock_irqrestore(&hwsim_virtio_lock
, flags
);
6687 spin_unlock_irqrestore(&hwsim_virtio_lock
, flags
);
6689 err
= init_vqs(vdev
);
6693 virtio_device_ready(vdev
);
6695 err
= fill_vq(hwsim_vqs
[HWSIM_VQ_RX
]);
6699 spin_lock_irqsave(&hwsim_virtio_lock
, flags
);
6700 hwsim_virtio_enabled
= true;
6701 spin_unlock_irqrestore(&hwsim_virtio_lock
, flags
);
6703 schedule_work(&hwsim_virtio_rx
);
6711 static void hwsim_virtio_remove(struct virtio_device
*vdev
)
6713 hwsim_virtio_enabled
= false;
6715 cancel_work_sync(&hwsim_virtio_rx
);
6720 /* MAC80211_HWSIM virtio device id table */
6721 static const struct virtio_device_id id_table
[] = {
6722 { VIRTIO_ID_MAC80211_HWSIM
, VIRTIO_DEV_ANY_ID
},
6725 MODULE_DEVICE_TABLE(virtio
, id_table
);
6727 static struct virtio_driver virtio_hwsim
= {
6728 .driver
.name
= KBUILD_MODNAME
,
6729 .id_table
= id_table
,
6730 .probe
= hwsim_virtio_probe
,
6731 .remove
= hwsim_virtio_remove
,
6734 static int hwsim_register_virtio_driver(void)
6736 return register_virtio_driver(&virtio_hwsim
);
6739 static void hwsim_unregister_virtio_driver(void)
6741 unregister_virtio_driver(&virtio_hwsim
);
6744 static inline int hwsim_register_virtio_driver(void)
6749 static inline void hwsim_unregister_virtio_driver(void)
6754 static int __init
init_mac80211_hwsim(void)
6758 if (radios
< 0 || radios
> 100)
6764 err
= rhashtable_init(&hwsim_radios_rht
, &hwsim_rht_params
);
6768 err
= register_pernet_device(&hwsim_net_ops
);
6772 err
= platform_driver_register(&mac80211_hwsim_driver
);
6774 goto out_unregister_pernet
;
6776 err
= hwsim_init_netlink();
6778 goto out_unregister_driver
;
6780 err
= hwsim_register_virtio_driver();
6782 goto out_exit_netlink
;
6784 hwsim_class
= class_create("mac80211_hwsim");
6785 if (IS_ERR(hwsim_class
)) {
6786 err
= PTR_ERR(hwsim_class
);
6787 goto out_exit_virtio
;
6790 hwsim_init_s1g_channels(hwsim_channels_s1g
);
6792 for (i
= 0; i
< radios
; i
++) {
6793 struct hwsim_new_radio_params param
= { 0 };
6795 param
.channels
= channels
;
6798 case HWSIM_REGTEST_DIFF_COUNTRY
:
6799 if (i
< ARRAY_SIZE(hwsim_alpha2s
))
6800 param
.reg_alpha2
= hwsim_alpha2s
[i
];
6802 case HWSIM_REGTEST_DRIVER_REG_FOLLOW
:
6804 param
.reg_alpha2
= hwsim_alpha2s
[0];
6806 case HWSIM_REGTEST_STRICT_ALL
:
6807 param
.reg_strict
= true;
6809 case HWSIM_REGTEST_DRIVER_REG_ALL
:
6810 param
.reg_alpha2
= hwsim_alpha2s
[0];
6812 case HWSIM_REGTEST_WORLD_ROAM
:
6814 param
.regd
= &hwsim_world_regdom_custom_01
;
6816 case HWSIM_REGTEST_CUSTOM_WORLD
:
6817 param
.regd
= &hwsim_world_regdom_custom_03
;
6819 case HWSIM_REGTEST_CUSTOM_WORLD_2
:
6821 param
.regd
= &hwsim_world_regdom_custom_03
;
6823 param
.regd
= &hwsim_world_regdom_custom_02
;
6825 case HWSIM_REGTEST_STRICT_FOLLOW
:
6827 param
.reg_strict
= true;
6828 param
.reg_alpha2
= hwsim_alpha2s
[0];
6831 case HWSIM_REGTEST_STRICT_AND_DRIVER_REG
:
6833 param
.reg_strict
= true;
6834 param
.reg_alpha2
= hwsim_alpha2s
[0];
6835 } else if (i
== 1) {
6836 param
.reg_alpha2
= hwsim_alpha2s
[1];
6839 case HWSIM_REGTEST_ALL
:
6842 param
.regd
= &hwsim_world_regdom_custom_01
;
6845 param
.regd
= &hwsim_world_regdom_custom_02
;
6848 param
.reg_alpha2
= hwsim_alpha2s
[0];
6851 param
.reg_alpha2
= hwsim_alpha2s
[1];
6854 param
.reg_strict
= true;
6855 param
.reg_alpha2
= hwsim_alpha2s
[2];
6863 param
.p2p_device
= support_p2p_device
;
6865 param
.multi_radio
= multi_radio
;
6866 param
.use_chanctx
= channels
> 1 || mlo
|| multi_radio
;
6867 param
.iftypes
= HWSIM_IFTYPE_SUPPORT_MASK
;
6868 if (param
.p2p_device
)
6869 param
.iftypes
|= BIT(NL80211_IFTYPE_P2P_DEVICE
);
6871 err
= mac80211_hwsim_new_radio(NULL
, ¶m
);
6873 goto out_free_radios
;
6876 hwsim_mon
= alloc_netdev(0, "hwsim%d", NET_NAME_UNKNOWN
,
6878 if (hwsim_mon
== NULL
) {
6880 goto out_free_radios
;
6884 err
= dev_alloc_name(hwsim_mon
, hwsim_mon
->name
);
6890 err
= register_netdevice(hwsim_mon
);
6900 free_netdev(hwsim_mon
);
6902 mac80211_hwsim_free();
6904 hwsim_unregister_virtio_driver();
6906 hwsim_exit_netlink();
6907 out_unregister_driver
:
6908 platform_driver_unregister(&mac80211_hwsim_driver
);
6909 out_unregister_pernet
:
6910 unregister_pernet_device(&hwsim_net_ops
);
6912 rhashtable_destroy(&hwsim_radios_rht
);
6915 module_init(init_mac80211_hwsim
);
6917 static void __exit
exit_mac80211_hwsim(void)
6919 pr_debug("mac80211_hwsim: unregister radios\n");
6921 hwsim_unregister_virtio_driver();
6922 hwsim_exit_netlink();
6924 mac80211_hwsim_free();
6926 rhashtable_destroy(&hwsim_radios_rht
);
6927 unregister_netdev(hwsim_mon
);
6928 platform_driver_unregister(&mac80211_hwsim_driver
);
6929 unregister_pernet_device(&hwsim_net_ops
);
6931 module_exit(exit_mac80211_hwsim
);