Merge pull request #10023 from miri64/gnrc_netif/fix/no-addr-but-addr-len

gnrc_netif: Fix l2addr_len > 0, but no l2addr edge-case
This commit is contained in:
Gaëtan Harter 2018-10-25 14:31:32 +02:00 committed by GitHub
commit c5deac4865
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 3 deletions

View File

@ -1211,6 +1211,11 @@ static void _update_l2addr_from_dev(gnrc_netif_t *netif)
if (res != -ENOTSUP) { if (res != -ENOTSUP) {
netif->flags |= GNRC_NETIF_FLAGS_HAS_L2ADDR; netif->flags |= GNRC_NETIF_FLAGS_HAS_L2ADDR;
} }
else {
/* If no address is provided but still an address length given above,
* we are in an invalid state */
assert(netif->l2addr_len == 0);
}
if (res > 0) { if (res > 0) {
netif->l2addr_len = res; netif->l2addr_len = res;
} }

View File

@ -37,9 +37,16 @@
#include "xtimer.h" #include "xtimer.h"
#define IEEE802154_MAX_FRAG_SIZE (102) #define IEEE802154_MAX_FRAG_SIZE (102)
#define IEEE802154_LOCAL_EUI64 { \
0x02, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x01 \
}
#define IEEE802154_REMOTE_EUI64 { \
0x02, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x02 \
}
static char _netif_stack[THREAD_STACKSIZE_DEFAULT]; static char _netif_stack[THREAD_STACKSIZE_DEFAULT];
static netdev_test_t _ieee802154_dev; static netdev_test_t _ieee802154_dev;
static const uint8_t _ieee802154_local_eui64[] = IEEE802154_LOCAL_EUI64;
static int _get_netdev_device_type(netdev_t *netdev, void *value, size_t max_len) static int _get_netdev_device_type(netdev_t *netdev, void *value, size_t max_len)
{ {
@ -64,10 +71,19 @@ static int _get_netdev_src_len(netdev_t *netdev, void *value, size_t max_len)
{ {
(void)netdev; (void)netdev;
assert(max_len == sizeof(uint16_t)); assert(max_len == sizeof(uint16_t));
*((uint16_t *)value) = sizeof(eui64_t); *((uint16_t *)value) = sizeof(_ieee802154_local_eui64);
return sizeof(uint16_t); return sizeof(uint16_t);
} }
static int _get_netdev_addr_long(netdev_t *netdev, void *value, size_t max_len)
{
(void)netdev;
assert(max_len >= sizeof(_ieee802154_local_eui64));
memcpy(value, _ieee802154_local_eui64, sizeof(_ieee802154_local_eui64));
return sizeof(_ieee802154_local_eui64);
}
static void _init_interface(void) static void _init_interface(void)
{ {
gnrc_netif_t *netif; gnrc_netif_t *netif;
@ -79,6 +95,8 @@ static void _init_interface(void)
_get_netdev_max_packet_size); _get_netdev_max_packet_size);
netdev_test_set_get_cb(&_ieee802154_dev, NETOPT_SRC_LEN, netdev_test_set_get_cb(&_ieee802154_dev, NETOPT_SRC_LEN,
_get_netdev_src_len); _get_netdev_src_len);
netdev_test_set_get_cb(&_ieee802154_dev, NETOPT_ADDRESS_LONG,
_get_netdev_addr_long);
netif = gnrc_netif_ieee802154_create( netif = gnrc_netif_ieee802154_create(
_netif_stack, THREAD_STACKSIZE_DEFAULT, GNRC_NETIF_PRIO, _netif_stack, THREAD_STACKSIZE_DEFAULT, GNRC_NETIF_PRIO,
"dummy_netif", (netdev_t *)&_ieee802154_dev); "dummy_netif", (netdev_t *)&_ieee802154_dev);
@ -106,8 +124,8 @@ static void _send_packet(void)
uint8_t src[8]; uint8_t src[8];
uint8_t dst[8]; uint8_t dst[8];
} netif_hdr = { } netif_hdr = {
.src = { 0x02, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x02 }, .src = IEEE802154_REMOTE_EUI64,
.dst = { 0x02, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x01 }, .dst = IEEE802154_LOCAL_EUI64,
}; };
gnrc_netif_hdr_init(&(netif_hdr.netif_hdr), 8, 8); gnrc_netif_hdr_init(&(netif_hdr.netif_hdr), 8, 8);