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:
Alok Kumar
2018-07-05 18:55:48 +05:30
committed by nshrivas
parent ba6526d5a5
commit fcdb185203
5 changed files with 159 additions and 91 deletions

View File

@@ -1035,9 +1035,8 @@ struct cdp_ocb_ops {
* @remove_peers_for_vdev_no_lock:
* @copy_mac_addr_raw:
* @add_last_real_peer:
* @last_assoc_received:
* @last_disassoc_received:
* @last_deauth_received:
* @get_last_mgmt_timestamp:
* @set_last_mgmt_timestamp:
* @is_vdev_restore_last_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 (*add_last_real_peer)(struct cdp_pdev *pdev,
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);
void (*update_last_real_peer)(struct cdp_pdev *pdev, void *peer,
uint8_t *peer_id, bool restore_last_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);
};
/**

View File

@@ -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
* @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
* last assoc received peer
*
* Return: pointer
* Return: true/false
*/
static inline qdf_time_t *
cdp_peer_last_assoc_received(ol_txrx_soc_handle soc, void *peer)
static inline bool
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) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
"%s invalid instance", __func__);
return NULL;
return 0;
}
if (soc->ops->peer_ops->last_assoc_received)
return soc->ops->peer_ops->last_assoc_received(peer);
if (soc->ops->peer_ops->get_last_mgmt_timestamp) {
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
* @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
* last disassoc received peer
*
* Return: pointer
* Return: true/false
*/
static inline qdf_time_t *
cdp_peer_last_disassoc_received(ol_txrx_soc_handle soc, void *peer)
static inline bool
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) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
"%s invalid instance", __func__);
return NULL;
return false;
}
if (soc->ops->peer_ops->last_disassoc_received)
return soc->ops->peer_ops->last_disassoc_received(peer);
return NULL;
if (soc->ops->peer_ops->update_last_mgmt_timestamp) {
return soc->ops->peer_ops->
update_last_mgmt_timestamp(pdev, peer_addr,
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 soc->ops->peer_ops->last_deauth_received(peer);
return NULL;
return false;
}
/**

View File

@@ -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_alloc(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);
qdf_time_t *dp_get_last_disassoc_received(void *peer_handle);
qdf_time_t *dp_get_last_deauth_received(void *peer_handle);
bool dp_get_last_mgmt_timestamp(struct cdp_pdev *ppdev, u8 *peer_addr,
u8 subtype, qdf_time_t *timestamp);
bool dp_update_last_mgmt_timestamp(struct cdp_pdev *ppdev, u8 *peer_addr,
qdf_time_t timestamp, u8 subtype);
#else
static inline void dp_local_peer_id_pool_init(struct dp_pdev *pdev)
{

View File

@@ -7417,9 +7417,8 @@ static struct cdp_peer_ops dp_ops_peer = {
.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,
.last_assoc_received = dp_get_last_assoc_received,
.last_disassoc_received = dp_get_last_disassoc_received,
.last_deauth_received = dp_get_last_deauth_received,
.get_last_mgmt_timestamp = dp_get_last_mgmt_timestamp,
.update_last_mgmt_timestamp = dp_update_last_mgmt_timestamp,
};
#endif

View File

@@ -2174,48 +2174,125 @@ int dp_get_peer_state(void *peer_handle)
}
/**
* dp_get_last_assoc_received() - get time of last assoc received
* @peer_handle: peer handle
* dp_get_last_mgmt_timestamp() - get timestamp of last mgmt frame
* @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,
peer->last_assoc_rcvd);
return &peer->last_assoc_rcvd;
bool ret = false;
struct dp_pdev *pdev = (struct dp_pdev *)ppdev;
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
* @peer_handle: peer handle
* dp_update_last_mgmt_timestamp() - set timestamp of last mgmt frame
* @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)
{
struct dp_peer *peer = peer_handle;
DP_TRACE(INFO, "peer %pK last_disassoc_rcvd: %lu", peer,
peer->last_disassoc_rcvd);
return &peer->last_disassoc_rcvd;
bool dp_update_last_mgmt_timestamp(struct cdp_pdev *ppdev, u8 *peer_addr,
qdf_time_t timestamp, u8 subtype)
{
union dp_align_mac_addr local_mac_addr_aligned, *mac_addr;
unsigned int index;
struct dp_peer *peer;
struct dp_soc *soc;
bool ret = false;
struct dp_pdev *pdev = (struct dp_pdev *)ppdev;
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:
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;
}
/**
* dp_get_last_deauth_received() - get time of last deauth received
* @peer_handle: peer handle
*
* 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,
peer->last_deauth_rcvd);
return &peer->last_deauth_rcvd;
qdf_spin_unlock_bh(&soc->peer_ref_mutex);
return ret;
}
}
qdf_spin_unlock_bh(&soc->peer_ref_mutex);
return false; /*failure*/
}
/**