3737#include "components/lwip/lwip/src/include/lwip/sys.h"
3838#include "components/lwip/lwip/src/include/lwip/netdb.h"
3939
40+ #include "esp_log.h"
41+
42+ static const char * TAG = "socket" ;
43+
4044STATIC socketpool_socket_obj_t * open_socket_handles [CONFIG_LWIP_MAX_SOCKETS ];
4145
4246void socket_user_reset (void ) {
@@ -62,8 +66,7 @@ bool register_open_socket(socketpool_socket_obj_t *self) {
6266 return false;
6367}
6468
65- socketpool_socket_obj_t * common_hal_socketpool_socket_accept (socketpool_socket_obj_t * self ,
66- uint8_t * ip , uint32_t * port ) {
69+ int socketpool_socket_accept (socketpool_socket_obj_t * self , uint8_t * ip , uint32_t * port ) {
6770 struct sockaddr_in accept_addr ;
6871 socklen_t socklen = sizeof (accept_addr );
6972 int newsoc = -1 ;
@@ -81,7 +84,10 @@ socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_o
8184 newsoc = lwip_accept (self -> num , (struct sockaddr * )& accept_addr , & socklen );
8285 // In non-blocking mode, fail instead of timing out
8386 if (newsoc == -1 && self -> timeout_ms == 0 ) {
84- mp_raise_OSError (MP_EAGAIN );
87+ if (errno != EAGAIN ) {
88+ ESP_LOGE (TAG , "accept failed %d" , errno );
89+ }
90+ return - MP_EAGAIN ;
8591 }
8692 }
8793
@@ -90,8 +96,17 @@ socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_o
9096 memcpy ((void * )ip , (void * )& accept_addr .sin_addr .s_addr , sizeof (accept_addr .sin_addr .s_addr ));
9197 * port = accept_addr .sin_port ;
9298 } else {
93- mp_raise_OSError ( ETIMEDOUT ) ;
99+ return - ETIMEDOUT ;
94100 }
101+ if (newsoc < 0 ) {
102+ return - MP_EBADF ;
103+ }
104+ return newsoc ;
105+ }
106+
107+ socketpool_socket_obj_t * common_hal_socketpool_socket_accept (socketpool_socket_obj_t * self ,
108+ uint8_t * ip , uint32_t * port ) {
109+ int newsoc = socketpool_socket_accept (self , ip , port );
95110
96111 if (newsoc > 0 ) {
97112 // Create the socket
@@ -108,7 +123,7 @@ socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_o
108123 lwip_fcntl (newsoc , F_SETFL , O_NONBLOCK );
109124 return sock ;
110125 } else {
111- mp_raise_OSError (MP_EBADF );
126+ mp_raise_OSError (- newsoc );
112127 return NULL ;
113128 }
114129}
@@ -125,17 +140,22 @@ bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self,
125140 if (err != 0 ) {
126141 mp_raise_RuntimeError (translate ("Cannot set socket options" ));
127142 }
128- int result = lwip_bind (self -> num , (struct sockaddr * )& bind_addr , sizeof (bind_addr )) == 0 ;
129- return result ;
143+ int result = lwip_bind (self -> num , (struct sockaddr * )& bind_addr , sizeof (bind_addr ));
144+ ESP_LOGE (TAG , "bind result %d" , result );
145+ return result == 0 ;
130146}
131147
132- void common_hal_socketpool_socket_close (socketpool_socket_obj_t * self ) {
148+ void socketpool_socket_close (socketpool_socket_obj_t * self ) {
133149 self -> connected = false;
134150 if (self -> num >= 0 ) {
135- lwip_shutdown (self -> num , 0 );
151+ lwip_shutdown (self -> num , SHUT_RDWR );
136152 lwip_close (self -> num );
137153 self -> num = -1 ;
138154 }
155+ }
156+
157+ void common_hal_socketpool_socket_close (socketpool_socket_obj_t * self ) {
158+ socketpool_socket_close (self );
139159 // Remove socket record
140160 for (size_t i = 0 ; i < MP_ARRAY_SIZE (open_socket_handles ); i ++ ) {
141161 if (open_socket_handles [i ] == self ) {
@@ -199,7 +219,9 @@ bool common_hal_socketpool_socket_get_connected(socketpool_socket_obj_t *self) {
199219}
200220
201221bool common_hal_socketpool_socket_listen (socketpool_socket_obj_t * self , int backlog ) {
202- return lwip_listen (self -> num , backlog ) == 0 ;
222+ int result = lwip_listen (self -> num , backlog );
223+ ESP_LOGE (TAG , "listen result %d" , result );
224+ return result == 0 ;
203225}
204226
205227mp_uint_t common_hal_socketpool_socket_recvfrom_into (socketpool_socket_obj_t * self ,
@@ -242,7 +264,8 @@ mp_uint_t common_hal_socketpool_socket_recvfrom_into(socketpool_socket_obj_t *se
242264 return received ;
243265}
244266
245- mp_uint_t common_hal_socketpool_socket_recv_into (socketpool_socket_obj_t * self , const uint8_t * buf , uint32_t len ) {
267+ int socketpool_socket_recv_into (socketpool_socket_obj_t * self ,
268+ const uint8_t * buf , uint32_t len ) {
246269 int received = 0 ;
247270 bool timed_out = false;
248271
@@ -261,31 +284,52 @@ mp_uint_t common_hal_socketpool_socket_recv_into(socketpool_socket_obj_t *self,
261284
262285 // In non-blocking mode, fail instead of looping
263286 if (received == -1 && self -> timeout_ms == 0 ) {
264- mp_raise_OSError (MP_EAGAIN );
287+ if (errno != EAGAIN ) {
288+ ESP_LOGE (TAG , "recv %d" , errno );
289+ }
290+ return - MP_EAGAIN ;
265291 }
266292 }
267293 } else {
268- mp_raise_OSError ( MP_EBADF ) ;
294+ return - MP_EBADF ;
269295 }
270296
271297 if (timed_out ) {
272- mp_raise_OSError ( ETIMEDOUT ) ;
298+ return - ETIMEDOUT ;
273299 }
274300 return received ;
275301}
276302
277- mp_uint_t common_hal_socketpool_socket_send (socketpool_socket_obj_t * self , const uint8_t * buf , uint32_t len ) {
303+ mp_uint_t common_hal_socketpool_socket_recv_into (socketpool_socket_obj_t * self , const uint8_t * buf , uint32_t len ) {
304+ int received = socketpool_socket_recv_into (self , buf , len );
305+ if (received < 0 ) {
306+ mp_raise_OSError (received );
307+ }
308+ return received ;
309+ }
310+
311+ int socketpool_socket_send (socketpool_socket_obj_t * self , const uint8_t * buf , uint32_t len ) {
278312 int sent = -1 ;
279313 if (self -> num != -1 ) {
280314 // LWIP Socket
281315 // TODO: deal with potential failure/add timeout?
282316 sent = lwip_send (self -> num , buf , len , 0 );
283317 } else {
284- mp_raise_OSError ( MP_EBADF ) ;
318+ sent = - MP_EBADF ;
285319 }
286320
287321 if (sent < 0 ) {
288- mp_raise_OSError (errno );
322+ return - errno ;
323+ }
324+
325+ return sent ;
326+ }
327+
328+ mp_uint_t common_hal_socketpool_socket_send (socketpool_socket_obj_t * self , const uint8_t * buf , uint32_t len ) {
329+ int sent = socketpool_socket_send (self , buf , len );
330+
331+ if (sent < 0 ) {
332+ mp_raise_OSError (- sent );
289333 }
290334 return sent ;
291335}
0 commit comments