feat(wifi): Standalone-Zustand mit begrenztem Startpuls
open_access() fordert zusaetzlich !standalone, damit der Tokenschutz auch waehrend eines Onboarding-Tests aus dem Standalone-Modus erhalten bleibt.
This commit is contained in:
+31
-4
@@ -54,13 +54,26 @@ static void fail_test(nl_wifi_sm_t *sm, nl_wifi_error_t err, uint32_t now, nl_wi
|
||||
}
|
||||
}
|
||||
|
||||
nl_wifi_actions_t nl_wifi_sm_start(nl_wifi_sm_t *sm, bool have_creds, uint32_t now)
|
||||
nl_wifi_actions_t nl_wifi_sm_start(nl_wifi_sm_t *sm, bool have_creds, bool standalone, bool pulse, uint32_t now)
|
||||
{
|
||||
nl_wifi_actions_t a = none();
|
||||
|
||||
memset(sm, 0, sizeof *sm);
|
||||
sm->have_creds = have_creds;
|
||||
if (have_creds) {
|
||||
sm->standalone = standalone;
|
||||
if (standalone) {
|
||||
/* No connect attempt, not even with stored credentials: the mode is the
|
||||
* user's explicit choice. */
|
||||
sm->state = NL_WIFI_ST_STANDALONE;
|
||||
sm->ap_up = true;
|
||||
a.start_ap = true;
|
||||
if (pulse) {
|
||||
sm->pulsing = true;
|
||||
sm->pulse_armed = true;
|
||||
sm->pulse_stop_at = now + NL_WIFI_STANDALONE_PULSE_MS;
|
||||
a.pulse_on = true;
|
||||
}
|
||||
} else if (have_creds) {
|
||||
begin_connecting(sm, now);
|
||||
a.connect = true;
|
||||
sm->awaiting = true;
|
||||
@@ -118,6 +131,10 @@ nl_wifi_actions_t nl_wifi_sm_event(nl_wifi_sm_t *sm, nl_wifi_event_t ev, nl_wifi
|
||||
if (ev == NL_WIFI_EV_CONNECTED)
|
||||
a.disconnect = true; /* I1: stray success of a timed-out/failed attempt */
|
||||
break;
|
||||
case NL_WIFI_ST_STANDALONE:
|
||||
if (ev == NL_WIFI_EV_CONNECTED)
|
||||
a.disconnect = true; /* stray success of an old attempt */
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -128,6 +145,11 @@ nl_wifi_actions_t nl_wifi_sm_tick(nl_wifi_sm_t *sm, uint32_t now)
|
||||
{
|
||||
nl_wifi_actions_t a = none();
|
||||
|
||||
if (sm->pulse_armed && due(now, sm->pulse_stop_at)) {
|
||||
sm->pulse_armed = false;
|
||||
sm->pulsing = false;
|
||||
a.pulse_off = true;
|
||||
}
|
||||
if (sm->ap_stop_armed && due(now, sm->ap_stop_at)) {
|
||||
sm->ap_stop_armed = false;
|
||||
sm->ap_up = false;
|
||||
@@ -181,12 +203,17 @@ nl_wifi_actions_t nl_wifi_sm_onboard(nl_wifi_sm_t *sm, uint32_t now)
|
||||
|
||||
bool nl_wifi_sm_open_access(const nl_wifi_sm_t *sm)
|
||||
{
|
||||
return sm->state == NL_WIFI_ST_AP_ONBOARDING || (sm->state == NL_WIFI_ST_ONBOARD_TEST && !sm->have_creds);
|
||||
/* !standalone is NOT redundant: during an onboarding test started from standalone mode
|
||||
* the state is ONBOARD_TEST with have_creds == false, which the second clause alone would
|
||||
* call open. The user's password-protected AP is up then, so the token check must stay on
|
||||
* (up to NL_WIFI_ONBOARD_TIMEOUT_MS), same as in normal operation. */
|
||||
return !sm->standalone &&
|
||||
(sm->state == NL_WIFI_ST_AP_ONBOARDING || (sm->state == NL_WIFI_ST_ONBOARD_TEST && !sm->have_creds));
|
||||
}
|
||||
|
||||
const char *nl_wifi_sm_mode(const nl_wifi_sm_t *sm)
|
||||
{
|
||||
if (sm->state == NL_WIFI_ST_AP_ONBOARDING)
|
||||
if (sm->state == NL_WIFI_ST_AP_ONBOARDING || sm->state == NL_WIFI_ST_STANDALONE)
|
||||
return "ap";
|
||||
return sm->ap_up ? "apsta" : "sta";
|
||||
}
|
||||
|
||||
@@ -11,13 +11,15 @@
|
||||
#define NL_WIFI_BACKOFF_MIN_MS 1000u
|
||||
#define NL_WIFI_BACKOFF_MAX_MS 60000u
|
||||
#define NL_WIFI_CONNECT_TIMEOUT_MS 30000u /* no event after a connect -> treat as failed */
|
||||
#define NL_WIFI_STANDALONE_PULSE_MS 5000u /* short sign-of-life pulse, then normal light */
|
||||
|
||||
typedef enum {
|
||||
NL_WIFI_ST_AP_ONBOARDING = 0,
|
||||
NL_WIFI_ST_STA_CONNECTING,
|
||||
NL_WIFI_ST_STA_CONNECTED,
|
||||
NL_WIFI_ST_APSTA_FALLBACK,
|
||||
NL_WIFI_ST_ONBOARD_TEST
|
||||
NL_WIFI_ST_ONBOARD_TEST,
|
||||
NL_WIFI_ST_STANDALONE
|
||||
} nl_wifi_state_t;
|
||||
|
||||
typedef enum { NL_WIFI_ERR_NONE = 0, NL_WIFI_ERR_AUTH, NL_WIFI_ERR_NOT_FOUND, NL_WIFI_ERR_TIMEOUT } nl_wifi_error_t;
|
||||
@@ -44,15 +46,18 @@ typedef struct {
|
||||
bool retry_armed;
|
||||
bool ap_stop_armed;
|
||||
bool awaiting; /* waiting for response to a connect */
|
||||
bool standalone; /* stays set across an onboarding test */
|
||||
bool pulse_armed; /* start pulse still running */
|
||||
uint32_t since; /* start of the current connecting phase */
|
||||
uint32_t retry_at;
|
||||
uint32_t backoff;
|
||||
uint32_t deadline; /* onboarding test */
|
||||
uint32_t ap_stop_at;
|
||||
uint32_t connect_at; /* when the pending connect was issued */
|
||||
uint32_t pulse_stop_at;
|
||||
} nl_wifi_sm_t;
|
||||
|
||||
nl_wifi_actions_t nl_wifi_sm_start(nl_wifi_sm_t *sm, bool have_creds, uint32_t now);
|
||||
nl_wifi_actions_t nl_wifi_sm_start(nl_wifi_sm_t *sm, bool have_creds, bool standalone, bool pulse, uint32_t now);
|
||||
nl_wifi_actions_t nl_wifi_sm_event(nl_wifi_sm_t *sm, nl_wifi_event_t ev, nl_wifi_error_t err, uint32_t now);
|
||||
nl_wifi_actions_t nl_wifi_sm_tick(nl_wifi_sm_t *sm, uint32_t now);
|
||||
nl_wifi_actions_t nl_wifi_sm_onboard(nl_wifi_sm_t *sm, uint32_t now);
|
||||
|
||||
@@ -268,7 +268,7 @@ void nl_wifi_start(const char *ssid, const char *pass, const char *ap_pass)
|
||||
tls_netif_add_status_event(netif_event);
|
||||
|
||||
lock();
|
||||
a = nl_wifi_sm_start(&s_sm, s_ssid[0] != '\0', nl_app_now_ms());
|
||||
a = nl_wifi_sm_start(&s_sm, s_ssid[0] != '\0', false, false, nl_app_now_ms());
|
||||
unlock();
|
||||
s_started = true;
|
||||
printf("wifi: %s, hostname %s\r\n", s_ssid[0] ? "station" : "onboarding AP", s_hostname);
|
||||
|
||||
Reference in New Issue
Block a user