Skip to content

Commit bee32ea

Browse files
committed
Make return value of recvfrom_into & accept right for v6 addresses
only tested recvfrom_into as can't bind() v6 addresses yet wifi workflow may be broken by this or maybe it was broken before
1 parent 524236d commit bee32ea

File tree

6 files changed

+47
-36
lines changed

6 files changed

+47
-36
lines changed

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

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "py/runtime.h"
1313
#include "shared-bindings/socketpool/SocketPool.h"
1414
#include "common-hal/socketpool/__init__.h"
15+
#include "common-hal/wifi/__init__.h"
1516
#if CIRCUITPY_SSL
1617
#include "shared-bindings/ssl/SSLSocket.h"
1718
#include "shared-module/ssl/SSLSocket.h"
@@ -269,9 +270,9 @@ socketpool_socket_obj_t *common_hal_socketpool_socket(socketpool_socketpool_obj_
269270
return sock;
270271
}
271272

272-
int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_t *port, socketpool_socket_obj_t *accepted) {
273-
struct sockaddr_in accept_addr;
274-
socklen_t socklen = sizeof(accept_addr);
273+
int socketpool_socket_accept(socketpool_socket_obj_t *self, mp_obj_t *peer_out, socketpool_socket_obj_t *accepted) {
274+
struct sockaddr_storage peer_addr;
275+
socklen_t socklen = sizeof(peer_addr);
275276
int newsoc = -1;
276277
bool timed_out = false;
277278
uint64_t start_ticks = supervisor_ticks_ms64();
@@ -282,20 +283,17 @@ int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_
282283
timed_out = supervisor_ticks_ms64() - start_ticks >= self->timeout_ms;
283284
}
284285
RUN_BACKGROUND_TASKS;
285-
newsoc = lwip_accept(self->num, (struct sockaddr *)&accept_addr, &socklen);
286+
newsoc = lwip_accept(self->num, (struct sockaddr *)&peer_addr, &socklen);
286287
// In non-blocking mode, fail instead of timing out
287288
if (newsoc == -1 && (self->timeout_ms == 0 || mp_hal_is_interrupted())) {
288289
return -MP_EAGAIN;
289290
}
290291
}
291292

292-
if (!timed_out) {
293-
// harmless on failure but avoiding memcpy is faster
294-
memcpy((void *)ip, (void *)&accept_addr.sin_addr.s_addr, sizeof(accept_addr.sin_addr.s_addr));
295-
*port = accept_addr.sin_port;
296-
} else {
293+
if (timed_out) {
297294
return -ETIMEDOUT;
298295
}
296+
299297
if (newsoc < 0) {
300298
return -MP_EBADF;
301299
}
@@ -320,13 +318,16 @@ int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_
320318
accepted->type = self->type;
321319
}
322320

321+
if (peer_out) {
322+
*peer_out = sockaddr_to_tuple(&peer_addr);
323+
}
324+
323325
return newsoc;
324326
}
325327

326-
socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_obj_t *self,
327-
uint8_t *ip, uint32_t *port) {
328+
socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_obj_t *self, mp_obj_t *peer_out) {
328329
socketpool_socket_obj_t *sock = m_new_obj_with_finaliser(socketpool_socket_obj_t);
329-
int newsoc = socketpool_socket_accept(self, ip, port, NULL);
330+
int newsoc = socketpool_socket_accept(self, peer_out, NULL);
330331

331332
if (newsoc > 0) {
332333
// Create the socket
@@ -344,6 +345,7 @@ socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_o
344345
}
345346
}
346347

348+
// TODO: ipv6
347349
size_t common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self,
348350
const char *host, size_t hostlen, uint32_t port) {
349351
struct sockaddr_in bind_addr;
@@ -490,9 +492,9 @@ bool common_hal_socketpool_socket_listen(socketpool_socket_obj_t *self, int back
490492
}
491493

492494
mp_uint_t common_hal_socketpool_socket_recvfrom_into(socketpool_socket_obj_t *self,
493-
uint8_t *buf, uint32_t len, uint8_t *ip, uint32_t *port) {
495+
uint8_t *buf, uint32_t len, mp_obj_t *source_out) {
494496

495-
struct sockaddr_in source_addr;
497+
struct sockaddr_storage source_addr;
496498
socklen_t socklen = sizeof(source_addr);
497499

498500
// LWIP Socket
@@ -514,10 +516,7 @@ mp_uint_t common_hal_socketpool_socket_recvfrom_into(socketpool_socket_obj_t *se
514516
}
515517
}
516518

517-
if (!timed_out) {
518-
memcpy((void *)ip, (void *)&source_addr.sin_addr.s_addr, sizeof(source_addr.sin_addr.s_addr));
519-
*port = htons(source_addr.sin_port);
520-
} else {
519+
if (timed_out) {
521520
mp_raise_OSError(ETIMEDOUT);
522521
}
523522

@@ -526,6 +525,10 @@ mp_uint_t common_hal_socketpool_socket_recvfrom_into(socketpool_socket_obj_t *se
526525
return 0;
527526
}
528527

528+
if (source_out) {
529+
*source_out = sockaddr_to_tuple(&source_addr);
530+
}
531+
529532
return received;
530533
}
531534

ports/espressif/common-hal/wifi/__init__.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,23 @@ mp_obj_t sockaddr_to_str(const struct sockaddr_storage *sockaddr) {
289289
return mp_obj_new_str(buf, strlen(buf));
290290
}
291291

292+
mp_obj_t sockaddr_to_tuple(const struct sockaddr_storage *sockaddr) {
293+
mp_obj_t args[4] = {
294+
sockaddr_to_str(sockaddr),
295+
};
296+
int n = 2;
297+
if (sockaddr->ss_family == AF_INET6) {
298+
const struct sockaddr_in6 *addr6 = (const void *)sockaddr;
299+
args[1] = MP_OBJ_NEW_SMALL_INT(htons(addr6->sin6_port));
300+
args[2] = MP_OBJ_NEW_SMALL_INT(addr6->sin6_flowinfo);
301+
args[3] = MP_OBJ_NEW_SMALL_INT(addr6->sin6_scope_id);
302+
n = 4;
303+
} else {
304+
const struct sockaddr_in *addr = (const void *)sockaddr;
305+
args[1] = MP_OBJ_NEW_SMALL_INT(htons(addr->sin_port));
306+
}
307+
return mp_obj_new_tuple(n, args);
308+
}
292309

293310
void sockaddr_to_espaddr(const struct sockaddr_storage *sockaddr, esp_ip_addr_t *espaddr) {
294311
MP_STATIC_ASSERT(IPADDR_TYPE_V4 == ESP_IPADDR_TYPE_V4);

ports/espressif/common-hal/wifi/__init__.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ void ipaddress_ipaddress_to_esp_idf(mp_obj_t ip_address, ip_addr_t *esp_ip_addre
1919
void ipaddress_ipaddress_to_esp_idf_ip4(mp_obj_t ip_address, esp_ip4_addr_t *esp_ip_address);
2020

2121
mp_obj_t sockaddr_to_str(const struct sockaddr_storage *addr);
22+
mp_obj_t sockaddr_to_tuple(const struct sockaddr_storage *addr);
2223
mp_obj_t espaddr_to_str(const esp_ip_addr_t *espaddr);
2324
mp_obj_t espaddr4_to_str(const esp_ip4_addr_t *espaddr);
2425
mp_obj_t espaddr6_to_str(const esp_ip6_addr_t *espaddr);

shared-bindings/socketpool/Socket.c

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,10 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socketpool_socket___exit___obj, 4, 4,
5757
//| Returns a tuple of (new_socket, remote_address)"""
5858
static mp_obj_t _socketpool_socket_accept(mp_obj_t self_in) {
5959
socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
60-
uint8_t ip[4];
61-
uint32_t port;
62-
63-
socketpool_socket_obj_t *sock = common_hal_socketpool_socket_accept(self, ip, &port);
6460

6561
mp_obj_t tuple_contents[2];
66-
tuple_contents[0] = MP_OBJ_FROM_PTR(sock);
67-
tuple_contents[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG);
62+
tuple_contents[0] = MP_OBJ_FROM_PTR(common_hal_socketpool_socket_accept(self, &tuple_contents[1]));
63+
6864
return mp_obj_new_tuple(2, tuple_contents);
6965
}
7066
static MP_DEFINE_CONST_FUN_OBJ_1(socketpool_socket_accept_obj, _socketpool_socket_accept);
@@ -158,13 +154,9 @@ static mp_obj_t socketpool_socket_recvfrom_into(mp_obj_t self_in, mp_obj_t data_
158154
mp_buffer_info_t bufinfo;
159155
mp_get_buffer_raise(data_in, &bufinfo, MP_BUFFER_WRITE);
160156

161-
byte ip[4];
162-
uint32_t port;
163-
mp_int_t ret = common_hal_socketpool_socket_recvfrom_into(self,
164-
(byte *)bufinfo.buf, bufinfo.len, ip, &port);
165157
mp_obj_t tuple_contents[2];
166-
tuple_contents[0] = mp_obj_new_int_from_uint(ret);
167-
tuple_contents[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG);
158+
tuple_contents[0] = mp_obj_new_int_from_uint(common_hal_socketpool_socket_recvfrom_into(self,
159+
(byte *)bufinfo.buf, bufinfo.len, &tuple_contents[1]));
168160
return mp_obj_new_tuple(2, tuple_contents);
169161
}
170162
static MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_recvfrom_into_obj, socketpool_socket_recvfrom_into);

shared-bindings/socketpool/Socket.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
extern const mp_obj_type_t socketpool_socket_type;
1212

13-
socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_t *port);
13+
socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_obj_t *self, mp_obj_t *peer_out);
1414
size_t common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self, const char *host, size_t hostlen, uint32_t port);
1515
void common_hal_socketpool_socket_close(socketpool_socket_obj_t *self);
1616
void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *self, const char *host, size_t hostlen, uint32_t port);
@@ -20,7 +20,7 @@ mp_uint_t common_hal_socketpool_socket_get_timeout(socketpool_socket_obj_t *self
2020
mp_int_t common_hal_socketpool_socket_get_type(socketpool_socket_obj_t *self);
2121
bool common_hal_socketpool_socket_listen(socketpool_socket_obj_t *self, int backlog);
2222
mp_uint_t common_hal_socketpool_socket_recvfrom_into(socketpool_socket_obj_t *self,
23-
uint8_t *buf, uint32_t len, uint8_t *ip, uint32_t *port);
23+
uint8_t *buf, uint32_t len, mp_obj_t *peer_out);
2424
mp_uint_t common_hal_socketpool_socket_recv_into(socketpool_socket_obj_t *self, const uint8_t *buf, uint32_t len);
2525
mp_uint_t common_hal_socketpool_socket_send(socketpool_socket_obj_t *self, const uint8_t *buf, uint32_t len);
2626
mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t *self,
@@ -31,7 +31,7 @@ bool common_hal_socketpool_readable(socketpool_socket_obj_t *self);
3131
bool common_hal_socketpool_writable(socketpool_socket_obj_t *self);
3232

3333
// Non-allocating versions for internal use.
34-
int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_t *port, socketpool_socket_obj_t *accepted);
34+
int socketpool_socket_accept(socketpool_socket_obj_t *self, mp_obj_t *peer_out, socketpool_socket_obj_t *accepted);
3535
void socketpool_socket_close(socketpool_socket_obj_t *self);
3636
int socketpool_socket_send(socketpool_socket_obj_t *self, const uint8_t *buf, uint32_t len);
3737
int socketpool_socket_recv_into(socketpool_socket_obj_t *self,

supervisor/shared/web_workflow/web_workflow.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1592,12 +1592,10 @@ void supervisor_web_workflow_background(void *data) {
15921592
if ((!common_hal_socketpool_socket_get_connected(&active) ||
15931593
(!active_request.in_progress && !active_request.new_socket)) &&
15941594
!common_hal_socketpool_socket_get_closed(&listening)) {
1595-
uint32_t ip;
1596-
uint32_t port;
15971595
if (!common_hal_socketpool_socket_get_closed(&active)) {
15981596
common_hal_socketpool_socket_close(&active);
15991597
}
1600-
int newsoc = socketpool_socket_accept(&listening, (uint8_t *)&ip, &port, &active);
1598+
int newsoc = socketpool_socket_accept(&listening, NULL, &active);
16011599
if (newsoc == -EBADF) {
16021600
common_hal_socketpool_socket_close(&listening);
16031601
break;

0 commit comments

Comments
 (0)