diff --git a/sys/include/net/gnrc/netif/internal.h b/sys/include/net/gnrc/netif/internal.h
index 00beb3e0e8d2c03c2d6fc3a6b55d7d11cd433a3d..4a055343aa3262f0150d9238eb76ef992d9c5397 100644
--- a/sys/include/net/gnrc/netif/internal.h
+++ b/sys/include/net/gnrc/netif/internal.h
@@ -427,6 +427,14 @@ static inline bool gnrc_netif_is_6lbr(const gnrc_netif_t *netif)
 netopt_t gnrc_netif_get_l2addr_opt(const gnrc_netif_t *netif);
 
 #if defined(MODULE_GNRC_IPV6) || defined(DOXYGEN)
+/**
+ * @brief   Initialize IPv6 MTU and other packet length related members of
+ *          @ref gnrc_netif_t based on gnrc_netif_t::device_type
+ *
+ * @param[in,out] netif The network interface to initialize the MTU for.
+ */
+void gnrc_netif_ipv6_init_mtu(gnrc_netif_t *netif);
+
 /**
  * @brief   Converts a given hardware address to an IPv6 IID.
  *
@@ -538,6 +546,7 @@ static inline int gnrc_netif_ipv6_get_iid(gnrc_netif_t *netif, eui64_t *iid)
 int gnrc_netif_ndp_addr_len_from_l2ao(gnrc_netif_t *netif,
                                       const ndp_opt_t *opt);
 #else   /* defined(MODULE_GNRC_IPV6) || defined(DOXYGEN) */
+#define gnrc_netif_ipv6_init_mtu(netif)                             (void)netif
 #define gnrc_netif_ipv6_iid_from_addr(netif, addr, addr_len, iid)   (-ENOTSUP)
 #define gnrc_netif_ipv6_iid_to_addr(netif, iid, addr)               (-ENOTSUP)
 #define gnrc_netif_ndp_addr_len_from_l2ao(netif, opt)               (-ENOTSUP)
diff --git a/sys/net/gnrc/netif/gnrc_netif.c b/sys/net/gnrc/netif/gnrc_netif.c
index c0eb5998f04ddb2057180a2d5404371ac2e083e8..df0085d371ddc7abaae2ca9a14abdf8b39049096 100644
--- a/sys/net/gnrc/netif/gnrc_netif.c
+++ b/sys/net/gnrc/netif/gnrc_netif.c
@@ -1136,60 +1136,7 @@ static void _init_from_device(gnrc_netif_t *netif)
     (void)res;
     assert(res == sizeof(tmp));
     netif->device_type = (uint8_t)tmp;
-    switch (netif->device_type) {
-#if defined(MODULE_NETDEV_IEEE802154) || defined(MODULE_NRFMIN) || \
-    defined(MODULE_XBEE) || defined(MODULE_ESP_NOW) || \
-    defined(MODULE_GNRC_SIXLOENC)
-        case NETDEV_TYPE_IEEE802154:
-        case NETDEV_TYPE_NRFMIN:
-#ifdef MODULE_GNRC_SIXLOWPAN_IPHC
-            netif->flags |= GNRC_NETIF_FLAGS_6LO_HC;
-#endif
-            /* intentionally falls through */
-        case NETDEV_TYPE_ESP_NOW:
-#ifdef MODULE_GNRC_IPV6
-            res = dev->driver->get(dev, NETOPT_MAX_PACKET_SIZE, &tmp, sizeof(tmp));
-            assert(res == sizeof(tmp));
-#ifdef MODULE_GNRC_SIXLOWPAN
-            netif->ipv6.mtu = IPV6_MIN_MTU;
-            netif->sixlo.max_frag_size = tmp;
-#else
-            netif->ipv6.mtu = tmp;
-#endif
-#endif
-            break;
-#endif  /* MODULE_NETDEV_IEEE802154 */
-#ifdef MODULE_NETDEV_ETH
-        case NETDEV_TYPE_ETHERNET:
-#ifdef MODULE_GNRC_IPV6
-            netif->ipv6.mtu = ETHERNET_DATA_LEN;
-#endif
-#if defined(MODULE_GNRC_SIXLOWPAN_IPHC) && defined(MODULE_GNRC_SIXLOENC)
-            netif->flags |= GNRC_NETIF_FLAGS_6LO_HC;
-#endif
-            break;
-#endif
-#ifdef MODULE_NORDIC_SOFTDEVICE_BLE
-        case NETDEV_TYPE_BLE:
-            netif->ipv6.mtu = IPV6_MIN_MTU;
-#ifdef MODULE_GNRC_SIXLOWPAN_IPHC
-            netif->flags |= GNRC_NETIF_FLAGS_6LO_HC;
-#endif
-            break;
-#endif
-        default:
-#ifdef MODULE_GNRC_IPV6
-            res = dev->driver->get(dev, NETOPT_MAX_PACKET_SIZE, &tmp, sizeof(tmp));
-            if (res < 0) {
-                /* assume maximum possible transition unit */
-                netif->ipv6.mtu = UINT16_MAX;
-            }
-            else {
-                netif->ipv6.mtu = tmp;
-            }
-#endif
-            break;
-    }
+    gnrc_netif_ipv6_init_mtu(netif);
     _update_l2addr_from_dev(netif);
 }
 
