@@ -295,6 +295,96 @@ static int siwx91x_ap_disable(const struct device *dev)
295
295
return ret ;
296
296
}
297
297
298
+ static bool siwx91x_param_changed (struct wifi_iface_status * prev_params ,
299
+ struct wifi_connect_req_params * new_params )
300
+ {
301
+ __ASSERT (prev_params , "prev params cannot be NULL" );
302
+ __ASSERT (new_params , "new params cannot be NULL" );
303
+
304
+ if (new_params -> ssid_length != prev_params -> ssid_len ||
305
+ memcmp (new_params -> ssid , prev_params -> ssid , prev_params -> ssid_len ) != 0 ||
306
+ new_params -> security != prev_params -> security ) {
307
+ return true;
308
+ } else if (new_params -> channel != WIFI_CHANNEL_ANY &&
309
+ new_params -> channel != prev_params -> channel ) {
310
+ return true;
311
+ }
312
+
313
+ return false;
314
+ }
315
+
316
+ static int siwx91x_ap_disable_if_required (const struct device * dev ,
317
+ struct wifi_connect_req_params * new_params )
318
+ {
319
+ struct wifi_iface_status prev_params = { };
320
+ uint32_t prev_psk_length = WIFI_PSK_MAX_LEN ;
321
+ uint8_t prev_psk [WIFI_PSK_MAX_LEN ];
322
+ sl_net_credential_type_t psk_type ;
323
+ int ret ;
324
+
325
+ ret = siwx91x_status (dev , & prev_params );
326
+ if (ret < 0 ) {
327
+ return ret ;
328
+ }
329
+
330
+ if (siwx91x_param_changed (& prev_params , new_params )) {
331
+ return siwx91x_ap_disable (dev );
332
+ }
333
+
334
+ if (new_params -> security != WIFI_SECURITY_TYPE_NONE ) {
335
+ ret = sl_net_get_credential (SL_NET_DEFAULT_WIFI_AP_CREDENTIAL_ID , & psk_type ,
336
+ prev_psk , & prev_psk_length );
337
+ if (ret < 0 ) {
338
+ LOG_ERR ("Failed to get credentials: 0x%x" , ret );
339
+ return - EIO ;
340
+ }
341
+
342
+ if (new_params -> psk_length != prev_psk_length ||
343
+ memcmp (new_params -> psk , prev_psk , prev_psk_length ) != 0 ) {
344
+ return siwx91x_ap_disable (dev );
345
+ }
346
+ }
347
+
348
+ LOG_ERR ("Device already in active state" );
349
+ return - EALREADY ;
350
+ }
351
+
352
+ static int siwx91x_disconnect_if_required (const struct device * dev ,
353
+ struct wifi_connect_req_params * new_params )
354
+ {
355
+ struct wifi_iface_status prev_params = { };
356
+ uint32_t prev_psk_length = WIFI_PSK_MAX_LEN ;
357
+ uint8_t prev_psk [WIFI_PSK_MAX_LEN ];
358
+ sl_net_credential_type_t psk_type ;
359
+ int ret ;
360
+
361
+ ret = siwx91x_status (dev , & prev_params );
362
+ if (ret < 0 ) {
363
+ return ret ;
364
+ }
365
+
366
+ if (siwx91x_param_changed (& prev_params , new_params )) {
367
+ return siwx91x_disconnect (dev );
368
+ }
369
+
370
+ if (new_params -> security != WIFI_SECURITY_TYPE_NONE ) {
371
+ ret = sl_net_get_credential (SL_NET_DEFAULT_WIFI_CLIENT_CREDENTIAL_ID , & psk_type ,
372
+ prev_psk , & prev_psk_length );
373
+ if (ret < 0 ) {
374
+ LOG_ERR ("Failed to get credentials: 0x%x" , ret );
375
+ return - EIO ;
376
+ }
377
+
378
+ if (new_params -> psk_length != prev_psk_length ||
379
+ memcmp (new_params -> psk , prev_psk , prev_psk_length ) != 0 ) {
380
+ return siwx91x_disconnect (dev );
381
+ }
382
+ }
383
+
384
+ LOG_ERR ("Device already in active state" );
385
+ return - EALREADY ;
386
+ }
387
+
298
388
static int siwx91x_ap_enable (const struct device * dev , struct wifi_connect_req_params * params )
299
389
{
300
390
struct siwx91x_dev * sidev = dev -> data ;
@@ -319,6 +409,13 @@ static int siwx91x_ap_enable(const struct device *dev, struct wifi_connect_req_p
319
409
.is_11n_enabled = 1 ,
320
410
};
321
411
412
+ if (sidev -> state == WIFI_STATE_COMPLETED ) {
413
+ ret = siwx91x_ap_disable_if_required (dev , params );
414
+ if (ret < 0 ) {
415
+ return ret ;
416
+ }
417
+ }
418
+
322
419
if (params -> band != WIFI_FREQ_BAND_UNKNOWN && params -> band != WIFI_FREQ_BAND_2_4_GHZ ) {
323
420
return - ENOTSUP ;
324
421
}
@@ -353,6 +450,7 @@ static int siwx91x_ap_enable(const struct device *dev, struct wifi_connect_req_p
353
450
}
354
451
355
452
if (ret != SL_STATUS_OK ) {
453
+ LOG_ERR ("Failed to set credentials: 0x%x" , ret );
356
454
return - EINVAL ;
357
455
}
358
456
@@ -434,9 +532,17 @@ static int siwx91x_connect(const struct device *dev, struct wifi_connect_req_par
434
532
.encryption = SL_WIFI_DEFAULT_ENCRYPTION ,
435
533
.credential_id = SL_NET_DEFAULT_WIFI_CLIENT_CREDENTIAL_ID ,
436
534
};
535
+ struct siwx91x_dev * sidev = dev -> data ;
437
536
enum wifi_mfp_options mfp_conf ;
438
537
int ret = 0 ;
439
538
539
+ if (sidev -> state == WIFI_STATE_COMPLETED ) {
540
+ ret = siwx91x_disconnect_if_required (dev , params );
541
+ if (ret < 0 ) {
542
+ return ret ;
543
+ }
544
+ }
545
+
440
546
switch (params -> security ) {
441
547
case WIFI_SECURITY_TYPE_NONE :
442
548
wifi_config .security = SL_WIFI_OPEN ;
0 commit comments