Skip to content

Commit 2385aa6

Browse files
committed
Fix socket binding
.. & make web workflow bind to v6 if available. Binding v6 "any" address also allows v4 connections
1 parent bee32ea commit 2385aa6

2 files changed

Lines changed: 27 additions & 11 deletions

File tree

ports/espressif/common-hal/socketpool/Socket.c

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -348,20 +348,32 @@ socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_o
348348
// TODO: ipv6
349349
size_t common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self,
350350
const char *host, size_t hostlen, uint32_t port) {
351-
struct sockaddr_in bind_addr;
351+
struct sockaddr_storage bind_addr;
352352
const char *broadcast = "<broadcast>";
353-
uint32_t ip;
354-
if (hostlen == 0) {
355-
ip = IPADDR_ANY;
356-
} else if (hostlen == strlen(broadcast) &&
357-
memcmp(host, broadcast, strlen(broadcast)) == 0) {
358-
ip = IPADDR_BROADCAST;
353+
354+
bind_addr.ss_family = self->family;
355+
356+
if (self->family == AF_INET6) {
357+
struct sockaddr_in6 *addr6 = (void *)&bind_addr;
358+
addr6->sin6_port = htons(port);
359+
// no ipv6 broadcast
360+
if (hostlen == 0) {
361+
memset(&addr6->sin6_addr, 0, sizeof(addr6->sin6_addr));
362+
} else {
363+
socketpool_resolve_host_or_throw(self->family, self->type, host, &bind_addr, port);
364+
}
359365
} else {
360-
ip = inet_addr(host);
366+
struct sockaddr_in *addr4 = (void *)&bind_addr;
367+
addr4->sin_port = htons(port);
368+
if (hostlen == 0) {
369+
addr4->sin_addr.s_addr = IPADDR_ANY;
370+
} else if (hostlen == strlen(broadcast) &&
371+
memcmp(host, broadcast, strlen(broadcast)) == 0) {
372+
addr4->sin_addr.s_addr = IPADDR_BROADCAST;
373+
} else {
374+
socketpool_resolve_host_or_throw(self->family, self->type, host, &bind_addr, port);
375+
}
361376
}
362-
bind_addr.sin_addr.s_addr = ip;
363-
bind_addr.sin_family = self->family;
364-
bind_addr.sin_port = htons(port);
365377

366378
int result = lwip_bind(self->num, (struct sockaddr *)&bind_addr, sizeof(bind_addr));
367379
if (result == 0) {

supervisor/shared/web_workflow/web_workflow.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,11 @@ bool supervisor_start_web_workflow(void) {
338338
#endif
339339

340340
if (common_hal_socketpool_socket_get_closed(&listening)) {
341+
#if CIRCUITPY_SOCKETPOOL_IPV6
342+
socketpool_socket(&pool, SOCKETPOOL_AF_INET6, SOCKETPOOL_SOCK_STREAM, 0, &listening);
343+
#else
341344
socketpool_socket(&pool, SOCKETPOOL_AF_INET, SOCKETPOOL_SOCK_STREAM, 0, &listening);
345+
#endif
342346
common_hal_socketpool_socket_settimeout(&listening, 0);
343347
// Bind to any ip. (Not checking for failures)
344348
common_hal_socketpool_socket_bind(&listening, "", 0, web_api_port);

0 commit comments

Comments
 (0)