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:
parent
c65c2a1130
commit
54b3d6b130
4 changed files with 85 additions and 7 deletions
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue