summaryrefslogtreecommitdiff
path: root/extmod/network_ninaw10.c
diff options
context:
space:
mode:
Diffstat (limited to 'extmod/network_ninaw10.c')
-rw-r--r--extmod/network_ninaw10.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/extmod/network_ninaw10.c b/extmod/network_ninaw10.c
index f4cc0b222..0852deabe 100644
--- a/extmod/network_ninaw10.c
+++ b/extmod/network_ninaw10.c
@@ -51,6 +51,9 @@ typedef struct _nina_obj_t {
mp_obj_base_t base;
bool active;
uint32_t itf;
+ mp_uint_t security;
+ char ssid[NINA_MAX_SSID_LEN + 1];
+ char key[NINA_MAX_WPA_LEN + 1];
} nina_obj_t;
// For auto-binding UDP sockets
@@ -78,6 +81,7 @@ const mod_network_nic_type_t mod_network_nic_type_nina;
static nina_obj_t network_nina_wl_sta = {{(mp_obj_type_t *)&mod_network_nic_type_nina}, false, MOD_NETWORK_STA_IF};
static nina_obj_t network_nina_wl_ap = {{(mp_obj_type_t *)&mod_network_nic_type_nina}, false, MOD_NETWORK_AP_IF};
static mp_sched_node_t mp_wifi_sockpoll_node;
+static mp_sched_node_t mp_wifi_connpoll_node;
STATIC void network_ninaw10_poll_sockets(mp_sched_node_t *node) {
(void)node;
@@ -99,6 +103,40 @@ STATIC void network_ninaw10_poll_sockets(mp_sched_node_t *node) {
}
}
+STATIC void network_ninaw10_poll_connect(mp_sched_node_t *node) {
+ nina_obj_t *self = &network_nina_wl_sta;
+
+ int status = nina_connection_status();
+ if (status == NINA_STATUS_CONNECTED) {
+ // Connected to AP, nothing else to do.
+ return;
+ }
+
+ if (status != NINA_STATUS_NO_SSID_AVAIL) {
+ // If not connected, and no connection in progress, the connection attempt has failed.
+ // Read the ESP failure reason, reconnect and reschedule the connection polling code.
+ int reason = nina_connection_reason();
+ if (reason == NINA_ESP_REASON_AUTH_EXPIRE ||
+ reason == NINA_ESP_REASON_ASSOC_EXPIRE ||
+ reason == NINA_ESP_REASON_NOT_AUTHED ||
+ reason == NINA_ESP_REASON_4WAY_HANDSHAKE_TIMEOUT ||
+ reason >= NINA_ESP_REASON_BEACON_TIMEOUT) {
+ debug_printf(&mp_plat_print, "poll_connect() status: %d reason %d\n", status, reason);
+ if (nina_connect(self->ssid, self->security, self->key, 0) != 0) {
+ mp_raise_msg_varg(&mp_type_OSError,
+ MP_ERROR_TEXT("could not connect to ssid=%s, sec=%d, key=%s\n"),
+ self->ssid, self->security, self->key);
+ }
+ } else {
+ // Will not attempt to reconnect if there's another error code set.
+ return;
+ }
+ }
+
+ // Reschedule the connection polling code.
+ mp_sched_schedule_node(&mp_wifi_connpoll_node, network_ninaw10_poll_connect);
+}
+
STATIC mp_obj_t network_ninaw10_timer_callback(mp_obj_t none_in) {
if (MP_STATE_PORT(mp_wifi_sockpoll_list) != MP_OBJ_NULL && MP_STATE_PORT(mp_wifi_sockpoll_list)->len) {
mp_sched_schedule_node(&mp_wifi_sockpoll_node, network_ninaw10_poll_sockets);
@@ -240,6 +278,12 @@ STATIC mp_obj_t network_ninaw10_connect(mp_uint_t n_args, const mp_obj_t *pos_ar
mp_raise_msg_varg(&mp_type_OSError,
MP_ERROR_TEXT("could not connect to ssid=%s, sec=%d, key=%s\n"), ssid, security, key);
}
+
+ // Save connection info to re-connect if needed.
+ self->security = security;
+ strncpy(self->key, key, NINA_MAX_WPA_LEN);
+ strncpy(self->ssid, ssid, NINA_MAX_SSID_LEN);
+ mp_sched_schedule_node(&mp_wifi_connpoll_node, network_ninaw10_poll_connect);
} else {
mp_uint_t channel = args[ARG_channel].u_int;
@@ -252,6 +296,7 @@ STATIC mp_obj_t network_ninaw10_connect(mp_uint_t n_args, const mp_obj_t *pos_ar
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("failed to start in AP mode"));
}
}
+
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(network_ninaw10_connect_obj, 1, network_ninaw10_connect);