From 7bee5ecec5cb31f85a856888d2f463b15e0f2995 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Mon, 19 Jun 2017 09:46:40 -0600 Subject: [PATCH] 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