@@ -275,6 +275,37 @@ static const ip_addr_t *mbed_lwip_get_ipv6_addr(const struct netif *netif)
275
275
}
276
276
#endif
277
277
278
+ static bool mbed_lwip_is_local_addr (const ip_addr_t * ip_addr )
279
+ {
280
+ struct netif * netif ;
281
+
282
+ for (netif = netif_list ; netif != NULL ; netif = netif -> next ) {
283
+ if (!netif_is_up (netif )) {
284
+ continue ;
285
+ }
286
+ #if LWIP_IPV6
287
+ if (IP_IS_V6 (ip_addr )) {
288
+ for (int i = 0 ; i < LWIP_IPV6_NUM_ADDRESSES ; i ++ ) {
289
+ if (ip6_addr_isvalid (netif_ip6_addr_state (netif , i )) &&
290
+ ip6_addr_cmp (netif_ip6_addr (netif , i ), ip_2_ip6 (ip_addr ))) {
291
+ return true;
292
+ }
293
+ }
294
+ }
295
+ #endif
296
+
297
+ #if LWIP_IPV4
298
+ if (IP_IS_V4 (ip_addr )) {
299
+ if (!ip4_addr_isany (netif_ip4_addr (netif )) &&
300
+ ip4_addr_cmp (netif_ip4_addr (netif ), ip_2_ip4 (ip_addr ))) {
301
+ return true;
302
+ }
303
+ }
304
+ #endif
305
+ }
306
+ return false;
307
+ }
308
+
278
309
const ip_addr_t * mbed_lwip_get_ip_addr (bool any_addr , const struct netif * netif )
279
310
{
280
311
const ip_addr_t * pref_ip_addr = 0 ;
@@ -992,6 +1023,10 @@ static nsapi_error_t mbed_lwip_socket_bind(nsapi_stack_t *stack, nsapi_socket_t
992
1023
return NSAPI_ERROR_PARAMETER ;
993
1024
}
994
1025
1026
+ if (!ip_addr_isany (& ip_addr ) && !mbed_lwip_is_local_addr (& ip_addr )) {
1027
+ return NSAPI_ERROR_PARAMETER ;
1028
+ }
1029
+
995
1030
err_t err = netconn_bind (s -> conn , & ip_addr , port );
996
1031
return mbed_lwip_err_remap (err );
997
1032
}
@@ -1000,6 +1035,10 @@ static nsapi_error_t mbed_lwip_socket_listen(nsapi_stack_t *stack, nsapi_socket_
1000
1035
{
1001
1036
struct lwip_socket * s = (struct lwip_socket * )handle ;
1002
1037
1038
+ if (s -> conn -> pcb .tcp -> local_port == 0 ) {
1039
+ return NSAPI_ERROR_PARAMETER ;
1040
+ }
1041
+
1003
1042
err_t err = netconn_listen_with_backlog (s -> conn , backlog );
1004
1043
return mbed_lwip_err_remap (err );
1005
1044
}
@@ -1028,6 +1067,10 @@ static nsapi_error_t mbed_lwip_socket_accept(nsapi_stack_t *stack, nsapi_socket_
1028
1067
return NSAPI_ERROR_NO_SOCKET ;
1029
1068
}
1030
1069
1070
+ if (s -> conn -> pcb .tcp -> state != LISTEN ) {
1071
+ return NSAPI_ERROR_PARAMETER ;
1072
+ }
1073
+
1031
1074
err_t err = netconn_accept (s -> conn , & ns -> conn );
1032
1075
if (err != ERR_OK ) {
1033
1076
mbed_lwip_arena_dealloc (ns );
0 commit comments