diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2014-08-06 11:59:41 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2014-08-06 11:59:41 -0600 |
commit | 35c00972da41e12f4fb0590f4b4d45be91a31bfa (patch) | |
tree | c108e3dc1ce6c65c0111cd5a5adbff2521728ac9 /apps | |
parent | 0b7ec28d62b4499189c474ee5cf29ec1212ff57a (diff) | |
download | px4-nuttx-35c00972da41e12f4fb0590f4b4d45be91a31bfa.tar.gz px4-nuttx-35c00972da41e12f4fb0590f4b4d45be91a31bfa.tar.bz2 px4-nuttx-35c00972da41e12f4fb0590f4b4d45be91a31bfa.zip |
NSH networking: There is now a configuration option that will bring up the network on an separate thread. Since the network bring-up is asynchronous, there are not serial console start-up delays due to the network negotiation time.
Diffstat (limited to 'apps')
-rw-r--r-- | apps/nshlib/Kconfig | 43 | ||||
-rw-r--r-- | apps/nshlib/nsh.h | 12 | ||||
-rw-r--r-- | apps/nshlib/nsh_init.c | 1 | ||||
-rw-r--r-- | apps/nshlib/nsh_netinit.c | 69 |
4 files changed, 117 insertions, 8 deletions
diff --git a/apps/nshlib/Kconfig b/apps/nshlib/Kconfig index f710969f5..36839a736 100644 --- a/apps/nshlib/Kconfig +++ b/apps/nshlib/Kconfig @@ -777,6 +777,49 @@ config NSH_ARCHINIT menu "Networking Configuration" depends on NET +config NSH_NETINIT_THREAD + bool "Network initialization thread" + default n + depends on !DISABLE_PTHREAD + ---help--- + NSH is brought up through a series of sequential initialization + steps. This includes networking. If the network is available on + reset, then there is really no issue. Negotiating the link will + take only a second or so and the delay to the NSH prompt is + normally acceptable. + + But if there is no network connected, then the start-up delay can + be very long depending upon things like the particular PHY, driver + timeout delay times, and numbers of retries. A failed negotiation + can potentially take a very long time, perhaps as much as a + minute... Long enough that you might think that the board would + never come up! + + One solution is to enabled by this option. If NSH_NETINIT_THREAD + is selected, the network bring-up will all occur in parallel with + NSH on a separate thread. In this case, the NSH prompt will occur + immediately with the network becoming available some time layer (if + if all). This thread will terminate once it successfully initializes + the network + + NOTES: If no network is connected, the network bring-up will fail + and the network initialization thread will simply exit. There are + no retries and no mechanism to know if the network initialization + was successful. Furthermore, there is currently no support for + detecting loss of network connection. Lots of things to do! + +if NSH_NETINIT_THREAD + +config NSH_NETINIT_THREAD_STACKSIZE + int "Network initialization thread stack size" + default 1568 + +config NSH_NETINIT_THREAD_PRIORITY + int "Network initialization thread priority" + default 100 + +endif # NSH_NETINIT_THREAD + config NSH_DHCPC bool "Use DHCP to get IP address" default n diff --git a/apps/nshlib/nsh.h b/apps/nshlib/nsh.h index 1b76c19af..245690517 100644 --- a/apps/nshlib/nsh.h +++ b/apps/nshlib/nsh.h @@ -104,7 +104,9 @@ # define CONFIG_NSH_TMPDIR "/tmp" #endif -/* Networking support */ +/* Networking support. Make sure that all non-boolean configuration + * settings have some value. + */ #ifndef CONFIG_NSH_IPADDR # define CONFIG_NSH_IPADDR 0x0a000002 @@ -126,6 +128,14 @@ # define CONFIG_NSH_MACADDR 0x00e0deadbeef #endif +#ifndef CONFIG_NSH_NETINIT_THREAD_STACKSIZE +# define CONFIG_NSH_NETINIT_THREAD_STACKSIZE 1568 +#endif + +#ifndef CONFIG_NSH_NETINIT_THREAD_PRIORITY +# define CONFIG_NSH_NETINIT_THREAD_PRIORITY 100 +#endif + #ifndef CONFIG_NET # undef CONFIG_NSH_ARCHMAC #endif diff --git a/apps/nshlib/nsh_init.c b/apps/nshlib/nsh_init.c index 96dea72bc..c9b6a8578 100644 --- a/apps/nshlib/nsh_init.c +++ b/apps/nshlib/nsh_init.c @@ -101,4 +101,3 @@ void nsh_initialize(void) (void)nsh_netinit(); } - diff --git a/apps/nshlib/nsh_netinit.c b/apps/nshlib/nsh_netinit.c index c4e83d7e6..187a0bb2f 100644 --- a/apps/nshlib/nsh_netinit.c +++ b/apps/nshlib/nsh_netinit.c @@ -42,6 +42,7 @@ #include <nuttx/config.h> +#include <pthread.h> #include <debug.h> #include <net/if.h> @@ -95,18 +96,14 @@ ****************************************************************************/ /**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: nsh_netinit + * Name: nsh_netinit_thread * * Description: * Initialize the network per the selected NuttX configuration * ****************************************************************************/ -int nsh_netinit(void) +pthread_addr_t nsh_netinit_thread(pthread_addr_t arg) { struct in_addr addr; #if defined(CONFIG_NSH_DHCPC) @@ -116,6 +113,8 @@ int nsh_netinit(void) uint8_t mac[IFHWADDRLEN]; #endif + nvdbg("Entry\n"); + /* Many embedded network interfaces must have a software assigned MAC */ #if defined(CONFIG_NSH_NOMAC) && !defined(CONFIG_NET_SLIP) @@ -207,7 +206,65 @@ int nsh_netinit(void) } #endif + nvdbg("Exit\n"); return OK; } +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nsh_netinit + * + * Description: + * Initialize the network per the selected NuttX configuration + * + ****************************************************************************/ + +int nsh_netinit(void) +{ +#ifdef CONFIG_NSH_NETINIT_THREAD + struct sched_param sparam; + pthread_attr_t attr; + pthread_t tid; + void *value; + int ret; + + /* Start the network initialization thread to perform the network bring-up + * asynchronously. + */ + + pthread_attr_init(&attr); + sparam.sched_priority = CONFIG_NSH_NETINIT_THREAD_PRIORITY; + (void)pthread_attr_setschedparam(&attr, &sparam); + (void)pthread_attr_setstacksize(&attr, CONFIG_NSH_NETINIT_THREAD_STACKSIZE); + + nvdbg("Starting netinit thread\n"); + ret = pthread_create(&tid, &attr, nsh_netinit_thread, NULL); + if (ret != OK) + { + ndbg("ERROR: Failed to create netinit thread: %d\n", ret); + (void)nsh_netinit_thread(NULL); + } + else + { + /* Detach the thread because we will not be joining to it */ + + (void)pthread_detach(tid); + + /* Name the thread */ + + pthread_setname_np(tid, "netinit"); + } + + return OK; + +#else + /* Perform network initialization sequentially */ + + (void)nsh_netinit_thread(NULL); +#endif +} + #endif /* CONFIG_NET */ |