diff --git a/cpu/native/include/cpu_conf.h b/cpu/native/include/cpu_conf.h
index 043a4e7df4df8b934af6b706e54314925adfc563..88c71d9c1e1f704a14b40ee43e574839ea49be07 100644
--- a/cpu/native/include/cpu_conf.h
+++ b/cpu/native/include/cpu_conf.h
@@ -55,6 +55,11 @@ extern "C" {
  */
 #define NATIVE_ETH_PROTO 0x1234
 
+#if (defined(GNRC_PKTBUF_SIZE)) && (GNRC_PKTBUF_SIZE < 2048)
+#   undef  GNRC_PKTBUF_SIZE
+#   define GNRC_PKTBUF_SIZE     (2048)
+#endif
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/cpu/native/netdev2_tap/netdev2_tap.c b/cpu/native/netdev2_tap/netdev2_tap.c
index 2c9e3a343b4fdcaa70b5c98ef1246af8f64228c8..c1fa605110a92f88ece3accaea436808a5b15960 100644
--- a/cpu/native/netdev2_tap/netdev2_tap.c
+++ b/cpu/native/netdev2_tap/netdev2_tap.c
@@ -215,8 +215,6 @@ static int _recv(netdev2_t *netdev2, void *buf, size_t len, void *info)
     (void)info;
 
     if (!buf) {
-        int waiting_bytes;
-
         if (len > 0) {
             /* no memory available in pktbuf, discarding the frame */
             DEBUG("netdev2_tap: discarding the frame\n");
@@ -236,9 +234,9 @@ static int _recv(netdev2_t *netdev2, void *buf, size_t len, void *info)
             _continue_reading(dev);
         }
 
-        /* get number of waiting bytes at dev->tap_fd */
-        real_ioctl(dev->tap_fd, FIONREAD, &waiting_bytes);
-        return waiting_bytes;
+        /* no way of figuring out packet size without racey buffering,
+         * so we return the maximum possible size */
+        return ETHERNET_FRAME_LEN;
     }
 
     int nread = real_read(dev->tap_fd, buf, len);