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