drivers/ieee802154: Implement radio API's set_filter() relevantly

Currently, all drivers seem to support hardware filtering.

Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This commit is contained in:
Tomasz Bursztyka 2017-09-05 14:09:15 +02:00 committed by Jukka Rissanen
commit 54b3d6b130
4 changed files with 85 additions and 7 deletions

View file

@ -705,10 +705,10 @@ out:
*******************/ *******************/
static enum ieee802154_hw_caps cc2520_get_capabilities(struct device *dev) static enum ieee802154_hw_caps cc2520_get_capabilities(struct device *dev)
{ {
/* ToDo: Add support for /* ToDo: Add support for IEEE802154_HW_PROMISC */
* IEEE802154_HW_PROMISC | IEEE802154_HW_FILTER return IEEE802154_HW_FCS |
*/ IEEE802154_HW_2_4_GHZ |
return IEEE802154_HW_FCS | IEEE802154_HW_2_4_GHZ; IEEE802154_HW_FILTER;
} }
static int cc2520_cca(struct device *dev) static int cc2520_cca(struct device *dev)
@ -792,6 +792,23 @@ static int cc2520_set_ieee_addr(struct device *dev, const u8_t *ieee_addr)
return 0; return 0;
} }
static int cc2520_set_filter(struct device *dev,
enum ieee802154_filter_type type,
const struct ieee802154_filter *filter)
{
SYS_LOG_DBG("Applying filter %u", type);
if (type == IEEE802154_FILTER_TYPE_IEEE_ADDR) {
return cc2520_set_ieee_addr(dev, filter->ieee_addr);
} else if (type == IEEE802154_FILTER_TYPE_SHORT_ADDR) {
return cc2520_set_short_addr(dev, filter->short_addr);
} else if (type == IEEE802154_FILTER_TYPE_PAN_ID) {
return cc2520_set_pan_id(dev, filter->pan_id);
}
return -EINVAL;
}
static int cc2520_set_txpower(struct device *dev, s16_t dbm) static int cc2520_set_txpower(struct device *dev, s16_t dbm)
{ {
struct cc2520_context *cc2520 = dev->driver_data; struct cc2520_context *cc2520 = dev->driver_data;
@ -1108,6 +1125,7 @@ static struct ieee802154_radio_api cc2520_radio_api = {
.get_capabilities = cc2520_get_capabilities, .get_capabilities = cc2520_get_capabilities,
.cca = cc2520_cca, .cca = cc2520_cca,
.set_channel = cc2520_set_channel, .set_channel = cc2520_set_channel,
.set_filter = cc2520_set_filter,
.set_pan_id = cc2520_set_pan_id, .set_pan_id = cc2520_set_pan_id,
.set_short_addr = cc2520_set_short_addr, .set_short_addr = cc2520_set_short_addr,
.set_ieee_addr = cc2520_set_ieee_addr, .set_ieee_addr = cc2520_set_ieee_addr,

View file

@ -191,7 +191,9 @@ static inline void kw41z_tmr2_disable(void)
static enum ieee802154_hw_caps kw41z_get_capabilities(struct device *dev) static enum ieee802154_hw_caps kw41z_get_capabilities(struct device *dev)
{ {
return IEEE802154_HW_FCS | IEEE802154_HW_2_4_GHZ; return IEEE802154_HW_FCS |
IEEE802154_HW_2_4_GHZ |
IEEE802154_HW_FILTER;
} }
static int kw41z_cca(struct device *dev) static int kw41z_cca(struct device *dev)
@ -255,6 +257,23 @@ static int kw41z_set_ieee_addr(struct device *dev, const u8_t *ieee_addr)
return 0; return 0;
} }
static int kw41z_set_filter(struct device *dev,
enum ieee802154_filter_type type,
const struct ieee802154_filter *filter)
{
SYS_LOG_DBG("Applying filter %u", type);
if (type == IEEE802154_FILTER_TYPE_IEEE_ADDR) {
return kw41z_set_ieee_addr(dev, filter->ieee_addr);
} else if (type == IEEE802154_FILTER_TYPE_SHORT_ADDR) {
return kw41z_set_short_addr(dev, filter->short_addr);
} else if (type == IEEE802154_FILTER_TYPE_PAN_ID) {
return kw41z_set_pan_id(dev, filter->pan_id);
}
return -EINVAL;
}
static int kw41z_set_txpower(struct device *dev, s16_t dbm) static int kw41z_set_txpower(struct device *dev, s16_t dbm)
{ {
if (dbm < KW41Z_OUTPUT_POWER_MIN) { if (dbm < KW41Z_OUTPUT_POWER_MIN) {
@ -663,6 +682,7 @@ static struct ieee802154_radio_api kw41z_radio_api = {
.get_capabilities = kw41z_get_capabilities, .get_capabilities = kw41z_get_capabilities,
.cca = kw41z_cca, .cca = kw41z_cca,
.set_channel = kw41z_set_channel, .set_channel = kw41z_set_channel,
.set_filter = kw41z_set_filter,
.set_pan_id = kw41z_set_pan_id, .set_pan_id = kw41z_set_pan_id,
.set_short_addr = kw41z_set_short_addr, .set_short_addr = kw41z_set_short_addr,
.set_ieee_addr = kw41z_set_ieee_addr, .set_ieee_addr = kw41z_set_ieee_addr,

View file

@ -860,7 +860,9 @@ static int mcr20a_set_cca_mode(struct device *dev, u8_t mode)
static enum ieee802154_hw_caps mcr20a_get_capabilities(struct device *dev) static enum ieee802154_hw_caps mcr20a_get_capabilities(struct device *dev)
{ {
return IEEE802154_HW_FCS | IEEE802154_HW_2_4_GHZ; return IEEE802154_HW_FCS |
IEEE802154_HW_2_4_GHZ |
IEEE802154_HW_FILTER;
} }
/* Note: CCA before TX is enabled by default */ /* Note: CCA before TX is enabled by default */
@ -1021,6 +1023,23 @@ static int mcr20a_set_ieee_addr(struct device *dev, const u8_t *ieee_addr)
return 0; return 0;
} }
static int mcr20a_set_filter(struct device *dev,
enum ieee802154_filter_type type,
const struct ieee802154_filter *filter)
{
SYS_LOG_DBG("Applying filter %u", type);
if (type == IEEE802154_FILTER_TYPE_IEEE_ADDR) {
return mcr20a_set_ieee_addr(dev, filter->ieee_addr);
} else if (type == IEEE802154_FILTER_TYPE_SHORT_ADDR) {
return mcr20a_set_short_addr(dev, filter->short_addr);
} else if (type == IEEE802154_FILTER_TYPE_PAN_ID) {
return mcr20a_set_pan_id(dev, filter->pan_id);
}
return -EINVAL;
}
static int mcr20a_set_txpower(struct device *dev, s16_t dbm) static int mcr20a_set_txpower(struct device *dev, s16_t dbm)
{ {
struct mcr20a_context *mcr20a = dev->driver_data; struct mcr20a_context *mcr20a = dev->driver_data;
@ -1464,6 +1483,7 @@ static struct ieee802154_radio_api mcr20a_radio_api = {
.get_capabilities = mcr20a_get_capabilities, .get_capabilities = mcr20a_get_capabilities,
.cca = mcr20a_cca, .cca = mcr20a_cca,
.set_channel = mcr20a_set_channel, .set_channel = mcr20a_set_channel,
.set_filter = mcr20a_set_filter,
.set_pan_id = mcr20a_set_pan_id, .set_pan_id = mcr20a_set_pan_id,
.set_short_addr = mcr20a_set_short_addr, .set_short_addr = mcr20a_set_short_addr,
.set_ieee_addr = mcr20a_set_ieee_addr, .set_ieee_addr = mcr20a_set_ieee_addr,

View file

@ -142,7 +142,9 @@ out:
static enum ieee802154_hw_caps nrf5_get_capabilities(struct device *dev) static enum ieee802154_hw_caps nrf5_get_capabilities(struct device *dev)
{ {
return IEEE802154_HW_FCS | IEEE802154_HW_2_4_GHZ; return IEEE802154_HW_FCS |
IEEE802154_HW_2_4_GHZ |
IEEE802154_HW_FILTER;
} }
@ -228,6 +230,23 @@ static int nrf5_set_ieee_addr(struct device *dev, const u8_t *ieee_addr)
return 0; return 0;
} }
static int nrf5_set_filter(struct device *dev,
enum ieee802154_filter_type type,
const struct ieee802154_filter *filter)
{
SYS_LOG_DBG("Applying filter %u", type);
if (type == IEEE802154_FILTER_TYPE_IEEE_ADDR) {
return nrf5_set_ieee_addr(dev, filter->ieee_addr);
} else if (type == IEEE802154_FILTER_TYPE_SHORT_ADDR) {
return nrf5_set_short_addr(dev, filter->short_addr);
} else if (type == IEEE802154_FILTER_TYPE_PAN_ID) {
return nrf5_set_pan_id(dev, filter->pan_id);
}
return -EINVAL;
}
static int nrf5_set_txpower(struct device *dev, s16_t dbm) static int nrf5_set_txpower(struct device *dev, s16_t dbm)
{ {
struct nrf5_802154_data *nrf5_radio = NRF5_802154_DATA(dev); struct nrf5_802154_data *nrf5_radio = NRF5_802154_DATA(dev);
@ -405,6 +424,7 @@ static struct ieee802154_radio_api nrf5_radio_api = {
.get_capabilities = nrf5_get_capabilities, .get_capabilities = nrf5_get_capabilities,
.cca = nrf5_cca, .cca = nrf5_cca,
.set_channel = nrf5_set_channel, .set_channel = nrf5_set_channel,
.set_filter = nrf5_set_filter,
.set_pan_id = nrf5_set_pan_id, .set_pan_id = nrf5_set_pan_id,
.set_short_addr = nrf5_set_short_addr, .set_short_addr = nrf5_set_short_addr,
.set_ieee_addr = nrf5_set_ieee_addr, .set_ieee_addr = nrf5_set_ieee_addr,