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