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
这个提交包含在:
Utkarsh Bhatnagar
2021-05-06 12:45:50 +05:30
提交者 Madan Koyyalamudi
父节点 1822c0e153
当前提交 cd22a0f327
修改 19 个文件,包含 853 行新增250 行删除

查看文件

@@ -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,