diff --git a/include/netutils/netlib.h b/include/netutils/netlib.h index f096e7baf..4e1ff9fa6 100644 --- a/include/netutils/netlib.h +++ b/include/netutils/netlib.h @@ -118,6 +118,7 @@ int netlib_getmacaddr(FAR const char *ifname, FAR uint8_t *macaddr); /* Get IEEE802.15.4 MAC driver node address */ int netlib_setnodeaddr(FAR const char *ifname, FAR const uint8_t *nodeaddr); +bool netlib_nodeaddrconv(FAR const char *hwstr, FAR uint8_t *hw); #endif /* IP address support */ diff --git a/netutils/netlib/Makefile b/netutils/netlib/Makefile index 35030cab5..b5a8f96d2 100644 --- a/netutils/netlib/Makefile +++ b/netutils/netlib/Makefile @@ -87,7 +87,7 @@ CSRCS += netlib_setmacaddr.c netlib_getmacaddr.c endif ifeq ($(CONFIG_NET_6LOWPAN),y) -CSRCS += netlib_setnodeaddr.c +CSRCS += netlib_setnodeaddr.c netlib_nodeaddrconv.c endif # IGMP support diff --git a/netutils/netlib/netlib_nodeaddrconv.c b/netutils/netlib/netlib_nodeaddrconv.c new file mode 100644 index 000000000..02854c516 --- /dev/null +++ b/netutils/netlib/netlib_nodeaddrconv.c @@ -0,0 +1,109 @@ +/**************************************************************************** + * netutils/netlib/netlib_nodeaddrconv.c + * + * Copyright (C) 2017 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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 +#include +#include + +#include + +#include "netutils/netlib.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: netlib_nodeaddrconv + ****************************************************************************/ + +bool netlib_nodeaddrconv(FAR const char *hwstr, FAR uint8_t *hw) +{ + unsigned char tmp; + unsigned char i; + unsigned char j; + char ch; + + /* Form xx:xx or xx:xx:xx:xx:xx:xx:xx:xx for extended Rime address */ + + if (strlen(hwstr) != 3 * NET_6LOWPAN_RIMEADDR_SIZE - 1) + { + return false; + } + + tmp = 0; + + for (i = 0; i < NET_6LOWPAN_RIMEADDR_SIZE; ++i) + { + j = 0; + do + { + ch = *hwstr++; + if (++j > 3) + { + return false; + } + + if (ch == ':' || ch == '\0') + { + *hw++ = tmp; + tmp = 0; + } + else if (ch >= '0' && ch <= '9') + { + tmp = (tmp << 4) + (ch - '0'); + } + else if (ch >= 'a' && ch <= 'f') + { + tmp = (tmp << 4) + (ch - 'a' + 10); + } + else if (ch >= 'A' && ch <= 'F') + { + tmp = (tmp << 4) + (ch - 'A' + 10); + } + else + { + return false; + } + } + while (ch != ':' && ch != 0); + } + + return true; +} diff --git a/netutils/netlib/netlib_setnodeaddr.c b/netutils/netlib/netlib_setnodeaddr.c index 942186070..436591eb9 100644 --- a/netutils/netlib/netlib_setnodeaddr.c +++ b/netutils/netlib/netlib_setnodeaddr.c @@ -49,6 +49,8 @@ #include #include +#include + #include "netutils/netlib.h" #if defined(CONFIG_NET_6LOWPAN) && CONFIG_NSOCKET_DESCRIPTORS > 0 @@ -65,7 +67,7 @@ * * Parameters: * ifname The name of the interface to use - * nodeaddr Node address to set, size must be CONFIG_NET_6LOWPAN_RIMEADDR_SIZE + * nodeaddr Node address to set, size must be NET_6LOWPAN_RIMEADDR_SIZE * * Return: * 0 on success; -1 on failure @@ -92,7 +94,7 @@ int netlib_setnodeaddr(FAR const char *ifname, FAR const uint8_t *nodeaddr) /* Put the new MAC address into the request */ req.ifr_hwaddr.sa_family = AF_INET6; - memcpy(&req.ifr_hwaddr.sa_data, nodeaddr, CONFIG_NET_6LOWPAN_RIMEADDR_SIZE); + memcpy(&req.ifr_hwaddr.sa_data, nodeaddr, NET_6LOWPAN_RIMEADDR_SIZE); /* Perform the ioctl to set the MAC address */ diff --git a/nshlib/nsh.h b/nshlib/nsh.h index 94e7e55d8..0231ef510 100644 --- a/nshlib/nsh.h +++ b/nshlib/nsh.h @@ -155,8 +155,9 @@ * domain sockets were enable. */ -#if !defined(CONFIG_NET_ETHERNET) && !defined(CONFIG_NET_LOOPBACK) && \ - !defined(CONFIG_NET_SLIP) && !defined(CONFIG_NET_TUN) +#if !defined(CONFIG_NET_ETHERNET) && !defined(CONFIG_NET_6LOWPAN) && \ + !defined(CONFIG_NET_LOOPBACK) && !defined(CONFIG_NET_SLIP) && \ + !defined(CONFIG_NET_TUN) /* No link layer protocol is a good indication that there is no network * device. */ diff --git a/nshlib/nsh_netcmds.c b/nshlib/nsh_netcmds.c index 592f02b3f..35f19354e 100644 --- a/nshlib/nsh_netcmds.c +++ b/nshlib/nsh_netcmds.c @@ -79,6 +79,10 @@ #include #include +#ifdef CONFIG_NET_6LOWPAN +#include +#endif + #if defined(CONFIG_NET_ICMP) && defined(CONFIG_NET_ICMP_PING) && \ !defined(CONFIG_DISABLE_SIGNALS) # include "netutils/netlib.h" @@ -252,7 +256,7 @@ static int ping_options(FAR struct nsh_vtbl_s *vtbl, /* There should be exactly on parameter left on the command-line */ - if (optind == argc-1) + if (optind == argc - 1) { *staddr = argv[optind]; } @@ -371,7 +375,7 @@ int tftpc_parseargs(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv, /* There should be exactly one parameter left on the command-line */ - if (optind == argc-1) + if (optind == argc - 1) { args->srcpath = argv[optind]; } @@ -384,7 +388,7 @@ int tftpc_parseargs(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv, goto errout; } - /* optind < argc-1 means that there are too many arguments on the + /* optind < argc - 1 means that there are too many arguments on the * command-line */ @@ -744,7 +748,7 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) FAR char *gwip = NULL; FAR char *mask = NULL; FAR char *tmp = NULL; -#ifdef CONFIG_NET_ETHERNET +#if defined(CONFIG_NET_ETHERNET) || defined(CONFIG_NET_6LOWPAN) FAR char *hw = NULL; #endif #if defined(CONFIG_NSH_DHCPC) || defined(CONFIG_NSH_DNS) @@ -754,7 +758,12 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) bool inet6 = false; #endif bool badarg = false; +#ifdef CONFIG_NET_ETHERNET uint8_t mac[IFHWADDRLEN]; +#endif +#ifdef CONFIG_NET_6LOWPAN + uint8_t nodeaddr[NET_6LOWPAN_RIMEADDR_SIZE]; +#endif #if defined(CONFIG_NSH_DHCPC) FAR void *handle; #endif @@ -802,9 +811,9 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) tmp = argv[i]; if (!strcmp(tmp, "dr") || !strcmp(tmp, "gw") || !strcmp(tmp, "gateway")) { - if (argc-1 >= i+1) + if (argc - 1 >= i + 1) { - gwip = argv[i+1]; + gwip = argv[i + 1]; i++; } else @@ -814,9 +823,9 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) } else if (!strcmp(tmp, "netmask")) { - if (argc-1 >= i+1) + if (argc - 1 >= i + 1) { - mask = argv[i+1]; + mask = argv[i + 1]; i++; } else @@ -841,16 +850,20 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) #endif } -#ifdef CONFIG_NET_ETHERNET +#if defined(CONFIG_NET_ETHERNET) || defined(CONFIG_NET_6LOWPAN) /* REVISIT: How will we handle Ethernet and SLIP networks together? */ else if (!strcmp(tmp, "hw")) { - if (argc-1>=i+1) + if (argc - 1 >= i + 1) { - hw = argv[i+1]; + hw = argv[i + 1]; i++; +#ifdef CONFIG_NET_ETHERNET badarg = !netlib_ethaddrconv(hw, mac); +#else + badarg = !netlib_nodeaddrconv(hw, nodeaddr); +#endif } else { @@ -862,9 +875,9 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) #if defined(CONFIG_NSH_DHCPC) || defined(CONFIG_NSH_DNS) else if (!strcmp(tmp, "dns")) { - if (argc-1 >= i+1) + if (argc - 1 >= i + 1) { - dns = argv[i+1]; + dns = argv[i + 1]; i++; } else @@ -883,14 +896,18 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) return ERROR; } -#ifdef CONFIG_NET_ETHERNET +#if defined(CONFIG_NET_ETHERNET) || defined(CONFIG_NET_6LOWPAN) /* Set Hardware Ethernet MAC address */ /* REVISIT: How will we handle Ethernet and SLIP networks together? */ if (hw) { ninfo("HW MAC: %s\n", hw); +#ifdef CONFIG_NET_ETHERNET netlib_setmacaddr(intf, mac); +#else + netlib_setnodeaddr(intf, nodeaddr); +#endif } #endif @@ -1620,7 +1637,7 @@ int cmd_wget(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) /* There should be exactly on parameter left on the command-line */ - if (optind == argc-1) + if (optind == argc - 1) { url = argv[optind]; } diff --git a/nshlib/nsh_netinit.c b/nshlib/nsh_netinit.c index 38c862a30..f1f1f557f 100644 --- a/nshlib/nsh_netinit.c +++ b/nshlib/nsh_netinit.c @@ -72,6 +72,10 @@ # include "netutils/dhcpc.h" #endif +#ifdef CONFIG_NET_6LOWPAN +# include +#endif + #ifdef CONFIG_NETUTILS_NTPCLIENT # include "netutils/ntpclient.h" #endif @@ -90,9 +94,9 @@ #if defined(CONFIG_NET_ETHERNET) || defined(CONFIG_NET_6LOWPAN) # define HAVE_MAC 1 # if defined(CONFIG_NET_6LOWPAN) -# if (CONFIG_NET_6LOWPAN_RIMEADDR_SIZE == 2) && CONFIG_NSH_MACADDR > 0xffff +# if !defined(CONFIG_NET_6LOWPAN_RIMEADDR_EXTENDED) && CONFIG_NSH_MACADDR > 0xffff # error Invalid 6loWPAN node address for SIZE == 2 -# elif (CONFIG_NET_6LOWPAN_RIMEADDR_SIZE == 8) && CONFIG_NSH_MACADDR > 0xffffffffffffffffull +# elif defined(CONFIG_NET_6LOWPAN_RIMEADDR_EXTENDED) && CONFIG_NSH_MACADDR > 0xffffffffffffffffull # error Invalid 6loWPAN node address for SIZE == 8 # endif # endif @@ -249,7 +253,7 @@ static void nsh_netinit_configure(void) #if defined(CONFIG_NET_ETHERNET) uint8_t mac[IFHWADDRLEN]; #elif defined(CONFIG_NET_6LOWPAN) - uint8_t nodeaddr[CONFIG_NET_6LOWPAN_RIMEADDR_SIZE]; + uint8_t nodeaddr[NET_6LOWPAN_RIMEADDR_SIZE]; #endif #endif @@ -275,10 +279,7 @@ static void nsh_netinit_configure(void) #elif defined(CONFIG_NET_6LOWPAN) /* Use the configured, fixed MAC address */ -#if CONFIG_NET_6LOWPAN_RIMEADDR_SIZE == 2 - nodeaddr[0] = (CONFIG_NSH_MACADDR >> (8 * 1)) & 0xff; - nodeaddr[1] = (CONFIG_NSH_MACADDR >> (8 * 0)) & 0xff; -#elif CONFIG_NET_6LOWPAN_RIMEADDR_SIZE == 8 +#ifdef CONFIG_NET_6LOWPAN_RIMEADDR_EXTENDED nodeaddr[0] = (CONFIG_NSH_MACADDR >> (8 * 7)) & 0xff; nodeaddr[1] = (CONFIG_NSH_MACADDR >> (8 * 6)) & 0xff; nodeaddr[2] = (CONFIG_NSH_MACADDR >> (8 * 5)) & 0xff; @@ -287,6 +288,9 @@ static void nsh_netinit_configure(void) nodeaddr[5] = (CONFIG_NSH_MACADDR >> (8 * 2)) & 0xff; nodeaddr[6] = (CONFIG_NSH_MACADDR >> (8 * 1)) & 0xff; nodeaddr[7] = (CONFIG_NSH_MACADDR >> (8 * 0)) & 0xff; +#else + nodeaddr[0] = (CONFIG_NSH_MACADDR >> (8 * 1)) & 0xff; + nodeaddr[1] = (CONFIG_NSH_MACADDR >> (8 * 0)) & 0xff; #endif /* Set the 6loWPAN node address */