1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <linux/list.h>
17#include <linux/spinlock.h>
18#include <net/mac80211.h>
19#include <net/ieee80211_radiotap.h>
20#include <linux/if_arp.h>
21#include <linux/rtnetlink.h>
22#include <linux/etherdevice.h>
23#include <linux/debugfs.h>
24
25MODULE_AUTHOR("Jouni Malinen");
26MODULE_DESCRIPTION("Software simulator of 802.11 radio(s) for mac80211");
27MODULE_LICENSE("GPL");
28
29static int radios = 2;
30module_param(radios, int, 0444);
31MODULE_PARM_DESC(radios, "Number of simulated radios");
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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
90enum hwsim_regtest {
91 HWSIM_REGTEST_DISABLED = 0,
92 HWSIM_REGTEST_DRIVER_REG_FOLLOW = 1,
93 HWSIM_REGTEST_DRIVER_REG_ALL = 2,
94 HWSIM_REGTEST_DIFF_COUNTRY = 3,
95 HWSIM_REGTEST_WORLD_ROAM = 4,
96 HWSIM_REGTEST_CUSTOM_WORLD = 5,
97 HWSIM_REGTEST_CUSTOM_WORLD_2 = 6,
98 HWSIM_REGTEST_STRICT_FOLLOW = 7,
99 HWSIM_REGTEST_STRICT_ALL = 8,
100 HWSIM_REGTEST_STRICT_AND_DRIVER_REG = 9,
101 HWSIM_REGTEST_ALL = 10,
102};
103
104
105static int regtest = HWSIM_REGTEST_DISABLED;
106module_param(regtest, int, 0444);
107MODULE_PARM_DESC(regtest, "The type of regulatory test we want to run");
108
109static const char *hwsim_alpha2s[] = {
110 "FI",
111 "AL",
112 "US",
113 "DE",
114 "JP",
115 "AL",
116};
117
118static const struct ieee80211_regdomain hwsim_world_regdom_custom_01 = {
119 .n_reg_rules = 4,
120 .alpha2 = "99",
121 .reg_rules = {
122 REG_RULE(2412-10, 2462+10, 40, 0, 20, 0),
123 REG_RULE(2484-10, 2484+10, 40, 0, 20, 0),
124 REG_RULE(5150-10, 5240+10, 40, 0, 30, 0),
125 REG_RULE(5745-10, 5825+10, 40, 0, 30, 0),
126 }
127};
128
129static const struct ieee80211_regdomain hwsim_world_regdom_custom_02 = {
130 .n_reg_rules = 2,
131 .alpha2 = "99",
132 .reg_rules = {
133 REG_RULE(2412-10, 2462+10, 40, 0, 20, 0),
134 REG_RULE(5725-10, 5850+10, 40, 0, 30,
135 NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS),
136 }
137};
138
139struct hwsim_vif_priv {
140 u32 magic;
141 u8 bssid[ETH_ALEN];
142 bool assoc;
143 u16 aid;
144};
145
146#define HWSIM_VIF_MAGIC 0x69537748
147
148static inline void hwsim_check_magic(struct ieee80211_vif *vif)
149{
150 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
151 WARN_ON(vp->magic != HWSIM_VIF_MAGIC);
152}
153
154static inline void hwsim_set_magic(struct ieee80211_vif *vif)
155{
156 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
157 vp->magic = HWSIM_VIF_MAGIC;
158}
159
160static inline void hwsim_clear_magic(struct ieee80211_vif *vif)
161{
162 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
163 vp->magic = 0;
164}
165
166struct hwsim_sta_priv {
167 u32 magic;
168};
169
170#define HWSIM_STA_MAGIC 0x6d537748
171
172static inline void hwsim_check_sta_magic(struct ieee80211_sta *sta)
173{
174 struct hwsim_sta_priv *sp = (void *)sta->drv_priv;
175 WARN_ON(sp->magic != HWSIM_STA_MAGIC);
176}
177
178static inline void hwsim_set_sta_magic(struct ieee80211_sta *sta)
179{
180 struct hwsim_sta_priv *sp = (void *)sta->drv_priv;
181 sp->magic = HWSIM_STA_MAGIC;
182}
183
184static inline void hwsim_clear_sta_magic(struct ieee80211_sta *sta)
185{
186 struct hwsim_sta_priv *sp = (void *)sta->drv_priv;
187 sp->magic = 0;
188}
189
190static struct class *hwsim_class;
191
192static struct net_device *hwsim_mon;
193
194#define CHAN2G(_freq) { \
195 .band = IEEE80211_BAND_2GHZ, \
196 .center_freq = (_freq), \
197 .hw_value = (_freq), \
198 .max_power = 20, \
199}
200
201#define CHAN5G(_freq) { \
202 .band = IEEE80211_BAND_5GHZ, \
203 .center_freq = (_freq), \
204 .hw_value = (_freq), \
205 .max_power = 20, \
206}
207
208static const struct ieee80211_channel hwsim_channels_2ghz[] = {
209 CHAN2G(2412),
210 CHAN2G(2417),
211 CHAN2G(2422),
212 CHAN2G(2427),
213 CHAN2G(2432),
214 CHAN2G(2437),
215 CHAN2G(2442),
216 CHAN2G(2447),
217 CHAN2G(2452),
218 CHAN2G(2457),
219 CHAN2G(2462),
220 CHAN2G(2467),
221 CHAN2G(2472),
222 CHAN2G(2484),
223};
224
225static const struct ieee80211_channel hwsim_channels_5ghz[] = {
226 CHAN5G(5180),
227 CHAN5G(5200),
228 CHAN5G(5220),
229 CHAN5G(5240),
230
231 CHAN5G(5260),
232 CHAN5G(5280),
233 CHAN5G(5300),
234 CHAN5G(5320),
235
236 CHAN5G(5500),
237 CHAN5G(5520),
238 CHAN5G(5540),
239 CHAN5G(5560),
240 CHAN5G(5580),
241 CHAN5G(5600),
242 CHAN5G(5620),
243 CHAN5G(5640),
244 CHAN5G(5660),
245 CHAN5G(5680),
246 CHAN5G(5700),
247
248 CHAN5G(5745),
249 CHAN5G(5765),
250 CHAN5G(5785),
251 CHAN5G(5805),
252 CHAN5G(5825),
253};
254
255static const struct ieee80211_rate hwsim_rates[] = {
256 { .bitrate = 10 },
257 { .bitrate = 20, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
258 { .bitrate = 55, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
259 { .bitrate = 110, .flags = IEEE80211_RATE_SHORT_PREAMBLE },
260 { .bitrate = 60 },
261 { .bitrate = 90 },
262 { .bitrate = 120 },
263 { .bitrate = 180 },
264 { .bitrate = 240 },
265 { .bitrate = 360 },
266 { .bitrate = 480 },
267 { .bitrate = 540 }
268};
269
270static spinlock_t hwsim_radio_lock;
271static struct list_head hwsim_radios;
272
273struct mac80211_hwsim_data {
274 struct list_head list;
275 struct ieee80211_hw *hw;
276 struct device *dev;
277 struct ieee80211_supported_band bands[2];
278 struct ieee80211_channel channels_2ghz[ARRAY_SIZE(hwsim_channels_2ghz)];
279 struct ieee80211_channel channels_5ghz[ARRAY_SIZE(hwsim_channels_5ghz)];
280 struct ieee80211_rate rates[ARRAY_SIZE(hwsim_rates)];
281
282 struct ieee80211_channel *channel;
283 int radio_enabled;
284 unsigned long beacon_int;
285 unsigned int rx_filter;
286 int started;
287 struct timer_list beacon_timer;
288 enum ps_mode {
289 PS_DISABLED, PS_ENABLED, PS_AUTO_POLL, PS_MANUAL_POLL
290 } ps;
291 bool ps_poll_pending;
292 struct dentry *debugfs;
293 struct dentry *debugfs_ps;
294};
295
296
297struct hwsim_radiotap_hdr {
298 struct ieee80211_radiotap_header hdr;
299 u8 rt_flags;
300 u8 rt_rate;
301 __le16 rt_channel;
302 __le16 rt_chbitmask;
303} __attribute__ ((packed));
304
305
306static int hwsim_mon_xmit(struct sk_buff *skb, struct net_device *dev)
307{
308
309 dev_kfree_skb(skb);
310 return 0;
311}
312
313
314static void mac80211_hwsim_monitor_rx(struct ieee80211_hw *hw,
315 struct sk_buff *tx_skb)
316{
317 struct mac80211_hwsim_data *data = hw->priv;
318 struct sk_buff *skb;
319 struct hwsim_radiotap_hdr *hdr;
320 u16 flags;
321 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_skb);
322 struct ieee80211_rate *txrate = ieee80211_get_tx_rate(hw, info);
323
324 if (!netif_running(hwsim_mon))
325 return;
326
327 skb = skb_copy_expand(tx_skb, sizeof(*hdr), 0, GFP_ATOMIC);
328 if (skb == NULL)
329 return;
330
331 hdr = (struct hwsim_radiotap_hdr *) skb_push(skb, sizeof(*hdr));
332 hdr->hdr.it_version = PKTHDR_RADIOTAP_VERSION;
333 hdr->hdr.it_pad = 0;
334 hdr->hdr.it_len = cpu_to_le16(sizeof(*hdr));
335 hdr->hdr.it_present = cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) |
336 (1 << IEEE80211_RADIOTAP_RATE) |
337 (1 << IEEE80211_RADIOTAP_CHANNEL));
338 hdr->rt_flags = 0;
339 hdr->rt_rate = txrate->bitrate / 5;
340 hdr->rt_channel = cpu_to_le16(data->channel->center_freq);
341 flags = IEEE80211_CHAN_2GHZ;
342 if (txrate->flags & IEEE80211_RATE_ERP_G)
343 flags |= IEEE80211_CHAN_OFDM;
344 else
345 flags |= IEEE80211_CHAN_CCK;
346 hdr->rt_chbitmask = cpu_to_le16(flags);
347
348 skb->dev = hwsim_mon;
349 skb_set_mac_header(skb, 0);
350 skb->ip_summed = CHECKSUM_UNNECESSARY;
351 skb->pkt_type = PACKET_OTHERHOST;
352 skb->protocol = htons(ETH_P_802_2);
353 memset(skb->cb, 0, sizeof(skb->cb));
354 netif_rx(skb);
355}
356
357
358static bool hwsim_ps_rx_ok(struct mac80211_hwsim_data *data,
359 struct sk_buff *skb)
360{
361 switch (data->ps) {
362 case PS_DISABLED:
363 return true;
364 case PS_ENABLED:
365 return false;
366 case PS_AUTO_POLL:
367
368
369 return true;
370 case PS_MANUAL_POLL:
371
372
373 if (data->ps_poll_pending &&
374 memcmp(data->hw->wiphy->perm_addr, skb->data + 4,
375 ETH_ALEN) == 0) {
376 data->ps_poll_pending = false;
377 return true;
378 }
379 return false;
380 }
381
382 return true;
383}
384
385
386static bool mac80211_hwsim_tx_frame(struct ieee80211_hw *hw,
387 struct sk_buff *skb)
388{
389 struct mac80211_hwsim_data *data = hw->priv, *data2;
390 bool ack = false;
391 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
392 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
393 struct ieee80211_rx_status rx_status;
394
395 memset(&rx_status, 0, sizeof(rx_status));
396
397 rx_status.freq = data->channel->center_freq;
398 rx_status.band = data->channel->band;
399 rx_status.rate_idx = info->control.rates[0].idx;
400
401
402 if (data->ps != PS_DISABLED)
403 hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
404
405
406 spin_lock(&hwsim_radio_lock);
407 list_for_each_entry(data2, &hwsim_radios, list) {
408 struct sk_buff *nskb;
409
410 if (data == data2)
411 continue;
412
413 if (!data2->started || !data2->radio_enabled ||
414 !hwsim_ps_rx_ok(data2, skb) ||
415 data->channel->center_freq != data2->channel->center_freq)
416 continue;
417
418 nskb = skb_copy(skb, GFP_ATOMIC);
419 if (nskb == NULL)
420 continue;
421
422 if (memcmp(hdr->addr1, data2->hw->wiphy->perm_addr,
423 ETH_ALEN) == 0)
424 ack = true;
425 ieee80211_rx_irqsafe(data2->hw, nskb, &rx_status);
426 }
427 spin_unlock(&hwsim_radio_lock);
428
429 return ack;
430}
431
432
433static int mac80211_hwsim_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
434{
435 struct mac80211_hwsim_data *data = hw->priv;
436 bool ack;
437 struct ieee80211_tx_info *txi;
438
439 mac80211_hwsim_monitor_rx(hw, skb);
440
441 if (skb->len < 10) {
442
443 dev_kfree_skb(skb);
444 return NETDEV_TX_OK;
445 }
446
447 if (!data->radio_enabled) {
448 printk(KERN_DEBUG "%s: dropped TX frame since radio "
449 "disabled\n", wiphy_name(hw->wiphy));
450 dev_kfree_skb(skb);
451 return NETDEV_TX_OK;
452 }
453
454 ack = mac80211_hwsim_tx_frame(hw, skb);
455
456 txi = IEEE80211_SKB_CB(skb);
457
458 if (txi->control.vif)
459 hwsim_check_magic(txi->control.vif);
460 if (txi->control.sta)
461 hwsim_check_sta_magic(txi->control.sta);
462
463 ieee80211_tx_info_clear_status(txi);
464 if (!(txi->flags & IEEE80211_TX_CTL_NO_ACK) && ack)
465 txi->flags |= IEEE80211_TX_STAT_ACK;
466 ieee80211_tx_status_irqsafe(hw, skb);
467 return NETDEV_TX_OK;
468}
469
470
471static int mac80211_hwsim_start(struct ieee80211_hw *hw)
472{
473 struct mac80211_hwsim_data *data = hw->priv;
474 printk(KERN_DEBUG "%s:%s\n", wiphy_name(hw->wiphy), __func__);
475 data->started = 1;
476 return 0;
477}
478
479
480static void mac80211_hwsim_stop(struct ieee80211_hw *hw)
481{
482 struct mac80211_hwsim_data *data = hw->priv;
483 data->started = 0;
484 del_timer(&data->beacon_timer);
485 printk(KERN_DEBUG "%s:%s\n", wiphy_name(hw->wiphy), __func__);
486}
487
488
489static int mac80211_hwsim_add_interface(struct ieee80211_hw *hw,
490 struct ieee80211_if_init_conf *conf)
491{
492 printk(KERN_DEBUG "%s:%s (type=%d mac_addr=%pM)\n",
493 wiphy_name(hw->wiphy), __func__, conf->type,
494 conf->mac_addr);
495 hwsim_set_magic(conf->vif);
496 return 0;
497}
498
499
500static void mac80211_hwsim_remove_interface(
501 struct ieee80211_hw *hw, struct ieee80211_if_init_conf *conf)
502{
503 printk(KERN_DEBUG "%s:%s (type=%d mac_addr=%pM)\n",
504 wiphy_name(hw->wiphy), __func__, conf->type,
505 conf->mac_addr);
506 hwsim_check_magic(conf->vif);
507 hwsim_clear_magic(conf->vif);
508}
509
510
511static void mac80211_hwsim_beacon_tx(void *arg, u8 *mac,
512 struct ieee80211_vif *vif)
513{
514 struct ieee80211_hw *hw = arg;
515 struct sk_buff *skb;
516 struct ieee80211_tx_info *info;
517
518 hwsim_check_magic(vif);
519
520 if (vif->type != NL80211_IFTYPE_AP &&
521 vif->type != NL80211_IFTYPE_MESH_POINT)
522 return;
523
524 skb = ieee80211_beacon_get(hw, vif);
525 if (skb == NULL)
526 return;
527 info = IEEE80211_SKB_CB(skb);
528
529 mac80211_hwsim_monitor_rx(hw, skb);
530 mac80211_hwsim_tx_frame(hw, skb);
531 dev_kfree_skb(skb);
532}
533
534
535static void mac80211_hwsim_beacon(unsigned long arg)
536{
537 struct ieee80211_hw *hw = (struct ieee80211_hw *) arg;
538 struct mac80211_hwsim_data *data = hw->priv;
539
540 if (!data->started || !data->radio_enabled)
541 return;
542
543 ieee80211_iterate_active_interfaces_atomic(
544 hw, mac80211_hwsim_beacon_tx, hw);
545
546 data->beacon_timer.expires = jiffies + data->beacon_int;
547 add_timer(&data->beacon_timer);
548}
549
550
551static int mac80211_hwsim_config(struct ieee80211_hw *hw, u32 changed)
552{
553 struct mac80211_hwsim_data *data = hw->priv;
554 struct ieee80211_conf *conf = &hw->conf;
555
556 printk(KERN_DEBUG "%s:%s (freq=%d radio_enabled=%d beacon_int=%d)\n",
557 wiphy_name(hw->wiphy), __func__,
558 conf->channel->center_freq, conf->radio_enabled,
559 conf->beacon_int);
560
561 data->channel = conf->channel;
562 data->radio_enabled = conf->radio_enabled;
563 data->beacon_int = 1024 * conf->beacon_int / 1000 * HZ / 1000;
564 if (data->beacon_int < 1)
565 data->beacon_int = 1;
566
567 if (!data->started || !data->radio_enabled)
568 del_timer(&data->beacon_timer);
569 else
570 mod_timer(&data->beacon_timer, jiffies + data->beacon_int);
571
572 return 0;
573}
574
575
576static void mac80211_hwsim_configure_filter(struct ieee80211_hw *hw,
577 unsigned int changed_flags,
578 unsigned int *total_flags,
579 int mc_count,
580 struct dev_addr_list *mc_list)
581{
582 struct mac80211_hwsim_data *data = hw->priv;
583
584 printk(KERN_DEBUG "%s:%s\n", wiphy_name(hw->wiphy), __func__);
585
586 data->rx_filter = 0;
587 if (*total_flags & FIF_PROMISC_IN_BSS)
588 data->rx_filter |= FIF_PROMISC_IN_BSS;
589 if (*total_flags & FIF_ALLMULTI)
590 data->rx_filter |= FIF_ALLMULTI;
591
592 *total_flags = data->rx_filter;
593}
594
595static int mac80211_hwsim_config_interface(struct ieee80211_hw *hw,
596 struct ieee80211_vif *vif,
597 struct ieee80211_if_conf *conf)
598{
599 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
600
601 hwsim_check_magic(vif);
602 if (conf->changed & IEEE80211_IFCC_BSSID) {
603 DECLARE_MAC_BUF(mac);
604 printk(KERN_DEBUG "%s:%s: BSSID changed: %pM\n",
605 wiphy_name(hw->wiphy), __func__,
606 conf->bssid);
607 memcpy(vp->bssid, conf->bssid, ETH_ALEN);
608 }
609 return 0;
610}
611
612static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw,
613 struct ieee80211_vif *vif,
614 struct ieee80211_bss_conf *info,
615 u32 changed)
616{
617 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
618
619 hwsim_check_magic(vif);
620
621 printk(KERN_DEBUG "%s:%s(changed=0x%x)\n",
622 wiphy_name(hw->wiphy), __func__, changed);
623
624 if (changed & BSS_CHANGED_ASSOC) {
625 printk(KERN_DEBUG " %s: ASSOC: assoc=%d aid=%d\n",
626 wiphy_name(hw->wiphy), info->assoc, info->aid);
627 vp->assoc = info->assoc;
628 vp->aid = info->aid;
629 }
630
631 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
632 printk(KERN_DEBUG " %s: ERP_CTS_PROT: %d\n",
633 wiphy_name(hw->wiphy), info->use_cts_prot);
634 }
635
636 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
637 printk(KERN_DEBUG " %s: ERP_PREAMBLE: %d\n",
638 wiphy_name(hw->wiphy), info->use_short_preamble);
639 }
640
641 if (changed & BSS_CHANGED_ERP_SLOT) {
642 printk(KERN_DEBUG " %s: ERP_SLOT: %d\n",
643 wiphy_name(hw->wiphy), info->use_short_slot);
644 }
645
646 if (changed & BSS_CHANGED_HT) {
647 printk(KERN_DEBUG " %s: HT: op_mode=0x%x\n",
648 wiphy_name(hw->wiphy),
649 info->ht.operation_mode);
650 }
651
652 if (changed & BSS_CHANGED_BASIC_RATES) {
653 printk(KERN_DEBUG " %s: BASIC_RATES: 0x%llx\n",
654 wiphy_name(hw->wiphy),
655 (unsigned long long) info->basic_rates);
656 }
657}
658
659static void mac80211_hwsim_sta_notify(struct ieee80211_hw *hw,
660 struct ieee80211_vif *vif,
661 enum sta_notify_cmd cmd,
662 struct ieee80211_sta *sta)
663{
664 hwsim_check_magic(vif);
665 switch (cmd) {
666 case STA_NOTIFY_ADD:
667 hwsim_set_sta_magic(sta);
668 break;
669 case STA_NOTIFY_REMOVE:
670 hwsim_clear_sta_magic(sta);
671 break;
672 case STA_NOTIFY_SLEEP:
673 case STA_NOTIFY_AWAKE:
674
675 break;
676 }
677}
678
679static int mac80211_hwsim_set_tim(struct ieee80211_hw *hw,
680 struct ieee80211_sta *sta,
681 bool set)
682{
683 hwsim_check_sta_magic(sta);
684 return 0;
685}
686
687static int mac80211_hwsim_conf_tx(
688 struct ieee80211_hw *hw, u16 queue,
689 const struct ieee80211_tx_queue_params *params)
690{
691 printk(KERN_DEBUG "%s:%s (queue=%d txop=%d cw_min=%d cw_max=%d "
692 "aifs=%d)\n",
693 wiphy_name(hw->wiphy), __func__, queue,
694 params->txop, params->cw_min, params->cw_max, params->aifs);
695 return 0;
696}
697
698static const struct ieee80211_ops mac80211_hwsim_ops =
699{
700 .tx = mac80211_hwsim_tx,
701 .start = mac80211_hwsim_start,
702 .stop = mac80211_hwsim_stop,
703 .add_interface = mac80211_hwsim_add_interface,
704 .remove_interface = mac80211_hwsim_remove_interface,
705 .config = mac80211_hwsim_config,
706 .configure_filter = mac80211_hwsim_configure_filter,
707 .config_interface = mac80211_hwsim_config_interface,
708 .bss_info_changed = mac80211_hwsim_bss_info_changed,
709 .sta_notify = mac80211_hwsim_sta_notify,
710 .set_tim = mac80211_hwsim_set_tim,
711 .conf_tx = mac80211_hwsim_conf_tx,
712};
713
714
715static void mac80211_hwsim_free(void)
716{
717 struct list_head tmplist, *i, *tmp;
718 struct mac80211_hwsim_data *data;
719
720 INIT_LIST_HEAD(&tmplist);
721
722 spin_lock_bh(&hwsim_radio_lock);
723 list_for_each_safe(i, tmp, &hwsim_radios)
724 list_move(i, &tmplist);
725 spin_unlock_bh(&hwsim_radio_lock);
726
727 list_for_each_entry(data, &tmplist, list) {
728 debugfs_remove(data->debugfs_ps);
729 debugfs_remove(data->debugfs);
730 ieee80211_unregister_hw(data->hw);
731 device_unregister(data->dev);
732 ieee80211_free_hw(data->hw);
733 }
734 class_destroy(hwsim_class);
735}
736
737
738static struct device_driver mac80211_hwsim_driver = {
739 .name = "mac80211_hwsim"
740};
741
742static const struct net_device_ops hwsim_netdev_ops = {
743 .ndo_start_xmit = hwsim_mon_xmit,
744 .ndo_change_mtu = eth_change_mtu,
745 .ndo_set_mac_address = eth_mac_addr,
746 .ndo_validate_addr = eth_validate_addr,
747};
748
749static void hwsim_mon_setup(struct net_device *dev)
750{
751 dev->netdev_ops = &hwsim_netdev_ops;
752 dev->destructor = free_netdev;
753 ether_setup(dev);
754 dev->tx_queue_len = 0;
755 dev->type = ARPHRD_IEEE80211_RADIOTAP;
756 memset(dev->dev_addr, 0, ETH_ALEN);
757 dev->dev_addr[0] = 0x12;
758}
759
760
761static void hwsim_send_ps_poll(void *dat, u8 *mac, struct ieee80211_vif *vif)
762{
763 struct mac80211_hwsim_data *data = dat;
764 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
765 DECLARE_MAC_BUF(buf);
766 struct sk_buff *skb;
767 struct ieee80211_pspoll *pspoll;
768
769 if (!vp->assoc)
770 return;
771
772 printk(KERN_DEBUG "%s:%s: send PS-Poll to %pM for aid %d\n",
773 wiphy_name(data->hw->wiphy), __func__, vp->bssid, vp->aid);
774
775 skb = dev_alloc_skb(sizeof(*pspoll));
776 if (!skb)
777 return;
778 pspoll = (void *) skb_put(skb, sizeof(*pspoll));
779 pspoll->frame_control = cpu_to_le16(IEEE80211_FTYPE_CTL |
780 IEEE80211_STYPE_PSPOLL |
781 IEEE80211_FCTL_PM);
782 pspoll->aid = cpu_to_le16(0xc000 | vp->aid);
783 memcpy(pspoll->bssid, vp->bssid, ETH_ALEN);
784 memcpy(pspoll->ta, mac, ETH_ALEN);
785 if (data->radio_enabled &&
786 !mac80211_hwsim_tx_frame(data->hw, skb))
787 printk(KERN_DEBUG "%s: PS-Poll frame not ack'ed\n", __func__);
788 dev_kfree_skb(skb);
789}
790
791
792static void hwsim_send_nullfunc(struct mac80211_hwsim_data *data, u8 *mac,
793 struct ieee80211_vif *vif, int ps)
794{
795 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
796 DECLARE_MAC_BUF(buf);
797 struct sk_buff *skb;
798 struct ieee80211_hdr *hdr;
799
800 if (!vp->assoc)
801 return;
802
803 printk(KERN_DEBUG "%s:%s: send data::nullfunc to %pM ps=%d\n",
804 wiphy_name(data->hw->wiphy), __func__, vp->bssid, ps);
805
806 skb = dev_alloc_skb(sizeof(*hdr));
807 if (!skb)
808 return;
809 hdr = (void *) skb_put(skb, sizeof(*hdr) - ETH_ALEN);
810 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA |
811 IEEE80211_STYPE_NULLFUNC |
812 (ps ? IEEE80211_FCTL_PM : 0));
813 hdr->duration_id = cpu_to_le16(0);
814 memcpy(hdr->addr1, vp->bssid, ETH_ALEN);
815 memcpy(hdr->addr2, mac, ETH_ALEN);
816 memcpy(hdr->addr3, vp->bssid, ETH_ALEN);
817 if (data->radio_enabled &&
818 !mac80211_hwsim_tx_frame(data->hw, skb))
819 printk(KERN_DEBUG "%s: nullfunc frame not ack'ed\n", __func__);
820 dev_kfree_skb(skb);
821}
822
823
824static void hwsim_send_nullfunc_ps(void *dat, u8 *mac,
825 struct ieee80211_vif *vif)
826{
827 struct mac80211_hwsim_data *data = dat;
828 hwsim_send_nullfunc(data, mac, vif, 1);
829}
830
831
832static void hwsim_send_nullfunc_no_ps(void *dat, u8 *mac,
833 struct ieee80211_vif *vif)
834{
835 struct mac80211_hwsim_data *data = dat;
836 hwsim_send_nullfunc(data, mac, vif, 0);
837}
838
839
840static int hwsim_fops_ps_read(void *dat, u64 *val)
841{
842 struct mac80211_hwsim_data *data = dat;
843 *val = data->ps;
844 return 0;
845}
846
847static int hwsim_fops_ps_write(void *dat, u64 val)
848{
849 struct mac80211_hwsim_data *data = dat;
850 enum ps_mode old_ps;
851
852 if (val != PS_DISABLED && val != PS_ENABLED && val != PS_AUTO_POLL &&
853 val != PS_MANUAL_POLL)
854 return -EINVAL;
855
856 old_ps = data->ps;
857 data->ps = val;
858
859 if (val == PS_MANUAL_POLL) {
860 ieee80211_iterate_active_interfaces(data->hw,
861 hwsim_send_ps_poll, data);
862 data->ps_poll_pending = true;
863 } else if (old_ps == PS_DISABLED && val != PS_DISABLED) {
864 ieee80211_iterate_active_interfaces(data->hw,
865 hwsim_send_nullfunc_ps,
866 data);
867 } else if (old_ps != PS_DISABLED && val == PS_DISABLED) {
868 ieee80211_iterate_active_interfaces(data->hw,
869 hwsim_send_nullfunc_no_ps,
870 data);
871 }
872
873 return 0;
874}
875
876DEFINE_SIMPLE_ATTRIBUTE(hwsim_fops_ps, hwsim_fops_ps_read, hwsim_fops_ps_write,
877 "%llu\n");
878
879
880static int __init init_mac80211_hwsim(void)
881{
882 int i, err = 0;
883 u8 addr[ETH_ALEN];
884 struct mac80211_hwsim_data *data;
885 struct ieee80211_hw *hw;
886 enum ieee80211_band band;
887
888 if (radios < 1 || radios > 100)
889 return -EINVAL;
890
891 spin_lock_init(&hwsim_radio_lock);
892 INIT_LIST_HEAD(&hwsim_radios);
893
894 hwsim_class = class_create(THIS_MODULE, "mac80211_hwsim");
895 if (IS_ERR(hwsim_class))
896 return PTR_ERR(hwsim_class);
897
898 memset(addr, 0, ETH_ALEN);
899 addr[0] = 0x02;
900
901 for (i = 0; i < radios; i++) {
902 printk(KERN_DEBUG "mac80211_hwsim: Initializing radio %d\n",
903 i);
904 hw = ieee80211_alloc_hw(sizeof(*data), &mac80211_hwsim_ops);
905 if (!hw) {
906 printk(KERN_DEBUG "mac80211_hwsim: ieee80211_alloc_hw "
907 "failed\n");
908 err = -ENOMEM;
909 goto failed;
910 }
911 data = hw->priv;
912 data->hw = hw;
913
914 data->dev = device_create(hwsim_class, NULL, 0, hw,
915 "hwsim%d", i);
916 if (IS_ERR(data->dev)) {
917 printk(KERN_DEBUG
918 "mac80211_hwsim: device_create "
919 "failed (%ld)\n", PTR_ERR(data->dev));
920 err = -ENOMEM;
921 goto failed_drvdata;
922 }
923 data->dev->driver = &mac80211_hwsim_driver;
924
925 SET_IEEE80211_DEV(hw, data->dev);
926 addr[3] = i >> 8;
927 addr[4] = i;
928 SET_IEEE80211_PERM_ADDR(hw, addr);
929
930 hw->channel_change_time = 1;
931 hw->queues = 4;
932 hw->wiphy->interface_modes =
933 BIT(NL80211_IFTYPE_STATION) |
934 BIT(NL80211_IFTYPE_AP) |
935 BIT(NL80211_IFTYPE_MESH_POINT);
936
937 hw->flags = IEEE80211_HW_MFP_CAPABLE;
938
939
940 hw->vif_data_size = sizeof(struct hwsim_vif_priv);
941 hw->sta_data_size = sizeof(struct hwsim_sta_priv);
942
943 memcpy(data->channels_2ghz, hwsim_channels_2ghz,
944 sizeof(hwsim_channels_2ghz));
945 memcpy(data->channels_5ghz, hwsim_channels_5ghz,
946 sizeof(hwsim_channels_5ghz));
947 memcpy(data->rates, hwsim_rates, sizeof(hwsim_rates));
948
949 for (band = IEEE80211_BAND_2GHZ; band < IEEE80211_NUM_BANDS; band++) {
950 struct ieee80211_supported_band *sband = &data->bands[band];
951 switch (band) {
952 case IEEE80211_BAND_2GHZ:
953 sband->channels = data->channels_2ghz;
954 sband->n_channels =
955 ARRAY_SIZE(hwsim_channels_2ghz);
956 break;
957 case IEEE80211_BAND_5GHZ:
958 sband->channels = data->channels_5ghz;
959 sband->n_channels =
960 ARRAY_SIZE(hwsim_channels_5ghz);
961 break;
962 default:
963 break;
964 }
965
966 sband->bitrates = data->rates;
967 sband->n_bitrates = ARRAY_SIZE(hwsim_rates);
968
969 sband->ht_cap.ht_supported = true;
970 sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
971 IEEE80211_HT_CAP_GRN_FLD |
972 IEEE80211_HT_CAP_SGI_40 |
973 IEEE80211_HT_CAP_DSSSCCK40;
974 sband->ht_cap.ampdu_factor = 0x3;
975 sband->ht_cap.ampdu_density = 0x6;
976 memset(&sband->ht_cap.mcs, 0,
977 sizeof(sband->ht_cap.mcs));
978 sband->ht_cap.mcs.rx_mask[0] = 0xff;
979 sband->ht_cap.mcs.rx_mask[1] = 0xff;
980 sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
981
982 hw->wiphy->bands[band] = sband;
983 }
984
985
986 switch (regtest) {
987 case HWSIM_REGTEST_DISABLED:
988 case HWSIM_REGTEST_DRIVER_REG_FOLLOW:
989 case HWSIM_REGTEST_DRIVER_REG_ALL:
990 case HWSIM_REGTEST_DIFF_COUNTRY:
991
992
993
994
995 break;
996 case HWSIM_REGTEST_WORLD_ROAM:
997 if (i == 0) {
998 hw->wiphy->custom_regulatory = true;
999 wiphy_apply_custom_regulatory(hw->wiphy,
1000 &hwsim_world_regdom_custom_01);
1001 }
1002 break;
1003 case HWSIM_REGTEST_CUSTOM_WORLD:
1004 hw->wiphy->custom_regulatory = true;
1005 wiphy_apply_custom_regulatory(hw->wiphy,
1006 &hwsim_world_regdom_custom_01);
1007 break;
1008 case HWSIM_REGTEST_CUSTOM_WORLD_2:
1009 if (i == 0) {
1010 hw->wiphy->custom_regulatory = true;
1011 wiphy_apply_custom_regulatory(hw->wiphy,
1012 &hwsim_world_regdom_custom_01);
1013 } else if (i == 1) {
1014 hw->wiphy->custom_regulatory = true;
1015 wiphy_apply_custom_regulatory(hw->wiphy,
1016 &hwsim_world_regdom_custom_02);
1017 }
1018 break;
1019 case HWSIM_REGTEST_STRICT_ALL:
1020 hw->wiphy->strict_regulatory = true;
1021 break;
1022 case HWSIM_REGTEST_STRICT_FOLLOW:
1023 case HWSIM_REGTEST_STRICT_AND_DRIVER_REG:
1024 if (i == 0)
1025 hw->wiphy->strict_regulatory = true;
1026 break;
1027 case HWSIM_REGTEST_ALL:
1028 if (i == 0) {
1029 hw->wiphy->custom_regulatory = true;
1030 wiphy_apply_custom_regulatory(hw->wiphy,
1031 &hwsim_world_regdom_custom_01);
1032 } else if (i == 1) {
1033 hw->wiphy->custom_regulatory = true;
1034 wiphy_apply_custom_regulatory(hw->wiphy,
1035 &hwsim_world_regdom_custom_02);
1036 } else if (i == 4)
1037 hw->wiphy->strict_regulatory = true;
1038 break;
1039 default:
1040 break;
1041 }
1042
1043
1044 if (regtest)
1045 schedule_timeout_interruptible(1);
1046 err = ieee80211_register_hw(hw);
1047 if (err < 0) {
1048 printk(KERN_DEBUG "mac80211_hwsim: "
1049 "ieee80211_register_hw failed (%d)\n", err);
1050 goto failed_hw;
1051 }
1052
1053
1054 switch (regtest) {
1055 case HWSIM_REGTEST_WORLD_ROAM:
1056 case HWSIM_REGTEST_DISABLED:
1057 break;
1058 case HWSIM_REGTEST_DRIVER_REG_FOLLOW:
1059 if (!i)
1060 regulatory_hint(hw->wiphy, hwsim_alpha2s[0]);
1061 break;
1062 case HWSIM_REGTEST_DRIVER_REG_ALL:
1063 case HWSIM_REGTEST_STRICT_ALL:
1064 regulatory_hint(hw->wiphy, hwsim_alpha2s[0]);
1065 break;
1066 case HWSIM_REGTEST_DIFF_COUNTRY:
1067 if (i < ARRAY_SIZE(hwsim_alpha2s))
1068 regulatory_hint(hw->wiphy, hwsim_alpha2s[i]);
1069 break;
1070 case HWSIM_REGTEST_CUSTOM_WORLD:
1071 case HWSIM_REGTEST_CUSTOM_WORLD_2:
1072
1073
1074
1075
1076 break;
1077 case HWSIM_REGTEST_STRICT_FOLLOW:
1078 if (i == 0)
1079 regulatory_hint(hw->wiphy, hwsim_alpha2s[0]);
1080 break;
1081 case HWSIM_REGTEST_STRICT_AND_DRIVER_REG:
1082 if (i == 0)
1083 regulatory_hint(hw->wiphy, hwsim_alpha2s[0]);
1084 else if (i == 1)
1085 regulatory_hint(hw->wiphy, hwsim_alpha2s[1]);
1086 break;
1087 case HWSIM_REGTEST_ALL:
1088 if (i == 2)
1089 regulatory_hint(hw->wiphy, hwsim_alpha2s[0]);
1090 else if (i == 3)
1091 regulatory_hint(hw->wiphy, hwsim_alpha2s[1]);
1092 else if (i == 4)
1093 regulatory_hint(hw->wiphy, hwsim_alpha2s[2]);
1094 break;
1095 default:
1096 break;
1097 }
1098
1099 printk(KERN_DEBUG "%s: hwaddr %pM registered\n",
1100 wiphy_name(hw->wiphy),
1101 hw->wiphy->perm_addr);
1102
1103 data->debugfs = debugfs_create_dir("hwsim",
1104 hw->wiphy->debugfsdir);
1105 data->debugfs_ps = debugfs_create_file("ps", 0666,
1106 data->debugfs, data,
1107 &hwsim_fops_ps);
1108
1109 setup_timer(&data->beacon_timer, mac80211_hwsim_beacon,
1110 (unsigned long) hw);
1111
1112 list_add_tail(&data->list, &hwsim_radios);
1113 }
1114
1115 hwsim_mon = alloc_netdev(0, "hwsim%d", hwsim_mon_setup);
1116 if (hwsim_mon == NULL)
1117 goto failed;
1118
1119 rtnl_lock();
1120
1121 err = dev_alloc_name(hwsim_mon, hwsim_mon->name);
1122 if (err < 0)
1123 goto failed_mon;
1124
1125
1126 err = register_netdevice(hwsim_mon);
1127 if (err < 0)
1128 goto failed_mon;
1129
1130 rtnl_unlock();
1131
1132 return 0;
1133
1134failed_mon:
1135 rtnl_unlock();
1136 free_netdev(hwsim_mon);
1137 mac80211_hwsim_free();
1138 return err;
1139
1140failed_hw:
1141 device_unregister(data->dev);
1142failed_drvdata:
1143 ieee80211_free_hw(hw);
1144failed:
1145 mac80211_hwsim_free();
1146 return err;
1147}
1148
1149
1150static void __exit exit_mac80211_hwsim(void)
1151{
1152 printk(KERN_DEBUG "mac80211_hwsim: unregister radios\n");
1153
1154 unregister_netdev(hwsim_mon);
1155 mac80211_hwsim_free();
1156}
1157
1158
1159module_init(init_mac80211_hwsim);
1160module_exit(exit_mac80211_hwsim);
1161