@ -10,7 +10,6 @@
/*
* TODO :
* - IBSS mode simulation ( Beacon transmission with competition for " air time " )
* - IEEE 802.11 a and 802.11 n modes
* - RX filtering based on filter configuration ( data - > rx_filter )
*/
@ -86,22 +85,65 @@ static struct class *hwsim_class;
static struct net_device * hwsim_mon ; /* global monitor netdev */
# define CHAN2G(_freq) { \
. band = IEEE80211_BAND_2GHZ , \
. center_freq = ( _freq ) , \
. hw_value = ( _freq ) , \
. max_power = 20 , \
}
# define CHAN5G(_freq) { \
. band = IEEE80211_BAND_5GHZ , \
. center_freq = ( _freq ) , \
. hw_value = ( _freq ) , \
. max_power = 20 , \
}
static const struct ieee80211_channel hwsim_channels_2ghz [ ] = {
CHAN2G ( 2412 ) , /* Channel 1 */
CHAN2G ( 2417 ) , /* Channel 2 */
CHAN2G ( 2422 ) , /* Channel 3 */
CHAN2G ( 2427 ) , /* Channel 4 */
CHAN2G ( 2432 ) , /* Channel 5 */
CHAN2G ( 2437 ) , /* Channel 6 */
CHAN2G ( 2442 ) , /* Channel 7 */
CHAN2G ( 2447 ) , /* Channel 8 */
CHAN2G ( 2452 ) , /* Channel 9 */
CHAN2G ( 2457 ) , /* Channel 10 */
CHAN2G ( 2462 ) , /* Channel 11 */
CHAN2G ( 2467 ) , /* Channel 12 */
CHAN2G ( 2472 ) , /* Channel 13 */
CHAN2G ( 2484 ) , /* Channel 14 */
} ;
static const struct ieee80211_channel hwsim_channels [ ] = {
{ . center_freq = 2412 } ,
{ . center_freq = 2417 } ,
{ . center_freq = 2422 } ,
{ . center_freq = 2427 } ,
{ . center_freq = 2432 } ,
{ . center_freq = 2437 } ,
{ . center_freq = 2442 } ,
{ . center_freq = 2447 } ,
{ . center_freq = 2452 } ,
{ . center_freq = 2457 } ,
{ . center_freq = 2462 } ,
{ . center_freq = 2467 } ,
{ . center_freq = 2472 } ,
{ . center_freq = 2484 } ,
static const struct ieee80211_channel hwsim_channels_5ghz [ ] = {
CHAN5G ( 5180 ) , /* Channel 36 */
CHAN5G ( 5200 ) , /* Channel 40 */
CHAN5G ( 5220 ) , /* Channel 44 */
CHAN5G ( 5240 ) , /* Channel 48 */
CHAN5G ( 5260 ) , /* Channel 52 */
CHAN5G ( 5280 ) , /* Channel 56 */
CHAN5G ( 5300 ) , /* Channel 60 */
CHAN5G ( 5320 ) , /* Channel 64 */
CHAN5G ( 5500 ) , /* Channel 100 */
CHAN5G ( 5520 ) , /* Channel 104 */
CHAN5G ( 5540 ) , /* Channel 108 */
CHAN5G ( 5560 ) , /* Channel 112 */
CHAN5G ( 5580 ) , /* Channel 116 */
CHAN5G ( 5600 ) , /* Channel 120 */
CHAN5G ( 5620 ) , /* Channel 124 */
CHAN5G ( 5640 ) , /* Channel 128 */
CHAN5G ( 5660 ) , /* Channel 132 */
CHAN5G ( 5680 ) , /* Channel 136 */
CHAN5G ( 5700 ) , /* Channel 140 */
CHAN5G ( 5745 ) , /* Channel 149 */
CHAN5G ( 5765 ) , /* Channel 153 */
CHAN5G ( 5785 ) , /* Channel 157 */
CHAN5G ( 5805 ) , /* Channel 161 */
CHAN5G ( 5825 ) , /* Channel 165 */
} ;
static const struct ieee80211_rate hwsim_rates [ ] = {
@ -126,8 +168,9 @@ struct mac80211_hwsim_data {
struct list_head list ;
struct ieee80211_hw * hw ;
struct device * dev ;
struct ieee80211_supported_band band ;
struct ieee80211_channel channels [ ARRAY_SIZE ( hwsim_channels ) ] ;
struct ieee80211_supported_band bands [ 2 ] ;
struct ieee80211_channel channels_2ghz [ ARRAY_SIZE ( hwsim_channels_2ghz ) ] ;
struct ieee80211_channel channels_5ghz [ ARRAY_SIZE ( hwsim_channels_5ghz ) ] ;
struct ieee80211_rate rates [ ARRAY_SIZE ( hwsim_rates ) ] ;
struct ieee80211_channel * channel ;
@ -728,6 +771,7 @@ static int __init init_mac80211_hwsim(void)
u8 addr [ ETH_ALEN ] ;
struct mac80211_hwsim_data * data ;
struct ieee80211_hw * hw ;
enum ieee80211_band band ;
if ( radios < 1 | | radios > 100 )
return - EINVAL ;
@ -785,25 +829,47 @@ static int __init init_mac80211_hwsim(void)
hw - > vif_data_size = sizeof ( struct hwsim_vif_priv ) ;
hw - > sta_data_size = sizeof ( struct hwsim_sta_priv ) ;
memcpy ( data - > channels , hwsim_channels , sizeof ( hwsim_channels ) ) ;
memcpy ( data - > channels_2ghz , hwsim_channels_2ghz ,
sizeof ( hwsim_channels_2ghz ) ) ;
memcpy ( data - > channels_5ghz , hwsim_channels_5ghz ,
sizeof ( hwsim_channels_5ghz ) ) ;
memcpy ( data - > rates , hwsim_rates , sizeof ( hwsim_rates ) ) ;
data - > band . channels = data - > channels ;
data - > band . n_channels = ARRAY_SIZE ( hwsim_channels ) ;
data - > band . bitrates = data - > rates ;
data - > band . n_bitrates = ARRAY_SIZE ( hwsim_rates ) ;
data - > band . ht_cap . ht_supported = true ;
data - > band . ht_cap . cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
IEEE80211_HT_CAP_GRN_FLD |
IEEE80211_HT_CAP_SGI_40 |
IEEE80211_HT_CAP_DSSSCCK40 ;
data - > band . ht_cap . ampdu_factor = 0x3 ;
data - > band . ht_cap . ampdu_density = 0x6 ;
memset ( & data - > band . ht_cap . mcs , 0 ,
sizeof ( data - > band . ht_cap . mcs ) ) ;
data - > band . ht_cap . mcs . rx_mask [ 0 ] = 0xff ;
data - > band . ht_cap . mcs . rx_mask [ 1 ] = 0xff ;
data - > band . ht_cap . mcs . tx_params = IEEE80211_HT_MCS_TX_DEFINED ;
hw - > wiphy - > bands [ IEEE80211_BAND_2GHZ ] = & data - > band ;
for ( band = IEEE80211_BAND_2GHZ ; band < IEEE80211_NUM_BANDS ; band + + ) {
struct ieee80211_supported_band * sband = & data - > bands [ band ] ;
switch ( band ) {
case IEEE80211_BAND_2GHZ :
sband - > channels = data - > channels_2ghz ;
sband - > n_channels =
ARRAY_SIZE ( hwsim_channels_2ghz ) ;
break ;
case IEEE80211_BAND_5GHZ :
sband - > channels = data - > channels_5ghz ;
sband - > n_channels =
ARRAY_SIZE ( hwsim_channels_5ghz ) ;
break ;
default :
break ;
}
sband - > bitrates = data - > rates ;
sband - > n_bitrates = ARRAY_SIZE ( hwsim_rates ) ;
sband - > ht_cap . ht_supported = true ;
sband - > ht_cap . cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
IEEE80211_HT_CAP_GRN_FLD |
IEEE80211_HT_CAP_SGI_40 |
IEEE80211_HT_CAP_DSSSCCK40 ;
sband - > ht_cap . ampdu_factor = 0x3 ;
sband - > ht_cap . ampdu_density = 0x6 ;
memset ( & sband - > ht_cap . mcs , 0 ,
sizeof ( sband - > ht_cap . mcs ) ) ;
sband - > ht_cap . mcs . rx_mask [ 0 ] = 0xff ;
sband - > ht_cap . mcs . rx_mask [ 1 ] = 0xff ;
sband - > ht_cap . mcs . tx_params = IEEE80211_HT_MCS_TX_DEFINED ;
hw - > wiphy - > bands [ band ] = sband ;
}
err = ieee80211_register_hw ( hw ) ;
if ( err < 0 ) {