qcacmn: Remove self_reassoc in LFR2

On reception of reassoc req from user space to the
connected AP, wlan driver proceeds with reassociation
without clearing the keys. This leads to encrypted EAPOL
frames in LFR2. To avoid this, trigger disconnect & delete
keys before proceeding with reassociation.

Change-Id: I02536a0049517ff5e8459834df493dccbf5a7a62
CRs-Fixed: 3433224
This commit is contained in:
Gangadhar Kavalastramath
2023-04-18 16:51:55 +05:30
committato da Rahul Choudhary
parent c922aed7f2
commit ad4dd18f1b
2 ha cambiato i file con 3 aggiunte e 41 eliminazioni

Vedi File

@@ -262,31 +262,8 @@ QDF_STATUS cm_handle_reassoc_timer(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id)
static QDF_STATUS cm_host_roam_start(struct cnx_mgr *cm_ctx,
struct cm_req *cm_req)
{
struct wlan_cm_roam_req *req;
struct qdf_mac_addr connected_bssid;
req = &cm_req->roam_req.req;
wlan_vdev_get_bss_peer_mac(cm_ctx->vdev, &connected_bssid);
if (qdf_is_macaddr_equal(&req->bssid, &connected_bssid)) {
mlme_info(CM_PREFIX_FMT "Self reassoc with" QDF_MAC_ADDR_FMT,
CM_PREFIX_REF(wlan_vdev_get_id(cm_ctx->vdev),
cm_req->cm_id),
QDF_MAC_ADDR_REF(req->bssid.bytes));
req->self_reassoc = true;
}
/* if self reassoc continue with reassoc and skip preauth */
if (req->self_reassoc)
return cm_sm_deliver_event_sync(cm_ctx,
WLAN_CM_SM_EV_START_REASSOC,
sizeof(cm_req->roam_req),
&cm_req->roam_req);
/*
* if not self reassoc reset cur candidate to perform preauth with
* all candidate.
*/
cm_req->roam_req.cur_candidate = NULL;
return cm_host_roam_preauth_start(cm_ctx, cm_req);
}
@@ -364,10 +341,6 @@ QDF_STATUS cm_reassoc_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id)
cm_ctx->active_cm_id = *cm_id;
/* For self reassoc no need to disconnect or create peer */
if (cm_req->roam_req.req.self_reassoc)
return cm_resume_reassoc_after_peer_create(cm_ctx, cm_id);
qdf_mem_zero(&req, sizeof(req));
req.cm_id = *cm_id;
req.req.vdev_id = wlan_vdev_get_id(cm_ctx->vdev);
@@ -433,7 +406,6 @@ cm_resume_reassoc_after_peer_create(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id)
req->vdev_id = wlan_vdev_get_id(cm_ctx->vdev);
req->cm_id = *cm_id;
req->self_reassoc = cm_req->roam_req.req.self_reassoc;
req->bss = cm_req->roam_req.cur_candidate;
mlme_nofl_info(CM_PREFIX_FMT "Reassoc to " QDF_SSID_FMT " " QDF_MAC_ADDR_FMT " rssi: %d freq: %d source %d",
@@ -449,9 +421,7 @@ cm_resume_reassoc_after_peer_create(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id)
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err(CM_PREFIX_FMT "Reassoc request failed",
CM_PREFIX_REF(req->vdev_id, req->cm_id));
/* Delete peer only if not self reassoc */
if (!cm_req->roam_req.req.self_reassoc)
mlme_cm_bss_peer_delete_req(cm_ctx->vdev);
mlme_cm_bss_peer_delete_req(cm_ctx->vdev);
status = cm_send_reassoc_start_fail(cm_ctx, *cm_id,
CM_JOIN_FAILED, true);
}
@@ -802,10 +772,6 @@ cm_check_for_reassoc_hw_mode_change(struct cnx_mgr *cm_ctx,
if (!cm_req->cur_candidate)
return QDF_STATUS_E_EMPTY;
/* HW mode change not required for self reassoc */
if (cm_req->req.self_reassoc)
return QDF_STATUS_E_ALREADY;
candidate_freq = cm_req->cur_candidate->entry->channel.chan_freq;
status = policy_mgr_handle_conc_multiport(
psoc, cm_req->req.vdev_id,

Vedi File

@@ -293,7 +293,6 @@ struct wlan_cm_vdev_connect_req {
/**
* struct wlan_cm_roam_req - roam req from requester
* @forced_roaming: Roaming to be done without giving bssid, and channel.
* @self_reassoc: used to determine self reassoc in host roaming
* @vdev_id: vdev id
* @source: source of the req
* @bssid: bssid given
@@ -301,8 +300,7 @@ struct wlan_cm_vdev_connect_req {
* @chan_freq: channel of the AP
*/
struct wlan_cm_roam_req {
uint8_t forced_roaming:1,
self_reassoc:1;
uint8_t forced_roaming:1;
uint8_t vdev_id;
enum wlan_cm_source source;
struct qdf_mac_addr bssid;
@@ -315,14 +313,12 @@ struct wlan_cm_roam_req {
* vdev mgr
* @vdev_id: vdev id
* @cm_id: Connect manager id
* @self_reassoc: if self reassoc
* @prev_bssid: previous BSSID
* @bss: scan entry for the candidate
*/
struct wlan_cm_vdev_reassoc_req {
uint8_t vdev_id;
wlan_cm_id cm_id;
bool self_reassoc;
struct qdf_mac_addr prev_bssid;
struct scan_cache_node *bss;
};