31
31
#include "py/mperrno.h"
32
32
#include "py/runtime.h"
33
33
#include "shared-bindings/socketpool/SocketPool.h"
34
+ #include "shared-bindings/ssl/SSLSocket.h"
35
+ #include "common-hal/ssl/SSLSocket.h"
34
36
#include "supervisor/port.h"
35
37
#include "supervisor/shared/tick.h"
36
38
#include "supervisor/workflow.h"
44
46
StackType_t socket_select_stack [2 * configMINIMAL_STACK_SIZE ];
45
47
46
48
STATIC int open_socket_fds [CONFIG_LWIP_MAX_SOCKETS ];
47
- STATIC bool user_socket [CONFIG_LWIP_MAX_SOCKETS ];
49
+ STATIC socketpool_socket_obj_t * user_socket [CONFIG_LWIP_MAX_SOCKETS ];
48
50
StaticTask_t socket_select_task_handle ;
49
51
STATIC int socket_change_fd = -1 ;
50
52
@@ -117,7 +119,7 @@ void socket_user_reset(void) {
117
119
118
120
for (size_t i = 0 ; i < MP_ARRAY_SIZE (open_socket_fds ); i ++ ) {
119
121
open_socket_fds [i ] = -1 ;
120
- user_socket [i ] = false ;
122
+ user_socket [i ] = NULL ;
121
123
}
122
124
socket_change_fd = eventfd (0 , 0 );
123
125
// Run this at the same priority as CP so that the web workflow background task can be
@@ -134,12 +136,13 @@ void socket_user_reset(void) {
134
136
135
137
for (size_t i = 0 ; i < MP_ARRAY_SIZE (open_socket_fds ); i ++ ) {
136
138
if (open_socket_fds [i ] >= 0 && user_socket [i ]) {
139
+ common_hal_socketpool_socket_close (user_socket [i ]);
137
140
int num = open_socket_fds [i ];
138
141
// Close automatically clears socket handle
139
142
lwip_shutdown (num , SHUT_RDWR );
140
143
lwip_close (num );
141
144
open_socket_fds [i ] = -1 ;
142
- user_socket [i ] = false ;
145
+ user_socket [i ] = NULL ;
143
146
}
144
147
}
145
148
}
@@ -171,10 +174,10 @@ STATIC void unregister_open_socket(int fd) {
171
174
}
172
175
}
173
176
174
- STATIC void mark_user_socket (int fd ) {
177
+ STATIC void mark_user_socket (int fd , socketpool_socket_obj_t * obj ) {
175
178
for (size_t i = 0 ; i < MP_ARRAY_SIZE (open_socket_fds ); i ++ ) {
176
179
if (open_socket_fds [i ] == fd ) {
177
- user_socket [i ] = true ;
180
+ user_socket [i ] = obj ;
178
181
return ;
179
182
}
180
183
}
@@ -236,7 +239,7 @@ socketpool_socket_obj_t *common_hal_socketpool_socket(socketpool_socketpool_obj_
236
239
if (!socketpool_socket (self , family , type , sock )) {
237
240
mp_raise_RuntimeError (translate ("Out of sockets" ));
238
241
}
239
- mark_user_socket (sock -> num );
242
+ mark_user_socket (sock -> num , sock );
240
243
return sock ;
241
244
}
242
245
@@ -293,12 +296,12 @@ int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_
293
296
294
297
socketpool_socket_obj_t * common_hal_socketpool_socket_accept (socketpool_socket_obj_t * self ,
295
298
uint8_t * ip , uint32_t * port ) {
299
+ socketpool_socket_obj_t * sock = m_new_obj_with_finaliser (socketpool_socket_obj_t );
296
300
int newsoc = socketpool_socket_accept (self , ip , port , NULL );
297
301
298
302
if (newsoc > 0 ) {
299
- mark_user_socket (newsoc );
300
303
// Create the socket
301
- socketpool_socket_obj_t * sock = m_new_obj_with_finaliser ( socketpool_socket_obj_t );
304
+ mark_user_socket ( newsoc , sock );
302
305
sock -> base .type = & socketpool_socket_type ;
303
306
sock -> num = newsoc ;
304
307
sock -> pool = self -> pool ;
@@ -338,6 +341,12 @@ bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self,
338
341
}
339
342
340
343
void socketpool_socket_close (socketpool_socket_obj_t * self ) {
344
+ if (self -> ssl_socket ) {
345
+ ssl_sslsocket_obj_t * ssl_socket = self -> ssl_socket ;
346
+ self -> ssl_socket = NULL ;
347
+ common_hal_ssl_sslsocket_close (ssl_socket );
348
+ return ;
349
+ }
341
350
self -> connected = false;
342
351
if (self -> num >= 0 ) {
343
352
lwip_shutdown (self -> num , SHUT_RDWR );
0 commit comments