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