From a082e101574b63463d23aa0a59a89ba7afb18a1d Mon Sep 17 00:00:00 2001
From: Martine Lenders <m.lenders@fu-berlin.de>
Date: Tue, 27 Mar 2018 21:51:58 +0200
Subject: [PATCH] gnrc_netif: add GNRC specific implementation of netif.h

---
 Makefile.dep                             |  4 ++
 sys/Makefile.include                     |  3 +
 sys/net/gnrc/netif/_netif.c              | 86 ++++++++++++++++++++++++
 sys/net/gnrc/netif/include/netif_types.h | 36 ++++++++++
 4 files changed, 129 insertions(+)
 create mode 100644 sys/net/gnrc/netif/_netif.c
 create mode 100644 sys/net/gnrc/netif/include/netif_types.h

diff --git a/Makefile.dep b/Makefile.dep
index 9b9dcd53ab..356746da10 100644
--- a/Makefile.dep
+++ b/Makefile.dep
@@ -143,6 +143,10 @@ ifneq (,$(filter trickle,$(USEMODULE)))
   USEMODULE += xtimer
 endif
 
+ifneq (,$(filter gnrc_netif,$(USEMODULE)))
+  USEMODULE += netif
+endif
+
 ifneq (,$(filter ieee802154 nrfmin,$(USEMODULE)))
   ifneq (,$(filter gnrc_ipv6, $(USEMODULE)))
     USEMODULE += gnrc_sixlowpan
diff --git a/sys/Makefile.include b/sys/Makefile.include
index dfbb94067b..baa5e0b298 100644
--- a/sys/Makefile.include
+++ b/sys/Makefile.include
@@ -13,6 +13,9 @@ endif
 ifneq (,$(filter fib,$(USEMODULE)))
   USEMODULE_INCLUDES += $(RIOTBASE)/sys/posix/include
 endif
+ifneq (,$(filter gnrc_netif,$(USEMODULE)))
+  USEMODULE_INCLUDES += $(RIOTBASE)/sys/net/gnrc/netif/include
+endif
 ifneq (,$(filter gnrc_sock,$(USEMODULE)))
   USEMODULE_INCLUDES += $(RIOTBASE)/sys/net/gnrc/sock/include
   ifneq (,$(filter gnrc_ipv6,$(USEMODULE)))
diff --git a/sys/net/gnrc/netif/_netif.c b/sys/net/gnrc/netif/_netif.c
new file mode 100644
index 0000000000..4c534b797c
--- /dev/null
+++ b/sys/net/gnrc/netif/_netif.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2018 Freie Universität Berlin
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser
+ * General Public License v2.1. See the file LICENSE in the top level
+ * directory for more details.
+ */
+
+/**
+ * @{
+ *
+ * Implements @ref net_netif for @ref net_gnrc
+ *
+ * @file
+ * @author  Martine Lenders <m.lenders@fu-berlin.de>
+ */
+
+#include <string.h>
+
+#include "fmt.h"
+#include "net/gnrc/netapi.h"
+#include "net/gnrc/netif/internal.h"
+
+#include "net/netif.h"
+
+netif_t netif_iter(netif_t last)
+{
+    gnrc_netif_t *netif;
+
+    if (last == NETIF_INVALID) {
+        netif = gnrc_netif_iter(NULL);
+    }
+    else if ((netif = gnrc_netif_get_by_pid((kernel_pid_t)last)) != NULL) {
+        netif = gnrc_netif_iter(netif);
+    }
+    if (netif != NULL) {
+        return netif->pid;
+    }
+    else {
+        return NETIF_INVALID;
+    }
+}
+
+int netif_get_name(netif_t iface, char *name)
+{
+    gnrc_netif_t *netif = gnrc_netif_get_by_pid((kernel_pid_t)iface);
+    int res = 0;
+
+    if (netif != NULL) {
+        res += fmt_str(name, "if");
+        res += fmt_u16_dec(&name[res], netif->pid);
+        name[res] = '\0';
+    }
+    return res;
+}
+
+netif_t netif_get_by_name(const char *name)
+{
+    if ((strncmp(name, "if", 2) == 0)) {
+        kernel_pid_t _name_pid = (kernel_pid_t)scn_u32_dec(&name[2], 2);
+        if (_name_pid > 0) {
+            gnrc_netif_t *netif = NULL;
+
+            while ((netif = gnrc_netif_iter(netif)) != NULL) {
+                if (netif->pid == _name_pid) {
+                    return netif->pid;
+                }
+            }
+        }
+    }
+    return NETIF_INVALID;
+}
+
+int netif_get_opt(netif_t netif, netopt_t opt, uint16_t context,
+                  void *value, size_t max_len)
+{
+    return gnrc_netapi_get(netif, opt, context, value, max_len);
+}
+
+int netif_set_opt(netif_t netif, netopt_t opt, uint16_t context,
+                  void *value, size_t value_len)
+{
+    return gnrc_netapi_set(netif, opt, context, value, value_len);
+}
+
+/** @} */
diff --git a/sys/net/gnrc/netif/include/netif_types.h b/sys/net/gnrc/netif/include/netif_types.h
new file mode 100644
index 0000000000..96101e1d10
--- /dev/null
+++ b/sys/net/gnrc/netif/include/netif_types.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2018 Freie Universität Berlin
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser
+ * General Public License v2.1. See the file LICENSE in the top level
+ * directory for more details.
+ */
+
+/**
+ * @ingroup net_netif
+ * @{
+ *
+ * @file
+ * @brief   GNRC-specfic type definitions for @ref net_netif
+ *
+ * @author  Martine Lenders <m.lenders@fu-berlin.de>
+ */
+#ifndef NETIF_TYPES_H
+#define NETIF_TYPES_H
+
+#include "kernel_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define NETIF_INVALID   (KERNEL_PID_UNDEF)  /**< Invalid interface */
+
+typedef kernel_pid_t netif_t;   /**< GNRC-representation of a network interface */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* NETIF_TYPES_H */
+/** @} */
-- 
GitLab