diff --git a/sys/include/net/gnrc/netif.h b/sys/include/net/gnrc/netif.h index 236891c38cd179204b5336d450254b642bce758c..37eb8413e63bda44f06930c356b608b6b16797a1 100644 --- a/sys/include/net/gnrc/netif.h +++ b/sys/include/net/gnrc/netif.h @@ -46,6 +46,7 @@ #endif #include "net/ndp.h" #include "net/netdev.h" +#include "net/netopt.h" #include "rmutex.h" #ifdef __cplusplus diff --git a/sys/include/net/gnrc/netif/internal.h b/sys/include/net/gnrc/netif/internal.h index bcf3aaa36b1bbd923f61e69c4f4d9bf6f35b5749..00beb3e0e8d2c03c2d6fc3a6b55d7d11cd433a3d 100644 --- a/sys/include/net/gnrc/netif/internal.h +++ b/sys/include/net/gnrc/netif/internal.h @@ -22,6 +22,7 @@ #define NET_GNRC_NETIF_INTERNAL_H #include "net/gnrc/netif.h" +#include "net/netopt.h" #ifdef MODULE_GNRC_IPV6_NIB #include "net/gnrc/ipv6/nib/conf.h" @@ -414,6 +415,17 @@ static inline bool gnrc_netif_is_6lbr(const gnrc_netif_t *netif) * need adaptions for your port * @{ */ +/** + * @brief Get the default link-layer address option for the given + * gnrc_netif_t::device_type of a network interface + * + * @param[in] netif The network interface to get the default link-layer + * address option for. + * + * @return Either @ref NETOPT_ADDRESS or @ref NETOPT_ADDRESS_LONG. + */ +netopt_t gnrc_netif_get_l2addr_opt(const gnrc_netif_t *netif); + #if defined(MODULE_GNRC_IPV6) || defined(DOXYGEN) /** * @brief Converts a given hardware address to an IPv6 IID. diff --git a/sys/net/gnrc/netif/gnrc_netif.c b/sys/net/gnrc/netif/gnrc_netif.c index cfab9795f77bdfb43f07d288b996fe4e669d0eb5..c0eb5998f04ddb2057180a2d5404371ac2e083e8 100644 --- a/sys/net/gnrc/netif/gnrc_netif.c +++ b/sys/net/gnrc/netif/gnrc_netif.c @@ -1109,27 +1109,8 @@ static void _update_l2addr_from_dev(gnrc_netif_t *netif) { netdev_t *dev = netif->dev; int res; - netopt_t opt = NETOPT_ADDRESS; + netopt_t opt = gnrc_netif_get_l2addr_opt(netif); - switch (netif->device_type) { -#if defined(MODULE_NETDEV_IEEE802154) || defined(MODULE_XBEE) \ - || defined(MODULE_NORDIC_SOFTDEVICE_BLE) - case NETDEV_TYPE_BLE: - case NETDEV_TYPE_IEEE802154: { - uint16_t tmp; - - res = dev->driver->get(dev, NETOPT_SRC_LEN, &tmp, sizeof(tmp)); - assert(res == sizeof(tmp)); - netif->l2addr_len = (uint8_t)tmp; - if (tmp == IEEE802154_LONG_ADDRESS_LEN) { - opt = NETOPT_ADDRESS_LONG; - } - } - break; -#endif - default: - break; - } res = dev->driver->get(dev, opt, netif->l2addr, sizeof(netif->l2addr)); if (res != -ENOTSUP) { diff --git a/sys/net/gnrc/netif/gnrc_netif_device_type.c b/sys/net/gnrc/netif/gnrc_netif_device_type.c index 87a42a8754b0e9112360f0f864be3825f658e684..97b99261aaeb78ca299a9280c4828606e56df34e 100644 --- a/sys/net/gnrc/netif/gnrc_netif_device_type.c +++ b/sys/net/gnrc/netif/gnrc_netif_device_type.c @@ -21,6 +21,35 @@ #include "net/eui48.h" #include "net/ieee802154.h" +netopt_t gnrc_netif_get_l2addr_opt(const gnrc_netif_t *netif) +{ + netopt_t res = NETOPT_ADDRESS; + + switch (netif->device_type) { +#if defined(MODULE_NETDEV_IEEE802154) || defined(MODULE_XBEE) || \ + defined(MODULE_NORDIC_SOFTDEVICE_BLE) + case NETDEV_TYPE_IEEE802154: + case NETDEV_TYPE_BLE: { + netdev_t *dev = netif->dev; + int r; + uint16_t tmp; + + r = dev->driver->get(dev, NETOPT_SRC_LEN, &tmp, sizeof(tmp)); + assert(r == sizeof(tmp)); + assert(r <= ((int)UINT8_MAX)); + (void)r; + if (tmp == IEEE802154_LONG_ADDRESS_LEN) { + res = NETOPT_ADDRESS_LONG; + } + } + break; +#endif + default: + break; + } + return res; +} + #ifdef MODULE_GNRC_IPV6 #if defined(MODULE_CC110X) || defined(MODULE_NRFMIN) static void _create_iid_from_short(const uint8_t *addr, size_t addr_len,