diff --git a/features/FEATURE_LWIP/lwip-interface/lwip_stack.c b/features/FEATURE_LWIP/lwip-interface/lwip_stack.c index b8764d7dd3..692316bcdd 100644 --- a/features/FEATURE_LWIP/lwip-interface/lwip_stack.c +++ b/features/FEATURE_LWIP/lwip-interface/lwip_stack.c @@ -57,12 +57,8 @@ static struct lwip_socket { void *data; } lwip_arena[MEMP_NUM_NETCONN]; -static bool lwip_connected = false; - -static void mbed_lwip_arena_init(void) -{ - memset(lwip_arena, 0, sizeof lwip_arena); -} +static bool lwip_inited = false; +static bool lwip_connected = true; static struct lwip_socket *mbed_lwip_arena_alloc(void) { @@ -404,15 +400,14 @@ char *mbed_lwip_get_gateway(char *buf, nsapi_size_t buflen) #endif } -nsapi_error_t mbed_lwip_init(emac_interface_t *emac) +void mbed_lwip_init() { // Check if we've already brought up lwip - if (!mbed_lwip_get_mac_address()) { - // Seed lwip random + if (!lwip_inited) { + // Seed lwip random lwip_seed_random(); - // Set up network // Initialise TCP sequence number uint32_t tcp_isn_secret[4]; for (int i = 0; i < 4; i++) { @@ -421,12 +416,22 @@ nsapi_error_t mbed_lwip_init(emac_interface_t *emac) lwip_init_tcp_isn(0, (u8_t *) &tcp_isn_secret); sys_sem_new(&lwip_tcpip_inited, 0); - sys_sem_new(&lwip_netif_linked, 0); - sys_sem_new(&lwip_netif_has_addr, 0); tcpip_init(mbed_lwip_tcpip_init_irq, NULL); sys_arch_sem_wait(&lwip_tcpip_inited, 0); + lwip_inited = true; + } +} + +nsapi_error_t mbed_lwip_emac_init(emac_interface_t *emac) +{ + // Check if we've already set up netif + if (!mbed_lwip_get_mac_address()) { + // Set up network + sys_sem_new(&lwip_netif_linked, 0); + sys_sem_new(&lwip_netif_has_addr, 0); + memset(&lwip_netif, 0, sizeof lwip_netif); if (!netif_add(&lwip_netif, #if LWIP_IPV4 @@ -457,13 +462,12 @@ nsapi_error_t mbed_lwip_bringup(bool dhcp, const char *ip, const char *netmask, return NSAPI_ERROR_PARAMETER; } - if(mbed_lwip_init(NULL) != NSAPI_ERROR_OK) { + mbed_lwip_init(); + + if (mbed_lwip_emac_init(NULL) != NSAPI_ERROR_OK) { return NSAPI_ERROR_DEVICE_ERROR; } - // Zero out socket set - mbed_lwip_arena_init(); - #if LWIP_IPV6 netif_create_ip6_linklocal_address(&lwip_netif, 1/*from MAC*/); #if LWIP_IPV6_MLD diff --git a/features/FEATURE_LWIP/lwip-interface/lwip_stack.h b/features/FEATURE_LWIP/lwip-interface/lwip_stack.h index afbb8d2f5b..d91c73882e 100644 --- a/features/FEATURE_LWIP/lwip-interface/lwip_stack.h +++ b/features/FEATURE_LWIP/lwip-interface/lwip_stack.h @@ -25,7 +25,8 @@ extern "C" { #endif // Access to lwip through the nsapi -nsapi_error_t mbed_lwip_init(emac_interface_t *emac); +void mbed_lwip_init(); +nsapi_error_t mbed_lwip_emac_init(emac_interface_t *emac); nsapi_error_t mbed_lwip_bringup(bool dhcp, const char *ip, const char *netmask, const char *gw); nsapi_error_t mbed_lwip_bringdown(void);