u8 page;
u8 channel;
struct ieee802154_hw_addr_filt filt;
+ enum ieee802154_filtering_level filt_level;
struct rcu_head rcu;
};
}
static int hwsim_update_pib(struct ieee802154_hw *hw, u8 page, u8 channel,
- struct ieee802154_hw_addr_filt *filt)
+ struct ieee802154_hw_addr_filt *filt,
+ enum ieee802154_filtering_level filt_level)
{
struct hwsim_phy *phy = hw->priv;
struct hwsim_pib *pib, *pib_old;
pib->filt.pan_id = filt->pan_id;
pib->filt.ieee_addr = filt->ieee_addr;
pib->filt.pan_coord = filt->pan_coord;
+ pib->filt_level = filt_level;
rcu_assign_pointer(phy->pib, pib);
kfree_rcu(pib_old, rcu);
rcu_read_lock();
pib = rcu_dereference(phy->pib);
- ret = hwsim_update_pib(hw, page, channel, &pib->filt);
+ ret = hwsim_update_pib(hw, page, channel, &pib->filt, pib->filt_level);
rcu_read_unlock();
return ret;
rcu_read_lock();
pib = rcu_dereference(phy->pib);
- ret = hwsim_update_pib(hw, pib->page, pib->channel, filt);
+ ret = hwsim_update_pib(hw, pib->page, pib->channel, filt, pib->filt_level);
rcu_read_unlock();
return ret;
memcpy(&hdr, skb->data, 3);
/* Level 4 filtering: Frame fields validity */
- if (hw->phy->filtering == IEEE802154_FILTERING_4_FRAME_FIELDS) {
+ if (pib->filt_level == IEEE802154_FILTERING_4_FRAME_FIELDS) {
/* a) Drop reserved frame types */
switch (mac_cb(skb)->type) {
case IEEE802154_FC_TYPE_BEACON:
static int
hwsim_set_promiscuous_mode(struct ieee802154_hw *hw, const bool on)
{
- return 0;
+ enum ieee802154_filtering_level filt_level;
+ struct hwsim_phy *phy = hw->priv;
+ struct hwsim_pib *pib;
+ int ret;
+
+ if (on)
+ filt_level = IEEE802154_FILTERING_NONE;
+ else
+ filt_level = IEEE802154_FILTERING_4_FRAME_FIELDS;
+
+ rcu_read_lock();
+ pib = rcu_dereference(phy->pib);
+ ret = hwsim_update_pib(hw, pib->page, pib->channel, &pib->filt, filt_level);
+ rcu_read_unlock();
+
+ return ret;
}
static const struct ieee802154_ops hwsim_ops = {