21
21
#include "supervisor/port.h"
22
22
#include "supervisor/shared/tick.h"
23
23
#include "supervisor/workflow.h"
24
+ #include "common-hal/socketpool/__init__.h"
24
25
25
26
#include "lwip/dns.h"
26
27
#include "lwip/err.h"
36
37
37
38
#include "sdk/src/rp2_common/pico_cyw43_arch/include/pico/cyw43_arch.h"
38
39
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
+
39
70
#define MICROPY_PY_LWIP_SOCK_RAW (1)
40
71
41
72
#if 0 // print debugging info
@@ -380,7 +411,7 @@ static mp_uint_t lwip_raw_udp_send(socketpool_socket_obj_t *socket, const byte *
380
411
}
381
412
382
413
// 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 ) {
384
415
385
416
if (socket -> incoming .pbuf == NULL ) {
386
417
if (socket -> timeout == 0 ) {
@@ -400,9 +431,8 @@ static mp_uint_t lwip_raw_udp_receive(socketpool_socket_obj_t *socket, byte *buf
400
431
}
401
432
}
402
433
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 );
406
436
}
407
437
408
438
struct pbuf * p = socket -> incoming .pbuf ;
@@ -726,7 +756,7 @@ socketpool_socket_obj_t *common_hal_socketpool_socket(socketpool_socketpool_obj_
726
756
return socket ;
727
757
}
728
758
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 ) {
730
760
if (self -> type != MOD_NETWORK_SOCK_STREAM ) {
731
761
return - MP_EOPNOTSUPP ;
732
762
}
@@ -808,20 +838,21 @@ int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_
808
838
MICROPY_PY_LWIP_EXIT
809
839
810
840
// 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
+ }
813
844
814
845
return 1 ;
815
846
}
816
847
817
848
socketpool_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 ) {
819
850
// Create new socket object, do it here because we must not raise an out-of-memory
820
851
// exception when the LWIP concurrency lock is held
821
852
socketpool_socket_obj_t * accepted = m_new_ll_obj_with_finaliser (socketpool_socket_obj_t );
822
853
socketpool_socket_reset (accepted );
823
854
824
- int ret = socketpool_socket_accept (socket , ip , port , accepted );
855
+ int ret = socketpool_socket_accept (socket , peer_out , accepted );
825
856
826
857
if (ret <= 0 ) {
827
858
m_del_obj (socketpool_socket_obj_t , accepted );
@@ -852,7 +883,7 @@ size_t common_hal_socketpool_socket_bind(socketpool_socket_obj_t *socket,
852
883
ip_addr_t bind_addr ;
853
884
const ip_addr_t * bind_addr_ptr = & bind_addr ;
854
885
if (hostlen > 0 ) {
855
- socketpool_resolve_host_raise (socket -> pool , host , & bind_addr );
886
+ socketpool_resolve_host_raise (host , & bind_addr );
856
887
} else {
857
888
bind_addr_ptr = IP_ANY_TYPE ;
858
889
}
@@ -941,7 +972,7 @@ void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *socket,
941
972
942
973
// get address
943
974
ip_addr_t dest ;
944
- socketpool_resolve_host_raise (socket -> pool , host , & dest );
975
+ socketpool_resolve_host_raise (host , & dest );
945
976
946
977
err_t err = ERR_ARG ;
947
978
switch (socket -> type ) {
@@ -966,7 +997,7 @@ void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *socket,
966
997
mp_raise_OSError (error_lookup_table [- err ]);
967
998
}
968
999
socket -> peer_port = (mp_uint_t )port ;
969
- memcpy (socket -> peer , & dest , sizeof (socket -> peer ));
1000
+ memcpy (& socket -> peer , & dest , sizeof (socket -> peer ));
970
1001
MICROPY_PY_LWIP_EXIT
971
1002
972
1003
// And now we wait...
@@ -1054,22 +1085,25 @@ bool common_hal_socketpool_socket_listen(socketpool_socket_obj_t *socket, int ba
1054
1085
}
1055
1086
1056
1087
mp_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 ) {
1058
1089
int _errno ;
1059
1090
1060
1091
mp_uint_t ret = 0 ;
1061
1092
switch (socket -> type ) {
1062
1093
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
+
1065
1099
ret = lwip_tcp_receive (socket , (byte * )buf , len , & _errno );
1066
1100
break ;
1067
1101
}
1068
1102
case SOCKETPOOL_SOCK_DGRAM :
1069
1103
#if MICROPY_PY_LWIP_SOCK_RAW
1070
1104
case SOCKETPOOL_SOCK_RAW :
1071
1105
#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 );
1073
1107
break ;
1074
1108
}
1075
1109
if (ret == (unsigned )-1 ) {
@@ -1092,7 +1126,7 @@ int socketpool_socket_recv_into(socketpool_socket_obj_t *socket,
1092
1126
#if MICROPY_PY_LWIP_SOCK_RAW
1093
1127
case SOCKETPOOL_SOCK_RAW :
1094
1128
#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 );
1096
1130
break ;
1097
1131
}
1098
1132
if (ret == (unsigned )-1 ) {
@@ -1143,7 +1177,7 @@ mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t *socket,
1143
1177
const char * host , size_t hostlen , uint32_t port , const uint8_t * buf , uint32_t len ) {
1144
1178
int _errno ;
1145
1179
ip_addr_t ip ;
1146
- socketpool_resolve_host_raise (socket -> pool , host , & ip );
1180
+ socketpool_resolve_host_raise (host , & ip );
1147
1181
1148
1182
mp_uint_t ret = 0 ;
1149
1183
switch (socket -> type ) {
0 commit comments