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

Commit

Permalink
Bug fixes [1.18.1.r5]
Browse files Browse the repository at this point in the history
- Fixed problem in `lte.isconnected` that always sets PPP state to Attached
- Improved `socket.getaddrinfo` to only resolve name if avilable interfaces are up
- Fixed bug of not removing NICs after the interface is de-initialized
  • Loading branch information
iwahdan88 committed Nov 16, 2018
1 parent dfa1176 commit 6d96f70
Show file tree
Hide file tree
Showing 8 changed files with 88 additions and 22 deletions.
23 changes: 23 additions & 0 deletions esp32/lte/lteppp.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ static bool lteppp_init_complete = false;

static bool lteppp_enabled = false;

static bool ltepp_ppp_conn_up = false;

/******************************************************************************
DECLARE PRIVATE FUNCTIONS
******************************************************************************/
Expand Down Expand Up @@ -279,6 +281,10 @@ bool lteppp_task_ready(void) {
return lteppp_init_complete;
}

bool ltepp_is_ppp_conn_up(void)
{
return ltepp_ppp_conn_up;
}
/******************************************************************************
DEFINE PRIVATE FUNCTIONS
******************************************************************************/
Expand Down Expand Up @@ -380,6 +386,19 @@ static void TASK_LTE (void *pvParameters) {
lte_state_t state = lteppp_get_state();
if (state == E_LTE_PPP) {
uint32_t rx_len;
// check for IP connection
if(lteppp_ipv4() > 0)
{
ltepp_ppp_conn_up = true;
}
else
{
if(ltepp_ppp_conn_up == true)
{
ltepp_ppp_conn_up = false;
lteppp_set_state(E_LTE_ATTACHED);
}
}
// wait for characters received
uart_get_buffered_data_len(LTE_UART_ID, &rx_len);
if (rx_len > 0) {
Expand All @@ -391,6 +410,10 @@ static void TASK_LTE (void *pvParameters) {
}
}
}
else
{
ltepp_ppp_conn_up = false;
}
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions esp32/lte/lteppp.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,4 +101,6 @@ bool lteppp_is_modem_connected(void);

extern void connect_lte_uart (void);

extern bool ltepp_is_ppp_conn_up(void);

#endif // _LTEPPP_H_
9 changes: 5 additions & 4 deletions esp32/mods/modlte.c
Original file line number Diff line number Diff line change
Expand Up @@ -499,6 +499,7 @@ STATIC mp_obj_t lte_deinit(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
lte_obj.init = false;
}
lteppp_deinit();
mod_network_deregister_nic(&lte_obj);
return mp_const_none;

error:
Expand Down Expand Up @@ -789,14 +790,13 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(lte_disconnect_obj, lte_disconnect);

STATIC mp_obj_t lte_isconnected(mp_obj_t self_in) {
lte_check_init();
if (lteppp_get_state() == E_LTE_PPP && lteppp_ipv4() > 0) {
if (ltepp_is_ppp_conn_up()) {
return mp_const_true;
}
if (lteppp_get_state() == E_LTE_PPP && lteppp_ipv4() == 0) {
else
{
return mp_const_false;
}
lteppp_set_state(E_LTE_ATTACHED);
return mp_const_false;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(lte_isconnected_obj, lte_isconnected);

Expand Down Expand Up @@ -1050,4 +1050,5 @@ const mod_network_nic_type_t mod_network_nic_type_lte = {
.n_setsockopt = lwipsocket_socket_setsockopt,
.n_bind = lwipsocket_socket_bind,
.n_ioctl = lwipsocket_socket_ioctl,
.inf_up = ltepp_is_ppp_conn_up,
};
8 changes: 8 additions & 0 deletions esp32/mods/modnetwork.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,14 @@ void mod_network_register_nic(mp_obj_t nic) {
mp_obj_list_append(&MP_STATE_PORT(mod_network_nic_list), nic);
}

void mod_network_deregister_nic(mp_obj_t nic) {
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) {
mp_obj_list_remove(&MP_STATE_PORT(mod_network_nic_list), nic);
}
}
}

mp_obj_t mod_network_find_nic(const mod_network_socket_obj_t *s, const uint8_t *ip) {
// find a NIC that is suited to a given IP address
for (mp_uint_t i = 0; i < MP_STATE_PORT(mod_network_nic_list).len; i++) {
Expand Down
4 changes: 4 additions & 0 deletions esp32/mods/modnetwork.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ typedef struct _mod_network_nic_type_t {
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);
int (*n_settimeout)(struct _mod_network_socket_obj_t *socket, mp_int_t timeout_ms, int *_errno);
int (*n_ioctl)(struct _mod_network_socket_obj_t *socket, mp_uint_t request, mp_uint_t arg, int *_errno);

// Interface status
bool (*inf_up)(void);
} mod_network_nic_type_t;

typedef struct _mod_network_socket_base_t {
Expand Down Expand Up @@ -108,6 +111,7 @@ extern const mod_network_nic_type_t mod_network_nic_type_lte;
******************************************************************************/
void mod_network_init0(void);
void mod_network_register_nic(mp_obj_t nic);
void mod_network_deregister_nic(mp_obj_t nic);
mp_obj_t mod_network_find_nic(const mod_network_socket_obj_t *s, const uint8_t *ip);

#endif // MODNETWORK_H_
51 changes: 34 additions & 17 deletions esp32/mods/modusocket.c
Original file line number Diff line number Diff line change
Expand Up @@ -650,30 +650,47 @@ STATIC mp_obj_t mod_usocket_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) {
mp_uint_t hlen;
const char *host = mp_obj_str_get_data(host_in, &hlen);
mp_int_t port = mp_obj_get_int(port_in);
bool is_inf_down = false;

// find a nic that can do a name lookup
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];
mod_network_nic_type_t *nic_type = (mod_network_nic_type_t*)mp_obj_get_type(nic);
if (nic_type->n_gethostbyname != NULL) {
// ipv4 only
uint8_t out_ip[MOD_NETWORK_IPV4ADDR_BUF_SIZE];
int32_t result = nic_type->n_gethostbyname(host, hlen, out_ip, AF_INET);
if (result < 0) {
// negate result as it contains the error code which must be positive
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-result)));
}
mp_obj_tuple_t *tuple = mp_obj_new_tuple(5, NULL);
tuple->items[0] = MP_OBJ_NEW_SMALL_INT(AF_INET);
tuple->items[1] = MP_OBJ_NEW_SMALL_INT(SOCK_STREAM);
tuple->items[2] = MP_OBJ_NEW_SMALL_INT(0);
tuple->items[3] = MP_OBJ_NEW_QSTR(MP_QSTR_);
tuple->items[4] = netutils_format_inet_addr(out_ip, port, NETUTILS_BIG);
return mp_obj_new_list(1, (mp_obj_t*)&tuple);
if (nic_type->n_gethostbyname != NULL && nic_type->inf_up != NULL)
{
if (nic_type->inf_up()) {

is_inf_down = false;
// ipv4 only
uint8_t out_ip[MOD_NETWORK_IPV4ADDR_BUF_SIZE];
int32_t result = nic_type->n_gethostbyname(host, hlen, out_ip, AF_INET);
if (result < 0) {
// negate result as it contains the error code which must be positive
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-result)));
}
mp_obj_tuple_t *tuple = mp_obj_new_tuple(5, NULL);
tuple->items[0] = MP_OBJ_NEW_SMALL_INT(AF_INET);
tuple->items[1] = MP_OBJ_NEW_SMALL_INT(SOCK_STREAM);
tuple->items[2] = MP_OBJ_NEW_SMALL_INT(0);
tuple->items[3] = MP_OBJ_NEW_QSTR(MP_QSTR_);
tuple->items[4] = netutils_format_inet_addr(out_ip, port, NETUTILS_BIG);
return mp_obj_new_list(1, (mp_obj_t*)&tuple);
}
else
{
is_inf_down = true;
continue;
}
}
}

nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "no available NIC"));
if(is_inf_down)
{
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "Avialable Interfaces are down"));
}
else
{
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "no available NIC"));
}
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_usocket_getaddrinfo_obj, mod_usocket_getaddrinfo);

Expand Down
11 changes: 11 additions & 0 deletions esp32/mods/modwlan.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ static EventGroupHandle_t wifi_event_group;
// Event bits
const int CONNECTED_BIT = BIT0;

STATIC bool is_inf_up = false;

/******************************************************************************
DECLARE PUBLIC DATA
******************************************************************************/
Expand Down Expand Up @@ -239,6 +241,11 @@ void wlan_off_on (void) {
// DEFINE STATIC FUNCTIONS
//*****************************************************************************

STATIC bool wlan_is_inf_up(void)
{
return is_inf_up;
}

STATIC esp_err_t wlan_event_handler(void *ctx, system_event_t *event) {
switch(event->event_id) {
case SYSTEM_EVENT_STA_START:
Expand All @@ -253,10 +260,12 @@ STATIC esp_err_t wlan_event_handler(void *ctx, system_event_t *event) {
break;
case SYSTEM_EVENT_STA_GOT_IP:
xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
is_inf_up = true;
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);
system_event_sta_disconnected_t *disconn = &event->event_info.disconnected;
is_inf_up = false;
switch (disconn->reason) {
case WIFI_REASON_AUTH_FAIL:
wlan_obj.disconnected = true;
Expand Down Expand Up @@ -725,6 +734,7 @@ mp_obj_t wlan_deinit(mp_obj_t self_in) {
if (wlan_obj.started) {
esp_wifi_stop();
wlan_obj.started = false;
mod_network_deregister_nic(&wlan_obj);
}
return mp_const_none;
}
Expand Down Expand Up @@ -1188,6 +1198,7 @@ const mod_network_nic_type_t mod_network_nic_type_wlan = {
.n_setsockopt = lwipsocket_socket_setsockopt,
.n_settimeout = lwipsocket_socket_settimeout,
.n_ioctl = lwipsocket_socket_ioctl,
.inf_up = wlan_is_inf_up
};

//STATIC const mp_irq_methods_t wlan_irq_methods = {
Expand Down
2 changes: 1 addition & 1 deletion esp32/pycom_version.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#ifndef VERSION_H_
#define VERSION_H_

#define SW_VERSION_NUMBER "1.18.1.r4"
#define SW_VERSION_NUMBER "1.18.1.r5"

#define LORAWAN_VERSION_NUMBER "1.0.2"

Expand Down

0 comments on commit 6d96f70

Please sign in to comment.