From ea4722735d3ba0f7ecc1fe6e5a2c25e24c1fba9d Mon Sep 17 00:00:00 2001 From: Srinivas Dasari Date: Sun, 30 Jun 2019 11:35:07 +0530 Subject: [PATCH] qcacld-3.0: Forward disconnect IEs from deauth roam event to kernel Firmware sends roam event with reason WMI_ROAM_REASON_DEAUTH when it receives deauth/disassoc from the peer and fails to roam. The event also carries deauth/disassoc frame. A new param "notif_params1" is defined to carry length of the frame and a new TLV element "deauth_disassoc_frame" to carry the frame. Extract IEs from the frame when the event is received and send them to kernel through cfg80211_disconnected(). Change-Id: I14610136e5e9758403e48264d04d1655e4466d3c CRs-Fixed: 2481915 --- core/mac/inc/sir_api.h | 4 +++- core/mac/src/pe/include/lim_api.h | 10 ++++++++-- core/mac/src/pe/lim/lim_api.c | 6 +++++- core/wma/inc/wma.h | 4 +++- core/wma/inc/wma_types.h | 8 ++++++-- core/wma/src/wma_mgmt.c | 4 +++- core/wma/src/wma_scan_roam.c | 7 ++++++- 7 files changed, 34 insertions(+), 9 deletions(-) diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index b365ac9daefb..0587a5f8d0b9 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -376,7 +376,9 @@ struct sme_ready_req { QDF_STATUS (*sme_msg_cb)(struct mac_context *mac, struct scheduler_msg *msg); QDF_STATUS (*pe_disconnect_cb) (struct mac_context *mac, - uint8_t vdev_id); + uint8_t vdev_id, + uint8_t *deauth_disassoc_frame, + uint16_t deauth_disassoc_frame_len); }; /** diff --git a/core/mac/src/pe/include/lim_api.h b/core/mac/src/pe/include/lim_api.h index f4fb3cc8d132..b571468a64c3 100644 --- a/core/mac/src/pe/include/lim_api.h +++ b/core/mac/src/pe/include/lim_api.h @@ -289,11 +289,15 @@ pe_roam_synch_callback(struct mac_context *mac_ctx, * from firmware * @mac: pointer to global mac context * @vdev_id: VDEV in which the event was received + * @deauth_disassoc_frame: Deauth/disassoc frame received from firmware + * @deauth_disassoc_frame_len: Length of @deauth_disassoc_frame * * Return: QDF_STATUS */ QDF_STATUS -pe_disconnect_callback(struct mac_context *mac, uint8_t vdev_id); +pe_disconnect_callback(struct mac_context *mac, uint8_t vdev_id, + uint8_t *deauth_disassoc_frame, + uint16_t deauth_disassoc_frame_len); #else static inline QDF_STATUS @@ -306,7 +310,9 @@ pe_roam_synch_callback(struct mac_context *mac_ctx, } static inline QDF_STATUS -pe_disconnect_callback(struct mac_context *mac, uint8_t vdev_id) +pe_disconnect_callback(struct mac_context *mac, uint8_t vdev_id, + uint8_t *deauth_disassoc_frame, + uint16_t deauth_disassoc_frame_len) { return QDF_STATUS_E_NOSUPPORT; } diff --git a/core/mac/src/pe/lim/lim_api.c b/core/mac/src/pe/lim/lim_api.c index de398a8b5035..7d615c7aae7d 100644 --- a/core/mac/src/pe/lim/lim_api.c +++ b/core/mac/src/pe/lim/lim_api.c @@ -2261,7 +2261,9 @@ lim_copy_and_free_hlp_data_from_session(struct pe_session *session_ptr, #endif QDF_STATUS -pe_disconnect_callback(struct mac_context *mac, uint8_t vdev_id) +pe_disconnect_callback(struct mac_context *mac, uint8_t vdev_id, + uint8_t *deauth_disassoc_frame, + uint16_t deauth_disassoc_frame_len) { struct pe_session *session; @@ -2271,6 +2273,8 @@ pe_disconnect_callback(struct mac_context *mac, uint8_t vdev_id) return QDF_STATUS_E_FAILURE; } + lim_extract_ies_from_deauth_disassoc(session, deauth_disassoc_frame, + deauth_disassoc_frame_len); lim_tear_down_link_with_ap(mac, vdev_id, eSIR_MAC_UNSPEC_FAILURE_REASON); diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index 22ef23dfa82b..1f42c92b641e 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -1144,7 +1144,9 @@ typedef struct { struct bss_description *bss_desc_ptr, enum sir_roam_op_code reason); QDF_STATUS (*pe_disconnect_cb) (struct mac_context *mac, - uint8_t vdev_id); + uint8_t vdev_id, + uint8_t *deauth_disassoc_frame, + uint16_t deauth_disassoc_frame_len); qdf_wake_lock_t wmi_cmd_rsp_wake_lock; qdf_runtime_lock_t wmi_cmd_rsp_runtime_lock; qdf_runtime_lock_t sap_prevent_runtime_pm_lock; diff --git a/core/wma/inc/wma_types.h b/core/wma/inc/wma_types.h index 415a554139c9..6a8e96473f80 100644 --- a/core/wma/inc/wma_types.h +++ b/core/wma/inc/wma_types.h @@ -726,7 +726,9 @@ QDF_STATUS wma_register_roaming_callbacks( struct bss_description *bss_desc_ptr, enum sir_roam_op_code reason), QDF_STATUS (*pe_disconnect_cb) (struct mac_context *mac, - uint8_t vdev_id)); + uint8_t vdev_id, + uint8_t *deauth_disassoc_frame, + uint16_t deauth_disassoc_frame_len)); #else static inline QDF_STATUS wma_register_roaming_callbacks( QDF_STATUS (*csr_roam_synch_cb)(struct mac_context *mac, @@ -738,7 +740,9 @@ static inline QDF_STATUS wma_register_roaming_callbacks( struct bss_description *bss_desc_ptr, enum sir_roam_op_code reason), QDF_STATUS (*pe_disconnect_cb) (struct mac_context *mac, - uint8_t vdev_id)) + uint8_t vdev_id, + uint8_t *deauth_disassoc_frame, + uint16_t deauth_disassoc_frame_len)) { return QDF_STATUS_E_NOSUPPORT; } diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c index 38249c3dfae2..4f7f0788aca0 100644 --- a/core/wma/src/wma_mgmt.c +++ b/core/wma/src/wma_mgmt.c @@ -4405,7 +4405,9 @@ QDF_STATUS wma_register_roaming_callbacks( struct bss_description *bss_desc_ptr, enum sir_roam_op_code reason), QDF_STATUS (*pe_disconnect_cb) (struct mac_context *mac, - uint8_t vdev_id)) + uint8_t vdev_id, + uint8_t *deauth_disassoc_frame, + uint16_t deauth_disassoc_frame_len)) { tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA); diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index e01159eabd11..d6b3e06d1515 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -5237,6 +5237,7 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf, wmi_roam_event_fixed_param *wmi_event; struct roam_offload_synch_ind *roam_synch_data; enum sir_roam_op_code op_code = {0}; + uint8_t *frame = NULL; param_buf = (WMI_ROAM_EVENTID_param_tlvs *) event_buf; if (!param_buf) { @@ -5348,8 +5349,12 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf, case WMI_ROAM_REASON_DEAUTH: WMA_LOGD("%s: Received disconnect roam event reason:%d", __func__, wmi_event->notif); + + if (wmi_event->notif_params1) + frame = param_buf->deauth_disassoc_frame; wma_handle->pe_disconnect_cb(wma_handle->mac_context, - wmi_event->vdev_id); + wmi_event->vdev_id, + frame, wmi_event->notif_params1); break; default: WMA_LOGD("%s:Unhandled Roam Event %x for vdevid %x", __func__,