qcacld-3.0: Do not kickout sta if it is in band steering
When a sta is being steered, sending a deauth may interrupt the association/EAPOL handshake on the new BSS. Do not kickout sta if it is being steered. Change-Id: I15dd26bca27699087cdb790de8cb95281dade385 CRs-Fixed: 3042990
This commit is contained in:
@@ -138,6 +138,8 @@ struct sae_auth_retry {
|
|||||||
* @last_assoc_received_time: last assoc received time
|
* @last_assoc_received_time: last assoc received time
|
||||||
* @last_disassoc_deauth_received_time: last disassoc/deauth received time
|
* @last_disassoc_deauth_received_time: last disassoc/deauth received time
|
||||||
* @twt_ctx: TWT context
|
* @twt_ctx: TWT context
|
||||||
|
* @allow_kickout: True if the peer can be kicked out. Peer can't be kicked
|
||||||
|
* out if it is being steered
|
||||||
*/
|
*/
|
||||||
struct peer_mlme_priv_obj {
|
struct peer_mlme_priv_obj {
|
||||||
uint8_t last_pn_valid;
|
uint8_t last_pn_valid;
|
||||||
@@ -149,6 +151,9 @@ struct peer_mlme_priv_obj {
|
|||||||
#ifdef WLAN_SUPPORT_TWT
|
#ifdef WLAN_SUPPORT_TWT
|
||||||
struct twt_context twt_ctx;
|
struct twt_context twt_ctx;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WLAN_FEATURE_SON
|
||||||
|
bool allow_kickout;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -21,6 +21,7 @@
|
|||||||
#define _SON_API_H_
|
#define _SON_API_H_
|
||||||
|
|
||||||
#include <qdf_types.h>
|
#include <qdf_types.h>
|
||||||
|
#include <wlan_objmgr_peer_obj.h>
|
||||||
#include <wlan_objmgr_pdev_obj.h>
|
#include <wlan_objmgr_pdev_obj.h>
|
||||||
#include <reg_services_public_struct.h>
|
#include <reg_services_public_struct.h>
|
||||||
|
|
||||||
@@ -38,4 +39,36 @@
|
|||||||
uint32_t wlan_son_get_chan_flag(struct wlan_objmgr_pdev *pdev,
|
uint32_t wlan_son_get_chan_flag(struct wlan_objmgr_pdev *pdev,
|
||||||
qdf_freq_t freq, bool flag_160,
|
qdf_freq_t freq, bool flag_160,
|
||||||
struct ch_params *chan_params);
|
struct ch_params *chan_params);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wlan_son_peer_set_kickout_allow() - set the peer is allowed to kickout
|
||||||
|
* @vdev: pointer to vdev
|
||||||
|
* @peer: pointer to peer
|
||||||
|
* @kickout_allow: kickout_allow to set
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS_SUCCESS on Success else failure.
|
||||||
|
*/
|
||||||
|
QDF_STATUS wlan_son_peer_set_kickout_allow(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct wlan_objmgr_peer *peer,
|
||||||
|
bool kickout_allow);
|
||||||
|
|
||||||
|
#ifdef WLAN_FEATURE_SON
|
||||||
|
/**
|
||||||
|
* wlan_son_peer_is_kickout_allow() - Is peer is allowed to kickout
|
||||||
|
* @vdev: pointer to vdev
|
||||||
|
* @macaddr: mac addr of the peer
|
||||||
|
*
|
||||||
|
* Return: True if it is allowed to kickout.
|
||||||
|
*/
|
||||||
|
bool wlan_son_peer_is_kickout_allow(struct wlan_objmgr_vdev *vdev,
|
||||||
|
uint8_t *macaddr);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static inline bool wlan_son_peer_is_kickout_allow(struct wlan_objmgr_vdev *vdev,
|
||||||
|
uint8_t *macaddr)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif /*WLAN_FEATURE_SON*/
|
||||||
#endif
|
#endif
|
||||||
|
@@ -76,4 +76,34 @@ uint32_t ucfg_son_get_sta_count(struct wlan_objmgr_vdev *vdev);
|
|||||||
uint32_t ucfg_son_get_chan_flag(struct wlan_objmgr_pdev *pdev,
|
uint32_t ucfg_son_get_chan_flag(struct wlan_objmgr_pdev *pdev,
|
||||||
qdf_freq_t freq, bool flag_160,
|
qdf_freq_t freq, bool flag_160,
|
||||||
struct ch_params *chan_params);
|
struct ch_params *chan_params);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ucfg_son_get_he_supported() - get he supported
|
||||||
|
* @psoc: pointer to psoc
|
||||||
|
* @he_supported: he supported or not
|
||||||
|
*
|
||||||
|
* Return: void
|
||||||
|
*/
|
||||||
|
#ifdef WLAN_FEATURE_11AX
|
||||||
|
void ucfg_son_get_he_supported(struct wlan_objmgr_psoc *psoc,
|
||||||
|
bool *he_supported);
|
||||||
|
#else
|
||||||
|
static inline void ucfg_son_get_he_supported(struct wlan_objmgr_psoc *psoc,
|
||||||
|
bool *he_supported)
|
||||||
|
{
|
||||||
|
*he_supported = false;
|
||||||
|
}
|
||||||
|
#endif /*WLAN_FEATURE_11AX*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ucfg_son_set_peer_kickout_allow() - set the peer is allowed to kickout
|
||||||
|
* @vdev: pointer to vdev
|
||||||
|
* @peer: pointer to peer
|
||||||
|
* @kickout_allow: kickout_allow to set
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS_SUCCESS on Success else failure.
|
||||||
|
*/
|
||||||
|
QDF_STATUS ucfg_son_set_peer_kickout_allow(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct wlan_objmgr_peer *peer,
|
||||||
|
bool kickout_allow);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -203,3 +203,68 @@ uint32_t wlan_son_get_chan_flag(struct wlan_objmgr_pdev *pdev,
|
|||||||
|
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDF_STATUS wlan_son_peer_set_kickout_allow(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct wlan_objmgr_peer *peer,
|
||||||
|
bool kickout_allow)
|
||||||
|
{
|
||||||
|
struct peer_mlme_priv_obj *peer_priv;
|
||||||
|
|
||||||
|
if (!peer) {
|
||||||
|
qdf_err("invalid peer");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
if (!vdev) {
|
||||||
|
qdf_err("invalid vdev");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
|
||||||
|
WLAN_UMAC_COMP_MLME);
|
||||||
|
if (!peer_priv) {
|
||||||
|
qdf_err("invalid vdev");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
peer_priv->allow_kickout = kickout_allow;
|
||||||
|
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wlan_son_peer_is_kickout_allow(struct wlan_objmgr_vdev *vdev,
|
||||||
|
uint8_t *macaddr)
|
||||||
|
{
|
||||||
|
bool kickout_allow = true;
|
||||||
|
struct wlan_objmgr_peer *peer;
|
||||||
|
struct wlan_objmgr_psoc *psoc;
|
||||||
|
struct peer_mlme_priv_obj *peer_priv;
|
||||||
|
|
||||||
|
if (!vdev) {
|
||||||
|
qdf_err("invalid vdev");
|
||||||
|
return kickout_allow;
|
||||||
|
}
|
||||||
|
psoc = wlan_vdev_get_psoc(vdev);
|
||||||
|
if (!psoc) {
|
||||||
|
qdf_err("invalid psoc");
|
||||||
|
return kickout_allow;
|
||||||
|
}
|
||||||
|
peer = wlan_objmgr_get_peer_by_mac(psoc, macaddr,
|
||||||
|
WLAN_SON_ID);
|
||||||
|
|
||||||
|
if (!peer) {
|
||||||
|
qdf_err("peer is null");
|
||||||
|
return kickout_allow;
|
||||||
|
}
|
||||||
|
|
||||||
|
peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
|
||||||
|
WLAN_UMAC_COMP_MLME);
|
||||||
|
if (!peer_priv) {
|
||||||
|
qdf_err("invalid vdev");
|
||||||
|
wlan_objmgr_peer_release_ref(peer, WLAN_SON_ID);
|
||||||
|
return kickout_allow;
|
||||||
|
}
|
||||||
|
kickout_allow = peer_priv->allow_kickout;
|
||||||
|
wlan_objmgr_peer_release_ref(peer, WLAN_SON_ID);
|
||||||
|
|
||||||
|
return kickout_allow;
|
||||||
|
}
|
||||||
|
@@ -70,3 +70,10 @@ uint32_t ucfg_son_get_chan_flag(struct wlan_objmgr_pdev *pdev,
|
|||||||
return wlan_son_get_chan_flag(pdev, freq, flag_160,
|
return wlan_son_get_chan_flag(pdev, freq, flag_160,
|
||||||
chan_params);
|
chan_params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDF_STATUS ucfg_son_set_peer_kickout_allow(struct wlan_objmgr_vdev *vdev,
|
||||||
|
struct wlan_objmgr_peer *peer,
|
||||||
|
bool kickout_allow)
|
||||||
|
{
|
||||||
|
return wlan_son_peer_set_kickout_allow(vdev, peer, kickout_allow);
|
||||||
|
}
|
||||||
|
@@ -46,6 +46,7 @@
|
|||||||
#include <wlan_cm_api.h>
|
#include <wlan_cm_api.h>
|
||||||
#include <lim_mlo.h>
|
#include <lim_mlo.h>
|
||||||
#include "wlan_mlo_mgr_peer.h"
|
#include "wlan_mlo_mgr_peer.h"
|
||||||
|
#include <son_api.h>
|
||||||
|
|
||||||
static void lim_process_mlm_auth_req(struct mac_context *, uint32_t *);
|
static void lim_process_mlm_auth_req(struct mac_context *, uint32_t *);
|
||||||
static void lim_process_mlm_assoc_req(struct mac_context *, uint32_t *);
|
static void lim_process_mlm_assoc_req(struct mac_context *, uint32_t *);
|
||||||
@@ -1522,9 +1523,18 @@ lim_process_mlm_deauth_req_ntf(struct mac_context *mac_ctx,
|
|||||||
mac_ctx->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = mlm_deauth_req;
|
mac_ctx->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = mlm_deauth_req;
|
||||||
|
|
||||||
/* Send Deauthentication frame to peer entity */
|
/* Send Deauthentication frame to peer entity */
|
||||||
|
if (mlm_deauth_req->reasonCode != REASON_DISASSOC_DUE_TO_INACTIVITY ||
|
||||||
|
wlan_son_peer_is_kickout_allow(session->vdev, sta_ds->staAddr)) {
|
||||||
lim_send_deauth_mgmt_frame(mac_ctx, mlm_deauth_req->reasonCode,
|
lim_send_deauth_mgmt_frame(mac_ctx, mlm_deauth_req->reasonCode,
|
||||||
mlm_deauth_req->peer_macaddr.bytes,
|
mlm_deauth_req->peer_macaddr.bytes,
|
||||||
session, true);
|
session, true);
|
||||||
|
} else {
|
||||||
|
pe_err("peer " QDF_MAC_ADDR_FMT " is in band steering, do not send deauth frame",
|
||||||
|
QDF_MAC_ADDR_REF(mlm_deauth_req->peer_macaddr.bytes));
|
||||||
|
mlm_deauth_cnf.resultCode = eSIR_SME_SUCCESS;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
end:
|
end:
|
||||||
qdf_copy_macaddr(&mlm_deauth_cnf.peer_macaddr,
|
qdf_copy_macaddr(&mlm_deauth_cnf.peer_macaddr,
|
||||||
|
@@ -328,14 +328,15 @@ QDF_STATUS os_if_son_vdev_ops(struct wlan_objmgr_vdev *pdev,
|
|||||||
* os_if_son_peer_ops() - Handles PEER specific SON commands
|
* os_if_son_peer_ops() - Handles PEER specific SON commands
|
||||||
* @peer: peer
|
* @peer: peer
|
||||||
* @type: SON command to handle
|
* @type: SON command to handle
|
||||||
* @data: Input Data
|
* @data: Input Data. Pointer to wlan_mlme_peer_data
|
||||||
* @ret: Output Data
|
* @ret: Output Data. Pointer to wlan_mlme_peer_data
|
||||||
*
|
*
|
||||||
* Return: QDF_SUCCCESS_SUCCESS in case of success
|
* Return: QDF_SUCCCESS_SUCCESS in case of success
|
||||||
*/
|
*/
|
||||||
QDF_STATUS os_if_son_peer_ops(struct wlan_objmgr_peer *peer,
|
QDF_STATUS os_if_son_peer_ops(struct wlan_objmgr_peer *peer,
|
||||||
enum wlan_mlme_peer_param type,
|
enum wlan_mlme_peer_param type,
|
||||||
void *data, void *ret);
|
union wlan_mlme_peer_data *data,
|
||||||
|
union wlan_mlme_peer_data *ret);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* os_if_son_scan_db_iterate() - get country code
|
* os_if_son_scan_db_iterate() - get country code
|
||||||
|
@@ -763,9 +763,52 @@ qdf_export_symbol(os_if_son_vdev_ops);
|
|||||||
|
|
||||||
QDF_STATUS os_if_son_peer_ops(struct wlan_objmgr_peer *peer,
|
QDF_STATUS os_if_son_peer_ops(struct wlan_objmgr_peer *peer,
|
||||||
enum wlan_mlme_peer_param type,
|
enum wlan_mlme_peer_param type,
|
||||||
void *data, void *ret)
|
union wlan_mlme_peer_data *in,
|
||||||
|
union wlan_mlme_peer_data *out)
|
||||||
{
|
{
|
||||||
return QDF_STATUS_SUCCESS;
|
struct wlan_objmgr_vdev *vdev;
|
||||||
|
struct wlan_objmgr_pdev *pdev;
|
||||||
|
struct wlan_objmgr_psoc *psoc;
|
||||||
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
|
if (!peer) {
|
||||||
|
osif_err("null peer");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
vdev = wlan_peer_get_vdev(peer);
|
||||||
|
if (!vdev) {
|
||||||
|
osif_err("null vdev");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
pdev = wlan_vdev_get_pdev(vdev);
|
||||||
|
if (!pdev) {
|
||||||
|
osif_err("null pdev");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
psoc = wlan_pdev_get_psoc(pdev);
|
||||||
|
if (!psoc) {
|
||||||
|
osif_err("null psoc");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
osif_debug("type %d", type);
|
||||||
|
/* All PEER MLME operations exported to SON component */
|
||||||
|
switch (type) {
|
||||||
|
case PEER_SET_KICKOUT_ALLOW:
|
||||||
|
if (!in) {
|
||||||
|
osif_err("invalid input parameter");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
status = ucfg_son_set_peer_kickout_allow(vdev, peer,
|
||||||
|
in->enable);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
osif_err("invalid type: %d", type);
|
||||||
|
status = QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
qdf_export_symbol(os_if_son_peer_ops);
|
qdf_export_symbol(os_if_son_peer_ops);
|
||||||
|
Reference in New Issue
Block a user