|
@@ -112,6 +112,12 @@
|
|
|
#define MAWC_ROAM_RSSI_HIGH_ADJUST_DEFAULT 5
|
|
|
#define MAWC_ROAM_RSSI_LOW_ADJUST_DEFAULT 5
|
|
|
|
|
|
+/*
|
|
|
+ * Neighbor report offload needs to send 0xFFFFFFFF if a particular
|
|
|
+ * parameter is disabled from the ini
|
|
|
+ */
|
|
|
+#define NEIGHBOR_REPORT_PARAM_INVALID (0xFFFFFFFFU)
|
|
|
+
|
|
|
/* Static Type declarations */
|
|
|
static struct csr_roam_session csr_roam_roam_session[CSR_ROAM_SESSION_MAX];
|
|
|
|
|
@@ -18307,6 +18313,142 @@ csr_create_roam_scan_offload_request(tpAniSirGlobal mac_ctx,
|
|
|
#endif
|
|
|
return req_buf;
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * csr_update_11k_offload_params - Update 11K offload params
|
|
|
+ * @mac_ctx: MAC context
|
|
|
+ * @session: Pointer to the CSR Roam Session
|
|
|
+ * @req_buffer: Pointer to the RSO Request buffer
|
|
|
+ *
|
|
|
+ * API to update 11k offload params to Roam Scan Offload request buffer
|
|
|
+ *
|
|
|
+ * Return: none
|
|
|
+ */
|
|
|
+static void csr_update_11k_offload_params(tpAniSirGlobal mac_ctx,
|
|
|
+ struct csr_roam_session *session,
|
|
|
+ tSirRoamOffloadScanReq *req_buffer)
|
|
|
+{
|
|
|
+ struct wmi_11k_offload_params *params = &req_buffer->offload_11k_params;
|
|
|
+ struct csr_config *csr_config = &mac_ctx->roam.configParam;
|
|
|
+ struct csr_neighbor_report_offload_params *neighbor_report_offload =
|
|
|
+ &csr_config->neighbor_report_offload;
|
|
|
+
|
|
|
+ params->vdev_id = session->sessionId;
|
|
|
+ params->offload_11k_bitmask = csr_config->offload_11k_enable_bitmask;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If none of the parameters are enabled, then set the
|
|
|
+ * offload_11k_bitmask to 0, so that we don't send the command
|
|
|
+ * to the FW and drop it in WMA
|
|
|
+ */
|
|
|
+ if ((neighbor_report_offload->params_bitmask &
|
|
|
+ NEIGHBOR_REPORT_PARAMS_ALL) == 0) {
|
|
|
+ sme_err("No valid neighbor report offload params %x",
|
|
|
+ neighbor_report_offload->params_bitmask);
|
|
|
+ params->offload_11k_bitmask = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * First initialize all params to NEIGHBOR_REPORT_PARAM_INVALID
|
|
|
+ * Then set the values that are enabled
|
|
|
+ */
|
|
|
+ params->neighbor_report_params.time_offset =
|
|
|
+ NEIGHBOR_REPORT_PARAM_INVALID;
|
|
|
+ params->neighbor_report_params.low_rssi_offset =
|
|
|
+ NEIGHBOR_REPORT_PARAM_INVALID;
|
|
|
+ params->neighbor_report_params.bmiss_count_trigger =
|
|
|
+ NEIGHBOR_REPORT_PARAM_INVALID;
|
|
|
+ params->neighbor_report_params.per_threshold_offset =
|
|
|
+ NEIGHBOR_REPORT_PARAM_INVALID;
|
|
|
+ params->neighbor_report_params.neighbor_report_cache_timeout =
|
|
|
+ NEIGHBOR_REPORT_PARAM_INVALID;
|
|
|
+ params->neighbor_report_params.max_neighbor_report_req_cap =
|
|
|
+ NEIGHBOR_REPORT_PARAM_INVALID;
|
|
|
+
|
|
|
+ if (neighbor_report_offload->params_bitmask &
|
|
|
+ NEIGHBOR_REPORT_PARAMS_TIME_OFFSET)
|
|
|
+ params->neighbor_report_params.time_offset =
|
|
|
+ neighbor_report_offload->time_offset;
|
|
|
+
|
|
|
+ if (neighbor_report_offload->params_bitmask &
|
|
|
+ NEIGHBOR_REPORT_PARAMS_LOW_RSSI_OFFSET)
|
|
|
+ params->neighbor_report_params.low_rssi_offset =
|
|
|
+ neighbor_report_offload->low_rssi_offset;
|
|
|
+
|
|
|
+ if (neighbor_report_offload->params_bitmask &
|
|
|
+ NEIGHBOR_REPORT_PARAMS_BMISS_COUNT_TRIGGER)
|
|
|
+ params->neighbor_report_params.bmiss_count_trigger =
|
|
|
+ neighbor_report_offload->bmiss_count_trigger;
|
|
|
+
|
|
|
+ if (neighbor_report_offload->params_bitmask &
|
|
|
+ NEIGHBOR_REPORT_PARAMS_PER_THRESHOLD_OFFSET)
|
|
|
+ params->neighbor_report_params.per_threshold_offset =
|
|
|
+ neighbor_report_offload->per_threshold_offset;
|
|
|
+
|
|
|
+ if (neighbor_report_offload->params_bitmask &
|
|
|
+ NEIGHBOR_REPORT_PARAMS_CACHE_TIMEOUT)
|
|
|
+ params->neighbor_report_params.neighbor_report_cache_timeout =
|
|
|
+ neighbor_report_offload->neighbor_report_cache_timeout;
|
|
|
+
|
|
|
+ if (neighbor_report_offload->params_bitmask &
|
|
|
+ NEIGHBOR_REPORT_PARAMS_MAX_REQ_CAP)
|
|
|
+ params->neighbor_report_params.max_neighbor_report_req_cap =
|
|
|
+ neighbor_report_offload->max_neighbor_report_req_cap;
|
|
|
+
|
|
|
+ params->neighbor_report_params.ssid.length =
|
|
|
+ session->connectedProfile.SSID.length;
|
|
|
+ qdf_mem_copy(params->neighbor_report_params.ssid.mac_ssid,
|
|
|
+ session->connectedProfile.SSID.ssId,
|
|
|
+ session->connectedProfile.SSID.length);
|
|
|
+
|
|
|
+ sme_debug("Updated 11k offload params to RSO");
|
|
|
+}
|
|
|
+
|
|
|
+QDF_STATUS csr_invoke_neighbor_report_request(uint8_t session_id,
|
|
|
+ struct sRrmNeighborReq *neighbor_report_req,
|
|
|
+ bool send_resp_to_host)
|
|
|
+{
|
|
|
+ struct wmi_invoke_neighbor_report_params *invoke_params;
|
|
|
+ struct scheduler_msg msg = {0};
|
|
|
+
|
|
|
+ if (!neighbor_report_req) {
|
|
|
+ sme_err("Invalid params");
|
|
|
+ return QDF_STATUS_E_INVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ invoke_params = qdf_mem_malloc(sizeof(*invoke_params));
|
|
|
+ if (!invoke_params) {
|
|
|
+ sme_err("Memory allocation failure");
|
|
|
+ return QDF_STATUS_E_NOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ invoke_params->vdev_id = session_id;
|
|
|
+ invoke_params->send_resp_to_host = send_resp_to_host;
|
|
|
+
|
|
|
+ if (!neighbor_report_req->no_ssid) {
|
|
|
+ invoke_params->ssid.length = neighbor_report_req->ssid.length;
|
|
|
+ qdf_mem_copy(invoke_params->ssid.mac_ssid,
|
|
|
+ neighbor_report_req->ssid.ssId,
|
|
|
+ neighbor_report_req->ssid.length);
|
|
|
+ } else {
|
|
|
+ invoke_params->ssid.length = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ sme_debug("Sending SIR_HAL_INVOKE_NEIGHBOR_REPORT");
|
|
|
+
|
|
|
+ msg.type = SIR_HAL_INVOKE_NEIGHBOR_REPORT;
|
|
|
+ msg.reserved = 0;
|
|
|
+ msg.bodyptr = invoke_params;
|
|
|
+
|
|
|
+ if (QDF_STATUS_SUCCESS != scheduler_post_msg(QDF_MODULE_ID_WMA, &msg)) {
|
|
|
+ sme_err("Not able to post message to WMA");
|
|
|
+ qdf_mem_free(invoke_params);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* check_allowed_ssid_list() - Check the WhiteList
|
|
|
* @req_buffer: Buffer which contains the connected profile SSID.
|
|
@@ -19233,6 +19375,9 @@ csr_roam_offload_scan(tpAniSirGlobal mac_ctx, uint8_t session_id,
|
|
|
csr_update_driver_assoc_ies(mac_ctx, session, req_buf);
|
|
|
csr_update_score_params(mac_ctx, req_buf);
|
|
|
csr_update_fils_params_rso(mac_ctx, session, req_buf);
|
|
|
+ if (reason == REASON_CTX_INIT)
|
|
|
+ csr_update_11k_offload_params(mac_ctx, session,
|
|
|
+ req_buf);
|
|
|
}
|
|
|
|
|
|
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
|
|
@@ -19260,177 +19405,6 @@ csr_roam_offload_scan(tpAniSirGlobal mac_ctx, uint8_t session_id,
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
-#define NEIGHBOR_REPORT_PARAM_INVALID (0xFFFFFFFFU)
|
|
|
-
|
|
|
-QDF_STATUS csr_send_11k_offload_params(tpAniSirGlobal mac_ctx,
|
|
|
- uint8_t session_id)
|
|
|
-{
|
|
|
- struct csr_roam_session *session;
|
|
|
- struct wmi_11k_offload_params *params;
|
|
|
- struct scheduler_msg msg = {0};
|
|
|
- QDF_STATUS status;
|
|
|
- struct csr_config *csr_config = &mac_ctx->roam.configParam;
|
|
|
- struct csr_neighbor_report_offload_params *neighbor_report_offload =
|
|
|
- &csr_config->neighbor_report_offload;
|
|
|
-
|
|
|
- if ((csr_config->offload_11k_enable_bitmask &
|
|
|
- WMI_11K_OFFLOAD_BITMAP_NEIGHBOR_REPORT_REQ) == 0) {
|
|
|
- sme_debug("Neighbor report offload not enabled");
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
- }
|
|
|
-
|
|
|
- if ((neighbor_report_offload->params_bitmask &
|
|
|
- NEIGHBOR_REPORT_PARAMS_ALL) == 0) {
|
|
|
- sme_err("No valid neighbor report offload params %x",
|
|
|
- neighbor_report_offload->params_bitmask);
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
- }
|
|
|
-
|
|
|
- status = sme_acquire_global_lock(&mac_ctx->sme);
|
|
|
- if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
- sme_err("sme_acquire_global_lock failed");
|
|
|
- return status;
|
|
|
- }
|
|
|
-
|
|
|
- session = CSR_GET_SESSION(mac_ctx, session_id);
|
|
|
- if (!session) {
|
|
|
- sme_release_global_lock(&mac_ctx->sme);
|
|
|
- sme_err("Session not found");
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
- }
|
|
|
-
|
|
|
- if (!session->connectedProfile.SSID.length) {
|
|
|
- sme_err("SSID Len 0");
|
|
|
- sme_release_global_lock(&mac_ctx->sme);
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
- }
|
|
|
-
|
|
|
- params = qdf_mem_malloc(sizeof(*params));
|
|
|
-
|
|
|
- if (!params) {
|
|
|
- sme_release_global_lock(&mac_ctx->sme);
|
|
|
- sme_err("Memory allocation failure");
|
|
|
- return QDF_STATUS_E_NOMEM;
|
|
|
- }
|
|
|
-
|
|
|
- params->vdev_id = session_id;
|
|
|
- params->offload_11k_bitmask = csr_config->offload_11k_enable_bitmask;
|
|
|
-
|
|
|
- /*
|
|
|
- * First initialize all params to NEIGHBOR_REPORT_PARAM_INVALID
|
|
|
- * Then set the values that are enabled
|
|
|
- */
|
|
|
- params->neighbor_report_params.time_offset =
|
|
|
- NEIGHBOR_REPORT_PARAM_INVALID;
|
|
|
- params->neighbor_report_params.low_rssi_offset =
|
|
|
- NEIGHBOR_REPORT_PARAM_INVALID;
|
|
|
- params->neighbor_report_params.bmiss_count_trigger =
|
|
|
- NEIGHBOR_REPORT_PARAM_INVALID;
|
|
|
- params->neighbor_report_params.per_threshold_offset =
|
|
|
- NEIGHBOR_REPORT_PARAM_INVALID;
|
|
|
- params->neighbor_report_params.neighbor_report_cache_timeout =
|
|
|
- NEIGHBOR_REPORT_PARAM_INVALID;
|
|
|
- params->neighbor_report_params.max_neighbor_report_req_cap =
|
|
|
- NEIGHBOR_REPORT_PARAM_INVALID;
|
|
|
-
|
|
|
- if (neighbor_report_offload->params_bitmask &
|
|
|
- NEIGHBOR_REPORT_PARAMS_TIME_OFFSET)
|
|
|
- params->neighbor_report_params.time_offset =
|
|
|
- neighbor_report_offload->time_offset;
|
|
|
-
|
|
|
- if (neighbor_report_offload->params_bitmask &
|
|
|
- NEIGHBOR_REPORT_PARAMS_LOW_RSSI_OFFSET)
|
|
|
- params->neighbor_report_params.low_rssi_offset =
|
|
|
- neighbor_report_offload->low_rssi_offset;
|
|
|
-
|
|
|
- if (neighbor_report_offload->params_bitmask &
|
|
|
- NEIGHBOR_REPORT_PARAMS_BMISS_COUNT_TRIGGER)
|
|
|
- params->neighbor_report_params.bmiss_count_trigger =
|
|
|
- neighbor_report_offload->bmiss_count_trigger;
|
|
|
-
|
|
|
- if (neighbor_report_offload->params_bitmask &
|
|
|
- NEIGHBOR_REPORT_PARAMS_PER_THRESHOLD_OFFSET)
|
|
|
- params->neighbor_report_params.per_threshold_offset =
|
|
|
- neighbor_report_offload->per_threshold_offset;
|
|
|
-
|
|
|
- if (neighbor_report_offload->params_bitmask &
|
|
|
- NEIGHBOR_REPORT_PARAMS_CACHE_TIMEOUT)
|
|
|
- params->neighbor_report_params.neighbor_report_cache_timeout =
|
|
|
- neighbor_report_offload->neighbor_report_cache_timeout;
|
|
|
-
|
|
|
- if (neighbor_report_offload->params_bitmask &
|
|
|
- NEIGHBOR_REPORT_PARAMS_MAX_REQ_CAP)
|
|
|
- params->neighbor_report_params.max_neighbor_report_req_cap =
|
|
|
- neighbor_report_offload->max_neighbor_report_req_cap;
|
|
|
-
|
|
|
- params->neighbor_report_params.ssid.length =
|
|
|
- session->connectedProfile.SSID.length;
|
|
|
- qdf_mem_copy(params->neighbor_report_params.ssid.mac_ssid,
|
|
|
- session->connectedProfile.SSID.ssId,
|
|
|
- session->connectedProfile.SSID.length);
|
|
|
- sme_release_global_lock(&mac_ctx->sme);
|
|
|
-
|
|
|
- sme_debug("Sending SIR_HAL_SET_11K_OFFLOAD");
|
|
|
-
|
|
|
- msg.type = SIR_HAL_SET_11K_OFFLOAD;
|
|
|
- msg.reserved = 0;
|
|
|
- msg.bodyptr = params;
|
|
|
-
|
|
|
- if (QDF_STATUS_SUCCESS != scheduler_post_msg(QDF_MODULE_ID_WMA, &msg)) {
|
|
|
- sme_err("Not able to post message to WMA");
|
|
|
- qdf_mem_free(params);
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
- }
|
|
|
-
|
|
|
- return QDF_STATUS_SUCCESS;
|
|
|
-}
|
|
|
-
|
|
|
-QDF_STATUS csr_invoke_neighbor_report_request(uint8_t session_id,
|
|
|
- struct sRrmNeighborReq *neighbor_report_req,
|
|
|
- bool send_resp_to_host)
|
|
|
-{
|
|
|
- struct wmi_invoke_neighbor_report_params *invoke_params;
|
|
|
- struct scheduler_msg msg = {0};
|
|
|
-
|
|
|
- if (!neighbor_report_req) {
|
|
|
- sme_err("Invalid params");
|
|
|
- return QDF_STATUS_E_INVAL;
|
|
|
- }
|
|
|
-
|
|
|
- invoke_params = qdf_mem_malloc(sizeof(*invoke_params));
|
|
|
- if (!invoke_params) {
|
|
|
- sme_err("Memory allocation failure");
|
|
|
- return QDF_STATUS_E_NOMEM;
|
|
|
- }
|
|
|
-
|
|
|
- invoke_params->vdev_id = session_id;
|
|
|
- invoke_params->send_resp_to_host = send_resp_to_host;
|
|
|
-
|
|
|
- if (!neighbor_report_req->no_ssid) {
|
|
|
- invoke_params->ssid.length = neighbor_report_req->ssid.length;
|
|
|
- qdf_mem_copy(invoke_params->ssid.mac_ssid,
|
|
|
- neighbor_report_req->ssid.ssId,
|
|
|
- neighbor_report_req->ssid.length);
|
|
|
- } else {
|
|
|
- invoke_params->ssid.length = 0;
|
|
|
- }
|
|
|
-
|
|
|
- sme_debug("Sending SIR_HAL_INVOKE_NEIGHBOR_REPORT");
|
|
|
-
|
|
|
- msg.type = SIR_HAL_INVOKE_NEIGHBOR_REPORT;
|
|
|
- msg.reserved = 0;
|
|
|
- msg.bodyptr = invoke_params;
|
|
|
-
|
|
|
- if (QDF_STATUS_SUCCESS != scheduler_post_msg(QDF_MODULE_ID_WMA, &msg)) {
|
|
|
- sme_err("Not able to post message to WMA");
|
|
|
- qdf_mem_free(invoke_params);
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
- }
|
|
|
-
|
|
|
- return QDF_STATUS_SUCCESS;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
QDF_STATUS csr_roam_offload_scan_rsp_hdlr(tpAniSirGlobal pMac,
|
|
|
tpSirRoamOffloadScanRsp
|
|
|
scanOffloadRsp)
|