diff --git a/examples/udp/Kconfig b/examples/udp/Kconfig index 7ca5bc70f..62253544e 100644 --- a/examples/udp/Kconfig +++ b/examples/udp/Kconfig @@ -12,9 +12,79 @@ config EXAMPLES_UDP if EXAMPLES_UDP -config EXAMPLES_UDP_SERVER - bool "Target is the server" +config EXAMPLES_UDP_SERVER1 + bool "Target1 is the server" default n + ---help--- + By default Target1 is the client and the host PC is the server + +config EXAMPLES_UDP_PROGNAME1 + string "Target1 program name" + default "udpserver" if EXAMPLES_UDP_SERVER1 + default "udpclient" if !EXAMPLES_UDP_SERVER1 + depends on BUILD_KERNEL + ---help--- + This is the name of the Target1 program that will be use when the + NSH ELF program is installed. + +config EXAMPLES_UDP_PRIORITY1 + int "Target1 task priority" + default 100 + +config EXAMPLES_UDP_STACKSIZE1 + int "Target1 stack size" + default 2048 + +config EXAMPLES_UDP_TARGET2 + bool "Second endpoint is a target" + default n + ---help--- + By default, the host PC is configured as the second endpoint of the + UDP test. If this option is selected, then the second endpoint + will be built into the FLASH image as well. This means that you + can use two target boards to run the test with not host PC + involvement. + +if EXAMPLES_UDP_TARGET2 + +config EXAMPLES_UDP_PROGNAME2 + string "Target2 program name" + default "udpserver" if !EXAMPLES_UDP_SERVER2 + default "udpclient" if EXAMPLES_UDP_SERVER2 + depends on BUILD_KERNEL + ---help--- + This is the name of the Target2 program that will be use when the + NSH ELF program is installed. + +config EXAMPLES_UDP_PRIORITY2 + int "Target2 task priority" + default 100 + +config EXAMPLES_UDP_STACKSIZE2 + int "Target2 stack size" + default 2048 + +endif # EXAMPLES_UDP_TARGET2 + +config EXAMPLES_UDP_DEVNAME + string "Network device" + default "eth0" + +config EXAMPLES_UDP_NETINIT + bool "Initialize network" + default n if NSH_NETINIT + default y if !NSH_NETINIT + ---help--- + Selecting this option will enable logic in the example to perform + some basic initialization of the network. You would probably only + want to do this if the example is running stand-alone. If the + example is running as an NSH command, then the network as already + been initialized. + + This basic initialization currently only supports basic + initialization of Ethernet network devices. For other exotic + network devices this initialization should be suppressed. Such + devices will require other, external initialization. choice prompt "IP Domain" @@ -35,6 +105,8 @@ if EXAMPLES_UDP_IPv4 comment "IPv4 addresses" +if EXAMPLES_UDP_NETINIT + config EXAMPLES_UDP_IPADDR hex "Target IP address" default 0x0a000002 @@ -47,16 +119,17 @@ config EXAMPLES_UDP_NETMASK hex "Network mask" default 0xffffff00 +endif # !EXAMPLES_UDP_NETINIT + config EXAMPLES_UDP_SERVERIP hex "Server IP address" - default 0x0a000001 if !EXAMPLES_UDP_SERVER - default 0x0a000002 if EXAMPLES_UDP_SERVER - + default 0x0a000001 if !EXAMPLES_UDP_SERVER1 + default 0x0a000002 if EXAMPLES_UDP_SERVER1 endif # EXAMPLES_UDP_IPv4 if EXAMPLES_UDP_IPv6 -if !NET_ICMPv6_AUTOCONF +if !NET_ICMPv6_AUTOCONF && EXAMPLES_UDP_NETINIT comment "Target IPv6 address" @@ -306,7 +379,7 @@ config EXAMPLES_UDP_IPv6NETMASK_8 endif # NET_ICMPv6_AUTOCONF -comment "Server IPv6 address" +comment "Default Server IPv6 address" config EXAMPLES_UDP_SERVERIPv6ADDR_1 hex "[0]" @@ -422,8 +495,8 @@ config EXAMPLES_UDP_SERVERIPv6ADDR_7 config EXAMPLES_UDP_SERVERIPv6ADDR_8 hex "[7]" - default 0x0001 if !EXAMPLES_UDP_SERVER - default 0x0002 if EXAMPLES_UDP_SERVER + default 0x0001 if !EXAMPLES_UDP_SERVER1 + default 0x0002 if EXAMPLES_UDP_SERVER1 range 0x0 0xffff ---help--- IP address of the server. If the target is the server, then diff --git a/examples/udp/Makefile b/examples/udp/Makefile index 3603ee0c3..0627426e6 100644 --- a/examples/udp/Makefile +++ b/examples/udp/Makefile @@ -39,25 +39,94 @@ include $(APPDIR)/Make.defs # UDP Test -TARG_ASRCS = - -TARG_CSRCS = -ifeq ($(CONFIG_EXAMPLES_UDP_SERVER),y) -TARG_CSRCS += udp-server.c -else -TARG_CSRCS += udp-client.c +TARGCMN_CSRCS = udp_cmdline.c +ifeq ($(CONFIG_EXAMPLES_UDP_NETINIT),y) +TARGCMN_CSRCS += target_netinit.c endif -TARG_MAINSRC = target.c +TARGCMN_COBJS = $(TARGCMN_CSRCS:.c=$(OBJEXT)) -TARG_AOBJS = $(TARG_ASRCS:.S=$(OBJEXT)) -TARG_COBJS = $(TARG_CSRCS:.c=$(OBJEXT)) -TARG_MAINOBJ = $(TARG_MAINSRC:.c=$(OBJEXT)) +# Target 1 -TARG_SRCS = $(TARG_ASRCS) $(TARG_CSRCS) $(TARG_MAINSRC) -TARG_OBJS = $(TARG_AOBJS) $(TARG_COBJS) +TARG1_CRCS = +ifeq ($(CONFIG_EXAMPLES_UDP_SERVER1),y) +TARG1_CRCS += udp_server.c +else +TARG1_CRCS += udp_client.c +endif +TARG1_MAINSRC = target1.c + +TARG1_COBJS = $(TARG1_CRCS:.c=$(OBJEXT)) +TARG1_MAINOBJ = $(TARG1_MAINSRC:.c=$(OBJEXT)) + +ifeq ($(CONFIG_EXAMPLES_UDP_SERVER1),y) +CONFIG_EXAMPLES_UDP_PROGNAME1 ?= udpserver +APPNAME1 = udpserver +else +CONFIG_EXAMPLES_UDP_PROGNAME1 ?= udpclient +APPNAME1 = udpclient +endif +CONFIG_EXAMPLES_UDP_PRIORITY1 ?= 100 +CONFIG_EXAMPLES_UDP_STACKSIZE1 ?= 2048 + +PROGNAME1 = $(CONFIG_EXAMPLES_UDP_PROGNAME1) +PRIORITY1 = $(CONFIG_EXAMPLES_UDP_PRIORITY1) +STACKSIZE1 = $(CONFIG_EXAMPLES_UDP_STACKSIZE1) + +# Target 2 + +ifeq ($(CONFIG_EXAMPLES_UDP_TARGET2),y) + +TARG2_CRCS = +ifeq ($(CONFIG_EXAMPLES_UDP_SERVER1),y) +TARG2_CRCS += udp_client.c +else +TARG2_CRCS += udp_server.c +endif +TARG2_MAINSRC = target2.c + +TARG2_COBJS = $(TARG2_CRCS:.c=$(OBJEXT)) +TARG2_MAINOBJ = $(TARG2_MAINSRC:.c=$(OBJEXT)) + +ifeq ($(CONFIG_EXAMPLES_UDP_SERVER1),y) +CONFIG_EXAMPLES_UDP_PROGNAME2 ?= udpclient +APPNAME2 = udpclient +else +CONFIG_EXAMPLES_UDP_PROGNAME2 ?= udpserver +APPNAME2 = udpserver +endif +CONFIG_EXAMPLES_UDP_PRIORITY2 ?= 100 +CONFIG_EXAMPLES_UDP_STACKSIZE2 ?= 2048 + +PROGNAME2 = $(CONFIG_EXAMPLES_UDP_PROGNAME2) +PRIORITY2 = $(CONFIG_EXAMPLES_UDP_PRIORITY2) +STACKSIZE2 = $(CONFIG_EXAMPLES_UDP_STACKSIZE2) + +endif + +TARG_SRCS = $(TARG1_CRCS) $(TARG1_MAINSRC) $(TARG2_CRCS) $(TARG2_MAINSRC) $(TARGCMN_CSRCS) +TARG_OBJS = $(TARG1_COBJS) $(TARG2_COBJS) $(TARGCMN_COBJS) ifneq ($(CONFIG_BUILD_KERNEL),y) - TARG_OBJS += $(TARG_MAINOBJ) + TARG_OBJS += $(TARG1_MAINOBJ) $(TARG2_MAINOBJ) +endif + +# Host + +ifneq ($(CONFIG_EXAMPLES_UDP_TARGET2),y) + +HOSTCFLAGS += -DEXAMPLES_UDP_HOST=1 +HOSTOBJSEXT ?= o1 + +HOST_SRCS = host.c udp_cmdline.c +ifeq ($(CONFIG_EXAMPLES_UDP_SERVER1),y) +HOST_SRCS += udp_client.c +else +HOST_SRCS += udp_server.c +endif + +HOST_OBJS = $(HOST_SRCS:.c=.$(HOSTOBJSEXT)) +HOST_BIN = host$(EXEEXT) + endif ifeq ($(CONFIG_WINDOWS_NATIVE),y) @@ -70,27 +139,19 @@ else endif endif -HOSTCFLAGS += -DEXAMPLES_UDP_HOST=1 - -HOST_SRCS = host.c -ifeq ($(CONFIG_EXAMPLES_UDP_SERVER),y) -HOST_SRCS += udp-client.c +ifeq ($(CONFIG_EXAMPLES_UDP_TARGET2),y) +MAINNAME1 = udp1_main +MAINNAME2 = udp2_main else -HOST_SRCS += udp-server.c +MAINNAME1 = udp_main endif -HOST_OBJS = $(HOST_SRCS:.c=.o) -HOST_BIN = host - ifeq ($(WINTOOL),y) INSTALL_DIR = "${shell cygpath -w $(BIN_DIR)}" else INSTALL_DIR = $(BIN_DIR) endif -CONFIG_XYZ_PROGNAME ?= udp$(EXEEXT) -PROGNAME = $(CONFIG_XYZ_PROGNAME) - ROOTDEPPATH = --dep-path . # Common build @@ -98,45 +159,61 @@ ROOTDEPPATH = --dep-path . VPATH = all: .built -.PHONY: clean depend distclean +.PHONY: clean depend distclean preconfig -$(TARG_AOBJS): %$(OBJEXT): %.S - $(call ASSEMBLE, $<, $@) - -$(TARG_COBJS) $(TARG_MAINOBJ): %$(OBJEXT): %.c +$(TARG1_COBJS) $(TARG1_MAINOBJ)$(TARG2_COBJS) $(TARG2_MAINOBJ) $(TARGCMN_COBJS): %$(OBJEXT): %.c $(call COMPILE, $<, $@) $(TARG_BIN): $(TARG_OBJS) $(HOST_BIN) $(call ARCHIVE, $@, $(TARG_OBJS)) -$(HOST_OBJS): %.o: %.c +ifneq ($(CONFIG_EXAMPLES_UDP_TARGET2),y) +$(HOST_OBJS): %.$(HOSTOBJSEXT): %.c @echo "CC: $<" $(Q) $(HOSTCC) -c $(HOSTCFLAGS) $< -o $@ +endif config.h: $(TOPDIR)/include/nuttx/config.h @echo "CP: $<" $(Q) cp $< $@ +ifneq ($(CONFIG_EXAMPLES_UDP_TARGET2),y) $(HOST_BIN): config.h $(HOST_OBJS) $(Q) $(HOSTCC) $(HOSTLDFLAGS) $(HOST_OBJS) -o $@ +endif .built: config.h $(TARG_BIN) $(HOST_BIN) $(Q) touch .built ifeq ($(CONFIG_BUILD_KERNEL),y) -$(BIN_DIR)$(DELIM)$(PROGNAME): $(OBJS) $(TARG_MAINOBJ) - @echo "LD: $(PROGNAME)" - $(Q) $(LD) $(LDELFFLAGS) $(LDLIBPATH) -o $(INSTALL_DIR)$(DELIM)$(PROGNAME) $(ARCHCRT0OBJ) $(TARG_MAINOBJ) $(LDLIBS) - $(Q) $(NM) -u $(INSTALL_DIR)$(DELIM)$(PROGNAME) +$(BIN_DIR)$(DELIM)$(PROGNAME1): $(OBJS) $(TARG1_MAINOBJ) + @echo "LD: $(PROGNAME1)" + $(Q) $(LD) $(LDELFFLAGS) $(LDLIBPATH) -o $(INSTALL_DIR)$(DELIM)$(PROGNAME1) $(ARCHCRT0OBJ) $(TARG1_MAINOBJ) $(LDLIBS) + $(Q) $(NM) -u $(INSTALL_DIR)$(DELIM)$(PROGNAME1) -install: $(BIN_DIR)$(DELIM)$(PROGNAME) +install: $(BIN_DIR)$(DELIM)$(PROGNAME1) else install: endif +ifeq ($(CONFIG_NSH_BUILTIN_APPS),y) +$(BUILTIN_REGISTRY)$(DELIM)$(APPNAME1)_main.bdat: $(DEPCONFIG) Makefile + $(call REGISTER,$(APPNAME1),$(PRIORITY1),$(STACKSIZE1),$(MAINNAME1)) + +ifeq ($(CONFIG_EXAMPLES_UDP_TARGET2),y) +$(BUILTIN_REGISTRY)$(DELIM)$(APPNAME2)_main.bdat: $(DEPCONFIG) Makefile + $(call REGISTER,$(APPNAME2),$(PRIORITY2),$(STACKSIZE2),$(MAINNAME2)) + +context: $(BUILTIN_REGISTRY)$(DELIM)$(APPNAME1)_main.bdat \ + $(BUILTIN_REGISTRY)$(DELIM)$(APPNAME2)_main.bdat +else +context: $(BUILTIN_REGISTRY)$(DELIM)$(APPNAME1)_main.bdat +endif +else context: +endif .depend: Makefile config.h $(TARG_SRCS) @$(MKDEP) $(ROOTDEPPATH) "$(CC)" -- $(CFLAGS) -- $(TARG_SRCS) >Make.dep @@ -146,8 +223,11 @@ depend: .depend clean: $(call DELFILE, .built) - $(call DELFILE, $(TARG_BIN)) + #$(call DELFILE, $(TARG_BIN)) +ifneq ($(CONFIG_EXAMPLES_UDP_TARGET2),y) $(call DELFILE, $(HOST_BIN)) + $(call DELFILE, *.$(HOSTOBJSEXT)) +endif $(call DELFILE, *.dSYM) $(call DELFILE, config.h) $(call CLEAN) @@ -156,7 +236,6 @@ distclean: clean $(call DELFILE, Make.dep) $(call DELFILE, .depend) --include Make.dep - -.PHONY: preconfig preconfig: + +-include Make.dep diff --git a/examples/udp/host.c b/examples/udp/host.c index 6ea487712..f51410913 100644 --- a/examples/udp/host.c +++ b/examples/udp/host.c @@ -38,7 +38,7 @@ ****************************************************************************/ #include "config.h" -#include "udp-internal.h" +#include "udp.h" /**************************************************************************** * Private Data @@ -54,7 +54,13 @@ int main(int argc, char **argv, char **envp) { -#ifdef CONFIG_EXAMPLES_UDP_SERVER + /* Parse any command line options */ + + parse_cmdline(argc, argv); + + /* Run the server or client, depending upon how target1 was configured */ + +#ifdef CONFIG_EXAMPLES_UDP_SERVER1 send_client(); #else recv_server(); diff --git a/examples/udp/udp-internal.h b/examples/udp/target1.c similarity index 74% rename from examples/udp/udp-internal.h rename to examples/udp/target1.c index 8bd6fbe58..f64c7e098 100644 --- a/examples/udp/udp-internal.h +++ b/examples/udp/target1.c @@ -1,7 +1,7 @@ /**************************************************************************** - * examples/udp/udp-internal.h + * examples/udp/target1.c * - * Copyright (C) 2007, 2008, 2015 Gregory Nutt. All rights reserved. + * Copyright (C) 2007, 2011, 2015, 2017 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -33,49 +33,46 @@ * ****************************************************************************/ -#ifndef __EXAMPLES_UDP_INTERNAL_H -#define __EXAMPLES_UDP_INTERNAL_H - /**************************************************************************** * Included Files ****************************************************************************/ -#ifdef EXAMPLES_UDP_HOST -#else -# include -#endif - -#include +#include "config.h" +#include "udp.h" /**************************************************************************** - * Pre-processor Definitions + * Public Functions ****************************************************************************/ -#ifdef EXAMPLES_UDP_HOST - /* HTONS/L macros are unique to uIP */ - -# define HTONS(a) htons(a) -# define HTONL(a) htonl(a) -#endif - -#ifdef CONFIG_EXAMPLES_UDP_IPv6 -# define AF_INETX AF_INET6 -# define PF_INETX PF_INET6 -#else -# define AF_INETX AF_INET -# define PF_INETX PF_INET -#endif - -#define PORTNO 5471 - -#define ASCIISIZE (0x7f - 0x20) -#define SENDSIZE (ASCIISIZE+1) - /**************************************************************************** - * Public Function Prototypes + * udp1_main ****************************************************************************/ -extern void send_client(void); -extern void recv_server(void); +#if defined(CONFIG_BUILD_KERNEL) +int main(int argc, FAR char *argv[]) +#elif defined(CONFIG_EXAMPLES_UDP_TARGET2) +int udp1_main(int argc, char *argv[]) +#else +int udp_main(int argc, char *argv[]) +#endif +{ + /* Parse any command line options */ -#endif /* __EXAMPLES_UDP_INTERNAL_H */ + parse_cmdline(argc, argv); + +#ifdef CONFIG_EXAMPLES_UDP_NETINIT + /* Initialize the network */ + + (void)target_netinit(); +#endif + + /* Run the server or client, depending upon how we are configured */ + +#ifdef CONFIG_EXAMPLES_UDP_SERVER1 + recv_server(); +#else + send_client(); +#endif + + return 0; +} diff --git a/examples/udp/target2.c b/examples/udp/target2.c new file mode 100644 index 000000000..84332504b --- /dev/null +++ b/examples/udp/target2.c @@ -0,0 +1,76 @@ +/**************************************************************************** + * examples/udp/target2.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 "config.h" +#include "udp.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * udp2_main + ****************************************************************************/ + +#if defined(CONFIG_BUILD_KERNEL) +int main(int argc, FAR char *argv[]) +#else +int udp2_main(int argc, char *argv[]) +#endif +{ + /* Parse any command line options */ + + parse_cmdline(argc, argv); + +#ifdef CONFIG_EXAMPLES_UDP_NETINIT + /* Initialize the network */ + + (void)target_netinit(); +#endif + + /* Run the server or client, depending upon how target1 was configured */ + +#ifdef CONFIG_EXAMPLES_UDP_SERVER1 + send_client(); +#else + recv_server(); +#endif + + return 0; +} diff --git a/examples/udp/target.c b/examples/udp/target_netinit.c similarity index 72% rename from examples/udp/target.c rename to examples/udp/target_netinit.c index 0074cb999..d66a6d3ca 100644 --- a/examples/udp/target.c +++ b/examples/udp/target_netinit.c @@ -1,7 +1,7 @@ /**************************************************************************** - * examples/udp/target.c + * examples/udp/target_netinit.c * - * Copyright (C) 2007, 2011, 2015 Gregory Nutt. All rights reserved. + * Copyright (C) 2007, 2011, 2015, 2017 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without @@ -39,6 +39,7 @@ #include "config.h" +#include #include #include @@ -47,12 +48,20 @@ #include "netutils/netlib.h" -#include "udp-internal.h" +#include "udp.h" + +#ifdef CONFIG_EXAMPLES_UDP_NETINIT /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ +#ifdef CONFIG_EXAMPLES_UDP_DEVNAME +# define DEVNAME CONFIG_EXAMPLES_UDP_DEVNAME +#else +# define DEVNAME "eth0" +#endif + /**************************************************************************** * Private Data ****************************************************************************/ @@ -101,76 +110,75 @@ static const uint16_t g_ipv6_netmask[8] = }; #endif /* CONFIG_EXAMPLES_UDP_IPv6 && !CONFIG_NET_ICMPv6_AUTOCONF */ +static bool g_initialized; + /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** - * udp_main + * target_netinit ****************************************************************************/ -#ifdef CONFIG_BUILD_KERNEL -int main(int argc, FAR char *argv[]) -#else -int udp_main(int argc, char *argv[]) -#endif +int target_netinit(void) { + if (!g_initialized) + { #ifdef CONFIG_EXAMPLES_UDP_IPv6 #ifdef CONFIG_NET_ICMPv6_AUTOCONF - /* Perform ICMPv6 auto-configuration */ + /* Perform ICMPv6 auto-configuration */ - netlib_icmpv6_autoconfiguration("eth0"); + netlib_icmpv6_autoconfiguration(DEVNAME); #else /* CONFIG_NET_ICMPv6_AUTOCONF */ - /* Set up our fixed host address */ + /* Set up our fixed host address */ - netlib_set_ipv6addr("eth0", - (FAR const struct in6_addr *)g_ipv6_hostaddr); + netlib_set_ipv6addr(DEVNAME, + (FAR const struct in6_addr *)g_ipv6_hostaddr); - /* Set up the default router address */ + /* Set up the default router address */ - netlib_set_dripv6addr("eth0", - (FAR const struct in6_addr *)g_ipv6_draddr); + netlib_set_dripv6addr(DEVNAME, + (FAR const struct in6_addr *)g_ipv6_draddr); - /* Setup the subnet mask */ + /* Setup the subnet mask */ - netlib_set_ipv6netmask("eth0", - (FAR const struct in6_addr *)g_ipv6_netmask); + netlib_set_ipv6netmask(DEVNAME, + (FAR const struct in6_addr *)g_ipv6_netmask); #endif /* CONFIG_NET_ICMPv6_AUTOCONF */ #else /* CONFIG_EXAMPLES_UDP_IPv6 */ - struct in_addr addr; + struct in_addr addr; - /* Set up our host address */ + /* Set up our host address */ - addr.s_addr = HTONL(CONFIG_EXAMPLES_UDP_IPADDR); - netlib_set_ipv4addr("eth0", &addr); + addr.s_addr = HTONL(CONFIG_EXAMPLES_UDP_IPADDR); + netlib_set_ipv4addr(DEVNAME, &addr); - /* Set up the default router address */ + /* Set up the default router address */ - addr.s_addr = HTONL(CONFIG_EXAMPLES_UDP_DRIPADDR); - netlib_set_dripv4addr("eth0", &addr); + addr.s_addr = HTONL(CONFIG_EXAMPLES_UDP_DRIPADDR); + netlib_set_dripv4addr(DEVNAME, &addr); - /* Setup the subnet mask */ + /* Setup the subnet mask */ - addr.s_addr = HTONL(CONFIG_EXAMPLES_UDP_NETMASK); - netlib_set_ipv4netmask("eth0", &addr); + addr.s_addr = HTONL(CONFIG_EXAMPLES_UDP_NETMASK); + netlib_set_ipv4netmask(DEVNAME, &addr); #endif /* CONFIG_EXAMPLES_UDP_IPv6 */ - /* New versions of netlib_set_ipvXaddr will not bring the network up, - * So ensure the network is really up at this point. - */ + /* New versions of netlib_set_ipvXaddr will not bring the network up, + * So ensure the network is really up at this point. + */ - netlib_ifup("eth0"); - -#ifdef CONFIG_EXAMPLES_UDP_SERVER - recv_server(); -#else - send_client(); -#endif + netlib_ifup(DEVNAME); + g_initialized = true; + } return 0; } + +#endif /* CONFIG_EXAMPLES_UDP_NETINIT */ + diff --git a/examples/udp/udp.h b/examples/udp/udp.h new file mode 100644 index 000000000..610da91c4 --- /dev/null +++ b/examples/udp/udp.h @@ -0,0 +1,113 @@ +/**************************************************************************** + * examples/udp/udp.h + * + * Copyright (C) 2007, 2008, 2015, 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. + * + ****************************************************************************/ + +#ifndef __EXAMPLES_UDP_UDP_H +#define __EXAMPLES_UDP_UDP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#ifdef EXAMPLES_UDP_HOST +#else +# include +#endif + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifdef EXAMPLES_UDP_HOST + /* HTONS/L macros are unique to uIP-based networks */ + +# ifdef CONFIG_ENDIAN_BIG +# define HTONS(ns) (ns) +# define HTONL(nl) (nl) +# else +# define HTONS(ns) \ + (unsigned short) \ + (((((unsigned short)(ns)) & 0x00ff) << 8) | \ + ((((unsigned short)(ns)) >> 8) & 0x00ff)) +# define HTONL(nl) \ + (unsigned long) \ + (((((unsigned long)(nl)) & 0x000000ffUL) << 24) | \ + ((((unsigned long)(nl)) & 0x0000ff00UL) << 8) | \ + ((((unsigned long)(nl)) & 0x00ff0000UL) >> 8) | \ + ((((unsigned long)(nl)) & 0xff000000UL) >> 24)) +# endif + +# define NTOHS(hs) HTONS(hs) +# define NTOHL(hl) HTONL(hl) +# define FAR +#endif + +#ifdef CONFIG_EXAMPLES_UDP_IPv6 +# define AF_INETX AF_INET6 +# define PF_INETX PF_INET6 +#else +# define AF_INETX AF_INET +# define PF_INETX PF_INET +#endif + +#define PORTNO 5471 + +#define ASCIISIZE (0x7f - 0x20) +#define SENDSIZE (ASCIISIZE+1) + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifdef CONFIG_EXAMPLES_UDP_IPv6 +uint16_t g_server_ipv6[8]; +#else +uint32_t g_server_ipv4; +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#ifdef CONFIG_EXAMPLES_UDP_NETINIT +int target_netinit(void); +#endif + +void parse_cmdline(int argc, char **argv); +void send_client(void); +void recv_server(void); + +#endif /* __EXAMPLES_UDP_UDP_H */ diff --git a/examples/udp/udp-client.c b/examples/udp/udp_client.c similarity index 85% rename from examples/udp/udp-client.c rename to examples/udp/udp_client.c index 416a2b4ea..4d13a2649 100644 --- a/examples/udp/udp-client.c +++ b/examples/udp/udp_client.c @@ -1,5 +1,5 @@ /**************************************************************************** - * examples/udp/udp-client.c + * examples/udp/udp_client.c * * Copyright (C) 2007, 2015 Gregory Nutt. All rights reserved. * Author: Gregory Nutt @@ -51,7 +51,7 @@ #include #include -#include "udp-internal.h" +#include "udp.h" /**************************************************************************** * Private Functions @@ -112,22 +112,12 @@ void send_client(void) #ifdef CONFIG_EXAMPLES_UDP_IPv6 server.sin6_family = AF_INET6; server.sin6_port = HTONS(PORTNO); - - server.sin6_addr.s6_addr16[0] = HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_1); - server.sin6_addr.s6_addr16[1] = HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_2); - server.sin6_addr.s6_addr16[2] = HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_3); - server.sin6_addr.s6_addr16[3] = HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_4); - server.sin6_addr.s6_addr16[4] = HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_5); - server.sin6_addr.s6_addr16[5] = HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_6); - server.sin6_addr.s6_addr16[6] = HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_7); - server.sin6_addr.s6_addr16[7] = HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_8); - + memcpy(server.sin6_addr.s6_addr16, g_server_ipv6, 8 * sizeof(uint16_t)); addrlen = sizeof(struct sockaddr_in6); #else server.sin_family = AF_INET; server.sin_port = HTONS(PORTNO); - server.sin_addr.s_addr = HTONL(CONFIG_EXAMPLES_UDP_SERVERIP); - + server.sin_addr.s_addr = (in_addr_t)g_server_ipv4; addrlen = sizeof(struct sockaddr_in); #endif diff --git a/examples/udp/udp_cmdline.c b/examples/udp/udp_cmdline.c new file mode 100644 index 000000000..13695cf48 --- /dev/null +++ b/examples/udp/udp_cmdline.c @@ -0,0 +1,118 @@ +/**************************************************************************** + * examples/udp/udp_cmdline.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 "config.h" + +#include +#include +#include + +#include "udp.h" + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifdef CONFIG_EXAMPLES_UDP_IPv6 +uint16_t g_server_ipv6[8] = +{ + HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_1), + HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_2), + HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_3), + HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_4), + HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_5), + HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_6), + HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_7), + HTONS(CONFIG_EXAMPLES_UDP_SERVERIPv6ADDR_8) +}; +#else +uint32_t g_server_ipv4 = HTONL(CONFIG_EXAMPLES_UDP_SERVERIP); +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * show_usage + ****************************************************************************/ + +static void show_usage(FAR const char *progname) +{ + fprintf(stderr, "USAGE: %s []\n", progname); + exit(1); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * parse_cmdline + ****************************************************************************/ + +void parse_cmdline(int argc, char **argv) +{ + /* Currently only a single command line option is supported: The server + * IP address. + */ + + if (argc == 2) + { + int ret; + + /* Convert the argument into a binary address */ + +#ifdef CONFIG_EXAMPLES_UDP_IPv6 + ret = inet_pton(AF_INET6, argv[1], g_server_ipv6); +#else + ret = inet_pton(AF_INET, argv[1], &g_server_ipv4); +#endif + if (ret < 0) + { + fprintf(stderr, "ERROR: is invalid\n"); + show_usage(argv[0]); + } + } + else if (argc != 1) + { + fprintf(stderr, "ERROR: Too many arguments\n"); + show_usage(argv[0]); + } +} diff --git a/examples/udp/udp-server.c b/examples/udp/udp_server.c similarity index 99% rename from examples/udp/udp-server.c rename to examples/udp/udp_server.c index c9f16d571..f9fbbdc84 100644 --- a/examples/udp/udp-server.c +++ b/examples/udp/udp_server.c @@ -1,5 +1,5 @@ /**************************************************************************** - * examples/udp/udp-server.c + * examples/udp/udp_server.c * * Copyright (C) 2007, 2009, 2012, 2015 Gregory Nutt. All rights reserved. * Author: Gregory Nutt @@ -50,7 +50,7 @@ #include -#include "udp-internal.h" +#include "udp.h" /**************************************************************************** * Private Functions diff --git a/nshlib/nsh_netinit.c b/nshlib/nsh_netinit.c index d4dbe8103..2670f084e 100644 --- a/nshlib/nsh_netinit.c +++ b/nshlib/nsh_netinit.c @@ -279,7 +279,7 @@ static void nsh_set_macaddr(void) #if defined(CONFIG_NET_ETHERNET) uint8_t mac[IFHWADDRLEN]; #elif defined(CONFIG_NET_6LOWPAN) - uint8_t eaddr[NET_6LOWPAN_ADDRSIZE]; + uint8_t eaddr[8]; #endif /* Many embedded network interfaces must have a software assigned MAC */ diff --git a/wireless/ieee802154/libmac/ieee802154_getpanid.c b/wireless/ieee802154/libmac/ieee802154_getpanid.c index e48f1f1a7..b214f3852 100644 --- a/wireless/ieee802154/libmac/ieee802154_getpanid.c +++ b/wireless/ieee802154/libmac/ieee802154_getpanid.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -61,6 +62,5 @@ int ieee802154_getpanid(int fd, FAR uint8_t *panid) ret = ieee802154_get_req(fd, &req); IEEE802154_PANIDCOPY(panid, req.attrval.mac.panid); - return ret; } diff --git a/wireless/ieee802154/libmac/ieee802154_getsaddr.c b/wireless/ieee802154/libmac/ieee802154_getsaddr.c index 2762b92fb..cd20cc126 100644 --- a/wireless/ieee802154/libmac/ieee802154_getsaddr.c +++ b/wireless/ieee802154/libmac/ieee802154_getsaddr.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -61,6 +62,5 @@ int ieee802154_getsaddr(int fd, FAR uint8_t *saddr) ret = ieee802154_get_req(fd, &req); IEEE802154_SADDRCOPY(saddr, req.attrval.mac.saddr); - return ret; } diff --git a/wireless/ieee802154/libmac/ieee802154_setpanid.c b/wireless/ieee802154/libmac/ieee802154_setpanid.c index f9680e67c..eb4b1f836 100644 --- a/wireless/ieee802154/libmac/ieee802154_setpanid.c +++ b/wireless/ieee802154/libmac/ieee802154_setpanid.c @@ -43,6 +43,7 @@ #include #include #include +#include #include #include diff --git a/wireless/ieee802154/libmac/ieee802154_setsaddr.c b/wireless/ieee802154/libmac/ieee802154_setsaddr.c index 6cadd4ac2..20f2fa544 100644 --- a/wireless/ieee802154/libmac/ieee802154_setsaddr.c +++ b/wireless/ieee802154/libmac/ieee802154_setsaddr.c @@ -43,6 +43,7 @@ #include #include #include +#include #include #include