summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-08-06 11:59:41 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-08-06 11:59:41 -0600
commit35c00972da41e12f4fb0590f4b4d45be91a31bfa (patch)
treec108e3dc1ce6c65c0111cd5a5adbff2521728ac9 /apps
parent0b7ec28d62b4499189c474ee5cf29ec1212ff57a (diff)
downloadnuttx-35c00972da41e12f4fb0590f4b4d45be91a31bfa.tar.gz
nuttx-35c00972da41e12f4fb0590f4b4d45be91a31bfa.tar.bz2
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/Kconfig43
-rw-r--r--apps/nshlib/nsh.h12
-rw-r--r--apps/nshlib/nsh_init.c1
-rw-r--r--apps/nshlib/nsh_netinit.c69
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 */