modify modnetwork and modusocket for circuitpython

This commit is contained in:
Nick Moore 2018-10-04 21:30:26 +10:00
parent f4c32139f5
commit d33f6214f1
5 changed files with 62 additions and 52 deletions

View file

@ -30,7 +30,11 @@
#include "py/objlist.h" #include "py/objlist.h"
#include "py/runtime.h" #include "py/runtime.h"
#include "modnetwork.h" #include "py/mphal.h"
#include "py/mperrno.h"
#include "lib/netutils/netutils.h"
#include "shared-bindings/network/__init__.h"
#if MICROPY_PY_NETWORK #if MICROPY_PY_NETWORK
@ -42,6 +46,9 @@ void mod_network_init(void) {
mp_obj_list_init(&MP_STATE_PORT(mod_network_nic_list), 0); mp_obj_list_init(&MP_STATE_PORT(mod_network_nic_list), 0);
} }
void mod_network_deinit(void) {
}
void mod_network_register_nic(mp_obj_t nic) { void mod_network_register_nic(mp_obj_t nic) {
for (mp_uint_t i = 0; i < MP_STATE_PORT(mod_network_nic_list).len; i++) { for (mp_uint_t i = 0; i < MP_STATE_PORT(mod_network_nic_list).len; i++) {
if (MP_STATE_PORT(mod_network_nic_list).items[i] == nic) { if (MP_STATE_PORT(mod_network_nic_list).items[i] == nic) {
@ -50,7 +57,7 @@ void mod_network_register_nic(mp_obj_t nic) {
} }
} }
// nic not registered so add to list // nic not registered so add to list
mp_obj_list_append(&MP_STATE_PORT(mod_network_nic_list), nic); mp_obj_list_append(MP_OBJ_FROM_PTR(&MP_STATE_PORT(mod_network_nic_list)), nic);
} }
mp_obj_t mod_network_find_nic(const uint8_t *ip) { mp_obj_t mod_network_find_nic(const uint8_t *ip) {
@ -62,30 +69,29 @@ mp_obj_t mod_network_find_nic(const uint8_t *ip) {
return nic; return nic;
} }
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "no available NIC")); nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, translate("no available NIC")));
} }
STATIC mp_obj_t network_initialize(void) {
mod_network_init();
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(network_initialize_obj, network_initialize);
STATIC mp_obj_t network_route(void) { STATIC mp_obj_t network_route(void) {
return &MP_STATE_PORT(mod_network_nic_list); return MP_OBJ_FROM_PTR(&MP_STATE_PORT(mod_network_nic_list));
} }
STATIC MP_DEFINE_CONST_FUN_OBJ_0(network_route_obj, network_route); STATIC MP_DEFINE_CONST_FUN_OBJ_0(network_route_obj, network_route);
STATIC const mp_rom_map_elem_t mp_module_network_globals_table[] = { STATIC const mp_rom_map_elem_t mp_module_network_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_network) }, { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_network) },
{ MP_ROM_QSTR(MP_QSTR___init__), MP_ROM_PTR(&network_initialize_obj) },
#if MICROPY_PY_WIZNET5K
{ MP_ROM_QSTR(MP_QSTR_WIZNET5K), MP_ROM_PTR(&mod_network_nic_type_wiznet5k) },
#endif
#if MICROPY_PY_CC3K
{ MP_ROM_QSTR(MP_QSTR_CC3K), MP_ROM_PTR(&mod_network_nic_type_cc3k) },
#endif
{ MP_ROM_QSTR(MP_QSTR_route), MP_ROM_PTR(&network_route_obj) }, { MP_ROM_QSTR(MP_QSTR_route), MP_ROM_PTR(&network_route_obj) },
}; };
STATIC MP_DEFINE_CONST_DICT(mp_module_network_globals, mp_module_network_globals_table); STATIC MP_DEFINE_CONST_DICT(mp_module_network_globals, mp_module_network_globals_table);
const mp_obj_module_t mp_module_network = { const mp_obj_module_t network_module = {
.base = { &mp_type_module }, .base = { &mp_type_module },
.globals = (mp_obj_dict_t*)&mp_module_network_globals, .globals = (mp_obj_dict_t*)&mp_module_network_globals,
}; };

