From c343fc618ee47475d22e18082cd45841ec807277 Mon Sep 17 00:00:00 2001
From: Gregory Nutt <gnutt@nuttx.org>
Date: Wed, 2 Aug 2017 12:40:50 -0600
Subject: [PATCH] apps/netutils/netlib:  Add support for PktRadio IOCTL
 commands.

---
 include/netutils/netlib.h              |  20 ++-
 netutils/netlib/Makefile               |   8 +-
 netutils/netlib/netlib_getnodeaddr.c   | 111 ++++++++++++++
 netutils/netlib/netlib_getproperties.c | 111 ++++++++++++++
 netutils/netlib/netlib_nodeaddrconv.c  | 192 +++++++++++++++++++++++++
 netutils/netlib/netlib_setnodeaddr.c   | 107 ++++++++++++++
 nshlib/nsh_netcmds.c                   |   4 -
 7 files changed, 547 insertions(+), 6 deletions(-)
 create mode 100644 netutils/netlib/netlib_getnodeaddr.c
 create mode 100644 netutils/netlib/netlib_getproperties.c
 create mode 100644 netutils/netlib/netlib_nodeaddrconv.c
 create mode 100644 netutils/netlib/netlib_setnodeaddr.c

diff --git a/include/netutils/netlib.h b/include/netutils/netlib.h
index 07a97b5bc..41cc7a01e 100644
--- a/include/netutils/netlib.h
+++ b/include/netutils/netlib.h
@@ -115,13 +115,31 @@ int netlib_getmacaddr(FAR const char *ifname, FAR uint8_t *macaddr);
 #endif
 
 #ifdef CONFIG_NET_6LOWPAN
-/* Set IEEE 802.15.4 extended address. */
+#ifdef CONFIG_WIRELESS_IEEE802154
+/* IEEE 802.15.4 MAC IOCTL commands. */
 
 int netlib_seteaddr(FAR const char *ifname, FAR const uint8_t *eaddr);
 int netlib_getpanid(FAR const char *ifname, FAR uint8_t *panid);
 bool netlib_eaddrconv(FAR const char *hwstr, FAR uint8_t *hw);
 #endif
 
+#ifdef CONFIG_WIRELESS_PKTRADIO
+/* IEEE 802.15.4 MAC IOCTL commands. */
+
+struct pktradio_properties_s; /* Forward reference */
+struct pktradio_addr_s;       /* Forward reference */
+
+int netlib_getproperties(FAR const char *ifname,
+                         FAR struct pktradio_properties_s *properties);
+int netlib_setnodeaddr(FAR const char *ifname,
+                       FAR const struct pktradio_addr_s *nodeaddr);
+int netlib_getnodnodeaddr(FAR const char *ifname,
+                          FAR struct pktradio_addr_s *nodeaddr);
+int netlib_nodeaddrconv(FAR const char *addrstr,
+                        FAR struct pktradio_addr_s *nodeaddr);
+#endif
+#endif
+
 /* IP address support */
 
 #ifdef CONFIG_NET_IPv4
diff --git a/netutils/netlib/Makefile b/netutils/netlib/Makefile
index 0828ae46a..bef3af265 100644
--- a/netutils/netlib/Makefile
+++ b/netutils/netlib/Makefile
@@ -1,7 +1,7 @@
 ############################################################################
 # apps/netutils/netlib/Makefile
 #
-#   Copyright (C) 2011-2012, 2014-2015 Gregory Nutt. All rights reserved.
+#   Copyright (C) 2011-2012, 2014-2015, 2017 Gregory Nutt. All rights reserved.
 #   Author: Gregory Nutt <gnutt@nuttx.org>
 #
 # Redistribution and use in source and binary forms, with or without
@@ -87,8 +87,14 @@ CSRCS += netlib_setmacaddr.c netlib_getmacaddr.c
 endif
 
 ifeq ($(CONFIG_NET_6LOWPAN),y)
+ifeq ($(CONFIG_WIRELESS_IEEE802154),y)
 CSRCS += netlib_seteaddr.c netlib_getpanid.c netlib_eaddrconv.c
 endif
