qcacmn: CM changes for ML connection
CM changes for ML connection Change-Id: I7718734b0f08c8e73702b2c1c7c297bf71b6b5e3
这个提交包含在:
@@ -28,6 +28,7 @@
|
||||
#include "osif_cm_util.h"
|
||||
#include "wlan_cfg80211.h"
|
||||
#include "wlan_cfg80211_scan.h"
|
||||
#include "wlan_mlo_mgr_sta.h"
|
||||
|
||||
#ifdef CONN_MGR_ADV_FEATURE
|
||||
void osif_cm_get_assoc_req_ie_data(struct element_info *assoc_req,
|
||||
@@ -472,6 +473,108 @@ static inline int osif_update_connect_results(struct net_device *dev,
|
||||
}
|
||||
#endif /* WLAN_FEATURE_FILS_SK && CFG80211_CONNECT_DONE */
|
||||
|
||||
#ifdef WLAN_FEATURE_11BE_MLO
|
||||
#ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
|
||||
static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
|
||||
struct vdev_osif_priv *osif_priv,
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{
|
||||
struct cfg80211_bss *bss = NULL;
|
||||
struct ieee80211_channel *chan;
|
||||
|
||||
if (QDF_IS_STATUS_SUCCESS(rsp->connect_status)) {
|
||||
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 (!wlan_vdev_mlme_is_mlo_vdev(vdev)) {
|
||||
if (osif_update_connect_results(osif_priv->wdev->netdev, bss,
|
||||
rsp, vdev))
|
||||
osif_connect_bss(osif_priv->wdev->netdev, bss, rsp);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev)) {
|
||||
if (osif_update_connect_results(
|
||||
osif_priv->wdev->netdev, bss,
|
||||
rsp, vdev))
|
||||
osif_connect_bss(osif_priv->wdev->netdev,
|
||||
bss, rsp);
|
||||
}
|
||||
|
||||
}
|
||||
#else /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */
|
||||
static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
|
||||
struct vdev_osif_priv *osif_priv,
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{
|
||||
struct cfg80211_bss *bss = NULL;
|
||||
struct ieee80211_channel *chan;
|
||||
struct wlan_objmgr_vdev *assoc_vdev = NULL;
|
||||
struct vdev_osif_priv *tmp_osif_priv = NULL;
|
||||
qdf_freq_t freq;
|
||||
struct qdf_mac_addr macaddr = {0};
|
||||
struct wlan_cm_connect_resp resp = {0};
|
||||
|
||||
if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) {
|
||||
if (QDF_IS_STATUS_SUCCESS(rsp->connect_status)) {
|
||||
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 (osif_update_connect_results(osif_priv->wdev->netdev, bss,
|
||||
rsp, vdev))
|
||||
osif_connect_bss(osif_priv->wdev->netdev, bss, rsp);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((QDF_IS_STATUS_SUCCESS(rsp->connect_status) &&
|
||||
ucfg_mlo_is_mld_connected(vdev)) ||
|
||||
(QDF_IS_STATUS_ERROR(rsp->connect_status) &&
|
||||
ucfg_mlo_is_mld_disconnected(vdev))) {
|
||||
assoc_vdev = ucfg_mlo_get_assoc_link_vdev(vdev);
|
||||
if (!assoc_vdev)
|
||||
return;
|
||||
tmp_osif_priv = wlan_vdev_get_ospriv(assoc_vdev);
|
||||
freq = vdev->vdev_mlme.bss_chan->ch_freq;
|
||||
wlan_vdev_get_bss_peer_mac(assoc_vdev, &macaddr);
|
||||
if (QDF_IS_STATUS_SUCCESS(rsp->connect_status)) {
|
||||
chan = ieee80211_get_channel(tmp_osif_priv->wdev->wiphy,
|
||||
freq);
|
||||
bss = wlan_cfg80211_get_bss(tmp_osif_priv->wdev->wiphy,
|
||||
chan,
|
||||
macaddr.bytes,
|
||||
rsp->ssid.ssid,
|
||||
rsp->ssid.length);
|
||||
}
|
||||
qdf_mem_copy(resp.bssid.bytes, macaddr.bytes,
|
||||
QDF_MAC_ADDR_SIZE);
|
||||
qdf_mem_copy(resp.ssid.ssid, rsp->ssid.ssid,
|
||||
rsp->ssid.length);
|
||||
resp.ssid.length = rsp->ssid.length;
|
||||
resp.freq = freq;
|
||||
resp.connect_status = rsp->connect_status;
|
||||
resp.reason = rsp->reason;
|
||||
resp.status_code = rsp->status_code;
|
||||
resp.connect_ies.assoc_req.ptr = rsp->connect_ies.assoc_req.ptr;
|
||||
resp.connect_ies.assoc_req.len = rsp->connect_ies.assoc_req.len;
|
||||
resp.connect_ies.assoc_rsp.ptr = rsp->connect_ies.assoc_rsp.ptr;
|
||||
resp.connect_ies.assoc_rsp.len = rsp->connect_ies.assoc_rsp.len;
|
||||
if (osif_update_connect_results(tmp_osif_priv->wdev->netdev, bss,
|
||||
&resp, vdev))
|
||||
osif_connect_bss(tmp_osif_priv->wdev->netdev, bss, &resp);
|
||||
}
|
||||
}
|
||||
#endif /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */
|
||||
#else /* WLAN_FEATURE_11BE_MLO */
|
||||
static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
|
||||
struct vdev_osif_priv *osif_priv,
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
@@ -492,7 +595,81 @@ static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
|
||||
rsp, vdev))
|
||||
osif_connect_bss(osif_priv->wdev->netdev, bss, rsp);
|
||||
}
|
||||
#endif /* WLAN_FEATURE_11BE_MLO */
|
||||
#else /* CFG80211_CONNECT_BSS */
|
||||
#ifdef WLAN_FEATURE_11BE_MLO
|
||||
#ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
|
||||
static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
|
||||
struct vdev_osif_priv *osif_priv,
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{
|
||||
enum ieee80211_statuscode status;
|
||||
size_t req_len = 0;
|
||||
const uint8_t *req_ptr = NULL;
|
||||
size_t rsp_len = 0;
|
||||
const uint8_t *rsp_ptr = NULL;
|
||||
struct wlan_objmgr_vdev *assoc_vdev = NULL;
|
||||
struct vdev_osif_priv *tmp_osif_priv = NULL;
|
||||
|
||||
status = osif_get_connect_status_code(rsp);
|
||||
osif_cm_get_assoc_req_ie_data(&rsp->connect_ies.assoc_req,
|
||||
&req_len, &req_ptr);
|
||||
osif_cm_get_assoc_rsp_ie_data(&rsp->connect_ies.assoc_rsp,
|
||||
&rsp_len, &rsp_ptr);
|
||||
if (wlan_vdev_mlme_is_mlo_vdev(vdev)) {
|
||||
if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev))
|
||||
cfg80211_connect_result(
|
||||
osif_priv->wdev->netdev,
|
||||
rsp->bssid.bytes, req_ptr, req_len,
|
||||
rsp_ptr, rsp_len, status, GFP_KERNEL);
|
||||
} else {
|
||||
cfg80211_connect_result(osif_priv->wdev->netdev,
|
||||
rsp->bssid.bytes, req_ptr, req_len,
|
||||
rsp_ptr, rsp_len, status, GFP_KERNEL);
|
||||
}
|
||||
}
|
||||
#else /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */
|
||||
static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
|
||||
struct vdev_osif_priv *osif_priv,
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
{
|
||||
enum ieee80211_statuscode status;
|
||||
size_t req_len = 0;
|
||||
const uint8_t *req_ptr = NULL;
|
||||
size_t rsp_len = 0;
|
||||
const uint8_t *rsp_ptr = NULL;
|
||||
struct wlan_objmgr_vdev *assoc_vdev = NULL;
|
||||
struct vdev_osif_priv *tmp_osif_priv = NULL;
|
||||
struct qdf_mac_addr macaddr = {0};
|
||||
|
||||
status = osif_get_connect_status_code(rsp);
|
||||
osif_cm_get_assoc_req_ie_data(&rsp->connect_ies.assoc_req,
|
||||
&req_len, &req_ptr);
|
||||
osif_cm_get_assoc_rsp_ie_data(&rsp->connect_ies.assoc_rsp,
|
||||
&rsp_len, &rsp_ptr);
|
||||
if (wlan_vdev_mlme_is_mlo_vdev(vdev)) {
|
||||
if ((QDF_IS_STATUS_SUCCESS(rsp->connect_status) &&
|
||||
ucfg_mlo_is_mld_connected(vdev)) ||
|
||||
(QDF_IS_STATUS_ERROR(rsp->connect_status) &&
|
||||
ucfg_mlo_is_mld_disconnected(vdev))) {
|
||||
assoc_vdev = ucfg_mlo_get_assoc_link_vdev(vdev);
|
||||
if (!assoc_vdev)
|
||||
return;
|
||||
tmp_osif_priv = wlan_vdev_get_ospriv(assoc_vdev);
|
||||
wlan_vdev_get_bss_peer_mac(assoc_vdev, &macaddr);
|
||||
cfg80211_connect_result(tmp_osif_priv->wdev->netdev,
|
||||
macaddr.bytes, req_ptr,
|
||||
req_len, rsp_ptr, rsp_len,
|
||||
status, GFP_KERNEL);
|
||||
}
|
||||
} else {
|
||||
cfg80211_connect_result(osif_priv->wdev->netdev,
|
||||
rsp->bssid.bytes, req_ptr, req_len,
|
||||
rsp_ptr, rsp_len, status, GFP_KERNEL);
|
||||
}
|
||||
}
|
||||
#endif /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */
|
||||
#else /* WLAN_FEATURE_11BE_MLO */
|
||||
static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
|
||||
struct vdev_osif_priv *osif_priv,
|
||||
struct wlan_cm_connect_resp *rsp)
|
||||
@@ -512,6 +689,7 @@ static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
|
||||
rsp->bssid.bytes, req_ptr, req_len,
|
||||
rsp_ptr, rsp_len, status, GFP_KERNEL);
|
||||
}
|
||||
#endif /* WLAN_FEATURE_11BE_MLO */
|
||||
#endif /* CFG80211_CONNECT_BSS */
|
||||
|
||||
#ifdef CONN_MGR_ADV_FEATURE
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#include "osif_cm_rsp.h"
|
||||
#include "wlan_osif_priv.h"
|
||||
#include "osif_cm_util.h"
|
||||
#include "wlan_mlo_mgr_sta.h"
|
||||
|
||||
/**
|
||||
* osif_validate_disconnect_and_reset_src_id() - Validate disconnection
|
||||
@@ -78,17 +79,69 @@ rel_lock:
|
||||
|
||||
#if defined(CFG80211_DISCONNECTED_V2) || \
|
||||
(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0))
|
||||
#ifdef WLAN_FEATURE_11BE_MLO
|
||||
#ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
|
||||
static void
|
||||
osif_cm_indicate_disconnect(struct net_device *dev,
|
||||
osif_cm_indicate_disconnect(struct wlan_objmgr_vdev *vdev,
|
||||
struct net_device *dev,
|
||||
enum ieee80211_reasoncode reason,
|
||||
bool locally_generated, const u8 *ie,
|
||||
size_t ie_len, gfp_t gfp)
|
||||
{
|
||||
if (wlan_vdev_mlme_is_mlo_vdev(vdev)) {
|
||||
if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev))
|
||||
cfg80211_disconnected(dev, reason, ie,
|
||||
ie_len, locally_generated, gfp);
|
||||
} else {
|
||||
cfg80211_disconnected(dev, reason, ie,
|
||||
ie_len, locally_generated, gfp);
|
||||
}
|
||||
}
|
||||
#else /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */
|
||||
static void
|
||||
osif_cm_indicate_disconnect(struct wlan_objmgr_vdev *vdev,
|
||||
struct net_device *dev,
|
||||
enum ieee80211_reasoncode reason,
|
||||
bool locally_generated, const u8 *ie,
|
||||
size_t ie_len, gfp_t gfp)
|
||||
{
|
||||
struct net_device *netdev = dev;
|
||||
struct vdev_osif_priv *osif_priv = NULL;
|
||||
struct wlan_objmgr_vdev *assoc_vdev = NULL;
|
||||
|
||||
if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) {
|
||||
cfg80211_disconnected(netdev, reason, ie, ie_len,
|
||||
locally_generated, gfp);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ucfg_mlo_is_mld_disconnected(vdev)) {
|
||||
assoc_vdev = ucfg_mlo_get_assoc_link_vdev(vdev);
|
||||
if (!assoc_vdev)
|
||||
return;
|
||||
osif_priv = wlan_vdev_get_ospriv(assoc_vdev);
|
||||
netdev = osif_priv->wdev->netdev;
|
||||
cfg80211_disconnected(netdev, reason,
|
||||
ie, ie_len,
|
||||
locally_generated, gfp);
|
||||
}
|
||||
}
|
||||
#endif /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */
|
||||
#else /* WLAN_FEATURE_11BE_MLO */
|
||||
static void
|
||||
osif_cm_indicate_disconnect(struct wlan_objmgr_vdev *vdev,
|
||||
struct net_device *dev,
|
||||
enum ieee80211_reasoncode reason,
|
||||
bool locally_generated, const u8 *ie,
|
||||
size_t ie_len, gfp_t gfp)
|
||||
{
|
||||
cfg80211_disconnected(dev, reason, ie, ie_len, locally_generated, gfp);
|
||||
}
|
||||
#endif /* WLAN_FEATURE_11BE_MLO */
|
||||
#else
|
||||
static void
|
||||
osif_cm_indicate_disconnect(struct net_device *dev,
|
||||
osif_cm_indicate_disconnect(struct wlan_objmgr_vdev *vdev,
|
||||
struct net_device *dev,
|
||||
enum ieee80211_reasoncode reason,
|
||||
bool locally_generated, const u8 *ie,
|
||||
size_t ie_len, gfp_t gfp)
|
||||
@@ -175,8 +228,9 @@ QDF_STATUS osif_disconnect_handler(struct wlan_objmgr_vdev *vdev,
|
||||
}
|
||||
|
||||
osif_cm_disconnect_comp_ind(vdev, rsp, OSIF_PRE_USERSPACE_UPDATE);
|
||||
osif_cm_indicate_disconnect(osif_priv->wdev->netdev, ieee80211_reason,
|
||||
locally_generated, rsp->ap_discon_ie.ptr,
|
||||
osif_cm_indicate_disconnect(vdev, osif_priv->wdev->netdev,
|
||||
ieee80211_reason, locally_generated,
|
||||
rsp->ap_discon_ie.ptr,
|
||||
rsp->ap_discon_ie.len, GFP_KERNEL);
|
||||
|
||||
osif_cm_disconnect_comp_ind(vdev, rsp, OSIF_POST_USERSPACE_UPDATE);
|
||||
|
@@ -30,6 +30,7 @@
|
||||
#ifdef WLAN_FEATURE_FILS_SK
|
||||
#include <wlan_mlme_ucfg_api.h>
|
||||
#endif
|
||||
#include <wlan_mlo_mgr_sta.h>
|
||||
|
||||
static void osif_cm_free_wep_key_params(struct wlan_cm_connect_req *connect_req)
|
||||
{
|
||||
@@ -431,6 +432,21 @@ static void osif_cm_free_connect_req(struct wlan_cm_connect_req *connect_req)
|
||||
qdf_mem_free(connect_req);
|
||||
}
|
||||
|
||||
#ifdef WLAN_FEATURE_11BE_MLO
|
||||
static inline
|
||||
void osif_update_mlo_partner_info(struct wlan_cm_connect_req *connect_req,
|
||||
const struct cfg80211_connect_params *req)
|
||||
{
|
||||
//Update ml partner info in connect_req
|
||||
}
|
||||
#else
|
||||
static inline
|
||||
void osif_update_mlo_partner_info(struct wlan_cm_connect_req *connect_req,
|
||||
const struct cfg80211_connect_params *req)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
int osif_cm_connect(struct net_device *dev, struct wlan_objmgr_vdev *vdev,
|
||||
const struct cfg80211_connect_params *req,
|
||||
const struct osif_connect_params *params)
|
||||
@@ -526,7 +542,9 @@ int osif_cm_connect(struct net_device *dev, struct wlan_objmgr_vdev *vdev,
|
||||
|
||||
osif_cm_fill_connect_params(connect_req, params);
|
||||
|
||||
status = ucfg_cm_start_connect(vdev, connect_req);
|
||||
osif_update_mlo_partner_info(connect_req, req);
|
||||
|
||||
status = mlo_connect(vdev, connect_req);
|
||||
if (QDF_IS_STATUS_ERROR(status))
|
||||
osif_err("Connect failed with status %d", status);
|
||||
|
||||
@@ -540,21 +558,12 @@ static QDF_STATUS osif_cm_send_disconnect(struct wlan_objmgr_vdev *vdev,
|
||||
uint16_t reason)
|
||||
{
|
||||
QDF_STATUS status;
|
||||
struct wlan_cm_disconnect_req *req;
|
||||
|
||||
status = osif_cm_reset_id_and_src(vdev);
|
||||
if (QDF_IS_STATUS_ERROR(status))
|
||||
return qdf_status_to_os_return(status);
|
||||
|
||||
req = qdf_mem_malloc(sizeof(*req));
|
||||
if (!req)
|
||||
return QDF_STATUS_E_NOMEM;
|
||||
|
||||
req->vdev_id = wlan_vdev_get_id(vdev);
|
||||
req->source = CM_OSIF_DISCONNECT;
|
||||
req->reason_code = reason;
|
||||
status = ucfg_cm_start_disconnect(vdev, req);
|
||||
qdf_mem_free(req);
|
||||
status = mlo_disconnect(vdev, CM_OSIF_DISCONNECT, reason, NULL);
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -584,7 +593,7 @@ int osif_cm_disconnect_sync(struct wlan_objmgr_vdev *vdev, uint16_t reason)
|
||||
osif_info("vdevid-%d: Received Disconnect reason:%d %s",
|
||||
vdev_id, reason, ucfg_cm_reason_code_to_str(reason));
|
||||
|
||||
status = ucfg_cm_disconnect_sync(vdev, CM_OSIF_DISCONNECT, reason);
|
||||
status = mlo_sync_disconnect(vdev, CM_OSIF_DISCONNECT, reason, NULL);
|
||||
|
||||
return qdf_status_to_os_return(status);
|
||||
}
|
||||
|
在新工单中引用
屏蔽一个用户