2929#include <string.h>
3030
3131#include "simplelink.h"
32- #include "py/mpstate .h"
32+ #include "py/mpconfig .h"
3333#include MICROPY_HAL_H
34+ #include "py/obj.h"
35+ #include "py/objstr.h"
3436#include "py/runtime.h"
37+ #include "py/stream.h"
3538#include "netutils.h"
3639#include "modnetwork.h"
3740#include "modwlan.h"
@@ -54,6 +57,7 @@ typedef struct {
5457/******************************************************************************
5558 DEFINE PRIVATE DATA
5659 ******************************************************************************/
60+ STATIC const mp_obj_type_t socket_type ;
5761STATIC OsiLockObj_t modusocket_LockObj ;
5862STATIC modusocket_sock_t modusocket_sockets [MOD_NETWORK_MAX_SOCKETS ] = {{.sd = -1 }, {.sd = -1 }, {.sd = -1 }, {.sd = -1 }, {.sd = -1 },
5963 {.sd = -1 }, {.sd = -1 }, {.sd = -1 }, {.sd = -1 }, {.sd = -1 }};
@@ -121,27 +125,29 @@ void modusocket_close_all_user_sockets (void) {
121125/******************************************************************************/
122126// socket class
123127
124- STATIC const mp_obj_type_t socket_type ;
125-
126128// constructor socket(family=AF_INET, type=SOCK_STREAM, proto=IPPROTO_TCP, fileno=None)
127129STATIC 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 ) {
128130 mp_arg_check_num (n_args , n_kw , 0 , 4 , false);
129131
130132 // create socket object
131133 mod_network_socket_obj_t * s = m_new_obj_with_finaliser (mod_network_socket_obj_t );
132134 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+
137143 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 ]);
139145 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 ]);
141147 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 ]);
143149 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 ]);
145151 }
146152 }
147153 }
@@ -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_
153159 nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (_errno )));
154160 }
155161
156- s -> has_timeout = false;
157- modusocket_socket_add (s -> sd , true);
158162 return s ;
159163}
160164
@@ -201,9 +205,10 @@ STATIC mp_obj_t socket_accept(mp_obj_t self_in) {
201205
202206 // create new socket object
203207 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 ));
205210
206- // accept incoming connection
211+ // accept the incoming connection
207212 uint8_t ip [MOD_NETWORK_IPV4ADDR_BUF_SIZE ];
208213 mp_uint_t port ;
209214 int _errno ;
@@ -212,7 +217,7 @@ STATIC mp_obj_t socket_accept(mp_obj_t self_in) {
212217 }
213218
214219 // add the socket to the list
215- modusocket_socket_add (socket2 -> sd , true);
220+ modusocket_socket_add (socket2 -> sock_base . sd , true);
216221
217222 // make the return value
218223 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) {
230235 uint8_t ip [MOD_NETWORK_IPV4ADDR_BUF_SIZE ];
231236 mp_uint_t port = netutils_parse_inet_addr (addr_in , ip , NETUTILS_LITTLE );
232237
233- // call the NIC to connect the socket
238+ // connect the socket
234239 int _errno ;
235240 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+ }
236244 nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (_errno )));
237245 }
238246 return mp_const_none ;
@@ -246,7 +254,7 @@ STATIC mp_obj_t socket_send(mp_obj_t self_in, mp_obj_t buf_in) {
246254 mp_get_buffer_raise (buf_in , & bufinfo , MP_BUFFER_READ );
247255 int _errno ;
248256 mp_uint_t ret = wlan_socket_send (self , bufinfo .buf , bufinfo .len , & _errno );
249- if (ret == -1 ) {
257+ if (ret < 0 ) {
250258 nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (_errno )));
251259 }
252260 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) {
261269 vstr_init_len (& vstr , len );
262270 int _errno ;
263271 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 ) {
266274 nlr_raise (mp_obj_new_exception_msg (& mp_type_TimeoutError , "timed out" ));
267275 }
268276 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_
291299 // call the nic to sendto
292300 int _errno ;
293301 mp_int_t ret = wlan_socket_sendto (self , bufinfo .buf , bufinfo .len , ip , port , & _errno );
294- if (ret == -1 ) {
302+ if (ret < 0 ) {
295303 nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (_errno )));
296304 }
297305 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) {
307315 mp_uint_t port ;
308316 int _errno ;
309317 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 ) {
312320 nlr_raise (mp_obj_new_exception_msg (& mp_type_TimeoutError , "timed out" ));
313321 }
314322 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) {
386394STATIC MP_DEFINE_CONST_FUN_OBJ_2 (socket_setblocking_obj , socket_setblocking );
387395
388396STATIC 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 },
402417};
403418
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+ }
405430
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 ) {
407432 mod_network_socket_obj_t * self = self_in ;
408433 return wlan_socket_ioctl (self , request , arg , errcode );
409434}
410435
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 ,
412439 .ioctl = socket_ioctl ,
413440 .is_text = false,
414441};
@@ -434,7 +461,7 @@ STATIC mp_obj_t mod_usocket_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) {
434461 // ipv4 only
435462 uint8_t out_ip [MOD_NETWORK_IPV4ADDR_BUF_SIZE ];
436463 int32_t result = wlan_gethostbyname (host , hlen , out_ip , AF_INET );
437- if (result != 0 ) {
464+ if (result < 0 ) {
438465 nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (result )));
439466 }
440467 mp_obj_tuple_t * tuple = mp_obj_new_tuple (5 , NULL );
0 commit comments