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,