View file

@ -23,8 +23,8 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#ifndef MICROPY_INCLUDED_STM32_MODNETWORK_H #ifndef MICROPY_INCLUDED_SHARED_BINDINGS_NETWORK___INIT___H
#define MICROPY_INCLUDED_STM32_MODNETWORK_H #define MICROPY_INCLUDED_SHARED_BINDINGS_NETWORK___INIT___H
#define MOD_NETWORK_IPADDR_BUF_SIZE (4) #define MOD_NETWORK_IPADDR_BUF_SIZE (4)
@ -77,7 +77,8 @@ extern const mod_network_nic_type_t mod_network_nic_type_wiznet5k;
extern const mod_network_nic_type_t mod_network_nic_type_cc3k; extern const mod_network_nic_type_t mod_network_nic_type_cc3k;
void mod_network_init(void); void mod_network_init(void);
void mod_network_deinit(void);
void mod_network_register_nic(mp_obj_t nic); void mod_network_register_nic(mp_obj_t nic);
mp_obj_t mod_network_find_nic(const uint8_t *ip); mp_obj_t mod_network_find_nic(const uint8_t *ip);
#endif // MICROPY_INCLUDED_STM32_MODNETWORK_H #endif // MICROPY_INCLUDED_SHARED_BINDINGS_NETWORK___INIT___H

View file

