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.

This commit is contained in:
Gregory Nutt 2014-08-06 11:59:41 -06:00
parent 291697ba8d
commit dc57af80fc
4 changed files with 117 additions and 8 deletions

View File

@ -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

View File

@ -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

View File

@ -101,4 +101,3 @@ void nsh_initialize(void)
(void)nsh_netinit();
}

View File

@ -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 */