Skip to content

Commit c552ee4

Browse files
committed
RDKB-61540: Configure MLO links sequentially
Reason for change: - Banana Pi R4 driver expects sequential MLO link configuration: add link 0, set wiphy 0, start ap 0, add link 1... - 40MHz BW for BE improves data path packet loss in noisy envronments Test Procedure: Connect MLO client to Banana Pi R4. Check internet access. Risks: Low Priority: P1 Signed-off-by: Bogdan Bogush <[email protected]>
1 parent 83f1eb3 commit c552ee4

File tree

11 files changed

+103
-76
lines changed

11 files changed

+103
-76
lines changed

source/core/services/vap_svc.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ int update_vap_hal_prop_bridge_name(vap_svc_t *svc, wifi_vap_info_map_t *vap_map
207207
return RETURN_OK;
208208
}
209209

210-
int vap_svc_start_stop(vap_svc_t *svc, bool enable)
210+
int vap_svc_start_stop(vap_svc_t *svc, unsigned int radio_index, bool enable)
211211
{
212212
uint8_t num_of_radios;
213213
uint8_t i, j;
@@ -231,6 +231,10 @@ int vap_svc_start_stop(vap_svc_t *svc, bool enable)
231231
memset(tgt_vap_map, 0, sizeof(wifi_vap_info_map_t));
232232

233233
for (i = 0; i < num_of_radios; i++) {
234+
if (radio_index != WIFI_ALL_RADIO_INDICES && i != radio_index) {
235+
continue;
236+
}
237+
234238
vap_map = (wifi_vap_info_map_t *)get_wifidb_vap_map(i);
235239
rdk_vaps = get_wifidb_rdk_vaps(i);
236240
if (vap_map == NULL) {
@@ -308,14 +312,14 @@ int vap_svc_start_stop(vap_svc_t *svc, bool enable)
308312

309313
}
310314

311-
int vap_svc_stop(vap_svc_t *svc)
315+
int vap_svc_stop(vap_svc_t *svc, unsigned int radio_index)
312316
{
313-
return vap_svc_start_stop(svc, false);
317+
return vap_svc_start_stop(svc, radio_index, false);
314318
}
315319

316-
int vap_svc_start(vap_svc_t *svc)
320+
int vap_svc_start(vap_svc_t *svc, unsigned int radio_index)
317321
{
318-
return vap_svc_start_stop(svc, true);
322+
return vap_svc_start_stop(svc, radio_index, true);
319323
}
320324

321325
vap_svc_t *get_svc_by_type(wifi_ctrl_t *ct, vap_svc_type_t type)

source/core/services/vap_svc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ typedef struct {
136136
int ext_udhcp_disconnect_event_timeout_handler_id;
137137
int ext_trigger_disconnection_timeout_handler_id;
138138
bool is_started;
139+
bool is_vap_started[MAX_NUM_RADIOS];
139140
}__attribute__((packed)) vap_svc_ext_t;
140141

141142
typedef struct vap_svc {

source/core/services/vap_svc_mesh_ext.c

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,14 +1027,24 @@ int vap_svc_mesh_ext_start(vap_svc_t *svc, unsigned int radio_index, wifi_vap_in
10271027

10281028
wifi_util_info_print(WIFI_CTRL, "%s:%d mesh service start\n", __func__, __LINE__);
10291029

1030+
if (radio_index >= MAX_NUM_RADIOS) {
1031+
wifi_util_error_print(WIFI_CTRL,
1032+
"%s:%d failed to start mesh service: wrong radio index %d\n", __func__, __LINE__,
1033+
radio_index);
1034+
return -1;
1035+
}
1036+
1037+
/* create STA vap's and install acl filters */
1038+
if (!ext->is_vap_started[radio_index]) {
1039+
vap_svc_start(svc, radio_index);
1040+
ext->is_vap_started[radio_index] = true;
1041+
}
1042+
10301043
if (ext->is_started == true) {
10311044
wifi_util_info_print(WIFI_CTRL, "%s:%d mesh service already started\n", __func__, __LINE__);
10321045
return 0;
10331046
}
10341047

1035-
/* create STA vap's and install acl filters */
1036-
vap_svc_start(svc);
1037-
10381048
// initialize all extender specific structures
10391049
memset(ext, 0, sizeof(vap_svc_ext_t));
10401050

@@ -1075,15 +1085,27 @@ int vap_svc_mesh_ext_stop(vap_svc_t *svc, unsigned int radio_index, wifi_vap_inf
10751085

10761086
wifi_util_info_print(WIFI_CTRL, "%s:%d mesh service stop\n", __func__, __LINE__);
10771087

1078-
if (ext->is_started == false) {
1088+
if (ext->is_started) {
1089+
vap_svc_mesh_ext_disconnect(svc);
1090+
cancel_all_running_timer(svc);
1091+
vap_svc_mesh_ext_clear_variable(svc);
1092+
ext->is_started = false;
1093+
} else {
10791094
wifi_util_info_print(WIFI_CTRL, "%s:%d mesh service already stopped\n", __func__, __LINE__);
1080-
return 0;
10811095
}
1082-
vap_svc_mesh_ext_disconnect(svc);
1083-
cancel_all_running_timer(svc);
1084-
vap_svc_stop(svc);
1085-
vap_svc_mesh_ext_clear_variable(svc);
1086-
ext->is_started = false;
1096+
1097+
if (radio_index >= MAX_NUM_RADIOS) {
1098+
wifi_util_error_print(WIFI_CTRL,
1099+
"%s:%d failed to stop mesh service: wrong radio index %d\n", __func__, __LINE__,
1100+
radio_index);
1101+
return -1;
1102+
}
1103+
1104+
if (ext->is_vap_started[radio_index]) {
1105+
vap_svc_stop(svc, radio_index);
1106+
ext->is_vap_started[radio_index] = false;
1107+
}
1108+
10871109
return 0;
10881110
}
10891111

source/core/services/vap_svc_mesh_gw.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,12 @@ bool vap_svc_is_mesh_gw(unsigned int vap_index)
3333
int vap_svc_mesh_gw_start(vap_svc_t *svc, unsigned int radio_index, wifi_vap_info_map_t *map)
3434
{
3535
// for backhaul just create vaps and install acl filters
36-
if (radio_index == WIFI_ALL_RADIO_INDICES) {
37-
return vap_svc_start(svc);
38-
}
39-
40-
return 0;
36+
return vap_svc_start(svc, radio_index);
4137
}
4238

4339
int vap_svc_mesh_gw_stop(vap_svc_t *svc, unsigned int radio_index, wifi_vap_info_map_t *map)
4440
{
45-
if (radio_index == WIFI_ALL_RADIO_INDICES) {
46-
return vap_svc_stop(svc);
47-
}
48-
return 0;
41+
return vap_svc_stop(svc, radio_index);
4942
}
5043

5144
int vap_svc_mesh_gw_update(vap_svc_t *svc, unsigned int radio_index, wifi_vap_info_map_t *map,

source/core/services/vap_svc_mesh_pod.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ int vap_svc_mesh_ext_start(vap_svc_t *svc, unsigned int radio_index, wifi_vap_in
9393
ext = &svc->u.ext;
9494
ext->conn_state = connection_state_connection_in_progress;
9595
for (i = num_of_radios-1; i >= 0; i--) {
96+
if (radio_index != WIFI_ALL_RADIO_INDICES && i != radio_index) {
97+
continue;
98+
}
99+
96100
vap_map = (wifi_vap_info_map_t *)get_wifidb_vap_map(i);
97101
if (vap_map == NULL) {
98102
wifi_util_dbg_print(WIFI_CTRL,"%s:failed to get vap map for radio index: %d\n",__FUNCTION__, i);
@@ -174,6 +178,9 @@ int vap_svc_mesh_ext_stop(vap_svc_t *svc, unsigned int radio_index, wifi_vap_inf
174178
memset(&vif_config,0,sizeof(vif_config));
175179

176180
for (j = 0; j < vap_map->num_vaps; j++) {
181+
if (radio_index != WIFI_ALL_RADIO_INDICES && j != radio_index) {
182+
continue;
183+
}
177184

178185
if (svc->is_my_fn(vap_map->vap_array[j].vap_index) == false) {
179186
continue;

source/core/services/vap_svc_private.c

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,12 @@ bool vap_svc_is_private(unsigned int vap_index)
3636

3737
int vap_svc_private_start(vap_svc_t *svc, unsigned int radio_index, wifi_vap_info_map_t *map)
3838
{
39-
// for private just create vaps and install acl filters
40-
if (radio_index == WIFI_ALL_RADIO_INDICES) {
41-
return vap_svc_start(svc);
42-
}
43-
44-
return 0;
39+
return vap_svc_start(svc, radio_index);
4540
}
4641

4742
int vap_svc_private_stop(vap_svc_t *svc, unsigned int radio_index, wifi_vap_info_map_t *map)
4843
{
49-
if (radio_index == WIFI_ALL_RADIO_INDICES) {
50-
return vap_svc_stop(svc);
51-
}
52-
return 0;
44+
return vap_svc_stop(svc, radio_index);
5345
}
5446

5547
static int configure_lnf_psk_radius_from_hotspot(wifi_vap_info_t *vap_info)

source/core/services/vap_svc_public.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,14 @@ bool vap_svc_is_public(unsigned int vap_index)
3737
int vap_svc_public_start(vap_svc_t *svc, unsigned int radio_index, wifi_vap_info_map_t *map)
3838
{
3939
// for public just create vaps
40-
if (radio_index == WIFI_ALL_RADIO_INDICES) {
41-
return vap_svc_start(svc);
42-
}
43-
44-
return 0;
40+
return vap_svc_start(svc, radio_index);
4541
}
4642

4743
int vap_svc_public_stop(vap_svc_t *svc, unsigned int radio_index, wifi_vap_info_map_t *map)
4844
{
49-
if (radio_index == WIFI_ALL_RADIO_INDICES) {
50-
return vap_svc_stop(svc);
51-
}
52-
return 0;
45+
return vap_svc_stop(svc, radio_index);
5346
}
47+
5448
void process_prefer_private_mac_filter(mac_address_t prefer_private_mac)
5549
{
5650
unsigned int itr = 0, itrj = 0;

source/core/wifi_ctrl.c

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ unsigned int dfs_fallback_channel(wifi_platform_property_t *wifi_prop, wifi_freq
436436
return channel;
437437
}
438438

439-
int start_radios(rdk_dev_mode_type_t mode)
439+
int start_radios(rdk_dev_mode_type_t mode, unsigned int radio_index)
440440
{
441441
wifi_radio_operationParam_t *wifi_radio_oper_param = NULL;
442442
int ret = RETURN_OK;
@@ -460,6 +460,10 @@ int start_radios(rdk_dev_mode_type_t mode)
460460
}
461461

462462
for (index = 0; index < num_of_radios; index++) {
463+
if (radio_index != WIFI_ALL_RADIO_INDICES && radio_index != index) {
464+
continue;
465+
}
466+
463467
wifi_radio_oper_param = (wifi_radio_operationParam_t *)get_wifidb_radio_map(index);
464468
if (wifi_radio_oper_param == NULL) {
465469
wifi_util_error_print(WIFI_CTRL,"%s:wrong index for radio map: %d\n",__FUNCTION__, index);
@@ -750,17 +754,17 @@ int bus_get_active_gw_parameter(const char *name, unsigned int *ret_val)
750754
return RETURN_OK;
751755
}
752756

753-
void start_extender_vaps(void)
757+
void start_extender_vaps(unsigned int radio_index)
754758
{
755759
wifi_ctrl_t *ctrl;
756760
vap_svc_t *ext_svc;
757761

758762
ctrl = (wifi_ctrl_t *)get_wifictrl_obj();
759763
ext_svc = get_svc_by_type(ctrl, vap_svc_type_mesh_ext);
760-
ext_svc->start_fn(ext_svc, WIFI_ALL_RADIO_INDICES, NULL);
764+
ext_svc->start_fn(ext_svc, radio_index, NULL);
761765
}
762766

763-
void start_gateway_vaps()
767+
void start_gateway_vaps(unsigned int radio_index)
764768
{
765769
vap_svc_t *priv_svc, *pub_svc, *mesh_gw_svc;
766770
unsigned int value;
@@ -772,20 +776,20 @@ void start_gateway_vaps()
772776
mesh_gw_svc = get_svc_by_type(ctrl, vap_svc_type_mesh_gw);
773777

774778
// start private
775-
priv_svc->start_fn(priv_svc, WIFI_ALL_RADIO_INDICES, NULL);
779+
priv_svc->start_fn(priv_svc, radio_index, NULL);
776780

777781
// start mesh gateway if mesh is enabled
778782
value = get_wifi_mesh_vap_enable_status();
779783
if (value == true) {
780-
mesh_gw_svc->start_fn(mesh_gw_svc, WIFI_ALL_RADIO_INDICES, NULL);
784+
mesh_gw_svc->start_fn(mesh_gw_svc, radio_index, NULL);
781785
}
782786

783787
value = false;
784788
// start public if tunnel is up
785789
bus_get_vap_init_parameter(WIFI_DEVICE_TUNNEL_STATUS, &value);
786790
if (value == true) {
787791
set_wifi_public_vap_enable_status();
788-
pub_svc->start_fn(pub_svc, WIFI_ALL_RADIO_INDICES, NULL);
792+
pub_svc->start_fn(pub_svc, radio_index, NULL);
789793
}
790794

791795
value = false;
@@ -797,11 +801,11 @@ void start_gateway_vaps()
797801

798802
if (is_sta_enabled() == true) {
799803
wifi_util_info_print(WIFI_CTRL, "%s:%d start mesh sta\n",__func__, __LINE__);
800-
start_extender_vaps();
804+
start_extender_vaps(radio_index);
801805
}
802806
}
803807

804-
void stop_gateway_vaps()
808+
void stop_gateway_vaps(unsigned int radio_index)
805809
{
806810
vap_svc_t *priv_svc, *pub_svc, *mesh_gw_svc;
807811
wifi_ctrl_t *ctrl;
@@ -812,19 +816,19 @@ void stop_gateway_vaps()
812816
pub_svc = get_svc_by_type(ctrl, vap_svc_type_public);
813817
mesh_gw_svc = get_svc_by_type(ctrl, vap_svc_type_mesh_gw);
814818

815-
priv_svc->stop_fn(priv_svc, WIFI_ALL_RADIO_INDICES, NULL);
816-
pub_svc->stop_fn(pub_svc, WIFI_ALL_RADIO_INDICES, NULL);
817-
mesh_gw_svc->stop_fn(mesh_gw_svc, WIFI_ALL_RADIO_INDICES, NULL);
819+
priv_svc->stop_fn(priv_svc, radio_index, NULL);
820+
pub_svc->stop_fn(pub_svc, radio_index, NULL);
821+
mesh_gw_svc->stop_fn(mesh_gw_svc, radio_index, NULL);
818822
}
819823

820-
void stop_extender_vaps(void)
824+
void stop_extender_vaps(unsigned int radio_index)
821825
{
822826
wifi_ctrl_t *ctrl;
823827
vap_svc_t *ext_svc;
824828

825829
ctrl = (wifi_ctrl_t *)get_wifictrl_obj();
826830
ext_svc = get_svc_by_type(ctrl, vap_svc_type_mesh_ext);
827-
ext_svc->stop_fn(ext_svc, WIFI_ALL_RADIO_INDICES, NULL);
831+
ext_svc->stop_fn(ext_svc, radio_index, NULL);
828832
}
829833

830834
int start_wifi_services(void)
@@ -835,8 +839,10 @@ int start_wifi_services(void)
835839

836840
if (ctrl->network_mode == rdk_dev_mode_type_gw) {
837841
wifi_util_info_print(WIFI_CTRL, "%s:%d start gw vaps\n",__func__, __LINE__);
838-
start_radios(rdk_dev_mode_type_gw);
839-
start_gateway_vaps();
842+
for (unsigned int radio_index = 0; radio_index < getNumberRadios(); radio_index++) {
843+
start_radios(rdk_dev_mode_type_gw, radio_index);
844+
start_gateway_vaps(radio_index);
845+
}
840846
captive_portal_check();
841847
#if !defined(NEWPLATFORM_PORT) && !defined(_SR213_PRODUCT_REQ_) && \
842848
(defined(_XB10_PRODUCT_REQ_) || defined(_SCER11BEL_PRODUCT_REQ_) || defined(_SCXF11BFL_PRODUCT_REQ_))
@@ -846,21 +852,27 @@ int start_wifi_services(void)
846852
#endif
847853

848854
} else if (ctrl->network_mode == rdk_dev_mode_type_ext) {
849-
start_radios(rdk_dev_mode_type_ext);
850-
if (is_sta_enabled()) {
851-
wifi_util_info_print(WIFI_CTRL, "%s:%d start mesh sta\n",__func__, __LINE__);
852-
start_extender_vaps();
853-
} else {
854-
wifi_util_info_print(WIFI_CTRL, "%s:%d mesh sta disabled\n",__func__, __LINE__);
855+
for (unsigned int radio_index = 0; radio_index < getNumberRadios(); radio_index++) {
856+
start_radios(rdk_dev_mode_type_ext, radio_index);
857+
if (is_sta_enabled()) {
858+
wifi_util_info_print(WIFI_CTRL, "%s:%d start mesh sta\n", __func__, __LINE__);
859+
start_extender_vaps(radio_index);
860+
} else {
861+
wifi_util_info_print(WIFI_CTRL, "%s:%d mesh sta disabled\n", __func__, __LINE__);
862+
}
855863
}
856864
} else if (ctrl->network_mode == rdk_dev_mode_type_em_node) {
857865
wifi_util_info_print(WIFI_CTRL, "%s:%d start em_mode\n",__func__, __LINE__);
858-
start_radios(rdk_dev_mode_type_gw);
859-
start_extender_vaps();
866+
for (unsigned int radio_index = 0; radio_index < getNumberRadios(); radio_index++) {
867+
start_radios(rdk_dev_mode_type_gw, radio_index);
868+
start_extender_vaps(radio_index);
869+
}
860870
} else if (ctrl->network_mode == rdk_dev_mode_type_em_colocated_node) {
861871
wifi_util_info_print(WIFI_CTRL, "%s:%d start em_colocated mode\n",__func__, __LINE__);
862-
start_radios(rdk_dev_mode_type_gw);
863-
start_gateway_vaps();
872+
for (unsigned int radio_index = 0; radio_index < getNumberRadios(); radio_index++) {
873+
start_radios(rdk_dev_mode_type_gw, radio_index);
874+
start_gateway_vaps(radio_index);
875+
}
864876
}
865877

866878
return RETURN_OK;

0 commit comments

Comments
 (0)