mirror of
https://github.com/apache/nuttx-apps.git
synced 2025-10-19 19:44:35 +08:00
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:
@@ -777,6 +777,49 @@ config NSH_ARCHINIT
|
|||||||
menu "Networking Configuration"
|
menu "Networking Configuration"
|
||||||
depends on NET
|
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
|
config NSH_DHCPC
|
||||||
bool "Use DHCP to get IP address"
|
bool "Use DHCP to get IP address"
|
||||||
default n
|
default n
|
||||||
|
12
nshlib/nsh.h
12
nshlib/nsh.h
@@ -104,7 +104,9 @@
|
|||||||
# define CONFIG_NSH_TMPDIR "/tmp"
|
# define CONFIG_NSH_TMPDIR "/tmp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Networking support */
|
/* Networking support. Make sure that all non-boolean configuration
|
||||||
|
* settings have some value.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef CONFIG_NSH_IPADDR
|
#ifndef CONFIG_NSH_IPADDR
|
||||||
# define CONFIG_NSH_IPADDR 0x0a000002
|
# define CONFIG_NSH_IPADDR 0x0a000002
|
||||||
@@ -126,6 +128,14 @@
|
|||||||
# define CONFIG_NSH_MACADDR 0x00e0deadbeef
|
# define CONFIG_NSH_MACADDR 0x00e0deadbeef
|
||||||
#endif
|
#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
|
#ifndef CONFIG_NET
|
||||||
# undef CONFIG_NSH_ARCHMAC
|
# undef CONFIG_NSH_ARCHMAC
|
||||||
#endif
|
#endif
|
||||||
|
@@ -101,4 +101,3 @@ void nsh_initialize(void)
|
|||||||
|
|
||||||
(void)nsh_netinit();
|
(void)nsh_netinit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -42,6 +42,7 @@
|
|||||||
|
|
||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
@@ -95,18 +96,14 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Name: nsh_netinit_thread
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: nsh_netinit
|
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Initialize the network per the selected NuttX configuration
|
* 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;
|
struct in_addr addr;
|
||||||
#if defined(CONFIG_NSH_DHCPC)
|
#if defined(CONFIG_NSH_DHCPC)
|
||||||
@@ -116,6 +113,8 @@ int nsh_netinit(void)
|
|||||||
uint8_t mac[IFHWADDRLEN];
|
uint8_t mac[IFHWADDRLEN];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
nvdbg("Entry\n");
|
||||||
|
|
||||||
/* Many embedded network interfaces must have a software assigned MAC */
|
/* Many embedded network interfaces must have a software assigned MAC */
|
||||||
|
|
||||||
#if defined(CONFIG_NSH_NOMAC) && !defined(CONFIG_NET_SLIP)
|
#if defined(CONFIG_NSH_NOMAC) && !defined(CONFIG_NET_SLIP)
|
||||||
@@ -207,7 +206,65 @@ int nsh_netinit(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
nvdbg("Exit\n");
|
||||||
return OK;
|
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 */
|
#endif /* CONFIG_NET */
|
||||||
|
Reference in New Issue
Block a user