Skip to content

RDKBWIFI-388: Add support for onboarding extender using WPS mechanism in RDK-B#1102

Open
bsomanath wants to merge 6 commits intordkcentral:developfrom
bsomanath:develop
Open

RDKBWIFI-388: Add support for onboarding extender using WPS mechanism in RDK-B#1102
bsomanath wants to merge 6 commits intordkcentral:developfrom
bsomanath:develop

Conversation

@bsomanath
Copy link
Copy Markdown

No description provided.

Copilot AI review requested due to automatic review settings April 30, 2026 03:51
@bsomanath bsomanath requested a review from a team as a code owner April 30, 2026 03:51
@github-actions
Copy link
Copy Markdown


Thank you for your submission, we really appreciate it. Like many open-source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution. You can sign the CLA by just posting a Pull Request Comment same as the below format.


I have read the CLA Document and I hereby sign the CLA


You can retrigger this bot by commenting recheck in this Pull Request. Posted by the CLA Assistant Lite bot.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds RDK-B mesh extender onboarding via WPS by enabling WPS configuration on STA/mesh VAPs and wiring a STA-side WPS success path into the mesh extender connection state machine.

Changes:

  • Allow WPS parameter get/set for STA mesh VAPs when UWM_EXT_WPS_SUPPORT is enabled (TR-181 + DM callbacks).
  • Track whether backhaul credentials are “valid” in DB defaults and trigger a WPS onboarding state in the mesh extender service when they are missing.
  • Register and handle a WPS STA event callback; add new mesh extender connection states to react to received WPS credentials.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
source/platform/common/data_model/wifi_dml_cb.c Relaxes WPS configuration restrictions for STA mesh VAPs under UWM_EXT_WPS_SUPPORT.
source/dml/tr_181/ml/cosa_wifi_dml.c Adjusts WPS validation flow to allow STA/mesh interfaces to proceed under UWM_EXT_WPS_SUPPORT.
source/db/wifi_db.c Initializes valid_bh_credentials for STA configs based on default SSID/key presence.
source/core/wifi_ctrl.c Registers a new WPS STA callback and calls into mesh extender service on success.
source/core/services/vap_svc_private.c Tweaks security mode for WPS-enabled private VAPs and copies mesh backhaul creds into Multi-AP backhaul fields.
source/core/services/vap_svc_mesh_ext.c Adds new connection states and logic to drive WPS STA onboarding and reinit supplicant after credentials arrive.
source/core/services/vap_svc.h Extends the connection state enum and exposes a mesh-ext WPS-credentials handler.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +126 to +137
if (convert_radio_index_to_freq_band(wifi_prop, radio_index, &band) == RETURN_OK) {
if (isVapPrivate(vap_index) && map->vap_array[i].u.bss_info.wps.enable) {
if (band != WIFI_FREQUENCY_6_BAND) {
vap->u.bss_info.security.mode = wifi_security_mode_wpa2_personal;
}
}
else if (isVapMeshBackhaul(vap_index)) {
vap->u.bss_info.security.mode = wifi_security_mode_wpa3_personal;
vap->u.bss_info.security.wpa3_transition_disable = false;
vap->u.bss_info.security.mfp = wifi_mfp_cfg_optional;
vap->u.bss_info.security.u.key.type = wifi_security_key_type_psk_sae;
}
Comment on lines +1374 to +1379
if (wps_onboard_status) {
ext_set_conn_state(ext, connection_state_set_wps_sta_mode_started, __func__, __LINE__);
wifi_util_info_print(WIFI_CTRL, "%s:%d: WPS onboarding required - valid_bh_credentials not set for STA vap_index %d\n",
__FUNCTION__, __LINE__, vap_index);
schedule_connect_sm(svc);
}
Comment on lines 1337 to +1371
@@ -1280,6 +1350,36 @@ int vap_svc_mesh_ext_start(vap_svc_t *svc, unsigned int radio_index, wifi_vap_in
return -1;
}

#ifdef UWM_EXT_WPS_SUPPORT
if(radio_params != NULL && is_radio_band_5G(radio_params->band)) {
vap_map = (wifi_vap_info_map_t *)get_wifidb_vap_map(radio_index);
if (vap_map != NULL)
{
for (j = 0; j < vap_map->num_vaps; j++)
{
wifi_util_info_print(WIFI_CTRL, "%s:%d Vap_name: %s Mesh status: %d vap_mode: %d valid_bh: %d\n", __FUNCTION__, __LINE__,
vap_map->vap_array[j].vap_name, vap_svc_is_mesh_ext(vap_map->vap_array[j].vap_index), vap_map->vap_array[j].vap_mode,
vap_map->vap_array[j].u.sta_info.valid_bh_credentials);
if (vap_svc_is_mesh_ext(vap_map->vap_array[j].vap_index) == true &&
vap_map->vap_array[j].vap_mode == wifi_vap_mode_sta &&
vap_map->vap_array[j].u.sta_info.valid_bh_credentials == FALSE)
{
wps_onboard_status = 1;
vap_index = vap_map->vap_array[j].vap_index;
wifi_util_info_print(WIFI_CTRL, "%s:%d WPS Onboarding required for vap_index: %d\n", __FUNCTION__, __LINE__, vap_index);
break;
}
Comment on lines +1245 to +1270
unsigned int vap_index = 0;
unsigned char num_of_radios = getNumberRadios();
unsigned char radio_index = 0;
wifi_vap_info_map_t *vap_map = NULL;

// Find the STA VAP index
for (radio_index = 0; radio_index < num_of_radios; radio_index++) {
vap_map = (wifi_vap_info_map_t *)get_wifidb_vap_map(radio_index);
if (vap_map == NULL) {
continue;
}
unsigned int j;
for (j = 0; j < vap_map->num_vaps; j++) {
if (vap_svc_is_mesh_ext(vap_map->vap_array[j].vap_index) == true &&
vap_map->vap_array[j].vap_mode == wifi_vap_mode_sta) {
vap_index = vap_map->vap_array[j].vap_index;
break;
}
}
if (vap_index != 0) {
break;
}
}

if (vap_index != 0) {
wifi_util_info_print(WIFI_CTRL, "%s:%d: Deinitializing and reinitializing wpa_supplicant for vap_index %d\n",
Comment thread source/core/wifi_ctrl.c
Comment on lines +1410 to +1417
/* Find the mesh extender service for this VAP using the existing API */
ext_svc = get_svc_by_vap_index(ctrl, vap_index);
if (ext_svc != NULL && ext_svc->type == vap_svc_type_mesh_ext) {
/* Found the service - call the WPS credentials handler */
wifi_util_info_print(WIFI_CTRL, "%s:%d: Calling vap_svc_mesh_ext_wps_credentials_received "
"for vap_index %d\n", __func__, __LINE__, vap_index);
vap_svc_mesh_ext_wps_credentials_received(ext_svc, vap_index);
} else {
Comment thread source/core/wifi_ctrl.c
Comment on lines +1397 to +1402
/* Only handle WPS_EV_SUCCESS (value 2) */
if (event != 2) {
wifi_util_dbg_print(WIFI_CTRL, "%s:%d: Ignoring non-success WPS event %d\n",
__func__, __LINE__, event);
return;
}
#include "stdlib.h"
#include <sys/time.h>
#include <string.h>
#include <unistd.h>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants