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
347349size_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
492494mp_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
0 commit comments