From 7bee5ecec5cb31f85a856888d2f463b15e0f2995 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Mon, 19 Jun 2017 09:46:40 -0600 Subject: [PATCH 1/6] examples/udp: Add configurable network device name; Add option to suppress network initialization which is not needed if started by NSH or for 6LoWPAN. --- examples/udp/Kconfig | 27 ++- examples/udp/Makefile | 12 +- examples/udp/host.c | 2 +- examples/udp/target.c | 116 +----------- examples/udp/target_netinit.c | 184 ++++++++++++++++++++ examples/udp/{udp-internal.h => udp.h} | 18 +- examples/udp/{udp-client.c => udp_client.c} | 4 +- examples/udp/{udp-server.c => udp_server.c} | 4 +- 8 files changed, 239 insertions(+), 128 deletions(-) create mode 100644 examples/udp/target_netinit.c rename examples/udp/{udp-internal.h => udp.h} (89%) rename examples/udp/{udp-client.c => udp_client.c} (98%) rename examples/udp/{udp-server.c => udp_server.c} (99%) diff --git a/examples/udp/Kconfig b/examples/udp/Kconfig index 7ca5bc70f..75efaa655 100644 --- a/examples/udp/Kconfig +++ b/examples/udp/Kconfig @@ -16,6 +16,26 @@ config EXAMPLES_UDP_SERVER bool "Target is the server" default n +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" default EXAMPLES_UDP_IPv4 if NET_IPv4 @@ -35,6 +55,8 @@ if EXAMPLES_UDP_IPv4 comment "IPv4 addresses" +if !EXAMPLES_UDP_NETINIT + config EXAMPLES_UDP_IPADDR hex "Target IP address" default 0x0a000002 @@ -47,16 +69,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 - endif # EXAMPLES_UDP_IPv4 if EXAMPLES_UDP_IPv6 -if !NET_ICMPv6_AUTOCONF +if !NET_ICMPv6_AUTOCONF && EXAMPLES_UDP_NETINIT comment "Target IPv6 address" diff --git a/examples/udp/Makefile b/examples/udp/Makefile index 3603ee0c3..57c645acc 100644 --- a/examples/udp/Makefile +++ b/examples/udp/Makefile @@ -43,10 +43,14 @@ TARG_ASRCS = TARG_CSRCS = ifeq ($(CONFIG_EXAMPLES_UDP_SERVER),y) -TARG_CSRCS += udp-server.c +TARG_CSRCS += udp_server.c else -TARG_CSRCS += udp-client.c +TARG_CSRCS += udp_client.c endif +ifeq ($(CONFIG_EXAMPLES_UDP_NETINIT),y) +TARG_CSRCS += target_netinit.c +endif + TARG_MAINSRC = target.c TARG_AOBJS = $(TARG_ASRCS:.S=$(OBJEXT)) @@ -74,9 +78,9 @@ HOSTCFLAGS += -DEXAMPLES_UDP_HOST=1 HOST_SRCS = host.c ifeq ($(CONFIG_EXAMPLES_UDP_SERVER),y) -HOST_SRCS += udp-client.c +HOST_SRCS += udp_client.c else -HOST_SRCS += udp-server.c +HOST_SRCS += udp_server.c endif HOST_OBJS = $(HOST_SRCS:.c=.o) diff --git a/examples/udp/host.c b/examples/udp/host.c index 6ea487712..4736fec70 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 diff --git a/examples/udp/target.c b/examples/udp/target.c index 0074cb999..e9a8df233 100644 --- a/examples/udp/target.c +++ b/examples/udp/target.c @@ -38,68 +38,7 @@ ****************************************************************************/ #include "config.h" - -#include -#include - -#include -#include - -#include "netutils/netlib.h" - -#include "udp-internal.h" - -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - -/**************************************************************************** - * Private Data - ****************************************************************************/ - -#if defined(CONFIG_EXAMPLES_UDP_IPv6) && !defined(CONFIG_NET_ICMPv6_AUTOCONF) -/* Our host IPv6 address */ - -static const uint16_t g_ipv6_hostaddr[8] = -{ - HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_1), - HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_2), - HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_3), - HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_4), - HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_5), - HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_6), - HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_7), - HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_8), -}; - -/* Default routine IPv6 address */ - -static const uint16_t g_ipv6_draddr[8] = -{ - HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_1), - HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_2), - HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_3), - HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_4), - HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_5), - HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_6), - HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_7), - HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_8), -}; - -/* IPv6 netmask */ - -static const uint16_t g_ipv6_netmask[8] = -{ - HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_1), - HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_2), - HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_3), - HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_4), - HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_5), - HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_6), - HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_7), - HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_8), -}; -#endif /* CONFIG_EXAMPLES_UDP_IPv6 && !CONFIG_NET_ICMPv6_AUTOCONF */ +#include "udp.h" /**************************************************************************** * Public Functions @@ -115,56 +54,13 @@ int main(int argc, FAR char *argv[]) int udp_main(int argc, char *argv[]) #endif { -#ifdef CONFIG_EXAMPLES_UDP_IPv6 -#ifdef CONFIG_NET_ICMPv6_AUTOCONF - /* Perform ICMPv6 auto-configuration */ +#ifdef CONFIG_EXAMPLES_UDP_NETINIT + /* Initialize the network */ - netlib_icmpv6_autoconfiguration("eth0"); + (void)target_netinit(); +#endif -#else /* CONFIG_NET_ICMPv6_AUTOCONF */ - - /* Set up our fixed host address */ - - netlib_set_ipv6addr("eth0", - (FAR const struct in6_addr *)g_ipv6_hostaddr); - - /* Set up the default router address */ - - netlib_set_dripv6addr("eth0", - (FAR const struct in6_addr *)g_ipv6_draddr); - - /* Setup the subnet mask */ - - netlib_set_ipv6netmask("eth0", - (FAR const struct in6_addr *)g_ipv6_netmask); - -#endif /* CONFIG_NET_ICMPv6_AUTOCONF */ -#else /* CONFIG_EXAMPLES_UDP_IPv6 */ - - struct in_addr addr; - - /* Set up our host address */ - - addr.s_addr = HTONL(CONFIG_EXAMPLES_UDP_IPADDR); - netlib_set_ipv4addr("eth0", &addr); - - /* Set up the default router address */ - - addr.s_addr = HTONL(CONFIG_EXAMPLES_UDP_DRIPADDR); - netlib_set_dripv4addr("eth0", &addr); - - /* Setup the subnet mask */ - - addr.s_addr = HTONL(CONFIG_EXAMPLES_UDP_NETMASK); - netlib_set_ipv4netmask("eth0", &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. - */ - - netlib_ifup("eth0"); + /* Run the server or client, depending upon how we are configured */ #ifdef CONFIG_EXAMPLES_UDP_SERVER recv_server(); diff --git a/examples/udp/target_netinit.c b/examples/udp/target_netinit.c new file mode 100644 index 000000000..d66a6d3ca --- /dev/null +++ b/examples/udp/target_netinit.c @@ -0,0 +1,184 @@ +/**************************************************************************** + * examples/udp/target_netinit.c + * + * 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 + * 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 +#include + +#include "netutils/netlib.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 + ****************************************************************************/ + +#if defined(CONFIG_EXAMPLES_UDP_IPv6) && !defined(CONFIG_NET_ICMPv6_AUTOCONF) +/* Our host IPv6 address */ + +static const uint16_t g_ipv6_hostaddr[8] = +{ + HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_1), + HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_2), + HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_3), + HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_4), + HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_5), + HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_6), + HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_7), + HTONS(CONFIG_EXAMPLES_UDP_IPv6ADDR_8), +}; + +/* Default routine IPv6 address */ + +static const uint16_t g_ipv6_draddr[8] = +{ + HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_1), + HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_2), + HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_3), + HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_4), + HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_5), + HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_6), + HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_7), + HTONS(CONFIG_EXAMPLES_UDP_DRIPv6ADDR_8), +}; + +/* IPv6 netmask */ + +static const uint16_t g_ipv6_netmask[8] = +{ + HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_1), + HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_2), + HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_3), + HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_4), + HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_5), + HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_6), + HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_7), + HTONS(CONFIG_EXAMPLES_UDP_IPv6NETMASK_8), +}; +#endif /* CONFIG_EXAMPLES_UDP_IPv6 && !CONFIG_NET_ICMPv6_AUTOCONF */ + +static bool g_initialized; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * target_netinit + ****************************************************************************/ + +int target_netinit(void) +{ + if (!g_initialized) + { +#ifdef CONFIG_EXAMPLES_UDP_IPv6 +#ifdef CONFIG_NET_ICMPv6_AUTOCONF + /* Perform ICMPv6 auto-configuration */ + + netlib_icmpv6_autoconfiguration(DEVNAME); + +#else /* CONFIG_NET_ICMPv6_AUTOCONF */ + + /* Set up our fixed host address */ + + netlib_set_ipv6addr(DEVNAME, + (FAR const struct in6_addr *)g_ipv6_hostaddr); + + /* Set up the default router address */ + + netlib_set_dripv6addr(DEVNAME, + (FAR const struct in6_addr *)g_ipv6_draddr); + + /* Setup the subnet mask */ + + 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; + + /* Set up our host address */ + + addr.s_addr = HTONL(CONFIG_EXAMPLES_UDP_IPADDR); + netlib_set_ipv4addr(DEVNAME, &addr); + + /* Set up the default router address */ + + addr.s_addr = HTONL(CONFIG_EXAMPLES_UDP_DRIPADDR); + netlib_set_dripv4addr(DEVNAME, &addr); + + /* Setup the subnet mask */ + + 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. + */ + + netlib_ifup(DEVNAME); + g_initialized = true; + } + + return 0; +} + +#endif /* CONFIG_EXAMPLES_UDP_NETINIT */ + diff --git a/examples/udp/udp-internal.h b/examples/udp/udp.h similarity index 89% rename from examples/udp/udp-internal.h rename to examples/udp/udp.h index 8bd6fbe58..321719f90 100644 --- a/examples/udp/udp-internal.h +++ b/examples/udp/udp.h @@ -1,7 +1,7 @@ /**************************************************************************** - * examples/udp/udp-internal.h + * examples/udp/udp.h * - * Copyright (C) 2007, 2008, 2015 Gregory Nutt. All rights reserved. + * 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 @@ -33,8 +33,8 @@ * ****************************************************************************/ -#ifndef __EXAMPLES_UDP_INTERNAL_H -#define __EXAMPLES_UDP_INTERNAL_H +#ifndef __EXAMPLES_UDP_UDP_H +#define __EXAMPLES_UDP_UDP_H /**************************************************************************** * Included Files @@ -75,7 +75,11 @@ * Public Function Prototypes ****************************************************************************/ -extern void send_client(void); -extern void recv_server(void); +#ifdef CONFIG_EXAMPLES_UDP_NETINIT +int target_netinit(void); +#endif -#endif /* __EXAMPLES_UDP_INTERNAL_H */ +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 98% rename from examples/udp/udp-client.c rename to examples/udp/udp_client.c index 416a2b4ea..591e5452f 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 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 From 2f975e8f06a42d4115382c5d7ce4821472d01239 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Mon, 19 Jun 2017 09:47:17 -0600 Subject: [PATCH 2/6] nshlib: fix size of 6LoWPAN extended address. --- nshlib/nsh_netinit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 */ From a73060ae64035bdb6bf6e05bc9850b65b7b5e05a Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Mon, 19 Jun 2017 09:47:39 -0600 Subject: [PATCH 3/6] ieee802154/libmac: Eliminate some warnings. --- wireless/ieee802154/libmac/ieee802154_getpanid.c | 2 +- wireless/ieee802154/libmac/ieee802154_getsaddr.c | 2 +- wireless/ieee802154/libmac/ieee802154_setpanid.c | 1 + wireless/ieee802154/libmac/ieee802154_setsaddr.c | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) 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 From bb95584aedf8005af5ae0b001884123f46d77916 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Mon, 19 Jun 2017 11:03:10 -0600 Subject: [PATCH 4/6] examples/udp: Fixe registration as a built-in program; Change some naming to make room for a second target. Current one endpoint is the target and one is the host. This will (eventually) allow two targets to be both endpoints of the test. --- examples/udp/Kconfig | 33 ++++++++++++++++----- examples/udp/Makefile | 44 +++++++++++++++++++++------- examples/udp/host.c | 2 +- examples/udp/{target.c => target1.c} | 12 ++++---- 4 files changed, 68 insertions(+), 23 deletions(-) rename examples/udp/{target.c => target1.c} (90%) diff --git a/examples/udp/Kconfig b/examples/udp/Kconfig index 75efaa655..e694e112a 100644 --- a/examples/udp/Kconfig +++ b/examples/udp/Kconfig @@ -12,9 +12,28 @@ 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_DEVNAME string "Network device" @@ -55,7 +74,7 @@ if EXAMPLES_UDP_IPv4 comment "IPv4 addresses" -if !EXAMPLES_UDP_NETINIT +if EXAMPLES_UDP_NETINIT config EXAMPLES_UDP_IPADDR hex "Target IP address" @@ -73,8 +92,8 @@ 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 @@ -445,8 +464,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 57c645acc..8072bbc3a 100644 --- a/examples/udp/Makefile +++ b/examples/udp/Makefile @@ -42,7 +42,7 @@ include $(APPDIR)/Make.defs TARG_ASRCS = TARG_CSRCS = -ifeq ($(CONFIG_EXAMPLES_UDP_SERVER),y) +ifeq ($(CONFIG_EXAMPLES_UDP_SERVER1),y) TARG_CSRCS += udp_server.c else TARG_CSRCS += udp_client.c @@ -51,7 +51,7 @@ ifeq ($(CONFIG_EXAMPLES_UDP_NETINIT),y) TARG_CSRCS += target_netinit.c endif -TARG_MAINSRC = target.c +TARG_MAINSRC = target1.c TARG_AOBJS = $(TARG_ASRCS:.S=$(OBJEXT)) TARG_COBJS = $(TARG_CSRCS:.c=$(OBJEXT)) @@ -77,7 +77,7 @@ endif HOSTCFLAGS += -DEXAMPLES_UDP_HOST=1 HOST_SRCS = host.c -ifeq ($(CONFIG_EXAMPLES_UDP_SERVER),y) +ifeq ($(CONFIG_EXAMPLES_UDP_SERVER1),y) HOST_SRCS += udp_client.c else HOST_SRCS += udp_server.c @@ -92,8 +92,25 @@ else INSTALL_DIR = $(BIN_DIR) endif -CONFIG_XYZ_PROGNAME ?= udp$(EXEEXT) -PROGNAME = $(CONFIG_XYZ_PROGNAME) +ifeq ($(EXAMPLES_UDP_SERVER1),y) +CONFIG_EXAMPLES_UDP_PROGNAME1 ?= udpserver$(EXEEXT) +APPNAME1 = udpserver +else +CONFIG_EXAMPLES_UDP_PROGNAME1 ?= udpclient$(EXEEXT) +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) + +ifeq ($(EXAMPLES_UDP_TARGET2),y) +MAINNAME1 = udp1_main +else +MAINNAME1 = udp_main +endif ROOTDEPPATH = --dep-path . @@ -128,19 +145,26 @@ $(HOST_BIN): config.h $(HOST_OBJS) $(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) $(TARG_MAINOBJ) + @echo "LD: $(PROGNAME1)" + $(Q) $(LD) $(LDELFFLAGS) $(LDLIBPATH) -o $(INSTALL_DIR)$(DELIM)$(PROGNAME1) $(ARCHCRT0OBJ) $(TARG_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)) + +context: $(BUILTIN_REGISTRY)$(DELIM)$(APPNAME1)_main.bdat +else context: +endif .depend: Makefile config.h $(TARG_SRCS) @$(MKDEP) $(ROOTDEPPATH) "$(CC)" -- $(CFLAGS) -- $(TARG_SRCS) >Make.dep diff --git a/examples/udp/host.c b/examples/udp/host.c index 4736fec70..8c095e86a 100644 --- a/examples/udp/host.c +++ b/examples/udp/host.c @@ -54,7 +54,7 @@ int main(int argc, char **argv, char **envp) { -#ifdef CONFIG_EXAMPLES_UDP_SERVER +#ifdef CONFIG_EXAMPLES_UDP_SERVER1 send_client(); #else recv_server(); diff --git a/examples/udp/target.c b/examples/udp/target1.c similarity index 90% rename from examples/udp/target.c rename to examples/udp/target1.c index e9a8df233..89e4803c3 100644 --- a/examples/udp/target.c +++ b/examples/udp/target1.c @@ -1,7 +1,7 @@ /**************************************************************************** - * examples/udp/target.c + * examples/udp/target1.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 @@ -45,11 +45,13 @@ ****************************************************************************/ /**************************************************************************** - * udp_main + * udp1_main ****************************************************************************/ -#ifdef CONFIG_BUILD_KERNEL +#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 @@ -62,7 +64,7 @@ int udp_main(int argc, char *argv[]) /* Run the server or client, depending upon how we are configured */ -#ifdef CONFIG_EXAMPLES_UDP_SERVER +#ifdef CONFIG_EXAMPLES_UDP_SERVER1 recv_server(); #else send_client(); From d1fb6dec09b0dd2324d1a92a0a37ff8acaa2000a Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Mon, 19 Jun 2017 11:58:56 -0600 Subject: [PATCH 5/6] examples/udp: Change build so that both server and client can be on a target, rather than one on the target one on the host PC. --- examples/udp/Kconfig | 31 ++++++++ examples/udp/Makefile | 160 ++++++++++++++++++++++++++--------------- examples/udp/target2.c | 72 +++++++++++++++++++ 3 files changed, 207 insertions(+), 56 deletions(-) create mode 100644 examples/udp/target2.c diff --git a/examples/udp/Kconfig b/examples/udp/Kconfig index e694e112a..97499dd96 100644 --- a/examples/udp/Kconfig +++ b/examples/udp/Kconfig @@ -35,6 +35,37 @@ 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" diff --git a/examples/udp/Makefile b/examples/udp/Makefile index 8072bbc3a..bf6f069ea 100644 --- a/examples/udp/Makefile +++ b/examples/udp/Makefile @@ -39,29 +39,92 @@ include $(APPDIR)/Make.defs # UDP Test -TARG_ASRCS = - -TARG_CSRCS = -ifeq ($(CONFIG_EXAMPLES_UDP_SERVER1),y) -TARG_CSRCS += udp_server.c -else -TARG_CSRCS += udp_client.c -endif +TARGCMN_CRCS = ifeq ($(CONFIG_EXAMPLES_UDP_NETINIT),y) -TARG_CSRCS += target_netinit.c +TARGCMN_CRCS += target_netinit.c endif -TARG_MAINSRC = target1.c +# Target 1 -TARG_AOBJS = $(TARG_ASRCS:.S=$(OBJEXT)) -TARG_COBJS = $(TARG_CSRCS:.c=$(OBJEXT)) -TARG_MAINOBJ = $(TARG_MAINSRC:.c=$(OBJEXT)) +TARG1_CRCS = +ifeq ($(CONFIG_EXAMPLES_UDP_SERVER1),y) +TARG1_CRCS += udp_server.c +else +TARG1_CRCS += udp_client.c +endif +TARG1_MAINSRC = target1.c -TARG_SRCS = $(TARG_ASRCS) $(TARG_CSRCS) $(TARG_MAINSRC) -TARG_OBJS = $(TARG_AOBJS) $(TARG_COBJS) +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) +TARG_OBJS = $(TARG1_COBJS) $(TARG2_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 + +HOST_SRCS = host.c +ifeq ($(CONFIG_EXAMPLES_UDP_SERVER1),y) +HOST_SRCS += udp_client.c +else +HOST_SRCS += udp_server.c +endif + +HOST_OBJS = $(HOST_SRCS:.c=.o) +HOST_BIN = host$(EXEEXT) + endif ifeq ($(CONFIG_WINDOWS_NATIVE),y) @@ -74,44 +137,19 @@ else endif endif -HOSTCFLAGS += -DEXAMPLES_UDP_HOST=1 - -HOST_SRCS = host.c -ifeq ($(CONFIG_EXAMPLES_UDP_SERVER1),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 -ifeq ($(EXAMPLES_UDP_SERVER1),y) -CONFIG_EXAMPLES_UDP_PROGNAME1 ?= udpserver$(EXEEXT) -APPNAME1 = udpserver -else -CONFIG_EXAMPLES_UDP_PROGNAME1 ?= udpclient$(EXEEXT) -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) - -ifeq ($(EXAMPLES_UDP_TARGET2),y) -MAINNAME1 = udp1_main -else -MAINNAME1 = udp_main -endif - ROOTDEPPATH = --dep-path . # Common build @@ -119,35 +157,36 @@ 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): %$(OBJEXT): %.c $(call COMPILE, $<, $@) $(TARG_BIN): $(TARG_OBJS) $(HOST_BIN) $(call ARCHIVE, $@, $(TARG_OBJS)) +ifneq ($(CONFIG_EXAMPLES_UDP_TARGET2),y) $(HOST_OBJS): %.o: %.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)$(PROGNAME1): $(OBJS) $(TARG_MAINOBJ) +$(BIN_DIR)$(DELIM)$(PROGNAME1): $(OBJS) $(TARG1_MAINOBJ) @echo "LD: $(PROGNAME1)" - $(Q) $(LD) $(LDELFFLAGS) $(LDLIBPATH) -o $(INSTALL_DIR)$(DELIM)$(PROGNAME1) $(ARCHCRT0OBJ) $(TARG_MAINOBJ) $(LDLIBS) + $(Q) $(LD) $(LDELFFLAGS) $(LDLIBPATH) -o $(INSTALL_DIR)$(DELIM)$(PROGNAME1) $(ARCHCRT0OBJ) $(TARG1_MAINOBJ) $(LDLIBS) $(Q) $(NM) -u $(INSTALL_DIR)$(DELIM)$(PROGNAME1) install: $(BIN_DIR)$(DELIM)$(PROGNAME1) @@ -161,7 +200,15 @@ 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 @@ -174,8 +221,10 @@ depend: .depend clean: $(call DELFILE, .built) - $(call DELFILE, $(TARG_BIN)) + #$(call DELFILE, $(TARG_BIN)) +ifneq ($(CONFIG_EXAMPLES_UDP_TARGET2),y) $(call DELFILE, $(HOST_BIN)) +endif $(call DELFILE, *.dSYM) $(call DELFILE, config.h) $(call CLEAN) @@ -184,7 +233,6 @@ distclean: clean $(call DELFILE, Make.dep) $(call DELFILE, .depend) --include Make.dep - -.PHONY: preconfig preconfig: + +-include Make.dep diff --git a/examples/udp/target2.c b/examples/udp/target2.c new file mode 100644 index 000000000..92642893f --- /dev/null +++ b/examples/udp/target2.c @@ -0,0 +1,72 @@ +/**************************************************************************** + * 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 +{ +#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; +} From 3858a4afd58fc60ffb2301b2666195f921671c6e Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Mon, 19 Jun 2017 13:29:58 -0600 Subject: [PATCH 6/6] examples/udp: Server IP address may not be provided on the command line --- examples/udp/Kconfig | 2 +- examples/udp/Makefile | 19 +++--- examples/udp/host.c | 6 ++ examples/udp/target1.c | 4 ++ examples/udp/target2.c | 4 ++ examples/udp/udp.h | 34 ++++++++++- examples/udp/udp_client.c | 14 +---- examples/udp/udp_cmdline.c | 118 +++++++++++++++++++++++++++++++++++++ 8 files changed, 177 insertions(+), 24 deletions(-) create mode 100644 examples/udp/udp_cmdline.c diff --git a/examples/udp/Kconfig b/examples/udp/Kconfig index 97499dd96..62253544e 100644 --- a/examples/udp/Kconfig +++ b/examples/udp/Kconfig @@ -379,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]" diff --git a/examples/udp/Makefile b/examples/udp/Makefile index bf6f069ea..0627426e6 100644 --- a/examples/udp/Makefile +++ b/examples/udp/Makefile @@ -39,10 +39,11 @@ include $(APPDIR)/Make.defs # UDP Test -TARGCMN_CRCS = +TARGCMN_CSRCS = udp_cmdline.c ifeq ($(CONFIG_EXAMPLES_UDP_NETINIT),y) -TARGCMN_CRCS += target_netinit.c +TARGCMN_CSRCS += target_netinit.c endif +TARGCMN_COBJS = $(TARGCMN_CSRCS:.c=$(OBJEXT)) # Target 1 @@ -102,8 +103,8 @@ STACKSIZE2 = $(CONFIG_EXAMPLES_UDP_STACKSIZE2) endif -TARG_SRCS = $(TARG1_CRCS) $(TARG1_MAINSRC) $(TARG2_CRCS) $(TARG2_MAINSRC) -TARG_OBJS = $(TARG1_COBJS) $(TARG2_COBJS) +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 += $(TARG1_MAINOBJ) $(TARG2_MAINOBJ) @@ -114,15 +115,16 @@ endif ifneq ($(CONFIG_EXAMPLES_UDP_TARGET2),y) HOSTCFLAGS += -DEXAMPLES_UDP_HOST=1 +HOSTOBJSEXT ?= o1 -HOST_SRCS = host.c +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=.o) +HOST_OBJS = $(HOST_SRCS:.c=.$(HOSTOBJSEXT)) HOST_BIN = host$(EXEEXT) endif @@ -159,14 +161,14 @@ VPATH = all: .built .PHONY: clean depend distclean preconfig -$(TARG1_COBJS) $(TARG1_MAINOBJ)$(TARG2_COBJS) $(TARG2_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)) ifneq ($(CONFIG_EXAMPLES_UDP_TARGET2),y) -$(HOST_OBJS): %.o: %.c +$(HOST_OBJS): %.$(HOSTOBJSEXT): %.c @echo "CC: $<" $(Q) $(HOSTCC) -c $(HOSTCFLAGS) $< -o $@ endif @@ -224,6 +226,7 @@ clean: #$(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) diff --git a/examples/udp/host.c b/examples/udp/host.c index 8c095e86a..f51410913 100644 --- a/examples/udp/host.c +++ b/examples/udp/host.c @@ -54,6 +54,12 @@ int main(int argc, char **argv, char **envp) { + /* 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 diff --git a/examples/udp/target1.c b/examples/udp/target1.c index 89e4803c3..f64c7e098 100644 --- a/examples/udp/target1.c +++ b/examples/udp/target1.c @@ -56,6 +56,10 @@ int udp1_main(int argc, char *argv[]) int udp_main(int argc, char *argv[]) #endif { + /* Parse any command line options */ + + parse_cmdline(argc, argv); + #ifdef CONFIG_EXAMPLES_UDP_NETINIT /* Initialize the network */ diff --git a/examples/udp/target2.c b/examples/udp/target2.c index 92642893f..84332504b 100644 --- a/examples/udp/target2.c +++ b/examples/udp/target2.c @@ -54,6 +54,10 @@ int main(int argc, FAR char *argv[]) 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 */ diff --git a/examples/udp/udp.h b/examples/udp/udp.h index 321719f90..610da91c4 100644 --- a/examples/udp/udp.h +++ b/examples/udp/udp.h @@ -52,10 +52,27 @@ ****************************************************************************/ #ifdef EXAMPLES_UDP_HOST - /* HTONS/L macros are unique to uIP */ + /* HTONS/L macros are unique to uIP-based networks */ -# define HTONS(a) htons(a) -# define HTONL(a) htonl(a) +# 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 @@ -71,6 +88,16 @@ #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 ****************************************************************************/ @@ -79,6 +106,7 @@ int target_netinit(void); #endif +void parse_cmdline(int argc, char **argv); void send_client(void); void recv_server(void); diff --git a/examples/udp/udp_client.c b/examples/udp/udp_client.c index 591e5452f..4d13a2649 100644 --- a/examples/udp/udp_client.c +++ b/examples/udp/udp_client.c @@ -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]); + } +}