29
29
#include <string.h>
30
30
31
31
#include "simplelink.h"
32
- #include "py/mpstate .h"
32
+ #include "py/mpconfig .h"
33
33
#include MICROPY_HAL_H
34
+ #include "py/obj.h"
35
+ #include "py/objstr.h"
34
36
#include "py/runtime.h"
37
+ #include "py/stream.h"
35
38
#include "netutils.h"
36
39
#include "modnetwork.h"
37
40
#include "modwlan.h"
@@ -54,6 +57,7 @@ typedef struct {
54
57
/******************************************************************************
55
58
DEFINE PRIVATE DATA
56
59
******************************************************************************/
60
+ STATIC const mp_obj_type_t socket_type ;
57
61
STATIC OsiLockObj_t modusocket_LockObj ;
58
62
STATIC modusocket_sock_t modusocket_sockets [MOD_NETWORK_MAX_SOCKETS ] = {{.sd = -1 }, {.sd = -1 }, {.sd = -1 }, {.sd = -1 }, {.sd = -1 },
59
63
{.sd = -1 }, {.sd = -1 }, {.sd = -1 }, {.sd = -1 }, {.sd = -1 }};
@@ -121,27 +125,29 @@ void modusocket_close_all_user_sockets (void) {
121
125
/******************************************************************************/
122
126
// socket class
123
127
124
- STATIC const mp_obj_type_t socket_type ;
125
-
126
128
// constructor socket(family=AF_INET, type=SOCK_STREAM, proto=IPPROTO_TCP, fileno=None)
127
129
STATIC mp_obj_t socket_make_new (mp_obj_t type_in , mp_uint_t n_args , mp_uint_t n_kw , const mp_obj_t * args ) {
128
130
mp_arg_check_num (n_args , n_kw , 0 , 4 , false);
129
131
130
132
// create socket object
131
133
mod_network_socket_obj_t * s = m_new_obj_with_finaliser (mod_network_socket_obj_t );
132
134
s -> base .type = (mp_obj_t )& socket_type ;
133
- s -> u_param .domain = AF_INET ;
134
- s -> u_param .type = SOCK_STREAM ;
135
- s -> u_param .proto = IPPROTO_TCP ;
136
- s -> u_param .fileno = -1 ;
135
+ s -> sock_base .u_param .domain = AF_INET ;
136
+ s -> sock_base .u_param .type = SOCK_STREAM ;
137
+ s -> sock_base .u_param .proto = IPPROTO_TCP ;
138
+ s -> sock_base .u_param .fileno = -1 ;
139
+ s -> sock_base .has_timeout = false;
140
+ s -> sock_base .cert_req = false;
141
+ s -> sock_base .closed = false;
142
+
137
143
if (n_args > 0 ) {
138
- s -> u_param .domain = mp_obj_get_int (args [0 ]);
144
+ s -> sock_base . u_param .domain = mp_obj_get_int (args [0 ]);
139
145
if (n_args > 1 ) {
140
- s -> u_param .type = mp_obj_get_int (args [1 ]);
146
+ s -> sock_base . u_param .type = mp_obj_get_int (args [1 ]);
141
147
if (n_args > 2 ) {
142
- s -> u_param .proto = mp_obj_get_int (args [2 ]);
148
+ s -> sock_base . u_param .proto = mp_obj_get_int (args [2 ]);
143
149
if (n_args > 3 ) {
144
- s -> u_param .fileno = mp_obj_get_int (args [3 ]);
150
+ s -> sock_base . u_param .fileno = mp_obj_get_int (args [3 ]);
145
151
}
146
152
}
147
153
}
@@ -153,8 +159,6 @@ STATIC mp_obj_t socket_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_
153
159
nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (_errno )));
154
160
}
155
161
156
- s -> has_timeout = false;
157
- modusocket_socket_add (s -> sd , true);
158
162
return s ;
159
163
}
160
164
@@ -201,9 +205,10 @@ STATIC mp_obj_t socket_accept(mp_obj_t self_in) {
201
205
202
206
// create new socket object
203
207
mod_network_socket_obj_t * socket2 = m_new_obj_with_finaliser (mod_network_socket_obj_t );
204
- socket2 -> base .type = (mp_obj_t )& socket_type ;
208
+ // the new socket inherits all properties from its parent
209
+ memcpy (socket2 , self , sizeof (mod_network_socket_obj_t ));
205
210
206
- // accept incoming connection
211
+ // accept the incoming connection
207
212
uint8_t ip [MOD_NETWORK_IPV4ADDR_BUF_SIZE ];
208
213
mp_uint_t port ;
209
214
int _errno ;
@@ -212,7 +217,7 @@ STATIC mp_obj_t socket_accept(mp_obj_t self_in) {
212
217
}
213
218
214
219
// add the socket to the list
215
- modusocket_socket_add (socket2 -> sd , true);
220
+ modusocket_socket_add (socket2 -> sock_base . sd , true);
216
221
217
222
// make the return value
218
223
mp_obj_tuple_t * client = mp_obj_new_tuple (2 , NULL );
@@ -230,9 +235,12 @@ STATIC mp_obj_t socket_connect(mp_obj_t self_in, mp_obj_t addr_in) {
230
235
uint8_t ip [MOD_NETWORK_IPV4ADDR_BUF_SIZE ];
231
236
mp_uint_t port = netutils_parse_inet_addr (addr_in , ip , NETUTILS_LITTLE );
232
237
233
- // call the NIC to connect the socket
238
+ // connect the socket
234
239
int _errno ;
235
240
if (wlan_socket_connect (self , ip , port , & _errno ) != 0 ) {
241
+ if (!self -> sock_base .cert_req && _errno == SL_ESECSNOVERIFY ) {
242
+ return mp_const_none ;
243
+ }
236
244
nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (_errno )));
237
245
}
238
246
return mp_const_none ;
@@ -246,7 +254,7 @@ STATIC mp_obj_t socket_send(mp_obj_t self_in, mp_obj_t buf_in) {
246
254
mp_get_buffer_raise (buf_in , & bufinfo , MP_BUFFER_READ );
247
255
int _errno ;
248
256
mp_uint_t ret = wlan_socket_send (self , bufinfo .buf , bufinfo .len , & _errno );
249
- if (ret == -1 ) {
<
10000
/td>257
+ if (ret < 0 ) {
250
258
nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (_errno )));
251
259
}
252
260
return mp_obj_new_int_from_uint (ret );
@@ -261,8 +269,8 @@ STATIC mp_obj_t socket_recv(mp_obj_t self_in, mp_obj_t len_in) {
261
269
vstr_init_len (& vstr , len );
262
270
int _errno ;
263
271
mp_uint_t ret = wlan_socket_recv (self , (byte * )vstr .buf , len , & _errno );
264
- if (ret == -1 ) {
265
- if (_errno == EAGAIN && self -> has_timeout ) {
272
+ if (ret < 0 ) {
273
+ if (_errno == EAGAIN && self -> sock_base . has_timeout ) {
266
274
nlr_raise (mp_obj_new_exception_msg (& mp_type_TimeoutError , "timed out" ));
267
275
}
268
276
nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (_errno )));
@@ -291,7 +299,7 @@ STATIC mp_obj_t socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t addr_
291
299
// call the nic to sendto
292
300
int _errno ;
293
301
mp_int_t ret = wlan_socket_sendto (self , bufinfo .buf , bufinfo .len , ip , port , & _errno );
294
- if (ret == -1 ) {
302
+ if (ret < 0 ) {
295
303
nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (_errno )));
296
304
}
297
305
return mp_obj_new_int (ret );
@@ -307,8 +315,8 @@ STATIC mp_obj_t socket_recvfrom(mp_obj_t self_in, mp_obj_t len_in) {
307
315
mp_uint_t port ;
308
316
int _errno ;
309
317
mp_int_t ret = wlan_socket_recvfrom (self , (byte * )vstr .buf , vstr .len , ip , & port , & _errno );
310
- if (ret == -1 ) {
311
- if (_errno == EAGAIN && self -> has_timeout ) {
318
+ if (ret < 0 ) {
319
+ if (_errno == EAGAIN && self -> sock_base . has_timeout ) {
312
320
nlr_raise (mp_obj_new_exception_msg (& mp_type_TimeoutError , "timed out" ));
313
321
}
314
322
nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (_errno )));
@@ -386,29 +394,48 @@ STATIC mp_obj_t socket_setblocking(mp_obj_t self_in, mp_obj_t blocking) {
386
394
STATIC MP_DEFINE_CONST_FUN_OBJ_2 (socket_setblocking_obj , socket_setblocking );
387
395
388
396
STATIC const mp_map_elem_t socket_locals_dict_table [] = {
389
- { MP_OBJ_NEW_QSTR (MP_QSTR___del__ ), (mp_obj_t )& socket_close_obj },
390
- { MP_OBJ_NEW_QSTR (MP_QSTR_close ), (mp_obj_t )& socket_close_obj },
391
- { MP_OBJ_NEW_QSTR (MP_QSTR_bind ), (mp_obj_t )& socket_bind_obj },
392
- { MP_OBJ_NEW_QSTR (MP_QSTR_listen ), (mp_obj_t )& socket_listen_obj },
393
- { MP_OBJ_NEW_QSTR (MP_QSTR_accept ), (mp_obj_t )& socket_accept_obj },
394
- { MP_OBJ_NEW_QSTR (MP_QSTR_connect ), (mp_obj_t )& socket_connect_obj },
395
- { MP_OBJ_NEW_QSTR (MP_QSTR_send ), (mp_obj_t )& socket_send_obj },
396
- { MP_OBJ_NEW_QSTR (MP_QSTR_recv ), (mp_obj_t )& socket_recv_obj },
397
- { MP_OBJ_NEW_QSTR (MP_QSTR_sendto ), (mp_obj_t )& socket_sendto_obj },
398
- { MP_OBJ_NEW_QSTR (MP_QSTR_recvfrom ), (mp_obj_t )& socket_recvfrom_obj },
399
- { MP_OBJ_NEW_QSTR (MP_QSTR_setsockopt ), (mp_obj_t )& socket_setsockopt_obj },
400
- { MP_OBJ_NEW_QSTR (MP_QSTR_settimeout ), (mp_obj_t )& socket_settimeout_obj },
401
- { MP_OBJ_NEW_QSTR (MP_QSTR_setblocking ), (mp_obj_t )& socket_setblocking_obj },
397
+ { MP_OBJ_NEW_QSTR (MP_QSTR___del__ ), (mp_obj_t )& socket_close_obj },
398
+ { MP_OBJ_NEW_QSTR (MP_QSTR_close ), (mp_obj_t )& socket_close_obj },
399
+ { MP_OBJ_NEW_QSTR (MP_QSTR_bind ), (mp_obj_t )& socket_bind_obj },
400
+ { MP_OBJ_NEW_QSTR (MP_QSTR_listen ), (mp_obj_t )& socket_listen_obj },
401
+ { MP_OBJ_NEW_QSTR (MP_QSTR_accept ), (mp_obj_t )& socket_accept_obj },
402
+ { MP_OBJ_NEW_QSTR (MP_QSTR_connect ), (mp_obj_t )& socket_connect_obj },
403
+ { MP_OBJ_NEW_QSTR (MP_QSTR_send ), (mp_obj_t )& socket_send_obj },
404
+ { MP_OBJ_NEW_QSTR (MP_QSTR_recv ), (mp_obj_t )& socket_recv_obj },
405
+ { MP_OBJ_NEW_QSTR (MP_QSTR_sendto ), (mp_obj_t )& socket_sendto_obj },
406
+ { MP_OBJ_NEW_QSTR (MP_QSTR_recvfrom ), (mp_obj_t )& socket_recvfrom_obj },
407
+ { MP_OBJ_NEW_QSTR (MP_QSTR_setsockopt ), (mp_obj_t )& socket_setsockopt_obj },
408
+ { MP_OBJ_NEW_QSTR (MP_QSTR_settimeout ), (mp_obj_t )& socket_settimeout_obj },
409
+ { MP_OBJ_NEW_QSTR (MP_QSTR_setblocking ), (mp_obj_t )& socket_setblocking_obj },
410
+
411
+ // stream methods
412
+ { MP_OBJ_NEW_QSTR (MP_QSTR_read ), (mp_obj_t )& mp_stream_read_obj },
413
+ { MP_OBJ_NEW_QSTR (MP_QSTR_readall ), (mp_obj_t )& mp_stream_readall_obj },
414
+ { MP_OBJ_NEW_QSTR (MP_QSTR_readinto ), (mp_obj_t )& mp_stream_readinto_obj },
415
+ { MP_OBJ_NEW_QSTR (MP_QSTR_readline ), (mp_obj_t )& mp_stream_unbuffered_readline_obj },
416
+ { MP_OBJ_NEW_QSTR (MP_QSTR_write ), (mp_obj_t )& mp_stream_write_obj },
402
417
};
403
418
404
- STATIC MP_DEFINE_CONST_DICT (socket_locals_dict , socket_locals_dict_table );
419
+ MP_DEFINE_CONST_DICT (socket_locals_dict , socket_locals_dict_table );
420
+
421
+ STATIC mp_uint_t socket_read (mp_obj_t self_in , void * buf , mp_uint_t size , int * errcode ) {
422
+ mod_network_socket_obj_t * self = self_in ;
423
+ return wlan_socket_recv (self , buf , size , errcode );
424
+ }
425
+
426
+ STATIC mp_uint_t socket_write (mp_obj_t self_in , const void * buf , mp_uint_t size , int * errcode ) {
427
+ mod_network_socket_obj_t * self = self_in ;
428
+ return wlan_socket_send (self , buf , size , errcode );
429
+ }
405
430
406
- mp_uint_t socket_ioctl (mp_obj_t self_in , mp_uint_t request , mp_uint_t arg , int * errcode ) {
431
+ STATIC mp_uint_t socket_ioctl (mp_obj_t self_in , mp_uint_t request , mp_uint_t arg , int * errcode ) {
407
432
mod_network_socket_obj_t * self = self_in ;
408
433
return wlan_socket_ioctl (self , request , arg , errcode );
409
434
}
410
435
411
- STATIC const mp_stream_p_t socket_stream_p = {
436
+ const mp_stream_p_t socket_stream_p = {
437
+ .read = socket_read ,
438
+ .write = socket_write ,
412
439
.ioctl = socket_ioctl ,
413
440
.is_text = false,
414
441
};
@@ -434,7 +461,7 @@ STATIC mp_obj_t mod_usocket_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) {
434
461
// ipv4 only
435
462
uint8_t out_ip [MOD_NETWORK_IPV4ADDR_BUF_SIZE ];
436
463
int32_t result = wlan_gethostbyname (host , hlen , out_ip , AF_INET );
437
- if (result != 0 ) {
464
+ if (result < 0 ) {
438
465
nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (result )));
439
466
}
440
467
mp_obj_tuple_t * tuple = mp_obj_new_tuple (5 , NULL );
0 commit comments