qcacmn: Replace wlan_cm_roam_resp struct with wlan_cm_connect_resp

Structure wlan_cm_roam_resp and wlan_cm_connect_resp are identical
structures and in current code these structures are used for connect
and reassoc functionalities with different functions as these are
identical structures and only one structure can be used to reduce
the duplication of the code.

To address this code duplication issue replace wlan_cm_roam_resp
structure with wlan_cm_connect_resp.

Change-Id: I90949c25f46acd2fa78cebb70c9a04f0718b90c4
CRs-Fixed: 2875232
This commit is contained in:
Ashish Kumar Dhanotiya
2021-02-08 14:20:24 +05:30
committed by snandini
parent 6c6f067b65
commit ad9b0c99d0
15 changed files with 242 additions and 365 deletions

View File

@@ -183,22 +183,6 @@ typedef QDF_STATUS (*osif_cm_set_hlp_data_cb)(struct net_device *dev,
struct wlan_cm_connect_resp *rsp);
#endif
/**
* typedef osif_cm_reassoc_comp_cb - Reassoc complete callback
* @vdev: vdev pointer
* @rsp: Reassoc response
* @type: indicates update type
*
* This callback indicates reassoc complete to the legacy module
*
* Context: Any context.
* Return: QDF_STATUS
*/
typedef QDF_STATUS
(*osif_cm_reassoc_comp_cb)(struct wlan_objmgr_vdev *vdev,
struct wlan_cm_roam_resp *rsp,
enum osif_cb_type type);
/**
* typedef osif_cm_disconnect_comp_cb: Disonnect complete callback
* @vdev: vdev pointer
@@ -261,19 +245,18 @@ void osif_cm_unlink_bss(struct wlan_objmgr_vdev *vdev,
/**
* osif_cm_ops: connection manager legacy callbacks
* osif_cm_connect_comp_cb: callback for connect complete to legacy
* @osif_cm_connect_comp_cb: callback for connect complete to legacy
* modules
* osif_cm_disconnect_comp_cb: callback for disconnect complete to
* @osif_cm_disconnect_comp_cb: callback for disconnect complete to
* legacy modules
* osif_cm_reassoc_comp_cb: callback for reassoc complete to legacy
* modules
* osif_cm_netif_queue_ctrl_cb: callback to legacy module to take
* @osif_cm_netif_queue_ctrl_cb: callback to legacy module to take
* actions on netif queue
* @save_gtk_cb : callback to legacy module to save gtk
* @set_hlp_data_cb: callback to legacy module to save hlp data
*/
struct osif_cm_ops {
osif_cm_connect_comp_cb connect_complete_cb;
osif_cm_disconnect_comp_cb disconnect_complete_cb;
osif_cm_reassoc_comp_cb reassoc_complete_cb;
#ifdef CONN_MGR_ADV_FEATURE
osif_cm_netif_queue_ctrl_cb netif_queue_control_cb;
#endif
@@ -299,22 +282,6 @@ QDF_STATUS osif_cm_connect_comp_ind(struct wlan_objmgr_vdev *vdev,
struct wlan_cm_connect_resp *rsp,
enum osif_cb_type type);
/**
* osif_cm_reassoc_comp_ind() - Function to indicate reassoc
* complete to legacy module
* @vdev: vdev pointer
* @rsp: Roam response
* @type: indicates update type
*
* This function indicates connect complete to the legacy module
*
* Context: Any context.
* Return: QDF_STATUS
*/
QDF_STATUS osif_cm_reassoc_comp_ind(struct wlan_objmgr_vdev *vdev,
struct wlan_cm_roam_resp *rsp,
enum osif_cb_type type);
/**
* osif_cm_disconnect_comp_ind() - Function to indicate disconnect
* complete to legacy module

View File

@@ -30,18 +30,9 @@
#include "wlan_cfg80211_scan.h"
#ifdef CONN_MGR_ADV_FEATURE
/**
* osif_cm_get_assoc_req_ie_data() - Get the assoc req IE offset and length
* if valid assoc req is present
* @assoc_req: assoc req info
* @ie_data_len: IE date length to be calculated
* @ie_data_ptr: IE data pointer to be calculated
*
* Return: void
*/
static void osif_cm_get_assoc_req_ie_data(struct element_info *assoc_req,
size_t *ie_data_len,
const uint8_t **ie_data_ptr)
void osif_cm_get_assoc_req_ie_data(struct element_info *assoc_req,
size_t *ie_data_len,
const uint8_t **ie_data_ptr)
{
/* Validate IE and length */
if (!assoc_req->len || !assoc_req->ptr ||
@@ -52,18 +43,9 @@ static void osif_cm_get_assoc_req_ie_data(struct element_info *assoc_req,
*ie_data_ptr = assoc_req->ptr + WLAN_ASSOC_REQ_IES_OFFSET;
}
/**
* osif_cm_get_assoc_rsp_ie_data() - Get the assoc resp IE offset and length
* if valid assoc req is present
* @assoc_req: assoc req info
* @ie_data_len: IE date length to be calculated
* @ie_data_ptr: IE data pointer to be calculated
*
* Return: void
*/
static void osif_cm_get_assoc_rsp_ie_data(struct element_info *assoc_rsp,
size_t *ie_data_len,
const uint8_t **ie_data_ptr)
void osif_cm_get_assoc_rsp_ie_data(struct element_info *assoc_rsp,
size_t *ie_data_len,
const uint8_t **ie_data_ptr)
{
/* Validate IE and length */
if (!assoc_rsp->len || !assoc_rsp->ptr ||
@@ -76,17 +58,17 @@ static void osif_cm_get_assoc_rsp_ie_data(struct element_info *assoc_rsp,
#else
static void osif_cm_get_assoc_req_ie_data(struct element_info *assoc_req,
size_t *ie_data_len,
const uint8_t **ie_data_ptr)
void osif_cm_get_assoc_req_ie_data(struct element_info *assoc_req,
size_t *ie_data_len,
const uint8_t **ie_data_ptr)
{
*ie_data_len = assoc_req->len;
*ie_data_ptr = assoc_req->ptr;
}
static void osif_cm_get_assoc_rsp_ie_data(struct element_info *assoc_rsp,
size_t *ie_data_len,
const uint8_t **ie_data_ptr)
void osif_cm_get_assoc_rsp_ie_data(struct element_info *assoc_rsp,
size_t *ie_data_len,
const uint8_t **ie_data_ptr)
{
*ie_data_len = assoc_rsp->len;
*ie_data_ptr = assoc_rsp->ptr;
@@ -111,20 +93,21 @@ osif_validate_connect_and_reset_src_id(struct vdev_osif_priv *osif_priv,
struct wlan_cm_connect_resp *rsp)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
/*
* Send to kernel only if last osif cookie match and
* source is CM_OSIF_CONNECT or CM_OSIF_CFG_CONNECT with failure
* else drop. If cookie match reset the cookie and source.
* Do not send to kernel if last osif cookie doesnt match or
* or source is CM_OSIF_CFG_CONNECT with success status.
* If cookie matches reset the cookie and source.
*/
qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock);
if (rsp->cm_id != osif_priv->cm_info.last_id ||
(osif_priv->cm_info.last_source != CM_OSIF_CONNECT &&
!(osif_priv->cm_info.last_source == CM_OSIF_CFG_CONNECT &&
QDF_IS_STATUS_ERROR(rsp->connect_status)))) {
osif_debug("Ignore as cm_id(0x%x)/src(%d) didn't match stored cm_id(0x%x)/src(%d)",
(osif_priv->cm_info.last_source == CM_OSIF_CFG_CONNECT &&
QDF_IS_STATUS_SUCCESS(rsp->connect_status))) {
osif_debug("Ignore as cm_id(0x%x)/src(%d) != cm_id(0x%x)/src(%d) OR source is CFG connect with status %d",
rsp->cm_id, CM_OSIF_CONNECT,
osif_priv->cm_info.last_id,
osif_priv->cm_info.last_source);
osif_priv->cm_info.last_source,
rsp->connect_status);
status = QDF_STATUS_E_INVAL;
goto rel_lock;
}
@@ -567,13 +550,13 @@ QDF_STATUS osif_connect_handler(struct wlan_objmgr_vdev *vdev,
struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
QDF_STATUS status;
osif_nofl_info("%s(vdevid-%d): " QDF_MAC_ADDR_FMT " Connect with " QDF_MAC_ADDR_FMT " SSID \"%.*s\" is %s cm_id 0x%x cm_reason %d status_code %d",
osif_nofl_info("%s(vdevid-%d): " QDF_MAC_ADDR_FMT " Connect with " QDF_MAC_ADDR_FMT " SSID \"%.*s\" is %s cm_id 0x%x cm_reason %d status_code %d is_reassoc %d",
osif_priv->wdev->netdev->name, rsp->vdev_id,
QDF_MAC_ADDR_REF(wlan_vdev_mlme_get_macaddr(vdev)),
QDF_MAC_ADDR_REF(rsp->bssid.bytes),
rsp->ssid.length, rsp->ssid.ssid,
rsp->connect_status ? "FAILURE" : "SUCCESS", rsp->cm_id,
rsp->reason, rsp->status_code);
rsp->reason, rsp->status_code, rsp->is_reassoc);
osif_check_and_unlink_bss(vdev, osif_priv, rsp);
@@ -584,7 +567,10 @@ QDF_STATUS osif_connect_handler(struct wlan_objmgr_vdev *vdev,
}
osif_cm_connect_comp_ind(vdev, rsp, OSIF_PRE_USERSPACE_UPDATE);
osif_indcate_connect_results(vdev, osif_priv, rsp);
if (rsp->is_reassoc)
osif_indicate_reassoc_results(vdev, osif_priv, rsp);
else
osif_indcate_connect_results(vdev, osif_priv, rsp);
osif_cm_connect_comp_ind(vdev, rsp, OSIF_POST_USERSPACE_UPDATE);
return QDF_STATUS_SUCCESS;

View File

@@ -29,67 +29,94 @@
#include <wlan_cfg80211.h>
#include <wlan_cfg80211_scan.h>
static QDF_STATUS
osif_validate_reassoc_and_reset_src_id(struct vdev_osif_priv *osif_priv,
wlan_cm_id cm_id)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock);
if (cm_id != osif_priv->cm_info.last_id) {
osif_debug("Ignore as cm_id(%d) didn't match stored cm_id(%d)",
cm_id, osif_priv->cm_info.last_id);
status = QDF_STATUS_E_INVAL;
goto rel_lock;
}
osif_cm_reset_id_and_src_no_lock(osif_priv);
rel_lock:
qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock);
return status;
}
#ifdef CONN_MGR_ADV_FEATURE
static void osif_indicate_reassoc_results(struct wlan_objmgr_vdev *vdev,
struct vdev_osif_priv *osif_priv,
struct wlan_cm_roam_resp *rsp)
#ifdef WLAN_FEATURE_FILS_SK
static inline void osif_update_fils_hlp_data(struct net_device *dev,
struct wlan_objmgr_vdev *vdev,
struct wlan_cm_connect_resp *rsp)
{
/*
* To notify kernel on connection completion
*/
if (rsp->connect_ies.fils_ie && rsp->connect_ies.fils_ie->hlp_data_len)
osif_cm_set_hlp_data(dev, vdev, rsp);
}
#else
static void osif_indicate_reassoc_results(struct wlan_objmgr_vdev *vdev,
struct vdev_osif_priv *osif_priv,
struct wlan_cm_roam_resp *rsp)
{}
static inline void osif_update_fils_hlp_data(struct net_device *dev,
struct wlan_objmgr_vdev *vdev,
struct wlan_cm_connect_resp *rsp)
{
}
#endif
QDF_STATUS osif_reassoc_handler(struct wlan_objmgr_vdev *vdev,
struct wlan_cm_roam_resp *rsp)
/**
* osif_roamed_ind() - send roamed indication to cfg80211
* @dev: network device
* @bss: cfg80211 roamed bss pointer
* @req_ie: IEs used in reassociation request
* @req_ie_len: Length of the @req_ie
* @resp_ie: IEs received in successful reassociation response
* @resp_ie_len: Length of @resp_ie
*
* Return: none
*/
#if defined CFG80211_ROAMED_API_UNIFIED || \
(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0))
static void osif_roamed_ind(struct net_device *dev, struct cfg80211_bss *bss,
const uint8_t *req_ie,
size_t req_ie_len, const uint8_t *resp_ie,
size_t resp_ie_len)
{
struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
QDF_STATUS status;
enum wlan_cm_source source;
struct cfg80211_roam_info info = {0};
osif_nofl_info("%s(vdevid-%d): " QDF_MAC_ADDR_FMT " Roam with " QDF_MAC_ADDR_FMT " SSID \"%.*s\" is %s cm_id %d cm_reason %d status_code %d",
osif_priv->wdev->netdev->name, rsp->vdev_id,
QDF_MAC_ADDR_REF(wlan_vdev_mlme_get_macaddr(vdev)),
QDF_MAC_ADDR_REF(rsp->bssid.bytes),
rsp->ssid.length, rsp->ssid.ssid,
rsp->reassoc_status ? "FAILURE" : "SUCCESS", rsp->cm_id,
rsp->reason, rsp->status_code);
source = osif_priv->cm_info.last_source;
status = osif_validate_reassoc_and_reset_src_id(osif_priv, rsp->cm_id);
if (QDF_IS_STATUS_ERROR(status)) {
osif_cm_reassoc_comp_ind(vdev, rsp, OSIF_NOT_HANDLED);
return status;
}
osif_cm_reassoc_comp_ind(vdev, rsp, OSIF_PRE_USERSPACE_UPDATE);
osif_indicate_reassoc_results(vdev, osif_priv, rsp);
osif_cm_reassoc_comp_ind(vdev, rsp, OSIF_POST_USERSPACE_UPDATE);
return QDF_STATUS_SUCCESS;
info.bss = bss;
info.req_ie = req_ie;
info.req_ie_len = req_ie_len;
info.resp_ie = resp_ie;
info.resp_ie_len = resp_ie_len;
cfg80211_roamed(dev, &info, GFP_KERNEL);
}
#else
static inline void osif_roamed_ind(struct net_device *dev,
struct cfg80211_bss *bss,
const uint8_t *req_ie, size_t req_ie_len,
const uint8_t *resp_ie,
size_t resp_ie_len)
{
cfg80211_roamed_bss(dev, bss, req_ie, req_ie_len, resp_ie, resp_ie_len,
GFP_KERNEL);
}
#endif
void osif_indicate_reassoc_results(struct wlan_objmgr_vdev *vdev,
struct vdev_osif_priv *osif_priv,
struct wlan_cm_connect_resp *rsp)
{
struct net_device *dev = osif_priv->wdev->netdev;
size_t req_len = 0;
const uint8_t *req_ie = NULL;
size_t rsp_len = 0;
const uint8_t *rsp_ie = NULL;
struct cfg80211_bss *bss;
struct ieee80211_channel *chan;
if (QDF_IS_STATUS_ERROR(rsp->connect_status))
return;
chan = ieee80211_get_channel(osif_priv->wdev->wiphy,
rsp->freq);
bss = wlan_cfg80211_get_bss(osif_priv->wdev->wiphy, chan,
rsp->bssid.bytes, rsp->ssid.ssid,
rsp->ssid.length);
if (!bss)
osif_warn("not able to find bss");
osif_cm_get_assoc_req_ie_data(&rsp->connect_ies.assoc_req,
&req_len, &req_ie);
osif_cm_get_assoc_rsp_ie_data(&rsp->connect_ies.assoc_rsp,
&rsp_len, &rsp_ie);
osif_roamed_ind(dev, bss, req_ie, req_len, rsp_ie, rsp_len);
osif_cm_save_gtk(vdev, rsp);
/* Add osif_send_roam_auth_event (wlan_hdd_send_roam_auth_event) */
osif_update_fils_hlp_data(dev, vdev, rsp);
}
#endif

View File

@@ -43,6 +43,32 @@
QDF_STATUS osif_disconnect_handler(struct wlan_objmgr_vdev *vdev,
struct wlan_cm_discon_rsp *rsp);
/**
* osif_cm_get_assoc_req_ie_data() - Get the assoc req IE offset and length
* if valid assoc req is present
* @assoc_req: assoc req info
* @ie_data_len: IE date length to be calculated
* @ie_data_ptr: IE data pointer to be calculated
*
* Return: void
*/
void osif_cm_get_assoc_req_ie_data(struct element_info *assoc_req,
size_t *ie_data_len,
const uint8_t **ie_data_ptr);
/**
* osif_cm_get_assoc_rsp_ie_data() - Get the assoc resp IE offset and length
* if valid assoc req is present
* @assoc_req: assoc req info
* @ie_data_len: IE date length to be calculated
* @ie_data_ptr: IE data pointer to be calculated
*
* Return: void
*/
void osif_cm_get_assoc_rsp_ie_data(struct element_info *assoc_rsp,
size_t *ie_data_len,
const uint8_t **ie_data_ptr);
/**
* osif_connect_handler() - API to send connect response to kernel
* @vdev: vdev pointer
@@ -56,18 +82,28 @@ QDF_STATUS osif_disconnect_handler(struct wlan_objmgr_vdev *vdev,
QDF_STATUS osif_connect_handler(struct wlan_objmgr_vdev *vdev,
struct wlan_cm_connect_resp *rsp);
#ifdef CONN_MGR_ADV_FEATURE
/**
* osif_reassoc_handler() - API to send reassoc response to kernel
* osif_indicate_reassoc_results() - API to send reassoc response to kernel
* @vdev: vdev pointer
* @rsp: Connection manager reassoc response
* @osif_priv: OS private structure of vdev
* @rsp: Connection manager response
*
* The API is used to send reassoc response to kernel
*
* Context: Any context.
* Return: QDF_STATUS
*/
QDF_STATUS osif_reassoc_handler(struct wlan_objmgr_vdev *vdev,
struct wlan_cm_roam_resp *rsp);
void osif_indicate_reassoc_results(struct wlan_objmgr_vdev *vdev,
struct vdev_osif_priv *osif_priv,
struct wlan_cm_connect_resp *rsp);
#else
static inline void
osif_indicate_reassoc_results(struct wlan_objmgr_vdev *vdev,
struct vdev_osif_priv *osif_priv,
struct wlan_cm_connect_resp *rsp)
{}
#endif
/**
* osif_failed_candidate_handler() - API to indicate individual candidate

View File

@@ -198,20 +198,6 @@ osif_cm_connect_complete_cb(struct wlan_objmgr_vdev *vdev,
return osif_connect_handler(vdev, rsp);
}
/**
* osif_cm_reassoc_complete_cb() - Reassoc complete callback
* @vdev: vdev pointer
* @rsp: Reassoc response
*
* Return: QDF_STATUS
*/
static QDF_STATUS
osif_cm_reassoc_complete_cb(struct wlan_objmgr_vdev *vdev,
struct wlan_cm_roam_resp *rsp)
{
return osif_reassoc_handler(vdev, rsp);
}
/**
* osif_cm_failed_candidate_cb() - Callback to indicate failed candidate
* @vdev: vdev pointer
@@ -332,7 +318,6 @@ static struct mlme_cm_ops cm_ops = {
.mlme_cm_update_id_and_src_cb = osif_cm_update_id_and_src_cb,
.mlme_cm_disconnect_complete_cb = osif_cm_disconnect_complete_cb,
.mlme_cm_disconnect_start_cb = osif_cm_disconnect_start_cb,
.mlme_cm_reassoc_complete_cb = osif_cm_reassoc_complete_cb,
};
/**
@@ -402,21 +387,6 @@ QDF_STATUS osif_cm_connect_comp_ind(struct wlan_objmgr_vdev *vdev,
return ret;
}
QDF_STATUS osif_cm_reassoc_comp_ind(struct wlan_objmgr_vdev *vdev,
struct wlan_cm_roam_resp *rsp,
enum osif_cb_type type)
{
osif_cm_reassoc_comp_cb cb = NULL;
QDF_STATUS ret = QDF_STATUS_SUCCESS;
if (osif_cm_legacy_ops)
cb = osif_cm_legacy_ops->reassoc_complete_cb;
if (cb)
ret = cb(vdev, rsp, type);
return ret;
}
QDF_STATUS osif_cm_disconnect_comp_ind(struct wlan_objmgr_vdev *vdev,
struct wlan_cm_discon_rsp *rsp,
enum osif_cb_type type)