From b0e541593f9bd5382050a752e09c9f6d584913d1 Mon Sep 17 00:00:00 2001 From: Martine Lenders Date: Mon, 24 Sep 2018 14:11:12 +0200 Subject: [PATCH 1/2] tests/gnrc_sixlowpan: provide EUI-64 for dummy netdev The dummy netdev of this test doesn't provide any address. This adds at least the IEEE 802.15.4 EUI-64 and makes the NETOPT_SRC_LEN option dependent on it. --- tests/gnrc_sixlowpan/main.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/tests/gnrc_sixlowpan/main.c b/tests/gnrc_sixlowpan/main.c index aee8f88b68..74bcbbc4a7 100644 --- a/tests/gnrc_sixlowpan/main.c +++ b/tests/gnrc_sixlowpan/main.c @@ -37,9 +37,16 @@ #include "xtimer.h" #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 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) { @@ -64,10 +71,19 @@ static int _get_netdev_src_len(netdev_t *netdev, void *value, size_t max_len) { (void)netdev; assert(max_len == sizeof(uint16_t)); - *((uint16_t *)value) = sizeof(eui64_t); + *((uint16_t *)value) = sizeof(_ieee802154_local_eui64); 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) { gnrc_netif_t *netif; @@ -79,6 +95,8 @@ static void _init_interface(void) _get_netdev_max_packet_size); netdev_test_set_get_cb(&_ieee802154_dev, NETOPT_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_stack, THREAD_STACKSIZE_DEFAULT, GNRC_NETIF_PRIO, "dummy_netif", (netdev_t *)&_ieee802154_dev); @@ -106,8 +124,8 @@ static void _send_packet(void) uint8_t src[8]; uint8_t dst[8]; } netif_hdr = { - .src = { 0x02, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x02 }, - .dst = { 0x02, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x01 }, + .src = IEEE802154_REMOTE_EUI64, + .dst = IEEE802154_LOCAL_EUI64, }; gnrc_netif_hdr_init(&(netif_hdr.netif_hdr), 8, 8); From 05aa8ab66bb904ecc2790c3edf98639a1954339d Mon Sep 17 00:00:00 2001 From: Martine Lenders Date: Mon, 24 Sep 2018 14:00:16 +0200 Subject: [PATCH 2/2] gnrc_netif: assert that l2addr_len is 0 without address If the device provides an address length, but no address it is obviously faulty. --- sys/net/gnrc/netif/gnrc_netif.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sys/net/gnrc/netif/gnrc_netif.c b/sys/net/gnrc/netif/gnrc_netif.c index 61a5cf570b..470db0d8c5 100644 --- a/sys/net/gnrc/netif/gnrc_netif.c +++ b/sys/net/gnrc/netif/gnrc_netif.c @@ -1192,6 +1192,11 @@ static void _update_l2addr_from_dev(gnrc_netif_t *netif) if (res != -ENOTSUP) { 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) { netif->l2addr_len = res; }