diff options
| -rw-r--r-- | core/sme/src/common/sme_api.c | 41 | ||||
| -rw-r--r-- | core/wma/src/wma_main.c | 5 | ||||
| -rw-r--r-- | core/wma/src/wma_scan_roam.c | 61 |
3 files changed, 107 insertions, 0 deletions
diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 5618a8fdd746..2cf8fbb92381 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -14703,6 +14703,47 @@ CDF_STATUS sme_soc_set_dual_mac_config(tHalHandle hal, return CDF_STATUS_SUCCESS; } +#ifdef FEATURE_LFR_SUBNET_DETECTION +/** + * sme_gateway_param_update() - to update gateway parameters with WMA + * @Hal: hal handle + * @gw_params: request parameters from HDD + * + * Return: CDF_STATUS + * + * This routine will update gateway parameters to WMA + */ +CDF_STATUS sme_gateway_param_update(tHalHandle Hal, + struct gateway_param_update_req *gw_params) +{ + CDF_STATUS cdf_status; + cds_msg_t cds_message; + struct gateway_param_update_req *request_buf; + + request_buf = cdf_mem_malloc(sizeof(*request_buf)); + if (NULL == request_buf) { + CDF_TRACE(CDF_MODULE_ID_SME, CDF_TRACE_LEVEL_ERROR, + FL("Not able to allocate memory for gw param update request")); + return CDF_STATUS_E_NOMEM; + } + + *request_buf = *gw_params; + + cds_message.type = WMA_GW_PARAM_UPDATE_REQ; + cds_message.reserved = 0; + cds_message.bodyptr = request_buf; + cdf_status = cds_mq_post_message(CDS_MQ_ID_WMA, &cds_message); + if (!CDF_IS_STATUS_SUCCESS(cdf_status)) { + CDF_TRACE(CDF_MODULE_ID_SME, CDF_TRACE_LEVEL_ERROR, + FL("Not able to post WMA_GW_PARAM_UPDATE_REQ message to HAL")); + cdf_mem_free(request_buf); + return CDF_STATUS_E_FAILURE; + } + + return CDF_STATUS_SUCCESS; +} +#endif /* FEATURE_LFR_SUBNET_DETECTION */ + /** * sme_set_peer_authorized() - call peer authorized callback * @peer_addr: peer mac address diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 9ecbdecc7637..b185e7e25070 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -5280,6 +5280,11 @@ CDF_STATUS wma_mc_process_msg(void *cds_context, cds_msg_t *msg) (struct wma_lro_config_cmd_t *)msg->bodyptr); cdf_mem_free(msg->bodyptr); break; + case WMA_GW_PARAM_UPDATE_REQ: + wma_set_gateway_params(wma_handle, + (struct gateway_param_update_req *)msg->bodyptr); + cdf_mem_free(msg->bodyptr); + break; default: WMA_LOGD("unknow msg type %x", msg->type); /* Do Nothing? MSG Body should be freed at here */ diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 56318d6e8e6a..f170cca1c1a4 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -6969,3 +6969,64 @@ CDF_STATUS wma_get_scan_id(uint32_t *scan_id) return CDF_STATUS_SUCCESS; } +#ifdef FEATURE_LFR_SUBNET_DETECTION +/** + * wma_set_gateway_params() - set gateway parameters + * @wma: WMA handle + * @req: gateway parameter update request structure + * + * This function reads the incoming @req and fill in the destination + * WMI structure and sends down the gateway configs down to the firmware + * + * Return: CDF_STATUS + */ +CDF_STATUS wma_set_gateway_params(tp_wma_handle wma, + struct gateway_param_update_req *req) +{ + wmi_roam_subnet_change_config_fixed_param *cmd; + wmi_buf_t buf; + int ret; + int len = sizeof(*cmd); + + buf = wmi_buf_alloc(wma->wmi_handle, len); + if (!buf) { + WMA_LOGP("%s: wmi_buf_alloc failed", __func__); + return CDF_STATUS_E_NOMEM; + } + + cmd = (wmi_roam_subnet_change_config_fixed_param *) wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_roam_subnet_change_config_fixed_param, + WMITLV_GET_STRUCT_TLVLEN( + wmi_roam_subnet_change_config_fixed_param)); + + cmd->vdev_id = req->session_id; + cdf_mem_copy(&cmd->inet_gw_ip_v4_addr, req->ipv4_addr, + CDF_IPV4_ADDR_SIZE); + cdf_mem_copy(&cmd->inet_gw_ip_v6_addr, req->ipv6_addr, + CDF_IPV6_ADDR_SIZE); + WMI_CHAR_ARRAY_TO_MAC_ADDR(req->gw_mac_addr.bytes, + &cmd->inet_gw_mac_addr); + cmd->max_retries = req->max_retries; + cmd->timeout = req->timeout; + cmd->num_skip_subnet_change_detection_bssid_list = 0; + cmd->flag = 0; + if (req->ipv4_addr_type) + WMI_SET_ROAM_SUBNET_CHANGE_FLAG_IP4_ENABLED(cmd->flag); + + if (req->ipv6_addr_type) + WMI_SET_ROAM_SUBNET_CHANGE_FLAG_IP6_ENABLED(cmd->flag); + + ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len, + WMI_ROAM_SUBNET_CHANGE_CONFIG_CMDID); + if (ret != EOK) { + WMA_LOGE("Failed to send gw config parameter to fw, ret: %d", + ret); + wmi_buf_free(buf); + return CDF_STATUS_E_FAILURE; + } + + return CDF_STATUS_SUCCESS; +} +#endif /* FEATURE_LFR_SUBNET_DETECTION */ + |
