Skip to content

Commit

Permalink
xbee: disable short address when the address length is set to 8
Browse files Browse the repository at this point in the history
XBee sends short address even for `API_ID_TX_LONG_ADDR` if short address is
enabled. This results in check sum error of ICMPv6 since the IP address is
computed based on long address on the sender side while it is computed based on
short address on the receiver side.
  • Loading branch information
Yonezawa-T2 committed Dec 9, 2015
1 parent d52e469 commit 5807145
Showing 1 changed file with 32 additions and 12 deletions.
44 changes: 32 additions & 12 deletions drivers/xbee/xbee.c
Original file line number Diff line number Diff line change
Expand Up @@ -254,31 +254,41 @@ static int _get_addr_long(xbee_t *dev, uint8_t *val, size_t len)
return -ECANCELED;
}

static int _set_addr(xbee_t *dev, uint8_t *val, size_t len)
static int _set_short_addr(xbee_t *dev, uint8_t *address)
{
uint8_t cmd[4];
resp_t resp;

cmd[0] = 'M';
cmd[1] = 'Y';
cmd[2] = address[0];
cmd[3] = address[1];
_api_at_cmd(dev, cmd, 4, &resp);

return resp.status;
}

static int _set_addr(xbee_t *dev, uint8_t *val, size_t len)
{
/* device only supports setting the short address */
if (len != 2) {
return -ENOTSUP;
}
cmd[0] = 'M';
cmd[1] = 'Y';
cmd[2] = val[0];
cmd[3] = val[1];

if (dev->addr_flags & XBEE_ADDR_FLAGS_LONG ||
_set_short_addr(dev, val) == 0) {

#ifdef MODULE_SIXLOWPAN
/* https://tools.ietf.org/html/rfc4944#section-12 requires the first bit to
* 0 for unicast addresses */
val[1] &= 0x7F;
/* https://tools.ietf.org/html/rfc4944#section-12 requires the first bit
* to 0 for unicast addresses */
val[1] &= 0x7F;
#endif

_api_at_cmd(dev, cmd, 4, &resp);
if (resp.status == 0) {
memcpy(dev->addr_short, val, 2);

return 2;
}

return -ECANCELED;
}

Expand All @@ -291,9 +301,19 @@ static int _set_addr_len(xbee_t *dev, uint16_t *val, size_t len)
switch (*val) {
case 8:
dev->addr_flags |= XBEE_ADDR_FLAGS_LONG;

// disable short address
uint8_t disabled_addr[] = { 0xFF, 0xFF };

_set_short_addr(dev, disabled_addr);

break;
case 2:
dev->addr_flags &= ~XBEE_ADDR_FLAGS_LONG;

// restore short address
_set_short_addr(dev, dev->addr_short);

break;
default:
return -EINVAL;
Expand Down Expand Up @@ -771,8 +791,8 @@ static void _isr_event(gnrc_netdev_t *netdev, uint32_t event_type)
DEBUG(", options: %02x", (uint8_t) dev->rx_buf[1 + addr_len + 1]); // API ID + source address + RSSI
DEBUG(", payload:");

for (size_t i = 0; i < dev->rx_limit - pos - 1; i++) {
DEBUG(" %02x", (uint8_t) dev->rx_buf[pos + i]);
for (size_t i = 0; i < pkt->size; i++) {
DEBUG(" %02x", ((uint8_t *) pkt->data)[i]);
}
DEBUG("\n");
#endif
Expand Down

0 comments on commit 5807145

Please sign in to comment.