qcacmn: Add cdp ops to set/get timestamp for management frames
Add cdp ops for timestamp setter/getter function for peer based on mac address. Change-Id: I7025fdd7540f47bb4d3f95ef6d9f2ef92af5f1f1 CRs-Fixed: 2275985
This commit is contained in:
@@ -1035,9 +1035,8 @@ struct cdp_ocb_ops {
|
|||||||
* @remove_peers_for_vdev_no_lock:
|
* @remove_peers_for_vdev_no_lock:
|
||||||
* @copy_mac_addr_raw:
|
* @copy_mac_addr_raw:
|
||||||
* @add_last_real_peer:
|
* @add_last_real_peer:
|
||||||
* @last_assoc_received:
|
* @get_last_mgmt_timestamp:
|
||||||
* @last_disassoc_received:
|
* @set_last_mgmt_timestamp:
|
||||||
* @last_deauth_received:
|
|
||||||
* @is_vdev_restore_last_peer:
|
* @is_vdev_restore_last_peer:
|
||||||
* @update_last_real_peer:
|
* @update_last_real_peer:
|
||||||
*/
|
*/
|
||||||
@@ -1081,13 +1080,18 @@ struct cdp_peer_ops {
|
|||||||
void (*copy_mac_addr_raw)(struct cdp_vdev *vdev, uint8_t *bss_addr);
|
void (*copy_mac_addr_raw)(struct cdp_vdev *vdev, uint8_t *bss_addr);
|
||||||
void (*add_last_real_peer)(struct cdp_pdev *pdev,
|
void (*add_last_real_peer)(struct cdp_pdev *pdev,
|
||||||
struct cdp_vdev *vdev, uint8_t *peer_id);
|
struct cdp_vdev *vdev, uint8_t *peer_id);
|
||||||
qdf_time_t * (*last_assoc_received)(void *peer);
|
|
||||||
qdf_time_t * (*last_disassoc_received)(void *peer);
|
|
||||||
qdf_time_t * (*last_deauth_received)(void *peer);
|
|
||||||
bool (*is_vdev_restore_last_peer)(void *peer);
|
bool (*is_vdev_restore_last_peer)(void *peer);
|
||||||
void (*update_last_real_peer)(struct cdp_pdev *pdev, void *peer,
|
void (*update_last_real_peer)(struct cdp_pdev *pdev, void *peer,
|
||||||
uint8_t *peer_id, bool restore_last_peer);
|
uint8_t *peer_id, bool restore_last_peer);
|
||||||
void (*peer_detach_force_delete)(void *peer);
|
void (*peer_detach_force_delete)(void *peer);
|
||||||
|
bool (*get_last_mgmt_timestamp)(struct cdp_pdev *ppdev,
|
||||||
|
u8 *peer_addr,
|
||||||
|
u8 subtype,
|
||||||
|
qdf_time_t *timestamp);
|
||||||
|
bool (*update_last_mgmt_timestamp)(struct cdp_pdev *ppdev,
|
||||||
|
u8 *peer_addr,
|
||||||
|
qdf_time_t timestamp,
|
||||||
|
u8 subtype);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -568,78 +568,65 @@ cdp_peer_add_last_real_peer(ol_txrx_soc_handle soc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cdp_peer_last_assoc_received() - last assoc received peer
|
* cdp_peer_get_last_mgmt_timestamp() - retrieve last timestamp for peer
|
||||||
* @soc - data path soc handle
|
* @soc - data path soc handle
|
||||||
* @peer - peer instance pointer
|
* @pdev - data path device instance
|
||||||
|
* @peer_addr - peer mac addr
|
||||||
|
* @subtype - Management frame subtype
|
||||||
*
|
*
|
||||||
* !!! This should be implemented on legacy also
|
* Return: true/false
|
||||||
* last assoc received peer
|
|
||||||
*
|
|
||||||
* Return: pointer
|
|
||||||
*/
|
*/
|
||||||
static inline qdf_time_t *
|
static inline bool
|
||||||
cdp_peer_last_assoc_received(ol_txrx_soc_handle soc, void *peer)
|
cdp_peer_get_last_mgmt_timestamp(ol_txrx_soc_handle soc,
|
||||||
|
struct cdp_pdev *pdev,
|
||||||
|
u8 *peer_addr,
|
||||||
|
u8 subtype,
|
||||||
|
qdf_time_t *timestamp)
|
||||||
{
|
{
|
||||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||||
"%s invalid instance", __func__);
|
"%s invalid instance", __func__);
|
||||||
return NULL;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (soc->ops->peer_ops->last_assoc_received)
|
if (soc->ops->peer_ops->get_last_mgmt_timestamp) {
|
||||||
return soc->ops->peer_ops->last_assoc_received(peer);
|
return soc->ops->peer_ops->
|
||||||
|
get_last_mgmt_timestamp(pdev, peer_addr,
|
||||||
|
subtype, timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cdp_peer_last_disassoc_received() - last disassoc received peer
|
* cdp_peer_update_last_mgmt_timestamp() - update timestamp for the peer
|
||||||
* @soc - data path soc handle
|
* @soc - data path soc handle
|
||||||
* @peer - peer instance pointer
|
* @pdev - data path device instance
|
||||||
|
* @peer_addr - peer mac addr
|
||||||
|
* @subtype - Management frame subtype
|
||||||
*
|
*
|
||||||
* !!! This should be implemented on legacy also
|
* Return: true/false
|
||||||
* last disassoc received peer
|
|
||||||
*
|
|
||||||
* Return: pointer
|
|
||||||
*/
|
*/
|
||||||
static inline qdf_time_t *
|
static inline bool
|
||||||
cdp_peer_last_disassoc_received(ol_txrx_soc_handle soc, void *peer)
|
cdp_peer_update_last_mgmt_timestamp(ol_txrx_soc_handle soc,
|
||||||
|
struct cdp_pdev *pdev,
|
||||||
|
u8 *peer_addr,
|
||||||
|
qdf_time_t timestamp,
|
||||||
|
u8 subtype)
|
||||||
{
|
{
|
||||||
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
if (!soc || !soc->ops || !soc->ops->peer_ops) {
|
||||||
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
|
||||||
"%s invalid instance", __func__);
|
"%s invalid instance", __func__);
|
||||||
return NULL;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (soc->ops->peer_ops->last_disassoc_received)
|
if (soc->ops->peer_ops->update_last_mgmt_timestamp) {
|
||||||
return soc->ops->peer_ops->last_disassoc_received(peer);
|
return soc->ops->peer_ops->
|
||||||
|
update_last_mgmt_timestamp(pdev, peer_addr,
|
||||||
return NULL;
|
timestamp, subtype);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* cdp_peer_last_deauth_received() - last deauth received peer
|
|
||||||
* @soc - data path soc handle
|
|
||||||
* @peer - peer instance pointer
|
|
||||||
*
|
|
||||||
* !!! This should be implemented on legacy also
|
|
||||||
* last deauth received peer
|
|
||||||
*
|
|
||||||
* Return: pointer
|
|
||||||
*/
|
|
||||||
static inline qdf_time_t *
|
|
||||||
cdp_peer_last_deauth_received(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->last_deauth_received)
|
return false;
|
||||||
return soc->ops->peer_ops->last_deauth_received(peer);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -364,9 +364,10 @@ int dp_get_peer_state(void *peer_handle);
|
|||||||
void dp_local_peer_id_pool_init(struct dp_pdev *pdev);
|
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_alloc(struct dp_pdev *pdev, struct dp_peer *peer);
|
||||||
void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer);
|
void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer);
|
||||||
qdf_time_t *dp_get_last_assoc_received(void *peer_handle);
|
bool dp_get_last_mgmt_timestamp(struct cdp_pdev *ppdev, u8 *peer_addr,
|
||||||
qdf_time_t *dp_get_last_disassoc_received(void *peer_handle);
|
u8 subtype, qdf_time_t *timestamp);
|
||||||
qdf_time_t *dp_get_last_deauth_received(void *peer_handle);
|
bool dp_update_last_mgmt_timestamp(struct cdp_pdev *ppdev, u8 *peer_addr,
|
||||||
|
qdf_time_t timestamp, u8 subtype);
|
||||||
#else
|
#else
|
||||||
static inline void dp_local_peer_id_pool_init(struct dp_pdev *pdev)
|
static inline void dp_local_peer_id_pool_init(struct dp_pdev *pdev)
|
||||||
{
|
{
|
||||||
|
@@ -7417,9 +7417,8 @@ static struct cdp_peer_ops dp_ops_peer = {
|
|||||||
.peer_get_peer_mac_addr = dp_peer_get_peer_mac_addr,
|
.peer_get_peer_mac_addr = dp_peer_get_peer_mac_addr,
|
||||||
.get_vdev_for_peer = dp_get_vdev_for_peer,
|
.get_vdev_for_peer = dp_get_vdev_for_peer,
|
||||||
.get_peer_state = dp_get_peer_state,
|
.get_peer_state = dp_get_peer_state,
|
||||||
.last_assoc_received = dp_get_last_assoc_received,
|
.get_last_mgmt_timestamp = dp_get_last_mgmt_timestamp,
|
||||||
.last_disassoc_received = dp_get_last_disassoc_received,
|
.update_last_mgmt_timestamp = dp_update_last_mgmt_timestamp,
|
||||||
.last_deauth_received = dp_get_last_deauth_received,
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -2174,48 +2174,125 @@ int dp_get_peer_state(void *peer_handle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dp_get_last_assoc_received() - get time of last assoc received
|
* dp_get_last_mgmt_timestamp() - get timestamp of last mgmt frame
|
||||||
* @peer_handle: peer handle
|
* @pdev: pdev handle
|
||||||
|
* @ppeer_addr: peer mac addr
|
||||||
|
* @subtype: management frame type
|
||||||
|
* @timestamp: last timestamp
|
||||||
*
|
*
|
||||||
* Return: pointer for the time of last assoc received
|
* Return: true if timestamp is retrieved for valid peer else false
|
||||||
*/
|
*/
|
||||||
qdf_time_t *dp_get_last_assoc_received(void *peer_handle)
|
bool dp_get_last_mgmt_timestamp(struct cdp_pdev *ppdev, u8 *peer_addr,
|
||||||
|
u8 subtype, qdf_time_t *timestamp)
|
||||||
{
|
{
|
||||||
struct dp_peer *peer = peer_handle;
|
union dp_align_mac_addr local_mac_addr_aligned, *mac_addr;
|
||||||
|
unsigned int index;
|
||||||
|
struct dp_peer *peer;
|
||||||
|
struct dp_soc *soc;
|
||||||
|
|
||||||
DP_TRACE(INFO, "peer %pK last_assoc_rcvd: %lu", peer,
|
bool ret = false;
|
||||||
peer->last_assoc_rcvd);
|
struct dp_pdev *pdev = (struct dp_pdev *)ppdev;
|
||||||
return &peer->last_assoc_rcvd;
|
|
||||||
|
soc = pdev->soc;
|
||||||
|
qdf_mem_copy(
|
||||||
|
&local_mac_addr_aligned.raw[0],
|
||||||
|
peer_addr, DP_MAC_ADDR_LEN);
|
||||||
|
mac_addr = &local_mac_addr_aligned;
|
||||||
|
|
||||||
|
index = dp_peer_find_hash_index(soc, mac_addr);
|
||||||
|
|
||||||
|
qdf_spin_lock_bh(&soc->peer_ref_mutex);
|
||||||
|
TAILQ_FOREACH(peer, &soc->peer_hash.bins[index], hash_list_elem) {
|
||||||
|
#if ATH_SUPPORT_WRAP
|
||||||
|
/* ProxySTA may have multiple BSS peer with same MAC address,
|
||||||
|
* modified find will take care of finding the correct BSS peer.
|
||||||
|
*/
|
||||||
|
if (dp_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) == 0 &&
|
||||||
|
(peer->vdev->vdev_id == DP_VDEV_ALL)) {
|
||||||
|
#else
|
||||||
|
if (dp_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) == 0) {
|
||||||
|
#endif
|
||||||
|
/* found it */
|
||||||
|
switch (subtype) {
|
||||||
|
case IEEE80211_FC0_SUBTYPE_ASSOC_REQ:
|
||||||
|
*timestamp = peer->last_assoc_rcvd;
|
||||||
|
ret = true;
|
||||||
|
break;
|
||||||
|
case IEEE80211_FC0_SUBTYPE_DISASSOC:
|
||||||
|
case IEEE80211_FC0_SUBTYPE_DEAUTH:
|
||||||
|
*timestamp = peer->last_disassoc_rcvd;
|
||||||
|
ret = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
qdf_spin_unlock_bh(&soc->peer_ref_mutex);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
qdf_spin_unlock_bh(&soc->peer_ref_mutex);
|
||||||
|
return false; /*failure*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dp_get_last_disassoc_received() - get time of last disassoc received
|
* dp_update_last_mgmt_timestamp() - set timestamp of last mgmt frame
|
||||||
* @peer_handle: peer handle
|
* @pdev: pdev handle
|
||||||
|
* @ppeer_addr: peer mac addr
|
||||||
|
* @timestamp: time to be set
|
||||||
|
* @subtype: management frame type
|
||||||
*
|
*
|
||||||
* Return: pointer for the time of last disassoc received
|
* Return: true if timestamp is updated for valid peer else false
|
||||||
*/
|
*/
|
||||||
qdf_time_t *dp_get_last_disassoc_received(void *peer_handle)
|
|
||||||
|
bool dp_update_last_mgmt_timestamp(struct cdp_pdev *ppdev, u8 *peer_addr,
|
||||||
|
qdf_time_t timestamp, u8 subtype)
|
||||||
{
|
{
|
||||||
struct dp_peer *peer = peer_handle;
|
union dp_align_mac_addr local_mac_addr_aligned, *mac_addr;
|
||||||
|
unsigned int index;
|
||||||
|
struct dp_peer *peer;
|
||||||
|
struct dp_soc *soc;
|
||||||
|
|
||||||
DP_TRACE(INFO, "peer %pK last_disassoc_rcvd: %lu", peer,
|
bool ret = false;
|
||||||
peer->last_disassoc_rcvd);
|
struct dp_pdev *pdev = (struct dp_pdev *)ppdev;
|
||||||
return &peer->last_disassoc_rcvd;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
soc = pdev->soc;
|
||||||
* dp_get_last_deauth_received() - get time of last deauth received
|
qdf_mem_copy(&local_mac_addr_aligned.raw[0],
|
||||||
* @peer_handle: peer handle
|
peer_addr, DP_MAC_ADDR_LEN);
|
||||||
*
|
mac_addr = &local_mac_addr_aligned;
|
||||||
* Return: pointer for the time of last deauth received
|
|
||||||
*/
|
|
||||||
qdf_time_t *dp_get_last_deauth_received(void *peer_handle)
|
|
||||||
{
|
|
||||||
struct dp_peer *peer = peer_handle;
|
|
||||||
|
|
||||||
DP_TRACE(INFO, "peer %pK last_deauth_rcvd: %lu", peer,
|
index = dp_peer_find_hash_index(soc, mac_addr);
|
||||||
peer->last_deauth_rcvd);
|
|
||||||
return &peer->last_deauth_rcvd;
|
qdf_spin_lock_bh(&soc->peer_ref_mutex);
|
||||||
|
TAILQ_FOREACH(peer, &soc->peer_hash.bins[index], hash_list_elem) {
|
||||||
|
#if ATH_SUPPORT_WRAP
|
||||||
|
/* ProxySTA may have multiple BSS peer with same MAC address,
|
||||||
|
* modified find will take care of finding the correct BSS peer.
|
||||||
|
*/
|
||||||
|
if (dp_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) == 0 &&
|
||||||
|
(peer->vdev->vdev_id == DP_VDEV_ALL)) {
|
||||||
|
#else
|
||||||
|
if (dp_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) == 0) {
|
||||||
|
#endif
|
||||||
|
/* found it */
|
||||||
|
switch (subtype) {
|
||||||
|
case IEEE80211_FC0_SUBTYPE_ASSOC_REQ:
|
||||||
|
peer->last_assoc_rcvd = timestamp;
|
||||||
|
ret = true;
|
||||||
|
break;
|
||||||
|
case IEEE80211_FC0_SUBTYPE_DISASSOC:
|
||||||
|
case IEEE80211_FC0_SUBTYPE_DEAUTH:
|
||||||
|
peer->last_disassoc_rcvd = timestamp;
|
||||||
|
ret = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
qdf_spin_unlock_bh(&soc->peer_ref_mutex);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
qdf_spin_unlock_bh(&soc->peer_ref_mutex);
|
||||||
|
return false; /*failure*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user