qcacld-3.0: Add Reassoc req handling code for connection manager
Add Reassoc req handling code for connection manager. Change-Id: I2735642df3132738993e801acdb6c9dcba1ac80f CRs-Fixed: 2939872
这个提交包含在:
@@ -4243,6 +4243,72 @@ bool cm_is_auth_type_11r(struct wlan_mlme_psoc_ext_obj *mlme_obj,
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef FEATURE_WLAN_ESE
|
||||
static bool cm_is_open_mode(struct wlan_objmgr_vdev *vdev)
|
||||
{
|
||||
int32_t ucast_cipher;
|
||||
|
||||
ucast_cipher = wlan_crypto_get_param(vdev,
|
||||
WLAN_CRYPTO_PARAM_UCAST_CIPHER);
|
||||
if (!ucast_cipher ||
|
||||
((QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_NONE) ==
|
||||
ucast_cipher)))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
cm_ese_open_present(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_mlme_psoc_ext_obj *mlme_obj,
|
||||
bool ese_version_present)
|
||||
{
|
||||
if (cm_is_open_mode(vdev) && ese_version_present &&
|
||||
mlme_obj->cfg.lfr.ese_enabled)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
cm_is_ese_connection(struct wlan_objmgr_vdev *vdev, bool ese_version_present)
|
||||
{
|
||||
int32_t akm;
|
||||
int32_t auth_mode;
|
||||
struct wlan_mlme_psoc_ext_obj *mlme_obj;
|
||||
struct wlan_objmgr_psoc *psoc;
|
||||
|
||||
psoc = wlan_vdev_get_psoc(vdev);
|
||||
if (!psoc) {
|
||||
mlme_err("psoc not found");
|
||||
return false;
|
||||
}
|
||||
mlme_obj = mlme_get_psoc_ext_obj(psoc);
|
||||
if (!mlme_obj)
|
||||
return false;
|
||||
|
||||
if (!mlme_obj->cfg.lfr.ese_enabled)
|
||||
return false;
|
||||
|
||||
akm = wlan_crypto_get_param(vdev,
|
||||
WLAN_CRYPTO_PARAM_KEY_MGMT);
|
||||
|
||||
auth_mode = wlan_crypto_get_param(vdev,
|
||||
WLAN_CRYPTO_PARAM_AUTH_MODE);
|
||||
|
||||
if (QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_CCKM))
|
||||
return true;
|
||||
|
||||
/* A profile can not be both ESE and 11R. But an 802.11R AP
|
||||
* may be advertising support for ESE as well. So if we are
|
||||
* associating Open or explicitly ESE then we will get ESE.
|
||||
* If we are associating explicitly 11R only then we will get
|
||||
* 11R.
|
||||
*/
|
||||
return cm_ese_open_present(vdev, mlme_obj, ese_version_present);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void cm_roam_start_init(struct wlan_objmgr_psoc *psoc,
|
||||
struct wlan_objmgr_pdev *pdev,
|
||||
struct wlan_objmgr_vdev *vdev)
|
||||
@@ -4324,6 +4390,42 @@ void cm_roam_start_init_on_connect(struct wlan_objmgr_pdev *pdev,
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
|
||||
}
|
||||
|
||||
void cm_update_session_assoc_ie(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
struct element_info *assoc_ie)
|
||||
{
|
||||
struct rso_config *rso_cfg;
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
|
||||
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
|
||||
WLAN_MLME_CM_ID);
|
||||
if (!vdev) {
|
||||
mlme_err("vdev object is NULL for vdev %d", vdev_id);
|
||||
return;
|
||||
}
|
||||
rso_cfg = wlan_cm_get_rso_config(vdev);
|
||||
if (!rso_cfg)
|
||||
goto rel_vdev_ref;
|
||||
|
||||
if (rso_cfg->assoc_ie.ptr) {
|
||||
qdf_mem_free(rso_cfg->assoc_ie.ptr);
|
||||
rso_cfg->assoc_ie.ptr = NULL;
|
||||
rso_cfg->assoc_ie.len = 0;
|
||||
}
|
||||
if (!assoc_ie->len) {
|
||||
sme_debug("Assoc IE len 0");
|
||||
goto rel_vdev_ref;
|
||||
}
|
||||
rso_cfg->assoc_ie.ptr = qdf_mem_malloc(assoc_ie->len);
|
||||
if (!rso_cfg->assoc_ie.ptr)
|
||||
goto rel_vdev_ref;
|
||||
|
||||
rso_cfg->assoc_ie.len = assoc_ie->len;
|
||||
qdf_mem_copy(rso_cfg->assoc_ie.ptr, assoc_ie->ptr, assoc_ie->len);
|
||||
rel_vdev_ref:
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
|
||||
}
|
||||
|
||||
#ifdef FEATURE_CM_ENABLE
|
||||
QDF_STATUS cm_start_roam_invoke(struct wlan_objmgr_psoc *psoc,
|
||||
struct wlan_objmgr_vdev *vdev,
|
||||
|
@@ -201,16 +201,6 @@ QDF_STATUS
|
||||
cm_roam_send_disable_config(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id, uint8_t cfg);
|
||||
|
||||
/**
|
||||
* cm_roam_start_init_on_connect() - init roaming
|
||||
* @pdev: pdev pointer
|
||||
* @vdev_id: vdev_id
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
void cm_roam_start_init_on_connect(struct wlan_objmgr_pdev *pdev,
|
||||
uint8_t vdev_id);
|
||||
|
||||
#if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
|
||||
void
|
||||
cm_store_sae_single_pmk_to_global_cache(struct wlan_objmgr_psoc *psoc,
|
||||
|
@@ -304,11 +304,12 @@ QDF_STATUS cm_connect_start_ind(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_connect_req *req);
|
||||
|
||||
/**
|
||||
* cm_csr_handle_connect_req() - Connection manager cb to csr to fill csr
|
||||
* cm_csr_handle_join_req() - Connection manager cb to csr to fill csr
|
||||
* session and update join req from legacy structures
|
||||
* @vdev: VDEV object
|
||||
* @req: Vdev connect request
|
||||
* @join_req: join req to be sent to LIM
|
||||
* @reassoc: if reassoc
|
||||
*
|
||||
* This API is to update legacy struct and should be removed once
|
||||
* CSR is cleaned up fully. No new params should be added to CSR, use
|
||||
@@ -316,10 +317,10 @@ QDF_STATUS cm_connect_start_ind(struct wlan_objmgr_vdev *vdev,
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS
|
||||
cm_csr_handle_connect_req(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_vdev_connect_req *req,
|
||||
struct cm_vdev_join_req *join_req);
|
||||
QDF_STATUS cm_csr_handle_join_req(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_vdev_connect_req *req,
|
||||
struct cm_vdev_join_req *join_req,
|
||||
bool reassoc);
|
||||
|
||||
/**
|
||||
* cm_handle_connect_req() - Connection manager ext connect request to start
|
||||
@@ -524,6 +525,41 @@ void cm_free_join_req(struct cm_vdev_join_req *join_req);
|
||||
*/
|
||||
QDF_STATUS cm_process_join_req(struct scheduler_msg *msg);
|
||||
|
||||
#ifdef WLAN_FEATURE_HOST_ROAM
|
||||
/**
|
||||
* cm_process_reassoc_req() - Process vdev reassoc req
|
||||
* @msg: scheduler message
|
||||
*
|
||||
* Process reassoc request in LIM and copy all reassoc req params.
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS cm_process_reassoc_req(struct scheduler_msg *msg);
|
||||
|
||||
/**
|
||||
* cm_handle_reassoc_req() - Connection manager ext reassoc request to start
|
||||
* vdev and peer assoc state machine
|
||||
* @vdev: VDEV object
|
||||
* @req: Vdev reassoc request
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS
|
||||
cm_handle_reassoc_req(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_vdev_reassoc_req *req);
|
||||
#else
|
||||
static inline QDF_STATUS cm_process_reassoc_req(struct scheduler_msg *msg)
|
||||
{
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
static inline QDF_STATUS
|
||||
cm_handle_reassoc_req(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_vdev_reassoc_req *req)
|
||||
{
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* cm_process_peer_create() - Process bss peer create req
|
||||
* @msg: scheduler message
|
||||
|
@@ -255,6 +255,40 @@ end:
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
|
||||
}
|
||||
|
||||
int8_t cm_get_rssi_by_bssid(struct wlan_objmgr_pdev *pdev,
|
||||
struct qdf_mac_addr *bssid)
|
||||
{
|
||||
struct scan_filter *scan_filter;
|
||||
int8_t rssi = 0;
|
||||
qdf_list_t *list = NULL;
|
||||
struct scan_cache_node *first_node = NULL;
|
||||
|
||||
scan_filter = qdf_mem_malloc(sizeof(*scan_filter));
|
||||
if (!scan_filter)
|
||||
return rssi;
|
||||
|
||||
scan_filter->num_of_bssid = 1;
|
||||
qdf_mem_copy(scan_filter->bssid_list[0].bytes,
|
||||
bssid, sizeof(struct qdf_mac_addr));
|
||||
scan_filter->ignore_auth_enc_type = true;
|
||||
list = wlan_scan_get_result(pdev, scan_filter);
|
||||
qdf_mem_free(scan_filter);
|
||||
|
||||
if (!list || (list && !qdf_list_size(list))) {
|
||||
mlme_debug("scan list empty");
|
||||
goto error;
|
||||
}
|
||||
|
||||
qdf_list_peek_front(list, (qdf_list_node_t **) &first_node);
|
||||
if (first_node && first_node->entry)
|
||||
rssi = first_node->entry->rssi_raw;
|
||||
error:
|
||||
if (list)
|
||||
wlan_scan_purge_results(list);
|
||||
|
||||
return rssi;
|
||||
}
|
||||
|
||||
#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
|
||||
static const char *cm_diag_get_ch_width_str(uint8_t ch_width)
|
||||
{
|
||||
@@ -607,40 +641,6 @@ static void cm_diag_get_auth_type(uint8_t *auth_type,
|
||||
*auth_type = AUTH_OPEN;
|
||||
}
|
||||
|
||||
int8_t cm_get_rssi_by_bssid(struct wlan_objmgr_pdev *pdev,
|
||||
struct qdf_mac_addr *bssid)
|
||||
{
|
||||
struct scan_filter *scan_filter;
|
||||
int8_t rssi = 0;
|
||||
qdf_list_t *list = NULL;
|
||||
struct scan_cache_node *first_node = NULL;
|
||||
|
||||
scan_filter = qdf_mem_malloc(sizeof(*scan_filter));
|
||||
if (!scan_filter)
|
||||
return rssi;
|
||||
|
||||
scan_filter->num_of_bssid = 1;
|
||||
qdf_mem_copy(scan_filter->bssid_list[0].bytes,
|
||||
bssid, sizeof(struct qdf_mac_addr));
|
||||
scan_filter->ignore_auth_enc_type = true;
|
||||
list = wlan_scan_get_result(pdev, scan_filter);
|
||||
qdf_mem_free(scan_filter);
|
||||
|
||||
if (!list || (list && !qdf_list_size(list))) {
|
||||
mlme_debug("scan list empty");
|
||||
goto error;
|
||||
}
|
||||
|
||||
qdf_list_peek_front(list, (qdf_list_node_t **) &first_node);
|
||||
if (first_node && first_node->entry)
|
||||
rssi = first_node->entry->rssi_raw;
|
||||
error:
|
||||
if (list)
|
||||
wlan_scan_purge_results(list);
|
||||
|
||||
return rssi;
|
||||
}
|
||||
|
||||
static void
|
||||
cm_connect_success_diag(struct wlan_mlme_psoc_ext_obj *mlme_obj,
|
||||
struct host_event_wlan_connection_stats *stats)
|
||||
@@ -1169,7 +1169,7 @@ cm_handle_connect_req(struct wlan_objmgr_vdev *vdev,
|
||||
|
||||
cm_update_hlp_data_from_assoc_ie(vdev, req);
|
||||
|
||||
status = cm_csr_handle_connect_req(vdev, req, join_req);
|
||||
status = cm_csr_handle_join_req(vdev, req, join_req, false);
|
||||
if (QDF_IS_STATUS_ERROR(status)) {
|
||||
mlme_err(CM_PREFIX_FMT "fail to fill params from legacy",
|
||||
CM_PREFIX_REF(req->vdev_id, req->cm_id));
|
||||
@@ -1206,6 +1206,101 @@ cm_handle_connect_req(struct wlan_objmgr_vdev *vdev,
|
||||
return status;
|
||||
}
|
||||
|
||||
#ifdef WLAN_FEATURE_HOST_ROAM
|
||||
QDF_STATUS
|
||||
cm_handle_reassoc_req(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_cm_vdev_reassoc_req *req)
|
||||
{
|
||||
struct cm_vdev_join_req *join_req;
|
||||
struct scheduler_msg msg;
|
||||
QDF_STATUS status;
|
||||
struct wlan_objmgr_pdev *pdev;
|
||||
struct wlan_objmgr_psoc *psoc;
|
||||
struct rso_config *rso_cfg;
|
||||
|
||||
if (!vdev || !req)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
pdev = wlan_vdev_get_pdev(vdev);
|
||||
if (!pdev) {
|
||||
mlme_err(CM_PREFIX_FMT "pdev not found",
|
||||
CM_PREFIX_REF(req->vdev_id, req->cm_id));
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
psoc = wlan_pdev_get_psoc(pdev);
|
||||
if (!psoc) {
|
||||
mlme_err(CM_PREFIX_FMT "psoc not found",
|
||||
CM_PREFIX_REF(req->vdev_id, req->cm_id));
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
rso_cfg = wlan_cm_get_rso_config(vdev);
|
||||
if (!rso_cfg)
|
||||
return QDF_STATUS_E_NOSUPPORT;
|
||||
|
||||
qdf_mem_zero(&msg, sizeof(msg));
|
||||
join_req = qdf_mem_malloc(sizeof(*join_req));
|
||||
if (!join_req)
|
||||
return QDF_STATUS_E_NOMEM;
|
||||
|
||||
wlan_cm_set_disable_hi_rssi(pdev, req->vdev_id, true);
|
||||
mlme_debug(CM_PREFIX_FMT "Disabling HI_RSSI, AP freq=%d, rssi=%d",
|
||||
CM_PREFIX_REF(req->vdev_id, req->cm_id),
|
||||
req->bss->entry->channel.chan_freq,
|
||||
req->bss->entry->rssi_raw);
|
||||
|
||||
if (rso_cfg->assoc_ie.ptr) {
|
||||
join_req->assoc_ie.ptr = qdf_mem_malloc(rso_cfg->assoc_ie.len);
|
||||
if (!join_req->assoc_ie.ptr)
|
||||
return QDF_STATUS_E_NOMEM;
|
||||
qdf_mem_copy(join_req->assoc_ie.ptr, rso_cfg->assoc_ie.ptr,
|
||||
rso_cfg->assoc_ie.len);
|
||||
join_req->assoc_ie.len = rso_cfg->assoc_ie.len;
|
||||
}
|
||||
|
||||
join_req->entry = util_scan_copy_cache_entry(req->bss->entry);
|
||||
if (!join_req->entry) {
|
||||
mlme_err(CM_PREFIX_FMT "Failed to copy scan entry",
|
||||
CM_PREFIX_REF(req->vdev_id, req->cm_id));
|
||||
cm_free_join_req(join_req);
|
||||
return QDF_STATUS_E_NOMEM;
|
||||
}
|
||||
join_req->vdev_id = req->vdev_id;
|
||||
join_req->cm_id = req->cm_id;
|
||||
|
||||
status = cm_csr_handle_join_req(vdev, NULL, join_req, true);
|
||||
if (QDF_IS_STATUS_ERROR(status)) {
|
||||
mlme_err(CM_PREFIX_FMT "fail to fill params from legacy",
|
||||
CM_PREFIX_REF(req->vdev_id, req->cm_id));
|
||||
cm_free_join_req(join_req);
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
wlan_rec_conn_info(req->vdev_id, DEBUG_CONN_CONNECTING,
|
||||
req->bss->entry->bssid.bytes,
|
||||
req->bss->entry->neg_sec_info.key_mgmt,
|
||||
req->bss->entry->channel.chan_freq);
|
||||
|
||||
msg.bodyptr = join_req;
|
||||
msg.type = CM_REASSOC_REQ;
|
||||
msg.flush_callback = cm_flush_join_req;
|
||||
|
||||
status = scheduler_post_message(QDF_MODULE_ID_MLME,
|
||||
QDF_MODULE_ID_PE,
|
||||
QDF_MODULE_ID_PE, &msg);
|
||||
if (QDF_IS_STATUS_ERROR(status)) {
|
||||
mlme_err(CM_PREFIX_FMT "msg post fail",
|
||||
CM_PREFIX_REF(req->vdev_id, req->cm_id));
|
||||
cm_free_join_req(join_req);
|
||||
}
|
||||
|
||||
if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE)
|
||||
wlan_register_txrx_packetdump(OL_TXRX_PDEV_ID);
|
||||
|
||||
return status;
|
||||
}
|
||||
#endif
|
||||
|
||||
QDF_STATUS
|
||||
cm_send_bss_peer_create_req(struct wlan_objmgr_vdev *vdev,
|
||||
struct qdf_mac_addr *peer_mac)
|
||||
|
@@ -599,6 +599,28 @@ bool wlan_cm_is_auth_type_11r(struct wlan_mlme_psoc_ext_obj *mlme_obj,
|
||||
return cm_is_auth_type_11r(mlme_obj, vdev, mdie_present);
|
||||
}
|
||||
|
||||
#ifdef FEATURE_WLAN_ESE
|
||||
bool
|
||||
cm_ese_open_present(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_mlme_psoc_ext_obj *mlme_obj,
|
||||
bool ese_version_present);
|
||||
bool
|
||||
cm_is_ese_connection(struct wlan_objmgr_vdev *vdev, bool ese_version_present);
|
||||
#else
|
||||
static inline bool
|
||||
cm_ese_open_present(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_mlme_psoc_ext_obj *mlme_obj,
|
||||
bool ese_version_present)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
static inline bool
|
||||
cm_is_ese_connection(struct wlan_objmgr_vdev *vdev, bool ese_version_present)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* cm_roam_start_init_on_connect() - init roaming
|
||||
* @pdev: pdev pointer
|
||||
@@ -608,6 +630,10 @@ bool wlan_cm_is_auth_type_11r(struct wlan_mlme_psoc_ext_obj *mlme_obj,
|
||||
*/
|
||||
void cm_roam_start_init_on_connect(struct wlan_objmgr_pdev *pdev,
|
||||
uint8_t vdev_id);
|
||||
|
||||
void cm_update_session_assoc_ie(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
struct element_info *assoc_ie);
|
||||
#ifdef FEATURE_CM_ENABLE
|
||||
/**
|
||||
* wlan_cm_roam_invoke() - Validate and send Roam invoke req to CM
|
||||
|
@@ -97,6 +97,22 @@ ucfg_cm_rso_set_roam_trigger(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
|
||||
return wlan_cm_rso_set_roam_trigger(pdev, vdev_id, trigger);
|
||||
}
|
||||
|
||||
/**
|
||||
* ucfg_cm_update_session_assoc_ie() - Send assoc ie
|
||||
* @psoc: Pointer to psoc
|
||||
* @vdev_id: vdev id
|
||||
* @assoc_ie: assoc ir to update.
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
static inline void
|
||||
ucfg_cm_update_session_assoc_ie(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id,
|
||||
struct element_info *assoc_ie)
|
||||
{
|
||||
cm_update_session_assoc_ie(psoc, vdev_id, assoc_ie);
|
||||
}
|
||||
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
static inline QDF_STATUS
|
||||
ucfg_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc,
|
||||
|
在新工单中引用
屏蔽一个用户