2121#include "supervisor/port.h"
2222#include "supervisor/shared/tick.h"
2323#include "supervisor/workflow.h"
24+ #include "common-hal/socketpool/__init__.h"
2425
2526#include "lwip/dns.h"
2627#include "lwip/err.h"
3637
3738#include "sdk/src/rp2_common/pico_cyw43_arch/include/pico/cyw43_arch.h"
3839
40+ mp_obj_t socketpool_ip_addr_to_str (const ip_addr_t * addr ) {
41+ char ip_str [IPADDR_STRLEN_MAX ]; // big enough for any supported address type
42+ switch (IP_GET_TYPE (addr )) {
43+ #if CIRCUITPY_SOCKETPOOL_IPV6
44+ case IPADDR_TYPE_V6 :
45+ ip6addr_ntoa_r (ip_2_ip6 (addr ), ip_str , sizeof (ip_str ));
46+ break ;
47+ #endif
48+ default :
49+ ip4addr_ntoa_r (ip_2_ip4 (addr ), ip_str , sizeof (ip_str ));
50+ }
51+ return mp_obj_new_str (ip_str , strlen (ip_str ));
52+ }
53+
54+ static mp_obj_t socketpool_ip_addr_and_port_to_tuple (const ip_addr_t * addr , int port ) {
55+ mp_obj_t args [CIRCUITPY_SOCKETPOOL_IPV6 ? 4 : 2 ] = {
56+ socketpool_ip_addr_to_str (addr ),
57+ MP_OBJ_NEW_SMALL_INT (port ),
58+ };
59+ int n = 2 ;
60+ #if CIRCUITPY_SOCKETPOOL_IPV6
61+ if (IP_GET_TYPE (addr ) == IPADDR_TYPE_V6 ) {
62+ items [2 ] = MP_OBJ_NEW_SMALL_INT (0 ); // sin6_flowinfo
63+ items [3 ] = MP_OBJ_NEW_SMALL_INT (ip_2_ip6 (addr )-> zone );
64+ n = 4 ;
65+ }
66+ #endif
67+ return mp_obj_new_tuple (n , args );
68+ }
69+
3970#define MICROPY_PY_LWIP_SOCK_RAW (1)
4071
4172#if 0 // print debugging info
@@ -380,7 +411,7 @@ static mp_uint_t lwip_raw_udp_send(socketpool_socket_obj_t *socket, const byte *
380411}
381412
382413// Helper function for recv/recvfrom to handle raw/UDP packets
383- static mp_uint_t lwip_raw_udp_receive (socketpool_socket_obj_t * socket , byte * buf , mp_uint_t len , byte * ip , uint32_t * port , int * _errno ) {
414+ static mp_uint_t lwip_raw_udp_receive (socketpool_socket_obj_t * socket , byte * buf , mp_uint_t len , mp_obj_t * peer_out , int * _errno ) {
384415
385416 if (socket -> incoming .pbuf == NULL ) {
386417 if (socket -> timeout == 0 ) {
@@ -400,9 +431,8 @@ static mp_uint_t lwip_raw_udp_receive(socketpool_socket_obj_t *socket, byte *buf
400431 }
401432 }
402433
403- if (ip != NULL ) {
404- memcpy (ip , & socket -> peer , sizeof (socket -> peer ));
405- * port = socket -> peer_port ;
434+ if (peer_out != NULL ) {
435+ * peer_out = socketpool_ip_addr_and_port_to_tuple (& socket -> peer , socket -> peer_port );
406436 }
407437
408438 struct pbuf * p = socket -> incoming .pbuf ;
@@ -726,7 +756,7 @@ socketpool_socket_obj_t *common_hal_socketpool_socket(socketpool_socketpool_obj_
726756 return socket ;
727757}
728758
729- int socketpool_socket_accept (socketpool_socket_obj_t * self , uint8_t * ip , uint32_t * port , socketpool_socket_obj_t * accepted ) {
759+ int socketpool_socket_accept (socketpool_socket_obj_t * self , mp_obj_t * peer_out , socketpool_socket_obj_t * accepted ) {
730760 if (self -> type != MOD_NETWORK_SOCK_STREAM ) {
731761 return - MP_EOPNOTSUPP ;
732762 }
@@ -808,20 +838,21 @@ int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_
808838 MICROPY_PY_LWIP_EXIT
809839
810840 // output values
811- memcpy (ip , & (accepted -> pcb .tcp -> remote_ip ), NETUTILS_IPV4ADDR_BUFSIZE );
812- * port = (mp_uint_t )accepted -> pcb .tcp -> remote_port ;
841+ if (peer_out ) {
842+ * peer_out = socketpool_ip_addr_and_port_to_tuple (& accepted -> pcb .tcp -> remote_ip , accepted -> pcb .tcp -> remote_port );
843+ }
813844
814845 return 1 ;
815846}
816847
817848socketpool_socket_obj_t * common_hal_socketpool_socket_accept (socketpool_socket_obj_t * socket ,
818- uint8_t * ip , uint32_t * port ) {
849+ mp_obj_t * peer_out ) {
819850 // Create new socket object, do it here because we must not raise an out-of-memory
820851 // exception when the LWIP concurrency lock is held
821852 socketpool_socket_obj_t * accepted = m_new_ll_obj_with_finaliser (socketpool_socket_obj_t );
822853 socketpool_socket_reset (accepted );
823854
824- int ret = socketpool_socket_accept (socket , ip , port , accepted );
855+ int ret = socketpool_socket_accept (socket , peer_out , accepted );
825856
826857 if (ret <= 0 ) {
827858 m_del_obj (socketpool_socket_obj_t , accepted );
@@ -852,7 +883,7 @@ size_t common_hal_socketpool_socket_bind(socketpool_socket_obj_t *socket,
852883 ip_addr_t bind_addr ;
853884 const ip_addr_t * bind_addr_ptr = & bind_addr ;
854885 if (hostlen > 0 ) {
855- socketpool_resolve_host_raise (socket -> pool , host , & bind_addr );
886+ socketpool_resolve_host_raise (host , & bind_addr );
856887 } else {
857888 bind_addr_ptr = IP_ANY_TYPE ;
858889 }
@@ -941,7 +972,7 @@ void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *socket,
941972
942973 // get address
943974 ip_addr_t dest ;
944- socketpool_resolve_host_raise (socket -> pool , host , & dest );
975+ socketpool_resolve_host_raise (host , & dest );
945976
946977 err_t err = ERR_ARG ;
947978 switch (socket -> type ) {
@@ -966,7 +997,7 @@ void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *socket,
966997 mp_raise_OSError (error_lookup_table [- err ]);
967998 }
968999 socket -> peer_port = (mp_uint_t )port ;
969- memcpy (socket -> peer , & dest , sizeof (socket -> peer ));
1000+ memcpy (& socket -> peer , & dest , sizeof (socket -> peer ));
9701001 MICROPY_PY_LWIP_EXIT
9711002
9721003 // And now we wait...
@@ -1054,22 +1085,25 @@ bool common_hal_socketpool_socket_listen(socketpool_socket_obj_t *socket, int ba
10541085}
10551086
10561087mp_uint_t common_hal_socketpool_socket_recvfrom_into (socketpool_socket_obj_t * socket ,
1057- uint8_t * buf , uint32_t len , uint8_t * ip , uint32_t * port ) {
1088+ uint8_t * buf , uint32_t len , mp_obj_t * peer_out ) {
10581089 int _errno ;
10591090
10601091 mp_uint_t ret = 0 ;
10611092 switch (socket -> type ) {
10621093 case SOCKETPOOL_SOCK_STREAM : {
1063- memcpy (ip , & socket -> peer , sizeof (socket -> peer ));
1064- * port = (mp_uint_t )socket -> peer_port ;
1094+ // output values
1095+ if (peer_out ) {
1096+ * peer_out = socketpool_ip_addr_and_port_to_tuple (& socket -> peer , socket -> peer_port );
1097+ }
1098+
10651099 ret = lwip_tcp_receive (socket , (byte * )buf , len , & _errno );
10661100 break ;
10671101 }
10681102 case SOCKETPOOL_SOCK_DGRAM :
10691103 #if MICROPY_PY_LWIP_SOCK_RAW
10701104 case SOCKETPOOL_SOCK_RAW :
10711105 #endif
1072- ret = lwip_raw_udp_receive (socket , (byte * )buf , len , ip , port , & _errno );
1106+ ret = lwip_raw_udp_receive (socket , (byte * )buf , len , peer_out , & _errno );
10731107 break ;
10741108 }
10751109 if (ret == (unsigned )-1 ) {
@@ -1092,7 +1126,7 @@ int socketpool_socket_recv_into(socketpool_socket_obj_t *socket,
10921126 #if MICROPY_PY_LWIP_SOCK_RAW
10931127 case SOCKETPOOL_SOCK_RAW :
10941128 #endif
1095- ret = lwip_raw_udp_receive (socket , (byte * )buf , len , NULL , NULL , & _errno );
1129+ ret = lwip_raw_udp_receive (socket , (byte * )buf , len , NULL , & _errno );
10961130 break ;
10971131 }
10981132 if (ret == (unsigned )-1 ) {
@@ -1143,7 +1177,7 @@ mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t *socket,
11431177 const char * host , size_t hostlen , uint32_t port , const uint8_t * buf , uint32_t len ) {
11441178 int _errno ;
11451179 ip_addr_t ip ;
1146- socketpool_resolve_host_raise (socket -> pool , host , & ip );
1180+ socketpool_resolve_host_raise (host , & ip );
11471181
11481182 mp_uint_t ret = 0 ;
11491183 switch (socket -> type ) {
0 commit comments