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 ****************************************************************************/