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

Commit 6d96f70

Browse files
author
iwahdan88
committed
Bug fixes [1.18.1.r5]
- 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
1 parent dfa1176 commit 6d96f70

File tree

8 files changed

+88
-22
lines changed

8 files changed

+88
-22
lines changed

esp32/lte/lteppp.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ static bool lteppp_init_complete = false;
6666

6767
static bool lteppp_enabled = false;
6868

69+
static bool ltepp_ppp_conn_up = false;
70+
6971
/******************************************************************************
7072
DECLARE PRIVATE FUNCTIONS
7173
******************************************************************************/
@@ -279,6 +281,10 @@ bool lteppp_task_ready(void) {
279281
return lteppp_init_complete;
280282
}
281283

284+
bool ltepp_is_ppp_conn_up(void)
285+
{
286+
return ltepp_ppp_conn_up;
287+
}
282288
/******************************************************************************
283289
DEFINE PRIVATE FUNCTIONS
284290
******************************************************************************/
@@ -380,6 +386,19 @@ static void TASK_LTE (void *pvParameters) {
380386
lte_state_t state = lteppp_get_state();
381387
if (state == E_LTE_PPP) {
382388
uint32_t rx_len;
389+
// check for IP connection
390+
if(lteppp_ipv4() > 0)
391+
{
392+
ltepp_ppp_conn_up = true;
393+
}
394+
else
395+
{
396+
if(ltepp_ppp_conn_up == true)
397+
{
398+
ltepp_ppp_conn_up = false;
399+
lteppp_set_state(E_LTE_ATTACHED);
400+
}
401+
}
383402
// wait for characters received
384403
uart_get_buffered_data_len(LTE_UART_ID, &rx_len);
385404
if (rx_len > 0) {
@@ -391,6 +410,10 @@ static void TASK_LTE (void *pvParameters) {
391410
}
392411
}
393412
}
413+
else
414+
{
415+
ltepp_ppp_conn_up = false;
416+
}
394417
}
395418
}
396419
}

esp32/lte/lteppp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,6 @@ bool lteppp_is_modem_connected(void);
101101

102102
extern void connect_lte_uart (void);
103103

104+
extern bool ltepp_is_ppp_conn_up(void);
105+
104106
#endif // _LTEPPP_H_

esp32/mods/modlte.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,7 @@ STATIC mp_obj_t lte_deinit(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
499499
lte_obj.init = false;
500500
}
501501
lteppp_deinit();
502+
mod_network_deregister_nic(&lte_obj);
502503
return mp_const_none;
503504

504505
error:
@@ -789,14 +790,13 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(lte_disconnect_obj, lte_disconnect);
789790

