From d34c4784a55566cbf7e21e15a187d02d083cee00 Mon Sep 17 00:00:00 2001 From: Daniel Campora Date: Mon, 27 Apr 2015 18:39:56 +0200 Subject: [PATCH] cc3200: Select NIC when the socket is created. This makes sense since only WLAN is supported here. --- cc3200/mods/modnetwork.c | 4 +--- cc3200/mods/modnetwork.h | 2 +- cc3200/mods/modusocket.c | 37 +++++++++++++++---------------------- 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/cc3200/mods/modnetwork.c b/cc3200/mods/modnetwork.c index 77e8e0658f..b63cb484dc 100644 --- a/cc3200/mods/modnetwork.c +++ b/cc3200/mods/modnetwork.c @@ -54,13 +54,11 @@ void mod_network_register_nic(mp_obj_t nic) { mp_obj_list_append(&MP_STATE_PORT(mod_network_nic_list), nic); } -mp_obj_t mod_network_find_nic(const uint8_t *ip) { - // find a NIC that is suited to given IP address +mp_obj_t mod_network_find_nic(void) { for (mp_uint_t i = 0; i < MP_STATE_PORT(mod_network_nic_list).len; i++) { mp_obj_t nic = MP_STATE_PORT(mod_network_nic_list).items[i]; return nic; } - nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable)); } diff --git a/cc3200/mods/modnetwork.h b/cc3200/mods/modnetwork.h index a7fb58676e..a8f6facf41 100644 --- a/cc3200/mods/modnetwork.h +++ b/cc3200/mods/modnetwork.h @@ -75,7 +75,7 @@ extern const mod_network_nic_type_t mod_network_nic_type_wlan; void mod_network_init0(void); 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(void); void mod_network_parse_ipv4_addr(mp_obj_t addr_in, uint8_t *out_ip); mp_uint_t mod_network_parse_inet_addr(mp_obj_t addr_in, uint8_t *out_ip); diff --git a/cc3200/mods/modusocket.c b/cc3200/mods/modusocket.c index 929238c5da..d3e596b03b 100644 --- a/cc3200/mods/modusocket.c +++ b/cc3200/mods/modusocket.c @@ -40,6 +40,18 @@ STATIC const mp_obj_type_t socket_type; +STATIC void socket_select_nic(mod_network_socket_obj_t *self) { + // select a nic + self->nic = mod_network_find_nic(); + self->nic_type = (mod_network_nic_type_t*)mp_obj_get_type(self->nic); + + // call the nic to open the socket + int _errno; + if (self->nic_type->socket(self, &_errno) != 0) { + nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(_errno))); + } +} + // constructor socket(family=AF_INET, type=SOCK_STREAM, proto=IPPROTO_TCP, fileno=None) 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) { mp_arg_check_num(n_args, n_kw, 0, 4, false); @@ -65,22 +77,12 @@ STATIC mp_obj_t socket_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_ } } } + + socket_select_nic(s); + return s; } -STATIC void socket_select_nic(mod_network_socket_obj_t *self, const byte *ip) { - if (self->nic == MP_OBJ_NULL) { - // select NIC based on IP - self->nic = mod_network_find_nic(ip); - self->nic_type = (mod_network_nic_type_t*)mp_obj_get_type(self->nic); - - // call the NIC to open the socket - int _errno; - if (self->nic_type->socket(self, &_errno) != 0) { - nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(_errno))); - } - } -} // method socket.close() STATIC mp_obj_t socket_close(mp_obj_t self_in) { mod_network_socket_obj_t *self = self_in; @@ -99,9 +101,6 @@ STATIC mp_obj_t socket_bind(mp_obj_t self_in, mp_obj_t addr_in) { uint8_t ip[MOD_NETWORK_IPV4ADDR_BUF_SIZE]; mp_uint_t port = mod_network_parse_inet_addr(addr_in, ip); - // check if we need to select a NIC - socket_select_nic(self, ip); - // call the NIC to bind the socket int _errno; if (self->nic_type->bind(self, ip, port, &_errno) != 0) { @@ -170,9 +169,6 @@ STATIC mp_obj_t socket_connect(mp_obj_t self_in, mp_obj_t addr_in) { uint8_t ip[MOD_NETWORK_IPV4ADDR_BUF_SIZE]; mp_uint_t port = mod_network_parse_inet_addr(addr_in, ip); - // check if we need to select a NIC - socket_select_nic(self, ip); - // call the NIC to connect the socket int _errno; if (self->nic_type->connect(self, ip, port, &_errno) != 0) { @@ -237,9 +233,6 @@ STATIC mp_obj_t socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t addr_ uint8_t ip[MOD_NETWORK_IPV4ADDR_BUF_SIZE]; mp_uint_t port = mod_network_parse_inet_addr(addr_in, ip); - // check if we need to select a NIC - socket_select_nic(self, ip); - // call the NIC to sendto int _errno; mp_int_t ret = self->nic_type->sendto(self, bufinfo.buf, bufinfo.len, ip, port, &_errno);