1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include <linux/list.h>
18#include <linux/slab.h>
19#include <linux/spinlock.h>
20#include <net/dst.h>
21#include <net/xfrm.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"
40
41#define WARN_QUEUE 100
42#define MAX_QUEUE 200
43
44MODULE_AUTHOR("Jouni Malinen");
45MODULE_DESCRIPTION("Software simulator of 802.11 radio(s) for mac80211");
46MODULE_LICENSE("GPL");
47
48static int radios = 2;
49module_param(radios, int, 0444);
50MODULE_PARM_DESC(radios, "Number of simulated radios");
51
52static int channels = 1;
53module_param(channels, int, 0444);
54MODULE_PARM_DESC(channels, "Number of concurrent channels");
55
56static bool paged_rx = false;
57module_param(paged_rx, bool, 0644);
58MODULE_PARM_DESC(paged_rx, "Use paged SKBs for RX instead of linear ones");
59
60static bool rctbl = false;
61module_param(rctbl, bool, 0444);
62MODULE_PARM_DESC(rctbl, "Handle rate control table");
63
64static bool support_p2p_device = true;
65module_param(support_p2p_device, bool, 0444);
66MODULE_PARM_DESC(support_p2p_device, "Support P2P-Device interface type");
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125enum hwsim_regtest {
126 HWSIM_REGTEST_DISABLED = 0,
127 HWSIM_REGTEST_DRIVER_REG_FOLLOW = 1,
128 HWSIM_REGTEST_DRIVER_REG_ALL = 2,
129 HWSIM_REGTEST_DIFF_COUNTRY = 3,
130 HWSIM_REGTEST_WORLD_ROAM = 4,
131 HWSIM_REGTEST_CUSTOM_WORLD = 5,
132 HWSIM_REGTEST_CUSTOM_WORLD_2 = 6,
133 HWSIM_REGTEST_STRICT_FOLLOW = 7,
134 HWSIM_REGTEST_STRICT_ALL = 8,
135 HWSIM_REGTEST_STRICT_AND_DRIVER_REG = 9,
136 HWSIM_REGTEST_ALL = 10,
137};
138
139
140static int regtest = HWSIM_REGTEST_DISABLED;
141module_param(regtest, int, 0444);
142MODULE_PARM_DESC(regtest, "The type of regulatory test we want to run");
143
144static const char *hwsim_alpha2s[] = {
145 "FI",
146 "AL",
147 "US",
148 "DE",
149 "JP",
150 "AL",
151};
152
153static const struct ieee80211_regdomain hwsim_world_regdom_custom_01 = {
154 .n_reg_rules = 5,
155 .alpha2 = "99",
156 .reg_rules = {
157 REG_RULE(2412-10, 2462+10, 40, 0, 20, 0),
158 REG_RULE(2484-10, 2484+10, 40, 0, 20, 0),
159 REG_RULE(5150-10, 5240+10, 40, 0, 30, 0),
160 REG_RULE(5745-10, 5825+10, 40, 0, 30, 0),
161 REG_RULE(5855-10, 5925+10, 40, 0, 33, 0),
162 }
163};
164
165static const struct ieee80211_regdomain hwsim_world_regdom_custom_02 = {
166 .n_reg_rules = 3,
167 .alpha2 = "99",
168 .reg_rules = {
169 REG_RULE(2412-10, 2462+10, 40, 0, 20, 0),
170 REG_RULE(5725-10, 5850+10, 40, 0, 30,
171 NL80211_RRF_NO_IR),
172 REG_RULE(5855-10, 5925+10, 40, 0, 33, 0),
173 }
174};
175
176static const struct ieee80211_regdomain *hwsim_world_regdom_custom[] = {
177 &hwsim_world_regdom_custom_01,
178 &hwsim_world_regdom_custom_02,
179};
180
181struct hwsim_vif_priv {
182 u32 magic;
183 u8 bssid[ETH_ALEN];
184 bool assoc;
185 bool bcn_en;
186 u16 aid;
187};
188
189#define HWSIM_VIF_MAGIC 0x69537748
190
191static inline void hwsim_check_magic(struct ieee80211_vif *vif)
192{
193 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
194 WARN(vp->magic != HWSIM_VIF_MAGIC,
195 "Invalid VIF (%p) magic %#x, %pM, %d/%d\n",
196 vif, vp->magic, vif->addr, vif->type, vif->p2p);
197}
198
199static inline void hwsim_set_magic(struct ieee80211_vif *vif)
200{
201 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
202 vp->magic = HWSIM_VIF_MAGIC;
203}
204
205static inline void hwsim_clear_magic(struct ieee80211_vif *vif)
206{
207 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
208 vp->magic = 0;
209}
210
211struct hwsim_sta_priv {
212 u32 magic;
213};
214
215#define HWSIM_STA_MAGIC 0x6d537749
216
217static inline void hwsim_check_sta_magic(struct ieee80211_sta *sta)
218{
219 struct hwsim_sta_priv *sp = (void *)sta->drv_priv;
220 WARN_ON(sp->magic != HWSIM_STA_MAGIC);
221}
222
223static inline void hwsim_set_sta_magic(struct ieee80211_sta *sta)
224{
225 struct hwsim_sta_priv *sp = (void *)sta->drv_priv;
226 sp->magic = HWSIM_STA_MAGIC;
227}
228
229static inline void hwsim_clear_sta_magic(struct ieee80211_sta *sta)
230{
231 struct hwsim_sta_priv *sp = (void *)sta->drv_priv;
232 sp->magic = 0;
233}
234
235struct hwsim_chanctx_priv {
236 u32 magic;
237};
238
239#define HWSIM_CHANCTX_MAGIC 0x6d53774a
240
241static inline void hwsim_check_chanctx_magic(struct ieee80211_chanctx_conf *c)
242{
243 struct hwsim_chanctx_priv *cp = (void *)c->drv_priv;
244 WARN_ON(cp->magic != HWSIM_CHANCTX_MAGIC);
245}
246
247static inline void hwsim_set_chanctx_magic(struct ieee80211_chanctx_conf *c)
248{
249 struct hwsim_chanctx_priv *cp = (void *)c->drv_priv;
250 cp->magic = HWSIM_CHANCTX_MAGIC;
251}
252
253static inline void hwsim_clear_chanctx_magic(struct ieee80211_chanctx_conf *c)
254{
255 struct hwsim_chanctx_priv *cp = (void *)c->drv_priv;
256 cp->magic = 0;
257}
258
259static unsigned int hwsim_net_id;
260
261static DEFINE_IDA(hwsim_netgroup_ida);
262
263struct hwsim_net {
264 int netgroup;
265 u32 wmediumd;
266};
267
268static inline int hwsim_net_get_netgroup(struct net *net)
269{
270 struct hwsim_net *hwsim_net = net_generic(net, hwsim_net_id);
271
272 return hwsim_net->netgroup;
273}
274
275static inline int hwsim_net_set_netgroup(struct net *net)
276{
277 struct hwsim_net *hwsim_net = net_generic(net, hwsim_net_id);
278
279 hwsim_net->netgroup = ida_simple_get(&hwsim_netgroup_ida,
280 0, 0, GFP_KERNEL);
281 return hwsim_net->netgroup >= 0 ? 0 : -ENOMEM;
282}
283
284static inline u32 hwsim_net_get_wmediumd(struct net *net)
285{
286 struct hwsim_net *hwsim_net = net_generic(net, hwsim_net_id);
287
288 return hwsim_net->wmediumd;
289}
290
291static inline void hwsim_net_set_wmediumd(struct net *net, u32 portid)
292{
293 struct hwsim_net *hwsim_net = net_generic(net, hwsim_net_id);
294
295 hwsim_net->wmediumd = portid;
296}
297
298static struct class *hwsim_class;
299
300static struct net_device *hwsim_mon;
301
302#define CHAN2G(_freq) { \
303 .band = NL80211_BAND_2GHZ, \
304 .center_freq = (_freq), \
305 .hw_value = (_freq), \
306}
307
308#define CHAN5G(_freq) { \
309 .band = NL80211_BAND_5GHZ, \
310 .center_freq = (_freq), \
311 .hw_value = (_freq), \
312}
313
314#define CHAN6G(_freq) { \
315 .band = NL80211_BAND_6GHZ, \
316 .center_freq = (_freq), \
317 .hw_value = (_freq), \
318}
319
320static const struct ieee80211_channel hwsim_channels_2ghz[] = {
321 CHAN2G(2412),
322 CHAN2G(2417),
323 CHAN2G(2422),
324 CHAN2G(2427),
325 CHAN2G(2432),
326 CHAN2G(2437),
327 CHAN2G(2442),
328 CHAN2G(2447),
329 CHAN2G(2452),
330 CHAN2G(2457),
331 CHAN2G(2462),
332 CHAN2G(2467),
333 CHAN2G(2472),
334 CHAN2G(2484),
335};
336
337static const struct ieee80211_channel hwsim_channels_5ghz[] = {
338 CHAN5G(5180),
339 CHAN5G(5200),
340 CHAN5G(5220),
341 CHAN5G(5240),
342
343 CHAN5G(5260),
344 CHAN5G(5280),
345 CHAN5G(5300),
346 CHAN5G(5320),
347
348 CHAN5G(5500),
349 CHAN5G(5520),
350 CHAN5G(5540),
351 CHAN5G(5560),
352 CHAN5G(5580),
353 CHAN5G(5600),
354 CHAN5G(5620),
355 CHAN5G(5640),
356 CHAN5G(5660),
357 CHAN5G(5680),
358 CHAN5G(5700),
359
360 CHAN5G(5745),
361 CHAN5G(5765),
362 CHAN5G(5785),
363 CHAN5G(5805),
364 CHAN5G(5825),
365 CHAN5G(5845),
366
367 CHAN5G(5855),
368 CHAN5G(5860),
369 CHAN5G(5865),
370 CHAN5G(5870),
371
372 CHAN5G(5875),
373 CHAN5G(5880),
374 CHAN5G(5885),
375 CHAN5G(5890),
376 CHAN5G(5895),
377 CHAN5G(5900),
378 CHAN5G(5905),
379
380 CHAN5G(5910),
381 CHAN5G(5915),
382 CHAN5G(5920),
383 CHAN5G(5925),
384};
385
386static const struct ieee80211_channel hwsim_channels_6ghz[] = {
387 CHAN6G(5955),
388 CHAN6G(5975),
389 CHAN6G(5995),
390 CHAN6G(6015),
391 CHAN6G(6035),
392 CHAN6G(6055),
393 CHAN6G(6075),
394 CHAN6G(6095),
395 CHAN6G(6115),
396 CHAN6G(6135),
397 CHAN6G(6155),
398 CHAN6G(6175),
399 CHAN6G(6195),
400 CHAN6G(6215),
401 CHAN6G(6235),
402 CHAN6G(6255),
403 CHAN6G(6275),
404 CHAN6G(6295),
405 CHAN6G(6315),
406 CHAN6G(6335),
407 CHAN6G(6355),
408 CHAN6G(6375),
409 CHAN6G(6395),
410 CHAN6G(6415),
411 CHAN6G(6435),
412 CHAN6G(6455),
413 CHAN6G(6475),
414 CHAN6G(6495),
415 CHAN6G(6515),
416 CHAN6G(6535),
417 CHAN6G(6555),
418 CHAN6G(6575),
419 CHAN6G(6595),
420 CHAN6G(6615),
421 CHAN6G(6635),
422 CHAN6G(6655),
423 CHAN6G(6675),
424 CHAN6G(6695),
425 CHAN6G(6715),
426 CHAN6G(6735),
427 CHAN6G(6755),
428 CHAN6G(6775),
429 CHAN6G(6795),
430 CHAN6G(6815),
431 CHAN6G(6835),
432 CHAN6G(6855),
433 CHAN6G(6875),
434 CHAN6G(6895),
435 CHAN6G(6915),
436 CHAN6G(6935),
437 CHAN6G(6955),
438 CHAN6G(6975),
439 CHAN6G(6995),
440 CHAN6G(7015),
441 CHAN6G(7035),
442 CHAN6G(7055),
443 CHAN6G(7075),
444 CHAN6G(7095),
445 CHAN6G(7115),
446};
447
448#define NUM_S1G_CHANS_US 51
449static struct ieee80211_channel hwsim_channels_s1g[NUM_S1G_CHANS_US];
450
451static const struct ieee80211_sta_s1g_cap hwsim_s1g_cap = {
452 .s1g = true,
453 .cap = { S1G_CAP0_SGI_1MHZ | S1G_CAP0_SGI_2MHZ,
454 0,
455 0,
456 S1G_CAP3_MAX_MPDU_LEN,
457 0,
458 S1G_CAP5_AMPDU,
459 0,
460 S1G_CAP7_DUP_1MHZ,
461 S1G_CAP8_TWT_RESPOND | S1G_CAP8_TWT_REQUEST,
462 0},
463 .nss_mcs = { 0xfc | 1,
464
465 0,
466
467
468 0xfa,
469
470
471 0x80,
472
473
474
475 0 },
476};
477
478static void hwsim_init_s1g_channels(struct ieee80211_channel *channels)
479{
480 int ch, freq;
481
482 for (ch = 0; ch < NUM_S1G_CHANS_US; ch++) {
483 freq = 902000 + (ch + 1) * 500;
484 channels[ch].band = NL80211_BAND_S1GHZ;
485 channels[ch].center_freq = KHZ_TO_MHZ(freq);
486 channels[ch].freq_offset = freq % 1000;
487 channels[ch].hw_value = ch + 1;
488 }
489}
490
491static const struct ieee80211_rate hwsim_rates[] = {
492 { .bitrate = 10 },
493 { .bitrate = 20, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
494 { .bitrate = 55, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
495 { .bitrate = 110, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
496 { .bitrate = 60 },
497 { .bitrate = 90 },
498 { .bitrate = 120 },
499 { .bitrate = 180 },
500 { .bitrate = 240 },
501 { .bitrate = 360 },
502 { .bitrate = 480 },
503 { .bitrate = 540 }
504};
505
506static const u32 hwsim_ciphers[] = {
507 WLAN_CIPHER_SUITE_WEP40,
508 WLAN_CIPHER_SUITE_WEP104,
509 WLAN_CIPHER_SUITE_TKIP,
510 WLAN_CIPHER_SUITE_CCMP,
511 WLAN_CIPHER_SUITE_CCMP_256,
512 WLAN_CIPHER_SUITE_GCMP,
513 WLAN_CIPHER_SUITE_GCMP_256,
514 WLAN_CIPHER_SUITE_AES_CMAC,
515 WLAN_CIPHER_SUITE_BIP_CMAC_256,
516 WLAN_CIPHER_SUITE_BIP_GMAC_128,
517 WLAN_CIPHER_SUITE_BIP_GMAC_256,
518};
519
520#define OUI_QCA 0x001374
521#define QCA_NL80211_SUBCMD_TEST 1
522enum qca_nl80211_vendor_subcmds {
523 QCA_WLAN_VENDOR_ATTR_TEST = 8,
524 QCA_WLAN_VENDOR_ATTR_MAX = QCA_WLAN_VENDOR_ATTR_TEST
525};
526
527static const struct nla_policy
528hwsim_vendor_test_policy[QCA_WLAN_VENDOR_ATTR_MAX + 1] = {
529 [QCA_WLAN_VENDOR_ATTR_MAX] = { .type = NLA_U32 },
530};
531
532static int mac80211_hwsim_vendor_cmd_test(struct wiphy *wiphy,
533 struct wireless_dev *wdev,
534 const void *data, int data_len)
535{
536 struct sk_buff *skb;
537 struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_MAX + 1];
538 int err;
539 u32 val;
540
541 err = nla_parse_deprecated(tb, QCA_WLAN_VENDOR_ATTR_MAX, data,
542 data_len, hwsim_vendor_test_policy, NULL);
543 if (err)
544 return err;
545 if (!tb[QCA_WLAN_VENDOR_ATTR_TEST])
546 return -EINVAL;
547 val = nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_TEST]);
548 wiphy_dbg(wiphy, "%s: test=%u\n", __func__, val);
549
550
551
552
553
554
555
556
557 skb = cfg80211_vendor_event_alloc(wiphy, wdev, 100, 0, GFP_KERNEL);
558 if (skb) {
559
560
561
562
563
564 nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_TEST, val + 1);
565
566
567 cfg80211_vendor_event(skb, GFP_KERNEL);
568 }
569
570
571 skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, 10);
572 if (!skb)
573 return -ENOMEM;
574
575
576
577
578 nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_TEST, val + 2);
579
580 return cfg80211_vendor_cmd_reply(skb);
581}
582
583static struct wiphy_vendor_command mac80211_hwsim_vendor_commands[] = {
584 {
585 .info = { .vendor_id = OUI_QCA,
586 .subcmd = QCA_NL80211_SUBCMD_TEST },
587 .flags = WIPHY_VENDOR_CMD_NEED_NETDEV,
588 .doit = mac80211_hwsim_vendor_cmd_test,
589 .policy = hwsim_vendor_test_policy,
590 .maxattr = QCA_WLAN_VENDOR_ATTR_MAX,
591 }
592};
593
594
595static const struct nl80211_vendor_cmd_info mac80211_hwsim_vendor_events[] = {
596 { .vendor_id = OUI_QCA, .subcmd = 1 },
597};
598
599static DEFINE_SPINLOCK(hwsim_radio_lock);
600static LIST_HEAD(hwsim_radios);
601static struct rhashtable hwsim_radios_rht;
602static int hwsim_radio_idx;
603static int hwsim_radios_generation = 1;
604
605static struct platform_driver mac80211_hwsim_driver = {
606 .driver = {
607 .name = "mac80211_hwsim",
608 },
609};
610
611struct mac80211_hwsim_data {
612 struct list_head list;
613 struct rhash_head rht;
614 struct ieee80211_hw *hw;
615 struct device *dev;
616 struct ieee80211_supported_band bands[NUM_NL80211_BANDS];
617 struct ieee80211_channel channels_2ghz[ARRAY_SIZE(hwsim_channels_2ghz)];
618 struct ieee80211_channel channels_5ghz[ARRAY_SIZE(hwsim_channels_5ghz)];
619 struct ieee80211_channel channels_6ghz[ARRAY_SIZE(hwsim_channels_6ghz)];
620 struct ieee80211_channel channels_s1g[ARRAY_SIZE(hwsim_channels_s1g)];
621 struct ieee80211_rate rates[ARRAY_SIZE(hwsim_rates)];
622 struct ieee80211_iface_combination if_combination;
623 struct ieee80211_iface_limit if_limits[3];
624 int n_if_limits;
625
626 u32 ciphers[ARRAY_SIZE(hwsim_ciphers)];
627
628 struct mac_address addresses[2];
629 struct ieee80211_chanctx_conf *chanctx;
630 int channels, idx;
631 bool use_chanctx;
632 bool destroy_on_close;
633 u32 portid;
634 char alpha2[2];
635 const struct ieee80211_regdomain *regd;
636
637 struct ieee80211_channel *tmp_chan;
638 struct ieee80211_channel *roc_chan;
639 u32 roc_duration;
640 struct delayed_work roc_start;
641 struct delayed_work roc_done;
642 struct delayed_work hw_scan;
643 struct cfg80211_scan_request *hw_scan_request;
644 struct ieee80211_vif *hw_scan_vif;
645 int scan_chan_idx;
646 u8 scan_addr[ETH_ALEN];
647 struct {
648 struct ieee80211_channel *channel;
649 unsigned long next_start, start, end;
650 } survey_data[ARRAY_SIZE(hwsim_channels_2ghz) +
651 ARRAY_SIZE(hwsim_channels_5ghz) +
652 ARRAY_SIZE(hwsim_channels_6ghz)];
653
654 struct ieee80211_channel *channel;
655 u64 beacon_int ;
656 unsigned int rx_filter;
657 bool started, idle, scanning;
658 struct mutex mutex;
659 struct hrtimer beacon_timer;
660 enum ps_mode {
661 PS_DISABLED, PS_ENABLED, PS_AUTO_POLL, PS_MANUAL_POLL
662 } ps;
663 bool ps_poll_pending;
664 struct dentry *debugfs;
665
666 uintptr_t pending_cookie;
667 struct sk_buff_head pending;
668
669
670
671
672
673 u64 group;
674
675
676 int netgroup;
677
678 u32 wmediumd;
679
680
681 s64 tsf_offset;
682 s64 bcn_delta;
683
684 u64 abs_bcn_ts;
685
686
687 u64 tx_pkts;
688 u64 rx_pkts;
689 u64 tx_bytes;
690 u64 rx_bytes;
691 u64 tx_dropped;
692 u64 tx_failed;
693};
694
695static const struct rhashtable_params hwsim_rht_params = {
696 .nelem_hint = 2,
697 .automatic_shrinking = true,
698 .key_len = ETH_ALEN,
699 .key_offset = offsetof(struct mac80211_hwsim_data, addresses[1]),
700 .head_offset = offsetof(struct mac80211_hwsim_data, rht),
701};
702
703struct hwsim_radiotap_hdr {
704 struct ieee80211_radiotap_header hdr;
705 __le64 rt_tsft;
706 u8 rt_flags;
707 u8 rt_rate;
708 __le16 rt_channel;
709 __le16 rt_chbitmask;
710} __packed;
711
712struct hwsim_radiotap_ack_hdr {
713 struct ieee80211_radiotap_header hdr;
714 u8 rt_flags;
715 u8 pad;
716 __le16 rt_channel;
717 __le16 rt_chbitmask;
718} __packed;
719
720
721static struct genl_family hwsim_genl_family;
722
723enum hwsim_multicast_groups {
724 HWSIM_MCGRP_CONFIG,
725};
726
727static const struct genl_multicast_group hwsim_mcgrps[] = {
728 [HWSIM_MCGRP_CONFIG] = { .name = "config", },
729};
730
731
732
733static const struct nla_policy hwsim_genl_policy[HWSIM_ATTR_MAX + 1] = {
734 [HWSIM_ATTR_ADDR_RECEIVER] = NLA_POLICY_ETH_ADDR_COMPAT,
735 [HWSIM_ATTR_ADDR_TRANSMITTER] = NLA_POLICY_ETH_ADDR_COMPAT,
736 [HWSIM_ATTR_FRAME] = { .type = NLA_BINARY,
737 .len = IEEE80211_MAX_DATA_LEN },
738 [HWSIM_ATTR_FLAGS] = { .type = NLA_U32 },
739 [HWSIM_ATTR_RX_RATE] = { .type = NLA_U32 },
740 [HWSIM_ATTR_SIGNAL] = { .type = NLA_U32 },
741 [HWSIM_ATTR_TX_INFO] = { .type = NLA_BINARY,
742 .len = IEEE80211_TX_MAX_RATES *
743 sizeof(struct hwsim_tx_rate)},
744 [HWSIM_ATTR_COOKIE] = { .type = NLA_U64 },
745 [HWSIM_ATTR_CHANNELS] = { .type = NLA_U32 },
746 [HWSIM_ATTR_RADIO_ID] = { .type = NLA_U32 },
747 [HWSIM_ATTR_REG_HINT_ALPHA2] = { .type = NLA_STRING, .len = 2 },
748 [HWSIM_ATTR_REG_CUSTOM_REG] = { .type = NLA_U32 },
749 [HWSIM_ATTR_REG_STRICT_REG] = { .type = NLA_FLAG },
750 [HWSIM_ATTR_SUPPORT_P2P_DEVICE] = { .type = NLA_FLAG },
751 [HWSIM_ATTR_USE_CHANCTX] = { .type = NLA_FLAG },
752 [HWSIM_ATTR_DESTROY_RADIO_ON_CLOSE] = { .type = NLA_FLAG },
753 [HWSIM_ATTR_RADIO_NAME] = { .type = NLA_STRING },
754 [HWSIM_ATTR_NO_VIF] = { .type = NLA_FLAG },
755 [HWSIM_ATTR_FREQ] = { .type = NLA_U32 },
756 [HWSIM_ATTR_TX_INFO_FLAGS] = { .type = NLA_BINARY },
757 [HWSIM_ATTR_PERM_ADDR] = NLA_POLICY_ETH_ADDR_COMPAT,
758 [HWSIM_ATTR_IFTYPE_SUPPORT] = { .type = NLA_U32 },
759 [HWSIM_ATTR_CIPHER_SUPPORT] = { .type = NLA_BINARY },
760};
761
762#if IS_REACHABLE(CONFIG_VIRTIO)
763
764
765static struct virtqueue *hwsim_vqs[HWSIM_NUM_VQS];
766static bool hwsim_virtio_enabled;
767static DEFINE_SPINLOCK(hwsim_virtio_lock);
768
769static void hwsim_virtio_rx_work(struct work_struct *work);
770static DECLARE_WORK(hwsim_virtio_rx, hwsim_virtio_rx_work);
771
772static int hwsim_tx_virtio(struct mac80211_hwsim_data *data,
773 struct sk_buff *skb)
774{
775 struct scatterlist sg[1];
776 unsigned long flags;
777 int err;
778
779 spin_lock_irqsave(&hwsim_virtio_lock, flags);
780 if (!hwsim_virtio_enabled) {
781 err = -ENODEV;
782 goto out_free;
783 }
784
785 sg_init_one(sg, skb->head, skb_end_offset(skb));
786 err = virtqueue_add_outbuf(hwsim_vqs[HWSIM_VQ_TX], sg, 1, skb,
787 GFP_ATOMIC);
788 if (err)
789 goto out_free;
790 virtqueue_kick(hwsim_vqs[HWSIM_VQ_TX]);
791 spin_unlock_irqrestore(&hwsim_virtio_lock, flags);
792 return 0;
793
794out_free:
795 spin_unlock_irqrestore(&hwsim_virtio_lock, flags);
796 nlmsg_free(skb);
797 return err;
798}
799#else
800
801extern int hwsim_tx_virtio(struct mac80211_hwsim_data *data,
802 struct sk_buff *skb);
803#define hwsim_virtio_enabled false
804#endif
805
806static void mac80211_hwsim_tx_frame(struct ieee80211_hw *hw,
807 struct sk_buff *skb,
808 struct ieee80211_channel *chan);
809
810
811static void hwsim_send_ps_poll(void *dat, u8 *mac, struct ieee80211_vif *vif)
812{
813 struct mac80211_hwsim_data *data = dat;
814 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
815 struct sk_buff *skb;
816 struct ieee80211_pspoll *pspoll;
817
818 if (!vp->assoc)
819 return;
820
821 wiphy_dbg(data->hw->wiphy,
822 "%s: send PS-Poll to %pM for aid %d\n",
823 __func__, vp->bssid, vp->aid);
824
825 skb = dev_alloc_skb(sizeof(*pspoll));
826 if (!skb)
827 return;
828 pspoll = skb_put(skb, sizeof(*pspoll));
829 pspoll->frame_control = cpu_to_le16(IEEE80211_FTYPE_CTL |
830 IEEE80211_STYPE_PSPOLL |
831 IEEE80211_FCTL_PM);
832 pspoll->aid = cpu_to_le16(0xc000 | vp->aid);
833 memcpy(pspoll->bssid, vp->bssid, ETH_ALEN);
834 memcpy(pspoll->ta, mac, ETH_ALEN);
835
836 rcu_read_lock();
837 mac80211_hwsim_tx_frame(data->hw, skb,
838 rcu_dereference(vif->chanctx_conf)->def.chan);
839 rcu_read_unlock();
840}
841
842static void hwsim_send_nullfunc(struct mac80211_hwsim_data *data, u8 *mac,
843 struct ieee80211_vif *vif, int ps)
844{
845 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
846 struct sk_buff *skb;
847 struct ieee80211_hdr *hdr;
848
849 if (!vp->assoc)
850 return;
851
852 wiphy_dbg(data->hw->wiphy,
853 "%s: send data::nullfunc to %pM ps=%d\n",
854 __func__, vp->bssid, ps);
855
856 skb = dev_alloc_skb(sizeof(*hdr));
857 if (!skb)
858 return;
859 hdr = skb_put(skb, sizeof(*hdr) - ETH_ALEN);
860 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA |
861 IEEE80211_STYPE_NULLFUNC |
862 IEEE80211_FCTL_TODS |
863 (ps ? IEEE80211_FCTL_PM : 0));
864 hdr->duration_id = cpu_to_le16(0);
865 memcpy(hdr->addr1, vp->bssid, ETH_ALEN);
866 memcpy(hdr->addr2, mac, ETH_ALEN);
867 memcpy(hdr->addr3, vp->bssid, ETH_ALEN);
868
869 rcu_read_lock();
870 mac80211_hwsim_tx_frame(data->hw, skb,
871 rcu_dereference(vif->chanctx_conf)->def.chan);
872 rcu_read_unlock();
873}
874
875
876static void hwsim_send_nullfunc_ps(void *dat, u8 *mac,
877 struct ieee80211_vif *vif)
878{
879 struct mac80211_hwsim_data *data = dat;
880 hwsim_send_nullfunc(data, mac, vif, 1);
881}
882
883static void hwsim_send_nullfunc_no_ps(void *dat, u8 *mac,
884 struct ieee80211_vif *vif)
885{
886 struct mac80211_hwsim_data *data = dat;
887 hwsim_send_nullfunc(data, mac, vif, 0);
888}
889
890static int hwsim_fops_ps_read(void *dat, u64 *val)
891{
892 struct mac80211_hwsim_data *data = dat;
893 *val = data->ps;
894 return 0;
895}
896
897static int hwsim_fops_ps_write(void *dat, u64 val)
898{
899 struct mac80211_hwsim_data *data = dat;
900 enum ps_mode old_ps;
901
902 if (val != PS_DISABLED && val != PS_ENABLED && val != PS_AUTO_POLL &&
903 val != PS_MANUAL_POLL)
904 return -EINVAL;
905
906 if (val == PS_MANUAL_POLL) {
907 if (data->ps != PS_ENABLED)
908 return -EINVAL;
909 local_bh_disable();
910 ieee80211_iterate_active_interfaces_atomic(
911 data->hw, IEEE80211_IFACE_ITER_NORMAL,
912 hwsim_send_ps_poll, data);
913 local_bh_enable();
914 return 0;
915 }
916 old_ps = data->ps;
917 data->ps = val;
918
919 local_bh_disable();
920 if (old_ps == PS_DISABLED && val != PS_DISABLED) {
921 ieee80211_iterate_active_interfaces_atomic(
922 data->hw, IEEE80211_IFACE_ITER_NORMAL,
923 hwsim_send_nullfunc_ps, data);
924 } else if (old_ps != PS_DISABLED && val == PS_DISABLED) {
925 ieee80211_iterate_active_interfaces_atomic(
926 data->hw, IEEE80211_IFACE_ITER_NORMAL,
927 hwsim_send_nullfunc_no_ps, data);
928 }
929 local_bh_enable();
930
931 return 0;
932}
933
934DEFINE_DEBUGFS_ATTRIBUTE(hwsim_fops_ps, hwsim_fops_ps_read, hwsim_fops_ps_write,
935 "%llu\n");
936
937static int hwsim_write_simulate_radar(void *dat, u64 val)
938{
939 struct mac80211_hwsim_data *data = dat;
940
941 ieee80211_radar_detected(data->hw);
942
943 return 0;
944}
945
946DEFINE_DEBUGFS_ATTRIBUTE(hwsim_simulate_radar, NULL,
947 hwsim_write_simulate_radar, "%llu\n");
948
949static int hwsim_fops_group_read(void *dat, u64 *val)
950{
951 struct mac80211_hwsim_data *data = dat;
952 *val = data->group;
953 return 0;
954}
955
956static int hwsim_fops_group_write(void *dat, u64 val)
957{
958 struct mac80211_hwsim_data *data = dat;
959 data->group = val;
960 return 0;
961}
962
963DEFINE_DEBUGFS_ATTRIBUTE(hwsim_fops_group,
964 hwsim_fops_group_read, hwsim_fops_group_write,
965 "%llx\n");
966
967static netdev_tx_t hwsim_mon_xmit(struct sk_buff *skb,
968 struct net_device *dev)
969{
970
971 dev_kfree_skb(skb);
972 return NETDEV_TX_OK;
973}
974
975static inline u64 mac80211_hwsim_get_tsf_raw(void)
976{
977 return ktime_to_us(ktime_get_real());
978}
979
980static __le64 __mac80211_hwsim_get_tsf(struct mac80211_hwsim_data *data)
981{
982 u64 now = mac80211_hwsim_get_tsf_raw();
983 return cpu_to_le64(now + data->tsf_offset);
984}
985
986static u64 mac80211_hwsim_get_tsf(struct ieee80211_hw *hw,
987 struct ieee80211_vif *vif)
988{
989 struct mac80211_hwsim_data *data = hw->priv;
990 return le64_to_cpu(__mac80211_hwsim_get_tsf(data));
991}
992
993static void mac80211_hwsim_set_tsf(struct ieee80211_hw *hw,
994 struct ieee80211_vif *vif, u64 tsf)
995{
996 struct mac80211_hwsim_data *data = hw->priv;
997 u64 now = mac80211_hwsim_get_tsf(hw, vif);
998 u32 bcn_int = data->beacon_int;
999 u64 delta = abs(tsf - now);
1000
1001
1002 if (tsf > now) {
1003 data->tsf_offset += delta;
1004 data->bcn_delta = do_div(delta, bcn_int);
1005 } else {
1006 data->tsf_offset -= delta;
1007 data->bcn_delta = -(s64)do_div(delta, bcn_int);
1008 }
1009}
1010
1011static void mac80211_hwsim_monitor_rx(struct ieee80211_hw *hw,
1012 struct sk_buff *tx_skb,
1013 struct ieee80211_channel *chan)
1014{
1015 struct mac80211_hwsim_data *data = hw->priv;
1016 struct sk_buff *skb;
1017 struct hwsim_radiotap_hdr *hdr;
1018 u16 flags, bitrate;
1019 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_skb);
1020 struct ieee80211_rate *txrate = ieee80211_get_tx_rate(hw, info);
1021
1022 if (!txrate)
1023 bitrate = 0;
1024 else
1025 bitrate = txrate->bitrate;
1026
1027 if (!netif_running(hwsim_mon))
1028 return;
1029
1030 skb = skb_copy_expand(tx_skb, sizeof(*hdr), 0, GFP_ATOMIC);
1031 if (skb == NULL)
1032 return;
1033
1034 hdr = skb_push(skb, sizeof(*hdr));
1035 hdr->hdr.it_version = PKTHDR_RADIOTAP_VERSION;
1036 hdr->hdr.it_pad = 0;
1037 hdr->hdr.it_len = cpu_to_le16(sizeof(*hdr));
1038 hdr->hdr.it_present = cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) |
1039 (1 << IEEE80211_RADIOTAP_RATE) |
1040 (1 << IEEE80211_RADIOTAP_TSFT) |
1041 (1 << IEEE80211_RADIOTAP_CHANNEL));
1042 hdr->rt_tsft = __mac80211_hwsim_get_tsf(data);
1043 hdr->rt_flags = 0;
1044 hdr->rt_rate = bitrate / 5;
1045 hdr->rt_channel = cpu_to_le16(chan->center_freq);
1046 flags = IEEE80211_CHAN_2GHZ;
1047 if (txrate && txrate->flags & IEEE80211_RATE_ERP_G)
1048 flags |= IEEE80211_CHAN_OFDM;
1049 else
1050 flags |= IEEE80211_CHAN_CCK;
1051 hdr->rt_chbitmask = cpu_to_le16(flags);
1052
1053 skb->dev = hwsim_mon;
1054 skb_reset_mac_header(skb);
1055 skb->ip_summed = CHECKSUM_UNNECESSARY;
1056 skb->pkt_type = PACKET_OTHERHOST;
1057 skb->protocol = htons(ETH_P_802_2);
1058 memset(skb->cb, 0, sizeof(skb->cb));
1059 netif_rx(skb);
1060}
1061
1062
1063static void mac80211_hwsim_monitor_ack(struct ieee80211_channel *chan,
1064 const u8 *addr)
1065{
1066 struct sk_buff *skb;
1067 struct hwsim_radiotap_ack_hdr *hdr;
1068 u16 flags;
1069 struct ieee80211_hdr *hdr11;
1070
1071 if (!netif_running(hwsim_mon))
1072 return;
1073
1074 skb = dev_alloc_skb(100);
1075 if (skb == NULL)
1076 return;
1077
1078 hdr = skb_put(skb, sizeof(*hdr));
1079 hdr->hdr.it_version = PKTHDR_RADIOTAP_VERSION;
1080 hdr->hdr.it_pad = 0;
1081 hdr->hdr.it_len = cpu_to_le16(sizeof(*hdr));
1082 hdr->hdr.it_present = cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) |
1083 (1 << IEEE80211_RADIOTAP_CHANNEL));
1084 hdr->rt_flags = 0;
1085 hdr->pad = 0;
1086 hdr->rt_channel = cpu_to_le16(chan->center_freq);
1087 flags = IEEE80211_CHAN_2GHZ;
1088 hdr->rt_chbitmask = cpu_to_le16(flags);
1089
1090 hdr11 = skb_put(skb, 10);
1091 hdr11->frame_control = cpu_to_le16(IEEE80211_FTYPE_CTL |
1092 IEEE80211_STYPE_ACK);
1093 hdr11->duration_id = cpu_to_le16(0);
1094 memcpy(hdr11->addr1, addr, ETH_ALEN);
1095
1096 skb->dev = hwsim_mon;
1097 skb_reset_mac_header(skb);
1098 skb->ip_summed = CHECKSUM_UNNECESSARY;
1099 skb->pkt_type = PACKET_OTHERHOST;
1100 skb->protocol = htons(ETH_P_802_2);
1101 memset(skb->cb, 0, sizeof(skb->cb));
1102 netif_rx(skb);
1103}
1104
1105struct mac80211_hwsim_addr_match_data {
1106 u8 addr[ETH_ALEN];
1107 bool ret;
1108};
1109
1110static void mac80211_hwsim_addr_iter(void *data, u8 *mac,
1111 struct ieee80211_vif *vif)
1112{
1113 struct mac80211_hwsim_addr_match_data *md = data;
1114
1115 if (memcmp(mac, md->addr, ETH_ALEN) == 0)
1116 md->ret = true;
1117}
1118
1119static bool mac80211_hwsim_addr_match(struct mac80211_hwsim_data *data,
1120 const u8 *addr)
1121{
1122 struct mac80211_hwsim_addr_match_data md = {
1123 .ret = false,
1124 };
1125
1126 if (data->scanning && memcmp(addr, data->scan_addr, ETH_ALEN) == 0)
1127 return true;
1128
1129 memcpy(md.addr, addr, ETH_ALEN);
1130
1131 ieee80211_iterate_active_interfaces_atomic(data->hw,
1132 IEEE80211_IFACE_ITER_NORMAL,
1133 mac80211_hwsim_addr_iter,
1134 &md);
1135
1136 return md.ret;
1137}
1138
1139static bool hwsim_ps_rx_ok(struct mac80211_hwsim_data *data,
1140 struct sk_buff *skb)
1141{
1142 switch (data->ps) {
1143 case PS_DISABLED:
1144 return true;
1145 case PS_ENABLED:
1146 return false;
1147 case PS_AUTO_POLL:
1148
1149
1150 return true;
1151 case PS_MANUAL_POLL:
1152
1153
1154 if (data->ps_poll_pending &&
1155 mac80211_hwsim_addr_match(data, skb->data + 4)) {
1156 data->ps_poll_pending = false;
1157 return true;
1158 }
1159 return false;
1160 }
1161
1162 return true;
1163}
1164
1165static int hwsim_unicast_netgroup(struct mac80211_hwsim_data *data,
1166 struct sk_buff *skb, int portid)
1167{
1168 struct net *net;
1169 bool found = false;
1170 int res = -ENOENT;
1171
1172 rcu_read_lock();
1173 for_each_net_rcu(net) {
1174 if (data->netgroup == hwsim_net_get_netgroup(net)) {
1175 res = genlmsg_unicast(net, skb, portid);
1176 found = true;
1177 break;
1178 }
1179 }
1180 rcu_read_unlock();
1181
1182 if (!found)
1183 nlmsg_free(skb);
1184
1185 return res;
1186}
1187
1188static void mac80211_hwsim_config_mac_nl(struct ieee80211_hw *hw,
1189 const u8 *addr, bool add)
1190{
1191 struct mac80211_hwsim_data *data = hw->priv;
1192 u32 _portid = READ_ONCE(data->wmediumd);
1193 struct sk_buff *skb;
1194 void *msg_head;
1195
1196 if (!_portid && !hwsim_virtio_enabled)
1197 return;
1198
1199 skb = genlmsg_new(GENLMSG_DEFAULT_SIZE, GFP_ATOMIC);
1200 if (!skb)
1201 return;
1202
1203 msg_head = genlmsg_put(skb, 0, 0, &hwsim_genl_family, 0,
1204 add ? HWSIM_CMD_ADD_MAC_ADDR :
1205 HWSIM_CMD_DEL_MAC_ADDR);
1206 if (!msg_head) {
1207 pr_debug("mac80211_hwsim: problem with msg_head\n");
1208 goto nla_put_failure;
1209 }
1210
1211 if (nla_put(skb, HWSIM_ATTR_ADDR_TRANSMITTER,
1212 ETH_ALEN, data->addresses[1].addr))
1213 goto nla_put_failure;
1214
1215 if (nla_put(skb, HWSIM_ATTR_ADDR_RECEIVER, ETH_ALEN, addr))
1216 goto nla_put_failure;
1217
1218 genlmsg_end(skb, msg_head);
1219
1220 if (hwsim_virtio_enabled)
1221 hwsim_tx_virtio(data, skb);
1222 else
1223 hwsim_unicast_netgroup(data, skb, _portid);
1224 return;
1225nla_put_failure:
1226 nlmsg_free(skb);
1227}
1228
1229static inline u16 trans_tx_rate_flags_ieee2hwsim(struct ieee80211_tx_rate *rate)
1230{
1231 u16 result = 0;
1232
1233 if (rate->flags & IEEE80211_TX_RC_USE_RTS_CTS)
1234 result |= MAC80211_HWSIM_TX_RC_USE_RTS_CTS;
1235 if (rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT)
1236 result |= MAC80211_HWSIM_TX_RC_USE_CTS_PROTECT;
1237 if (rate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
1238 result |= MAC80211_HWSIM_TX_RC_USE_SHORT_PREAMBLE;
1239 if (rate->flags & IEEE80211_TX_RC_MCS)
1240 result |= MAC80211_HWSIM_TX_RC_MCS;
1241 if (rate->flags & IEEE80211_TX_RC_GREEN_FIELD)
1242 result |= MAC80211_HWSIM_TX_RC_GREEN_FIELD;
1243 if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
1244 result |= MAC80211_HWSIM_TX_RC_40_MHZ_WIDTH;
1245 if (rate->flags & IEEE80211_TX_RC_DUP_DATA)
1246 result |= MAC80211_HWSIM_TX_RC_DUP_DATA;
1247 if (rate->flags & IEEE80211_TX_RC_SHORT_GI)
1248 result |= MAC80211_HWSIM_TX_RC_SHORT_GI;
1249 if (rate->flags & IEEE80211_TX_RC_VHT_MCS)
1250 result |= MAC80211_HWSIM_TX_RC_VHT_MCS;
1251 if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
1252 result |= MAC80211_HWSIM_TX_RC_80_MHZ_WIDTH;
1253 if (rate->flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
1254 result |= MAC80211_HWSIM_TX_RC_160_MHZ_WIDTH;
1255
1256 return result;
1257}
1258
1259static void mac80211_hwsim_tx_frame_nl(struct ieee80211_hw *hw,
1260 struct sk_buff *my_skb,
1261 int dst_portid,
1262 struct ieee80211_channel *channel)
1263{
1264 struct sk_buff *skb;
1265 struct mac80211_hwsim_data *data = hw->priv;
1266 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) my_skb->data;
1267 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(my_skb);
1268 void *msg_head;
1269 unsigned int hwsim_flags = 0;
1270 int i;
1271 struct hwsim_tx_rate tx_attempts[IEEE80211_TX_MAX_RATES];
1272 struct hwsim_tx_rate_flag tx_attempts_flags[IEEE80211_TX_MAX_RATES];
1273 uintptr_t cookie;
1274
1275 if (data->ps != PS_DISABLED)
1276 hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
1277
1278 if (skb_queue_len(&data->pending) >= MAX_QUEUE) {
1279
1280 while (skb_queue_len(&data->pending) >= WARN_QUEUE) {
1281 ieee80211_free_txskb(hw, skb_dequeue(&data->pending));
1282 data->tx_dropped++;
1283 }
1284 }
1285
1286 skb = genlmsg_new(GENLMSG_DEFAULT_SIZE, GFP_ATOMIC);
1287 if (skb == NULL)
1288 goto nla_put_failure;
1289
1290 msg_head = genlmsg_put(skb, 0, 0, &hwsim_genl_family, 0,
1291 HWSIM_CMD_FRAME);
1292 if (msg_head == NULL) {
1293 pr_debug("mac80211_hwsim: problem with msg_head\n");
1294 goto nla_put_failure;
1295 }
1296
1297 if (nla_put(skb, HWSIM_ATTR_ADDR_TRANSMITTER,
1298 ETH_ALEN, data->addresses[1].addr))
1299 goto nla_put_failure;
1300
1301
1302 if (nla_put(skb, HWSIM_ATTR_FRAME, my_skb->len, my_skb->data))
1303 goto nla_put_failure;
1304
1305
1306
1307
1308 if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS)
1309 hwsim_flags |= HWSIM_TX_CTL_REQ_TX_STATUS;
1310
1311 if (info->flags & IEEE80211_TX_CTL_NO_ACK)
1312 hwsim_flags |= HWSIM_TX_CTL_NO_ACK;
1313
1314 if (nla_put_u32(skb, HWSIM_ATTR_FLAGS, hwsim_flags))
1315 goto nla_put_failure;
1316
1317 if (nla_put_u32(skb, HWSIM_ATTR_FREQ, channel->center_freq))
1318 goto nla_put_failure;
1319
1320
1321
1322 for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
1323 tx_attempts[i].idx = info->status.rates[i].idx;
1324 tx_attempts_flags[i].idx = info->status.rates[i].idx;
1325 tx_attempts[i].count = info->status.rates[i].count;
1326 tx_attempts_flags[i].flags =
1327 trans_tx_rate_flags_ieee2hwsim(
1328 &info->status.rates[i]);
1329 }
1330
1331 if (nla_put(skb, HWSIM_ATTR_TX_INFO,
1332 sizeof(struct hwsim_tx_rate)*IEEE80211_TX_MAX_RATES,
1333 tx_attempts))
1334 goto nla_put_failure;
1335
1336 if (nla_put(skb, HWSIM_ATTR_TX_INFO_FLAGS,
1337 sizeof(struct hwsim_tx_rate_flag) * IEEE80211_TX_MAX_RATES,
1338 tx_attempts_flags))
1339 goto nla_put_failure;
1340
1341
1342 data->pending_cookie++;
1343 cookie = data->pending_cookie;
1344 info->rate_driver_data[0] = (void *)cookie;
1345 if (nla_put_u64_64bit(skb, HWSIM_ATTR_COOKIE, cookie, HWSIM_ATTR_PAD))
1346 goto nla_put_failure;
1347
1348 genlmsg_end(skb, msg_head);
1349
1350 if (hwsim_virtio_enabled) {
1351 if (hwsim_tx_virtio(data, skb))
1352 goto err_free_txskb;
1353 } else {
1354 if (hwsim_unicast_netgroup(data, skb, dst_portid))
1355 goto err_free_txskb;
1356 }
1357
1358
1359 skb_queue_tail(&data->pending, my_skb);
1360 data->tx_pkts++;
1361 data->tx_bytes += my_skb->len;
1362 return;
1363
1364nla_put_failure:
1365 nlmsg_free(skb);
1366err_free_txskb:
1367 pr_debug("mac80211_hwsim: error occurred in %s\n", __func__);
1368 ieee80211_free_txskb(hw, my_skb);
1369 data->tx_failed++;
1370}
1371
1372static bool hwsim_chans_compat(struct ieee80211_channel *c1,
1373 struct ieee80211_channel *c2)
1374{
1375 if (!c1 || !c2)
1376 return false;
1377
1378 return c1->center_freq == c2->center_freq;
1379}
1380
1381struct tx_iter_data {
1382 struct ieee80211_channel *channel;
1383 bool receive;
1384};
1385
1386static void mac80211_hwsim_tx_iter(void *_data, u8 *addr,
1387 struct ieee80211_vif *vif)
1388{
1389 struct tx_iter_data *data = _data;
1390
1391 if (!vif->chanctx_conf)
1392 return;
1393
1394 if (!hwsim_chans_compat(data->channel,
1395 rcu_dereference(vif->chanctx_conf)->def.chan))
1396 return;
1397
1398 data->receive = true;
1399}
1400
1401static void mac80211_hwsim_add_vendor_rtap(struct sk_buff *skb)
1402{
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413#ifdef HWSIM_RADIOTAP_OUI
1414 struct ieee80211_vendor_radiotap *rtap;
1415
1416
1417
1418
1419
1420 rtap = skb_push(skb, sizeof(*rtap) + 8 + 4);
1421 rtap->oui[0] = HWSIM_RADIOTAP_OUI[0];
1422 rtap->oui[1] = HWSIM_RADIOTAP_OUI[1];
1423 rtap->oui[2] = HWSIM_RADIOTAP_OUI[2];
1424 rtap->subns = 127;
1425
1426
1427
1428
1429
1430
1431
1432 rtap->present = BIT(0);
1433
1434 rtap->len = 8;
1435
1436 rtap->align = 8;
1437
1438 rtap->pad = 4;
1439
1440 memcpy(rtap->data, "ABCDEFGH", 8);
1441
1442 memset(rtap->data + 8, 0, 4);
1443
1444 IEEE80211_SKB_RXCB(skb)->flag |= RX_FLAG_RADIOTAP_VENDOR_DATA;
1445#endif
1446}
1447
1448static bool mac80211_hwsim_tx_frame_no_nl(struct ieee80211_hw *hw,
1449 struct sk_buff *skb,
1450 struct ieee80211_channel *chan)
1451{
1452 struct mac80211_hwsim_data *data = hw->priv, *data2;
1453 bool ack = false;
1454 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
1455 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1456 struct ieee80211_rx_status rx_status;
1457 u64 now;
1458
1459 memset(&rx_status, 0, sizeof(rx_status));
1460 rx_status.flag |= RX_FLAG_MACTIME_START;
1461 rx_status.freq = chan->center_freq;
1462 rx_status.freq_offset = chan->freq_offset ? 1 : 0;
1463 rx_status.band = chan->band;
1464 if (info->control.rates[0].flags & IEEE80211_TX_RC_VHT_MCS) {
1465 rx_status.rate_idx =
1466 ieee80211_rate_get_vht_mcs(&info->control.rates[0]);
1467 rx_status.nss =
1468 ieee80211_rate_get_vht_nss(&info->control.rates[0]);
1469 rx_status.encoding = RX_ENC_VHT;
1470 } else {
1471 rx_status.rate_idx = info->control.rates[0].idx;
1472 if (info->control.rates[0].flags & IEEE80211_TX_RC_MCS)
1473 rx_status.encoding = RX_ENC_HT;
1474 }
1475 if (info->control.rates[0].flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
1476 rx_status.bw = RATE_INFO_BW_40;
1477 else if (info->control.rates[0].flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
1478 rx_status.bw = RATE_INFO_BW_80;
1479 else if (info->control.rates[0].flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
1480 rx_status.bw = RATE_INFO_BW_160;
1481 else
1482 rx_status.bw = RATE_INFO_BW_20;
1483 if (info->control.rates[0].flags & IEEE80211_TX_RC_SHORT_GI)
1484 rx_status.enc_flags |= RX_ENC_FLAG_SHORT_GI;
1485
1486 rx_status.signal = -50;
1487 if (info->control.vif)
1488 rx_status.signal += info->control.vif->bss_conf.txpower;
1489
1490 if (data->ps != PS_DISABLED)
1491 hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
1492
1493
1494 skb_orphan(skb);
1495 skb_dst_drop(skb);
1496 skb->mark = 0;
1497 skb_ext_reset(skb);
1498 nf_reset_ct(skb);
1499
1500
1501
1502
1503
1504
1505
1506
1507 if (ieee80211_is_beacon(hdr->frame_control) ||
1508 ieee80211_is_probe_resp(hdr->frame_control)) {
1509 rx_status.boottime_ns = ktime_get_boottime_ns();
1510 now = data->abs_bcn_ts;
1511 } else {
1512 now = mac80211_hwsim_get_tsf_raw();
1513 }
1514
1515
1516 spin_lock(&hwsim_radio_lock);
1517 list_for_each_entry(data2, &hwsim_radios, list) {
1518 struct sk_buff *nskb;
1519 struct tx_iter_data tx_iter_data = {
1520 .receive = false,
1521 .channel = chan,
1522 };
1523
1524 if (data == data2)
1525 continue;
1526
1527 if (!data2->started || (data2->idle && !data2->tmp_chan) ||
1528 !hwsim_ps_rx_ok(data2, skb))
1529 continue;
1530
1531 if (!(data->group & data2->group))
1532 continue;
1533
1534 if (data->netgroup != data2->netgroup)
1535 continue;
1536
1537 if (!hwsim_chans_compat(chan, data2->tmp_chan) &&
1538 !hwsim_chans_compat(chan, data2->channel)) {
1539 ieee80211_iterate_active_interfaces_atomic(
1540 data2->hw, IEEE80211_IFACE_ITER_NORMAL,
1541 mac80211_hwsim_tx_iter, &tx_iter_data);
1542 if (!tx_iter_data.receive)
1543 continue;
1544 }
1545
1546
1547
1548
1549
1550 if (skb->len < PAGE_SIZE && paged_rx) {
1551 struct page *page = alloc_page(GFP_ATOMIC);
1552
1553 if (!page)
1554 continue;
1555
1556 nskb = dev_alloc_skb(128);
1557 if (!nskb) {
1558 __free_page(page);
1559 continue;
1560 }
1561
1562 memcpy(page_address(page), skb->data, skb->len);
1563 skb_add_rx_frag(nskb, 0, page, 0, skb->len, skb->len);
1564 } else {
1565 nskb = skb_copy(skb, GFP_ATOMIC);
1566 if (!nskb)
1567 continue;
1568 }
1569
1570 if (mac80211_hwsim_addr_match(data2, hdr->addr1))
1571 ack = true;
1572
1573 rx_status.mactime = now + data2->tsf_offset;
1574
1575 memcpy(IEEE80211_SKB_RXCB(nskb), &rx_status, sizeof(rx_status));
1576
1577 mac80211_hwsim_add_vendor_rtap(nskb);
1578
1579 data2->rx_pkts++;
1580 data2->rx_bytes += nskb->len;
1581 ieee80211_rx_irqsafe(data2->hw, nskb);
1582 }
1583 spin_unlock(&hwsim_radio_lock);
1584
1585 return ack;
1586}
1587
1588static void mac80211_hwsim_tx(struct ieee80211_hw *hw,
1589 struct ieee80211_tx_control *control,
1590 struct sk_buff *skb)
1591{
1592 struct mac80211_hwsim_data *data = hw->priv;
1593 struct ieee80211_tx_info *txi = IEEE80211_SKB_CB(skb);
1594 struct ieee80211_hdr *hdr = (void *)skb->data;
1595 struct ieee80211_chanctx_conf *chanctx_conf;
1596 struct ieee80211_channel *channel;
1597 bool ack;
1598 u32 _portid;
1599
1600 if (WARN_ON(skb->len < 10)) {
1601
1602 ieee80211_free_txskb(hw, skb);
1603 return;
1604 }
1605
1606 if (!data->use_chanctx) {
1607 channel = data->channel;
1608 } else if (txi->hw_queue == 4) {
1609 channel = data->tmp_chan;
1610 } else {
1611 chanctx_conf = rcu_dereference(txi->control.vif->chanctx_conf);
1612 if (chanctx_conf)
1613 channel = chanctx_conf->def.chan;
1614 else
1615 channel = NULL;
1616 }
1617
1618 if (WARN(!channel, "TX w/o channel - queue = %d\n", txi->hw_queue)) {
1619 ieee80211_free_txskb(hw, skb);
1620 return;
1621 }
1622
1623 if (data->idle && !data->tmp_chan) {
1624 wiphy_dbg(hw->wiphy, "Trying to TX when idle - reject\n");
1625 ieee80211_free_txskb(hw, skb);
1626 return;
1627 }
1628
1629 if (txi->control.vif)
1630 hwsim_check_magic(txi->control.vif);
1631 if (control->sta)
1632 hwsim_check_sta_magic(control->sta);
1633
1634 if (ieee80211_hw_check(hw, SUPPORTS_RC_TABLE))
1635 ieee80211_get_tx_rates(txi->control.vif, control->sta, skb,
1636 txi->control.rates,
1637 ARRAY_SIZE(txi->control.rates));
1638
1639 if (skb->len >= 24 + 8 &&
1640 ieee80211_is_probe_resp(hdr->frame_control)) {
1641
1642 struct ieee80211_mgmt *mgmt;
1643 struct ieee80211_rate *txrate;
1644
1645 int bitrate = 100;
1646 u64 ts;
1647
1648 mgmt = (struct ieee80211_mgmt *)skb->data;
1649 txrate = ieee80211_get_tx_rate(hw, txi);
1650 if (txrate)
1651 bitrate = txrate->bitrate;
1652 ts = mac80211_hwsim_get_tsf_raw();
1653 mgmt->u.probe_resp.timestamp =
1654 cpu_to_le64(ts + data->tsf_offset +
1655 24 * 8 * 10 / bitrate);
1656 }
1657
1658 mac80211_hwsim_monitor_rx(hw, skb, channel);
1659
1660
1661 _portid = READ_ONCE(data->wmediumd);
1662
1663 if (_portid || hwsim_virtio_enabled)
1664 return mac80211_hwsim_tx_frame_nl(hw, skb, _portid, channel);
1665
1666
1667 data->tx_pkts++;
1668 data->tx_bytes += skb->len;
1669 ack = mac80211_hwsim_tx_frame_no_nl(hw, skb, channel);
1670
1671 if (ack && skb->len >= 16)
1672 mac80211_hwsim_monitor_ack(channel, hdr->addr2);
1673
1674 ieee80211_tx_info_clear_status(txi);
1675
1676
1677 txi->control.rates[0].count = 1;
1678 txi->control.rates[1].idx = -1;
1679
1680 if (!(txi->flags & IEEE80211_TX_CTL_NO_ACK) && ack)
1681 txi->flags |= IEEE80211_TX_STAT_ACK;
1682 ieee80211_tx_status_irqsafe(hw, skb);
1683}
1684
1685
1686static int mac80211_hwsim_start(struct ieee80211_hw *hw)
1687{
1688 struct mac80211_hwsim_data *data = hw->priv;
1689 wiphy_dbg(hw->wiphy, "%s\n", __func__);
1690 data->started = true;
1691 return 0;
1692}
1693
1694
1695static void mac80211_hwsim_stop(struct ieee80211_hw *hw)
1696{
1697 struct mac80211_hwsim_data *data = hw->priv;
1698
1699 data->started = false;
1700 hrtimer_cancel(&data->beacon_timer);
1701
1702 while (!skb_queue_empty(&data->pending))
1703 ieee80211_free_txskb(hw, skb_dequeue(&data->pending));
1704
1705 wiphy_dbg(hw->wiphy, "%s\n", __func__);
1706}
1707
1708
1709static int mac80211_hwsim_add_interface(struct ieee80211_hw *hw,
1710 struct ieee80211_vif *vif)
1711{
1712 wiphy_dbg(hw->wiphy, "%s (type=%d mac_addr=%pM)\n",
1713 __func__, ieee80211_vif_type_p2p(vif),
1714 vif->addr);
1715 hwsim_set_magic(vif);
1716
1717 if (vif->type != NL80211_IFTYPE_MONITOR)
1718 mac80211_hwsim_config_mac_nl(hw, vif->addr, true);
1719
1720 vif->cab_queue = 0;
1721 vif->hw_queue[IEEE80211_AC_VO] = 0;
1722 vif->hw_queue[IEEE80211_AC_VI] = 1;
1723 vif->hw_queue[IEEE80211_AC_BE] = 2;
1724 vif->hw_queue[IEEE80211_AC_BK] = 3;
1725
1726 return 0;
1727}
1728
1729
1730static int mac80211_hwsim_change_interface(struct ieee80211_hw *hw,
1731 struct ieee80211_vif *vif,
1732 enum nl80211_iftype newtype,
1733 bool newp2p)
1734{
1735 newtype = ieee80211_iftype_p2p(newtype, newp2p);
1736 wiphy_dbg(hw->wiphy,
1737 "%s (old type=%d, new type=%d, mac_addr=%pM)\n",
1738 __func__, ieee80211_vif_type_p2p(vif),
1739 newtype, vif->addr);
1740 hwsim_check_magic(vif);
1741
1742
1743
1744
1745
1746 vif->cab_queue = 0;
1747
1748 return 0;
1749}
1750
1751static void mac80211_hwsim_remove_interface(
1752 struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1753{
1754 wiphy_dbg(hw->wiphy, "%s (type=%d mac_addr=%pM)\n",
1755 __func__, ieee80211_vif_type_p2p(vif),
1756 vif->addr);
1757 hwsim_check_magic(vif);
1758 hwsim_clear_magic(vif);
1759 if (vif->type != NL80211_IFTYPE_MONITOR)
1760 mac80211_hwsim_config_mac_nl(hw, vif->addr, false);
1761}
1762
1763static void mac80211_hwsim_tx_frame(struct ieee80211_hw *hw,
1764 struct sk_buff *skb,
1765 struct ieee80211_channel *chan)
1766{
1767 struct mac80211_hwsim_data *data = hw->priv;
1768 u32 _pid = READ_ONCE(data->wmediumd);
1769
1770 if (ieee80211_hw_check(hw, SUPPORTS_RC_TABLE)) {
1771 struct ieee80211_tx_info *txi = IEEE80211_SKB_CB(skb);
1772 ieee80211_get_tx_rates(txi->control.vif, NULL, skb,
1773 txi->control.rates,
1774 ARRAY_SIZE(txi->control.rates));
1775 }
1776
1777 mac80211_hwsim_monitor_rx(hw, skb, chan);
1778
1779 if (_pid || hwsim_virtio_enabled)
1780 return mac80211_hwsim_tx_frame_nl(hw, skb, _pid, chan);
1781
1782 data->tx_pkts++;
1783 data->tx_bytes += skb->len;
1784 mac80211_hwsim_tx_frame_no_nl(hw, skb, chan);
1785 dev_kfree_skb(skb);
1786}
1787
1788static void mac80211_hwsim_beacon_tx(void *arg, u8 *mac,
1789 struct ieee80211_vif *vif)
1790{
1791 struct mac80211_hwsim_data *data = arg;
1792 struct ieee80211_hw *hw = data->hw;
1793 struct ieee80211_tx_info *info;
1794 struct ieee80211_rate *txrate;
1795 struct ieee80211_mgmt *mgmt;
1796 struct sk_buff *skb;
1797
1798 int bitrate = 100;
1799
1800 hwsim_check_magic(vif);
1801
1802 if (vif->type != NL80211_IFTYPE_AP &&
1803 vif->type != NL80211_IFTYPE_MESH_POINT &&
1804 vif->type != NL80211_IFTYPE_ADHOC &&
1805 vif->type != NL80211_IFTYPE_OCB)
1806 return;
1807
1808 skb = ieee80211_beacon_get(hw, vif);
1809 if (skb == NULL)
1810 return;
1811 info = IEEE80211_SKB_CB(skb);
1812 if (ieee80211_hw_check(hw, SUPPORTS_RC_TABLE))
1813 ieee80211_get_tx_rates(vif, NULL, skb,
1814 info->control.rates,
1815 ARRAY_SIZE(info->control.rates));
1816
1817 txrate = ieee80211_get_tx_rate(hw, info);
1818 if (txrate)
1819 bitrate = txrate->bitrate;
1820
1821 mgmt = (struct ieee80211_mgmt *) skb->data;
1822
1823 data->abs_bcn_ts = mac80211_hwsim_get_tsf_raw();
1824 if (ieee80211_is_s1g_beacon(mgmt->frame_control)) {
1825 struct ieee80211_ext *ext = (void *) mgmt;
1826
1827 ext->u.s1g_beacon.timestamp = cpu_to_le32(data->abs_bcn_ts +
1828 data->tsf_offset +
1829 10 * 8 * 10 /
1830 bitrate);
1831 } else {
1832 mgmt->u.beacon.timestamp = cpu_to_le64(data->abs_bcn_ts +
1833 data->tsf_offset +
1834 24 * 8 * 10 /
1835 bitrate);
1836 }
1837
1838 mac80211_hwsim_tx_frame(hw, skb,
1839 rcu_dereference(vif->chanctx_conf)->def.chan);
1840
1841 while ((skb = ieee80211_get_buffered_bc(hw, vif)) != NULL) {
1842 mac80211_hwsim_tx_frame(hw, skb,
1843 rcu_dereference(vif->chanctx_conf)->def.chan);
1844 }
1845
1846 if (vif->csa_active && ieee80211_beacon_cntdwn_is_complete(vif))
1847 ieee80211_csa_finish(vif);
1848}
1849
1850static enum hrtimer_restart
1851mac80211_hwsim_beacon(struct hrtimer *timer)
1852{
1853 struct mac80211_hwsim_data *data =
1854 container_of(timer, struct mac80211_hwsim_data, beacon_timer);
1855 struct ieee80211_hw *hw = data->hw;
1856 u64 bcn_int = data->beacon_int;
1857
1858 if (!data->started)
1859 return HRTIMER_NORESTART;
1860
1861 ieee80211_iterate_active_interfaces_atomic(
1862 hw, IEEE80211_IFACE_ITER_NORMAL,
1863 mac80211_hwsim_beacon_tx, data);
1864
1865
1866 if (data->bcn_delta) {
1867 bcn_int -= data->bcn_delta;
1868 data->bcn_delta = 0;
1869 }
1870 hrtimer_forward(&data->beacon_timer, hrtimer_get_expires(timer),
1871 ns_to_ktime(bcn_int * NSEC_PER_USEC));
1872 return HRTIMER_RESTART;
1873}
1874
1875static const char * const hwsim_chanwidths[] = {
1876 [NL80211_CHAN_WIDTH_5] = "ht5",
1877 [NL80211_CHAN_WIDTH_10] = "ht10",
1878 [NL80211_CHAN_WIDTH_20_NOHT] = "noht",
1879 [NL80211_CHAN_WIDTH_20] = "ht20",
1880 [NL80211_CHAN_WIDTH_40] = "ht40",
1881 [NL80211_CHAN_WIDTH_80] = "vht80",
1882 [NL80211_CHAN_WIDTH_80P80] = "vht80p80",
1883 [NL80211_CHAN_WIDTH_160] = "vht160",
1884 [NL80211_CHAN_WIDTH_1] = "1MHz",
1885 [NL80211_CHAN_WIDTH_2] = "2MHz",
1886 [NL80211_CHAN_WIDTH_4] = "4MHz",
1887 [NL80211_CHAN_WIDTH_8] = "8MHz",
1888 [NL80211_CHAN_WIDTH_16] = "16MHz",
1889};
1890
1891static int mac80211_hwsim_config(struct ieee80211_hw *hw, u32 changed)
1892{
1893 struct mac80211_hwsim_data *data = hw->priv;
1894 struct ieee80211_conf *conf = &hw->conf;
1895 static const char *smps_modes[IEEE80211_SMPS_NUM_MODES] = {
1896 [IEEE80211_SMPS_AUTOMATIC] = "auto",
1897 [IEEE80211_SMPS_OFF] = "off",
1898 [IEEE80211_SMPS_STATIC] = "static",
1899 [IEEE80211_SMPS_DYNAMIC] = "dynamic",
1900 };
1901 int idx;
1902
1903 if (conf->chandef.chan)
1904 wiphy_dbg(hw->wiphy,
1905 "%s (freq=%d(%d - %d)/%s idle=%d ps=%d smps=%s)\n",
1906 __func__,
1907 conf->chandef.chan->center_freq,
1908 conf->chandef.center_freq1,
1909 conf->chandef.center_freq2,
1910 hwsim_chanwidths[conf->chandef.width],
1911 !!(conf->flags & IEEE80211_CONF_IDLE),
1912 !!(conf->flags & IEEE80211_CONF_PS),
1913 smps_modes[conf->smps_mode]);
1914 else
1915 wiphy_dbg(hw->wiphy,
1916 "%s (freq=0 idle=%d ps=%d smps=%s)\n",
1917 __func__,
1918 !!(conf->flags & IEEE80211_CONF_IDLE),
1919 !!(conf->flags & IEEE80211_CONF_PS),
1920 smps_modes[conf->smps_mode]);
1921
1922 data->idle = !!(conf->flags & IEEE80211_CONF_IDLE);
1923
1924 WARN_ON(conf->chandef.chan && data->use_chanctx);
1925
1926 mutex_lock(&data->mutex);
1927 if (data->scanning && conf->chandef.chan) {
1928 for (idx = 0; idx < ARRAY_SIZE(data->survey_data); idx++) {
1929 if (data->survey_data[idx].channel == data->channel) {
1930 data->survey_data[idx].start =
1931 data->survey_data[idx].next_start;
1932 data->survey_data[idx].end = jiffies;
1933 break;
1934 }
1935 }
1936
1937 data->channel = conf->chandef.chan;
1938
1939 for (idx = 0; idx < ARRAY_SIZE(data->survey_data); idx++) {
1940 if (data->survey_data[idx].channel &&
1941 data->survey_data[idx].channel != data->channel)
1942 continue;
1943 data->survey_data[idx].channel = data->channel;
1944 data->survey_data[idx].next_start = jiffies;
1945 break;
1946 }
1947 } else {
1948 data->channel = conf->chandef.chan;
1949 }
1950 mutex_unlock(&data->mutex);
1951
1952 if (!data->started || !data->beacon_int)
1953 hrtimer_cancel(&data->beacon_timer);
1954 else if (!hrtimer_is_queued(&data->beacon_timer)) {
1955 u64 tsf = mac80211_hwsim_get_tsf(hw, NULL);
1956 u32 bcn_int = data->beacon_int;
1957 u64 until_tbtt = bcn_int - do_div(tsf, bcn_int);
1958
1959 hrtimer_start(&data->beacon_timer,
1960 ns_to_ktime(until_tbtt * NSEC_PER_USEC),
1961 HRTIMER_MODE_REL_SOFT);
1962 }
1963
1964 return 0;
1965}
1966
1967
1968static void mac80211_hwsim_configure_filter(struct ieee80211_hw *hw,
1969 unsigned int changed_flags,
1970 unsigned int *total_flags,u64 multicast)
1971{
1972 struct mac80211_hwsim_data *data = hw->priv;
1973
1974 wiphy_dbg(hw->wiphy, "%s\n", __func__);
1975
1976 data->rx_filter = 0;
1977 if (*total_flags & FIF_ALLMULTI)
1978 data->rx_filter |= FIF_ALLMULTI;
1979 if (*total_flags & FIF_MCAST_ACTION)
1980 data->rx_filter |= FIF_MCAST_ACTION;
1981
1982 *total_flags = data->rx_filter;
1983}
1984
1985static void mac80211_hwsim_bcn_en_iter(void *data, u8 *mac,
1986 struct ieee80211_vif *vif)
1987{
1988 unsigned int *count = data;
1989 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
1990
1991 if (vp->bcn_en)
1992 (*count)++;
1993}
1994
1995static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw,
1996 struct ieee80211_vif *vif,
1997 struct ieee80211_bss_conf *info,
1998 u32 changed)
1999{
2000 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
2001 struct mac80211_hwsim_data *data = hw->priv;
2002
2003 hwsim_check_magic(vif);
2004
2005 wiphy_dbg(hw->wiphy, "%s(changed=0x%x vif->addr=%pM)\n",
2006 __func__, changed, vif->addr);
2007
2008 if (changed & BSS_CHANGED_BSSID) {
2009 wiphy_dbg(hw->wiphy, "%s: BSSID changed: %pM\n",
2010 __func__, info->bssid);
2011 memcpy(vp->bssid, info->bssid, ETH_ALEN);
2012 }
2013
2014 if (changed & BSS_CHANGED_ASSOC) {
2015 wiphy_dbg(hw->wiphy, " ASSOC: assoc=%d aid=%d\n",
2016 info->assoc, info->aid);
2017 vp->assoc = info->assoc;
2018 vp->aid = info->aid;
2019 }
2020
2021 if (changed & BSS_CHANGED_BEACON_ENABLED) {
2022 wiphy_dbg(hw->wiphy, " BCN EN: %d (BI=%u)\n",
2023 info->enable_beacon, info->beacon_int);
2024 vp->bcn_en = info->enable_beacon;
2025 if (data->started &&
2026 !hrtimer_is_queued(&data->beacon_timer) &&
2027 info->enable_beacon) {
2028 u64 tsf, until_tbtt;
2029 u32 bcn_int;
2030 data->beacon_int = info->beacon_int * 1024;
2031 tsf = mac80211_hwsim_get_tsf(hw, vif);
2032 bcn_int = data->beacon_int;
2033 until_tbtt = bcn_int - do_div(tsf, bcn_int);
2034
2035 hrtimer_start(&data->beacon_timer,
2036 ns_to_ktime(until_tbtt * NSEC_PER_USEC),
2037 HRTIMER_MODE_REL_SOFT);
2038 } else if (!info->enable_beacon) {
2039 unsigned int count = 0;
2040 ieee80211_iterate_active_interfaces_atomic(
2041 data->hw, IEEE80211_IFACE_ITER_NORMAL,
2042 mac80211_hwsim_bcn_en_iter, &count);
2043 wiphy_dbg(hw->wiphy, " beaconing vifs remaining: %u",
2044 count);
2045 if (count == 0) {
2046 hrtimer_cancel(&data->beacon_timer);
2047 data->beacon_int = 0;
2048 }
2049 }
2050 }
2051
2052 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2053 wiphy_dbg(hw->wiphy, " ERP_CTS_PROT: %d\n",
2054 info->use_cts_prot);
2055 }
2056
2057 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2058 wiphy_dbg(hw->wiphy, " ERP_PREAMBLE: %d\n",
2059 info->use_short_preamble);
2060 }
2061
2062 if (changed & BSS_CHANGED_ERP_SLOT) {
2063 wiphy_dbg(hw->wiphy, " ERP_SLOT: %d\n", info->use_short_slot);
2064 }
2065
2066 if (changed & BSS_CHANGED_HT) {
2067 wiphy_dbg(hw->wiphy, " HT: op_mode=0x%x\n",
2068 info->ht_operation_mode);
2069 }
2070
2071 if (changed & BSS_CHANGED_BASIC_RATES) {
2072 wiphy_dbg(hw->wiphy, " BASIC_RATES: 0x%llx\n",
2073 (unsigned long long) info->basic_rates);
2074 }
2075
2076 if (changed & BSS_CHANGED_TXPOWER)
2077 wiphy_dbg(hw->wiphy, " TX Power: %d dBm\n", info->txpower);
2078}
2079
2080static int mac80211_hwsim_sta_add(struct ieee80211_hw *hw,
2081 struct ieee80211_vif *vif,
2082 struct ieee80211_sta *sta)
2083{
2084 hwsim_check_magic(vif);
2085 hwsim_set_sta_magic(sta);
2086
2087 return 0;
2088}
2089
2090static int mac80211_hwsim_sta_remove(struct ieee80211_hw *hw,
2091 struct ieee80211_vif *vif,
2092 struct ieee80211_sta *sta)
2093{
2094 hwsim_check_magic(vif);
2095 hwsim_clear_sta_magic(sta);
2096
2097 return 0;
2098}
2099
2100static void mac80211_hwsim_sta_notify(struct ieee80211_hw *hw,
2101 struct ieee80211_vif *vif,
2102 enum sta_notify_cmd cmd,
2103 struct ieee80211_sta *sta)
2104{
2105 hwsim_check_magic(vif);
2106
2107 switch (cmd) {
2108 case STA_NOTIFY_SLEEP:
2109 case STA_NOTIFY_AWAKE:
2110
2111 break;
2112 default:
2113 WARN(1, "Invalid sta notify: %d\n", cmd);
2114 break;
2115 }
2116}
2117
2118static int mac80211_hwsim_set_tim(struct ieee80211_hw *hw,
2119 struct ieee80211_sta *sta,
2120 bool set)
2121{
2122 hwsim_check_sta_magic(sta);
2123 return 0;
2124}
2125
2126static int mac80211_hwsim_conf_tx(
2127 struct ieee80211_hw *hw,
2128 struct ieee80211_vif *vif, u16 queue,
2129 const struct ieee80211_tx_queue_params *params)
2130{
2131 wiphy_dbg(hw->wiphy,
2132 "%s (queue=%d txop=%d cw_min=%d cw_max=%d aifs=%d)\n",
2133 __func__, queue,
2134 params->txop, params->cw_min,
2135 params->cw_max, params->aifs);
2136 return 0;
2137}
2138
2139static int mac80211_hwsim_get_survey(struct ieee80211_hw *hw, int idx,
2140 struct survey_info *survey)
2141{
2142 struct mac80211_hwsim_data *hwsim = hw->priv;
2143
2144 if (idx < 0 || idx >= ARRAY_SIZE(hwsim->survey_data))
2145 return -ENOENT;
2146
2147 mutex_lock(&hwsim->mutex);
2148 survey->channel = hwsim->survey_data[idx].channel;
2149 if (!survey->channel) {
2150 mutex_unlock(&hwsim->mutex);
2151 return -ENOENT;
2152 }
2153
2154
2155
2156
2157
2158
2159
2160 survey->filled = SURVEY_INFO_NOISE_DBM |
2161 SURVEY_INFO_TIME |
2162 SURVEY_INFO_TIME_BUSY;
2163 survey->noise = -92;
2164 survey->time =
2165 jiffies_to_msecs(hwsim->survey_data[idx].end -
2166 hwsim->survey_data[idx].start);
2167
2168 survey->time_busy = survey->time/8;
2169 mutex_unlock(&hwsim->mutex);
2170
2171 return 0;
2172}
2173
2174#ifdef CONFIG_NL80211_TESTMODE
2175
2176
2177
2178
2179
2180
2181enum hwsim_testmode_attr {
2182 __HWSIM_TM_ATTR_INVALID = 0,
2183 HWSIM_TM_ATTR_CMD = 1,
2184 HWSIM_TM_ATTR_PS = 2,
2185
2186
2187 __HWSIM_TM_ATTR_AFTER_LAST,
2188 HWSIM_TM_ATTR_MAX = __HWSIM_TM_ATTR_AFTER_LAST - 1
2189};
2190
2191enum hwsim_testmode_cmd {
2192 HWSIM_TM_CMD_SET_PS = 0,
2193 HWSIM_TM_CMD_GET_PS = 1,
2194 HWSIM_TM_CMD_STOP_QUEUES = 2,
2195 HWSIM_TM_CMD_WAKE_QUEUES = 3,
2196};
2197
2198static const struct nla_policy hwsim_testmode_policy[HWSIM_TM_ATTR_MAX + 1] = {
2199 [HWSIM_TM_ATTR_CMD] = { .type = NLA_U32 },
2200 [HWSIM_TM_ATTR_PS] = { .type = NLA_U32 },
2201};
2202
2203static int mac80211_hwsim_testmode_cmd(struct ieee80211_hw *hw,
2204 struct ieee80211_vif *vif,
2205 void *data, int len)
2206{
2207 struct mac80211_hwsim_data *hwsim = hw->priv;
2208 struct nlattr *tb[HWSIM_TM_ATTR_MAX + 1];
2209 struct sk_buff *skb;
2210 int err, ps;
2211
2212 err = nla_parse_deprecated(tb, HWSIM_TM_ATTR_MAX, data, len,
2213 hwsim_testmode_policy, NULL);
2214 if (err)
2215 return err;
2216
2217 if (!tb[HWSIM_TM_ATTR_CMD])
2218 return -EINVAL;
2219
2220 switch (nla_get_u32(tb[HWSIM_TM_ATTR_CMD])) {
2221 case HWSIM_TM_CMD_SET_PS:
2222 if (!tb[HWSIM_TM_ATTR_PS])
2223 return -EINVAL;
2224 ps = nla_get_u32(tb[HWSIM_TM_ATTR_PS]);
2225 return hwsim_fops_ps_write(hwsim, ps);
2226 case HWSIM_TM_CMD_GET_PS:
2227 skb = cfg80211_testmode_alloc_reply_skb(hw->wiphy,
2228 nla_total_size(sizeof(u32)));
2229 if (!skb)
2230 return -ENOMEM;
2231 if (nla_put_u32(skb, HWSIM_TM_ATTR_PS, hwsim->ps))
2232 goto nla_put_failure;
2233 return cfg80211_testmode_reply(skb);
2234 case HWSIM_TM_CMD_STOP_QUEUES:
2235 ieee80211_stop_queues(hw);
2236 return 0;
2237 case HWSIM_TM_CMD_WAKE_QUEUES:
2238 ieee80211_wake_queues(hw);
2239 return 0;
2240 default:
2241 return -EOPNOTSUPP;
2242 }
2243
2244 nla_put_failure:
2245 kfree_skb(skb);
2246 return -ENOBUFS;
2247}
2248#endif
2249
2250static int mac80211_hwsim_ampdu_action(struct ieee80211_hw *hw,
2251 struct ieee80211_vif *vif,
2252 struct ieee80211_ampdu_params *params)
2253{
2254 struct ieee80211_sta *sta = params->sta;
2255 enum ieee80211_ampdu_mlme_action action = params->action;
2256 u16 tid = params->tid;
2257
2258 switch (action) {
2259 case IEEE80211_AMPDU_TX_START:
2260 return IEEE80211_AMPDU_TX_START_IMMEDIATE;
2261 case IEEE80211_AMPDU_TX_STOP_CONT:
2262 case IEEE80211_AMPDU_TX_STOP_FLUSH:
2263 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
2264 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
2265 break;
2266 case IEEE80211_AMPDU_TX_OPERATIONAL:
2267 break;
2268 case IEEE80211_AMPDU_RX_START:
2269 case IEEE80211_AMPDU_RX_STOP:
2270 break;
2271 default:
2272 return -EOPNOTSUPP;
2273 }
2274
2275 return 0;
2276}
2277
2278static void mac80211_hwsim_flush(struct ieee80211_hw *hw,
2279 struct ieee80211_vif *vif,
2280 u32 queues, bool drop)
2281{
2282
2283}
2284
2285static void hw_scan_work(struct work_struct *work)
2286{
2287 struct mac80211_hwsim_data *hwsim =
2288 container_of(work, struct mac80211_hwsim_data, hw_scan.work);
2289 struct cfg80211_scan_request *req = hwsim->hw_scan_request;
2290 int dwell, i;
2291
2292 mutex_lock(&hwsim->mutex);
2293 if (hwsim->scan_chan_idx >= req->n_channels) {
2294 struct cfg80211_scan_info info = {
2295 .aborted = false,
2296 };
2297
2298 wiphy_dbg(hwsim->hw->wiphy, "hw scan complete\n");
2299 ieee80211_scan_completed(hwsim->hw, &info);
2300 hwsim->hw_scan_request = NULL;
2301 hwsim->hw_scan_vif = NULL;
2302 hwsim->tmp_chan = NULL;
2303 mutex_unlock(&hwsim->mutex);
2304 mac80211_hwsim_config_mac_nl(hwsim->hw, hwsim->scan_addr,
2305 false);
2306 return;
2307 }
2308
2309 wiphy_dbg(hwsim->hw->wiphy, "hw scan %d MHz\n",
2310 req->channels[hwsim->scan_chan_idx]->center_freq);
2311
2312 hwsim->tmp_chan = req->channels[hwsim->scan_chan_idx];
2313 if (hwsim->tmp_chan->flags & (IEEE80211_CHAN_NO_IR |
2314 IEEE80211_CHAN_RADAR) ||
2315 !req->n_ssids) {
2316 dwell = 120;
2317 } else {
2318 dwell = 30;
2319
2320 for (i = 0; i < req->n_ssids; i++) {
2321 struct sk_buff *probe;
2322 struct ieee80211_mgmt *mgmt;
2323
2324 probe = ieee80211_probereq_get(hwsim->hw,
2325 hwsim->scan_addr,
2326 req->ssids[i].ssid,
2327 req->ssids[i].ssid_len,
2328 req->ie_len);
2329 if (!probe)
2330 continue;
2331
2332 mgmt = (struct ieee80211_mgmt *) probe->data;
2333 memcpy(mgmt->da, req->bssid, ETH_ALEN);
2334 memcpy(mgmt->bssid, req->bssid, ETH_ALEN);
2335
2336 if (req->ie_len)
2337 skb_put_data(probe, req->ie, req->ie_len);
2338
2339 local_bh_disable();
2340 mac80211_hwsim_tx_frame(hwsim->hw, probe,
2341 hwsim->tmp_chan);
2342 local_bh_enable();
2343 }
2344 }
2345 ieee80211_queue_delayed_work(hwsim->hw, &hwsim->hw_scan,
2346 msecs_to_jiffies(dwell));
2347 hwsim->survey_data[hwsim->scan_chan_idx].channel = hwsim->tmp_chan;
2348 hwsim->survey_data[hwsim->scan_chan_idx].start = jiffies;
2349 hwsim->survey_data[hwsim->scan_chan_idx].end =
2350 jiffies + msecs_to_jiffies(dwell);
2351 hwsim->scan_chan_idx++;
2352 mutex_unlock(&hwsim->mutex);
2353}
2354
2355static int mac80211_hwsim_hw_scan(struct ieee80211_hw *hw,
2356 struct ieee80211_vif *vif,
2357 struct ieee80211_scan_request *hw_req)
2358{
2359 struct mac80211_hwsim_data *hwsim = hw->priv;
2360 struct cfg80211_scan_request *req = &hw_req->req;
2361
2362 mutex_lock(&hwsim->mutex);
2363 if (WARN_ON(hwsim->tmp_chan || hwsim->hw_scan_request)) {
2364 mutex_unlock(&hwsim->mutex);
2365 return -EBUSY;
2366 }
2367 hwsim->hw_scan_request = req;
2368 hwsim->hw_scan_vif = vif;
2369 hwsim->scan_chan_idx = 0;
2370 if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR)
2371 get_random_mask_addr(hwsim->scan_addr,
2372 hw_req->req.mac_addr,
2373 hw_req->req.mac_addr_mask);
2374 else
2375 memcpy(hwsim->scan_addr, vif->addr, ETH_ALEN);
2376 memset(hwsim->survey_data, 0, sizeof(hwsim->survey_data));
2377 mutex_unlock(&hwsim->mutex);
2378
2379 mac80211_hwsim_config_mac_nl(hw, hwsim->scan_addr, true);
2380 wiphy_dbg(hw->wiphy, "hwsim hw_scan request\n");
2381
2382 ieee80211_queue_delayed_work(hwsim->hw, &hwsim->hw_scan, 0);
2383
2384 return 0;
2385}
2386
2387static void mac80211_hwsim_cancel_hw_scan(struct ieee80211_hw *hw,
2388 struct ieee80211_vif *vif)
2389{
2390 struct mac80211_hwsim_data *hwsim = hw->priv;
2391 struct cfg80211_scan_info info = {
2392 .aborted = true,
2393 };
2394
2395 wiphy_dbg(hw->wiphy, "hwsim cancel_hw_scan\n");
2396
2397 cancel_delayed_work_sync(&hwsim->hw_scan);
2398
2399 mutex_lock(&hwsim->mutex);
2400 ieee80211_scan_completed(hwsim->hw, &info);
2401 hwsim->tmp_chan = NULL;
2402 hwsim->hw_scan_request = NULL;
2403 hwsim->hw_scan_vif = NULL;
2404 mutex_unlock(&hwsim->mutex);
2405}
2406
2407static void mac80211_hwsim_sw_scan(struct ieee80211_hw *hw,
2408 struct ieee80211_vif *vif,
2409 const u8 *mac_addr)
2410{
2411 struct mac80211_hwsim_data *hwsim = hw->priv;
2412
2413 mutex_lock(&hwsim->mutex);
2414
2415 if (hwsim->scanning) {
2416 pr_debug("two hwsim sw_scans detected!\n");
2417 goto out;
2418 }
2419
2420 pr_debug("hwsim sw_scan request, prepping stuff\n");
2421
2422 memcpy(hwsim->scan_addr, mac_addr, ETH_ALEN);
2423 mac80211_hwsim_config_mac_nl(hw, hwsim->scan_addr, true);
2424 hwsim->scanning = true;
2425 memset(hwsim->survey_data, 0, sizeof(hwsim->survey_data));
2426
2427out:
2428 mutex_unlock(&hwsim->mutex);
2429}
2430
2431static void mac80211_hwsim_sw_scan_complete(struct ieee80211_hw *hw,
2432 struct ieee80211_vif *vif)
2433{
2434 struct mac80211_hwsim_data *hwsim = hw->priv;
2435
2436 mutex_lock(&hwsim->mutex);
2437
2438 pr_debug("hwsim sw_scan_complete\n");
2439 hwsim->scanning = false;
2440 mac80211_hwsim_config_mac_nl(hw, hwsim->scan_addr, false);
2441 eth_zero_addr(hwsim->scan_addr);
2442
2443 mutex_unlock(&hwsim->mutex);
2444}
2445
2446static void hw_roc_start(struct work_struct *work)
2447{
2448 struct mac80211_hwsim_data *hwsim =
2449 container_of(work, struct mac80211_hwsim_data, roc_start.work);
2450
2451 mutex_lock(&hwsim->mutex);
2452
2453 wiphy_dbg(hwsim->hw->wiphy, "hwsim ROC begins\n");
2454 hwsim->tmp_chan = hwsim->roc_chan;
2455 ieee80211_ready_on_channel(hwsim->hw);
2456
2457 ieee80211_queue_delayed_work(hwsim->hw, &hwsim->roc_done,
2458 msecs_to_jiffies(hwsim->roc_duration));
2459
2460 mutex_unlock(&hwsim->mutex);
2461}
2462
2463static void hw_roc_done(struct work_struct *work)
2464{
2465 struct mac80211_hwsim_data *hwsim =
2466 container_of(work, struct mac80211_hwsim_data, roc_done.work);
2467
2468 mutex_lock(&hwsim->mutex);
2469 ieee80211_remain_on_channel_expired(hwsim->hw);
2470 hwsim->tmp_chan = NULL;
2471 mutex_unlock(&hwsim->mutex);
2472
2473 wiphy_dbg(hwsim->hw->wiphy, "hwsim ROC expired\n");
2474}
2475
2476static int mac80211_hwsim_roc(struct ieee80211_hw *hw,
2477 struct ieee80211_vif *vif,
2478 struct ieee80211_channel *chan,
2479 int duration,
2480 enum ieee80211_roc_type type)
2481{
2482 struct mac80211_hwsim_data *hwsim = hw->priv;
2483
2484 mutex_lock(&hwsim->mutex);
2485 if (WARN_ON(hwsim->tmp_chan || hwsim->hw_scan_request)) {
2486 mutex_unlock(&hwsim->mutex);
2487 return -EBUSY;
2488 }
2489
2490 hwsim->roc_chan = chan;
2491 hwsim->roc_duration = duration;
2492 mutex_unlock(&hwsim->mutex);
2493
2494 wiphy_dbg(hw->wiphy, "hwsim ROC (%d MHz, %d ms)\n",
2495 chan->center_freq, duration);
2496 ieee80211_queue_delayed_work(hw, &hwsim->roc_start, HZ/50);
2497
2498 return 0;
2499}
2500
2501static int mac80211_hwsim_croc(struct ieee80211_hw *hw,
2502 struct ieee80211_vif *vif)
2503{
2504 struct mac80211_hwsim_data *hwsim = hw->priv;
2505
2506 cancel_delayed_work_sync(&hwsim->roc_start);
2507 cancel_delayed_work_sync(&hwsim->roc_done);
2508
2509 mutex_lock(&hwsim->mutex);
2510 hwsim->tmp_chan = NULL;
2511 mutex_unlock(&hwsim->mutex);
2512
2513 wiphy_dbg(hw->wiphy, "hwsim ROC canceled\n");
2514
2515 return 0;
2516}
2517
2518static int mac80211_hwsim_add_chanctx(struct ieee80211_hw *hw,
2519 struct ieee80211_chanctx_conf *ctx)
2520{
2521 struct mac80211_hwsim_data *hwsim = hw->priv;
2522
2523 mutex_lock(&hwsim->mutex);
2524 hwsim->chanctx = ctx;
2525 mutex_unlock(&hwsim->mutex);
2526 hwsim_set_chanctx_magic(ctx);
2527 wiphy_dbg(hw->wiphy,
2528 "add channel context control: %d MHz/width: %d/cfreqs:%d/%d MHz\n",
2529 ctx->def.chan->center_freq, ctx->def.width,
2530 ctx->def.center_freq1, ctx->def.center_freq2);
2531 return 0;
2532}
2533
2534static void mac80211_hwsim_remove_chanctx(struct ieee80211_hw *hw,
2535 struct ieee80211_chanctx_conf *ctx)
2536{
2537 struct mac80211_hwsim_data *hwsim = hw->priv;
2538
2539 mutex_lock(&hwsim->mutex);
2540 hwsim->chanctx = NULL;
2541 mutex_unlock(&hwsim->mutex);
2542 wiphy_dbg(hw->wiphy,
2543 "remove channel context control: %d MHz/width: %d/cfreqs:%d/%d MHz\n",
2544 ctx->def.chan->center_freq, ctx->def.width,
2545 ctx->def.center_freq1, ctx->def.center_freq2);
2546 hwsim_check_chanctx_magic(ctx);
2547 hwsim_clear_chanctx_magic(ctx);
2548}
2549
2550static void mac80211_hwsim_change_chanctx(struct ieee80211_hw *hw,
2551 struct ieee80211_chanctx_conf *ctx,
2552 u32 changed)
2553{
2554 struct mac80211_hwsim_data *hwsim = hw->priv;
2555
2556 mutex_lock(&hwsim->mutex);
2557 hwsim->chanctx = ctx;
2558 mutex_unlock(&hwsim->mutex);
2559 hwsim_check_chanctx_magic(ctx);
2560 wiphy_dbg(hw->wiphy,
2561 "change channel context control: %d MHz/width: %d/cfreqs:%d/%d MHz\n",
2562 ctx->def.chan->center_freq, ctx->def.width,
2563 ctx->def.center_freq1, ctx->def.center_freq2);
2564}
2565
2566static int mac80211_hwsim_assign_vif_chanctx(struct ieee80211_hw *hw,
2567 struct ieee80211_vif *vif,
2568 struct ieee80211_chanctx_conf *ctx)
2569{
2570 hwsim_check_magic(vif);
2571 hwsim_check_chanctx_magic(ctx);
2572
2573 return 0;
2574}
2575
2576static void mac80211_hwsim_unassign_vif_chanctx(struct ieee80211_hw *hw,
2577 struct ieee80211_vif *vif,
2578 struct ieee80211_chanctx_conf *ctx)
2579{
2580 hwsim_check_magic(vif);
2581 hwsim_check_chanctx_magic(ctx);
2582}
2583
2584static const char mac80211_hwsim_gstrings_stats[][ETH_GSTRING_LEN] = {
2585 "tx_pkts_nic",
2586 "tx_bytes_nic",
2587 "rx_pkts_nic",
2588 "rx_bytes_nic",
2589 "d_tx_dropped",
2590 "d_tx_failed",
2591 "d_ps_mode",
2592 "d_group",
2593};
2594
2595#define MAC80211_HWSIM_SSTATS_LEN ARRAY_SIZE(mac80211_hwsim_gstrings_stats)
2596
2597static void mac80211_hwsim_get_et_strings(struct ieee80211_hw *hw,
2598 struct ieee80211_vif *vif,
2599 u32 sset, u8 *data)
2600{
2601 if (sset == ETH_SS_STATS)
2602 memcpy(data, *mac80211_hwsim_gstrings_stats,
2603 sizeof(mac80211_hwsim_gstrings_stats));
2604}
2605
2606static int mac80211_hwsim_get_et_sset_count(struct ieee80211_hw *hw,
2607 struct ieee80211_vif *vif, int sset)
2608{
2609 if (sset == ETH_SS_STATS)
2610 return MAC80211_HWSIM_SSTATS_LEN;
2611 return 0;
2612}
2613
2614static void mac80211_hwsim_get_et_stats(struct ieee80211_hw *hw,
2615 struct ieee80211_vif *vif,
2616 struct ethtool_stats *stats, u64 *data)
2617{
2618 struct mac80211_hwsim_data *ar = hw->priv;
2619 int i = 0;
2620
2621 data[i++] = ar->tx_pkts;
2622 data[i++] = ar->tx_bytes;
2623 data[i++] = ar->rx_pkts;
2624 data[i++] = ar->rx_bytes;
2625 data[i++] = ar->tx_dropped;
2626 data[i++] = ar->tx_failed;
2627 data[i++] = ar->ps;
2628 data[i++] = ar->group;
2629
2630 WARN_ON(i != MAC80211_HWSIM_SSTATS_LEN);
2631}
2632
2633static int mac80211_hwsim_tx_last_beacon(struct ieee80211_hw *hw)
2634{
2635 return 1;
2636}
2637
2638#define HWSIM_COMMON_OPS \
2639 .tx = mac80211_hwsim_tx, \
2640 .start = mac80211_hwsim_start, \
2641 .stop = mac80211_hwsim_stop, \
2642 .add_interface = mac80211_hwsim_add_interface, \
2643 .change_interface = mac80211_hwsim_change_interface, \
2644 .remove_interface = mac80211_hwsim_remove_interface, \
2645 .config = mac80211_hwsim_config, \
2646 .configure_filter = mac80211_hwsim_configure_filter, \
2647 .bss_info_changed = mac80211_hwsim_bss_info_changed, \
2648 .tx_last_beacon = mac80211_hwsim_tx_last_beacon, \
2649 .sta_add = mac80211_hwsim_sta_add, \
2650 .sta_remove = mac80211_hwsim_sta_remove, \
2651 .sta_notify = mac80211_hwsim_sta_notify, \
2652 .set_tim = mac80211_hwsim_set_tim, \
2653 .conf_tx = mac80211_hwsim_conf_tx, \
2654 .get_survey = mac80211_hwsim_get_survey, \
2655 CFG80211_TESTMODE_CMD(mac80211_hwsim_testmode_cmd) \
2656 .ampdu_action = mac80211_hwsim_ampdu_action, \
2657 .flush = mac80211_hwsim_flush, \
2658 .get_tsf = mac80211_hwsim_get_tsf, \
2659 .set_tsf = mac80211_hwsim_set_tsf, \
2660 .get_et_sset_count = mac80211_hwsim_get_et_sset_count, \
2661 .get_et_stats = mac80211_hwsim_get_et_stats, \
2662 .get_et_strings = mac80211_hwsim_get_et_strings,
2663
2664static const struct ieee80211_ops mac80211_hwsim_ops = {
2665 HWSIM_COMMON_OPS
2666 .sw_scan_start = mac80211_hwsim_sw_scan,
2667 .sw_scan_complete = mac80211_hwsim_sw_scan_complete,
2668};
2669
2670static const struct ieee80211_ops mac80211_hwsim_mchan_ops = {
2671 HWSIM_COMMON_OPS
2672 .hw_scan = mac80211_hwsim_hw_scan,
2673 .cancel_hw_scan = mac80211_hwsim_cancel_hw_scan,
2674 .sw_scan_start = NULL,
2675 .sw_scan_complete = NULL,
2676 .remain_on_channel = mac80211_hwsim_roc,
2677 .cancel_remain_on_channel = mac80211_hwsim_croc,
2678 .add_chanctx = mac80211_hwsim_add_chanctx,
2679 .remove_chanctx = mac80211_hwsim_remove_chanctx,
2680 .change_chanctx = mac80211_hwsim_change_chanctx,
2681 .assign_vif_chanctx = mac80211_hwsim_assign_vif_chanctx,
2682 .unassign_vif_chanctx = mac80211_hwsim_unassign_vif_chanctx,
2683};
2684
2685struct hwsim_new_radio_params {
2686 unsigned int channels;
2687 const char *reg_alpha2;
2688 const struct ieee80211_regdomain *regd;
2689 bool reg_strict;
2690 bool p2p_device;
2691 bool use_chanctx;
2692 bool destroy_on_close;
2693 const char *hwname;
2694 bool no_vif;
2695 const u8 *perm_addr;
2696 u32 iftypes;
2697 u32 *ciphers;
2698 u8 n_ciphers;
2699};
2700
2701static void hwsim_mcast_config_msg(struct sk_buff *mcast_skb,
2702 struct genl_info *info)
2703{
2704 if (info)
2705 genl_notify(&hwsim_genl_family, mcast_skb, info,
2706 HWSIM_MCGRP_CONFIG, GFP_KERNEL);
2707 else
2708 genlmsg_multicast(&hwsim_genl_family, mcast_skb, 0,
2709 HWSIM_MCGRP_CONFIG, GFP_KERNEL);
2710}
2711
2712static int append_radio_msg(struct sk_buff *skb, int id,
2713 struct hwsim_new_radio_params *param)
2714{
2715 int ret;
2716
2717 ret = nla_put_u32(skb, HWSIM_ATTR_RADIO_ID, id);
2718 if (ret < 0)
2719 return ret;
2720
2721 if (param->channels) {
2722 ret = nla_put_u32(skb, HWSIM_ATTR_CHANNELS, param->channels);
2723 if (ret < 0)
2724 return ret;
2725 }
2726
2727 if (param->reg_alpha2) {
2728 ret = nla_put(skb, HWSIM_ATTR_REG_HINT_ALPHA2, 2,
2729 param->reg_alpha2);
2730 if (ret < 0)
2731 return ret;
2732 }
2733
2734 if (param->regd) {
2735 int i;
2736
2737 for (i = 0; i < ARRAY_SIZE(hwsim_world_regdom_custom); i++) {
2738 if (hwsim_world_regdom_custom[i] != param->regd)
2739 continue;
2740
2741 ret = nla_put_u32(skb, HWSIM_ATTR_REG_CUSTOM_REG, i);
2742 if (ret < 0)
2743 return ret;
2744 break;
2745 }
2746 }
2747
2748 if (param->reg_strict) {
2749 ret = nla_put_flag(skb, HWSIM_ATTR_REG_STRICT_REG);
2750 if (ret < 0)
2751 return ret;
2752 }
2753
2754 if (param->p2p_device) {
2755 ret = nla_put_flag(skb, HWSIM_ATTR_SUPPORT_P2P_DEVICE);
2756 if (ret < 0)
2757 return ret;
2758 }
2759
2760 if (param->use_chanctx) {
2761 ret = nla_put_flag(skb, HWSIM_ATTR_USE_CHANCTX);
2762 if (ret < 0)
2763 return ret;
2764 }
2765
2766 if (param->hwname) {
2767 ret = nla_put(skb, HWSIM_ATTR_RADIO_NAME,
2768 strlen(param->hwname), param->hwname);
2769 if (ret < 0)
2770 return ret;
2771 }
2772
2773 return 0;
2774}
2775
2776static void hwsim_mcast_new_radio(int id, struct genl_info *info,
2777 struct hwsim_new_radio_params *param)
2778{
2779 struct sk_buff *mcast_skb;
2780 void *data;
2781
2782 mcast_skb = genlmsg_new(GENLMSG_DEFAULT_SIZE, GFP_KERNEL);
2783 if (!mcast_skb)
2784 return;
2785
2786 data = genlmsg_put(mcast_skb, 0, 0, &hwsim_genl_family, 0,
2787 HWSIM_CMD_NEW_RADIO);
2788 if (!data)
2789 goto out_err;
2790
2791 if (append_radio_msg(mcast_skb, id, param) < 0)
2792 goto out_err;
2793
2794 genlmsg_end(mcast_skb, data);
2795
2796 hwsim_mcast_config_msg(mcast_skb, info);
2797 return;
2798
2799out_err:
2800 nlmsg_free(mcast_skb);
2801}
2802
2803static const struct ieee80211_sband_iftype_data he_capa_2ghz[] = {
2804 {
2805
2806 .types_mask = BIT(NL80211_IFTYPE_STATION) |
2807 BIT(NL80211_IFTYPE_AP),
2808 .he_cap = {
2809 .has_he = true,
2810 .he_cap_elem = {
2811 .mac_cap_info[0] =
2812 IEEE80211_HE_MAC_CAP0_HTC_HE,
2813 .mac_cap_info[1] =
2814 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
2815 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
2816 .mac_cap_info[2] =
2817 IEEE80211_HE_MAC_CAP2_BSR |
2818 IEEE80211_HE_MAC_CAP2_MU_CASCADING |
2819 IEEE80211_HE_MAC_CAP2_ACK_EN,
2820 .mac_cap_info[3] =
2821 IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
2822 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
2823 .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
2824 .phy_cap_info[1] =
2825 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
2826 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
2827 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
2828 IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
2829 .phy_cap_info[2] =
2830 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
2831 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
2832 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
2833 IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
2834 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO,
2835
2836
2837
2838
2839
2840 },
2841 .he_mcs_nss_supp = {
2842 .rx_mcs_80 = cpu_to_le16(0xfffa),
2843 .tx_mcs_80 = cpu_to_le16(0xfffa),
2844 .rx_mcs_160 = cpu_to_le16(0xffff),
2845 .tx_mcs_160 = cpu_to_le16(0xffff),
2846 .rx_mcs_80p80 = cpu_to_le16(0xffff),
2847 .tx_mcs_80p80 = cpu_to_le16(0xffff),
2848 },
2849 },
2850 },
2851#ifdef CONFIG_MAC80211_MESH
2852 {
2853
2854 .types_mask = BIT(NL80211_IFTYPE_MESH_POINT),
2855 .he_cap = {
2856 .has_he = true,
2857 .he_cap_elem = {
2858 .mac_cap_info[0] =
2859 IEEE80211_HE_MAC_CAP0_HTC_HE,
2860 .mac_cap_info[1] =
2861 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
2862 .mac_cap_info[2] =
2863 IEEE80211_HE_MAC_CAP2_ACK_EN,
2864 .mac_cap_info[3] =
2865 IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
2866 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
2867 .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
2868 .phy_cap_info[1] =
2869 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
2870 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
2871 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
2872 IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
2873 .phy_cap_info[2] = 0,
2874
2875
2876
2877
2878
2879 },
2880 .he_mcs_nss_supp = {
2881 .rx_mcs_80 = cpu_to_le16(0xfffa),
2882 .tx_mcs_80 = cpu_to_le16(0xfffa),
2883 .rx_mcs_160 = cpu_to_le16(0xffff),
2884 .tx_mcs_160 = cpu_to_le16(0xffff),
2885 .rx_mcs_80p80 = cpu_to_le16(0xffff),
2886 .tx_mcs_80p80 = cpu_to_le16(0xffff),
2887 },
2888 },
2889 },
2890#endif
2891};
2892
2893static const struct ieee80211_sband_iftype_data he_capa_5ghz[] = {
2894 {
2895
2896 .types_mask = BIT(NL80211_IFTYPE_STATION) |
2897 BIT(NL80211_IFTYPE_AP),
2898 .he_cap = {
2899 .has_he = true,
2900 .he_cap_elem = {
2901 .mac_cap_info[0] =
2902 IEEE80211_HE_MAC_CAP0_HTC_HE,
2903 .mac_cap_info[1] =
2904 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
2905 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
2906 .mac_cap_info[2] =
2907 IEEE80211_HE_MAC_CAP2_BSR |
2908 IEEE80211_HE_MAC_CAP2_MU_CASCADING |
2909 IEEE80211_HE_MAC_CAP2_ACK_EN,
2910 .mac_cap_info[3] =
2911 IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
2912 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
2913 .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
2914 .phy_cap_info[0] =
2915 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
2916 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
2917 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G,
2918 .phy_cap_info[1] =
2919 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
2920 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
2921 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
2922 IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
2923 .phy_cap_info[2] =
2924 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
2925 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
2926 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
2927 IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
2928 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO,
2929
2930
2931
2932
2933
2934 },
2935 .he_mcs_nss_supp = {
2936 .rx_mcs_80 = cpu_to_le16(0xfffa),
2937 .tx_mcs_80 = cpu_to_le16(0xfffa),
2938 .rx_mcs_160 = cpu_to_le16(0xfffa),
2939 .tx_mcs_160 = cpu_to_le16(0xfffa),
2940 .rx_mcs_80p80 = cpu_to_le16(0xfffa),
2941 .tx_mcs_80p80 = cpu_to_le16(0xfffa),
2942 },
2943 },
2944 },
2945#ifdef CONFIG_MAC80211_MESH
2946 {
2947
2948 .types_mask = BIT(NL80211_IFTYPE_MESH_POINT),
2949 .he_cap = {
2950 .has_he = true,
2951 .he_cap_elem = {
2952 .mac_cap_info[0] =
2953 IEEE80211_HE_MAC_CAP0_HTC_HE,
2954 .mac_cap_info[1] =
2955 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
2956 .mac_cap_info[2] =
2957 IEEE80211_HE_MAC_CAP2_ACK_EN,
2958 .mac_cap_info[3] =
2959 IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
2960 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
2961 .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
2962 .phy_cap_info[0] =
2963 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
2964 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
2965 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G,
2966 .phy_cap_info[1] =
2967 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
2968 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
2969 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
2970 IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
2971 .phy_cap_info[2] = 0,
2972
2973
2974
2975
2976
2977 },
2978 .he_mcs_nss_supp = {
2979 .rx_mcs_80 = cpu_to_le16(0xfffa),
2980 .tx_mcs_80 = cpu_to_le16(0xfffa),
2981 .rx_mcs_160 = cpu_to_le16(0xfffa),
2982 .tx_mcs_160 = cpu_to_le16(0xfffa),
2983 .rx_mcs_80p80 = cpu_to_le16(0xfffa),
2984 .tx_mcs_80p80 = cpu_to_le16(0xfffa),
2985 },
2986 },
2987 },
2988#endif
2989};
2990
2991static void mac80211_hwsim_he_capab(struct ieee80211_supported_band *sband)
2992{
2993 u16 n_iftype_data;
2994
2995 if (sband->band == NL80211_BAND_2GHZ) {
2996 n_iftype_data = ARRAY_SIZE(he_capa_2ghz);
2997 sband->iftype_data =
2998 (struct ieee80211_sband_iftype_data *)he_capa_2ghz;
2999 } else if (sband->band == NL80211_BAND_5GHZ) {
3000 n_iftype_data = ARRAY_SIZE(he_capa_5ghz);
3001 sband->iftype_data =
3002 (struct ieee80211_sband_iftype_data *)he_capa_5ghz;
3003 } else {
3004 return;
3005 }
3006
3007 sband->n_iftype_data = n_iftype_data;
3008}
3009
3010#ifdef CONFIG_MAC80211_MESH
3011#define HWSIM_MESH_BIT BIT(NL80211_IFTYPE_MESH_POINT)
3012#else
3013#define HWSIM_MESH_BIT 0
3014#endif
3015
3016#define HWSIM_DEFAULT_IF_LIMIT \
3017 (BIT(NL80211_IFTYPE_STATION) | \
3018 BIT(NL80211_IFTYPE_P2P_CLIENT) | \
3019 BIT(NL80211_IFTYPE_AP) | \
3020 BIT(NL80211_IFTYPE_P2P_GO) | \
3021 HWSIM_MESH_BIT)
3022
3023#define HWSIM_IFTYPE_SUPPORT_MASK \
3024 (BIT(NL80211_IFTYPE_STATION) | \
3025 BIT(NL80211_IFTYPE_AP) | \
3026 BIT(NL80211_IFTYPE_P2P_CLIENT) | \
3027 BIT(NL80211_IFTYPE_P2P_GO) | \
3028 BIT(NL80211_IFTYPE_ADHOC) | \
3029 BIT(NL80211_IFTYPE_MESH_POINT) | \
3030 BIT(NL80211_IFTYPE_OCB))
3031
3032static int mac80211_hwsim_new_radio(struct genl_info *info,
3033 struct hwsim_new_radio_params *param)
3034{
3035 int err;
3036 u8 addr[ETH_ALEN];
3037 struct mac80211_hwsim_data *data;
3038 struct ieee80211_hw *hw;
3039 enum nl80211_band band;
3040 const struct ieee80211_ops *ops = &mac80211_hwsim_ops;
3041 struct net *net;
3042 int idx, i;
3043 int n_limits = 0;
3044
3045 if (WARN_ON(param->channels > 1 && !param->use_chanctx))
3046 return -EINVAL;
3047
3048 spin_lock_bh(&hwsim_radio_lock);
3049 idx = hwsim_radio_idx++;
3050 spin_unlock_bh(&hwsim_radio_lock);
3051
3052 if (param->use_chanctx)
3053 ops = &mac80211_hwsim_mchan_ops;
3054 hw = ieee80211_alloc_hw_nm(sizeof(*data), ops, param->hwname);
3055 if (!hw) {
3056 pr_debug("mac80211_hwsim: ieee80211_alloc_hw failed\n");
3057 err = -ENOMEM;
3058 goto failed;
3059 }
3060
3061
3062 param->hwname = wiphy_name(hw->wiphy);
3063
3064 if (info)
3065 net = genl_info_net(info);
3066 else
3067 net = &init_net;
3068 wiphy_net_set(hw->wiphy, net);
3069
3070 data = hw->priv;
3071 data->hw = hw;
3072
3073 data->dev = device_create(hwsim_class, NULL, 0, hw, "hwsim%d", idx);
3074 if (IS_ERR(data->dev)) {
3075 printk(KERN_DEBUG
3076 "mac80211_hwsim: device_create failed (%ld)\n",
3077 PTR_ERR(data->dev));
3078 err = -ENOMEM;
3079 goto failed_drvdata;
3080 }
3081 data->dev->driver = &mac80211_hwsim_driver.driver;
3082 err = device_bind_driver(data->dev);
3083 if (err != 0) {
3084 pr_debug("mac80211_hwsim: device_bind_driver failed (%d)\n",
3085 err);
3086 goto failed_bind;
3087 }
3088
3089 skb_queue_head_init(&data->pending);
3090
3091 SET_IEEE80211_DEV(hw, data->dev);
3092 if (!param->perm_addr) {
3093 eth_zero_addr(addr);
3094 addr[0] = 0x02;
3095 addr[3] = idx >> 8;
3096 addr[4] = idx;
3097 memcpy(data->addresses[0].addr, addr, ETH_ALEN);
3098
3099 memcpy(data->addresses[1].addr, addr, ETH_ALEN);
3100 data->addresses[1].addr[0] |= 0x40;
3101 hw->wiphy->n_addresses = 2;
3102 hw->wiphy->addresses = data->addresses;
3103
3104 } else {
3105 memcpy(data->addresses[0].addr, param->perm_addr, ETH_ALEN);
3106
3107 memcpy(data->addresses[1].addr, param->perm_addr, ETH_ALEN);
3108 hw->wiphy->n_addresses = 2;
3109 hw->wiphy->addresses = data->addresses;
3110 }
3111
3112 data->channels = param->channels;
3113 data->use_chanctx = param->use_chanctx;
3114 data->idx = idx;
3115 data->destroy_on_close = param->destroy_on_close;
3116 if (info)
3117 data->portid = info->snd_portid;
3118
3119
3120 if (param->iftypes & BIT(NL80211_IFTYPE_ADHOC)) {
3121 data->if_limits[n_limits].max = 1;
3122 data->if_limits[n_limits].types = BIT(NL80211_IFTYPE_ADHOC);
3123 n_limits++;
3124 }
3125
3126 if (param->iftypes & HWSIM_DEFAULT_IF_LIMIT) {
3127 data->if_limits[n_limits].max = 2048;
3128
3129
3130
3131
3132
3133 data->if_limits[n_limits].types =
3134 HWSIM_DEFAULT_IF_LIMIT & param->iftypes;
3135 n_limits++;
3136 }
3137
3138 if (param->iftypes & BIT(NL80211_IFTYPE_P2P_DEVICE)) {
3139 data->if_limits[n_limits].max = 1;
3140 data->if_limits[n_limits].types =
3141 BIT(NL80211_IFTYPE_P2P_DEVICE);
3142 n_limits++;
3143 }
3144
3145 if (data->use_chanctx) {
3146 hw->wiphy->max_scan_ssids = 255;
3147 hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN;
3148 hw->wiphy->max_remain_on_channel_duration = 1000;
3149 data->if_combination.radar_detect_widths = 0;
3150 data->if_combination.num_different_channels = data->channels;
3151 data->chanctx = NULL;
3152 } else {
3153 data->if_combination.num_different_channels = 1;
3154 data->if_combination.radar_detect_widths =
3155 BIT(NL80211_CHAN_WIDTH_5) |
3156 BIT(NL80211_CHAN_WIDTH_10) |
3157 BIT(NL80211_CHAN_WIDTH_20_NOHT) |
3158 BIT(NL80211_CHAN_WIDTH_20) |
3159 BIT(NL80211_CHAN_WIDTH_40) |
3160 BIT(NL80211_CHAN_WIDTH_80) |
3161 BIT(NL80211_CHAN_WIDTH_160);
3162 }
3163
3164 if (!n_limits) {
3165 err = -EINVAL;
3166 goto failed_hw;
3167 }
3168
3169 data->if_combination.max_interfaces = 0;
3170 for (i = 0; i < n_limits; i++)
3171 data->if_combination.max_interfaces +=
3172 data->if_limits[i].max;
3173
3174 data->if_combination.n_limits = n_limits;
3175 data->if_combination.limits = data->if_limits;
3176
3177
3178
3179
3180
3181
3182 if (data->if_combination.max_interfaces > 1) {
3183 hw->wiphy->iface_combinations = &data->if_combination;
3184 hw->wiphy->n_iface_combinations = 1;
3185 }
3186
3187 if (param->ciphers) {
3188 memcpy(data->ciphers, param->ciphers,
3189 param->n_ciphers * sizeof(u32));
3190 hw->wiphy->cipher_suites = data->ciphers;
3191 hw->wiphy->n_cipher_suites = param->n_ciphers;
3192 }
3193
3194 INIT_DELAYED_WORK(&data->roc_start, hw_roc_start);
3195 INIT_DELAYED_WORK(&data->roc_done, hw_roc_done);
3196 INIT_DELAYED_WORK(&data->hw_scan, hw_scan_work);
3197
3198 hw->queues = 5;
3199 hw->offchannel_tx_hw_queue = 4;
3200
3201 ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
3202 ieee80211_hw_set(hw, CHANCTX_STA_CSA);
3203 ieee80211_hw_set(hw, SUPPORTS_HT_CCK_RATES);
3204 ieee80211_hw_set(hw, QUEUE_CONTROL);
3205 ieee80211_hw_set(hw, WANT_MONITOR_VIF);
3206 ieee80211_hw_set(hw, AMPDU_AGGREGATION);
3207 ieee80211_hw_set(hw, MFP_CAPABLE);
3208 ieee80211_hw_set(hw, SIGNAL_DBM);
3209 ieee80211_hw_set(hw, SUPPORTS_PS);
3210 ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
3211 ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING);
3212 ieee80211_hw_set(hw, PS_NULLFUNC_STACK);
3213 ieee80211_hw_set(hw, TDLS_WIDER_BW);
3214 if (rctbl)
3215 ieee80211_hw_set(hw, SUPPORTS_RC_TABLE);
3216 ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);
3217
3218 hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
3219 hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS |
3220 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL |
3221 WIPHY_FLAG_AP_UAPSD |
3222 WIPHY_FLAG_SUPPORTS_5_10_MHZ |
3223 WIPHY_FLAG_HAS_CHANNEL_SWITCH;
3224 hw->wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR |
3225 NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
3226 NL80211_FEATURE_STATIC_SMPS |
3227 NL80211_FEATURE_DYNAMIC_SMPS |
3228 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
3229 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
3230 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_BEACON_PROTECTION);
3231 wiphy_ext_feature_set(hw->wiphy,
3232 NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS);
3233 wiphy_ext_feature_set(hw->wiphy,
3234 NL80211_EXT_FEATURE_BEACON_RATE_LEGACY);
3235
3236 hw->wiphy->interface_modes = param->iftypes;
3237
3238
3239 hw->vif_data_size = sizeof(struct hwsim_vif_priv);
3240 hw->sta_data_size = sizeof(struct hwsim_sta_priv);
3241 hw->chanctx_data_size = sizeof(struct hwsim_chanctx_priv);
3242
3243 memcpy(data->channels_2ghz, hwsim_channels_2ghz,
3244 sizeof(hwsim_channels_2ghz));
3245 memcpy(data->channels_5ghz, hwsim_channels_5ghz,
3246 sizeof(hwsim_channels_5ghz));
3247 memcpy(data->channels_6ghz, hwsim_channels_6ghz,
3248 sizeof(hwsim_channels_6ghz));
3249 memcpy(data->channels_s1g, hwsim_channels_s1g,
3250 sizeof(hwsim_channels_s1g));
3251 memcpy(data->rates, hwsim_rates, sizeof(hwsim_rates));
3252
3253 for (band = NL80211_BAND_2GHZ; band < NUM_NL80211_BANDS; band++) {
3254 struct ieee80211_supported_band *sband = &data->bands[band];
3255
3256 sband->band = band;
3257
3258 switch (band) {
3259 case NL80211_BAND_2GHZ:
3260 sband->channels = data->channels_2ghz;
3261 sband->n_channels = ARRAY_SIZE(hwsim_channels_2ghz);
3262 sband->bitrates = data->rates;
3263 sband->n_bitrates = ARRAY_SIZE(hwsim_rates);
3264 break;
3265 case NL80211_BAND_5GHZ:
3266 sband->channels = data->channels_5ghz;
3267 sband->n_channels = ARRAY_SIZE(hwsim_channels_5ghz);
3268 sband->bitrates = data->rates + 4;
3269 sband->n_bitrates = ARRAY_SIZE(hwsim_rates) - 4;
3270
3271 sband->vht_cap.vht_supported = true;
3272 sband->vht_cap.cap =
3273 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 |
3274 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ |
3275 IEEE80211_VHT_CAP_RXLDPC |
3276 IEEE80211_VHT_CAP_SHORT_GI_80 |
3277 IEEE80211_VHT_CAP_SHORT_GI_160 |
3278 IEEE80211_VHT_CAP_TXSTBC |
3279 IEEE80211_VHT_CAP_RXSTBC_4 |
3280 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK;
3281 sband->vht_cap.vht_mcs.rx_mcs_map =
3282 cpu_to_le16(IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
3283 IEEE80211_VHT_MCS_SUPPORT_0_9 << 2 |
3284 IEEE80211_VHT_MCS_SUPPORT_0_9 << 4 |
3285 IEEE80211_VHT_MCS_SUPPORT_0_9 << 6 |
3286 IEEE80211_VHT_MCS_SUPPORT_0_9 << 8 |
3287 IEEE80211_VHT_MCS_SUPPORT_0_9 << 10 |
3288 IEEE80211_VHT_MCS_SUPPORT_0_9 << 12 |
3289 IEEE80211_VHT_MCS_SUPPORT_0_9 << 14);
3290 sband->vht_cap.vht_mcs.tx_mcs_map =
3291 sband->vht_cap.vht_mcs.rx_mcs_map;
3292 break;
3293 case NL80211_BAND_S1GHZ:
3294 memcpy(&sband->s1g_cap, &hwsim_s1g_cap,
3295 sizeof(sband->s1g_cap));
3296 sband->channels = data->channels_s1g;
3297 sband->n_channels = ARRAY_SIZE(hwsim_channels_s1g);
3298 break;
3299 default:
3300 continue;
3301 }
3302
3303 sband->ht_cap.ht_supported = true;
3304 sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
3305 IEEE80211_HT_CAP_GRN_FLD |
3306 IEEE80211_HT_CAP_SGI_20 |
3307 IEEE80211_HT_CAP_SGI_40 |
3308 IEEE80211_HT_CAP_DSSSCCK40;
3309 sband->ht_cap.ampdu_factor = 0x3;
3310 sband->ht_cap.ampdu_density = 0x6;
3311 memset(&sband->ht_cap.mcs, 0,
3312 sizeof(sband->ht_cap.mcs));
3313 sband->ht_cap.mcs.rx_mask[0] = 0xff;
3314 sband->ht_cap.mcs.rx_mask[1] = 0xff;
3315 sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
3316
3317 mac80211_hwsim_he_capab(sband);
3318
3319 hw->wiphy->bands[band] = sband;
3320 }
3321
3322
3323 data->group = 1;
3324 mutex_init(&data->mutex);
3325
3326 data->netgroup = hwsim_net_get_netgroup(net);
3327 data->wmediumd = hwsim_net_get_wmediumd(net);
3328
3329
3330 hw->max_rates = 4;
3331 hw->max_rate_tries = 11;
3332
3333 hw->wiphy->vendor_commands = mac80211_hwsim_vendor_commands;
3334 hw->wiphy->n_vendor_commands =
3335 ARRAY_SIZE(mac80211_hwsim_vendor_commands);
3336 hw->wiphy->vendor_events = mac80211_hwsim_vendor_events;
3337 hw->wiphy->n_vendor_events = ARRAY_SIZE(mac80211_hwsim_vendor_events);
3338
3339 if (param->reg_strict)
3340 hw->wiphy->regulatory_flags |= REGULATORY_STRICT_REG;
3341 if (param->regd) {
3342 data->regd = param->regd;
3343 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
3344 wiphy_apply_custom_regulatory(hw->wiphy, param->regd);
3345
3346 schedule_timeout_interruptible(1);
3347 }
3348
3349 if (param->no_vif)
3350 ieee80211_hw_set(hw, NO_AUTO_VIF);
3351
3352 wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
3353
3354 hrtimer_init(&data->beacon_timer, CLOCK_MONOTONIC,
3355 HRTIMER_MODE_ABS_SOFT);
3356 data->beacon_timer.function = mac80211_hwsim_beacon;
3357
3358 err = ieee80211_register_hw(hw);
3359 if (err < 0) {
3360 pr_debug("mac80211_hwsim: ieee80211_register_hw failed (%d)\n",
3361 err);
3362 goto failed_hw;
3363 }
3364
3365 wiphy_dbg(hw->wiphy, "hwaddr %pM registered\n", hw->wiphy->perm_addr);
3366
3367 if (param->reg_alpha2) {
3368 data->alpha2[0] = param->reg_alpha2[0];
3369 data->alpha2[1] = param->reg_alpha2[1];
3370 regulatory_hint(hw->wiphy, param->reg_alpha2);
3371 }
3372
3373 data->debugfs = debugfs_create_dir("hwsim", hw->wiphy->debugfsdir);
3374 debugfs_create_file("ps", 0666, data->debugfs, data, &hwsim_fops_ps);
3375 debugfs_create_file("group", 0666, data->debugfs, data,
3376 &hwsim_fops_group);
3377 if (!data->use_chanctx)
3378 debugfs_create_file("dfs_simulate_radar", 0222,
3379 data->debugfs,
3380 data, &hwsim_simulate_radar);
3381
3382 spin_lock_bh(&hwsim_radio_lock);
3383 err = rhashtable_insert_fast(&hwsim_radios_rht, &data->rht,
3384 hwsim_rht_params);
3385 if (err < 0) {
3386 if (info) {
3387 GENL_SET_ERR_MSG(info, "perm addr already present");
3388 NL_SET_BAD_ATTR(info->extack,
3389 info->attrs[HWSIM_ATTR_PERM_ADDR]);
3390 }
3391 spin_unlock_bh(&hwsim_radio_lock);
3392 goto failed_final_insert;
3393 }
3394
3395 list_add_tail(&data->list, &hwsim_radios);
3396 hwsim_radios_generation++;
3397 spin_unlock_bh(&hwsim_radio_lock);
3398
3399 hwsim_mcast_new_radio(idx, info, param);
3400
3401 return idx;
3402
3403failed_final_insert:
3404 debugfs_remove_recursive(data->debugfs);
3405 ieee80211_unregister_hw(data->hw);
3406failed_hw:
3407 device_release_driver(data->dev);
3408failed_bind:
3409 device_unregister(data->dev);
3410failed_drvdata:
3411 ieee80211_free_hw(hw);
3412failed:
3413 return err;
3414}
3415
3416static void hwsim_mcast_del_radio(int id, const char *hwname,
3417 struct genl_info *info)
3418{
3419 struct sk_buff *skb;
3420 void *data;
3421 int ret;
3422
3423 skb = genlmsg_new(GENLMSG_DEFAULT_SIZE, GFP_KERNEL);
3424 if (!skb)
3425 return;
3426
3427 data = genlmsg_put(skb, 0, 0, &hwsim_genl_family, 0,
3428 HWSIM_CMD_DEL_RADIO);
3429 if (!data)
3430 goto error;
3431
3432 ret = nla_put_u32(skb, HWSIM_ATTR_RADIO_ID, id);
3433 if (ret < 0)
3434 goto error;
3435
3436 ret = nla_put(skb, HWSIM_ATTR_RADIO_NAME, strlen(hwname),
3437 hwname);
3438 if (ret < 0)
3439 goto error;
3440
3441 genlmsg_end(skb, data);
3442
3443 hwsim_mcast_config_msg(skb, info);
3444
3445 return;
3446
3447error:
3448 nlmsg_free(skb);
3449}
3450
3451static void mac80211_hwsim_del_radio(struct mac80211_hwsim_data *data,
3452 const char *hwname,
3453 struct genl_info *info)
3454{
3455 hwsim_mcast_del_radio(data->idx, hwname, info);
3456 debugfs_remove_recursive(data->debugfs);
3457 ieee80211_unregister_hw(data->hw);
3458 device_release_driver(data->dev);
3459 device_unregister(data->dev);
3460 ieee80211_free_hw(data->hw);
3461}
3462
3463static int mac80211_hwsim_get_radio(struct sk_buff *skb,
3464 struct mac80211_hwsim_data *data,
3465 u32 portid, u32 seq,
3466 struct netlink_callback *cb, int flags)
3467{
3468 void *hdr;
3469 struct hwsim_new_radio_params param = { };
3470 int res = -EMSGSIZE;
3471
3472 hdr = genlmsg_put(skb, portid, seq, &hwsim_genl_family, flags,
3473 HWSIM_CMD_GET_RADIO);
3474 if (!hdr)
3475 return -EMSGSIZE;
3476
3477 if (cb)
3478 genl_dump_check_consistent(cb, hdr);
3479
3480 if (data->alpha2[0] && data->alpha2[1])
3481 param.reg_alpha2 = data->alpha2;
3482
3483 param.reg_strict = !!(data->hw->wiphy->regulatory_flags &
3484 REGULATORY_STRICT_REG);
3485 param.p2p_device = !!(data->hw->wiphy->interface_modes &
3486 BIT(NL80211_IFTYPE_P2P_DEVICE));
3487 param.use_chanctx = data->use_chanctx;
3488 param.regd = data->regd;
3489 param.channels = data->channels;
3490 param.hwname = wiphy_name(data->hw->wiphy);
3491
3492 res = append_radio_msg(skb, data->idx, ¶m);
3493 if (res < 0)
3494 goto out_err;
3495
3496 genlmsg_end(skb, hdr);
3497 return 0;
3498
3499out_err:
3500 genlmsg_cancel(skb, hdr);
3501 return res;
3502}
3503
3504static void mac80211_hwsim_free(void)
3505{
3506 struct mac80211_hwsim_data *data;
3507
3508 spin_lock_bh(&hwsim_radio_lock);
3509 while ((data = list_first_entry_or_null(&hwsim_radios,
3510 struct mac80211_hwsim_data,
3511 list))) {
3512 list_del(&data->list);
3513 spin_unlock_bh(&hwsim_radio_lock);
3514 mac80211_hwsim_del_radio(data, wiphy_name(data->hw->wiphy),
3515 NULL);
3516 spin_lock_bh(&hwsim_radio_lock);
3517 }
3518 spin_unlock_bh(&hwsim_radio_lock);
3519 class_destroy(hwsim_class);
3520}
3521
3522static const struct net_device_ops hwsim_netdev_ops = {
3523 .ndo_start_xmit = hwsim_mon_xmit,
3524 .ndo_set_mac_address = eth_mac_addr,
3525 .ndo_validate_addr = eth_validate_addr,
3526};
3527
3528static void hwsim_mon_setup(struct net_device *dev)
3529{
3530 dev->netdev_ops = &hwsim_netdev_ops;
3531 dev->needs_free_netdev = true;
3532 ether_setup(dev);
3533 dev->priv_flags |= IFF_NO_QUEUE;
3534 dev->type = ARPHRD_IEEE80211_RADIOTAP;
3535 eth_zero_addr(dev->dev_addr);
3536 dev->dev_addr[0] = 0x12;
3537}
3538
3539static struct mac80211_hwsim_data *get_hwsim_data_ref_from_addr(const u8 *addr)
3540{
3541 return rhashtable_lookup_fast(&hwsim_radios_rht,
3542 addr,
3543 hwsim_rht_params);
3544}
3545
3546static void hwsim_register_wmediumd(struct net *net, u32 portid)
3547{
3548 struct mac80211_hwsim_data *data;
3549
3550 hwsim_net_set_wmediumd(net, portid);
3551
3552 spin_lock_bh(&hwsim_radio_lock);
3553 list_for_each_entry(data, &hwsim_radios, list) {
3554 if (data->netgroup == hwsim_net_get_netgroup(net))
3555 data->wmediumd = portid;
3556 }
3557 spin_unlock_bh(&hwsim_radio_lock);
3558}
3559
3560static int hwsim_tx_info_frame_received_nl(struct sk_buff *skb_2,
3561 struct genl_info *info)
3562{
3563
3564 struct ieee80211_hdr *hdr;
3565 struct mac80211_hwsim_data *data2;
3566 struct ieee80211_tx_info *txi;
3567 struct hwsim_tx_rate *tx_attempts;
3568 u64 ret_skb_cookie;
3569 struct sk_buff *skb, *tmp;
3570 const u8 *src;
3571 unsigned int hwsim_flags;
3572 int i;
3573 bool found = false;
3574
3575 if (!info->attrs[HWSIM_ATTR_ADDR_TRANSMITTER] ||
3576 !info->attrs[HWSIM_ATTR_FLAGS] ||
3577 !info->attrs[HWSIM_ATTR_COOKIE] ||
3578 !info->attrs[HWSIM_ATTR_SIGNAL] ||
3579 !info->attrs[HWSIM_ATTR_TX_INFO])
3580 goto out;
3581
3582 src = (void *)nla_data(info->attrs[HWSIM_ATTR_ADDR_TRANSMITTER]);
3583 hwsim_flags = nla_get_u32(info->attrs[HWSIM_ATTR_FLAGS]);
3584 ret_skb_cookie = nla_get_u64(info->attrs[HWSIM_ATTR_COOKIE]);
3585
3586 data2 = get_hwsim_data_ref_from_addr(src);
3587 if (!data2)
3588 goto out;
3589
3590 if (!hwsim_virtio_enabled) {
3591 if (hwsim_net_get_netgroup(genl_info_net(info)) !=
3592 data2->netgroup)
3593 goto out;
3594
3595 if (info->snd_portid != data2->wmediumd)
3596 goto out;
3597 }
3598
3599
3600 skb_queue_walk_safe(&data2->pending, skb, tmp) {
3601 u64 skb_cookie;
3602
3603 txi = IEEE80211_SKB_CB(skb);
3604 skb_cookie = (u64)(uintptr_t)txi->rate_driver_data[0];
3605
3606 if (skb_cookie == ret_skb_cookie) {
3607 skb_unlink(skb, &data2->pending);
3608 found = true;
3609 break;
3610 }
3611 }
3612
3613
3614 if (!found)
3615 goto out;
3616
3617
3618
3619
3620 tx_attempts = (struct hwsim_tx_rate *)nla_data(
3621 info->attrs[HWSIM_ATTR_TX_INFO]);
3622
3623
3624 txi = IEEE80211_SKB_CB(skb);
3625
3626 ieee80211_tx_info_clear_status(txi);
3627
3628 for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
3629 txi->status.rates[i].idx = tx_attempts[i].idx;
3630 txi->status.rates[i].count = tx_attempts[i].count;
3631 }
3632
3633 txi->status.ack_signal = nla_get_u32(info->attrs[HWSIM_ATTR_SIGNAL]);
3634
3635 if (!(hwsim_flags & HWSIM_TX_CTL_NO_ACK) &&
3636 (hwsim_flags & HWSIM_TX_STAT_ACK)) {
3637 if (skb->len >= 16) {
3638 hdr = (struct ieee80211_hdr *) skb->data;
3639 mac80211_hwsim_monitor_ack(data2->channel,
3640 hdr->addr2);
3641 }
3642 txi->flags |= IEEE80211_TX_STAT_ACK;
3643 }
3644 ieee80211_tx_status_irqsafe(data2->hw, skb);
3645 return 0;
3646out:
3647 return -EINVAL;
3648
3649}
3650
3651static int hwsim_cloned_frame_received_nl(struct sk_buff *skb_2,
3652 struct genl_info *info)
3653{
3654 struct mac80211_hwsim_data *data2;
3655 struct ieee80211_rx_status rx_status;
3656 struct ieee80211_hdr *hdr;
3657 const u8 *dst;
3658 int frame_data_len;
3659 void *frame_data;
3660 struct sk_buff *skb = NULL;
3661 struct ieee80211_channel *channel = NULL;
3662
3663 if (!info->attrs[HWSIM_ATTR_ADDR_RECEIVER] ||
3664 !info->attrs[HWSIM_ATTR_FRAME] ||
3665 !info->attrs[HWSIM_ATTR_RX_RATE] ||
3666 !info->attrs[HWSIM_ATTR_SIGNAL])
3667 goto out;
3668
3669 dst = (void *)nla_data(info->attrs[HWSIM_ATTR_ADDR_RECEIVER]);
3670 frame_data_len = nla_len(info->attrs[HWSIM_ATTR_FRAME]);
3671 frame_data = (void *)nla_data(info->attrs[HWSIM_ATTR_FRAME]);
3672
3673
3674 skb = alloc_skb(frame_data_len, GFP_KERNEL);
3675 if (skb == NULL)
3676 goto err;
3677
3678 if (frame_data_len > IEEE80211_MAX_DATA_LEN)
3679 goto err;
3680
3681
3682 skb_put_data(skb, frame_data, frame_data_len);
3683
3684 data2 = get_hwsim_data_ref_from_addr(dst);
3685 if (!data2)
3686 goto out;
3687
3688 if (data2->use_chanctx) {
3689 if (data2->tmp_chan)
3690 channel = data2->tmp_chan;
3691 else if (data2->chanctx)
3692 channel = data2->chanctx->def.chan;
3693 } else {
3694 channel = data2->channel;
3695 }
3696 if (!channel)
3697 goto out;
3698
3699 if (!hwsim_virtio_enabled) {
3700 if (hwsim_net_get_netgroup(genl_info_net(info)) !=
3701 data2->netgroup)
3702 goto out;
3703
3704 if (info->snd_portid != data2->wmediumd)
3705 goto out;
3706 }
3707
3708
3709
3710 if ((data2->idle && !data2->tmp_chan) || !data2->started)
3711 goto out;
3712
3713
3714 memset(&rx_status, 0, sizeof(rx_status));
3715 if (info->attrs[HWSIM_ATTR_FREQ]) {
3716
3717
3718
3719
3720 mutex_lock(&data2->mutex);
3721 rx_status.freq = nla_get_u32(info->attrs[HWSIM_ATTR_FREQ]);
3722
3723 if (rx_status.freq != channel->center_freq) {
3724 mutex_unlock(&data2->mutex);
3725 goto out;
3726 }
3727 mutex_unlock(&data2->mutex);
3728 } else {
3729 rx_status.freq = channel->center_freq;
3730 }
3731
3732 rx_status.band = channel->band;
3733 rx_status.rate_idx = nla_get_u32(info->attrs[HWSIM_ATTR_RX_RATE]);
3734 rx_status.signal = nla_get_u32(info->attrs[HWSIM_ATTR_SIGNAL]);
3735
3736 hdr = (void *)skb->data;
3737
3738 if (ieee80211_is_beacon(hdr->frame_control) ||
3739 ieee80211_is_probe_resp(hdr->frame_control))
3740 rx_status.boottime_ns = ktime_get_boottime_ns();
3741
3742 memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status));
3743 data2->rx_pkts++;
3744 data2->rx_bytes += skb->len;
3745 ieee80211_rx_irqsafe(data2->hw, skb);
3746
3747 return 0;
3748err:
3749 pr_debug("mac80211_hwsim: error occurred in %s\n", __func__);
3750out:
3751 dev_kfree_skb(skb);
3752 return -EINVAL;
3753}
3754
3755static int hwsim_register_received_nl(struct sk_buff *skb_2,
3756 struct genl_info *info)
3757{
3758 struct net *net = genl_info_net(info);
3759 struct mac80211_hwsim_data *data;
3760 int chans = 1;
3761
3762 spin_lock_bh(&hwsim_radio_lock);
3763 list_for_each_entry(data, &hwsim_radios, list)
3764 chans = max(chans, data->channels);
3765 spin_unlock_bh(&hwsim_radio_lock);
3766
3767
3768
3769
3770
3771
3772 if (chans > 1)
3773 return -EOPNOTSUPP;
3774
3775 if (hwsim_net_get_wmediumd(net))
3776 return -EBUSY;
3777
3778 hwsim_register_wmediumd(net, info->snd_portid);
3779
3780 pr_debug("mac80211_hwsim: received a REGISTER, "
3781 "switching to wmediumd mode with pid %d\n", info->snd_portid);
3782
3783 return 0;
3784}
3785
3786
3787static bool hwsim_known_ciphers(const u32 *ciphers, int n_ciphers)
3788{
3789 int i;
3790
3791 for (i = 0; i < n_ciphers; i++) {
3792 int j;
3793 int found = 0;
3794
3795 for (j = 0; j < ARRAY_SIZE(hwsim_ciphers); j++) {
3796 if (ciphers[i] == hwsim_ciphers[j]) {
3797 found = 1;
3798 break;
3799 }
3800 }
3801
3802 if (!found)
3803 return false;
3804 }
3805
3806 return true;
3807}
3808
3809static int hwsim_new_radio_nl(struct sk_buff *msg, struct genl_info *info)
3810{
3811 struct hwsim_new_radio_params param = { 0 };
3812 const char *hwname = NULL;
3813 int ret;
3814
3815 param.reg_strict = info->attrs[HWSIM_ATTR_REG_STRICT_REG];
3816 param.p2p_device = info->attrs[HWSIM_ATTR_SUPPORT_P2P_DEVICE];
3817 param.channels = channels;
3818 param.destroy_on_close =
3819 info->attrs[HWSIM_ATTR_DESTROY_RADIO_ON_CLOSE];
3820
3821 if (info->attrs[HWSIM_ATTR_CHANNELS])
3822 param.channels = nla_get_u32(info->attrs[HWSIM_ATTR_CHANNELS]);
3823
3824 if (param.channels < 1) {
3825 GENL_SET_ERR_MSG(info, "must have at least one channel");
3826 return -EINVAL;
3827 }
3828
3829 if (info->attrs[HWSIM_ATTR_NO_VIF])
3830 param.no_vif = true;
3831
3832 if (info->attrs[HWSIM_ATTR_USE_CHANCTX])
3833 param.use_chanctx = true;
3834 else
3835 param.use_chanctx = (param.channels > 1);
3836
3837 if (info->attrs[HWSIM_ATTR_REG_HINT_ALPHA2])
3838 param.reg_alpha2 =
3839 nla_data(info->attrs[HWSIM_ATTR_REG_HINT_ALPHA2]);
3840
3841 if (info->attrs[HWSIM_ATTR_REG_CUSTOM_REG]) {
3842 u32 idx = nla_get_u32(info->attrs[HWSIM_ATTR_REG_CUSTOM_REG]);
3843
3844 if (idx >= ARRAY_SIZE(hwsim_world_regdom_custom))
3845 return -EINVAL;
3846
3847 idx = array_index_nospec(idx,
3848 ARRAY_SIZE(hwsim_world_regdom_custom));
3849 param.regd = hwsim_world_regdom_custom[idx];
3850 }
3851
3852 if (info->attrs[HWSIM_ATTR_PERM_ADDR]) {
3853 if (!is_valid_ether_addr(
3854 nla_data(info->attrs[HWSIM_ATTR_PERM_ADDR]))) {
3855 GENL_SET_ERR_MSG(info,"MAC is no valid source addr");
3856 NL_SET_BAD_ATTR(info->extack,
3857 info->attrs[HWSIM_ATTR_PERM_ADDR]);
3858 return -EINVAL;
3859 }
3860
3861 param.perm_addr = nla_data(info->attrs[HWSIM_ATTR_PERM_ADDR]);
3862 }
3863
3864 if (info->attrs[HWSIM_ATTR_IFTYPE_SUPPORT]) {
3865 param.<