Skip to content

Commit 89d6068

Browse files
ArunmaniAlagarsamy2710kartben
authored andcommitted
drivers: wifi: siwx91x: Add param change handling for STA and AP modes
Implemented logic to detect changes in key Wi-Fi parameters (SSID, PSK, security, channel) and disable the interface accordingly. For STA mode, the driver disconnects before reconnecting with updated parameters. For AP mode, it disables and re-enables the AP if changes are detected. Signed-off-by: Arunmani Alagarsamy <arunmani.a@silabs.com>
1 parent 98e72e9 commit 89d6068

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed

drivers/wifi/siwx91x/siwx91x_wifi.c

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,96 @@ static int siwx91x_ap_disable(const struct device *dev)
295295
return ret;
296296
}
297297

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+
298388
static int siwx91x_ap_enable(const struct device *dev, struct wifi_connect_req_params *params)
299389
{
300390
struct siwx91x_dev *sidev = dev->data;
@@ -319,6 +409,13 @@ static int siwx91x_ap_enable(const struct device *dev, struct wifi_connect_req_p
319409
.is_11n_enabled = 1,
320410
};
321411

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+
322419
if (params->band != WIFI_FREQ_BAND_UNKNOWN && params->band != WIFI_FREQ_BAND_2_4_GHZ) {
323420
return -ENOTSUP;
324421
}
@@ -353,6 +450,7 @@ static int siwx91x_ap_enable(const struct device *dev, struct wifi_connect_req_p
353450
}
354451

355452
if (ret != SL_STATUS_OK) {
453+
LOG_ERR("Failed to set credentials: 0x%x", ret);
356454
return -EINVAL;
357455
}
358456

@@ -434,9 +532,17 @@ static int siwx91x_connect(const struct device *dev, struct wifi_connect_req_par
434532
.encryption = SL_WIFI_DEFAULT_ENCRYPTION,
435533
.credential_id = SL_NET_DEFAULT_WIFI_CLIENT_CREDENTIAL_ID,
436534
};
535+
struct siwx91x_dev *sidev = dev->data;
437536
enum wifi_mfp_options mfp_conf;
438537
int ret = 0;
439538

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+
440546
switch (params->security) {
441547
case WIFI_SECURITY_TYPE_NONE:
442548
wifi_config.security = SL_WIFI_OPEN;

0 commit comments

Comments
 (0)