From e8a1fab07da995e41bfb3781b6e644088239a606 Mon Sep 17 00:00:00 2001
From: Martine Lenders <mlenders@inf.fu-berlin.de>
Date: Thu, 11 Feb 2016 00:45:25 +0100
Subject: [PATCH] gnrc_pkt: provide type search function

---
 Makefile.dep                |  1 +
 sys/include/net/gnrc/pkt.h  | 12 ++++++++++++
 sys/net/gnrc/Makefile       |  3 +++
 sys/net/gnrc/pkt/Makefile   |  3 +++
 sys/net/gnrc/pkt/gnrc_pkt.c | 32 ++++++++++++++++++++++++++++++++
 5 files changed, 51 insertions(+)
 create mode 100644 sys/net/gnrc/pkt/Makefile
 create mode 100644 sys/net/gnrc/pkt/gnrc_pkt.c

diff --git a/Makefile.dep b/Makefile.dep
index 289bebf9cc..09eda58953 100644
--- a/Makefile.dep
+++ b/Makefile.dep
@@ -379,6 +379,7 @@ ifneq (,$(filter gnrc_pktbuf, $(USEMODULE)))
   ifeq (,$(filter gnrc_pktbuf_%, $(USEMODULE)))
     USEMODULE += gnrc_pktbuf_static
   endif
+  USEMODULE += gnrc_pkt
 endif
 
 ifneq (,$(filter gnrc_pktbuf_%, $(USEMODULE)))
diff --git a/sys/include/net/gnrc/pkt.h b/sys/include/net/gnrc/pkt.h
index 7d4ab80dd2..2fb788c538 100644
--- a/sys/include/net/gnrc/pkt.h
+++ b/sys/include/net/gnrc/pkt.h
@@ -155,6 +155,18 @@ static inline size_t gnrc_pkt_count(const gnrc_pktsnip_t *pkt)
     return count;
 }
 
+/**
+ * @brief   Searches the packet for a packet snip of a specific type
+ *
+ * @param[in] pkt   list of packet snips
+ * @param[in] type  the type to search for
+ *
+ * @return  the packet snip in @p pkt with @ref gnrc_nettype_t @p type
+ * @return  NULL, if none of the snips in @p pkt is of @p type
+ */
+gnrc_pktsnip_t *gnrc_pktsnip_search_type(gnrc_pktsnip_t *pkt,
+                                         gnrc_nettype_t type);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/sys/net/gnrc/Makefile b/sys/net/gnrc/Makefile
index 28e2d4f390..35f8e41e76 100644
--- a/sys/net/gnrc/Makefile
+++ b/sys/net/gnrc/Makefile
@@ -73,6 +73,9 @@ endif
 ifneq (,$(filter gnrc_nomac,$(USEMODULE)))
     DIRS += link_layer/nomac
 endif
+ifneq (,$(filter gnrc_pkt,$(USEMODULE)))
+    DIRS += pkt
+endif
 ifneq (,$(filter gnrc_pktbuf_static,$(USEMODULE)))
     DIRS += pktbuf_static
 endif
diff --git a/sys/net/gnrc/pkt/Makefile b/sys/net/gnrc/pkt/Makefile
new file mode 100644
index 0000000000..60a0221a53
--- /dev/null
+++ b/sys/net/gnrc/pkt/Makefile
@@ -0,0 +1,3 @@
+MODULE := gnrc_pkt
+
+include $(RIOTBASE)/Makefile.base
diff --git a/sys/net/gnrc/pkt/gnrc_pkt.c b/sys/net/gnrc/pkt/gnrc_pkt.c
new file mode 100644
index 0000000000..1a9c51d5de
--- /dev/null
+++ b/sys/net/gnrc/pkt/gnrc_pkt.c
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+/**
+ * @{
+ *
+ * @file
+ * @author  Martine Lenders <mlenders@inf.fu-berlin.de>
+ */
+
+#include <assert.h>
+
+#include "net/gnrc/pkt.h"
+
+gnrc_pktsnip_t *gnrc_pktsnip_search_type(gnrc_pktsnip_t *ptr,
+                                         gnrc_nettype_t type)
+{
+    while (ptr != NULL) {
+        if (ptr->type == type) {
+            return ptr;
+        }
+        ptr = ptr->next;
+    }
+    return NULL;
+}
+
+/** @} */
-- 
GitLab