Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Commit 5cf02dc

Browse files
author
Islam Wahdan
authored
Merge pull request #277 from pycom/stable_r2_update
2 parents d6b3616 + 257ce7d commit 5cf02dc

15 files changed

+548
-72
lines changed

esp32/frozen/LTE/sqnsupgrade.py

Lines changed: 98 additions & 34 deletions
Large diffs are not rendered by default.

esp32/mods/lwipsocket.c

Lines changed: 46 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "lwip/sockets.h"
3535
#include "lwip/dns.h"
3636
#include "lwip/netdb.h"
37+
#include "lwipsocket.h"
3738

3839

3940
#define WLAN_MAX_RX_SIZE 2048
@@ -156,49 +157,19 @@ int lwipsocket_socket_connect(mod_network_socket_obj_t *s, byte *ip, mp_uint_t p
156157

157158
if (ret != 0) {
158159
// printf("Connect returned -0x%x\n", -ret);
159-
*_errno = ret;
160+
*_errno = errno;
160161
return -1;
161162
}
162163

163164
// printf("Connected.\n");
164165

165166
if (s->sock_base.is_ssl && (ret == 0)) {
166-
mp_obj_ssl_socket_t *ss = (mp_obj_ssl_socket_t *)s;
167-
168-
if ((ret = mbedtls_net_set_block(&ss->context_fd)) != 0) {
169-
// printf("failed! net_set_(non)block() returned -0x%x\n", -ret);
170-
*_errno = ret;
171-
return -1;
172-
}
173-
174-
mbedtls_ssl_set_bio(&ss->ssl, &ss->context_fd, mbedtls_net_send, NULL, mbedtls_net_recv_timeout);
175-
176-
// printf("Performing the SSL/TLS handshake...\n");
177-
178-
while ((ret = mbedtls_ssl_handshake(&ss->ssl)) != 0)
179-
{
180-
if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE && ret != MBEDTLS_ERR_SSL_TIMEOUT)
181-
{
182-
// printf("mbedtls_ssl_handshake returned -0x%x\n", -ret);
183-
*_errno = ret;
184-
return -1;
185-
}
186-
}
187-
188-
// printf("Verifying peer X.509 certificate...\n");
189167

190-
if ((ret = mbedtls_ssl_get_verify_result(&ss->ssl)) != 0) {
191-
/* In real life, we probably want to close connection if ret != 0 */
192-
// printf("Failed to verify peer certificate!\n");
193-
*_errno = ret;
194-
return -1;
195-
} else {
196-
// printf("Certificate verified.\n");
197-
}
168+
ret = lwipsocket_socket_setup_ssl(s, _errno);
198169
}
199170

200171
s->sock_base.connected = true;
201-
return 0;
172+
return ret;
202173
}
203174

204175
int lwipsocket_socket_send(mod_network_socket_obj_t *s, const byte *buf, mp_uint_t len, int *_errno) {
@@ -393,3 +364,45 @@ int lwipsocket_socket_ioctl (mod_network_socket_obj_t *s, mp_uint_t request, mp_
393364
}
394365
return ret;
395366
}
367+
368+
int lwipsocket_socket_setup_ssl(mod_network_socket_obj_t *s, int *_errno)
369+
{
370+
int ret;
371+
uint32_t count = 0;
372+
mp_obj_ssl_socket_t *ss = (mp_obj_ssl_socket_t *)s;
373+
374+
if ((ret = mbedtls_net_set_block(&ss->context_fd)) != 0) {
375+
// printf("failed! net_set_(non)block() returned -0x%x\n", -ret);
376+
*_errno = ret;
377+
return -1;
378+
}
379+
380+
mbedtls_ssl_set_bio(&ss->ssl, &ss->context_fd, mbedtls_net_send, NULL, mbedtls_net_recv_timeout);
381+
382+
// printf("Performing the SSL/TLS handshake...\n");
383+
384+
while ((ret = mbedtls_ssl_handshake(&ss->ssl)) != 0)
385+
{
386+
if ((ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE && ret != MBEDTLS_ERR_SSL_TIMEOUT ) || count >= ss->read_timeout)
387+
{
388+
// printf("mbedtls_ssl_handshake returned -0x%x\n", -ret);
389+
*_errno = ret;
390+
return -1;
391+
}
392+
if(ret == MBEDTLS_ERR_SSL_TIMEOUT)
393+
{
394+
count++;
395+
}
396+
}
397+
398+
// printf("Verifying peer X.509 certificate...\n");
399+
400+
if ((ret = mbedtls_ssl_get_verify_result(&ss->ssl)) != 0) {
401+
/* In real life, we probably want to close connection if ret != 0 */
402+
// printf("Failed to verify peer certificate!\n");
403+
*_errno = ret;
404+
return -1;
405+
}
406+
// printf("Certificate verified.\n");
407+
return 0;
408+
}

