2 * mac80211_hwsim - software simulator of 802.11 radio(s) for mac80211
3 * Copyright (c) 2008, Jouni Malinen <j@w1.fi>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
12 * - IBSS mode simulation (Beacon transmission with competition for "air time")
13 * - IEEE 802.11a and 802.11n modes
14 * - RX filtering based on filter configuration (data->rx_filter)
17 #include <linux/list.h>
18 #include <linux/spinlock.h>
19 #include <net/mac80211.h>
20 #include <net/ieee80211_radiotap.h>
21 #include <linux/if_arp.h>
22 #include <linux/rtnetlink.h>
23 #include <linux/etherdevice.h>
25 MODULE_AUTHOR("Jouni Malinen");
26 MODULE_DESCRIPTION("Software simulator of 802.11 radio(s) for mac80211");
27 MODULE_LICENSE("GPL");
29 static int radios
= 2;
30 module_param(radios
, int, 0444);
31 MODULE_PARM_DESC(radios
, "Number of simulated radios");
33 struct hwsim_vif_priv
{
37 #define HWSIM_VIF_MAGIC 0x69537748
39 static inline void hwsim_check_magic(struct ieee80211_vif
*vif
)
41 struct hwsim_vif_priv
*vp
= (void *)vif
->drv_priv
;
42 WARN_ON(vp
->magic
!= HWSIM_VIF_MAGIC
);
45 static inline void hwsim_set_magic(struct ieee80211_vif
*vif
)
47 struct hwsim_vif_priv
*vp
= (void *)vif
->drv_priv
;
48 vp
->magic
= HWSIM_VIF_MAGIC
;
51 static inline void hwsim_clear_magic(struct ieee80211_vif
*vif
)
53 struct hwsim_vif_priv
*vp
= (void *)vif
->drv_priv
;
57 struct hwsim_sta_priv
{
61 #define HWSIM_STA_MAGIC 0x6d537748
63 static inline void hwsim_check_sta_magic(struct ieee80211_sta
*sta
)
65 struct hwsim_sta_priv
*sp
= (void *)sta
->drv_priv
;
66 WARN_ON(sp
->magic
!= HWSIM_STA_MAGIC
);
69 static inline void hwsim_set_sta_magic(struct ieee80211_sta
*sta
)
71 struct hwsim_sta_priv
*sp
= (void *)sta
->drv_priv
;
72 sp
->magic
= HWSIM_STA_MAGIC
;
75 static inline void hwsim_clear_sta_magic(struct ieee80211_sta
*sta
)
77 struct hwsim_sta_priv
*sp
= (void *)sta
->drv_priv
;
81 static struct class *hwsim_class
;
83 static struct net_device
*hwsim_mon
; /* global monitor netdev */
86 static const struct ieee80211_channel hwsim_channels
[] = {
87 { .center_freq
= 2412 },
88 { .center_freq
= 2417 },
89 { .center_freq
= 2422 },
90 { .center_freq
= 2427 },
91 { .center_freq
= 2432 },
92 { .center_freq
= 2437 },
93 { .center_freq
= 2442 },
94 { .center_freq
= 2447 },
95 { .center_freq
= 2452 },
96 { .center_freq
= 2457 },
97 { .center_freq
= 2462 },
98 { .center_freq
= 2467 },
99 { .center_freq
= 2472 },
100 { .center_freq
= 2484 },
103 static const struct ieee80211_rate hwsim_rates
[] = {
105 { .bitrate
= 20, .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
106 { .bitrate
= 55, .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
107 { .bitrate
= 110, .flags
= IEEE80211_RATE_SHORT_PREAMBLE
},
118 static spinlock_t hwsim_radio_lock
;
119 static struct list_head hwsim_radios
;
121 struct mac80211_hwsim_data
{
122 struct list_head list
;
123 struct ieee80211_hw
*hw
;
125 struct ieee80211_supported_band band
;
126 struct ieee80211_channel channels
[ARRAY_SIZE(hwsim_channels
)];
127 struct ieee80211_rate rates
[ARRAY_SIZE(hwsim_rates
)];
129 struct ieee80211_channel
*channel
;
131 unsigned long beacon_int
; /* in jiffies unit */
132 unsigned int rx_filter
;
134 struct timer_list beacon_timer
;
138 struct hwsim_radiotap_hdr
{
139 struct ieee80211_radiotap_header hdr
;
144 } __attribute__ ((packed
));
147 static int hwsim_mon_xmit(struct sk_buff
*skb
, struct net_device
*dev
)
149 /* TODO: allow packet injection */
155 static void mac80211_hwsim_monitor_rx(struct ieee80211_hw
*hw
,
156 struct sk_buff
*tx_skb
)
158 struct mac80211_hwsim_data
*data
= hw
->priv
;
160 struct hwsim_radiotap_hdr
*hdr
;
162 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(tx_skb
);
163 struct ieee80211_rate
*txrate
= ieee80211_get_tx_rate(hw
, info
);
165 if (!netif_running(hwsim_mon
))
168 skb
= skb_copy_expand(tx_skb
, sizeof(*hdr
), 0, GFP_ATOMIC
);
172 hdr
= (struct hwsim_radiotap_hdr
*) skb_push(skb
, sizeof(*hdr
));
173 hdr
->hdr
.it_version
= PKTHDR_RADIOTAP_VERSION
;
175 hdr
->hdr
.it_len
= cpu_to_le16(sizeof(*hdr
));
176 hdr
->hdr
.it_present
= cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS
) |
177 (1 << IEEE80211_RADIOTAP_RATE
) |
178 (1 << IEEE80211_RADIOTAP_CHANNEL
));
180 hdr
->rt_rate
= txrate
->bitrate
/ 5;
181 hdr
->rt_channel
= cpu_to_le16(data
->channel
->center_freq
);
182 flags
= IEEE80211_CHAN_2GHZ
;
183 if (txrate
->flags
& IEEE80211_RATE_ERP_G
)
184 flags
|= IEEE80211_CHAN_OFDM
;
186 flags
|= IEEE80211_CHAN_CCK
;
187 hdr
->rt_chbitmask
= cpu_to_le16(flags
);
189 skb
->dev
= hwsim_mon
;
190 skb_set_mac_header(skb
, 0);
191 skb
->ip_summed
= CHECKSUM_UNNECESSARY
;
192 skb
->pkt_type
= PACKET_OTHERHOST
;
193 skb
->protocol
= htons(ETH_P_802_2
);
194 memset(skb
->cb
, 0, sizeof(skb
->cb
));
199 static bool mac80211_hwsim_tx_frame(struct ieee80211_hw
*hw
,
202 struct mac80211_hwsim_data
*data
= hw
->priv
, *data2
;
204 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*) skb
->data
;
205 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
206 struct ieee80211_rx_status rx_status
;
208 memset(&rx_status
, 0, sizeof(rx_status
));
209 /* TODO: set mactime */
210 rx_status
.freq
= data
->channel
->center_freq
;
211 rx_status
.band
= data
->channel
->band
;
212 rx_status
.rate_idx
= info
->control
.rates
[0].idx
;
213 /* TODO: simulate signal strength (and optional packet drop) */
215 /* Copy skb to all enabled radios that are on the current frequency */
216 spin_lock(&hwsim_radio_lock
);
217 list_for_each_entry(data2
, &hwsim_radios
, list
) {
218 struct sk_buff
*nskb
;
223 if (!data2
->started
|| !data2
->radio_enabled
||
224 data
->channel
->center_freq
!= data2
->channel
->center_freq
)
227 nskb
= skb_copy(skb
, GFP_ATOMIC
);
231 if (memcmp(hdr
->addr1
, data2
->hw
->wiphy
->perm_addr
,
234 ieee80211_rx_irqsafe(data2
->hw
, nskb
, &rx_status
);
236 spin_unlock(&hwsim_radio_lock
);
242 static int mac80211_hwsim_tx(struct ieee80211_hw
*hw
, struct sk_buff
*skb
)
244 struct mac80211_hwsim_data
*data
= hw
->priv
;
246 struct ieee80211_tx_info
*txi
;
248 mac80211_hwsim_monitor_rx(hw
, skb
);
251 /* Should not happen; just a sanity check for addr1 use */
256 if (!data
->radio_enabled
) {
257 printk(KERN_DEBUG
"%s: dropped TX frame since radio "
258 "disabled\n", wiphy_name(hw
->wiphy
));
263 ack
= mac80211_hwsim_tx_frame(hw
, skb
);
265 txi
= IEEE80211_SKB_CB(skb
);
267 if (txi
->control
.vif
)
268 hwsim_check_magic(txi
->control
.vif
);
269 if (txi
->control
.sta
)
270 hwsim_check_sta_magic(txi
->control
.sta
);
272 ieee80211_tx_info_clear_status(txi
);
273 if (!(txi
->flags
& IEEE80211_TX_CTL_NO_ACK
) && ack
)
274 txi
->flags
|= IEEE80211_TX_STAT_ACK
;
275 ieee80211_tx_status_irqsafe(hw
, skb
);
280 static int mac80211_hwsim_start(struct ieee80211_hw
*hw
)
282 struct mac80211_hwsim_data
*data
= hw
->priv
;
283 printk(KERN_DEBUG
"%s:%s\n", wiphy_name(hw
->wiphy
), __func__
);
289 static void mac80211_hwsim_stop(struct ieee80211_hw
*hw
)
291 struct mac80211_hwsim_data
*data
= hw
->priv
;
293 printk(KERN_DEBUG
"%s:%s\n", wiphy_name(hw
->wiphy
), __func__
);
297 static int mac80211_hwsim_add_interface(struct ieee80211_hw
*hw
,
298 struct ieee80211_if_init_conf
*conf
)
300 printk(KERN_DEBUG
"%s:%s (type=%d mac_addr=%pM)\n",
301 wiphy_name(hw
->wiphy
), __func__
, conf
->type
,
303 hwsim_set_magic(conf
->vif
);
308 static void mac80211_hwsim_remove_interface(
309 struct ieee80211_hw
*hw
, struct ieee80211_if_init_conf
*conf
)
311 printk(KERN_DEBUG
"%s:%s (type=%d mac_addr=%pM)\n",
312 wiphy_name(hw
->wiphy
), __func__
, conf
->type
,
314 hwsim_check_magic(conf
->vif
);
315 hwsim_clear_magic(conf
->vif
);
319 static void mac80211_hwsim_beacon_tx(void *arg
, u8
*mac
,
320 struct ieee80211_vif
*vif
)
322 struct ieee80211_hw
*hw
= arg
;
324 struct ieee80211_tx_info
*info
;
326 hwsim_check_magic(vif
);
328 if (vif
->type
!= NL80211_IFTYPE_AP
)
331 skb
= ieee80211_beacon_get(hw
, vif
);
334 info
= IEEE80211_SKB_CB(skb
);
336 mac80211_hwsim_monitor_rx(hw
, skb
);
337 mac80211_hwsim_tx_frame(hw
, skb
);
342 static void mac80211_hwsim_beacon(unsigned long arg
)
344 struct ieee80211_hw
*hw
= (struct ieee80211_hw
*) arg
;
345 struct mac80211_hwsim_data
*data
= hw
->priv
;
347 if (!data
->started
|| !data
->radio_enabled
)
350 ieee80211_iterate_active_interfaces_atomic(
351 hw
, mac80211_hwsim_beacon_tx
, hw
);
353 data
->beacon_timer
.expires
= jiffies
+ data
->beacon_int
;
354 add_timer(&data
->beacon_timer
);
358 static int mac80211_hwsim_config(struct ieee80211_hw
*hw
, u32 changed
)
360 struct mac80211_hwsim_data
*data
= hw
->priv
;
361 struct ieee80211_conf
*conf
= &hw
->conf
;
363 printk(KERN_DEBUG
"%s:%s (freq=%d radio_enabled=%d beacon_int=%d)\n",
364 wiphy_name(hw
->wiphy
), __func__
,
365 conf
->channel
->center_freq
, conf
->radio_enabled
,
368 data
->channel
= conf
->channel
;
369 data
->radio_enabled
= conf
->radio_enabled
;
370 data
->beacon_int
= 1024 * conf
->beacon_int
/ 1000 * HZ
/ 1000;
371 if (data
->beacon_int
< 1)
372 data
->beacon_int
= 1;
374 if (!data
->started
|| !data
->radio_enabled
)
375 del_timer(&data
->beacon_timer
);
377 mod_timer(&data
->beacon_timer
, jiffies
+ data
->beacon_int
);
383 static void mac80211_hwsim_configure_filter(struct ieee80211_hw
*hw
,
384 unsigned int changed_flags
,
385 unsigned int *total_flags
,
387 struct dev_addr_list
*mc_list
)
389 struct mac80211_hwsim_data
*data
= hw
->priv
;
391 printk(KERN_DEBUG
"%s:%s\n", wiphy_name(hw
->wiphy
), __func__
);
394 if (*total_flags
& FIF_PROMISC_IN_BSS
)
395 data
->rx_filter
|= FIF_PROMISC_IN_BSS
;
396 if (*total_flags
& FIF_ALLMULTI
)
397 data
->rx_filter
|= FIF_ALLMULTI
;
399 *total_flags
= data
->rx_filter
;
402 static int mac80211_hwsim_config_interface(struct ieee80211_hw
*hw
,
403 struct ieee80211_vif
*vif
,
404 struct ieee80211_if_conf
*conf
)
406 hwsim_check_magic(vif
);
410 static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw
*hw
,
411 struct ieee80211_vif
*vif
,
412 struct ieee80211_bss_conf
*info
,
415 hwsim_check_magic(vif
);
418 static void mac80211_hwsim_sta_notify(struct ieee80211_hw
*hw
,
419 struct ieee80211_vif
*vif
,
420 enum sta_notify_cmd cmd
,
421 struct ieee80211_sta
*sta
)
423 hwsim_check_magic(vif
);
426 hwsim_set_sta_magic(sta
);
428 case STA_NOTIFY_REMOVE
:
429 hwsim_clear_sta_magic(sta
);
434 static int mac80211_hwsim_set_tim(struct ieee80211_hw
*hw
,
435 struct ieee80211_sta
*sta
,
438 hwsim_check_sta_magic(sta
);
442 static const struct ieee80211_ops mac80211_hwsim_ops
=
444 .tx
= mac80211_hwsim_tx
,
445 .start
= mac80211_hwsim_start
,
446 .stop
= mac80211_hwsim_stop
,
447 .add_interface
= mac80211_hwsim_add_interface
,
448 .remove_interface
= mac80211_hwsim_remove_interface
,
449 .config
= mac80211_hwsim_config
,
450 .configure_filter
= mac80211_hwsim_configure_filter
,
451 .config_interface
= mac80211_hwsim_config_interface
,
452 .bss_info_changed
= mac80211_hwsim_bss_info_changed
,
453 .sta_notify
= mac80211_hwsim_sta_notify
,
454 .set_tim
= mac80211_hwsim_set_tim
,
458 static void mac80211_hwsim_free(void)
460 struct list_head tmplist
, *i
, *tmp
;
461 struct mac80211_hwsim_data
*data
;
463 INIT_LIST_HEAD(&tmplist
);
465 spin_lock_bh(&hwsim_radio_lock
);
466 list_for_each_safe(i
, tmp
, &hwsim_radios
)
467 list_move(i
, &tmplist
);
468 spin_unlock_bh(&hwsim_radio_lock
);
470 list_for_each_entry(data
, &tmplist
, list
) {
471 ieee80211_unregister_hw(data
->hw
);
472 device_unregister(data
->dev
);
473 ieee80211_free_hw(data
->hw
);
475 class_destroy(hwsim_class
);
479 static struct device_driver mac80211_hwsim_driver
= {
480 .name
= "mac80211_hwsim"
484 static void hwsim_mon_setup(struct net_device
*dev
)
486 dev
->hard_start_xmit
= hwsim_mon_xmit
;
487 dev
->destructor
= free_netdev
;
489 dev
->tx_queue_len
= 0;
490 dev
->type
= ARPHRD_IEEE80211_RADIOTAP
;
491 memset(dev
->dev_addr
, 0, ETH_ALEN
);
492 dev
->dev_addr
[0] = 0x12;
496 static int __init
init_mac80211_hwsim(void)
500 struct mac80211_hwsim_data
*data
;
501 struct ieee80211_hw
*hw
;
503 if (radios
< 1 || radios
> 100)
506 spin_lock_init(&hwsim_radio_lock
);
507 INIT_LIST_HEAD(&hwsim_radios
);
509 hwsim_class
= class_create(THIS_MODULE
, "mac80211_hwsim");
510 if (IS_ERR(hwsim_class
))
511 return PTR_ERR(hwsim_class
);
513 memset(addr
, 0, ETH_ALEN
);
516 for (i
= 0; i
< radios
; i
++) {
517 printk(KERN_DEBUG
"mac80211_hwsim: Initializing radio %d\n",
519 hw
= ieee80211_alloc_hw(sizeof(*data
), &mac80211_hwsim_ops
);
521 printk(KERN_DEBUG
"mac80211_hwsim: ieee80211_alloc_hw "
529 data
->dev
= device_create(hwsim_class
, NULL
, 0, hw
,
531 if (IS_ERR(data
->dev
)) {
533 "mac80211_hwsim: device_create "
534 "failed (%ld)\n", PTR_ERR(data
->dev
));
538 data
->dev
->driver
= &mac80211_hwsim_driver
;
540 SET_IEEE80211_DEV(hw
, data
->dev
);
543 SET_IEEE80211_PERM_ADDR(hw
, addr
);
545 hw
->channel_change_time
= 1;
547 hw
->wiphy
->interface_modes
=
548 BIT(NL80211_IFTYPE_STATION
) |
549 BIT(NL80211_IFTYPE_AP
);
550 hw
->ampdu_queues
= 1;
552 /* ask mac80211 to reserve space for magic */
553 hw
->vif_data_size
= sizeof(struct hwsim_vif_priv
);
554 hw
->sta_data_size
= sizeof(struct hwsim_sta_priv
);
556 memcpy(data
->channels
, hwsim_channels
, sizeof(hwsim_channels
));
557 memcpy(data
->rates
, hwsim_rates
, sizeof(hwsim_rates
));
558 data
->band
.channels
= data
->channels
;
559 data
->band
.n_channels
= ARRAY_SIZE(hwsim_channels
);
560 data
->band
.bitrates
= data
->rates
;
561 data
->band
.n_bitrates
= ARRAY_SIZE(hwsim_rates
);
562 data
->band
.ht_cap
.ht_supported
= true;
563 data
->band
.ht_cap
.cap
= IEEE80211_HT_CAP_SUP_WIDTH_20_40
|
564 IEEE80211_HT_CAP_GRN_FLD
|
565 IEEE80211_HT_CAP_SGI_40
|
566 IEEE80211_HT_CAP_DSSSCCK40
;
567 data
->band
.ht_cap
.ampdu_factor
= 0x3;
568 data
->band
.ht_cap
.ampdu_density
= 0x6;
569 memset(&data
->band
.ht_cap
.mcs
, 0,
570 sizeof(data
->band
.ht_cap
.mcs
));
571 data
->band
.ht_cap
.mcs
.rx_mask
[0] = 0xff;
572 data
->band
.ht_cap
.mcs
.rx_mask
[1] = 0xff;
573 data
->band
.ht_cap
.mcs
.tx_params
= IEEE80211_HT_MCS_TX_DEFINED
;
574 hw
->wiphy
->bands
[IEEE80211_BAND_2GHZ
] = &data
->band
;
576 err
= ieee80211_register_hw(hw
);
578 printk(KERN_DEBUG
"mac80211_hwsim: "
579 "ieee80211_register_hw failed (%d)\n", err
);
583 printk(KERN_DEBUG
"%s: hwaddr %pM registered\n",
584 wiphy_name(hw
->wiphy
),
585 hw
->wiphy
->perm_addr
);
587 setup_timer(&data
->beacon_timer
, mac80211_hwsim_beacon
,
590 list_add_tail(&data
->list
, &hwsim_radios
);
593 hwsim_mon
= alloc_netdev(0, "hwsim%d", hwsim_mon_setup
);
594 if (hwsim_mon
== NULL
)
599 err
= dev_alloc_name(hwsim_mon
, hwsim_mon
->name
);
604 err
= register_netdevice(hwsim_mon
);
614 free_netdev(hwsim_mon
);
615 mac80211_hwsim_free();
619 device_unregister(data
->dev
);
621 ieee80211_free_hw(hw
);
623 mac80211_hwsim_free();
628 static void __exit
exit_mac80211_hwsim(void)
630 printk(KERN_DEBUG
"mac80211_hwsim: unregister radios\n");
632 unregister_netdev(hwsim_mon
);
633 mac80211_hwsim_free();
637 module_init(init_mac80211_hwsim
);
638 module_exit(exit_mac80211_hwsim
);