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: * @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);
}; };
/** /**

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 * @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;
} }
/** /**

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_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)
{ {

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, .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

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 * 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*/
} }
/** /**