@@ -206,6 +206,22 @@ void common_hal_wifi_radio_stop_ap(wifi_radio_obj_t *self) {
206
206
*/
207
207
}
208
208
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
+
209
225
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 ) {
210
226
if (!common_hal_wifi_radio_get_enabled (self )) {
211
227
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
215
231
mp_raise_RuntimeError (translate ("Wifi is in access point mode." ));
216
232
}
217
233
234
+ if (ssid_len > 32 ) {
235
+ return WIFI_RADIO_ERROR_CONNECTION_FAIL ;
236
+ }
218
237
219
238
size_t timeout_ms = timeout <= 0 ? 8000 : (size_t )MICROPY_FLOAT_C_FUN (ceil )(timeout * 1000 );
220
239
uint64_t start = port_get_raw_ticks (NULL );
221
240
uint64_t deadline = start + timeout_ms ;
222
241
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
+
223
247
// disconnect
224
248
common_hal_wifi_radio_stop_station (self );
225
249
@@ -237,6 +261,8 @@ wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t
237
261
238
262
switch (result ) {
239
263
case CYW43_LINK_UP :
264
+ memcpy (self -> connected_ssid , ssid , ssid_len );
265
+ self -> connected_ssid_len = ssid_len ;
240
266
bindings_cyw43_wifi_enforce_pm ();
241
267
return WIFI_RADIO_ERROR_NONE ;
242
268
case CYW43_LINK_FAIL :
0 commit comments