Skip to content

Commit 1fe05cb

Browse files
committed
pico w: re-use previous connection if ssid matches
1 parent ef2bfdb commit 1fe05cb

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

ports/raspberrypi/common-hal/wifi/Radio.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,22 @@ void common_hal_wifi_radio_stop_ap(wifi_radio_obj_t *self) {
206206
*/
207207
}
208208

209+
static bool connection_unchanged(wifi_radio_obj_t *self, const uint8_t *ssid, size_t ssid_len) {
210+
if (cyw43_tcpip_link_status(&cyw43_state, CYW43_ITF_STA) != CYW43_LINK_UP) {
211+
mp_printf(&mp_plat_print, "(not connected)\n");
212+
return false;
213+
}
214+
if (ssid_len != self->connected_ssid_len) {
215+
mp_printf(&mp_plat_print, "(length mismatch)\n");
216+
return false;
217+
}
218+
if (memcmp(ssid, self->connected_ssid, self->connected_ssid_len)) {
219+
mp_printf(&mp_plat_print, "(ssid mismatch)\n");
220+
return false;
221+
}
222+
return true;
223+
}
224+
209225
wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, mp_float_t timeout, uint8_t *bssid, size_t bssid_len) {
210226
if (!common_hal_wifi_radio_get_enabled(self)) {
211227
mp_raise_RuntimeError(translate("Wifi is not enabled"));
@@ -215,11 +231,19 @@ wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t
215231
mp_raise_RuntimeError(translate("Wifi is in access point mode."));
216232
}
217233

234+
if (ssid_len > 32) {
235+
return WIFI_RADIO_ERROR_CONNECTION_FAIL;
236+
}
218237

219238
size_t timeout_ms = timeout <= 0 ? 8000 : (size_t)MICROPY_FLOAT_C_FUN(ceil)(timeout * 1000);
220239
uint64_t start = port_get_raw_ticks(NULL);
221240
uint64_t deadline = start + timeout_ms;
222241

242+
if (connection_unchanged(self, ssid, ssid_len)) {
243+
mp_printf(&mp_plat_print, "re-used existing wifi connection");
244+
return WIFI_RADIO_ERROR_NONE;
245+
}
246+
223247
// disconnect
224248
common_hal_wifi_radio_stop_station(self);
225249

@@ -237,6 +261,8 @@ wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t
237261

238262
switch (result) {
239263
case CYW43_LINK_UP:
264+
memcpy(self->connected_ssid, ssid, ssid_len);
265+
self->connected_ssid_len = ssid_len;
240266
bindings_cyw43_wifi_enforce_pm();
241267
return WIFI_RADIO_ERROR_NONE;
242268
case CYW43_LINK_FAIL:

ports/raspberrypi/common-hal/wifi/Radio.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ typedef struct {
3535
mp_obj_base_t base;
3636
char hostname[254]; // hostname max is 253 chars, + 1 for trailing NUL
3737
wifi_scannednetworks_obj_t *current_scan;
38+
uint8_t connected_ssid[32];
39+
uint8_t connected_ssid_len;
3840
bool enabled;
3941
} wifi_radio_obj_t;
4042

0 commit comments

Comments
 (0)