mac80211_hwsim: clean up own address matching
Using perm_addr is always wrong, it may be reassigned by anyone using standard netdev APIs. Remove that from the match function and also use the match function where only the perm_addr was used now. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Родитель
181715203b
Коммит
3283e286b8
|
@ -781,6 +781,36 @@ static void mac80211_hwsim_monitor_ack(struct ieee80211_channel *chan,
|
|||
netif_rx(skb);
|
||||
}
|
||||
|
||||
struct mac80211_hwsim_addr_match_data {
|
||||
u8 addr[ETH_ALEN];
|
||||
bool ret;
|
||||
};
|
||||
|
||||
static void mac80211_hwsim_addr_iter(void *data, u8 *mac,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct mac80211_hwsim_addr_match_data *md = data;
|
||||
|
||||
if (memcmp(mac, md->addr, ETH_ALEN) == 0)
|
||||
md->ret = true;
|
||||
}
|
||||
|
||||
static bool mac80211_hwsim_addr_match(struct mac80211_hwsim_data *data,
|
||||
const u8 *addr)
|
||||
{
|
||||
struct mac80211_hwsim_addr_match_data md = {
|
||||
.ret = false,
|
||||
};
|
||||
|
||||
memcpy(md.addr, addr, ETH_ALEN);
|
||||
|
||||
ieee80211_iterate_active_interfaces_atomic(data->hw,
|
||||
IEEE80211_IFACE_ITER_NORMAL,
|
||||
mac80211_hwsim_addr_iter,
|
||||
&md);
|
||||
|
||||
return md.ret;
|
||||
}
|
||||
|
||||
static bool hwsim_ps_rx_ok(struct mac80211_hwsim_data *data,
|
||||
struct sk_buff *skb)
|
||||
|
@ -798,8 +828,7 @@ static bool hwsim_ps_rx_ok(struct mac80211_hwsim_data *data,
|
|||
/* Allow unicast frames to own address if there is a pending
|
||||
* PS-Poll */
|
||||
if (data->ps_poll_pending &&
|
||||
memcmp(data->hw->wiphy->perm_addr, skb->data + 4,
|
||||
ETH_ALEN) == 0) {
|
||||
mac80211_hwsim_addr_match(data, skb->data + 4)) {
|
||||
data->ps_poll_pending = false;
|
||||
return true;
|
||||
}
|
||||
|
@ -809,39 +838,6 @@ static bool hwsim_ps_rx_ok(struct mac80211_hwsim_data *data,
|
|||
return true;
|
||||
}
|
||||
|
||||
|
||||
struct mac80211_hwsim_addr_match_data {
|
||||
bool ret;
|
||||
const u8 *addr;
|
||||
};
|
||||
|
||||
static void mac80211_hwsim_addr_iter(void *data, u8 *mac,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct mac80211_hwsim_addr_match_data *md = data;
|
||||
if (memcmp(mac, md->addr, ETH_ALEN) == 0)
|
||||
md->ret = true;
|
||||
}
|
||||
|
||||
|
||||
static bool mac80211_hwsim_addr_match(struct mac80211_hwsim_data *data,
|
||||
const u8 *addr)
|
||||
{
|
||||
struct mac80211_hwsim_addr_match_data md;
|
||||
|
||||
if (memcmp(addr, data->hw->wiphy->perm_addr, ETH_ALEN) == 0)
|
||||
return true;
|
||||
|
||||
md.ret = false;
|
||||
md.addr = addr;
|
||||
ieee80211_iterate_active_interfaces_atomic(data->hw,
|
||||
IEEE80211_IFACE_ITER_NORMAL,
|
||||
mac80211_hwsim_addr_iter,
|
||||
&md);
|
||||
|
||||
return md.ret;
|
||||
}
|
||||
|
||||
static void mac80211_hwsim_tx_frame_nl(struct ieee80211_hw *hw,
|
||||
struct sk_buff *my_skb,
|
||||
int dst_portid)
|
||||
|
|
Загрузка…
Ссылка в новой задаче