Skip to content

Commit 5a19f6d

Browse files
authored
Merge pull request #5684 from juhaylinen/lwip-socket-fix
lwip: fix socket behaviour
2 parents 3ebc99f + 32e64e7 commit 5a19f6d

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

features/FEATURE_LWIP/lwip-interface/lwip_stack.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,37 @@ static const ip_addr_t *mbed_lwip_get_ipv6_addr(const struct netif *netif)
275275
}
276276
#endif
277277

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+
278309
const ip_addr_t *mbed_lwip_get_ip_addr(bool any_addr, const struct netif *netif)
279310
{
280311
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
9921023
return NSAPI_ERROR_PARAMETER;
9931024
}
9941025

1026+
if (!ip_addr_isany(&ip_addr) && !mbed_lwip_is_local_addr(&ip_addr)) {
1027+
return NSAPI_ERROR_PARAMETER;
1028+
}
1029+
9951030
err_t err = netconn_bind(s->conn, &ip_addr, port);
9961031
return mbed_lwip_err_remap(err);
9971032
}
@@ -1000,6 +1035,10 @@ static nsapi_error_t mbed_lwip_socket_listen(nsapi_stack_t *stack, nsapi_socket_
10001035
{
10011036
struct lwip_socket *s = (struct lwip_socket *)handle;
10021037

1038+
if (s->conn->pcb.tcp->local_port == 0) {
1039+
return NSAPI_ERROR_PARAMETER;
1040+
}
1041+
10031042
err_t err = netconn_listen_with_backlog(s->conn, backlog);
10041043
return mbed_lwip_err_remap(err);
10051044
}
@@ -1028,6 +1067,10 @@ static nsapi_error_t mbed_lwip_socket_accept(nsapi_stack_t *stack, nsapi_socket_
10281067
return NSAPI_ERROR_NO_SOCKET;
10291068
}
10301069

1070+
if (s->conn->pcb.tcp->state != LISTEN) {
1071+
return NSAPI_ERROR_PARAMETER;
1072+
}
1073+
10311074
err_t err = netconn_accept(s->conn, &ns->conn);
10321075
if (err != ERR_OK) {
10331076
mbed_lwip_arena_dealloc(ns);

0 commit comments

Comments
 (0)