+ifeq ($(CONFIG_WIRELESS_PKTRADIO),y)
+CSRCS += netlib_getproperties.c netlib_getnodeaddr.c netlib_setnodeaddr.c
+CSRCS += netlib_nodeaddrconv.c
+endif
+endif
 
 # IGMP support
 
diff --git a/netutils/netlib/netlib_getnodeaddr.c b/netutils/netlib/netlib_getnodeaddr.c
new file mode 100644
index 000000000..01c6c222c
--- /dev/null
+++ b/netutils/netlib/netlib_getnodeaddr.c
@@ -0,0 +1,111 @@
+/****************************************************************************
+ * netutils/netlib/netlib_getnodnodeaddr.c
+ *
+ *   Copyright (C) 2017 Gregory Nutt. All rights reserved.
+ *   Author: Gregory Nutt <gnutt@nuttx.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+#include "nuttx/wireless/pktradio.h"
+#include "netutils/netlib.h"
+
+#if defined(CONFIG_NET_6LOWPAN) && CONFIG_NSOCKET_DESCRIPTORS > 0
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: netlib_getnodnodeaddr
+ *
+ * Description:
+ *   Get the non-IEEE802.15.4 packet radio node address
+ *
+ * Parameters:
+ *   ifname  - The name of the interface to use
+ *   nodeadd - Location to return the node address
+ *
+ * Return:
+ *   0 on success; -1 on failure.  errno will be set on failure.
+ *
+ ****************************************************************************/
+
+int netlib_getnodnodeaddr(FAR const char *ifname,
+                          FAR struct pktradio_addr_s *nodeaddr)
+{
+  struct pktradio_ifreq_s req;
+  int ret = ERROR;
+
+  DEBUGASSERT(ifname != NULL && nodeaddr != NULL);
+  if (ifname != NULL)
+    {
+      /* Get a socket (only so that we get access to the INET subsystem) */
+
+      int sockfd = socket(PF_INET6, NETLIB_SOCK_IOCTL, 0);
+      if (sockfd >= 0)
+        {
+          /* Copy the network interface name */
+
+          strncpy(req.pifr_name, ifname, IFNAMSIZ);
+
+          /* And perform the IOCTL command */
+
+          ret = ioctl(sockfd, SIOCPKTRADIOGNODE,
+                      (unsigned long)((uintptr_t)&req));
+          if (ret >= 0)
+            {
+              /* Copy the node address from the request */
+
+              memcpy(nodeaddr, &req.pifr_hwaddr,
+                     sizeof(struct pktradio_addr_s));
+            }
+
+          close(sockfd);
+        }
+    }
+
+  return ret;
+}
+
+#endif /* CONFIG_NET_6LOWPAN && CONFIG_NSOCKET_DESCRIPTORS */
diff --git a/netutils/netlib/netlib_getproperties.c b/netutils/netlib/netlib_getproperties.c
new file mode 100644
index 000000000..1bf0ba295
--- /dev/null
+++ b/netutils/netlib/netlib_getproperties.c
@@ -0,0 +1,111 @@
+/****************************************************************************
+ * netutils/netlib/netlib_getproperties.c
+ *
+ *   Copyright (C) 2017 Gregory Nutt. All rights reserved.
+ *   Author: Gregory Nutt <gnutt@nuttx.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+#include "nuttx/wireless/pktradio.h"
+#include "netutils/netlib.h"
+
+#if defined(CONFIG_NET_6LOWPAN) && CONFIG_NSOCKET_DESCRIPTORS > 0
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: netlib_getproperties
+ *
+ * Description:
+ *   Get the non-IEEE802.15.4 packet radio node address
+ *
+ * Parameters:
+ *   ifname  - The name of the interface to use
+ *   nodeadd - Location to return the node address
+ *
+ * Return:
+ *   0 on success; -1 on failure.  errno will be set on failure.
+ *
+ ****************************************************************************/
+
+int netlib_getproperties(FAR const char *ifname,
+                         FAR struct pktradio_properties_s *properties)
+{
+  struct pktradio_ifreq_s req;
+  int ret = ERROR;
+
+  DEBUGASSERT(ifname != NULL && properties != NULL);
+  if (ifname != NULL)
+    {
+      /* Get a socket (only so that we get access to the INET subsystem) */
+
+      int sockfd = socket(PF_INET6, NETLIB_SOCK_IOCTL, 0);
+      if (sockfd >= 0)
+        {
+          /* Copy the network interface name */
+
+          strncpy(req.pifr_name, ifname, IFNAMSIZ);
+
+          /* And perform the IOCTL command */
+
+          ret = ioctl(sockfd, SIOCPKTRADIOGGPROPS,
+                      (unsigned long)((uintptr_t)&req));
+          if (ret >= 0)
+            {
+              /* Copy the radio properties from the request */
+
+              memcpy(properties, &req.pifr_props,
+                     sizeof(struct pktradio_properties_s));
+            }
+
+          close(sockfd);
+        }
+    }
+
+  return ret;
+}
+
+#endif /* CONFIG_NET_6LOWPAN && CONFIG_NSOCKET_DESCRIPTORS */
diff --git a/netutils/netlib/netlib_nodeaddrconv.c b/netutils/netlib/netlib_nodeaddrconv.c
new file mode 100644
index 000000000..1bff6f00a
--- /dev/null
+++ b/netutils/netlib/netlib_nodeaddrconv.c
@@ -0,0 +1,192 @@
+/****************************************************************************
+ * netutils/netlib/netlib_nodeaddrconv.c
+ *
+ *   Copyright (C) 2017 Gregory Nutt. All rights reserved.
+ *   Author: Gregory Nutt <gnutt@nuttx.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+#include "nuttx/wireless/pktradio.h"
+#include "netutils/netlib.h"
+
+#if defined(CONFIG_NET_6LOWPAN) && CONFIG_NSOCKET_DESCRIPTORS > 0
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static int get_nibble(char ch, FAR uint8_t *nibble)
+{
+  if (ch >= '0' && ch <= '9')
+    {
+      *nibble = (uint8_t)ch - '0';
+    }
+  else if (ch >= 'a' && ch <= 'f')
+    {
+      *nibble = (uint8_t)ch - 'a' + 10;
+    }
+  else if (ch >= 'A' && ch <= 'F')
+    {
+      *nibble = (uint8_t)ch - 'A' + 10;
+    }
+  else
+    {
+      return -EINVAL;
+    }
+
+  return OK;
+}
+
+static int get_byte(FAR const char *ptr, FAR uint8_t *byte)
+{
+  uint8_t accum1;
+  uint8_t accum2;
+  int ret;
+
+  ret = get_nibble(ptr[0], &accum1);
+  if (ret  < 0)
+    {
+      return ret;
+    }
+
+  ret = get_nibble(ptr[1], &accum2);
+  if (ret  < 0)
+    {
+      return ret;
+    }
+
+  *byte = accum1 << 4 | accum2;
+  return OK;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: netlib_nodeaddrconv
+ *
+ * Description:
+ *   Get the non-IEEE802.15.4 packet radio node address
+ *
+ * Parameters:
+ *   addrstr - A string representing the node address
+ *   nodeadd - Location to return the node address
+ *
+ * Return:
+ *   0 on success; -1 on failure.  errno will be set on failure.
+ *
+ ****************************************************************************/
+
+int netlib_nodeaddrconv(FAR const char *addrstr,
+                        FAR struct pktradio_addr_s *nodeaddr)
+{
+  uint8_t byte;
+  int ret;
+
+  DEBUGASSERT(addrstr != NULL && nodeaddr != NULL);
+
+  /* FORM: xx:xx:...:xx */
+
+  /* Tolerate leading blanks */
+
+  while (isblank(*addrstr))
+    {
+      addrstr++;
+    }
+
+  for (nodeaddr->pa_addrlen = 0;
+       nodeaddr->pa_addrlen < CONFIG_PKTRADIO_ADDRLEN;
+       )
+    {
+      /* Get the next byte in binary form */
+
+      ret = get_byte(addrstr, &byte);
+      if (ret < 0)
+        {
+          goto errout;
+        }
+
+      /* Save the byte */
+
+      addrstr += 2;
+      nodeaddr->pa_addr[nodeaddr->pa_addrlen] = byte;
+      nodeaddr->pa_addrlen++;
+
+      /* Tolerate blanks between bytes */
+
+      while (isblank(*addrstr))
+        {
+          addrstr++;
+        }
+
+      /* Continue to the next byte if there is a colon separator.  Return
+       * success if we are at the end of the string.  Anything other than
+       * {whitespace, :, NUL} is an error.
+       */
+
+      if (*addrstr == ':')
+        {
+          addrstr++;
+        }
+      else if (*addrstr == '\0')
+        {
+          return OK;
+        }
+      else
+        {
+          ret = -EINVAL;
+          goto errout;
+        }
+    }
+
+  ret = -E2BIG;
+
+errout:
+  errno = -ret;
+  return ERROR;
+}
+
+#endif /* CONFIG_NET_6LOWPAN && CONFIG_NSOCKET_DESCRIPTORS */
diff --git a/netutils/netlib/netlib_setnodeaddr.c b/netutils/netlib/netlib_setnodeaddr.c
new file mode 100644
index 000000000..24f66bce8
--- /dev/null
+++ b/netutils/netlib/netlib_setnodeaddr.c
@@ -0,0 +1,107 @@
+/****************************************************************************
+ * netutils/netlib/netlib_setnodnodeaddr.c
+ *
+ *   Copyright (C) 2017 Gregory Nutt. All rights reserved.
+ *   Author: Gregory Nutt <gnutt@nuttx.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+#include "nuttx/wireless/pktradio.h"
+#include "netutils/netlib.h"
+
+#if defined(CONFIG_NET_6LOWPAN) && CONFIG_NSOCKET_DESCRIPTORS > 0
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: netlib_setnodnodeaddr
+ *
+ * Description:
+ *   Set the non-IEEE802.15.4 packet radio node address
+ *
+ * Parameters:
+ *   ifname  - The name of the interface to use
+ *   nodeadd - The new node address
+ *
+ * Return:
+ *   0 on success; -1 on failure.  errno will be set on failure.
+ *
+ ****************************************************************************/
+
+int netlib_setnodeaddr(FAR const char *ifname,
+                       FAR const struct pktradio_addr_s *nodeaddr)
+{
+  struct pktradio_ifreq_s req;
+  int ret = ERROR;
+
+  DEBUGASSERT(ifname != NULL && nodeaddr != NULL);
+  if (ifname != NULL)
+    {
+      /* Get a socket (only so that we get access to the INET subsystem) */
+
+      int sockfd = socket(PF_INET6, NETLIB_SOCK_IOCTL, 0);
+      if (sockfd >= 0)
+        {
+          /* Copy the network interface name */
+
+          strncpy(req.pifr_name, ifname, IFNAMSIZ);
+
+          /* Copy the node address into the request */
+
+          memcpy(&req.pifr_hwaddr, nodeaddr, sizeof(struct pktradio_addr_s));
+
+          /* And perform the IOCTL command */
+
+          ret = ioctl(sockfd, SIOCPKTRADIOSNODE,
+                      (unsigned long)((uintptr_t)&req));
+          close(sockfd);
+        }
+    }
+
+  return ret;
+}
+
+#endif /* CONFIG_NET_6LOWPAN && CONFIG_NSOCKET_DESCRIPTORS */
diff --git a/nshlib/nsh_netcmds.c b/nshlib/nsh_netcmds.c
index 5c8fe29d9..ee9786c10 100644
--- a/nshlib/nsh_netcmds.c
+++ b/nshlib/nsh_netcmds.c
@@ -173,10 +173,6 @@ typedef int (*nsh_netdev_callback_t)(FAR struct nsh_vtbl_s *vtbl,
 static uint16_t g_pingid = 0;
 #endif
 
-/****************************************************************************
- * Public Data
- ****************************************************************************/
-
 /****************************************************************************
  * Private Functions
  ****************************************************************************/