diff --git a/sys/net/gnrc/netif/gnrc_netif_device_type.c b/sys/net/gnrc/netif/gnrc_netif_device_type.c
index 97b99261aaeb78ca299a9280c4828606e56df34e..031a0474dbebc1d114b78bca6b23c835ce493226 100644
--- a/sys/net/gnrc/netif/gnrc_netif_device_type.c
+++ b/sys/net/gnrc/netif/gnrc_netif_device_type.c
@@ -17,8 +17,12 @@
 #include <errno.h>
 
 #include "log.h"
+#ifdef MODULE_GNRC_IPV6
+#include "net/ipv6.h"
+#endif
 #include "net/gnrc/netif.h"
 #include "net/eui48.h"
+#include "net/ethernet.h"
 #include "net/ieee802154.h"
 
 netopt_t gnrc_netif_get_l2addr_opt(const gnrc_netif_t *netif)
@@ -51,6 +55,73 @@ netopt_t gnrc_netif_get_l2addr_opt(const gnrc_netif_t *netif)
 }
 
 #ifdef MODULE_GNRC_IPV6
+void gnrc_netif_ipv6_init_mtu(gnrc_netif_t *netif)
+{
+#ifdef MODULE_GNRC_IPV6
+    netdev_t *dev = netif->dev;
+    int res;
+    uint16_t tmp;
+
+    switch (netif->device_type) {
+#if defined(MODULE_NETDEV_IEEE802154) || defined(MODULE_NRFMIN) || \
+    defined(MODULE_XBEE) || defined(MODULE_ESP_NOW) || \
+    defined(MODULE_GNRC_SIXLOENC)
+        case NETDEV_TYPE_IEEE802154:
+        case NETDEV_TYPE_NRFMIN:
+#ifdef MODULE_GNRC_SIXLOWPAN_IPHC
+            netif->flags |= GNRC_NETIF_FLAGS_6LO_HC;
+#endif
+            /* intentionally falls through */
+        case NETDEV_TYPE_ESP_NOW:
+            res = dev->driver->get(dev, NETOPT_MAX_PACKET_SIZE,
+                                   &tmp, sizeof(tmp));
+            assert(res == sizeof(tmp));
+#ifdef MODULE_GNRC_SIXLOWPAN
+            netif->ipv6.mtu = IPV6_MIN_MTU;
+            netif->sixlo.max_frag_size = tmp;
+#else
+            netif->ipv6.mtu = tmp;
+#endif
+            break;
+#endif  /* defined(MODULE_NETDEV_IEEE802154) || defined(MODULE_NRFMIN) || \
+         * defined(MODULE_XBEE) || defined(MODULE_ESP_NOW) */
+#ifdef MODULE_NETDEV_ETH
+        case NETDEV_TYPE_ETHERNET:
+#ifdef MODULE_GNRC_IPV6
+            netif->ipv6.mtu = ETHERNET_DATA_LEN;
+#endif
+#if defined(MODULE_GNRC_SIXLOWPAN_IPHC) && defined(MODULE_GNRC_SIXLOENC)
+            netif->flags |= GNRC_NETIF_FLAGS_6LO_HC;
+#endif
+            break;
+#endif
+#ifdef MODULE_NORDIC_SOFTDEVICE_BLE
+        case NETDEV_TYPE_BLE:
+            netif->ipv6.mtu = IPV6_MIN_MTU;
+#ifdef MODULE_GNRC_SIXLOWPAN_IPHC
+            netif->flags |= GNRC_NETIF_FLAGS_6LO_HC;
+#endif
+            break;
+#endif
+        default:
+#ifdef DEVELHELP
+            LOG_DEBUG("gnrc_netif: getting MTU from device for interface %i\n",
+                      netif->pid);
+#endif
+            res = dev->driver->get(dev, NETOPT_MAX_PACKET_SIZE,
+                                   &tmp, sizeof(tmp));
+            if (res < 0) {
+                /* assume maximum possible transition unit */
+                netif->ipv6.mtu = UINT16_MAX;
+            }
+            else {
+                netif->ipv6.mtu = tmp;
+            }
+            break;
+    }
+#endif
+}
+
 #if defined(MODULE_CC110X) || defined(MODULE_NRFMIN)
 static void _create_iid_from_short(const uint8_t *addr, size_t addr_len,
                                    eui64_t *iid)