diff options
| author | Hong Shi <hongsh@qti.qualcomm.com> | 2015-11-06 16:18:40 +0800 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2015-11-19 14:21:42 +0530 |
| commit | cc7293df71fb5523ae002a7ad003f1ba276cbb68 (patch) | |
| tree | f5974cb8c9a78a5be779006a074a21f4dd4f4017 | |
| parent | d953658e47dfba299e589564d7a07e0d4b066d98 (diff) | |
qcacld-2.0: Fix roaming can't work issue
Roaming failed because preauth frame are not sending on
target ap channel. Rootcause is peer tid queue is paused
while off home channel. Fix is to select vdev queue
instead of peer tid queue when sending preauth frame.
Change-Id: I86c3116d77a4038f0ff642df75ae408e9dd19224
CRs-Fixed: 936226
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_tx_classify.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_classify.c b/CORE/CLD_TXRX/TXRX/ol_tx_classify.c index 01a5257ea675..17f93435be25 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_classify.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx_classify.c @@ -576,6 +576,7 @@ ol_tx_classify_mgmt( struct ol_txrx_peer_t *peer = NULL; struct ol_tx_frms_queue_t *txq = NULL; A_UINT8 *dest_addr; + union ol_txrx_align_mac_addr_t local_mac_addr_aligned, *mac_addr; TX_SCHED_DEBUG_PRINT("Enter %s\n", __func__); dest_addr = ol_tx_dest_addr_find(pdev, tx_nbuf); @@ -609,6 +610,23 @@ ol_tx_classify_mgmt( * MAC address. */ peer = ol_txrx_assoc_peer_find(vdev); + /* + * Some special case(preauth for example) needs to send + * unicast mgmt frame to unassociated AP. In such case, + * we need to check if dest addr match the associated + * peer addr. If not, we set peer as NULL to queue this + * frame to vdev queue. + */ + if (peer) { + adf_os_mem_copy( + &local_mac_addr_aligned.raw[0], + dest_addr, OL_TXRX_MAC_ADDR_LEN); + mac_addr = &local_mac_addr_aligned; + if (ol_txrx_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) != 0) { + adf_os_atomic_dec(&peer->ref_cnt); + peer = NULL; + } + } } else { /* find the peer and increment its reference count */ peer = ol_txrx_peer_find_hash_find(pdev, dest_addr, 0, 1); |
