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