@@ -197,24 +197,25 @@ static bool convert_lwip_addr_to_mbed(nsapi_addr_t *out, const ip_addr_t *in)
197
197
#endif
198
198
}
199
199
200
+ #if LWIP_IPV4
200
201
static const ip_addr_t * mbed_lwip_get_ipv4_addr (const struct netif * netif )
201
202
{
202
- #if LWIP_IPV4
203
203
if (!netif_is_up (netif )) {
204
204
return NULL ;
205
205
}
206
206
207
207
if (!ip4_addr_isany (netif_ip4_addr (netif ))) {
208
208
return netif_ip_addr4 (netif );
209
209
}
210
- #endif
211
210
212
211
return NULL ;
213
212
}
213
+ #endif
214
214
215
+ #if LWIP_IPV6
215
216
static const ip_addr_t * mbed_lwip_get_ipv6_addr (const struct netif * netif )
216
217
{
217
- #if LWIP_IPV6
218
+
218
219
if (!netif_is_up (netif )) {
219
220
return NULL ;
220
221
}
@@ -225,24 +226,29 @@ static const ip_addr_t *mbed_lwip_get_ipv6_addr(const struct netif *netif)
225
226
return netif_ip_addr6 (netif , i );
226
227
}
227
228
}
228
- #endif
229
229
230
230
return NULL ;
231
-
232
231
}
232
+ #endif
233
233
234
234
const ip_addr_t * mbed_lwip_get_ip_addr (bool any_addr , const struct netif * netif )
235
235
{
236
236
const ip_addr_t * pref_ip_addr = 0 ;
237
237
const ip_addr_t * npref_ip_addr = 0 ;
238
238
239
+ #if LWIP_IPV4 && LWIP_IPV6
239
240
#if IP_VERSION_PREF == PREF_IPV4
240
241
pref_ip_addr = mbed_lwip_get_ipv4_addr (netif );
241
242
npref_ip_addr = mbed_lwip_get_ipv6_addr (netif );
242
243
#else
243
244
pref_ip_addr = mbed_lwip_get_ipv6_addr (netif );
244
245
npref_ip_addr = mbed_lwip_get_ipv4_addr (netif );
245
246
#endif
247
+ #elif LWIP_IPV6
248
+ pref_ip_addr = mbed_lwip_get_ipv6_addr (netif );
249
+ #elif LWIP_IPV4
250
+ pref_ip_addr = mbed_lwip_get_ipv4_addr (netif );
251
+ #endif
246
252
247
253
if (pref_ip_addr ) {
248
254
return pref_ip_addr ;
@@ -307,25 +313,38 @@ static void mbed_lwip_netif_link_irq(struct netif *lwip_netif)
307
313
}
308
314
}
309
315
310
- static sys_sem_t lwip_netif_has_addr ;
316
+ static char lwip_has_addr_state = 0 ;
317
+
318
+ #define HAS_ANY_ADDR 1
319
+ static sys_sem_t lwip_netif_has_any_addr ;
320
+ #if PREF_ADDR_TIMEOUT
321
+ #define HAS_PREF_ADDR 2
322
+ static sys_sem_t lwip_netif_has_pref_addr ;
323
+ #endif
324
+ #if BOTH_ADDR_TIMEOUT
325
+ #define HAS_BOTH_ADDR 4
326
+ static sys_sem_t lwip_netif_has_both_addr ;
327
+ #endif
328
+
311
329
static void mbed_lwip_netif_status_irq (struct netif * lwip_netif )
312
330
{
313
- static bool any_addr = true;
314
-
315
331
if (netif_is_up (lwip_netif )) {
316
- // Indicates that has address
317
- if (any_addr == true && mbed_lwip_get_ip_addr (true, lwip_netif )) {
318
- sys_sem_signal (& lwip_netif_has_addr );
319
- any_addr = false;
320
- return ;
332
+ if (!(lwip_has_addr_state & HAS_ANY_ADDR ) && mbed_lwip_get_ip_addr (true, lwip_netif )) {
333
+ sys_sem_signal (& lwip_netif_has_any_addr );
334
+ lwip_has_addr_state |= HAS_ANY_ADDR ;
321
335
}
322
-
323
- // Indicates that has preferred address
324
- if ( mbed_lwip_get_ip_addr (false, lwip_netif )) {
325
- sys_sem_signal ( & lwip_netif_has_addr ) ;
336
+ #if PREF_ADDR_TIMEOUT
337
+ if (!( lwip_has_addr_state & HAS_PREF_ADDR ) && mbed_lwip_get_ip_addr (false, lwip_netif )) {
338
+ sys_sem_signal ( & lwip_netif_has_pref_addr );
339
+ lwip_has_addr_state |= HAS_PREF_ADDR ;
326
340
}
327
- } else {
328
- any_addr = true;
341
+ #endif
342
+ #if BOTH_ADDR_TIMEOUT
343
+ if (!(lwip_has_addr_state & HAS_BOTH_ADDR ) && mbed_lwip_get_ipv4_addr (lwip_netif ) && mbed_lwip_get_ipv6_addr (lwip_netif )) {
344
+ sys_sem_signal (& lwip_netif_has_both_addr );
345
+ lwip_has_addr_state |= HAS_BOTH_ADDR ;
346
+ }
347
+ #endif
329
348
}
330
349
}
331
350
@@ -435,8 +454,13 @@ static void mbed_lwip_core_init(void)
435
454
sys_sem_new (& lwip_tcpip_inited , 0 );
436
455
sys_sem_new (& lwip_netif_linked , 0 );
437
456
sys_sem_new (& lwip_netif_unlinked , 0 );
438
- sys_sem_new (& lwip_netif_has_addr , 0 );
439
-
457
+ sys_sem_new (& lwip_netif_has_any_addr , 0 );
458
+ #if PREF_ADDR_TIMEOUT
459
+ sys_sem_new (& lwip_netif_has_pref_addr , 0 );
460
+ #endif
461
+ #if BOTH_ADDR_TIMEOUT
462
+ sys_sem_new (& lwip_netif_has_both_addr , 0 );
463
+ #endif
440
464
tcpip_init (mbed_lwip_tcpip_init_irq , NULL );
441
465
sys_arch_sem_wait (& lwip_tcpip_inited , 0 );
442
466
@@ -603,20 +627,26 @@ nsapi_error_t mbed_lwip_bringup_2(bool dhcp, bool ppp, const char *ip, const cha
603
627
604
628
// If doesn't have address
605
629
if (!mbed_lwip_get_ip_addr (true, & lwip_netif )) {
606
- if (sys_arch_sem_wait (& lwip_netif_has_addr , DHCP_TIMEOUT * 1000 ) == SYS_ARCH_TIMEOUT ) {
630
+ if (sys_arch_sem_wait (& lwip_netif_has_any_addr , DHCP_TIMEOUT * 1000 ) == SYS_ARCH_TIMEOUT ) {
607
631
if (ppp ) {
608
632
ppp_lwip_disconnect ();
609
633
}
610
-
611
634
return NSAPI_ERROR_DHCP_FAILURE ;
612
635
}
613
636
}
614
637
615
- #if ADDR_TIMEOUT
638
+ #if PREF_ADDR_TIMEOUT
616
639
// If address is not for preferred stack waits a while to see
617
640
// if preferred stack address is acquired
618
641
if (!mbed_lwip_get_ip_addr (false, & lwip_netif )) {
619
- sys_arch_sem_wait (& lwip_netif_has_addr , ADDR_TIMEOUT * 1000 );
642
+ sys_arch_sem_wait (& lwip_netif_has_pref_addr , PREF_ADDR_TIMEOUT * 1000 );
643
+ }
644
+ #endif
645
+ #if BOTH_ADDR_TIMEOUT
646
+ // If addresses for both stacks are not available waits a while to
647
+ // see if address for both stacks are acquired
648
+ if (!(mbed_lwip_get_ipv4_addr (& lwip_netif ) && mbed_lwip_get_ipv6_addr (& lwip_netif ))) {
649
+ sys_arch_sem_wait (& lwip_netif_has_both_addr , BOTH_ADDR_TIMEOUT * 1000 );
620
650
}
621
651
#endif
622
652
@@ -677,10 +707,17 @@ nsapi_error_t mbed_lwip_bringdown_2(bool ppp)
677
707
mbed_lwip_clear_ipv6_addresses (& lwip_netif );
678
708
#endif
679
709
680
-
681
- sys_sem_free (& lwip_netif_has_addr );
682
- sys_sem_new (& lwip_netif_has_addr , 0 );
683
-
710
+ sys_sem_free (& lwip_netif_has_any_addr );
711
+ sys_sem_new (& lwip_netif_has_any_addr , 0 );
712
+ #if PREF_ADDR_TIMEOUT
713
+ sys_sem_free (& lwip_netif_has_pref_addr );
714
+ sys_sem_new (& lwip_netif_has_pref_addr , 0 );
715
+ #endif
716
+ #if BOTH_ADDR_TIMEOUT
717
+ sys_sem_free (& lwip_netif_has_both_addr );
718
+ sys_sem_new (& lwip_netif_has_both_addr , 0 );
719
+ #endif
720
+ lwip_has_addr_state = 0 ;
684
721
lwip_connected = false;
685
722
return 0 ;
686
723
}
@@ -789,19 +826,8 @@ static nsapi_error_t mbed_lwip_socket_open(nsapi_stack_t *stack, nsapi_socket_t
789
826
790
827
enum netconn_type lwip_proto = proto == NSAPI_TCP ? NETCONN_TCP : NETCONN_UDP ;
791
828
792
- #if LWIP_IPV6 && LWIP_IPV4
793
- const ip_addr_t * ip_addr ;
794
- ip_addr = mbed_lwip_get_ip_addr (true, & lwip_netif );
795
-
796
- if (IP_IS_V6 (ip_addr )) {
797
- // Enable IPv6 (or dual-stack). LWIP dual-stack support is
798
- // currently incomplete as of 2.0.0rc2 - eg we will only be able
799
- // to do a UDP sendto to an address matching the type selected
800
- // here. Matching "get_ip_addr" and DNS logic, use v4 if
801
- // available.
802
- lwip_proto |= NETCONN_TYPE_IPV6 ;
803
- }
804
- #elif LWIP_IPV6
829
+ #if LWIP_IPV6
830
+ // Enable IPv6 (or dual-stack)
805
831
lwip_proto |= NETCONN_TYPE_IPV6 ;
806
832
#endif
807
833
0 commit comments