8000 cc3200: Add modussl, ssl sockets subclassed from normal sockets. · micropython/micropython@9a65fa3 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9a65fa3

Browse files
author
Daniel Campora
committed
cc3200: Add modussl, ssl sockets subclassed from normal sockets.
Stream methods were added to normal sockets as in the unix port.
1 parent 7c1c9af commit 9a65fa3

File tree

10 files changed

+276
-110
lines changed

10 files changed

+276
-110
lines changed

cc3200/application.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ APP_MODS_SRC_C = $(addprefix mods/,\
9292
modpyb.c \
9393
moduos.c \
9494
modusocket.c \
95+
modussl.c \
9596
modutime.c \
9697
modwlan.c \
9798
pybadc.c \

cc3200/mods/modnetwork.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ typedef struct _mod_network_nic_type_t {
4040
mp_obj_type_t base;
4141
} mod_network_nic_type_t;
4242

43-
typedef struct _mod_network_socket_obj_t {
44-
mp_obj_base_t base;
43+
typedef struct _mod_network_socket_base_t {
4544
union {
4645
struct {
4746
uint8_t domain;
@@ -51,8 +50,14 @@ typedef struct _mod_network_socket_obj_t {
5150
} u_param;
5251
int16_t sd;
5352
};
54-
bool closed;
55-
bool has_timeout;
53+
bool has_timeout;
54+
bool cert_req;
55+
bool closed;
56+
} mod_network_socket_base_t;
57+
58+
typedef struct _mod_network_socket_obj_t {
59+
mp_obj_base_t base;
60+
mod_network_socket_base_t sock_base;
5661
} mod_network_socket_obj_t;
5762

5863
/******************************************************************************

cc3200/mods/moduhashlib.h

Lines changed: 0 additions & 32 deletions
This file was deleted.

cc3200/mods/modusocket.c

Lines changed: 67 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,12 @@
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;
5761
STATIC OsiLockObj_t modusocket_LockObj;
5862
STATIC 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)
127129
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) {
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) {
< 10000 /td>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) {
386394
STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_setblocking_obj, socket_setblocking);
387395

388396
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 },
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);

cc3200/mods/modusocket.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
#ifndef MODUSOCKET_H_
2828
#define MODUSOCKET_H_
2929

30+
extern const mp_obj_dict_t socket_locals_dict;
31+
extern const mp_stream_p_t socket_stream_p;
32+
3033
extern void modusocket_pre_init (void);
3134
extern void modusocket_socket_add (int16_t sd, bool user);
3235
extern void modusocket_socket_delete (int16_t sd);

0 commit comments

Comments
 (0)
0