qcacmn: cdp: Converge cdp_peer_ops
Currently cdp ops are given pdev/vdev/peer handle as its arguments, which is directly accessed in those APIs. This can cause a race-condition in access of the respective handles if it has been deleted in parallel. Hence as a part of cdp convergence, pass only the pdev_id or vdev_id or peer mac address, which will be used to get the respective handles, and hence avoiding the unwanted access of the handles if it has been deleted. Also remove the ops which are used to store and retrieve such handles, that no more needed. - register_peer - clear_peer - change_peer_state - peer_get_ref_by_addr - peer_release_ref - peer_state_update - get_vdev_by_sta_id - register_ocb_peer - get_peer_state - get_vdev_for_peer - update_ibss_add_peer_num_of_vdev - remove_peers_for_vdev - remove_peers_for_vdev_no_lock - copy_mac_addr_raw - add_last_real_peer - is_vdev_restore_last_peer - update_last_real_peer - peer_detach_force_delete Change-Id: I4a41211464a30e018e8b73b8e9b91c7a509327b4 CRs-Fixed: 2541711
This commit is contained in:

committed by
nshrivas

parent
7b81f682b0
commit
af776988bf
@@ -1171,54 +1171,47 @@ struct cdp_ocb_ops {
|
||||
* struct cdp_peer_ops - mcl peer related ops
|
||||
* @register_peer:
|
||||
* @clear_peer:
|
||||
* @cfg_attach:
|
||||
* @find_peer_by_addr:
|
||||
* @find_peer_by_addr_and_vdev:
|
||||
* @local_peer_id:
|
||||
* @peer_find_by_local_id:
|
||||
* @find_peer_exist
|
||||
* @find_peer_exist_on_vdev
|
||||
* @find_peer_exist_on_other_vdev
|
||||
* @peer_state_update:
|
||||
* @get_vdevid:
|
||||
* @get_vdev_by_sta_id:
|
||||
* @register_ocb_peer:
|
||||
* @peer_get_peer_mac_addr:
|
||||
* @get_peer_state:
|
||||
* @get_vdev_for_peer:
|
||||
* @update_ibss_add_peer_num_of_vdev:
|
||||
* @remove_peers_for_vdev:
|
||||
* @remove_peers_for_vdev_no_lock:
|
||||
* @copy_mac_addr_raw:
|
||||
* @add_last_real_peer:
|
||||
* @is_vdev_restore_last_peer:
|
||||
* @update_last_real_peer:
|
||||
*/
|
||||
struct cdp_peer_ops {
|
||||
QDF_STATUS (*register_peer)(struct cdp_pdev *pdev,
|
||||
QDF_STATUS (*register_peer)(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
|
||||
struct ol_txrx_desc_type *sta_desc);
|
||||
QDF_STATUS (*clear_peer)(struct cdp_pdev *pdev,
|
||||
QDF_STATUS (*clear_peer)(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
|
||||
struct qdf_mac_addr peer_addr);
|
||||
QDF_STATUS (*change_peer_state)(uint8_t sta_id,
|
||||
enum ol_txrx_peer_state sta_state,
|
||||
bool roam_synch_in_progress);
|
||||
void * (*peer_get_ref_by_addr)(struct cdp_pdev *pdev,
|
||||
bool (*find_peer_exist)(struct cdp_soc_t *soc, uint8_t pdev_id,
|
||||
uint8_t *peer_addr);
|
||||
bool (*find_peer_exist_on_vdev)(struct cdp_soc_t *soc, uint8_t vdev_id,
|
||||
uint8_t *peer_addr);
|
||||
bool (*find_peer_exist_on_other_vdev)(struct cdp_soc_t *soc,
|
||||
uint8_t vdev_id,
|
||||
uint8_t *peer_addr,
|
||||
enum peer_debug_id_type debug_id);
|
||||
void (*peer_release_ref)(void *peer, enum peer_debug_id_type debug_id);
|
||||
void * (*find_peer_by_addr)(struct cdp_pdev *pdev,
|
||||
uint8_t *peer_addr);
|
||||
void * (*find_peer_by_addr_and_vdev)(struct cdp_pdev *pdev,
|
||||
struct cdp_vdev *vdev,
|
||||
uint8_t *peer_addr);
|
||||
QDF_STATUS (*peer_state_update)(struct cdp_pdev *pdev,
|
||||
uint16_t max_bssid);
|
||||
QDF_STATUS (*peer_state_update)(struct cdp_soc_t *soc,
|
||||
uint8_t *peer_addr,
|
||||
enum ol_txrx_peer_state state);
|
||||
QDF_STATUS (*get_vdevid)(void *peer, uint8_t *vdev_id);
|
||||
QDF_STATUS (*get_vdevid)(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac,
|
||||
uint8_t *vdev_id);
|
||||
struct cdp_vdev * (*get_vdev_by_peer_addr)(struct cdp_pdev *pdev,
|
||||
struct qdf_mac_addr peer_addr);
|
||||
QDF_STATUS (*register_ocb_peer)(uint8_t *mac_addr);
|
||||
uint8_t * (*peer_get_peer_mac_addr)(void *peer);
|
||||
int (*get_peer_state)(void *peer);
|
||||
int (*get_peer_state)(struct cdp_soc_t *soc, uint8_t vdev_id,
|
||||
uint8_t *peer_mac);
|
||||
struct cdp_vdev * (*get_vdev_for_peer)(void *peer);
|
||||
int16_t (*update_ibss_add_peer_num_of_vdev)(struct cdp_vdev *vdev,
|
||||
int16_t (*update_ibss_add_peer_num_of_vdev)(struct cdp_soc_t *soc,
|
||||
uint8_t vdev_id,
|
||||
int16_t peer_num_delta);
|
||||
void (*remove_peers_for_vdev)(struct cdp_vdev *vdev,
|
||||
ol_txrx_vdev_peer_remove_cb callback,
|
||||
@@ -1226,15 +1219,21 @@ struct cdp_peer_ops {
|
||||
void (*remove_peers_for_vdev_no_lock)(struct cdp_vdev *vdev,
|
||||
ol_txrx_vdev_peer_remove_cb callback,
|
||||
void *callback_context);
|
||||
void (*copy_mac_addr_raw)(struct cdp_vdev *vdev, uint8_t *bss_addr);
|
||||
void (*add_last_real_peer)(struct cdp_pdev *pdev,
|
||||
struct cdp_vdev *vdev);
|
||||
bool (*is_vdev_restore_last_peer)(void *peer);
|
||||
void (*update_last_real_peer)(struct cdp_pdev *pdev, void *vdev,
|
||||
bool restore_last_peer);
|
||||
void (*peer_detach_force_delete)(void *peer);
|
||||
void (*set_tdls_offchan_enabled)(void *peer, bool val);
|
||||
void (*set_peer_as_tdls_peer)(void *peer, bool val);
|
||||
void (*copy_mac_addr_raw)(struct cdp_soc_t *soc, uint8_t vdev_id,
|
||||
uint8_t *bss_addr);
|
||||
void (*add_last_real_peer)(struct cdp_soc_t *soc, uint8_t pdev_id,
|
||||
uint8_t vdev_id);
|
||||
bool (*is_vdev_restore_last_peer)(struct cdp_soc_t *soc,
|
||||
uint8_t vdev_id,
|
||||
uint8_t *peer_mac);
|
||||
void (*update_last_real_peer)(struct cdp_soc_t *soc, uint8_t pdev_id,
|
||||
uint8_t vdev_id, bool restore_last_peer);
|
||||
void (*peer_detach_force_delete)(struct cdp_soc_t *soc_hdl,
|
||||
uint8_t vdev_id, uint8_t *peer_addr);
|
||||
void (*set_tdls_offchan_enabled)(struct cdp_soc_t *soc, uint8_t vdev_id,
|
||||
uint8_t *peer_mac, bool val);
|
||||
void (*set_peer_as_tdls_peer)(struct cdp_soc_t *soc, uint8_t vdev_id,
|
||||
uint8_t *peer_mac, bool val);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for
|
||||
* any purpose with or without fee is hereby granted, provided that the
|
||||
@@ -29,7 +29,7 @@
|
||||
/**
|
||||
* cdp_peer_register() - Register peer into physical device
|
||||
* @soc - data path soc handle
|
||||
* @pdev - data path device instance
|
||||
* @pdev_id - data path device instance id
|
||||
* @sta_desc - peer description
|
||||
*
|
||||
* Register peer into physical device
|
||||
@@ -38,7 +38,7 @@
|
||||
* QDF_STATUS_E_NOSUPPORT not support this feature
|
||||
*/
|
||||
static inline QDF_STATUS
|
||||
cdp_peer_register(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
||||
cdp_peer_register(ol_txrx_soc_handle soc, uint8_t pdev_id,
|
||||
struct ol_txrx_desc_type *sta_desc)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
@@ -48,7 +48,8 @@ cdp_peer_register(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->register_peer)
|
||||
return soc->ops->peer_ops->register_peer(pdev, sta_desc);
|
||||
return soc->ops->peer_ops->register_peer(soc, pdev_id,
|
||||
sta_desc);
|
||||
|
||||
return QDF_STATUS_E_NOSUPPORT;
|
||||
}
|
||||
@@ -56,7 +57,7 @@ cdp_peer_register(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
||||
/**
|
||||
* cdp_clear_peer() - remove peer from physical device
|
||||
* @soc - data path soc handle
|
||||
* @pdev - data path device instance
|
||||
* @pdev_id - data path device instance id
|
||||
* @peer_addr - peer mac address
|
||||
*
|
||||
* remove peer from physical device
|
||||
@@ -65,7 +66,7 @@ cdp_peer_register(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
||||
* QDF_STATUS_E_NOSUPPORT not support this feature
|
||||
*/
|
||||
static inline QDF_STATUS
|
||||
cdp_clear_peer(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
||||
cdp_clear_peer(ol_txrx_soc_handle soc, uint8_t pdev_id,
|
||||
struct qdf_mac_addr peer_addr)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
@@ -75,7 +76,7 @@ cdp_clear_peer(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->clear_peer)
|
||||
return soc->ops->peer_ops->clear_peer(pdev, peer_addr);
|
||||
return soc->ops->peer_ops->clear_peer(soc, pdev_id, peer_addr);
|
||||
|
||||
return QDF_STATUS_E_NOSUPPORT;
|
||||
}
|
||||
@@ -108,176 +109,88 @@ cdp_peer_register_ocb_peer(ol_txrx_soc_handle soc,
|
||||
}
|
||||
|
||||
/**
|
||||
* cdp_peer_remove_for_vdev() - remove peer instance from virtual interface
|
||||
* cdp_find_peer_exist - Find if peer already exists
|
||||
* @soc - data path soc handle
|
||||
* @vdev - virtual interface instance
|
||||
* @callback - remove done notification callback function pointer
|
||||
* @callback_context - callback caller context
|
||||
* @remove_last_peer - removed peer is last peer or not
|
||||
*
|
||||
* remove peer instance from virtual interface
|
||||
*
|
||||
* Return: NONE
|
||||
*/
|
||||
static inline void
|
||||
cdp_peer_remove_for_vdev(ol_txrx_soc_handle soc,
|
||||
struct cdp_vdev *vdev, ol_txrx_vdev_peer_remove_cb callback,
|
||||
void *callback_context, bool remove_last_peer)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
"%s invalid instance", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->remove_peers_for_vdev)
|
||||
return soc->ops->peer_ops->remove_peers_for_vdev(
|
||||
vdev, callback, callback_context, remove_last_peer);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* cdp_peer_remove_for_vdev_no_lock() - remove peer instance from vdev
|
||||
* @soc - data path soc handle
|
||||
* @vdev - virtual interface instance
|
||||
* @callback - remove done notification callback function pointer
|
||||
* @callback_context - callback caller context
|
||||
*
|
||||
* remove peer instance from virtual interface without lock
|
||||
*
|
||||
* Return: NONE
|
||||
*/
|
||||
static inline void
|
||||
cdp_peer_remove_for_vdev_no_lock(ol_txrx_soc_handle soc,
|
||||
struct cdp_vdev *vdev,
|
||||
ol_txrx_vdev_peer_remove_cb callback,
|
||||
void *callback_context)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
"%s invalid instance", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->remove_peers_for_vdev_no_lock)
|
||||
return soc->ops->peer_ops->remove_peers_for_vdev_no_lock(
|
||||
vdev, callback, callback_context);
|
||||
}
|
||||
|
||||
/**
|
||||
* cdp_peer_get_ref_by_addr() - Find peer by peer mac address and inc peer ref
|
||||
* @soc - data path soc handle
|
||||
* @pdev - data path device instance
|
||||
* @peer_addr - peer mac address
|
||||
* @debug_id - debug_id to track caller
|
||||
*
|
||||
* To release the peer ref, cdp_peer_release_ref needs to be called.
|
||||
*
|
||||
* Return: peer instance void pointer
|
||||
* NULL cannot find target peer
|
||||
*/
|
||||
static inline void
|
||||
*cdp_peer_get_ref_by_addr(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
||||
uint8_t *peer_addr,
|
||||
enum peer_debug_id_type debug_id)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
"%s invalid instance", __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->peer_get_ref_by_addr)
|
||||
return soc->ops->peer_ops->peer_get_ref_by_addr(
|
||||
pdev, peer_addr, debug_id);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* cdp_peer_release_ref() - Release peer reference
|
||||
* @soc - data path soc handle
|
||||
* @peer - peer pointer
|
||||
* @debug_id - debug_id to track caller
|
||||
*
|
||||
* Return:void
|
||||
*/
|
||||
static inline void
|
||||
cdp_peer_release_ref(ol_txrx_soc_handle soc, void *peer,
|
||||
enum peer_debug_id_type debug_id)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
"%s invalid instance", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->peer_release_ref)
|
||||
soc->ops->peer_ops->peer_release_ref(peer, debug_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* cdp_peer_find_by_addr() - Find peer by peer mac address
|
||||
* @soc - data path soc handle
|
||||
* @pdev - data path device instance
|
||||
* @pdev_id - data path device instance id
|
||||
* @peer_addr - peer mac address
|
||||
*
|
||||
* Find peer and local peer id by peer mac address
|
||||
*
|
||||
* Return: peer instance void pointer
|
||||
* NULL cannot find target peer
|
||||
* Return: true or false
|
||||
*/
|
||||
static inline void
|
||||
*cdp_peer_find_by_addr(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
||||
static inline bool
|
||||
cdp_find_peer_exist(ol_txrx_soc_handle soc, uint8_t pdev_id,
|
||||
uint8_t *peer_addr)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
"%s invalid instance", __func__);
|
||||
return NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->find_peer_by_addr)
|
||||
return soc->ops->peer_ops->find_peer_by_addr(
|
||||
pdev, peer_addr);
|
||||
if (soc->ops->peer_ops->find_peer_exist)
|
||||
return soc->ops->peer_ops->find_peer_exist(soc, pdev_id,
|
||||
peer_addr);
|
||||
|
||||
return NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* cdp_peer_find_by_addr_and_vdev() - Find peer by peer mac address within vdev
|
||||
* cdp_find_peer_exist_on_vdev - Find if duplicate peer exists
|
||||
* on the given vdev
|
||||
* @soc - data path soc handle
|
||||
* @pdev - data path device instance
|
||||
* @vdev - virtual interface instance
|
||||
* @vdev_id - data path virtual interface id
|
||||
* @peer_addr - peer mac address
|
||||
*
|
||||
* Find peer by peer mac address within vdev
|
||||
*
|
||||
* Return: peer instance void pointer
|
||||
* NULL cannot find target peer
|
||||
* Return: true or false
|
||||
*/
|
||||
static inline void
|
||||
*cdp_peer_find_by_addr_and_vdev(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
||||
struct cdp_vdev *vdev, uint8_t *peer_addr)
|
||||
static inline bool
|
||||
cdp_find_peer_exist_on_vdev(ol_txrx_soc_handle soc, uint8_t vdev_id,
|
||||
uint8_t *peer_addr)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
"%s invalid instance", __func__);
|
||||
return NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->find_peer_by_addr_and_vdev)
|
||||
return soc->ops->peer_ops->find_peer_by_addr_and_vdev(
|
||||
pdev, vdev, peer_addr);
|
||||
if (soc->ops->peer_ops->find_peer_exist_on_vdev)
|
||||
return soc->ops->peer_ops->find_peer_exist_on_vdev(soc, vdev_id,
|
||||
peer_addr);
|
||||
|
||||
return NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* cdp_find_peer_exist_on_other_vdev - Find if duplicate peer exists
|
||||
* on other than the given vdev
|
||||
* @soc - data path soc handle
|
||||
* @vdev_id - data path virtual interface id
|
||||
* @peer_addr - peer mac address
|
||||
* @max_bssid - max number of bssids
|
||||
*
|
||||
* Return: true or false
|
||||
*/
|
||||
static inline bool
|
||||
cdp_find_peer_exist_on_other_vdev(ol_txrx_soc_handle soc, uint8_t vdev_id,
|
||||
uint8_t *peer_addr, uint16_t max_bssid)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
"%s invalid instance", __func__);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->find_peer_exist_on_other_vdev)
|
||||
return soc->ops->peer_ops->find_peer_exist_on_other_vdev(
|
||||
soc, vdev_id,
|
||||
peer_addr,
|
||||
max_bssid);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* cdp_peer_state_update() - update peer local state
|
||||
* @soc - data path soc handle
|
||||
* @pdev - data path device instance
|
||||
* @peer_addr - peer mac address
|
||||
* @state - new peer local state
|
||||
*
|
||||
@@ -287,8 +200,8 @@ static inline void
|
||||
* QDF_STATUS_E_NOSUPPORT not support this feature
|
||||
*/
|
||||
static inline QDF_STATUS
|
||||
cdp_peer_state_update(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
||||
uint8_t *peer_addr, enum ol_txrx_peer_state state)
|
||||
cdp_peer_state_update(ol_txrx_soc_handle soc, uint8_t *peer_addr,
|
||||
enum ol_txrx_peer_state state)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
@@ -297,8 +210,8 @@ cdp_peer_state_update(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->peer_state_update)
|
||||
return soc->ops->peer_ops->peer_state_update(
|
||||
pdev, peer_addr, state);
|
||||
return soc->ops->peer_ops->peer_state_update(soc, peer_addr,
|
||||
state);
|
||||
|
||||
return QDF_STATUS_E_NOSUPPORT;
|
||||
}
|
||||
@@ -306,14 +219,15 @@ cdp_peer_state_update(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
||||
/**
|
||||
* cdp_peer_state_get() - Get local peer state
|
||||
* @soc - data path soc handle
|
||||
* @peer - peer instance
|
||||
* @vdev_id - virtual interface id
|
||||
* @peer_mac - peer mac addr
|
||||
*
|
||||
* Get local peer state
|
||||
*
|
||||
* Return: peer status
|
||||
*/
|
||||
static inline int
|
||||
cdp_peer_state_get(ol_txrx_soc_handle soc, void *peer)
|
||||
cdp_peer_state_get(ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
@@ -322,7 +236,8 @@ cdp_peer_state_get(ol_txrx_soc_handle soc, void *peer)
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->get_peer_state)
|
||||
return soc->ops->peer_ops->get_peer_state(peer);
|
||||
return soc->ops->peer_ops->get_peer_state(soc, vdev_id,
|
||||
peer_mac);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -330,7 +245,7 @@ cdp_peer_state_get(ol_txrx_soc_handle soc, void *peer)
|
||||
/**
|
||||
* cdp_peer_get_vdevid() - Get virtual interface id which peer registered
|
||||
* @soc - data path soc handle
|
||||
* @peer - peer instance
|
||||
* @peer_mac - peer mac address
|
||||
* @vdev_id - virtual interface id which peer registered
|
||||
*
|
||||
* Get virtual interface id which peer registered
|
||||
@@ -339,7 +254,8 @@ cdp_peer_state_get(ol_txrx_soc_handle soc, void *peer)
|
||||
* QDF_STATUS_E_NOSUPPORT not support this feature
|
||||
*/
|
||||
static inline QDF_STATUS
|
||||
cdp_peer_get_vdevid(ol_txrx_soc_handle soc, void *peer, uint8_t *vdev_id)
|
||||
cdp_peer_get_vdevid(ol_txrx_soc_handle soc,
|
||||
uint8_t *peer_mac, uint8_t *vdev_id)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
@@ -348,7 +264,7 @@ cdp_peer_get_vdevid(ol_txrx_soc_handle soc, void *peer, uint8_t *vdev_id)
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->get_vdevid)
|
||||
return soc->ops->peer_ops->get_vdevid(peer, vdev_id);
|
||||
return soc->ops->peer_ops->get_vdevid(soc, peer_mac, vdev_id);
|
||||
|
||||
return QDF_STATUS_E_NOSUPPORT;
|
||||
}
|
||||
@@ -406,35 +322,10 @@ static inline uint8_t
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* cdp_peer_get_vdev() - Get virtual interface instance which peer belongs
|
||||
* @soc - data path soc handle
|
||||
* @peer - peer instance
|
||||
*
|
||||
* Get virtual interface instance which peer belongs
|
||||
*
|
||||
* Return: virtual interface instance pointer
|
||||
* NULL in case cannot find
|
||||
*/
|
||||
static inline struct cdp_vdev
|
||||
*cdp_peer_get_vdev(ol_txrx_soc_handle soc, void *peer)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
"%s invalid instance", __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->get_vdev_for_peer)
|
||||
return soc->ops->peer_ops->get_vdev_for_peer(peer);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* cdp_peer_update_ibss_add_peer_num_of_vdev() - update number of peer
|
||||
* @soc - data path soc handle
|
||||
* @vdev - virtual interface instance
|
||||
* @vdev_id - virtual interface instance id
|
||||
* @peer_num_delta - number of peer should be updated
|
||||
*
|
||||
* update number of peer
|
||||
@@ -444,7 +335,8 @@ static inline struct cdp_vdev
|
||||
*/
|
||||
static inline int16_t
|
||||
cdp_peer_update_ibss_add_peer_num_of_vdev(ol_txrx_soc_handle soc,
|
||||
struct cdp_vdev *vdev, int16_t peer_num_delta)
|
||||
uint8_t vdev_id,
|
||||
int16_t peer_num_delta)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
@@ -454,7 +346,8 @@ cdp_peer_update_ibss_add_peer_num_of_vdev(ol_txrx_soc_handle soc,
|
||||
|
||||
if (soc->ops->peer_ops->update_ibss_add_peer_num_of_vdev)
|
||||
return soc->ops->peer_ops->update_ibss_add_peer_num_of_vdev(
|
||||
vdev, peer_num_delta);
|
||||
soc, vdev_id,
|
||||
peer_num_delta);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -462,7 +355,7 @@ cdp_peer_update_ibss_add_peer_num_of_vdev(ol_txrx_soc_handle soc,
|
||||
/**
|
||||
* cdp_peer_copy_mac_addr_raw() - copy peer mac address
|
||||
* @soc - data path soc handle
|
||||
* @vdev - virtual interface instance
|
||||
* @vdev_id - virtual interface instance id
|
||||
* @bss_addr - mac address should be copied
|
||||
*
|
||||
* copy peer mac address
|
||||
@@ -471,7 +364,7 @@ cdp_peer_update_ibss_add_peer_num_of_vdev(ol_txrx_soc_handle soc,
|
||||
*/
|
||||
static inline void
|
||||
cdp_peer_copy_mac_addr_raw(ol_txrx_soc_handle soc,
|
||||
struct cdp_vdev *vdev, uint8_t *bss_addr)
|
||||
uint8_t vdev_id, uint8_t *bss_addr)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
@@ -480,7 +373,8 @@ cdp_peer_copy_mac_addr_raw(ol_txrx_soc_handle soc,
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->copy_mac_addr_raw)
|
||||
return soc->ops->peer_ops->copy_mac_addr_raw(vdev, bss_addr);
|
||||
return soc->ops->peer_ops->copy_mac_addr_raw(soc, vdev_id,
|
||||
bss_addr);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -488,16 +382,16 @@ cdp_peer_copy_mac_addr_raw(ol_txrx_soc_handle soc,
|
||||
/**
|
||||
* cdp_peer_add_last_real_peer() - Add peer with last peer marking
|
||||
* @soc - data path soc handle
|
||||
* @pdev - data path device instance
|
||||
* @vdev - virtual interface instance
|
||||
* @pdev_id - data path device instance id
|
||||
* @vdev_id - virtual interface instance id
|
||||
*
|
||||
* copy peer mac address
|
||||
*
|
||||
* Return: none
|
||||
*/
|
||||
static inline void
|
||||
cdp_peer_add_last_real_peer(ol_txrx_soc_handle soc,
|
||||
struct cdp_pdev *pdev, struct cdp_vdev *vdev)
|
||||
cdp_peer_add_last_real_peer(ol_txrx_soc_handle soc, uint8_t pdev_id,
|
||||
uint8_t vdev_id)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
@@ -506,15 +400,16 @@ cdp_peer_add_last_real_peer(ol_txrx_soc_handle soc,
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->add_last_real_peer)
|
||||
return soc->ops->peer_ops->add_last_real_peer(
|
||||
pdev, vdev);
|
||||
return soc->ops->peer_ops->add_last_real_peer(soc, pdev_id,
|
||||
vdev_id);
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* cdp_peer_is_vdev_restore_last_peer() - restore last peer
|
||||
* @soc - data path soc handle
|
||||
* @peer - peer instance pointer
|
||||
* @vdev_id - virtual interface id
|
||||
* @peer_mac - peer mac address
|
||||
*
|
||||
* restore last peer
|
||||
*
|
||||
@@ -522,7 +417,8 @@ cdp_peer_add_last_real_peer(ol_txrx_soc_handle soc,
|
||||
* fasle, restore fail
|
||||
*/
|
||||
static inline bool
|
||||
cdp_peer_is_vdev_restore_last_peer(ol_txrx_soc_handle soc, void *peer)
|
||||
cdp_peer_is_vdev_restore_last_peer(ol_txrx_soc_handle soc, uint8_t vdev_id,
|
||||
uint8_t *peer_mac)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
@@ -531,7 +427,9 @@ cdp_peer_is_vdev_restore_last_peer(ol_txrx_soc_handle soc, void *peer)
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->is_vdev_restore_last_peer)
|
||||
return soc->ops->peer_ops->is_vdev_restore_last_peer(peer);
|
||||
return soc->ops->peer_ops->is_vdev_restore_last_peer(soc,
|
||||
vdev_id,
|
||||
peer_mac);
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -539,8 +437,8 @@ cdp_peer_is_vdev_restore_last_peer(ol_txrx_soc_handle soc, void *peer)
|
||||
/**
|
||||
* cdp_peer_update_last_real_peer() - update last real peer
|
||||
* @soc - data path soc handle
|
||||
* @pdev - data path device instance
|
||||
* @peer - peer instance pointer
|
||||
* @pdev_id - data path device instance id
|
||||
* @vdev_id - virtual interface id
|
||||
* @restore_last_peer - restore last peer or not
|
||||
*
|
||||
* update last real peer
|
||||
@@ -548,8 +446,8 @@ cdp_peer_is_vdev_restore_last_peer(ol_txrx_soc_handle soc, void *peer)
|
||||
* Return: none
|
||||
*/
|
||||
static inline void
|
||||
cdp_peer_update_last_real_peer(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
||||
void *vdev, bool restore_last_peer)
|
||||
cdp_peer_update_last_real_peer(ol_txrx_soc_handle soc, uint8_t pdev_id,
|
||||
uint8_t vdev_id, bool restore_last_peer)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
@@ -558,7 +456,8 @@ cdp_peer_update_last_real_peer(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->update_last_real_peer)
|
||||
return soc->ops->peer_ops->update_last_real_peer(pdev, vdev,
|
||||
return soc->ops->peer_ops->update_last_real_peer(
|
||||
soc, pdev_id, vdev_id,
|
||||
restore_last_peer);
|
||||
|
||||
return;
|
||||
@@ -576,7 +475,8 @@ cdp_peer_update_last_real_peer(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
|
||||
* Return: None
|
||||
*/
|
||||
static inline void cdp_peer_detach_force_delete(ol_txrx_soc_handle soc,
|
||||
void *peer)
|
||||
uint8_t vdev_id,
|
||||
uint8_t *peer_mac)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
@@ -585,7 +485,9 @@ static inline void cdp_peer_detach_force_delete(ol_txrx_soc_handle soc,
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->peer_detach_force_delete)
|
||||
return soc->ops->peer_ops->peer_detach_force_delete(peer);
|
||||
return soc->ops->peer_ops->peer_detach_force_delete(soc,
|
||||
vdev_id,
|
||||
peer_mac);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -620,13 +522,15 @@ is_cdp_peer_detach_force_delete_supported(ol_txrx_soc_handle soc)
|
||||
/*
|
||||
* cdp_peer_set_peer_as_tdls() - To set peer as tdls peer
|
||||
* @soc: pointer to SOC handle
|
||||
* @peer: dp peer
|
||||
* @vdev_id: virtual interface id
|
||||
* @peer_mac: peer mac address
|
||||
* @var: true or false
|
||||
*
|
||||
* Return: void
|
||||
*/
|
||||
static inline void
|
||||
cdp_peer_set_peer_as_tdls(ol_txrx_soc_handle soc, void *peer, bool val)
|
||||
cdp_peer_set_peer_as_tdls(ol_txrx_soc_handle soc, uint8_t vdev_id,
|
||||
uint8_t *peer_mac, bool val)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
@@ -635,21 +539,24 @@ cdp_peer_set_peer_as_tdls(ol_txrx_soc_handle soc, void *peer, bool val)
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->set_peer_as_tdls_peer)
|
||||
soc->ops->peer_ops->set_peer_as_tdls_peer(peer, val);
|
||||
soc->ops->peer_ops->set_peer_as_tdls_peer(soc, vdev_id,
|
||||
peer_mac, val);
|
||||
}
|
||||
|
||||
/**
|
||||
* cdp_peer_set_tdls_offchan_enabled() - Set tdls offchan operation as enabled
|
||||
* @soc - data path soc handle
|
||||
* @peer - peer instance pointer
|
||||
* @val - true or false
|
||||
* @soc: pointer to SOC handle
|
||||
* @vdev_id: virtual interface id
|
||||
* @peer_mac: peer mac address
|
||||
* @val: true or false
|
||||
*
|
||||
* update tdls_offchan_enabled
|
||||
*
|
||||
* Return: none
|
||||
*/
|
||||
static inline void
|
||||
cdp_peer_set_tdls_offchan_enabled(ol_txrx_soc_handle soc, void *peer, bool val)
|
||||
cdp_peer_set_tdls_offchan_enabled(ol_txrx_soc_handle soc, uint8_t vdev_id,
|
||||
uint8_t *peer_mac, bool val)
|
||||
{
|
||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||
@@ -658,7 +565,8 @@ cdp_peer_set_tdls_offchan_enabled(ol_txrx_soc_handle soc, void *peer, bool val)
|
||||
}
|
||||
|
||||
if (soc->ops->peer_ops->set_tdls_offchan_enabled)
|
||||
soc->ops->peer_ops->set_tdls_offchan_enabled(peer, val);
|
||||
soc->ops->peer_ops->set_tdls_offchan_enabled(soc, vdev_id,
|
||||
peer_mac, val);
|
||||
}
|
||||
|
||||
#endif /* _CDP_TXRX_PEER_H_ */
|
||||
|
@@ -910,27 +910,133 @@ extern struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc,
|
||||
uint8_t *peer_mac_addr, int mac_addr_is_aligned, uint8_t vdev_id);
|
||||
|
||||
#ifdef DP_PEER_EXTENDED_API
|
||||
QDF_STATUS dp_register_peer(struct cdp_pdev *pdev_handle,
|
||||
/**
|
||||
* dp_register_peer() - Register peer into physical device
|
||||
* @soc_hdl - data path soc handle
|
||||
* @pdev_id - device instance id
|
||||
* @sta_desc - peer description
|
||||
*
|
||||
* Register peer into physical device
|
||||
*
|
||||
* Return: QDF_STATUS_SUCCESS registration success
|
||||
* QDF_STATUS_E_FAULT peer not found
|
||||
*/
|
||||
QDF_STATUS dp_register_peer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
|
||||
struct ol_txrx_desc_type *sta_desc);
|
||||
QDF_STATUS dp_clear_peer(struct cdp_pdev *pdev_handle,
|
||||
|
||||
/**
|
||||
* dp_clear_peer() - remove peer from physical device
|
||||
* @soc_hdl - data path soc handle
|
||||
* @pdev_id - device instance id
|
||||
* @peer_addr - peer mac address
|
||||
*
|
||||
* remove peer from physical device
|
||||
*
|
||||
* Return: QDF_STATUS_SUCCESS registration success
|
||||
* QDF_STATUS_E_FAULT peer not found
|
||||
*/
|
||||
QDF_STATUS dp_clear_peer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
|
||||
struct qdf_mac_addr peer_addr);
|
||||
|
||||
/*
|
||||
* dp_find_peer_exist - find peer if already exists
|
||||
* @soc: datapath soc handle
|
||||
* @pdev_id: physical device instance id
|
||||
* @peer_mac_addr: peer mac address
|
||||
*
|
||||
* Return: true or false
|
||||
*/
|
||||
bool dp_find_peer_exist(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
|
||||
uint8_t *peer_addr);
|
||||
|
||||
/*
|
||||
* dp_find_peer_exist_on_vdev - find if peer exists on the given vdev
|
||||
* @soc: datapath soc handle
|
||||
* @vdev_id: vdev instance id
|
||||
* @peer_mac_addr: peer mac address
|
||||
*
|
||||
* Return: true or false
|
||||
*/
|
||||
bool dp_find_peer_exist_on_vdev(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
||||
uint8_t *peer_addr);
|
||||
|
||||
/*
|
||||
* dp_find_peer_exist_on_other_vdev - find if peer exists
|
||||
* on other than the given vdev
|
||||
* @soc: datapath soc handle
|
||||
* @vdev_id: vdev instance id
|
||||
* @peer_mac_addr: peer mac address
|
||||
* @max_bssid: max number of bssids
|
||||
*
|
||||
* Return: true or false
|
||||
*/
|
||||
bool dp_find_peer_exist_on_other_vdev(struct cdp_soc_t *soc_hdl,
|
||||
uint8_t vdev_id, uint8_t *peer_addr,
|
||||
uint16_t max_bssid);
|
||||
|
||||
void *dp_find_peer_by_addr_and_vdev(struct cdp_pdev *pdev_handle,
|
||||
struct cdp_vdev *vdev,
|
||||
uint8_t *peer_addr);
|
||||
QDF_STATUS dp_peer_state_update(struct cdp_pdev *pdev_handle, uint8_t *peer_mac,
|
||||
|
||||
/**
|
||||
* dp_peer_state_update() - update peer local state
|
||||
* @pdev - data path device instance
|
||||
* @peer_addr - peer mac address
|
||||
* @state - new peer local state
|
||||
*
|
||||
* update peer local state
|
||||
*
|
||||
* Return: QDF_STATUS_SUCCESS registration success
|
||||
*/
|
||||
QDF_STATUS dp_peer_state_update(struct cdp_soc_t *soc, uint8_t *peer_mac,
|
||||
enum ol_txrx_peer_state state);
|
||||
QDF_STATUS dp_get_vdevid(void *peer_handle, uint8_t *vdev_id);
|
||||
|
||||
/**
|
||||
* dp_get_vdevid() - Get virtual interface id which peer registered
|
||||
* @soc - datapath soc handle
|
||||
* @peer_mac - peer mac address
|
||||
* @vdev_id - virtual interface id which peer registered
|
||||
*
|
||||
* Get virtual interface id which peer registered
|
||||
*
|
||||
* Return: QDF_STATUS_SUCCESS registration success
|
||||
*/
|
||||
QDF_STATUS dp_get_vdevid(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac,
|
||||
uint8_t *vdev_id);
|
||||
struct cdp_vdev *dp_get_vdev_by_peer_addr(struct cdp_pdev *pdev_handle,
|
||||
struct qdf_mac_addr peer_addr);
|
||||
struct cdp_vdev *dp_get_vdev_for_peer(void *peer);
|
||||
uint8_t *dp_peer_get_peer_mac_addr(void *peer);
|
||||
int dp_get_peer_state(void *peer_handle);
|
||||
|
||||
/**
|
||||
* dp_get_peer_state() - Get local peer state
|
||||
* @soc - datapath soc handle
|
||||
* @vdev_id - vdev id
|
||||
* @peer_mac - peer mac addr
|
||||
*
|
||||
* Get local peer state
|
||||
*
|
||||
* Return: peer status
|
||||
*/
|
||||
int dp_get_peer_state(struct cdp_soc_t *soc, uint8_t vdev_id,
|
||||
uint8_t *peer_mac);
|
||||
void dp_local_peer_id_pool_init(struct dp_pdev *pdev);
|
||||
void dp_local_peer_id_alloc(struct dp_pdev *pdev, struct dp_peer *peer);
|
||||
void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer);
|
||||
#else
|
||||
/**
|
||||
* dp_get_vdevid() - Get virtual interface id which peer registered
|
||||
* @soc - datapath soc handle
|
||||
* @peer_mac - peer mac address
|
||||
* @vdev_id - virtual interface id which peer registered
|
||||
*
|
||||
* Get virtual interface id which peer registered
|
||||
*
|
||||
* Return: QDF_STATUS_SUCCESS registration success
|
||||
*/
|
||||
static inline
|
||||
QDF_STATUS dp_get_vdevid(void *peer_handle, uint8_t *vdev_id)
|
||||
QDF_STATUS dp_get_vdevid(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac,
|
||||
uint8_t *vdev_id)
|
||||
{
|
||||
return QDF_STATUS_E_NOSUPPORT;
|
||||
}
|
||||
|
@@ -10587,56 +10587,16 @@ static struct cdp_mob_stats_ops dp_ops_mob_stats = {
|
||||
.clear_stats = dp_txrx_clear_dump_stats,
|
||||
};
|
||||
|
||||
/*
|
||||
* dp_peer_get_ref_find_by_addr - get peer with addr by ref count inc
|
||||
* @dev: physical device instance
|
||||
* @peer_mac_addr: peer mac address
|
||||
* @debug_id: to track enum peer access
|
||||
*
|
||||
* Return: peer instance pointer
|
||||
*/
|
||||
static inline void *
|
||||
dp_peer_get_ref_find_by_addr(struct cdp_pdev *dev, uint8_t *peer_mac_addr,
|
||||
enum peer_debug_id_type debug_id)
|
||||
{
|
||||
struct dp_pdev *pdev = (struct dp_pdev *)dev;
|
||||
struct dp_peer *peer;
|
||||
|
||||
peer = dp_peer_find_hash_find(pdev->soc, peer_mac_addr, 0, DP_VDEV_ALL);
|
||||
|
||||
if (!peer)
|
||||
return NULL;
|
||||
|
||||
dp_info_rl("peer %pK mac: %pM", peer, peer->mac_addr.raw);
|
||||
|
||||
return peer;
|
||||
}
|
||||
|
||||
/*
|
||||
* dp_peer_release_ref - release peer ref count
|
||||
* @peer: peer handle
|
||||
* @debug_id: to track enum peer access
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
static inline
|
||||
void dp_peer_release_ref(void *peer, enum peer_debug_id_type debug_id)
|
||||
{
|
||||
dp_peer_unref_delete(peer);
|
||||
}
|
||||
|
||||
static struct cdp_peer_ops dp_ops_peer = {
|
||||
.register_peer = dp_register_peer,
|
||||
.clear_peer = dp_clear_peer,
|
||||
.find_peer_by_addr = dp_find_peer_by_addr,
|
||||
.find_peer_by_addr_and_vdev = dp_find_peer_by_addr_and_vdev,
|
||||
.peer_get_ref_by_addr = dp_peer_get_ref_find_by_addr,
|
||||
.peer_release_ref = dp_peer_release_ref,
|
||||
.find_peer_exist = dp_find_peer_exist,
|
||||
.find_peer_exist_on_vdev = dp_find_peer_exist_on_vdev,
|
||||
.find_peer_exist_on_other_vdev = dp_find_peer_exist_on_other_vdev,
|
||||
.peer_state_update = dp_peer_state_update,
|
||||
.get_vdevid = dp_get_vdevid,
|
||||
.get_vdev_by_peer_addr = dp_get_vdev_by_peer_addr,
|
||||
.peer_get_peer_mac_addr = dp_peer_get_peer_mac_addr,
|
||||
.get_vdev_for_peer = dp_get_vdev_for_peer,
|
||||
.get_peer_state = dp_get_peer_state,
|
||||
};
|
||||
#endif
|
||||
|
@@ -1701,15 +1701,18 @@ static bool dp_get_peer_vdev_roaming_in_progress(struct dp_peer *peer)
|
||||
struct ol_if_ops *ol_ops = NULL;
|
||||
bool is_roaming = false;
|
||||
uint8_t vdev_id = -1;
|
||||
struct cdp_soc_t *soc;
|
||||
|
||||
if (!peer) {
|
||||
dp_info("Peer is NULL. No roaming possible");
|
||||
return false;
|
||||
}
|
||||
|
||||
soc = dp_soc_to_cdp_soc_t(peer->vdev->pdev->soc);
|
||||
ol_ops = peer->vdev->pdev->soc->cdp_soc.ol_ops;
|
||||
|
||||
if (ol_ops && ol_ops->is_roam_inprogress) {
|
||||
dp_get_vdevid(peer, &vdev_id);
|
||||
dp_get_vdevid(soc, peer->mac_addr.raw, &vdev_id);
|
||||
is_roaming = ol_ops->is_roam_inprogress(vdev_id);
|
||||
}
|
||||
|
||||
@@ -3117,25 +3120,19 @@ dp_rx_sec_ind_handler(struct dp_soc *soc, uint16_t peer_id,
|
||||
}
|
||||
|
||||
#ifdef DP_PEER_EXTENDED_API
|
||||
/**
|
||||
* dp_register_peer() - Register peer into physical device
|
||||
* @pdev - data path device instance
|
||||
* @sta_desc - peer description
|
||||
*
|
||||
* Register peer into physical device
|
||||
*
|
||||
* Return: QDF_STATUS_SUCCESS registration success
|
||||
* QDF_STATUS_E_FAULT peer not found
|
||||
*/
|
||||
QDF_STATUS dp_register_peer(struct cdp_pdev *pdev_handle,
|
||||
QDF_STATUS dp_register_peer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
|
||||
struct ol_txrx_desc_type *sta_desc)
|
||||
{
|
||||
struct dp_peer *peer;
|
||||
struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle;
|
||||
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
||||
struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
|
||||
|
||||
peer = dp_find_peer_by_addr((struct cdp_pdev *)pdev,
|
||||
sta_desc->peer_addr.bytes);
|
||||
|
||||
if (!pdev)
|
||||
return QDF_STATUS_E_FAULT;
|
||||
|
||||
if (!peer)
|
||||
return QDF_STATUS_E_FAULT;
|
||||
|
||||
@@ -3148,21 +3145,16 @@ QDF_STATUS dp_register_peer(struct cdp_pdev *pdev_handle,
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_clear_peer() - remove peer from physical device
|
||||
* @pdev - data path device instance
|
||||
* @peer_addr - peer mac address
|
||||
*
|
||||
* remove peer from physical device
|
||||
*
|
||||
* Return: QDF_STATUS_SUCCESS registration success
|
||||
* QDF_STATUS_E_FAULT peer not found
|
||||
*/
|
||||
QDF_STATUS
|
||||
dp_clear_peer(struct cdp_pdev *pdev_handle, struct qdf_mac_addr peer_addr)
|
||||
dp_clear_peer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
|
||||
struct qdf_mac_addr peer_addr)
|
||||
{
|
||||
struct dp_peer *peer;
|
||||
struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle;
|
||||
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
||||
struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
|
||||
|
||||
if (!pdev)
|
||||
return QDF_STATUS_E_FAULT;
|
||||
|
||||
peer = dp_find_peer_by_addr((struct cdp_pdev *)pdev, peer_addr.bytes);
|
||||
if (!peer)
|
||||
@@ -3214,23 +3206,13 @@ void *dp_find_peer_by_addr_and_vdev(struct cdp_pdev *pdev_handle,
|
||||
return peer;
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_peer_state_update() - update peer local state
|
||||
* @pdev - data path device instance
|
||||
* @peer_addr - peer mac address
|
||||
* @state - new peer local state
|
||||
*
|
||||
* update peer local state
|
||||
*
|
||||
* Return: QDF_STATUS_SUCCESS registration success
|
||||
*/
|
||||
QDF_STATUS dp_peer_state_update(struct cdp_pdev *pdev_handle, uint8_t *peer_mac,
|
||||
QDF_STATUS dp_peer_state_update(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac,
|
||||
enum ol_txrx_peer_state state)
|
||||
{
|
||||
struct dp_peer *peer;
|
||||
struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle;
|
||||
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
||||
|
||||
peer = dp_peer_find_hash_find(pdev->soc, peer_mac, 0, DP_VDEV_ALL);
|
||||
peer = dp_peer_find_hash_find(soc, peer_mac, 0, DP_VDEV_ALL);
|
||||
if (!peer) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
|
||||
"Failed to find peer for: [%pM]", peer_mac);
|
||||
@@ -3247,22 +3229,24 @@ QDF_STATUS dp_peer_state_update(struct cdp_pdev *pdev_handle, uint8_t *peer_mac,
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_get_vdevid() - Get virtual interface id which peer registered
|
||||
* @peer - peer instance
|
||||
* @vdev_id - virtual interface id which peer registered
|
||||
*
|
||||
* Get virtual interface id which peer registered
|
||||
*
|
||||
* Return: QDF_STATUS_SUCCESS registration success
|
||||
*/
|
||||
QDF_STATUS dp_get_vdevid(void *peer_handle, uint8_t *vdev_id)
|
||||
QDF_STATUS dp_get_vdevid(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac,
|
||||
uint8_t *vdev_id)
|
||||
{
|
||||
struct dp_peer *peer = peer_handle;
|
||||
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
||||
struct dp_peer *peer =
|
||||
dp_peer_find_hash_find(soc, peer_mac, 0, DP_VDEV_ALL);
|
||||
|
||||
if (!peer)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
dp_info("peer %pK vdev %pK vdev id %d",
|
||||
peer, peer->vdev, peer->vdev->vdev_id);
|
||||
*vdev_id = peer->vdev->vdev_id;
|
||||
/* ref_cnt is incremented inside dp_peer_find_hash_find().
|
||||
* Decrement it here.
|
||||
*/
|
||||
dp_peer_unref_delete(peer);
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -3328,20 +3312,22 @@ uint8_t *dp_peer_get_peer_mac_addr(void *peer_handle)
|
||||
return peer->mac_addr.raw;
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_get_peer_state() - Get local peer state
|
||||
* @peer - peer instance
|
||||
*
|
||||
* Get local peer state
|
||||
*
|
||||
* Return: peer status
|
||||
*/
|
||||
int dp_get_peer_state(void *peer_handle)
|
||||
int dp_get_peer_state(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
||||
uint8_t *peer_mac)
|
||||
{
|
||||
struct dp_peer *peer = peer_handle;
|
||||
enum ol_txrx_peer_state peer_state;
|
||||
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
||||
struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac, 0,
|
||||
vdev_id);
|
||||
|
||||
if (!peer)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
DP_TRACE(DEBUG, "peer %pK stats %d", peer, peer->state);
|
||||
return peer->state;
|
||||
peer_state = peer->state;
|
||||
dp_peer_unref_delete(peer);
|
||||
|
||||
return peer_state;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3425,6 +3411,60 @@ void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer)
|
||||
pdev->local_peer_ids.map[i] = NULL;
|
||||
qdf_spin_unlock_bh(&pdev->local_peer_ids.lock);
|
||||
}
|
||||
|
||||
bool dp_find_peer_exist_on_vdev(struct cdp_soc_t *soc_hdl,
|
||||
uint8_t vdev_id, uint8_t *peer_addr)
|
||||
{
|
||||
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
||||
struct dp_vdev *vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id);
|
||||
|
||||
if (!vdev)
|
||||
return false;
|
||||
|
||||
return !!dp_find_peer_by_addr_and_vdev(
|
||||
dp_pdev_to_cdp_pdev(vdev->pdev),
|
||||
dp_vdev_to_cdp_vdev(vdev),
|
||||
peer_addr);
|
||||
}
|
||||
|
||||
bool dp_find_peer_exist_on_other_vdev(struct cdp_soc_t *soc_hdl,
|
||||
uint8_t vdev_id, uint8_t *peer_addr,
|
||||
uint16_t max_bssid)
|
||||
{
|
||||
int i;
|
||||
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
||||
struct dp_vdev *vdev;
|
||||
|
||||
for (i = 0; i < max_bssid; i++) {
|
||||
vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id);
|
||||
/* Need to check vdevs other than the vdev_id */
|
||||
if (vdev_id == i || !vdev)
|
||||
continue;
|
||||
if (dp_find_peer_by_addr_and_vdev(
|
||||
dp_pdev_to_cdp_pdev(vdev->pdev),
|
||||
dp_vdev_to_cdp_vdev(vdev),
|
||||
peer_addr)) {
|
||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,
|
||||
"%s: Duplicate peer %pM already exist on vdev %d",
|
||||
__func__, peer_addr, i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool dp_find_peer_exist(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
|
||||
uint8_t *peer_addr)
|
||||
{
|
||||
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
||||
struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
|
||||
|
||||
if (!pdev)
|
||||
return false;
|
||||
|
||||
return !!dp_find_peer_by_addr(dp_pdev_to_cdp_pdev(pdev), peer_addr);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
@@ -113,9 +113,8 @@ QDF_STATUS target_if_crypto_set_key(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_objmgr_pdev *pdev;
|
||||
enum cdp_sec_type sec_type = cdp_sec_type_none;
|
||||
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
|
||||
struct cdp_pdev *txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX);
|
||||
uint32_t pn[4] = {0, 0, 0, 0};
|
||||
struct cdp_peer *peer = NULL;
|
||||
bool peer_exist = false;
|
||||
uint8_t def_tx_idx;
|
||||
wmi_unified_t pdev_wmi_handle;
|
||||
bool pairwise;
|
||||
@@ -157,13 +156,14 @@ QDF_STATUS target_if_crypto_set_key(struct wlan_objmgr_vdev *vdev,
|
||||
qdf_mem_copy(¶ms.key_rsc_ctr,
|
||||
&req->keyrsc[0], sizeof(uint64_t));
|
||||
|
||||
peer = cdp_peer_find_by_addr(soc, txrx_pdev, req->macaddr);
|
||||
peer_exist = cdp_find_peer_exist(soc, pdev->pdev_objmgr.wlan_pdev_id,
|
||||
req->macaddr);
|
||||
target_if_debug("key_type %d, mac: %02x:%02x:%02x:%02x:%02x:%02x",
|
||||
key_type, req->macaddr[0], req->macaddr[1],
|
||||
req->macaddr[2], req->macaddr[3], req->macaddr[4],
|
||||
req->macaddr[5]);
|
||||
|
||||
if ((key_type == WLAN_CRYPTO_KEY_TYPE_UNICAST) && !peer) {
|
||||
if ((key_type == WLAN_CRYPTO_KEY_TYPE_UNICAST) && !peer_exist) {
|
||||
target_if_err("Invalid peer");
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
Reference in New Issue
Block a user