Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions source/core/services/vap_svc.c
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ int update_vap_hal_prop_bridge_name(vap_svc_t *svc, wifi_vap_info_map_t *vap_map
return RETURN_OK;
}

int vap_svc_start_stop(vap_svc_t *svc, bool enable)
int vap_svc_start_stop(vap_svc_t *svc, unsigned int radio_index, bool enable)
{
uint8_t num_of_radios;
uint8_t i, j;
Expand All @@ -231,6 +231,10 @@ int vap_svc_start_stop(vap_svc_t *svc, bool enable)
memset(tgt_vap_map, 0, sizeof(wifi_vap_info_map_t));

for (i = 0; i < num_of_radios; i++) {
if (radio_index != WIFI_ALL_RADIO_INDICES && i != radio_index) {
continue;
}

vap_map = (wifi_vap_info_map_t *)get_wifidb_vap_map(i);
rdk_vaps = get_wifidb_rdk_vaps(i);
if (vap_map == NULL) {
Expand Down Expand Up @@ -308,14 +312,14 @@ int vap_svc_start_stop(vap_svc_t *svc, bool enable)

}

int vap_svc_stop(vap_svc_t *svc)
int vap_svc_stop(vap_svc_t *svc, unsigned int radio_index)
{
return vap_svc_start_stop(svc, false);
return vap_svc_start_stop(svc, radio_index, false);
}

int vap_svc_start(vap_svc_t *svc)
int vap_svc_start(vap_svc_t *svc, unsigned int radio_index)
{
return vap_svc_start_stop(svc, true);
return vap_svc_start_stop(svc, radio_index, true);
}

vap_svc_t *get_svc_by_type(wifi_ctrl_t *ct, vap_svc_type_t type)
Expand Down
1 change: 1 addition & 0 deletions source/core/services/vap_svc.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ typedef struct {
int ext_udhcp_disconnect_event_timeout_handler_id;
int ext_trigger_disconnection_timeout_handler_id;
bool is_started;
bool is_vap_started[MAX_NUM_RADIOS];
}__attribute__((packed)) vap_svc_ext_t;

typedef struct vap_svc {
Expand Down
42 changes: 32 additions & 10 deletions source/core/services/vap_svc_mesh_ext.c
Original file line number Diff line number Diff line change
Expand Up @@ -1027,14 +1027,24 @@ int vap_svc_mesh_ext_start(vap_svc_t *svc, unsigned int radio_index, wifi_vap_in

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

if (radio_index >= MAX_NUM_RADIOS) {
wifi_util_error_print(WIFI_CTRL,
"%s:%d failed to start mesh service: wrong radio index %d\n", __func__, __LINE__,
radio_index);
return -1;
}

/* create STA vap's and install acl filters */
if (!ext->is_vap_started[radio_index]) {
vap_svc_start(svc, radio_index);
ext->is_vap_started[radio_index] = true;
}

if (ext->is_started == true) {
wifi_util_info_print(WIFI_CTRL, "%s:%d mesh service already started\n", __func__, __LINE__);
return 0;
}

/* create STA vap's and install acl filters */
vap_svc_start(svc);

// initialize all extender specific structures
memset(ext, 0, sizeof(vap_svc_ext_t));

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

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

if (ext->is_started == false) {
if (ext->is_started) {
vap_svc_mesh_ext_disconnect(svc);
cancel_all_running_timer(svc);
vap_svc_mesh_ext_clear_variable(svc);
ext->is_started = false;
} else {
wifi_util_info_print(WIFI_CTRL, "%s:%d mesh service already stopped\n", __func__, __LINE__);
return 0;
}
vap_svc_mesh_ext_disconnect(svc);
cancel_all_running_timer(svc);
vap_svc_stop(svc);
vap_svc_mesh_ext_clear_variable(svc);
ext->is_started = false;

if (radio_index >= MAX_NUM_RADIOS) {
wifi_util_error_print(WIFI_CTRL,
"%s:%d failed to stop mesh service: wrong radio index %d\n", __func__, __LINE__,
radio_index);
return -1;
}

if (ext->is_vap_started[radio_index]) {
vap_svc_stop(svc, radio_index);
ext->is_vap_started[radio_index] = false;
}

return 0;
}

Expand Down
11 changes: 2 additions & 9 deletions source/core/services/vap_svc_mesh_gw.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,12 @@ bool vap_svc_is_mesh_gw(unsigned int vap_index)
int vap_svc_mesh_gw_start(vap_svc_t *svc, unsigned int radio_index, wifi_vap_info_map_t *map)
{
// for backhaul just create vaps and install acl filters
if (radio_index == WIFI_ALL_RADIO_INDICES) {
return vap_svc_start(svc);
}

return 0;
return vap_svc_start(svc, radio_index);
}

int vap_svc_mesh_gw_stop(vap_svc_t *svc, unsigned int radio_index, wifi_vap_info_map_t *map)
{
if (radio_index == WIFI_ALL_RADIO_INDICES) {
return vap_svc_stop(svc);
}
return 0;
return vap_svc_stop(svc, radio_index);
}

int vap_svc_mesh_gw_update(vap_svc_t *svc, unsigned int radio_index, wifi_vap_info_map_t *map,
Expand Down
7 changes: 7 additions & 0 deletions source/core/services/vap_svc_mesh_pod.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@ int vap_svc_mesh_ext_start(vap_svc_t *svc, unsigned int radio_index, wifi_vap_in
ext = &svc->u.ext;
ext->conn_state = connection_state_connection_in_progress;
for (i = num_of_radios-1; i >= 0; i--) {
if (radio_index != WIFI_ALL_RADIO_INDICES && i != radio_index) {
continue;
}

vap_map = (wifi_vap_info_map_t *)get_wifidb_vap_map(i);
if (vap_map == NULL) {
wifi_util_dbg_print(WIFI_CTRL,"%s:failed to get vap map for radio index: %d\n",__FUNCTION__, i);
Expand Down Expand Up @@ -174,6 +178,9 @@ int vap_svc_mesh_ext_stop(vap_svc_t *svc, unsigned int radio_index, wifi_vap_inf
memset(&vif_config,0,sizeof(vif_config));

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

if (svc->is_my_fn(vap_map->vap_array[j].vap_index) == false) {
continue;
Expand Down
12 changes: 2 additions & 10 deletions source/core/services/vap_svc_private.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,20 +36,12 @@ bool vap_svc_is_private(unsigned int vap_index)

int vap_svc_private_start(vap_svc_t *svc, unsigned int radio_index, wifi_vap_info_map_t *map)
{
// for private just create vaps and install acl filters
if (radio_index == WIFI_ALL_RADIO_INDICES) {
return vap_svc_start(svc);
}

return 0;
return vap_svc_start(svc, radio_index);
}

int vap_svc_private_stop(vap_svc_t *svc, unsigned int radio_index, wifi_vap_info_map_t *map)
{
if (radio_index == WIFI_ALL_RADIO_INDICES) {
return vap_svc_stop(svc);
}
return 0;
return vap_svc_stop(svc, radio_index);
}

static int configure_lnf_psk_radius_from_hotspot(wifi_vap_info_t *vap_info)
Expand Down
12 changes: 3 additions & 9 deletions source/core/services/vap_svc_public.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,20 +37,14 @@ bool vap_svc_is_public(unsigned int vap_index)
int vap_svc_public_start(vap_svc_t *svc, unsigned int radio_index, wifi_vap_info_map_t *map)
{
// for public just create vaps
if (radio_index == WIFI_ALL_RADIO_INDICES) {
return vap_svc_start(svc);
}

return 0;
return vap_svc_start(svc, radio_index);
}

int vap_svc_public_stop(vap_svc_t *svc, unsigned int radio_index, wifi_vap_info_map_t *map)
{
if (radio_index == WIFI_ALL_RADIO_INDICES) {
return vap_svc_stop(svc);
}
return 0;
return vap_svc_stop(svc, radio_index);
}

void process_prefer_private_mac_filter(mac_address_t prefer_private_mac)
{
unsigned int itr = 0, itrj = 0;
Expand Down
64 changes: 38 additions & 26 deletions source/core/wifi_ctrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,7 @@ unsigned int dfs_fallback_channel(wifi_platform_property_t *wifi_prop, wifi_freq
return channel;
}

int start_radios(rdk_dev_mode_type_t mode)
int start_radios(rdk_dev_mode_type_t mode, unsigned int radio_index)
{
wifi_radio_operationParam_t *wifi_radio_oper_param = NULL;
int ret = RETURN_OK;
Expand All @@ -460,6 +460,10 @@ int start_radios(rdk_dev_mode_type_t mode)
}

for (index = 0; index < num_of_radios; index++) {
if (radio_index != WIFI_ALL_RADIO_INDICES && radio_index != index) {
continue;
}

wifi_radio_oper_param = (wifi_radio_operationParam_t *)get_wifidb_radio_map(index);
if (wifi_radio_oper_param == NULL) {
wifi_util_error_print(WIFI_CTRL,"%s:wrong index for radio map: %d\n",__FUNCTION__, index);
Expand Down Expand Up @@ -750,17 +754,17 @@ int bus_get_active_gw_parameter(const char *name, unsigned int *ret_val)
return RETURN_OK;
}

void start_extender_vaps(void)
void start_extender_vaps(unsigned int radio_index)
{
wifi_ctrl_t *ctrl;
vap_svc_t *ext_svc;

ctrl = (wifi_ctrl_t *)get_wifictrl_obj();
ext_svc = get_svc_by_type(ctrl, vap_svc_type_mesh_ext);
ext_svc->start_fn(ext_svc, WIFI_ALL_RADIO_INDICES, NULL);
ext_svc->start_fn(ext_svc, radio_index, NULL);
}

void start_gateway_vaps()
void start_gateway_vaps(unsigned int radio_index)
{
vap_svc_t *priv_svc, *pub_svc, *mesh_gw_svc;
unsigned int value;
Expand All @@ -772,20 +776,20 @@ void start_gateway_vaps()
mesh_gw_svc = get_svc_by_type(ctrl, vap_svc_type_mesh_gw);

// start private
priv_svc->start_fn(priv_svc, WIFI_ALL_RADIO_INDICES, NULL);
priv_svc->start_fn(priv_svc, radio_index, NULL);

// start mesh gateway if mesh is enabled
value = get_wifi_mesh_vap_enable_status();
if (value == true) {
mesh_gw_svc->start_fn(mesh_gw_svc, WIFI_ALL_RADIO_INDICES, NULL);
mesh_gw_svc->start_fn(mesh_gw_svc, radio_index, NULL);
}

value = false;
// start public if tunnel is up
bus_get_vap_init_parameter(WIFI_DEVICE_TUNNEL_STATUS, &value);
if (value == true) {
set_wifi_public_vap_enable_status();
pub_svc->start_fn(pub_svc, WIFI_ALL_RADIO_INDICES, NULL);
pub_svc->start_fn(pub_svc, radio_index, NULL);
}

value = false;
Expand All @@ -797,11 +801,11 @@ void start_gateway_vaps()

if (is_sta_enabled() == true) {
wifi_util_info_print(WIFI_CTRL, "%s:%d start mesh sta\n",__func__, __LINE__);
start_extender_vaps();
start_extender_vaps(radio_index);
}
}

void stop_gateway_vaps()
void stop_gateway_vaps(unsigned int radio_index)
{
vap_svc_t *priv_svc, *pub_svc, *mesh_gw_svc;
wifi_ctrl_t *ctrl;
Expand All @@ -812,19 +816,19 @@ void stop_gateway_vaps()
pub_svc = get_svc_by_type(ctrl, vap_svc_type_public);
mesh_gw_svc = get_svc_by_type(ctrl, vap_svc_type_mesh_gw);

priv_svc->stop_fn(priv_svc, WIFI_ALL_RADIO_INDICES, NULL);
pub_svc->stop_fn(pub_svc, WIFI_ALL_RADIO_INDICES, NULL);
mesh_gw_svc->stop_fn(mesh_gw_svc, WIFI_ALL_RADIO_INDICES, NULL);
priv_svc->stop_fn(priv_svc, radio_index, NULL);
pub_svc->stop_fn(pub_svc, radio_index, NULL);
mesh_gw_svc->stop_fn(mesh_gw_svc, radio_index, NULL);
}

void stop_extender_vaps(void)
void stop_extender_vaps(unsigned int radio_index)
{
wifi_ctrl_t *ctrl;
vap_svc_t *ext_svc;

ctrl = (wifi_ctrl_t *)get_wifictrl_obj();
ext_svc = get_svc_by_type(ctrl, vap_svc_type_mesh_ext);
ext_svc->stop_fn(ext_svc, WIFI_ALL_RADIO_INDICES, NULL);
ext_svc->stop_fn(ext_svc, radio_index, NULL);
}

int start_wifi_services(void)
Expand All @@ -835,8 +839,10 @@ int start_wifi_services(void)

if (ctrl->network_mode == rdk_dev_mode_type_gw) {
wifi_util_info_print(WIFI_CTRL, "%s:%d start gw vaps\n",__func__, __LINE__);
start_radios(rdk_dev_mode_type_gw);
start_gateway_vaps();
for (unsigned int radio_index = 0; radio_index < getNumberRadios(); radio_index++) {
start_radios(rdk_dev_mode_type_gw, radio_index);
start_gateway_vaps(radio_index);
}
captive_portal_check();
#if !defined(NEWPLATFORM_PORT) && !defined(_SR213_PRODUCT_REQ_) && \
(defined(_XB10_PRODUCT_REQ_) || defined(_SCER11BEL_PRODUCT_REQ_) || defined(_SCXF11BFL_PRODUCT_REQ_))
Expand All @@ -846,21 +852,27 @@ int start_wifi_services(void)
#endif

} else if (ctrl->network_mode == rdk_dev_mode_type_ext) {
start_radios(rdk_dev_mode_type_ext);
if (is_sta_enabled()) {
wifi_util_info_print(WIFI_CTRL, "%s:%d start mesh sta\n",__func__, __LINE__);
start_extender_vaps();
} else {
wifi_util_info_print(WIFI_CTRL, "%s:%d mesh sta disabled\n",__func__, __LINE__);
for (unsigned int radio_index = 0; radio_index < getNumberRadios(); radio_index++) {
start_radios(rdk_dev_mode_type_ext, radio_index);
if (is_sta_enabled()) {
wifi_util_info_print(WIFI_CTRL, "%s:%d start mesh sta\n", __func__, __LINE__);
start_extender_vaps(radio_index);
} else {
wifi_util_info_print(WIFI_CTRL, "%s:%d mesh sta disabled\n", __func__, __LINE__);
}
}
} else if (ctrl->network_mode == rdk_dev_mode_type_em_node) {
wifi_util_info_print(WIFI_CTRL, "%s:%d start em_mode\n",__func__, __LINE__);
start_radios(rdk_dev_mode_type_gw);
start_extender_vaps();
for (unsigned int radio_index = 0; radio_index < getNumberRadios(); radio_index++) {
start_radios(rdk_dev_mode_type_gw, radio_index);
start_extender_vaps(radio_index);
}
} else if (ctrl->network_mode == rdk_dev_mode_type_em_colocated_node) {
wifi_util_info_print(WIFI_CTRL, "%s:%d start em_colocated mode\n",__func__, __LINE__);
start_radios(rdk_dev_mode_type_gw);
start_gateway_vaps();
for (unsigned int radio_index = 0; radio_index < getNumberRadios(); radio_index++) {
start_radios(rdk_dev_mode_type_gw, radio_index);
start_gateway_vaps(radio_index);
}
}

return RETURN_OK;
Expand Down
Loading
Loading