@ -4,6 +4,7 @@
* The MIT License (MIT) * The MIT License (MIT)
* *
* Copyright (c) 2014 Damien P. George * Copyright (c) 2014 Damien P. George
* 2018 Nick Moore for Adafruit Industries
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -33,12 +34,17 @@
#include "py/stream.h" #include "py/stream.h"
#include "py/mperrno.h" #include "py/mperrno.h"
#include "lib/netutils/netutils.h" #include "lib/netutils/netutils.h"
#include "modnetwork.h"
#if MICROPY_PY_USOCKET #include "shared-bindings/network/__init__.h"
/******************************************************************************/ //| :mod:`socket` --- TCP, UDP and RAW socket support
// socket class //| =================================================
//|
//| .. module:: socket
//| :synopsis: TCP, UDP and RAW sockets
//| :platform: SAMD21, SAMD51
//|
//| XXX TODO Write Docs.
STATIC const mp_obj_type_t socket_type; STATIC const mp_obj_type_t socket_type;
@ -48,7 +54,7 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type, size_t n_args, size_t
// create socket object (not bound to any NIC yet) // create socket object (not bound to any NIC yet)
mod_network_socket_obj_t *s = m_new_obj_with_finaliser(mod_network_socket_obj_t); mod_network_socket_obj_t *s = m_new_obj_with_finaliser(mod_network_socket_obj_t);
s->base.type = (mp_obj_t)&socket_type; s->base.type = &socket_type;
s->nic = MP_OBJ_NULL; s->nic = MP_OBJ_NULL;
s->nic_type = NULL; s->nic_type = NULL;
s->u_param.domain = MOD_NETWORK_AF_INET; s->u_param.domain = MOD_NETWORK_AF_INET;
@ -64,7 +70,7 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type, size_t n_args, size_t
} }
} }
return s; return MP_OBJ_FROM_PTR(s);
} }
STATIC void socket_select_nic(mod_network_socket_obj_t *self, const byte *ip) { STATIC void socket_select_nic(mod_network_socket_obj_t *self, const byte *ip) {
@ -83,7 +89,7 @@ STATIC void socket_select_nic(mod_network_socket_obj_t *self, const byte *ip) {
// method socket.bind(address) // method socket.bind(address)
STATIC mp_obj_t socket_bind(mp_obj_t self_in, mp_obj_t addr_in) { STATIC mp_obj_t socket_bind(mp_obj_t self_in, mp_obj_t addr_in) {
mod_network_socket_obj_t *self = self_in; mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
// get address // get address
uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE]; uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE];
@ -104,7 +110,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_bind_obj, socket_bind);
// method socket.listen(backlog) // method socket.listen(backlog)
STATIC mp_obj_t socket_listen(mp_obj_t self_in, mp_obj_t backlog) { STATIC mp_obj_t socket_listen(mp_obj_t self_in, mp_obj_t backlog) {
mod_network_socket_obj_t *self = self_in; mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
if (self->nic == MP_OBJ_NULL) { if (self->nic == MP_OBJ_NULL) {
// not connected // not connected
@ -123,12 +129,12 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_listen_obj, socket_listen);
// method socket.accept() // method socket.accept()
STATIC mp_obj_t socket_accept(mp_obj_t self_in) { STATIC mp_obj_t socket_accept(mp_obj_t self_in) {
mod_network_socket_obj_t *self = self_in; mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
// create new socket object // create new socket object
// starts with empty NIC so that finaliser doesn't run close() method if accept() fails // starts with empty NIC so that finaliser doesn't run close() method if accept() fails
mod_network_socket_obj_t *socket2 = m_new_obj_with_finaliser(mod_network_socket_obj_t); mod_network_socket_obj_t *socket2 = m_new_obj_with_finaliser(mod_network_socket_obj_t);
socket2->base.type = (mp_obj_t)&socket_type; socket2->base.type = &socket_type;
socket2->nic = MP_OBJ_NULL; socket2->nic = MP_OBJ_NULL;
socket2->nic_type = NULL; socket2->nic_type = NULL;
@ -145,17 +151,17 @@ STATIC mp_obj_t socket_accept(mp_obj_t self_in) {
socket2->nic_type = self->nic_type; socket2->nic_type = self->nic_type;
// make the return value // make the return value
mp_obj_tuple_t *client = mp_obj_new_tuple(2, NULL); mp_obj_tuple_t *client = MP_OBJ_TO_PTR(mp_obj_new_tuple(2, NULL));
client->items[0] = socket2; client->items[0] = MP_OBJ_FROM_PTR(socket2);
client->items[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG); client->items[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG);
return client; return MP_OBJ_FROM_PTR(client);
} }
STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_accept_obj, socket_accept); STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_accept_obj, socket_accept);
// method socket.connect(address) // method socket.connect(address)
STATIC mp_obj_t socket_connect(mp_obj_t self_in, mp_obj_t addr_in) { STATIC mp_obj_t socket_connect(mp_obj_t self_in, mp_obj_t addr_in) {
mod_network_socket_obj_t *self = self_in; mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
// get address // get address
uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE]; uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE];
@ -176,7 +182,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_connect_obj, socket_connect);
// method socket.send(bytes) // method socket.send(bytes)
STATIC mp_obj_t socket_send(mp_obj_t self_in, mp_obj_t buf_in) { STATIC mp_obj_t socket_send(mp_obj_t self_in, mp_obj_t buf_in) {
mod_network_socket_obj_t *self = self_in; mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
if (self->nic == MP_OBJ_NULL) { if (self->nic == MP_OBJ_NULL) {
// not connected // not connected
mp_raise_OSError(MP_EPIPE); mp_raise_OSError(MP_EPIPE);
@ -184,7 +190,7 @@ STATIC mp_obj_t socket_send(mp_obj_t self_in, mp_obj_t buf_in) {
mp_buffer_info_t bufinfo; mp_buffer_info_t bufinfo;
mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_READ); mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_READ);
int _errno; int _errno;
mp_uint_t ret = self->nic_type->send(self, bufinfo.buf, bufinfo.len, &_errno); mp_int_t ret = self->nic_type->send(self, bufinfo.buf, bufinfo.len, &_errno);
if (ret == -1) { if (ret == -1) {
mp_raise_OSError(_errno); mp_raise_OSError(_errno);
} }
@ -194,7 +200,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_send_obj, socket_send);
// method socket.recv(bufsize) // method socket.recv(bufsize)
STATIC mp_obj_t socket_recv(mp_obj_t self_in, mp_obj_t len_in) { STATIC mp_obj_t socket_recv(mp_obj_t self_in, mp_obj_t len_in) {
mod_network_socket_obj_t *self = self_in; mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
if (self->nic == MP_OBJ_NULL) { if (self->nic == MP_OBJ_NULL) {
// not connected // not connected
mp_raise_OSError(MP_ENOTCONN); mp_raise_OSError(MP_ENOTCONN);
@ -203,7 +209,7 @@ STATIC mp_obj_t socket_recv(mp_obj_t self_in, mp_obj_t len_in) {
vstr_t vstr; vstr_t vstr;
vstr_init_len(&vstr, len); vstr_init_len(&vstr, len);
int _errno; int _errno;
mp_uint_t ret = self->nic_type->recv(self, (byte*)vstr.buf, len, &_errno); mp_int_t ret = self->nic_type->recv(self, (byte*)vstr.buf, len, &_errno);
if (ret == -1) { if (ret == -1) {
mp_raise_OSError(_errno); mp_raise_OSError(_errno);
} }
@ -217,7 +223,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_recv_obj, socket_recv);
// method socket.sendto(bytes, address) // method socket.sendto(bytes, address)
STATIC mp_obj_t socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t addr_in) { STATIC mp_obj_t socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t addr_in) {
mod_network_socket_obj_t *self = self_in; mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
// get the data // get the data
mp_buffer_info_t bufinfo; mp_buffer_info_t bufinfo;
@ -243,7 +249,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(socket_sendto_obj, socket_sendto);
// method socket.recvfrom(bufsize) // method socket.recvfrom(bufsize)
STATIC mp_obj_t socket_recvfrom(mp_obj_t self_in, mp_obj_t len_in) { STATIC mp_obj_t socket_recvfrom(mp_obj_t self_in, mp_obj_t len_in) {
mod_network_socket_obj_t *self = self_in; mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
if (self->nic == MP_OBJ_NULL) { if (self->nic == MP_OBJ_NULL) {
// not connected // not connected
mp_raise_OSError(MP_ENOTCONN); mp_raise_OSError(MP_ENOTCONN);
@ -271,7 +277,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_recvfrom_obj, socket_recvfrom);
// method socket.setsockopt(level, optname, value) // method socket.setsockopt(level, optname, value)
STATIC mp_obj_t socket_setsockopt(size_t n_args, const mp_obj_t *args) { STATIC mp_obj_t socket_setsockopt(size_t n_args, const mp_obj_t *args) {
mod_network_socket_obj_t *self = args[0]; mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(args[0]);
mp_int_t level = mp_obj_get_int(args[1]); mp_int_t level = mp_obj_get_int(args[1]);
mp_int_t opt = mp_obj_get_int(args[2]); mp_int_t opt = mp_obj_get_int(args[2]);
@ -304,7 +310,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_setsockopt_obj, 4, 4, socket_s
// timeout=None means blocking // timeout=None means blocking
// otherwise, timeout is in seconds // otherwise, timeout is in seconds
STATIC mp_obj_t socket_settimeout(mp_obj_t self_in, mp_obj_t timeout_in) { STATIC mp_obj_t socket_settimeout(mp_obj_t self_in, mp_obj_t timeout_in) {
mod_network_socket_obj_t *self = self_in; mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
if (self->nic == MP_OBJ_NULL) { if (self->nic == MP_OBJ_NULL) {
// not connected // not connected
mp_raise_OSError(MP_ENOTCONN); mp_raise_OSError(MP_ENOTCONN);
@ -355,8 +361,8 @@ STATIC const mp_rom_map_elem_t socket_locals_dict_table[] = {
STATIC MP_DEFINE_CONST_DICT(socket_locals_dict, socket_locals_dict_table); STATIC MP_DEFINE_CONST_DICT(socket_locals_dict, socket_locals_dict_table);
mp_uint_t socket_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint_t arg, int *errcode) { mp_uint_t socket_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t arg, int *errcode) {
mod_network_socket_obj_t *self = self_in; mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
if (request == MP_STREAM_CLOSE) { if (request == MP_STREAM_CLOSE) {
if (self->nic != MP_OBJ_NULL) { if (self->nic != MP_OBJ_NULL) {
self->nic_type->close(self); self->nic_type->close(self);
@ -383,8 +389,7 @@ STATIC const mp_obj_type_t socket_type = {
/******************************************************************************/ /******************************************************************************/
// usocket module // usocket module
// function usocket.getaddrinfo(host, port) STATIC mp_obj_t socket_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) {
STATIC mp_obj_t mod_usocket_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) {
size_t hlen; size_t hlen;
const char *host = mp_obj_str_get_data(host_in, &hlen); const char *host = mp_obj_str_get_data(host_in, &hlen);
mp_int_t port = mp_obj_get_int(port_in); mp_int_t port = mp_obj_get_int(port_in);
@ -420,10 +425,10 @@ STATIC mp_obj_t mod_usocket_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) {
} }
if (!have_ip) { if (!have_ip) {
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "no available NIC")); nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, translate("no available NIC")));
} }
mp_obj_tuple_t *tuple = mp_obj_new_tuple(5, NULL); mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(5, NULL));
tuple->items[0] = MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_AF_INET); tuple->items[0] = MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_AF_INET);
tuple->items[1] = MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_SOCK_STREAM); tuple->items[1] = MP_OBJ_NEW_SMALL_INT(MOD_NETWORK_SOCK_STREAM);
tuple->items[2] = MP_OBJ_NEW_SMALL_INT(0); tuple->items[2] = MP_OBJ_NEW_SMALL_INT(0);
@ -431,13 +436,13 @@ STATIC mp_obj_t mod_usocket_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) {
tuple->items[4] = netutils_format_inet_addr(out_ip, port, NETUTILS_BIG); tuple->items[4] = netutils_format_inet_addr(out_ip, port, NETUTILS_BIG);
return mp_obj_new_list(1, (mp_obj_t*)&tuple); return mp_obj_new_list(1, (mp_obj_t*)&tuple);
} }
STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_usocket_getaddrinfo_obj, mod_usocket_getaddrinfo); STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_getaddrinfo_obj, socket_getaddrinfo);
STATIC const mp_rom_map_elem_t mp_module_usocket_globals_table[] = { STATIC const mp_rom_map_elem_t socket_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_usocket) }, { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_usocket) },
{ MP_ROM_QSTR(MP_QSTR_socket), MP_ROM_PTR(&socket_type) }, { MP_ROM_QSTR(MP_QSTR_socket), MP_ROM_PTR(&socket_type) },
{ MP_ROM_QSTR(MP_QSTR_getaddrinfo), MP_ROM_PTR(&mod_usocket_getaddrinfo_obj) }, { MP_ROM_QSTR(MP_QSTR_getaddrinfo), MP_ROM_PTR(&socket_getaddrinfo_obj) },
// class constants // class constants
{ MP_ROM_QSTR(MP_QSTR_AF_INET), MP_ROM_INT(MOD_NETWORK_AF_INET) }, { MP_ROM_QSTR(MP_QSTR_AF_INET), MP_ROM_INT(MOD_NETWORK_AF_INET) },
@ -458,11 +463,9 @@ STATIC const mp_rom_map_elem_t mp_module_usocket_globals_table[] = {
*/ */
}; };
STATIC MP_DEFINE_CONST_DICT(mp_module_usocket_globals, mp_module_usocket_globals_table); STATIC MP_DEFINE_CONST_DICT(socket_globals, socket_globals_table);
const mp_obj_module_t mp_module_usocket = { const mp_obj_module_t socket_module = {
.base = { &mp_type_module }, .base = { &mp_type_module },
.globals = (mp_obj_dict_t*)&mp_module_usocket_globals, .globals = (mp_obj_dict_t*)&socket_globals,
}; };
#endif // MICROPY_PY_USOCKET

View file

View file