esp32/mods/lwipsocket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,6 @@ extern int lwipsocket_socket_settimeout(mod_network_socket_obj_t *s, mp_int_t ti
4040

4141
extern int lwipsocket_socket_ioctl (mod_network_socket_obj_t *s, mp_uint_t request, mp_uint_t arg, int *_errno);
4242

43+
extern int lwipsocket_socket_setup_ssl(mod_network_socket_obj_t *s, int *_errno);
44+
4345
#endif // LWIPSOCKET_H_

esp32/mods/machuart.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@
7575
#define UART_TRIGGER_RX_FULL (0x04)
7676
#define UART_TRIGGER_TX_DONE (0x08)
7777

78+
#define MACH_UART_CHECK_INIT(self) \
79+
if(!(self->init)) {nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, "UART not Initialized!"));}
80+
7881
/******************************************************************************
7982
DECLARE PRIVATE FUNCTIONS
8083
******************************************************************************/
@@ -93,6 +96,7 @@ struct _mach_uart_obj_t {
9396
uint8_t uart_id;
9497
uint8_t rx_timeout;
9598
uint8_t n_pins;
99+
bool init;
96100
};
97101

98102
/******************************************************************************
@@ -269,6 +273,7 @@ STATIC bool uart_rx_wait (mach_uart_obj_t *self) {
269273

270274
STATIC void mach_uart_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
271275
mach_uart_obj_t *self = self_in;
276+
MACH_UART_CHECK_INIT(self)
272277
if (self->config.baud_rate > 0) {
273278
mp_printf(print, "UART(%u, baudrate=%u, bits=", self->uart_id, self->config.baud_rate);
274279
switch (self->config.data_bits) {
@@ -434,6 +439,9 @@ STATIC mp_obj_t mach_uart_init_helper(mach_uart_obj_t *self, const mp_arg_val_t
434439
// configure the rx timeout threshold
435440
self->uart_reg->conf1.rx_tout_thrhd = self->rx_timeout & UART_RX_TOUT_THRHD_V;
436441

442+
// Init Done
443+
self->init = true;
444+
437445
return mp_const_none;
438446

439447
error:
@@ -498,25 +506,30 @@ STATIC mp_obj_t mach_uart_deinit(mp_obj_t self_in) {
498506
uart_driver_delete(self->uart_id);
499507
}
500508

509+
self->init = false;
510+
501511
return mp_const_none;
502512
}
503513
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mach_uart_deinit_obj, mach_uart_deinit);
504514

505515
STATIC mp_obj_t mach_uart_any(mp_obj_t self_in) {
506516
mach_uart_obj_t *self = self_in;
517+
MACH_UART_CHECK_INIT(self)
507518
return mp_obj_new_int(uart_rx_any(self));
508519
}
509520
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mach_uart_any_obj, mach_uart_any);
510521

511522
STATIC mp_obj_t mach_uart_wait_tx_done(mp_obj_t self_in, mp_obj_t timeout_ms) {
512523
mach_uart_obj_t *self = self_in;
524+
MACH_UART_CHECK_INIT(self)
513525
TickType_t timeout_ticks = mp_obj_get_int_truncated(timeout_ms) / portTICK_PERIOD_MS;
514526
return uart_wait_tx_done(self->uart_id, timeout_ticks) == ESP_OK ? mp_const_true : mp_const_false;
515527
}
516528
STATIC MP_DEFINE_CONST_FUN_OBJ_2(mach_uart_wait_tx_done_obj, mach_uart_wait_tx_done);
517529

518530
STATIC mp_obj_t mach_uart_sendbreak(mp_obj_t self_in, mp_obj_t bits) {
519531
mach_uart_obj_t *self = self_in;
532+
MACH_UART_CHECK_INIT(self)
520533
pin_obj_t * pin = (pin_obj_t *)((mp_obj_t *)self->pins)[0];
521534

522535
uint32_t isrmask = MICROPY_BEGIN_ATOMIC_SECTION();
@@ -576,6 +589,7 @@ STATIC MP_DEFINE_CONST_DICT(mach_uart_locals_dict, mach_uart_locals_dict_table);
576589

577590
STATIC mp_uint_t mach_uart_read(mp_obj_t self_in, void *buf_in, mp_uint_t size, int *errcode) {
578591
mach_uart_obj_t *self = self_in;
592+
MACH_UART_CHECK_INIT(self)
579593
byte *buf = buf_in;
580594

581595
// make sure we want at least 1 char
@@ -603,6 +617,7 @@ STATIC mp_uint_t mach_uart_read(mp_obj_t self_in, void *buf_in, mp_uint_t size,
603617

604618
STATIC mp_uint_t mach_uart_write(mp_obj_t self_in, const void *buf_in, mp_uint_t size, int *errcode) {
605619
mach_uart_obj_t *self = self_in;
620+
MACH_UART_CHECK_INIT(self)
606621
const char *buf = buf_in;
607622

608623
// write the data
@@ -614,6 +629,7 @@ STATIC mp_uint_t mach_uart_write(mp_obj_t self_in, const void *buf_in, mp_uint_t
614629

615630
STATIC mp_uint_t mach_uart_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint_t arg, int *errcode) {
616631
mach_uart_obj_t *self = self_in;
632+
MACH_UART_CHECK_INIT(self)
617633
mp_uint_t ret;
618634

619635
if (request == MP_IOCTL_POLL) {

esp32/mods/modlte.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,5 +1185,6 @@ const mod_network_nic_type_t mod_network_nic_type_lte = {
11851185
.n_setsockopt = lwipsocket_socket_setsockopt,
11861186
.n_bind = lwipsocket_socket_bind,
11871187
.n_ioctl = lwipsocket_socket_ioctl,
1188+
.n_setupssl = lwipsocket_socket_setup_ssl,
11881189
.inf_up = ltepp_is_ppp_conn_up,
11891190
};

esp32/mods/modnetwork.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ typedef struct _mod_network_nic_type_t {
7070
int (*n_setsockopt)(struct _mod_network_socket_obj_t *socket, mp_uint_t level, mp_uint_t opt, const void *optval, mp_uint_t optlen, int *_errno);
7171
int (*n_settimeout)(struct _mod_network_socket_obj_t *socket, mp_int_t timeout_ms, int *_errno);
7272
int (*n_ioctl)(struct _mod_network_socket_obj_t *socket, mp_uint_t request, mp_uint_t arg, int *_errno);
73+
int (*n_setupssl)(struct _mod_network_socket_obj_t *socket, int *_errno);
7374

7475
// Interface status
7576
bool (*inf_up)(void);

esp32/mods/modusocket.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,16 @@ STATIC mp_obj_t socket_makefile(mp_uint_t n_args, const mp_obj_t *args) {
538538
}
539539
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_makefile_obj, 1, 6, socket_makefile);
540540

541+
STATIC mp_obj_t socket_do_handshake(mp_obj_t self_in) {
542+
mod_network_socket_obj_t *self = self_in;
543+
544+
int _errno;
545+
if (self->sock_base.nic_type->n_setupssl(self, &_errno) != 0) {
546+
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(_errno)));
547+
}
548+
return mp_const_none;
549+
}
550+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_do_handshake_obj, socket_do_handshake);
541551
STATIC const mp_map_elem_t socket_locals_dict_table[] = {
542552
{ MP_OBJ_NEW_QSTR(MP_QSTR___del__), (mp_obj_t)&socket_close_obj },
543553
{ MP_OBJ_NEW_QSTR(MP_QSTR_close), (mp_obj_t)&socket_close_obj },
@@ -555,6 +565,7 @@ STATIC const mp_map_elem_t socket_locals_dict_table[] = {
555565
{ MP_OBJ_NEW_QSTR(MP_QSTR_setblocking), (mp_obj_t)&socket_setblocking_obj },
556566
{ MP_OBJ_NEW_QSTR(MP_QSTR_makefile), (mp_obj_t)&socket_makefile_obj },
557567
{ MP_OBJ_NEW_QSTR(MP_QSTR_fileno), (mp_obj_t)&socket_fileno_obj },
568+
{ MP_OBJ_NEW_QSTR(MP_QSTR_do_handshake), (mp_obj_t)&socket_do_handshake_obj },
558569

559570
// stream methods
560571
{ MP_OBJ_NEW_QSTR(MP_QSTR_read), (mp_obj_t)&mp_stream_read_obj },
@@ -678,7 +689,7 @@ STATIC mp_obj_t mod_usocket_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) {
678689
int32_t result = nic_type->n_gethostbyname(host, hlen, out_ip, AF_INET);
679690
if (result < 0) {
680691
// negate result as it contains the error code which must be positive
681-
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-result)));
692+
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(result)));
682693
}
683694
mp_obj_tuple_t *tuple = mp_obj_new_tuple(5, NULL);
684695
tuple->items[0] = MP_OBJ_NEW_SMALL_INT(AF_INET);

esp32/mods/modussl.c

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
DEFINE CONSTANTS
3333
******************************************************************************/
3434
#define FILE_READ_SIZE 256
35+
#define DEFAULT_SSL_READ_TIMEOUT 10 //sec
3536

3637
/******************************************************************************
3738
DECLARE PRIVATE FUNCTIONS
@@ -143,6 +144,8 @@ static int32_t mod_ssl_setup_socket (mp_obj_ssl_socket_t *ssl_sock, const char *
143144
}
144145
}
145146

147+
mbedtls_ssl_conf_read_timeout(&ssl_sock->conf, 1000);
148+
146149
ssl_sock->context_fd.fd = ssl_sock->sock_base.u.sd;
147150
ssl_sock->sock_base.is_ssl = true;
148151

@@ -157,12 +160,17 @@ static int32_t mod_ssl_setup_socket (mp_obj_ssl_socket_t *ssl_sock, const char *
157160
mbedtls_ssl_set_bio(&ssl_sock->ssl, &ssl_sock->context_fd, mbedtls_net_send, NULL, mbedtls_net_recv_timeout);
158161

159162
// printf("Performing the SSL/TLS handshake...\n");
163+
int count = 0;
160164
while ((ret = mbedtls_ssl_handshake(&ssl_sock->ssl)) != 0)
161165
{
162-
if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE && ret != MBEDTLS_ERR_SSL_TIMEOUT) {
163-
// printf("mbedtls_ssl_handshake returned -0x%x\n", -ret);
166+
if ((ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE && ret != MBEDTLS_ERR_SSL_TIMEOUT) || count >= ssl_sock->read_timeout) {
167+
//printf("mbedtls_ssl_handshake returned -0x%x\n", -ret);
164168
return ret;
165169
}
170+
if(ret == MBEDTLS_ERR_SSL_TIMEOUT)
171+
{
172+
count++;
173+
}
166174
}
167175

168176
// printf("Verifying peer X.509 certificate...\n");
@@ -174,7 +182,6 @@ static int32_t mod_ssl_setup_socket (mp_obj_ssl_socket_t *ssl_sock, const char *
174182
// printf("Certificate verified.\n");
175183
}
176184
}
177-
mbedtls_ssl_conf_read_timeout(&ssl_sock->conf, 10);
178185

179186
return 0;
180187
}
@@ -224,6 +231,7 @@ STATIC mp_obj_t mod_ssl_wrap_socket(mp_uint_t n_args, const mp_obj_t *pos_args,
224231
{ MP_QSTR_ssl_version, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
225232
{ MP_QSTR_ca_certs, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
226233
{ MP_QSTR_server_hostname, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
234+
{ MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
227235
};
228236

229237
int32_t _error;
@@ -258,6 +266,16 @@ STATIC mp_obj_t mod_ssl_wrap_socket(mp_uint_t n_args, const mp_obj_t *pos_args,
258266
ssl_sock->base.type = &ssl_socket_type;
259267
ssl_sock->o_sock = args[0].u_obj; // this is needed so that the GC doesnt collect the socket
260268

269+
//Read timeout
270+
if(args[8].u_obj == mp_const_none)
271+
{
272+
ssl_sock->read_timeout = DEFAULT_SSL_READ_TIMEOUT;
273+
}
274+
else
275+
{
276+
ssl_sock->read_timeout = mp_obj_get_int(args[8].u_obj);
277+
}
278+
261279
_error = mod_ssl_setup_socket(ssl_sock, host_name, cafile_path, certfile_path, keyfile_path,
262280
verify_type, server_side ? MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT);
263281

@@ -284,6 +302,8 @@ STATIC const mp_map_elem_t mp_module_ussl_globals_table[] = {
284302
{ MP_OBJ_NEW_QSTR(MP_QSTR_CERT_OPTIONAL), MP_OBJ_NEW_SMALL_INT(MBEDTLS_SSL_VERIFY_OPTIONAL) },
285303
{ MP_OBJ_NEW_QSTR(MP_QSTR_CERT_REQUIRED), MP_OBJ_NEW_SMALL_INT(MBEDTLS_SSL_VERIFY_REQUIRED) },
286304

305+
{ MP_OBJ_NEW_QSTR(MP_QSTR_SSL_TIMEOUT), MP_OBJ_NEW_SMALL_INT(MBEDTLS_ERR_SSL_TIMEOUT) },
306+
287307
// { MP_OBJ_NEW_QSTR(MP_QSTR_PROTOCOL_SSLv3), MP_OBJ_NEW_SMALL_INT(SL_SO_SEC_METHOD_SSLV3) },
288308
// { MP_OBJ_NEW_QSTR(MP_QSTR_PROTOCOL_TLSv1), MP_OBJ_NEW_SMALL_INT(SL_SO_SEC_METHOD_TLSV1) },
289309
// { MP_OBJ_NEW_QSTR(MP_QSTR_PROTOCOL_TLSv1_1), MP_OBJ_NEW_SMALL_INT(SL_SO_SEC_METHOD_TLSV1_1) },

esp32/mods/modussl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ typedef struct _mp_obj_ssl_socket_t {
4242
mbedtls_net_context context_fd;
4343
mbedtls_x509_crt own_cert;
4444
mbedtls_pk_context pk_key;
45+
uint8_t read_timeout;
4546
} mp_obj_ssl_socket_t;
4647

4748
#endif /* MODUSSL_H_ */

esp32/mods/modwlan.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,6 +1198,7 @@ const mod_network_nic_type_t mod_network_nic_type_wlan = {
11981198
.n_setsockopt = lwipsocket_socket_setsockopt,
11991199
.n_settimeout = lwipsocket_socket_settimeout,
12001200
.n_ioctl = lwipsocket_socket_ioctl,
1201+
.n_setupssl = lwipsocket_socket_setup_ssl,
12011202
.inf_up = wlan_is_inf_up
12021203
};
12031204

0 commit comments

Comments
 (0)