From 92b41df711e0f354b09547de333deff1f6481b8b Mon Sep 17 00:00:00 2001 From: Oleg Hahm Date: Sun, 10 May 2015 21:50:07 +0200 Subject: [PATCH 1/5] ng_at86rf2xx: use correct check for CPUID_LEN --- drivers/ng_at86rf2xx/ng_at86rf2xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/ng_at86rf2xx/ng_at86rf2xx.c b/drivers/ng_at86rf2xx/ng_at86rf2xx.c index 145f4ef974..aa4dd87a13 100644 --- a/drivers/ng_at86rf2xx/ng_at86rf2xx.c +++ b/drivers/ng_at86rf2xx/ng_at86rf2xx.c @@ -101,7 +101,7 @@ void ng_at86rf2xx_reset(ng_at86rf2xx_t *dev) /* set short and long address */ #if CPUID_ID_LEN cpuid_get(cpuid); -#if CPUID < 8 +#if CPUID_ID_LEN < 8 /* in case CPUID_ID_LEN < 8, fill missing bytes with zeros */ for (int i = CPUID_ID_LEN; i < 8; i++) { cpuid[i] = 0; From 8658a346bd5c7e3d1d4d4de4ca74f2054e1068cf Mon Sep 17 00:00:00 2001 From: Oleg Hahm Date: Sun, 10 May 2015 23:11:12 +0200 Subject: [PATCH 2/5] ng_ieee802154: add data type for EUI-64 --- sys/include/net/ng_ieee802154.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sys/include/net/ng_ieee802154.h b/sys/include/net/ng_ieee802154.h index 82fb712948..374c87a544 100644 --- a/sys/include/net/ng_ieee802154.h +++ b/sys/include/net/ng_ieee802154.h @@ -21,6 +21,9 @@ #ifndef NG_IEEE802154_H_ #define NG_IEEE802154_H_ +#include +#include "byteorder.h" + #ifdef __cplusplus extern "C" { #endif @@ -58,6 +61,15 @@ extern "C" { #define NG_IEEE802154_FCF_SRC_ADDR_LONG (0xc0) /** @} */ +/** + * @brief Data type to represent an EUI-64. + */ +typedef union { + le_uint64_t uint64; /**< represented as 64 bit value */ + uint8_t uint8[8]; /**< split into 8 8-bit words. */ + le_uint16_t uint16[4]; /**< split into 4 16-bit words. */ +} eui64_t ; + #ifdef __cplusplus } #endif From c45eaf62decebb1fe29e462b711d07babd9ab056 Mon Sep 17 00:00:00 2001 From: Oleg Hahm Date: Sun, 10 May 2015 21:50:41 +0200 Subject: [PATCH 3/5] ng_at86rf2xx: compute unique EUI64 from CPUID The EUI64 for the at86rfxx is computed from the full CPUID by using sliding xor. --- drivers/ng_at86rf2xx/ng_at86rf2xx.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/drivers/ng_at86rf2xx/ng_at86rf2xx.c b/drivers/ng_at86rf2xx/ng_at86rf2xx.c index aa4dd87a13..6c84249783 100644 --- a/drivers/ng_at86rf2xx/ng_at86rf2xx.c +++ b/drivers/ng_at86rf2xx/ng_at86rf2xx.c @@ -18,12 +18,14 @@ * @author Thomas Eichinger * @author Hauke Petersen * @author Kaspar Schleiser + * @author Oliver Hahm * * @} */ #include "hwtimer.h" #include "periph/cpuid.h" +#include "byteorder.h" #include "net/ng_ieee802154.h" #include "net/ng_netbase.h" #include "ng_at86rf2xx_registers.h" @@ -87,8 +89,7 @@ void ng_at86rf2xx_reset(ng_at86rf2xx_t *dev) { #if CPUID_ID_LEN uint8_t cpuid[CPUID_ID_LEN]; - uint16_t addr_short; - uint64_t addr_long; + eui64_t addr_long; #endif /* trigger hardware reset */ @@ -101,6 +102,7 @@ void ng_at86rf2xx_reset(ng_at86rf2xx_t *dev) /* set short and long address */ #if CPUID_ID_LEN cpuid_get(cpuid); + #if CPUID_ID_LEN < 8 /* in case CPUID_ID_LEN < 8, fill missing bytes with zeros */ for (int i = CPUID_ID_LEN; i < 8; i++) { @@ -116,13 +118,8 @@ void ng_at86rf2xx_reset(ng_at86rf2xx_t *dev) cpuid[0] |= 0x02; /* copy and set long address */ memcpy(&addr_long, cpuid, 8); - ng_at86rf2xx_set_addr_long(dev, addr_long); - /* now compress the long addr to form the short address */ - for (int i = 2; i < 8; i++) { - cpuid[i & 0x01] ^= cpuid[i]; - } - memcpy(&addr_short, cpuid, 2); - ng_at86rf2xx_set_addr_short(dev, addr_short); + ng_at86rf2xx_set_addr_long(dev, NTOHLL(addr_long.uint64.u64)); + ng_at86rf2xx_set_addr_short(dev, NTOHS(addr_long.uint16[0].u16)); #else ng_at86rf2xx_set_addr_long(dev, NG_AT86RF2XX_DEFAULT_ADDR_LONG); ng_at86rf2xx_set_addr_short(dev, NG_AT86RF2XX_DEFAULT_ADDR_SHORT); From 92f4dec8da6dc7e9668c4eed517f4cdee56f3215 Mon Sep 17 00:00:00 2001 From: Oleg Hahm Date: Mon, 11 May 2015 11:29:28 +0200 Subject: [PATCH 4/5] xbee: use last 2 octets of EUI64 for short address Dependency two CPUID and hard coded default short address are superfluous now. --- drivers/include/xbee.h | 8 ++------ drivers/xbee/xbee.c | 20 +++----------------- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/drivers/include/xbee.h b/drivers/include/xbee.h index 94a863ad02..624ff37610 100644 --- a/drivers/include/xbee.h +++ b/drivers/include/xbee.h @@ -30,6 +30,7 @@ #include "periph/uart.h" #include "periph/gpio.h" #include "net/ng_netbase.h" +#include "net/ng_ieee802154.h" #ifdef __cplusplus extern "C" { @@ -59,11 +60,6 @@ #define XBEE_DEFAULT_PROTOCOL (NG_NETTYPE_UNDEF) #endif -/** - * @brief Default short address used after initialization - */ -#define XBEE_DEFAULT_SHORT_ADDR (0x0230) - /** * @brief Default PAN ID used after initialization */ @@ -109,7 +105,7 @@ typedef struct { ng_nettype_t proto; /**< protocol the interface speaks */ uint8_t options; /**< options field */ uint8_t addr_short[2]; /**< onw 802.15.4 short address */ - uint8_t addr_long[8]; /**< own 802.15.4 long address */ + eui64_t addr_long; /**< own 802.15.4 long address */ /* general variables for the UART RX state machine */ xbee_rx_state_t int_state; /**< current state if the UART RX FSM */ uint16_t int_size; /**< temporary space for parsing the diff --git a/drivers/xbee/xbee.c b/drivers/xbee/xbee.c index 5c31f24e90..a6f746bd0c 100644 --- a/drivers/xbee/xbee.c +++ b/drivers/xbee/xbee.c @@ -452,24 +452,10 @@ int xbee_init(xbee_t *dev, uart_t uart, uint32_t baudrate, /* exit command mode */ _at_cmd(dev, "ATCN\r"); - /* set default short address, use CPU ID if available */ -#if CPUID_ID_LEN - /* get CPU ID */ - uint8_t id[CPUID_ID_LEN]; - cpuid_get(id); - /* set address */ - memset(dev->addr_short, 0, 2); - for (int i = 0; i < CPUID_ID_LEN; i++) { - dev->addr_short[i & 0x01] ^= id[i]; - } -#else - dev->addr_short[0] = (uint8_t)(XBEE_DEFAULT_SHORT_ADDR >> 8); - dev->addr_short[1] = (uint8_t)(XBEE_DEFAULT_SHORT_ADDR); -#endif - _set_addr(dev, dev->addr_short, 2); /* load long address (we can not set it, its read only for Xbee devices) */ - _get_addr_long(dev, dev->addr_long, 8); + _get_addr_long(dev, dev->addr_long.uint8, 8); /* set default channel */ + _set_addr(dev, &((dev->addr_long).uint8[6]), 2); tmp[1] = 0; tmp[0] = XBEE_DEFAULT_CHANNEL; _set_channel(dev, tmp, 2); @@ -709,7 +695,7 @@ static void _isr_event(ng_netdev_t *netdev, uint32_t event_type) ng_netif_hdr_set_dst_addr(hdr, dev->addr_short, 2); } else { - ng_netif_hdr_set_dst_addr(hdr, dev->addr_long, 8); + ng_netif_hdr_set_dst_addr(hdr, dev->addr_long.uint8, 8); } pos = 3 + addr_len; /* allocate and copy payload */ From 67042901bc59a655544dadc5edb85caeedf00343 Mon Sep 17 00:00:00 2001 From: Oleg Hahm Date: Wed, 13 May 2015 15:27:43 +0200 Subject: [PATCH 5/5] xbee: remove superfluous includes --- drivers/xbee/xbee.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/drivers/xbee/xbee.c b/drivers/xbee/xbee.c index a6f746bd0c..c7a756c6e3 100644 --- a/drivers/xbee/xbee.c +++ b/drivers/xbee/xbee.c @@ -23,13 +23,9 @@ #include #include "xbee.h" -#include "mutex.h" #include "hwtimer.h" #include "msg.h" -#include "periph/uart.h" -#include "periph/gpio.h" #include "periph/cpuid.h" -#include "net/ng_netbase.h" #define ENABLE_DEBUG (0) #include "debug.h"