|
@@ -291,6 +291,14 @@ struct mac80211_hwsim_data {
|
|
bool ps_poll_pending;
|
|
bool ps_poll_pending;
|
|
struct dentry *debugfs;
|
|
struct dentry *debugfs;
|
|
struct dentry *debugfs_ps;
|
|
struct dentry *debugfs_ps;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Only radios in the same group can communicate together (the
|
|
|
|
+ * channel has to match too). Each bit represents a group. A
|
|
|
|
+ * radio can be in more then one group.
|
|
|
|
+ */
|
|
|
|
+ u64 group;
|
|
|
|
+ struct dentry *debugfs_group;
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
@@ -412,7 +420,8 @@ static bool mac80211_hwsim_tx_frame(struct ieee80211_hw *hw,
|
|
|
|
|
|
if (!data2->started || !data2->radio_enabled ||
|
|
if (!data2->started || !data2->radio_enabled ||
|
|
!hwsim_ps_rx_ok(data2, skb) ||
|
|
!hwsim_ps_rx_ok(data2, skb) ||
|
|
- data->channel->center_freq != data2->channel->center_freq)
|
|
|
|
|
|
+ data->channel->center_freq != data2->channel->center_freq ||
|
|
|
|
+ !(data->group & data2->group))
|
|
continue;
|
|
continue;
|
|
|
|
|
|
nskb = skb_copy(skb, GFP_ATOMIC);
|
|
nskb = skb_copy(skb, GFP_ATOMIC);
|
|
@@ -720,6 +729,7 @@ static void mac80211_hwsim_free(void)
|
|
spin_unlock_bh(&hwsim_radio_lock);
|
|
spin_unlock_bh(&hwsim_radio_lock);
|
|
|
|
|
|
list_for_each_entry(data, &tmplist, list) {
|
|
list_for_each_entry(data, &tmplist, list) {
|
|
|
|
+ debugfs_remove(data->debugfs_group);
|
|
debugfs_remove(data->debugfs_ps);
|
|
debugfs_remove(data->debugfs_ps);
|
|
debugfs_remove(data->debugfs);
|
|
debugfs_remove(data->debugfs);
|
|
ieee80211_unregister_hw(data->hw);
|
|
ieee80211_unregister_hw(data->hw);
|
|
@@ -872,6 +882,24 @@ DEFINE_SIMPLE_ATTRIBUTE(hwsim_fops_ps, hwsim_fops_ps_read, hwsim_fops_ps_write,
|
|
"%llu\n");
|
|
"%llu\n");
|
|
|
|
|
|
|
|
|
|
|
|
+static int hwsim_fops_group_read(void *dat, u64 *val)
|
|
|
|
+{
|
|
|
|
+ struct mac80211_hwsim_data *data = dat;
|
|
|
|
+ *val = data->group;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int hwsim_fops_group_write(void *dat, u64 val)
|
|
|
|
+{
|
|
|
|
+ struct mac80211_hwsim_data *data = dat;
|
|
|
|
+ data->group = val;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+DEFINE_SIMPLE_ATTRIBUTE(hwsim_fops_group,
|
|
|
|
+ hwsim_fops_group_read, hwsim_fops_group_write,
|
|
|
|
+ "%llx\n");
|
|
|
|
+
|
|
static int __init init_mac80211_hwsim(void)
|
|
static int __init init_mac80211_hwsim(void)
|
|
{
|
|
{
|
|
int i, err = 0;
|
|
int i, err = 0;
|
|
@@ -976,6 +1004,8 @@ static int __init init_mac80211_hwsim(void)
|
|
|
|
|
|
hw->wiphy->bands[band] = sband;
|
|
hw->wiphy->bands[band] = sband;
|
|
}
|
|
}
|
|
|
|
+ /* By default all radios are belonging to the first group */
|
|
|
|
+ data->group = 1;
|
|
|
|
|
|
/* Work to be done prior to ieee80211_register_hw() */
|
|
/* Work to be done prior to ieee80211_register_hw() */
|
|
switch (regtest) {
|
|
switch (regtest) {
|
|
@@ -1100,6 +1130,9 @@ static int __init init_mac80211_hwsim(void)
|
|
data->debugfs_ps = debugfs_create_file("ps", 0666,
|
|
data->debugfs_ps = debugfs_create_file("ps", 0666,
|
|
data->debugfs, data,
|
|
data->debugfs, data,
|
|
&hwsim_fops_ps);
|
|
&hwsim_fops_ps);
|
|
|
|
+ data->debugfs_group = debugfs_create_file("group", 0666,
|
|
|
|
+ data->debugfs, data,
|
|
|
|
+ &hwsim_fops_group);
|
|
|
|
|
|
setup_timer(&data->beacon_timer, mac80211_hwsim_beacon,
|
|
setup_timer(&data->beacon_timer, mac80211_hwsim_beacon,
|
|
(unsigned long) hw);
|
|
(unsigned long) hw);
|