From 0fa5b81e6a44d5628879d0ef5dc9b0a701d2807c Mon Sep 17 00:00:00 2001 From: Martine Lenders <mail@martine-lenders.eu> Date: Sat, 2 Apr 2016 00:51:19 +0200 Subject: [PATCH] netdev2_ieee802154: fix channel setting --- .../netdev2_ieee802154/netdev2_ieee802154.c | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/drivers/netdev2_ieee802154/netdev2_ieee802154.c b/drivers/netdev2_ieee802154/netdev2_ieee802154.c index 5736a0b7e6..80868642fa 100644 --- a/drivers/netdev2_ieee802154/netdev2_ieee802154.c +++ b/drivers/netdev2_ieee802154/netdev2_ieee802154.c @@ -154,7 +154,7 @@ int netdev2_ieee802154_get(netdev2_ieee802154_t *dev, netopt_t opt, void *value, res = -EOVERFLOW; break; } - *((netstats_t**)value) = &dev->netdev.stats; + *((netstats_t **)value) = &dev->netdev.stats; res = sizeof(uintptr_t); break; #endif @@ -170,6 +170,21 @@ int netdev2_ieee802154_set(netdev2_ieee802154_t *dev, netopt_t opt, void *value, int res = -ENOTSUP; switch (opt) { + case NETOPT_CHANNEL: + { + if (len > sizeof(uint16_t)) { + res = -EOVERFLOW; + break; + } + uint16_t chan = *((uint16_t *)value); + /* real validity needs to be checked by device, since sub-GHz and + * 2.4 GHz band radios have different legal values. Here we only + * check that it fits in an 8-bit variabl*/ + assert(chan <= UINT8_MAX); + dev->chan = chan; + res = sizeof(uint16_t); + break; + } case NETOPT_ADDRESS: if (len > sizeof(dev->short_addr)) { res = -EOVERFLOW; @@ -208,14 +223,13 @@ int netdev2_ieee802154_set(netdev2_ieee802154_t *dev, netopt_t opt, void *value, res = sizeof(uint16_t); break; case NETOPT_NID: - if (len > sizeof(dev->pan)) { + if (len > sizeof(uint16_t)) { res = -EOVERFLOW; break; } dev->pan = *((uint16_t *)value); res = sizeof(dev->pan); break; - /* channel can be very device specific */ case NETOPT_AUTOACK: if ((*(bool *)value)) { dev->flags |= NETDEV2_IEEE802154_ACK_REQ; -- GitLab