From ff6b8aa4f13b9ffbc27c17243769bb6fe1b4ab72 Mon Sep 17 00:00:00 2001
From: Kaspar Schleiser <kaspar@schleiser.de>
Date: Thu, 11 Jan 2018 23:48:57 +0100
Subject: [PATCH] cpu/native/netdev_tap: adapt to netdev with iolist

---
 Makefile.dep                       |  1 +
 cpu/native/netdev_tap/netdev_tap.c | 21 +++++++++++++--------
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/Makefile.dep b/Makefile.dep
index aafc7540b3..eb0e4c67af 100644
--- a/Makefile.dep
+++ b/Makefile.dep
@@ -110,6 +110,7 @@ endif
 ifneq (,$(filter netdev_tap,$(USEMODULE)))
   USEMODULE += netif
   USEMODULE += netdev_eth
+  USEMODULE += iolist
 endif
 
 ifneq (,$(filter gnrc_tftp,$(USEMODULE)))
diff --git a/cpu/native/netdev_tap/netdev_tap.c b/cpu/native/netdev_tap/netdev_tap.c
index 1416a77793..2330e64f4f 100644
--- a/cpu/native/netdev_tap/netdev_tap.c
+++ b/cpu/native/netdev_tap/netdev_tap.c
@@ -26,6 +26,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sys/ioctl.h>
+#include <sys/uio.h>
 #include <unistd.h>
 
 /* needs to be included before native's declarations of ntohl etc. */
@@ -51,6 +52,7 @@
 
 #include "async_read.h"
 
+#include "iolist.h"
 #include "net/eui64.h"
 #include "net/netdev.h"
 #include "net/netdev/eth.h"
@@ -64,7 +66,7 @@
 
 /* netdev interface */
 static int _init(netdev_t *netdev);
-static int _send(netdev_t *netdev, const struct iovec *vector, unsigned n);
+static int _send(netdev_t *netdev, const iolist_t *iolist);
 static int _recv(netdev_t *netdev, void *buf, size_t n, void *info);
 
 static inline void _get_mac_addr(netdev_t *netdev, uint8_t *dst)
@@ -273,17 +275,20 @@ static int _recv(netdev_t *netdev, void *buf, size_t len, void *info)
     return -1;
 }
 
-static int _send(netdev_t *netdev, const struct iovec *vector, unsigned n)
+static int _send(netdev_t *netdev, const iolist_t *iolist)
 {
     netdev_tap_t *dev = (netdev_tap_t*)netdev;
-    int res = _native_writev(dev->tap_fd, vector, n);
+
+    struct iovec iov[iolist_count(iolist)];
+
+    unsigned n;
+    size_t bytes = iolist_to_iovec(iolist, iov, &n);
+
+    int res = _native_writev(dev->tap_fd, iov, n);
 #ifdef MODULE_NETSTATS_L2
-    size_t bytes = 0;
-    for (unsigned i = 0; i < n; i++) {
-        bytes += vector->iov_len;
-        vector++;
-    }
     netdev->stats.tx_bytes += bytes;
+#else
+    (void)bytes;
 #endif
     if (netdev->event_callback) {
         netdev->event_callback(netdev, NETDEV_EVENT_TX_COMPLETE);
-- 
GitLab