33
33
#include " lwip/dns.h"
34
34
#include " lwip/udp.h"
35
35
#include " lwip/lwip_errno.h"
36
+ #include " lwip-sys/arch/sys_arch.h"
36
37
37
38
#include " LWIPStack.h"
38
39
@@ -47,10 +48,10 @@ void LWIP::socket_callback(struct netconn *nc, enum netconn_evt eh, u16_t len)
47
48
return ;
48
49
}
49
50
50
- sys_prot_t prot = sys_arch_protect ();
51
-
52
51
LWIP &lwip = LWIP::get_instance ();
53
52
53
+ lwip.adaptation .lock ();
54
+
54
55
for (int i = 0 ; i < MEMP_NUM_NETCONN; i++) {
55
56
if (lwip.arena [i].in_use
56
57
&& lwip.arena [i].conn == nc
@@ -59,7 +60,7 @@ void LWIP::socket_callback(struct netconn *nc, enum netconn_evt eh, u16_t len)
59
60
}
60
61
}
61
62
62
- sys_arch_unprotect (prot );
63
+ lwip. adaptation . unlock ( );
63
64
}
64
65
65
66
#if !LWIP_IPV4 || !LWIP_IPV6
@@ -149,6 +150,7 @@ void LWIP::tcpip_init_irq(void *eh)
149
150
{
150
151
LWIP *lwip = static_cast <LWIP *>(eh);
151
152
lwip->tcpip_inited .release ();
153
+ sys_tcpip_thread_set ();
152
154
}
153
155
154
156
/* LWIP network stack implementation */
@@ -173,80 +175,85 @@ LWIP::LWIP()
173
175
arena_init ();
174
176
}
175
177
176
- nsapi_error_t LWIP::gethostbyname ( const char *host , SocketAddress *address, nsapi_version_t version )
178
+ nsapi_error_t LWIP::get_dns_server ( int index , SocketAddress *address)
177
179
{
178
- ip_addr_t lwip_addr;
179
-
180
- #if LWIP_IPV4 && LWIP_IPV6
181
- u8_t addr_type;
182
- if (version == NSAPI_UNSPEC) {
183
- const ip_addr_t *ip_addr = NULL ;
184
- if (default_interface) {
185
- ip_addr = get_ip_addr (true , &default_interface->netif );
186
- }
187
- // Prefer IPv6
188
- if (IP_IS_V6 (ip_addr)) {
189
- // If IPv4 is available use it as backup
190
- if (get_ipv4_addr (&default_interface->netif )) {
191
- addr_type = NETCONN_DNS_IPV6_IPV4;
192
- } else {
193
- addr_type = NETCONN_DNS_IPV6;
194
- }
195
- // Prefer IPv4
196
- } else {
197
- // If IPv6 is available use it as backup
198
- if (get_ipv6_addr (&default_interface->netif )) {
199
- addr_type = NETCONN_DNS_IPV4_IPV6;
200
- } else {
201
- addr_type = NETCONN_DNS_IPV4;
180
+ int dns_entries = 0 ;
181
+
182
+ for (int i = 0 ; i < DNS_MAX_SERVERS; i++) {
183
+ const ip_addr_t *ip_addr = dns_getserver (i);
184
+ if (!ip_addr_isany (ip_addr)) {
185
+ if (index == dns_entries) {
186
+ nsapi_addr_t addr;
187
+ convert_lwip_addr_to_mbed (&addr, ip_addr);
188
+ address->set_addr (addr);
189
+ return NSAPI_ERROR_OK;
202
190
}
191
+ dns_entries++;
203
192
}
204
- } else if (version == NSAPI_IPv4) {
205
- addr_type = NETCONN_DNS_IPV4;
206
- } else if (version == NSAPI_IPv6) {
207
- addr_type = NETCONN_DNS_IPV6;
208
- } else {
209
- return NSAPI_ERROR_DNS_FAILURE;
210
193
}
211
- err_t err = netconn_gethostbyname_addrtype (host, &lwip_addr, addr_type);
212
- #elif LWIP_IPV4
213
- if (version != NSAPI_IPv4 && version != NSAPI_UNSPEC) {
214
- return NSAPI_ERROR_DNS_FAILURE;
194
+ return NSAPI_ERROR_NO_ADDRESS;
195
+ }
196
+
197
+ void LWIP::tcpip_thread_callback (void *ptr)
198
+ {
199
+ lwip_callback *cb = static_cast <lwip_callback *>(ptr);
200
+
201
+ if (cb->delay ) {
202
+ sys_timeout (cb->delay , LWIP::tcpip_thread_callback, ptr);
203
+ cb->delay = 0 ;
204
+ } else {
205
+ cb->callback ();
206
+ delete cb;
215
207
}
216
- err_t err = netconn_gethostbyname (host, &lwip_addr);
217
- #elif LWIP_IPV6
218
- if (version != NSAPI_IPv6 && version != NSAPI_UNSPEC) {
219
- return NSAPI_ERROR_DNS_FAILURE;
208
+ }
209
+
210
+ nsapi_error_t LWIP::call_in (int delay, mbed::Callback<void ()> func)
211
+ {
212
+ lwip_callback *cb = new lwip_callback;
213
+ if (!cb) {
214
+ return NSAPI_ERROR_NO_MEMORY;
220
215
}
221
- err_t err = netconn_gethostbyname (host, &lwip_addr);
222
- #endif
223
216
224
- if (err != ERR_OK) {
225
- return NSAPI_ERROR_DNS_FAILURE;
217
+ cb->delay = delay;
218
+ cb->callback = func;
219
+
220
+ if (tcpip_callback_with_block (LWIP::tcpip_thread_callback, cb, 1 ) != ERR_OK) {
221
+ return NSAPI_ERROR_NO_MEMORY;
226
222
}
227
223
228
- nsapi_addr_t addr;
229
- convert_lwip_addr_to_mbed (&addr, &lwip_addr);
230
- address->set_addr (addr);
224
+ return NSAPI_ERROR_OK;
225
+ }
231
226
232
- return 0 ;
227
+ LWIP::call_in_callback_cb_t LWIP::get_call_in_callback ()
228
+ {
229
+ call_in_callback_cb_t cb (this , &LWIP::call_in);
230
+ return cb;
233
231
}
234
232
235
- nsapi_error_t LWIP::add_dns_server ( const SocketAddress &address )
233
+ const char * LWIP::get_ip_address ( )
236
234
{
237
- // Shift all dns servers down to give precedence to new server
238
- for (int i = DNS_MAX_SERVERS-1 ; i > 0 ; i--) {
239
- dns_setserver (i, dns_getserver (i-1 ));
235
+ if (!default_interface) {
236
+ return NULL ;
240
237
}
241
238
242
- nsapi_addr_t addr = address.get_addr ();
243
- ip_addr_t ip_addr;
244
- if (!convert_mbed_addr_to_lwip (&ip_addr, &addr)) {
245
- return NSAPI_ERROR_PARAMETER;
246
- }
239
+ const ip_addr_t *addr = get_ip_addr (true , &default_interface->netif );
247
240
248
- dns_setserver (0 , &ip_addr);
249
- return 0 ;
241
+ if (!addr) {
242
+ return NULL ;
243
+ }
244
+ #if LWIP_IPV6
245
+ if (IP_IS_V6 (addr)) {
246
+ return ip6addr_ntoa_r (ip_2_ip6 (addr), ip_address, sizeof (ip_address));
247
+ }
248
+ #endif
249
+ #if LWIP_IPV4
250
+ if (IP_IS_V4 (addr)) {
251
+ return ip4addr_ntoa_r (ip_2_ip4 (addr), ip_address, sizeof (ip_address));
252
+ }
253
+ #endif
254
+ #if LWIP_IPV6 && LWIP_IPV4
255
+ return NULL ;
256
+ #endif
250
257
}
251
258
252
259
nsapi_error_t LWIP::socket_open (nsapi_socket_t *handle, nsapi_protocol_t proto)
@@ -439,6 +446,7 @@ nsapi_size_or_error_t LWIP::socket_sendto(nsapi_socket_t handle, const SocketAdd
439
446
}
440
447
441
448
struct netbuf *buf = netbuf_new ();
449
+
442
450
err_t err = netbuf_ref (buf, data, (u16_t )size);
443
451
if (err != ERR_OK) {
444
452
netbuf_free (buf);
@@ -588,7 +596,7 @@ nsapi_error_t LWIP::setsockopt(nsapi_socket_t handle, int level, int optname, co
588
596
589
597
member_pair_index = next_free_multicast_member (s, 0 );
590
598
591
- sys_prot_t prot = sys_arch_protect ();
599
+ adaptation. lock ();
592
600
593
601
#if LWIP_IPV4
594
602
if (IP_IS_V4 (&if_addr)) {
@@ -601,7 +609,7 @@ nsapi_error_t LWIP::setsockopt(nsapi_socket_t handle, int level, int optname, co
601
609
}
602
610
#endif
603
611
604
- sys_arch_unprotect (prot );
612
+ adaptation. unlock ( );
605
613
606
614
if (igmp_err == ERR_OK) {
607
615
set_multicast_member_registry_bit (s, member_pair_index);
@@ -616,7 +624,7 @@ nsapi_error_t LWIP::setsockopt(nsapi_socket_t handle, int level, int optname, co
616
624
clear_multicast_member_registry_bit (s, member_pair_index);
617
625
s->multicast_memberships_count --;
618
626
619
- sys_prot_t prot = sys_arch_protect ();
627
+ adaptation. lock ();
620
628
621
629
#if LWIP_IPV4
622
630
if (IP_IS_V4 (&if_addr)) {
@@ -629,7 +637,7 @@ nsapi_error_t LWIP::setsockopt(nsapi_socket_t handle, int level, int optname, co
629
637
}
630
638
#endif
631
639
632
- sys_arch_unprotect (prot );
640
+ adaptation. unlock ( );
633
641
}
634
642
635
643
return err_remap (igmp_err);
0 commit comments