790791
STATIC mp_obj_t lte_isconnected(mp_obj_t self_in) {
791792
lte_check_init();
792-
if (lteppp_get_state() == E_LTE_PPP && lteppp_ipv4() > 0) {
793+
if (ltepp_is_ppp_conn_up()) {
793794
return mp_const_true;
794795
}
795-
if (lteppp_get_state() == E_LTE_PPP && lteppp_ipv4() == 0) {
796+
else
797+
{
796798
return mp_const_false;
797799
}
798-
lteppp_set_state(E_LTE_ATTACHED);
799-
return mp_const_false;
800800
}
801801
STATIC MP_DEFINE_CONST_FUN_OBJ_1(lte_isconnected_obj, lte_isconnected);
802802

@@ -1050,4 +1050,5 @@ const mod_network_nic_type_t mod_network_nic_type_lte = {
10501050
.n_setsockopt = lwipsocket_socket_setsockopt,
10511051
.n_bind = lwipsocket_socket_bind,
10521052
.n_ioctl = lwipsocket_socket_ioctl,
1053+
.inf_up = ltepp_is_ppp_conn_up,
10531054
};

esp32/mods/modnetwork.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,14 @@ void mod_network_register_nic(mp_obj_t nic) {
8383
mp_obj_list_append(&MP_STATE_PORT(mod_network_nic_list), nic);
8484
}
8585

86+
void mod_network_deregister_nic(mp_obj_t nic) {
87+
for (mp_uint_t i = 0; i < MP_STATE_PORT(mod_network_nic_list).len; i++) {
88+
if (MP_STATE_PORT(mod_network_nic_list).items[i] == nic) {
89+
mp_obj_list_remove(&MP_STATE_PORT(mod_network_nic_list), nic);
90+
}
91+
}
92+
}
93+
8694
mp_obj_t mod_network_find_nic(const mod_network_socket_obj_t *s, const uint8_t *ip) {
8795
// find a NIC that is suited to a given IP address
8896
for (mp_uint_t i = 0; i < MP_STATE_PORT(mod_network_nic_list).len; i++) {

esp32/mods/modnetwork.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ 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+
74+
// Interface status
75+
bool (*inf_up)(void);
7376
} mod_network_nic_type_t;
7477

7578
typedef struct _mod_network_socket_base_t {
@@ -108,6 +111,7 @@ extern const mod_network_nic_type_t mod_network_nic_type_lte;
108111
******************************************************************************/
109112
void mod_network_init0(void);
110113
void mod_network_register_nic(mp_obj_t nic);
114+
void mod_network_deregister_nic(mp_obj_t nic);
111115
mp_obj_t mod_network_find_nic(const mod_network_socket_obj_t *s, const uint8_t *ip);
112116

113117
#endif // MODNETWORK_H_

esp32/mods/modusocket.c

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -650,30 +650,47 @@ STATIC mp_obj_t mod_usocket_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) {
650650
mp_uint_t hlen;
651651
const char *host = mp_obj_str_get_data(host_in, &hlen);
652652
mp_int_t port = mp_obj_get_int(port_in);
653+
bool is_inf_down = false;
653654

654655
// find a nic that can do a name lookup
655656
for (mp_uint_t i = 0; i < MP_STATE_PORT(mod_network_nic_list).len; i++) {
656657
mp_obj_t nic = MP_STATE_PORT(mod_network_nic_list).items[i];
657658
mod_network_nic_type_t *nic_type = (mod_network_nic_type_t*)mp_obj_get_type(nic);
658-
if (nic_type->n_gethostbyname != NULL) {
659-
// ipv4 only
660-
uint8_t out_ip[MOD_NETWORK_IPV4ADDR_BUF_SIZE];
661-
int32_t result = nic_type->n_gethostbyname(host, hlen, out_ip, AF_INET);
662-
if (result < 0) {
663-
// negate result as it contains the error code which must be positive
664-
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-result)));
665-
}
666-
mp_obj_tuple_t *tuple = mp_obj_new_tuple(5, NULL);
667-
tuple->items[0] = MP_OBJ_NEW_SMALL_INT(AF_INET);
668-
tuple->items[1] = MP_OBJ_NEW_SMALL_INT(SOCK_STREAM);
669-
tuple->items[2] = MP_OBJ_NEW_SMALL_INT(0);
670-
tuple->items[3] = MP_OBJ_NEW_QSTR(MP_QSTR_);
671-
tuple->items[4] = netutils_format_inet_addr(out_ip, port, NETUTILS_BIG);
672-
return mp_obj_new_list(1, (mp_obj_t*)&tuple);
659+
if (nic_type->n_gethostbyname != NULL && nic_type->inf_up != NULL)
660+
{
661+
if (nic_type->inf_up()) {
662+
663+
is_inf_down = false;
664+
// ipv4 only
665+
uint8_t out_ip[MOD_NETWORK_IPV4ADDR_BUF_SIZE];
666+
int32_t result = nic_type->n_gethostbyname(host, hlen, out_ip, AF_INET);
667+
if (result < 0) {
668+
// negate result as it contains the error code which must be positive
669+
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(-result)));
670+
}
671+
mp_obj_tuple_t *tuple = mp_obj_new_tuple(5, NULL);
672+
tuple->items[0] = MP_OBJ_NEW_SMALL_INT(AF_INET);
673+
tuple->items[1] = MP_OBJ_NEW_SMALL_INT(SOCK_STREAM);
674+
tuple->items[2] = MP_OBJ_NEW_SMALL_INT(0);
675+
tuple->items[3] = MP_OBJ_NEW_QSTR(MP_QSTR_);
676+
tuple->items[4] = netutils_format_inet_addr(out_ip, port, NETUTILS_BIG);
677+
return mp_obj_new_list(1, (mp_obj_t*)&tuple);
678+
}
679+
else
680+
{
681+
is_inf_down = true;
682+
continue;
683+
}
673684
}
674685
}
675-
676-
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "no available NIC"));
686+
if(is_inf_down)
687+
{
688+
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "Avialable Interfaces are down"));
689+
}
690+
else
691+
{
692+
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "no available NIC"));
693+
}
677694
}
678695
STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_usocket_getaddrinfo_obj, mod_usocket_getaddrinfo);
679696

esp32/mods/modwlan.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ static EventGroupHandle_t wifi_event_group;
119119
// Event bits
120120
const int CONNECTED_BIT = BIT0;
121121

122+
STATIC bool is_inf_up = false;
123+
122124
/******************************************************************************
123125
DECLARE PUBLIC DATA
124126
******************************************************************************/
@@ -239,6 +241,11 @@ void wlan_off_on (void) {
239241
// DEFINE STATIC FUNCTIONS
240242
//*****************************************************************************
241243

244+
STATIC bool wlan_is_inf_up(void)
245+
{
246+
return is_inf_up;
247+
}
248+
242249
STATIC esp_err_t wlan_event_handler(void *ctx, system_event_t *event) {
243250
switch(event->event_id) {
244251
case SYSTEM_EVENT_STA_START:
@@ -253,10 +260,12 @@ STATIC esp_err_t wlan_event_handler(void *ctx, system_event_t *event) {
253260
break;
254261
case SYSTEM_EVENT_STA_GOT_IP:
255262
xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
263+
is_inf_up = true;
256264
break;
257265
case SYSTEM_EVENT_STA_DISCONNECTED:
258266
xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);
259267
system_event_sta_disconnected_t *disconn = &event->event_info.disconnected;
268+
is_inf_up = false;
260269
switch (disconn->reason) {
261270
case WIFI_REASON_AUTH_FAIL:
262271
wlan_obj.disconnected = true;
@@ -725,6 +734,7 @@ mp_obj_t wlan_deinit(mp_obj_t self_in) {
725734
if (wlan_obj.started) {
726735
esp_wifi_stop();
727736
wlan_obj.started = false;
737+
mod_network_deregister_nic(&wlan_obj);
728738
}
729739
return mp_const_none;
730740
}
@@ -1188,6 +1198,7 @@ const mod_network_nic_type_t mod_network_nic_type_wlan = {
11881198
.n_setsockopt = lwipsocket_socket_setsockopt,
11891199
.n_settimeout = lwipsocket_socket_settimeout,
11901200
.n_ioctl = lwipsocket_socket_ioctl,
1201+
.inf_up = wlan_is_inf_up
11911202
};
11921203

11931204
//STATIC const mp_irq_methods_t wlan_irq_methods = {

esp32/pycom_version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#ifndef VERSION_H_
1111
#define VERSION_H_
1212

13-
#define SW_VERSION_NUMBER "1.18.1.r4"
13+
#define SW_VERSION_NUMBER "1.18.1.r5"
1414

1515
#define LORAWAN_VERSION_NUMBER "1.0.2"
1616

0 commit comments

Comments
 (0)