diff options
47 files changed, 714 insertions, 235 deletions
diff --git a/core/cds/inc/cds_regdomain.h b/core/cds/inc/cds_regdomain.h index 664e2ca8ac9c..0e925b2637c5 100644 --- a/core/cds/inc/cds_regdomain.h +++ b/core/cds/inc/cds_regdomain.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2011, 2014-2019 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 @@ -65,7 +65,7 @@ #define MAX_CHANNELS_PER_OPERATING_CLASS 25 #define CDS_MAX_SUPP_OPER_CLASSES 32 #define MIN_TX_PWR_CAP 8 -#define MAX_TX_PWR_CAP 22 +#define MAX_TX_PWR_CAP 30 #define CTRY_DEFAULT 0 #define CTRY_FLAG 0x8000 diff --git a/core/cds/inc/cds_sched.h b/core/cds/inc/cds_sched.h index 835b5a04c082..eae8de839f91 100644 --- a/core/cds/inc/cds_sched.h +++ b/core/cds/inc/cds_sched.h @@ -43,6 +43,7 @@ #include "cds_config.h" #include "cds_reg_service.h" #include "qdf_cpuhp.h" +#include "ol_txrx.h" #define TX_POST_EVENT 0x001 #define TX_SUSPEND_EVENT 0x002 @@ -90,7 +91,8 @@ typedef void (*cds_ol_rx_thread_cb)(void *context, void *rxpkt, uint16_t staid); typedef void (*cds_ol_mon_thread_cb)( void *context, void *monpkt, uint8_t vdev_id, uint8_t tid, - uint8_t status, bool pkt_format); + struct ol_mon_tx_status pkt_tx_status, + bool pkt_format); typedef int (*send_mode_change_event_cb)(void); @@ -140,7 +142,7 @@ struct cds_ol_mon_pkt { uint8_t tid; /* Tx packet status */ - uint8_t status; + struct ol_mon_tx_status pkt_tx_status; /* 0 = 802.3 format , 1 = 802.11 format */ bool pkt_format; diff --git a/core/cds/src/cds_api.c b/core/cds/src/cds_api.c index c6de500cc785..c8898ebb5aa5 100644 --- a/core/cds/src/cds_api.c +++ b/core/cds/src/cds_api.c @@ -1180,7 +1180,7 @@ void *cds_get_context(QDF_MODULE_ID moduleId) } if (pModContext == NULL) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, + QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG, "%s: Module ID %i context is Null", __func__, moduleId); } diff --git a/core/cds/src/cds_concurrency.c b/core/cds/src/cds_concurrency.c index b3b500b38692..d4e2a8fc6298 100644 --- a/core/cds/src/cds_concurrency.c +++ b/core/cds/src/cds_concurrency.c @@ -3036,6 +3036,11 @@ bool cds_is_connection_in_progress(uint8_t *session_id, } if (hdd_ctx->connection_in_progress) { cds_debug("AP/GO: connection is in progress"); + if (session_id && reason) { + *session_id = adapter->sessionId; + *reason = + eHDD_SAP_CONNECTION_IN_PROGRESS; + } return true; } } diff --git a/core/cds/src/cds_sched.c b/core/cds/src/cds_sched.c index 5bb7e5bdd6e3..a1f8cf6c4ea4 100644 --- a/core/cds/src/cds_sched.c +++ b/core/cds/src/cds_sched.c @@ -1565,7 +1565,7 @@ static void cds_mon_from_queue(p_cds_sched_context pschedcontext) vdev_id = pkt->vdev_id; tid = pkt->tid; pkt->callback(pkt->context, pkt->monpkt, vdev_id, - tid, pkt->status, pkt->pkt_format); + tid, pkt->pkt_tx_status, pkt->pkt_format); cds_free_ol_mon_pkt(pschedcontext, pkt); spin_lock_bh(&pschedcontext->ol_mon_queue_lock); } diff --git a/core/dp/htt/htt_t2h.c b/core/dp/htt/htt_t2h.c index ff5c6e281b68..2548ea72ebbf 100644 --- a/core/dp/htt/htt_t2h.c +++ b/core/dp/htt/htt_t2h.c @@ -186,6 +186,12 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg, uint16_t seq_num_start, seq_num_end; enum htt_rx_flush_action action; + if (qdf_nbuf_len(htt_t2h_msg) < HTT_RX_FLUSH_BYTES) { + qdf_print("invalid nbuff len"); + WARN_ON(1); + break; + } + peer_id = HTT_RX_FLUSH_PEER_ID_GET(*msg_word); tid = HTT_RX_FLUSH_TID_GET(*msg_word); seq_num_start = @@ -228,7 +234,13 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg, { uint16_t peer_id; uint8_t tid; + int msg_len = qdf_nbuf_len(htt_t2h_msg); + if (msg_len < HTT_RX_FRAG_IND_BYTES) { + qdf_print("invalid nbuff len"); + WARN_ON(1); + break; + } peer_id = HTT_RX_FRAG_IND_PEER_ID_GET(*msg_word); tid = HTT_RX_FRAG_IND_EXT_TID_GET(*msg_word); htt_rx_frag_set_last_msdu(pdev, htt_t2h_msg); @@ -289,6 +301,12 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg, uint16_t peer_id; uint8_t vdev_id; + if (qdf_nbuf_len(htt_t2h_msg) < HTT_RX_PEER_MAP_BYTES) { + qdf_print("invalid nbuff len"); + WARN_ON(1); + break; + } + peer_id = HTT_RX_PEER_MAP_PEER_ID_GET(*msg_word); vdev_id = HTT_RX_PEER_MAP_VDEV_ID_GET(*msg_word); peer_mac_addr = htt_t2h_mac_addr_deswizzle( @@ -312,6 +330,12 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg, { uint16_t peer_id; + if (qdf_nbuf_len(htt_t2h_msg) < HTT_RX_PEER_UNMAP_BYTES) { + qdf_print("invalid nbuff len"); + WARN_ON(1); + break; + } + peer_id = HTT_RX_PEER_UNMAP_PEER_ID_GET(*msg_word); if (peer_id > ol_cfg_max_peer_id(pdev->ctrl_pdev)) { qdf_print("%s: HTT_T2H_MSG_TYPE_PEER_UNMAP," @@ -330,6 +354,12 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg, enum htt_sec_type sec_type; int is_unicast; + if (qdf_nbuf_len(htt_t2h_msg) < HTT_SEC_IND_BYTES) { + qdf_print("invalid nbuff len"); + WARN_ON(1); + break; + } + peer_id = HTT_SEC_IND_PEER_ID_GET(*msg_word); sec_type = HTT_SEC_IND_SEC_TYPE_GET(*msg_word); is_unicast = HTT_SEC_IND_UNICAST_GET(*msg_word); @@ -417,6 +447,13 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg, uint32_t htt_credit_delta_abs; int32_t htt_credit_delta; int sign, old_credit; + int msg_len = qdf_nbuf_len(htt_t2h_msg); + + if (msg_len < HTT_TX_CREDIT_MSG_BYTES) { + qdf_print("invalid nbuff len"); + WARN_ON(1); + break; + } htt_credit_delta_abs = HTT_TX_CREDIT_DELTA_ABS_GET(*msg_word); @@ -544,8 +581,16 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg, struct ol_error_info err_info; struct ol_txrx_vdev_t *vdev; struct ol_txrx_peer_t *peer; - uint16_t peer_id = - HTT_RX_OFLD_PKT_ERR_MIC_ERR_PEER_ID_GET + uint16_t peer_id; + int msg_len = qdf_nbuf_len(htt_t2h_msg); + + if (msg_len < HTT_RX_OFLD_PKT_ERR_MIC_ERR_BYTES) { + qdf_print("invalid nbuff len"); + WARN_ON(1); + break; + } + + peer_id = HTT_RX_OFLD_PKT_ERR_MIC_ERR_PEER_ID_GET (*(msg_word + 1)); peer = ol_txrx_peer_find_by_id(pdev->txrx_pdev, @@ -849,6 +894,13 @@ void htt_t2h_msg_handler(void *context, HTC_PACKET *pkt) uint16_t peer_id; uint8_t tid, pn_ie_cnt, *pn_ie = NULL; uint16_t seq_num_start, seq_num_end; + int msg_len = qdf_nbuf_len(htt_t2h_msg); + + if (msg_len < HTT_RX_PN_IND_BYTES) { + qdf_print("invalid nbuff len"); + WARN_ON(1); + break; + } /*First dword */ peer_id = HTT_RX_PN_IND_PEER_ID_GET(*msg_word); @@ -861,6 +913,13 @@ void htt_t2h_msg_handler(void *context, HTC_PACKET *pkt) seq_num_end = HTT_RX_PN_IND_SEQ_NUM_END_GET(*msg_word); pn_ie_cnt = HTT_RX_PN_IND_PN_IE_CNT_GET(*msg_word); + if (msg_len - HTT_RX_PN_IND_BYTES < + pn_ie_cnt * sizeof(uint8_t)) { + qdf_print("invalid pn_ie count"); + WARN_ON(1); + break; + } + msg_word++; /*Third dword */ if (pn_ie_cnt) @@ -1138,6 +1197,13 @@ void htt_t2h_msg_handler_fast(void *context, qdf_nbuf_t *cmpl_msdus, u_int16_t peer_id; u_int8_t tid, pn_ie_cnt, *pn_ie = NULL; int seq_num_start, seq_num_end; + int msg_len = qdf_nbuf_len(htt_t2h_msg); + + if (msg_len < HTT_RX_PN_IND_BYTES) { + qdf_print("invalid nbuff len"); + WARN_ON(1); + break; + } /*First dword */ peer_id = HTT_RX_PN_IND_PEER_ID_GET(*msg_word); @@ -1152,6 +1218,13 @@ void htt_t2h_msg_handler_fast(void *context, qdf_nbuf_t *cmpl_msdus, pn_ie_cnt = HTT_RX_PN_IND_PN_IE_CNT_GET(*msg_word); + if (msg_len - HTT_RX_PN_IND_BYTES < + pn_ie_cnt * sizeof(uint8_t)) { + qdf_print("invalid pn_ie len"); + WARN_ON(1); + break; + } + msg_word++; /*Third dword*/ if (pn_ie_cnt) diff --git a/core/dp/ol/inc/ol_txrx_osif_api.h b/core/dp/ol/inc/ol_txrx_osif_api.h index d2fe056a63d2..c89c56da105b 100644 --- a/core/dp/ol/inc/ol_txrx_osif_api.h +++ b/core/dp/ol/inc/ol_txrx_osif_api.h @@ -83,7 +83,7 @@ void ol_rx_data_process(struct ol_txrx_peer_t *peer, * @mon_buf_list: netbuf list * @type: data process type * @tid: tid number - * @status: Tx status + * @pkt_tx_status: Tx status * @pktformat: Frame format * * Return: none @@ -91,7 +91,9 @@ void ol_rx_data_process(struct ol_txrx_peer_t *peer, void ol_txrx_mon_data_process(uint8_t vdev_id, qdf_nbuf_t mon_buf_list, enum mon_data_process_type type, - uint8_t tid, uint8_t status, bool pktformat); + uint8_t tid, + struct ol_mon_tx_status pkt_tx_status, + bool pktformat); void ol_txrx_flush_rx_frames(struct ol_txrx_peer_t *peer, bool drop); diff --git a/core/dp/txrx/ol_rx.c b/core/dp/txrx/ol_rx.c index 17f3696b2ab3..e4310496dd35 100644 --- a/core/dp/txrx/ol_rx.c +++ b/core/dp/txrx/ol_rx.c @@ -1476,6 +1476,7 @@ ol_rx_in_order_indication_handler(ol_txrx_pdev_handle pdev, uint32_t filled = 0; uint8_t vdev_id; bool is_pkt_capture_flow_id = false; + struct ol_mon_tx_status pkt_tx_status = {0}; if (tid >= OL_TXRX_NUM_EXT_TIDS) { ol_txrx_err("%s: invalid tid, %u\n", __FUNCTION__, tid); @@ -1585,7 +1586,7 @@ ol_rx_in_order_indication_handler(ol_txrx_pdev_handle pdev, if (head_mon_msdu) ol_txrx_mon_data_process( vdev_id, head_mon_msdu, - PROCESS_TYPE_DATA_RX, 0, 0, + PROCESS_TYPE_DATA_RX, 0, pkt_tx_status, TXRX_PKT_FORMAT_8023); if (is_pkt_capture_flow_id) { diff --git a/core/dp/txrx/ol_rx_defrag.c b/core/dp/txrx/ol_rx_defrag.c index 4373999b4467..84045eb8ad58 100644 --- a/core/dp/txrx/ol_rx_defrag.c +++ b/core/dp/txrx/ol_rx_defrag.c @@ -684,6 +684,7 @@ ol_rx_defrag(ol_txrx_pdev_handle pdev, struct ieee80211_frame *wh; uint8_t key[DEFRAG_IEEE80211_KEY_LEN]; htt_pdev_handle htt_pdev = pdev->htt_pdev; + struct ol_mon_tx_status pkt_tx_status = {0}; vdev = peer->vdev; @@ -832,7 +833,7 @@ ol_rx_defrag(ol_txrx_pdev_handle pdev, if (head_mon_msdu) ol_txrx_mon_data_process( vdev->vdev_id, head_mon_msdu, - PROCESS_TYPE_DATA_RX, 0, 0, + PROCESS_TYPE_DATA_RX, 0, pkt_tx_status, TXRX_PKT_FORMAT_8023); } diff --git a/core/dp/txrx/ol_tx_send.c b/core/dp/txrx/ol_tx_send.c index da4ab21e38c1..a1c433499fe2 100644 --- a/core/dp/txrx/ol_tx_send.c +++ b/core/dp/txrx/ol_tx_send.c @@ -54,6 +54,7 @@ #include <ol_txrx.h> #include <pktlog_ac_fmt.h> #include <utils_api.h> +#include "cds_utils.h" #ifdef TX_CREDIT_RECLAIM_SUPPORT @@ -835,6 +836,10 @@ ol_tx_process_mon_tx_completion( qdf_nbuf_t netbuf; int nbuf_len; struct qdf_tso_seg_elem_t *tso_seg = NULL; + struct ol_mon_tx_status pkt_tx_status = {0}; + + pkt_tx_status.status = status; + pkt_tx_status.tx_retry_cnt = payload->tx_retry_cnt; qdf_assert(tx_desc); @@ -928,7 +933,7 @@ ol_tx_process_mon_tx_completion( ol_txrx_mon_data_process(tx_desc->vdev_id, netbuf, PROCESS_TYPE_DATA_TX_COMPL, - tid, status, TXRX_PKT_FORMAT_8023); + tid, pkt_tx_status, TXRX_PKT_FORMAT_8023); } void @@ -936,7 +941,7 @@ ol_tx_offload_deliver_indication_handler(ol_txrx_pdev_handle pdev, void *msg) { int nbuf_len; qdf_nbuf_t netbuf; - uint8_t status; + struct ol_mon_tx_status pkt_tx_status = {0}; uint8_t tid = 0; bool pkt_format; u_int32_t *msg_word = (u_int32_t *)msg; @@ -945,6 +950,7 @@ ol_tx_offload_deliver_indication_handler(ol_txrx_pdev_handle pdev, void *msg) struct htt_tx_offload_deliver_ind_hdr_t *offload_deliver_msg; bool is_pkt_during_roam = false; uint8_t vdev_id; + uint32_t freq = 0; offload_deliver_msg = (struct htt_tx_offload_deliver_ind_hdr_t *)msg; @@ -974,18 +980,23 @@ ol_tx_offload_deliver_indication_handler(ol_txrx_pdev_handle pdev, void *msg) qdf_mem_copy(qdf_nbuf_data(netbuf), txhdr, sizeof(struct htt_tx_data_hdr_information)); - status = offload_deliver_msg->status; + pkt_tx_status.status = offload_deliver_msg->status; + pkt_tx_status.tx_retry_cnt = offload_deliver_msg->tx_retry_cnt; pkt_format = offload_deliver_msg->format; tid = offload_deliver_msg->tid_num; /* Is FW sends offload data during roaming */ is_pkt_during_roam = (offload_deliver_msg->reserved_2 ? true : false); - if (is_pkt_during_roam) + if (is_pkt_during_roam) { vdev_id = HTT_INVALID_VDEV; + freq = (uint32_t)offload_deliver_msg->reserved_3; + + ol_htt_mon_note_chan(pdev, cds_freq_to_chan(freq)); + } ol_txrx_mon_data_process( vdev_id, netbuf, PROCESS_TYPE_DATA_TX, - tid, status, pkt_format); + tid, pkt_tx_status, pkt_format); } /** diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index 155e3a2e0873..5fdd4219b784 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -115,6 +115,8 @@ enum dpt_set_param_debugfs { #define OL_TXRX_PEER_DEC_REF_CNT_SILENT(peer) \ qdf_atomic_dec(&peer->ref_cnt) +#define NORMALIZED_TO_NOISE_FLOOR (-96) + ol_txrx_peer_handle ol_txrx_peer_find_by_local_id_inc_ref(struct ol_txrx_pdev_t *pdev, uint8_t local_peer_id); @@ -5471,14 +5473,15 @@ static inline int ol_txrx_drop_nbuf_list(qdf_nbuf_t buf_list) * @nbuf_list: netbuf list * @vdev_id: vdev id for which packet is captured * @tid: tid number - * @status: Tx status + * @pkt_tx_status: Tx status * @pktformat: Frame format * * Return: none */ static void ol_txrx_mon_mgmt_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id, - uint8_t tid, uint8_t status, bool pkt_format) + uint8_t tid, struct ol_mon_tx_status pkt_tx_status, + bool pkt_format) { struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev; uint8_t drop_count; @@ -5529,6 +5532,7 @@ bool ol_txrx_mon_mgmt_process(struct mon_rx_status *txrx_status, struct cds_ol_mon_pkt *pkt; ol_txrx_pdev_handle pdev = cds_get_context(QDF_MODULE_ID_TXRX); p_cds_sched_context sched_ctx = get_cds_sched_ctxt(); + struct ol_mon_tx_status pkt_tx_status = {0}; if (unlikely(!sched_ctx)) return false; @@ -5554,7 +5558,7 @@ bool ol_txrx_mon_mgmt_process(struct mon_rx_status *txrx_status, pkt->monpkt = (void *)nbuf; pkt->vdev_id = HTT_INVALID_VDEV; pkt->tid = HTT_INVALID_TID; - pkt->status = status; + pkt->pkt_tx_status = pkt_tx_status; pkt->pkt_format = TXRX_PKT_FORMAT_80211; cds_indicate_monpkt(sched_ctx, pkt); @@ -5856,7 +5860,14 @@ ol_txrx_update_tx_status(struct ol_txrx_pdev_t *pdev, IEEE80211_CHAN_2GHZ : IEEE80211_CHAN_5GHZ); tx_status->chan_flags = channel_flags; - tx_status->ant_signal_db = mon_hdr->rssi_comb; + /* RSSI is filled with TPC which will be normalized + * during radiotap updation, so add 96 here + */ + tx_status->ant_signal_db = + mon_hdr->rssi_comb - NORMALIZED_TO_NOISE_FLOOR; + tx_status->tx_status = mon_hdr->status; + tx_status->add_rtap_ext = true; + tx_status->tx_retry_cnt = mon_hdr->tx_retry_cnt; } /** @@ -5866,14 +5877,15 @@ ol_txrx_update_tx_status(struct ol_txrx_pdev_t *pdev, * @nbuf_list: netbuf list * @vdev_id: vdev id for which packet is captured * @tid: tid number - * @status: Tx status + * @pkt_tx_status: Tx status * @pktformat: Frame format * * Return: none */ static void ol_txrx_mon_tx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id, - uint8_t tid, uint8_t status, bool pkt_format) + uint8_t tid, struct ol_mon_tx_status pkt_tx_status, + bool pkt_format) { struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev; qdf_nbuf_t msdu, next_buf; @@ -5945,6 +5957,8 @@ ol_txrx_mon_tx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id, mon_hdr.sgi = cmpl_desc->sgi; mon_hdr.ldpc = cmpl_desc->ldpc; mon_hdr.beamformed = cmpl_desc->beamformed; + mon_hdr.status = pkt_tx_status.status; + mon_hdr.tx_retry_cnt = pkt_tx_status.tx_retry_cnt; qdf_nbuf_pull_head( msdu, @@ -6029,8 +6043,10 @@ ol_txrx_mon_tx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id, /* * Get the channel info and update the rx status */ - cds_get_chan_by_session_id(vdev_id, &chan); - ol_htt_mon_note_chan(pdev, chan); + if (vdev_id != HTT_INVALID_VDEV) { + cds_get_chan_by_session_id(vdev_id, &chan); + ol_htt_mon_note_chan(pdev, chan); + } ol_txrx_update_tx_status(pdev, &tx_status, &mon_hdr); @@ -6049,6 +6065,7 @@ ol_txrx_mon_tx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id, msdu = next_buf; } + return; free_buf: @@ -6062,14 +6079,15 @@ free_buf: * @nbuf_list: netbuf list * @vdev_id: vdev id for which packet is captured * @tid: tid number - * @status: Tx status + * @pkt_tx_status: Tx status * @pktformat: Frame format * * Return: none */ static void ol_txrx_mon_rx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id, - uint8_t tid, uint8_t status, bool pkt_format) + uint8_t tid, struct ol_mon_tx_status pkt_tx_status, + bool pkt_format) { struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev; qdf_nbuf_t buf_list = (qdf_nbuf_t)nbuf_list; @@ -6154,10 +6172,16 @@ ol_txrx_mon_rx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id, /* * Get the channel info and update the rx status */ - cds_get_chan_by_session_id(vdev_id, &chan); - ol_htt_mon_note_chan(pdev, chan); + if (vdev_id != HTT_INVALID_VDEV) { + cds_get_chan_by_session_id(vdev_id, &chan); + ol_htt_mon_note_chan(pdev, chan); + } htt_rx_mon_get_rx_status(pdev->htt_pdev, rx_desc, &rx_status); + rx_status.tx_status = pkt_tx_status.status; + rx_status.add_rtap_ext = true; + rx_status.tx_retry_cnt = pkt_tx_status.tx_retry_cnt; + /* clear IEEE80211_RADIOTAP_F_FCS flag*/ rx_status.rtap_flags &= ~(BIT(4)); rx_status.rtap_flags &= ~(BIT(2)); @@ -6194,16 +6218,50 @@ free_buf: drop_count = ol_txrx_drop_nbuf_list(buf_list); } +/** + * ol_txrx_pktcapture_status_map() - map Tx status for data packets + * with packet capture Tx status + * @status: Tx status + * + * Return: pktcapture_tx_status enum + */ +static enum pktcapture_tx_status +ol_txrx_pktcapture_status_map(uint8_t status) +{ + enum pktcapture_tx_status tx_status; + + switch (status) { + case htt_tx_status_ok: + tx_status = pktcapture_tx_status_ok; + break; + case htt_tx_status_discard: + tx_status = pktcapture_tx_status_discard; + break; + case htt_tx_status_no_ack: + tx_status = pktcapture_tx_status_no_ack; + break; + default: + tx_status = pktcapture_tx_status_discard; + break; + } + + return tx_status; +} + void ol_txrx_mon_data_process(uint8_t vdev_id, qdf_nbuf_t mon_buf_list, enum mon_data_process_type type, - uint8_t tid, uint8_t status, bool pkt_format) + uint8_t tid, + struct ol_mon_tx_status pkt_tx_status, + bool pkt_format) { uint8_t drop_count; struct cds_ol_mon_pkt *pkt; ol_txrx_pdev_handle pdev = cds_get_context(QDF_MODULE_ID_TXRX); p_cds_sched_context sched_ctx = get_cds_sched_ctxt(); cds_ol_mon_thread_cb callback = NULL; + pkt_tx_status.status = + ol_txrx_pktcapture_status_map(pkt_tx_status.status); if (!pdev) { ol_txrx_err("pdev is NULL"); @@ -6233,7 +6291,7 @@ void ol_txrx_mon_data_process(uint8_t vdev_id, pkt->monpkt = (void *)mon_buf_list; pkt->vdev_id = vdev_id; pkt->tid = tid; - pkt->status = status; + pkt->pkt_tx_status = pkt_tx_status; pkt->pkt_format = pkt_format; cds_indicate_monpkt(sched_ctx, pkt); return; diff --git a/core/dp/txrx/ol_txrx.h b/core/dp/txrx/ol_txrx.h index 8bdd418f587d..a4498059c839 100644 --- a/core/dp/txrx/ol_txrx.h +++ b/core/dp/txrx/ol_txrx.h @@ -212,4 +212,29 @@ struct ol_txrx_fw_stats_desc_t struct ol_txrx_stats_req_internal *ol_txrx_fw_stats_desc_get_req(struct ol_txrx_pdev_t *pdev, uint8_t desc_id); +/** + * enum pktcapture_tx_status - packet capture tx status + * @pktcapture_tx_status_ok: successfully sent + acked + * @pktcapture_tx_status_discard: discard - not sent + * @pktcapture_tx_status_no_ack: no_ack - sent, but no ack + * + * This enum has tx status types for packet capture mode + */ +enum pktcapture_tx_status { + pktcapture_tx_status_ok, + pktcapture_tx_status_discard, + pktcapture_tx_status_no_ack, +}; + +/* + * struct ol_mon_tx_status - tx packets info + * @status: tx status + * @tx_retry_cnt: tx retry count + * + */ + +struct ol_mon_tx_status { + uint8_t status; + uint8_t tx_retry_cnt; +}; #endif /* _OL_TXRX__H_ */ diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h index fe230839a151..3203a75ebeb0 100644 --- a/core/dp/txrx/ol_txrx_types.h +++ b/core/dp/txrx/ol_txrx_types.h @@ -576,6 +576,7 @@ struct ol_txrx_mon_hdr_elem_t { bool beamformed; bool dir; /* rx:0 , tx:1 */ uint8_t status; /* tx status */ + uint8_t tx_retry_cnt; }; /* diff --git a/core/hdd/inc/wlan_hdd_assoc.h b/core/hdd/inc/wlan_hdd_assoc.h index a5414a537160..bb3b945b76f2 100644 --- a/core/hdd/inc/wlan_hdd_assoc.h +++ b/core/hdd/inc/wlan_hdd_assoc.h @@ -269,6 +269,16 @@ tSirRFBand hdd_conn_get_connected_band(hdd_station_ctx_t *pHddStaCtx); hdd_adapter_t *hdd_get_sta_connection_in_progress(hdd_context_t *hdd_ctx); /** + * hdd_abort_ongoing_sta_connection() - Disconnect the sta for which the + * connection is in progress. + * + * @hdd_ctx: hdd context + * + * Return: none + */ +void hdd_abort_ongoing_sta_connection(hdd_context_t *hdd_ctx); + +/** * hdd_sme_roam_callback() - hdd sme roam callback * @pContext: pointer to adapter context * @pRoamInfo: pointer to roam info diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index 373bdd16fb17..0312da3f6601 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -363,6 +363,7 @@ enum { * @eHDD_REASSOC_IN_PROGRESS: reassociation is in progress * @eHDD_EAPOL_IN_PROGRESS: STA/P2P-CLI is in middle of EAPOL/WPS exchange * @eHDD_SAP_EAPOL_IN_PROGRESS: SAP/P2P-GO is in middle of EAPOL/WPS exchange + * @eHDD_SAP_CONNECTION_IN_PROGRESS: SAP/P2P-GO is in middle of connection. */ typedef enum { eHDD_SCAN_REJECT_DEFAULT = 0, @@ -370,6 +371,7 @@ typedef enum { eHDD_REASSOC_IN_PROGRESS, eHDD_EAPOL_IN_PROGRESS, eHDD_SAP_EAPOL_IN_PROGRESS, + eHDD_SAP_CONNECTION_IN_PROGRESS, } scan_reject_states; #define MAX_PROBE_REQ_OUIS 16 @@ -3268,6 +3270,16 @@ int hdd_driver_memdump_init(void); void hdd_driver_memdump_deinit(void); /** + * hdd_driver_mem_cleanup() - Frees memory allocated for + * driver dump + * + * This function frees driver dump memory. + * + * Return: None + */ +void hdd_driver_mem_cleanup(void); + +/** * wlan_hdd_free_cache_channels() - Free the cache channels list * @hdd_ctx: Pointer to HDD context * diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 6bb9f473aafe..e04e9a0ed1ff 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -424,6 +424,24 @@ end: return NULL; } +void hdd_abort_ongoing_sta_connection(hdd_context_t *hdd_ctx) +{ + hdd_adapter_t *sta_adapter; + QDF_STATUS status; + + sta_adapter = hdd_get_sta_connection_in_progress(hdd_ctx); + if (sta_adapter) { + hdd_debug("Disconnecting STA on vdev: %d", + sta_adapter->sessionId); + status = wlan_hdd_disconnect(sta_adapter, + eCSR_DISCONNECT_REASON_DEAUTH); + if (QDF_IS_STATUS_ERROR(status)) { + hdd_err("wlan_hdd_disconnect failed, status: %d", + status); + } + } +} + /** * hdd_remove_beacon_filter() - remove beacon filter * @adapter: Pointer to the hdd adapter @@ -1561,6 +1579,13 @@ static void hdd_conn_remove_connect_info(hdd_station_ctx_t *pHddStaCtx) pHddStaCtx->conn_info.proxyARPService = 0; qdf_mem_zero(&pHddStaCtx->conn_info.SSID, sizeof(tCsrSSIDInfo)); + + /* + * Reset the ptk, gtk status flags to avoid using current connection + * status in further connections. + */ + pHddStaCtx->conn_info.gtk_installed = false; + pHddStaCtx->conn_info.ptk_installed = false; } /** diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 4fe13ea02348..9d53066ec6c9 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -6689,7 +6689,7 @@ static int __wlan_hdd_cfg80211_wifi_logger_get_ring_data(struct wiphy *wiphy, WLAN_LOG_REASON_CODE_UNUSED, true, false); if (QDF_STATUS_SUCCESS != status) { - hdd_err("Failed to trigger bug report"); + hdd_debug("Failed to trigger bug report"); return -EINVAL; } } else { @@ -16958,6 +16958,13 @@ static int wlan_hdd_cfg80211_connect_start(hdd_adapter_t *pAdapter, qdf_mem_zero(&hdd_sta_ctx->conn_info.conn_flag, sizeof(hdd_sta_ctx->conn_info.conn_flag)); + /* + * Reset the ptk, gtk status flags to avoid using old/previous + * connection status. + */ + hdd_sta_ctx->conn_info.gtk_installed = false; + hdd_sta_ctx->conn_info.ptk_installed = false; + if (pRoamProfile) { hdd_station_ctx_t *pHddStaCtx; diff --git a/core/hdd/src/wlan_hdd_ext_scan.c b/core/hdd/src/wlan_hdd_ext_scan.c index 547955c429f7..37d7bfe4e9b1 100644 --- a/core/hdd/src/wlan_hdd_ext_scan.c +++ b/core/hdd/src/wlan_hdd_ext_scan.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2019 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 @@ -2460,10 +2460,6 @@ __wlan_hdd_cfg80211_extscan_get_valid_channels(struct wiphy *wiphy, if (0 != ret) return -EINVAL; - if (!pHddCtx->config->extscan_enabled) { - hdd_err("extscan not supported"); - return -ENOTSUPP; - } if (hdd_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, data, data_len, wlan_hdd_extscan_config_policy)) { diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index fad7bb785f10..77088b08230b 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -8001,7 +8001,6 @@ int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter, bool disable_fw_tdls_state = false; uint8_t ignore_cac = 0; uint8_t beacon_fixed_len; - hdd_adapter_t *sta_adapter; ENTER(); @@ -8035,12 +8034,7 @@ int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter, * disconnect the STA interface first if connection or key exchange is * in progress and then start SAP interface. */ - sta_adapter = hdd_get_sta_connection_in_progress(pHddCtx); - if (sta_adapter) { - hdd_debug("Disconnecting STA with session id: %d", - sta_adapter->sessionId); - wlan_hdd_disconnect(sta_adapter, eCSR_DISCONNECT_REASON_DEAUTH); - } + hdd_abort_ongoing_sta_connection(pHddCtx); /* * Reject start bss if reassoc in progress on any adapter. @@ -8717,7 +8711,6 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy, hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev); hdd_context_t *pHddCtx = wiphy_priv(wiphy); hdd_scaninfo_t *pScanInfo = NULL; - hdd_adapter_t *staAdapter = NULL; QDF_STATUS status = QDF_STATUS_E_FAILURE; QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; tSirUpdateIE updateIE; @@ -8727,6 +8720,7 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy, hdd_adapter_list_node_t *pAdapterNode = NULL; hdd_adapter_list_node_t *pNext = NULL; tsap_Config_t *pConfig; + hdd_adapter_t *staAdapter; hdd_info("enter(%s)", netdev_name(dev)); @@ -8774,12 +8768,7 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy, * the STA and complete the SAP operation. STA will reconnect * after SAP stop is done. */ - staAdapter = hdd_get_sta_connection_in_progress(pHddCtx); - if (staAdapter) { - hdd_debug("Disconnecting STA with session id: %d", - staAdapter->sessionId); - wlan_hdd_disconnect(staAdapter, eCSR_DISCONNECT_REASON_DEAUTH); - } + hdd_abort_ongoing_sta_connection(pHddCtx); if (pAdapter->device_mode == QDF_SAP_MODE) { wlan_hdd_del_station(pAdapter); diff --git a/core/hdd/src/wlan_hdd_ioctl.c b/core/hdd/src/wlan_hdd_ioctl.c index 207d48b91468..3d0418a5ca23 100644 --- a/core/hdd/src/wlan_hdd_ioctl.c +++ b/core/hdd/src/wlan_hdd_ioctl.c @@ -1055,6 +1055,11 @@ hdd_sendactionframe(hdd_adapter_t *adapter, const uint8_t *bssid, struct cfg80211_mgmt_tx_params params; #endif + if (payload_len < sizeof(tSirMacVendorSpecificFrameHdr)) { + hdd_warn("Invalid payload length: %d", payload_len); + return -EINVAL; + } + if (QDF_STA_MODE != adapter->device_mode) { hdd_warn("Unsupported in mode %s(%d)", hdd_device_mode_to_string(adapter->device_mode), diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 671abd702889..b322a0b128fd 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -530,8 +530,6 @@ static int __hdd_netdev_notifier_call(struct notifier_block *nb, hdd_err("Timeout occurred while waiting for abortscan"); } cds_flush_work(&adapter->scan_block_work); - /* Need to clean up blocked scan request */ - wlan_hdd_cfg80211_scan_block_cb(&adapter->scan_block_work); hdd_debug("Scan is not Pending from user"); /* * After NETDEV_GOING_DOWN, kernel calls hdd_stop.Irrespective @@ -2390,7 +2388,8 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, if (!reinit && !unint) { ret = pld_power_on(qdf_dev->dev); if (ret) { - hdd_err("Failed to Powerup the device: %d", ret); + hdd_err("Failed to Powerup the device; errno: %d", + ret); goto release_lock; } } @@ -2403,7 +2402,7 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, (reinit == true) ? HIF_ENABLE_TYPE_REINIT : HIF_ENABLE_TYPE_PROBE); if (ret) { - hdd_err("Failed to open hif: %d", ret); + hdd_err("Failed to open hif; errno: %d", ret); goto power_down; } @@ -2416,20 +2415,22 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, status = ol_cds_init(qdf_dev, hif_ctx); if (status != QDF_STATUS_SUCCESS) { - hdd_err("No Memory to Create BMI Context :%d", status); + hdd_err("No Memory to Create BMI Context; status: %d", + status); ret = qdf_status_to_os_return(status); goto hif_close; } ret = hdd_update_config(hdd_ctx); if (ret) { - hdd_err("Failed to update configuration :%d", ret); + hdd_err("Failed to update configuration; errno: %d", + ret); goto ol_cds_free; } status = cds_open(); if (!QDF_IS_STATUS_SUCCESS(status)) { - hdd_err("Failed to Open CDS: %d", status); + hdd_err("Failed to Open CDS; status: %d", status); ret = (status == QDF_STATUS_E_NOMEM) ? -ENOMEM : -EINVAL; goto deinit_config; } @@ -2451,8 +2452,8 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, status = cds_pre_enable(hdd_ctx->pcds_context); if (!QDF_IS_STATUS_SUCCESS(status)) { - hdd_err("Failed to pre-enable CDS: %d", status); - ret = (status == QDF_STATUS_E_NOMEM) ? -ENOMEM : -EINVAL; + hdd_err("Failed to pre-enable CDS; status: %d", status); + ret = qdf_status_to_os_return(status); goto deregister_cb; } @@ -2481,9 +2482,10 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, } if (reinit) { - if (hdd_ipa_uc_ssr_reinit(hdd_ctx)) { - hdd_err("HDD IPA UC reinit failed"); - ret = -EINVAL; + ret = hdd_ipa_uc_ssr_reinit(hdd_ctx); + if (ret) { + hdd_err("HDD IPA UC reinit failed; errno: %d", + ret); goto err_ipa_cleanup; } } @@ -2493,16 +2495,19 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, hdd_info("Wlan transition (OPENED -> ENABLED)"); if (!adapter) { hdd_err("adapter is Null"); + ret = -EINVAL; goto err_ipa_cleanup; } if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) { hdd_err("in ftm mode, no need to configure cds modules"); + ret = -EINVAL; break; } - if (hdd_configure_cds(hdd_ctx, adapter)) { - hdd_err("Failed to Enable cds modules"); + ret = hdd_configure_cds(hdd_ctx, adapter); + if (ret) { + hdd_err("Failed to Enable cds modules; errno: %d", ret); ret = -EINVAL; goto err_ipa_cleanup; } @@ -3679,8 +3684,8 @@ QDF_STATUS hdd_init_station_mode(hdd_adapter_t *adapter) status = hdd_lro_enable(hdd_ctx, adapter); if (status) /* Err code from errno.h */ - hdd_err("LRO is disabled either because of kernel doesnot support or disabled in INI or via vendor commandi. err code %d", - status); + hdd_debug("LRO is disabled either because of kernel doesnot support or disabled in INI or via vendor commandi. err code %d", + status); /* rcpi info initialization */ qdf_mem_zero(&adapter->rcpi, sizeof(adapter->rcpi)); @@ -3739,7 +3744,7 @@ void hdd_cleanup_actionframe(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter) &adapter->tx_action_cnf_event, msecs_to_jiffies(ACTION_FRAME_TX_TIMEOUT)); if (!rc) { - hdd_err("HDD Wait for Action Confirmation Failed!!"); + hdd_debug("HDD Wait for Action Confirmation Failed!!"); /* * Inform tx status as FAILURE to upper layer and free * cfgState->buf @@ -3962,6 +3967,9 @@ static void hdd_cleanup_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, return; } + qdf_list_destroy(&adapter->blocked_scan_request_q); + qdf_mutex_destroy(&adapter->blocked_scan_request_q_lock); + wlan_hdd_debugfs_csr_deinit(adapter); qdf_mutex_destroy(&adapter->arp_offload_info_lock); hdd_ns_offload_info_lock_destroy(adapter); @@ -4746,9 +4754,6 @@ QDF_STATUS hdd_close_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, if (QDF_STATUS_SUCCESS == status) { hdd_bus_bw_compute_timer_stop(hdd_ctx); - qdf_list_destroy(&adapter->blocked_scan_request_q); - qdf_mutex_destroy(&adapter->blocked_scan_request_q_lock); - /* cleanup adapter */ cds_clear_concurrency_mode(adapter->device_mode); hdd_cleanup_adapter(hdd_ctx, adapterNode->pAdapter, rtnl_held); @@ -4973,6 +4978,8 @@ QDF_STATUS hdd_stop_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, return -ENODEV; } + /* Need to clean up blocked scan request */ + wlan_hdd_cfg80211_scan_block_cb(&adapter->scan_block_work); scan_info = &adapter->scan_info; hdd_info("Disabling queues"); wlan_hdd_netif_queue_control(adapter, @@ -5061,6 +5068,17 @@ QDF_STATUS hdd_stop_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, #endif /* + * During vdev destroy, if any STA is in connecting state the + * roam command will be in active queue and thus vdev destroy is + * queued in pending queue. In case STA tries to connect to + * multiple BSSID and fails to connect, due to auth/assoc + * timeouts it may take more than vdev destroy time to get + * completed. So before vdev destroy is queued abort any STA + * ongoing connection to avoid vdev destroy timeout. + */ + if (test_bit(SME_SESSION_OPENED, &adapter->event_flags)) + hdd_abort_ongoing_sta_connection(hdd_ctx); + /* * It is possible that the caller of this function does not * wish to close the session */ @@ -5103,6 +5121,18 @@ QDF_STATUS hdd_stop_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, hdd_deregister_tx_flow_control(adapter); + /* + * During vdev destroy, if any STA is in connecting state the + * roam command will be in active queue and thus vdev destroy is + * queued in pending queue. In case STA tries to connect to + * multiple BSSID and fails to connect, due to auth/assoc + * timeouts it may take more than vdev destroy time to get + * complete. So before vdev destroy is queued abort any STA + * ongoing connection to avoid vdev destroy timeout. + */ + if (test_bit(SME_SESSION_OPENED, &adapter->event_flags)) + hdd_abort_ongoing_sta_connection(hdd_ctx); + mutex_lock(&hdd_ctx->sap_lock); if (test_bit(SOFTAP_BSS_STARTED, &adapter->event_flags)) { QDF_STATUS status; @@ -9354,8 +9384,6 @@ wlan_hdd_add_monitor_check(hdd_context_t *hdd_ctx, hdd_adapter_t **adapter, hdd_adapter_t *mon_adapter; uint32_t mode; - *adapter = NULL; - if (!cds_get_pktcap_mode_enable()) return 0; @@ -9400,8 +9428,13 @@ wlan_hdd_add_monitor_check(hdd_context_t *hdd_ctx, hdd_adapter_t **adapter, continue; adapter = hdd_get_adapter(hdd_ctx, mode); - if (adapter) + if (adapter) { + wlan_hdd_release_intf_addr( + hdd_ctx, + adapter->macAddressCurrent.bytes); + hdd_stop_adapter(hdd_ctx, adapter, true); hdd_close_adapter(hdd_ctx, adapter, rtnl_held); + } } mon_adapter = hdd_open_adapter(hdd_ctx, QDF_MONITOR_MODE, name, @@ -11297,6 +11330,7 @@ int hdd_wlan_stop_modules(hdd_context_t *hdd_ctx, bool ftm_mode) } /* Free the cache channels of the command SET_DISABLE_CHANNEL_LIST */ wlan_hdd_free_cache_channels(hdd_ctx); + hdd_driver_mem_cleanup(); /* many adapter resources are not freed by design in SSR case */ if (!is_recover_stop) diff --git a/core/hdd/src/wlan_hdd_memdump.c b/core/hdd/src/wlan_hdd_memdump.c index ff048ba6be71..d0a834d7e298 100644 --- a/core/hdd/src/wlan_hdd_memdump.c +++ b/core/hdd/src/wlan_hdd_memdump.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2019 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 @@ -61,15 +61,7 @@ static void *memdump_get_file_data(struct file *file) return hdd_ctx; } -/** - * hdd_driver_mem_cleanup() - Frees memory allocated for - * driver dump - * - * This function unallocates driver dump memory. - * - * Return: None - */ -static void hdd_driver_mem_cleanup(void) +void hdd_driver_mem_cleanup(void) { hdd_context_t *hdd_ctx; @@ -307,6 +299,4 @@ int hdd_driver_memdump_init(void) void hdd_driver_memdump_deinit(void) { hdd_driver_memdump_procfs_remove(); - - hdd_driver_mem_cleanup(); } diff --git a/core/hdd/src/wlan_hdd_p2p.c b/core/hdd/src/wlan_hdd_p2p.c index 572a7a41043d..cd147f16a76a 100644 --- a/core/hdd/src/wlan_hdd_p2p.c +++ b/core/hdd/src/wlan_hdd_p2p.c @@ -2326,7 +2326,7 @@ static int __wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, msecs_to_jiffies (WAIT_CHANGE_CHANNEL_FOR_OFFCHANNEL_TX)); if (!rc) { - hdd_err("wait on offchannel_tx_event timed out"); + hdd_debug("wait on offchannel_tx_event timed out"); goto err_rem_channel; } } else if (offchan) { @@ -2974,6 +2974,7 @@ struct wireless_dev *__wlan_hdd_add_virtual_intf(struct wiphy *wiphy, } } + pAdapter = NULL; ret = wlan_hdd_add_monitor_check(pHddCtx, &pAdapter, type, name, true, name_assign_type); if (ret) diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c index 7a7bf9f72ac9..81f52aeb8ebb 100644 --- a/core/hdd/src/wlan_hdd_power.c +++ b/core/hdd/src/wlan_hdd_power.c @@ -229,7 +229,7 @@ static int __wlan_hdd_ipv6_changed(struct notifier_block *nb, ENTER_DEV(ndev); if ((pAdapter == NULL) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic)) { - hdd_err("Adapter context is invalid %pK", pAdapter); + hdd_debug("Adapter context is invalid %pK", pAdapter); return NOTIFY_DONE; } @@ -923,7 +923,7 @@ static int __wlan_hdd_ipv4_changed(struct notifier_block *nb, ENTER_DEV(ndev); if ((pAdapter == NULL) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic)) { - hdd_err("Adapter context is invalid %pK", pAdapter); + hdd_debug("Adapter context is invalid %pK", pAdapter); return NOTIFY_DONE; } @@ -1476,6 +1476,7 @@ QDF_STATUS hdd_wlan_shutdown(void) } pHddCtx->is_ssr_in_progress = true; + cds_set_connection_in_progress(false); cds_clear_concurrent_session_count(); @@ -2516,7 +2517,7 @@ static int __wlan_hdd_cfg80211_get_txpower(struct wiphy *wiphy, /* Validate adapter sessionId */ if (wlan_hdd_validate_session_id(adapter->sessionId)) { - hdd_err("invalid session id: %d", adapter->sessionId); + hdd_debug("invalid session id: %d", adapter->sessionId); return -EINVAL; } diff --git a/core/mac/inc/qwlan_version.h b/core/mac/inc/qwlan_version.h index 31b7712f6ba9..41f78238e231 100644 --- a/core/mac/inc/qwlan_version.h +++ b/core/mac/inc/qwlan_version.h @@ -32,9 +32,9 @@ #define QWLAN_VERSION_MAJOR 5 #define QWLAN_VERSION_MINOR 1 #define QWLAN_VERSION_PATCH 1 -#define QWLAN_VERSION_EXTRA "N" -#define QWLAN_VERSION_BUILD 74 +#define QWLAN_VERSION_EXTRA "M" +#define QWLAN_VERSION_BUILD 75 -#define QWLAN_VERSIONSTR "5.1.1.74N" +#define QWLAN_VERSIONSTR "5.1.1.75M" #endif /* QWLAN_VERSION_H */ diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index d9022b6ef82a..803d8af3e63b 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -925,6 +925,11 @@ typedef struct sSirChannelList { uint8_t channelNumber[SIR_ESE_MAX_MEAS_IE_REQS]; } tSirChannelList, *tpSirChannelList; +struct sir_channel_list { + uint8_t numChannels; + uint8_t channelNumber[]; +}; + typedef struct sSirDFSChannelList { uint32_t timeStamp[SIR_MAX_24G_5G_CHANNEL_RANGE]; @@ -1058,7 +1063,7 @@ typedef struct sSirSmeScanReq { uint32_t oui_field_offset; /* channelList MUST be the last field of this structure */ - tSirChannelList channelList; + struct sir_channel_list channelList; /*----------------------------- tSirSmeScanReq.... @@ -3648,6 +3653,14 @@ struct mawc_params { uint8_t mawc_roam_rssi_low_adjust; }; +/** + * struct roam_sync_timeout_timer_info - Info related to roam sync timer + * @vdev_id: Vdev id for which host waiting roam sync ind from fw + */ +struct roam_sync_timeout_timer_info { + uint8_t vdev_id; +}; + typedef struct sSirRoamOffloadScanReq { uint16_t message_type; uint16_t length; @@ -4332,7 +4345,7 @@ typedef struct sSirScanOffloadReq { uint32_t oui_field_len; uint32_t oui_field_offset; - tSirChannelList channelList; + struct sir_channel_list channelList; /*----------------------------- sSirScanOffloadReq.... ----------------------------- diff --git a/core/mac/src/include/sir_params.h b/core/mac/src/include/sir_params.h index e6845a39b9a9..6c50f52814e5 100644 --- a/core/mac/src/include/sir_params.h +++ b/core/mac/src/include/sir_params.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2019 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 @@ -307,7 +307,7 @@ struct sir_mgmt_msg { #define SIR_HAL_WOW_ADD_PTRN (SIR_HAL_ITC_MSG_TYPES_BEGIN + 82) #define SIR_HAL_WOW_DEL_PTRN (SIR_HAL_ITC_MSG_TYPES_BEGIN + 83) #define SIR_HAL_WOWL_ENTER_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 84) -#define SIR_HAL_WOWL_ENTER_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 85) +#define SIR_HAL_WMA_ROAM_SYNC_TIMEOUT (SIR_HAL_ITC_MSG_TYPES_BEGIN + 85) #define SIR_HAL_WOWL_EXIT_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 86) #define SIR_HAL_WOWL_EXIT_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 87) /* / PE <-> HAL statistics messages */ diff --git a/core/mac/src/pe/lim/lim_ft_preauth.c b/core/mac/src/pe/lim/lim_ft_preauth.c index 24c98a3313b5..250a7353b08a 100644 --- a/core/mac/src/pe/lim/lim_ft_preauth.c +++ b/core/mac/src/pe/lim/lim_ft_preauth.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2019 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 @@ -670,7 +670,8 @@ QDF_STATUS lim_send_preauth_scan_offload(tpAniSirGlobal mac_ctx, tSirRetStatus rc = eSIR_SUCCESS; tSirMsgQ msg; - scan_offload_req = qdf_mem_malloc(sizeof(tSirScanOffloadReq)); + scan_offload_req = qdf_mem_malloc(sizeof(tSirScanOffloadReq) + + sizeof(uint8_t)); if (NULL == scan_offload_req) { pe_err("Memory allocation failed for pScanOffloadReq"); return QDF_STATUS_E_NOMEM; diff --git a/core/mac/src/pe/lim/lim_p2p.c b/core/mac/src/pe/lim/lim_p2p.c index 1cb32030d462..121f18145831 100644 --- a/core/mac/src/pe/lim/lim_p2p.c +++ b/core/mac/src/pe/lim/lim_p2p.c @@ -79,7 +79,8 @@ static QDF_STATUS lim_send_hal_req_remain_on_chan_offload(tpAniSirGlobal pMac, return QDF_STATUS_E_INVAL; } - pScanOffloadReq = qdf_mem_malloc(sizeof(tSirScanOffloadReq)); + pScanOffloadReq = qdf_mem_malloc(sizeof(tSirScanOffloadReq) + + sizeof(uint8_t)); if (NULL == pScanOffloadReq) { pe_err("Memory allocation failed for pScanOffloadReq"); return QDF_STATUS_E_NOMEM; diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c index 1aebd0ac2253..27e338bc77bc 100644 --- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c +++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c @@ -1215,12 +1215,8 @@ static QDF_STATUS lim_send_hal_start_scan_offload_req(tpAniSirGlobal pMac, pe_debug("No IEs in the scan request from supplicant"); } - /** - * The tSirScanOffloadReq will reserve the space for first channel, - * so allocate the memory for (numChannels - 1) and uIEFieldLen - */ len = sizeof(tSirScanOffloadReq) + - (pScanReq->channelList.numChannels - 1) + + (pScanReq->channelList.numChannels) + pScanReq->uIEFieldLen + pScanReq->oui_field_len; pScanOffloadReq = qdf_mem_malloc(len); @@ -1328,7 +1324,7 @@ static QDF_STATUS lim_send_hal_start_scan_offload_req(tpAniSirGlobal pMac, pScanReq->probe_req_ie_bitmap, PROBE_REQ_BITMAP_LEN * sizeof(uint32_t)); pScanOffloadReq->oui_field_offset = sizeof(tSirScanOffloadReq) + - (pScanOffloadReq->channelList.numChannels - 1) + + (pScanOffloadReq->channelList.numChannels) + pScanOffloadReq->uIEFieldLen; if (pScanOffloadReq->num_vendor_oui != 0) { qdf_mem_copy( diff --git a/core/mac/src/pe/rrm/rrm_api.c b/core/mac/src/pe/rrm/rrm_api.c index 73e1314a670f..e67d9bbe74ae 100644 --- a/core/mac/src/pe/rrm/rrm_api.c +++ b/core/mac/src/pe/rrm/rrm_api.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2019 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 @@ -43,8 +43,6 @@ #include "rrm_global.h" #include "rrm_api.h" -#define MAX_RRM_TX_PWR_CAP 22 - uint8_t rrm_get_min_of_max_tx_power(tpAniSirGlobal pMac, int8_t regMax, int8_t apTxPower) diff --git a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c index e32b7d5dbaaf..8dcdfa00dfd4 100644 --- a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c +++ b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2019 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 @@ -641,7 +641,7 @@ uint8_t *mac_trace_get_wma_msg_string(uint16_t wma_msg) #ifdef WLAN_FEATURE_11W CASE_RETURN_STRING(WMA_EXCLUDE_UNENCRYPTED_IND); #endif - CASE_RETURN_STRING(WMA_WOWL_ENTER_RSP); + CASE_RETURN_STRING(WMA_ROAM_SYNC_TIMEOUT); CASE_RETURN_STRING(WMA_WOWL_EXIT_RSP); CASE_RETURN_STRING(WMA_SET_MAX_TX_POWER_RSP); CASE_RETURN_STRING(WMA_SET_DTIM_PERIOD); diff --git a/core/sap/src/sap_fsm.c b/core/sap/src/sap_fsm.c index 533df00f431b..4d9e7ed4025c 100644 --- a/core/sap/src/sap_fsm.c +++ b/core/sap/src/sap_fsm.c @@ -4913,6 +4913,10 @@ static QDF_STATUS sap_get_channel_list(ptSapContext sap_ctx, CDS_CHANNEL_STATE(loop_count))))) continue; + if (CDS_CHANNEL_NUM(loop_count) == 12 || + CDS_CHANNEL_NUM(loop_count) == 13) + continue; + /* * Skip the channels which are not in ACS config from user * space diff --git a/core/sme/inc/csr_support.h b/core/sme/inc/csr_support.h index 046803fdca3b..91f5ec3727bb 100644 --- a/core/sme/inc/csr_support.h +++ b/core/sme/inc/csr_support.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2019 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 @@ -200,7 +200,7 @@ typedef struct tagCsrWapiIe { typedef struct tagRoamingTimerInfo { tpAniSirGlobal pMac; - uint8_t sessionId; + uint8_t vdev_id; } tCsrTimerInfo; #define CSR_IS_11A_BSS(pBssDesc) (eSIR_11A_NW_TYPE == (pBssDesc)->nwType) diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index e51337c319af..12ae3afe075d 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -8043,7 +8043,7 @@ QDF_STATUS sme_8023_multicast_list(tHalHandle hHal, uint8_t sessionId, if (!CSR_IS_SESSION_VALID(pMac, sessionId) || (!csr_is_conn_state_infra(pMac, sessionId) && !csr_is_ndi_started(pMac, sessionId))) { - QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, + QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG, "%s: Invalid session: %d", __func__, sessionId); return QDF_STATUS_E_FAILURE; } diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 4543f281f4dd..debd009b3727 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -312,10 +312,10 @@ static bool csr_roam_is_same_profile_keys(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile2); static QDF_STATUS csr_roam_start_roaming_timer(tpAniSirGlobal pMac, - uint32_t sessionId, + uint32_t vdev_id, uint32_t interval); static QDF_STATUS csr_roam_stop_roaming_timer(tpAniSirGlobal pMac, - uint32_t sessionId); + uint32_t vdev_id); static void csr_roam_roaming_timer_handler(void *pv); #ifdef WLAN_FEATURE_ROAM_OFFLOAD static void csr_roam_roaming_offload_timer_action(tpAniSirGlobal mac_ctx, @@ -1307,11 +1307,11 @@ static QDF_STATUS csr_roam_open(tpAniSirGlobal pMac) for (i = 0; i < CSR_ROAM_SESSION_MAX; i++) { pSession = CSR_GET_SESSION(pMac, i); pSession->roamingTimerInfo.pMac = pMac; - pSession->roamingTimerInfo.sessionId = + pSession->roamingTimerInfo.vdev_id = CSR_SESSION_ID_INVALID; } pMac->roam.WaitForKeyTimerInfo.pMac = pMac; - pMac->roam.WaitForKeyTimerInfo.sessionId = + pMac->roam.WaitForKeyTimerInfo.vdev_id = CSR_SESSION_ID_INVALID; status = qdf_mc_timer_init(&pMac->roam.hTimerWaitForKey, QDF_TIMER_TYPE_SW, @@ -7765,7 +7765,7 @@ static void csr_roam_process_join_res(tpAniSirGlobal mac_ctx, CSR_WAIT_FOR_KEY_TIMEOUT_PERIOD; /* Save session_id in case of timeout */ - mac_ctx->roam.WaitForKeyTimerInfo.sessionId = + mac_ctx->roam.WaitForKeyTimerInfo.vdev_id = (uint8_t) session_id; /* * This time should be long enough for the rest @@ -12954,7 +12954,7 @@ void csr_roam_roaming_timer_handler(void *pv) { tCsrTimerInfo *pInfo = (tCsrTimerInfo *) pv; tpAniSirGlobal pMac = pInfo->pMac; - uint32_t sessionId = pInfo->sessionId; + uint32_t sessionId = pInfo->vdev_id; tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId); if (!pSession) { @@ -12986,50 +12986,68 @@ void csr_roam_roaming_timer_handler(void *pv) void csr_roam_roaming_offload_timeout_handler(void *timer_data) { tCsrTimerInfo *timer_info = (tCsrTimerInfo *) timer_data; + cds_msg_t wma_msg = {0}; + struct roam_sync_timeout_timer_info *req; + QDF_STATUS status; if (timer_info) { - QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG, - "LFR3:roaming offload timer expired, session: %d", - timer_info->sessionId); + sme_debug("LFR3:roaming offload timer expired, session: %d", + timer_info->vdev_id); + } else { - QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, - "Invalid Session"); + sme_err("Invalid Session"); + return; + } + + req = qdf_mem_malloc(sizeof(*req)); + if (!req) + return; + + req->vdev_id = timer_info->vdev_id; + wma_msg.type = WMA_ROAM_SYNC_TIMEOUT; + wma_msg.bodyptr = req; + + status = cds_mq_post_message(QDF_MODULE_ID_WMA, &wma_msg); + if (!QDF_IS_STATUS_SUCCESS(status)) { + sme_err("Post roam offload timer fails, session id: %d", + timer_info->vdev_id); + qdf_mem_free(req); return; } - csr_roam_disconnect(timer_info->pMac, timer_info->sessionId, - eCSR_DISCONNECT_REASON_UNSPECIFIED); } -QDF_STATUS csr_roam_start_roaming_timer(tpAniSirGlobal pMac, uint32_t sessionId, +QDF_STATUS csr_roam_start_roaming_timer(tpAniSirGlobal pMac, + uint32_t vdev_id, uint32_t interval) { QDF_STATUS status; - tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId); + tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, vdev_id); if (!pSession) { - sme_err("session %d not found", sessionId); + sme_err("session %d not found", vdev_id); return QDF_STATUS_E_FAILURE; } sme_debug("csrScanStartRoamingTimer"); - pSession->roamingTimerInfo.sessionId = (uint8_t) sessionId; + pSession->roamingTimerInfo.vdev_id = (uint8_t) vdev_id; status = qdf_mc_timer_start(&pSession->hTimerRoaming, interval / QDF_MC_TIMER_TO_MS_UNIT); return status; } -QDF_STATUS csr_roam_stop_roaming_timer(tpAniSirGlobal pMac, uint32_t sessionId) +QDF_STATUS csr_roam_stop_roaming_timer(tpAniSirGlobal pMac, + uint32_t vdev_id) { return qdf_mc_timer_stop - (&pMac->roam.roamSession[sessionId].hTimerRoaming); + (&pMac->roam.roamSession[vdev_id].hTimerRoaming); } void csr_roam_wait_for_key_time_out_handler(void *pv) { tCsrTimerInfo *pInfo = (tCsrTimerInfo *) pv; tpAniSirGlobal pMac = pInfo->pMac; - tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, pInfo->sessionId); + tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, pInfo->vdev_id); QDF_STATUS status = QDF_STATUS_E_FAILURE; if (pSession == NULL) { @@ -13039,21 +13057,21 @@ void csr_roam_wait_for_key_time_out_handler(void *pv) sme_debug("WaitForKey timer expired in state: %s sub-state: %s", mac_trace_get_neighbour_roam_state(pMac->roam. - neighborRoamInfo[pInfo->sessionId]. + neighborRoamInfo[pInfo->vdev_id]. neighborRoamState), mac_trace_getcsr_roam_sub_state(pMac->roam. - curSubState[pInfo->sessionId])); + curSubState[pInfo->vdev_id])); spin_lock(&pMac->roam.roam_state_lock); - if (CSR_IS_WAIT_FOR_KEY(pMac, pInfo->sessionId)) { + if (CSR_IS_WAIT_FOR_KEY(pMac, pInfo->vdev_id)) { /* Change the substate so command queue is unblocked. */ - if (CSR_ROAM_SESSION_MAX > pInfo->sessionId) - pMac->roam.curSubState[pInfo->sessionId] = + if (CSR_ROAM_SESSION_MAX > pInfo->vdev_id) + pMac->roam.curSubState[pInfo->vdev_id] = eCSR_ROAM_SUBSTATE_NONE; spin_unlock(&pMac->roam.roam_state_lock); if (csr_neighbor_roam_is_handoff_in_progress(pMac, - pInfo->sessionId)) { + pInfo->vdev_id)) { /* * Enable heartbeat timer when hand-off is in progress * and Key Wait timer expired. @@ -13065,13 +13083,13 @@ void csr_roam_wait_for_key_time_out_handler(void *pv) } sme_debug("SME pre-auth state timeout"); - if (csr_is_conn_state_connected_infra(pMac, pInfo->sessionId)) { + if (csr_is_conn_state_connected_infra(pMac, pInfo->vdev_id)) { csr_roam_link_up(pMac, pSession->connectedProfile.bssid); sme_process_pending_queue(pMac); status = sme_acquire_global_lock(&pMac->sme); if (QDF_IS_STATUS_SUCCESS(status)) { - csr_roam_disconnect(pMac, pInfo->sessionId, + csr_roam_disconnect(pMac, pInfo->vdev_id, eCSR_DISCONNECT_REASON_UNSPECIFIED); sme_release_global_lock(&pMac->sme); } @@ -13095,16 +13113,17 @@ void csr_roam_wait_for_key_time_out_handler(void *pv) * Return: None */ void csr_roam_roaming_offload_timer_action(tpAniSirGlobal mac_ctx, - uint32_t interval, uint8_t session_id, + uint32_t interval, uint8_t vdev_id, uint8_t action) { - tCsrRoamSession *csr_session = CSR_GET_SESSION(mac_ctx, session_id); + tCsrRoamSession *csr_session = CSR_GET_SESSION(mac_ctx, vdev_id); + QDF_TIMER_STATE tstate; QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG, - ("LFR3: timer action %d, session %d, intvl %d"), - action, session_id, interval); + ("LFR3: timer action %d, vdev_id %d, intvl %d"), + action, vdev_id, interval); if (mac_ctx) { - csr_session = CSR_GET_SESSION(mac_ctx, session_id); + csr_session = CSR_GET_SESSION(mac_ctx, vdev_id); } else { QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, ("LFR3: Invalid MAC Context")); @@ -13112,13 +13131,25 @@ void csr_roam_roaming_offload_timer_action(tpAniSirGlobal mac_ctx, } if (!csr_session) { QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, - ("LFR3: session %d not found"), session_id); + ("LFR3: session %d not found"), vdev_id); return; } - csr_session->roamingTimerInfo.sessionId = (uint8_t) session_id; - if (action == ROAMING_OFFLOAD_TIMER_START) - qdf_mc_timer_start(&csr_session->roaming_offload_timer, - interval / QDF_MC_TIMER_TO_MS_UNIT); + csr_session->roamingTimerInfo.vdev_id = (uint8_t) vdev_id; + + tstate = + qdf_mc_timer_get_current_state(&csr_session->roaming_offload_timer); + + if (action == ROAMING_OFFLOAD_TIMER_START) { + /* + * If timer is already running then re-start timer in order to + * process new ROAM_START with fresh timer. + */ + if (tstate == QDF_TIMER_STATE_RUNNING) + qdf_mc_timer_stop(&csr_session->roaming_offload_timer); + qdf_mc_timer_start(&csr_session->roaming_offload_timer, + interval / QDF_MC_TIMER_TO_MS_UNIT); + } + if (action == ROAMING_OFFLOAD_TIMER_STOP) qdf_mc_timer_stop(&csr_session->roaming_offload_timer); @@ -13131,17 +13162,17 @@ static QDF_STATUS csr_roam_start_wait_for_key_timer(tpAniSirGlobal pMac, QDF_STATUS status; tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[pMac->roam.WaitForKeyTimerInfo. - sessionId]; + vdev_id]; if (csr_neighbor_roam_is_handoff_in_progress(pMac, pMac->roam.WaitForKeyTimerInfo. - sessionId)) { + vdev_id)) { /* Disable heartbeat timer when hand-off is in progress */ sme_debug("disabling HB timer in state: %s sub-state: %s", mac_trace_get_neighbour_roam_state( pNeighborRoamInfo->neighborRoamState), mac_trace_getcsr_roam_sub_state( pMac->roam.curSubState[pMac->roam. - WaitForKeyTimerInfo.sessionId])); + WaitForKeyTimerInfo.vdev_id])); cfg_set_int(pMac, WNI_CFG_HEART_BEAT_THRESHOLD, 0); } sme_debug("csrScanStartWaitForKeyTimer"); @@ -13155,7 +13186,7 @@ QDF_STATUS csr_roam_stop_wait_for_key_timer(tpAniSirGlobal pMac) { tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo[pMac->roam.WaitForKeyTimerInfo. - sessionId]; + vdev_id]; sme_debug("WaitForKey timer stopped in state: %s sub-state: %s", mac_trace_get_neighbour_roam_state(pNeighborRoamInfo-> @@ -13163,10 +13194,9 @@ QDF_STATUS csr_roam_stop_wait_for_key_timer(tpAniSirGlobal pMac) mac_trace_getcsr_roam_sub_state(pMac->roam. curSubState[pMac->roam. WaitForKeyTimerInfo. - sessionId])); + vdev_id])); if (csr_neighbor_roam_is_handoff_in_progress(pMac, - pMac->roam.WaitForKeyTimerInfo. - sessionId)) { + pMac->roam.WaitForKeyTimerInfo.vdev_id)) { /* * Enable heartbeat timer when hand-off is in progress * and Key Wait timer got stopped for some reason @@ -20736,6 +20766,12 @@ csr_roam_offload_scan(tpAniSirGlobal mac_ctx, uint8_t session_id, return QDF_STATUS_E_FAILURE; } + if (!csr_is_conn_state_connected(mac_ctx, session_id) && + command == ROAM_SCAN_OFFLOAD_UPDATE_CFG) { + sme_debug("Session not in connected state, RSO not sent"); + return QDF_STATUS_E_FAILURE; + } + if ((command == ROAM_SCAN_OFFLOAD_START) && (session->pCurRoamProfile && session->pCurRoamProfile->driver_disabled_roaming)) { @@ -22823,9 +22859,11 @@ static QDF_STATUS csr_process_roam_sync_callback(tpAniSirGlobal mac_ctx, session->disable_hi_rssi = false; } - csr_roam_offload_scan(mac_ctx, session_id, - ROAM_SCAN_OFFLOAD_UPDATE_CFG, - REASON_CONNECT); + if (roam_synch_data->authStatus == + CSR_ROAM_AUTH_STATUS_AUTHENTICATED) + csr_roam_offload_scan(mac_ctx, session_id, + ROAM_SCAN_OFFLOAD_UPDATE_CFG, + REASON_CONNECT); csr_roam_call_callback(mac_ctx, session_id, NULL, 0, eCSR_ROAM_SYNCH_COMPLETE, eCSR_ROAM_RESULT_SUCCESS); @@ -22937,7 +22975,7 @@ static QDF_STATUS csr_process_roam_sync_callback(tpAniSirGlobal mac_ctx, session_id); ps_global_info->remain_in_power_active_till_dhcp = true; - mac_ctx->roam.WaitForKeyTimerInfo.sessionId = session_id; + mac_ctx->roam.WaitForKeyTimerInfo.vdev_id = session_id; if (!QDF_IS_STATUS_SUCCESS(csr_roam_start_wait_for_key_timer( mac_ctx, CSR_WAIT_FOR_KEY_TIMEOUT_PERIOD)) ) { diff --git a/core/sme/src/csr/csr_api_scan.c b/core/sme/src/csr/csr_api_scan.c index 04b6ba509142..949134f96488 100644 --- a/core/sme/src/csr/csr_api_scan.c +++ b/core/sme/src/csr/csr_api_scan.c @@ -5877,10 +5877,8 @@ static void csr_populate_ie_whitelist_attrs(tSirSmeScanReq *msg, qdf_mem_copy(msg->probe_req_ie_bitmap, scan_req->probe_req_ie_bitmap, PROBE_REQ_BITMAP_LEN * sizeof(uint32_t)); msg->oui_field_len = scan_req->num_vendor_oui * sizeof(*scan_req->voui); - msg->oui_field_offset = (sizeof(tSirSmeScanReq) - - sizeof(msg->channelList.channelNumber) + - (sizeof(msg->channelList.channelNumber) * - scan_req->ChannelInfo.numOfChannels)) + + msg->oui_field_offset = (sizeof(tSirSmeScanReq) + + (scan_req->ChannelInfo.numOfChannels)) + scan_req->uIEFieldLen; if (scan_req->num_vendor_oui != 0) @@ -5901,10 +5899,8 @@ static QDF_STATUS csr_send_mb_scan_req(tpAniSirGlobal pMac, uint16_t sessionId, uint32_t i; struct qdf_mac_addr selfmac; - msgLen = (uint16_t) (sizeof(tSirSmeScanReq) - - sizeof(pMsg->channelList.channelNumber) + - (sizeof(pMsg->channelList.channelNumber) * - pScanReq->ChannelInfo.numOfChannels)) + + msgLen = (uint16_t) (sizeof(tSirSmeScanReq) + + (pScanReq->ChannelInfo.numOfChannels)) + (pScanReq->uIEFieldLen) + pScanReq->num_vendor_oui * sizeof(*pScanReq->voui); @@ -6058,10 +6054,8 @@ static QDF_STATUS csr_send_mb_scan_req(tpAniSirGlobal pMac, uint16_t sessionId, } pMsg->uIEFieldLen = (uint16_t) pScanReq->uIEFieldLen; - pMsg->uIEFieldOffset = (uint16_t) (sizeof(tSirSmeScanReq) - - sizeof(pMsg->channelList.channelNumber) + - (sizeof(pMsg->channelList.channelNumber) * - pScanReq->ChannelInfo.numOfChannels)); + pMsg->uIEFieldOffset = (uint16_t) (sizeof(tSirSmeScanReq) + + (pMsg->channelList.numChannels)); if (pScanReq->uIEFieldLen != 0) { qdf_mem_copy((uint8_t *) pMsg + pMsg->uIEFieldOffset, pScanReq->pIEField, pScanReq->uIEFieldLen); diff --git a/core/sme/src/csr/csr_inside_api.h b/core/sme/src/csr/csr_inside_api.h index 6eb54de3cbe3..e417673842ae 100644 --- a/core/sme/src/csr/csr_inside_api.h +++ b/core/sme/src/csr/csr_inside_api.h @@ -85,10 +85,11 @@ #define CSR_ACTIVE_SCAN_LIST_CMD_TIMEOUT (1000*30) /* *************************************************************************** - * The MAX BSSID Count should be lower than the command timeout value and it - * can be of a fraction of 1/3 to 1/2 of the total command timeout value. + * The MAX BSSID Count should be lower than the command timeout value. + * As in some case auth timeout can take upto 5 sec (in case of SAE auth) try + * (command timeout/5000 - 1) candidates. * ***************************************************************************/ -#define CSR_MAX_BSSID_COUNT (SME_ACTIVE_LIST_CMD_TIMEOUT_VALUE/3000) - 2 +#define CSR_MAX_BSSID_COUNT (SME_ACTIVE_LIST_CMD_TIMEOUT_VALUE/5000) - 1 #define CSR_CUSTOM_CONC_GO_BI 100 extern uint8_t csr_wpa_oui[][CSR_WPA_OUI_SIZE]; bool csr_is_supported_channel(tpAniSirGlobal pMac, uint8_t channelId); diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index 611beb7711ab..5728194c58d6 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -1545,7 +1545,7 @@ typedef struct { void *wmi_handle; void *htc_handle; void *cds_context; - void *mac_context; + tAniSirGlobal *mac_context; qdf_event_t wma_ready_event; qdf_event_t wma_resume_event; qdf_event_t target_suspend; @@ -2423,6 +2423,9 @@ int wmi_desc_pool_init(tp_wma_handle wma_handle, uint32_t pool_size); void wmi_desc_pool_deinit(tp_wma_handle wma_handle); struct wmi_desc_t *wmi_desc_get(tp_wma_handle wma_handle); void wmi_desc_put(tp_wma_handle wma_handle, struct wmi_desc_t *wmi_desc); +int wma_process_mon_mgmt_tx(qdf_nbuf_t nbuf, uint32_t nbuf_len, + struct wmi_mgmt_params *mgmt_param, + uint16_t chanfreq); int wma_mgmt_tx_completion_handler(void *handle, uint8_t *cmpl_event_params, uint32_t len); int wma_mgmt_tx_bundle_completion_handler(void *handle, @@ -2652,6 +2655,18 @@ QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle, tSirRoamOffloadScanReq *roam_req); /** + * wma_handle_roam_sync_timeout() - Update roaming status at wma layer + * @wma_handle: wma handle + * @info: Info for roaming start timer + * + * This function gets called in case of roaming offload timer get expired + * + * Return: None + */ +void wma_handle_roam_sync_timeout(tp_wma_handle wma_handle, + struct roam_sync_timeout_timer_info *info); + +/** * wma_register_phy_err_event_handler() - register phy error event handler * @wma_handle: wma handle * diff --git a/core/wma/inc/wma_api.h b/core/wma/inc/wma_api.h index e80ce4703217..de42a3b3bbe4 100644 --- a/core/wma/inc/wma_api.h +++ b/core/wma/inc/wma_api.h @@ -32,6 +32,7 @@ #include "cds_concurrency.h" #include "cds_utils.h" #include "wma_sar_public_structs.h" +#include "ol_txrx.h" typedef void *WMA_HANDLE; @@ -621,4 +622,15 @@ QDF_STATUS wma_send_dhcp_ind(uint16_t type, uint8_t device_mode, QDF_STATUS wma_update_thermal_mitigation_to_fw(uint8_t thermal_level); #endif +/** + * wma_mgmt_pktcapture_status_map() - map Tx status for MGMT packets + * with packet capture Tx status + * @status: Tx status + * @is_data_pkt: Tx status for data packets + * + * Return: pktcapture_tx_status enum + */ +enum pktcapture_tx_status +wma_mgmt_pktcapture_status_map(uint8_t status); + #endif diff --git a/core/wma/inc/wma_types.h b/core/wma/inc/wma_types.h index 19ed6203154e..147ac452aa96 100644 --- a/core/wma/inc/wma_types.h +++ b/core/wma/inc/wma_types.h @@ -220,7 +220,7 @@ #define WMA_WOW_ADD_PTRN SIR_HAL_WOW_ADD_PTRN #define WMA_WOW_DEL_PTRN SIR_HAL_WOW_DEL_PTRN #define WMA_WOWL_ENTER_REQ SIR_HAL_WOWL_ENTER_REQ -#define WMA_WOWL_ENTER_RSP SIR_HAL_WOWL_ENTER_RSP +#define WMA_ROAM_SYNC_TIMEOUT SIR_HAL_WMA_ROAM_SYNC_TIMEOUT #define WMA_WOWL_EXIT_REQ SIR_HAL_WOWL_EXIT_REQ #define WMA_WOWL_EXIT_RSP SIR_HAL_WOWL_EXIT_RSP /* / PE <-> HAL statistics messages */ diff --git a/core/wma/src/wma_data.c b/core/wma/src/wma_data.c index 3d61436f7787..f5580bb7bc23 100644 --- a/core/wma/src/wma_data.c +++ b/core/wma/src/wma_data.c @@ -828,8 +828,7 @@ static void wma_data_tx_ack_work_handler(void *ack_work) /* Call the Ack Cb registered by UMAC */ if (ack_cb) - ack_cb((tpAniSirGlobal) (wma_handle->mac_context), - work->status ? 0 : 1); + ack_cb(wma_handle->mac_context, work->status ? 0 : 1); else WMA_LOGE("Data Tx Ack Cb is NULL"); @@ -1390,8 +1389,7 @@ static void wma_mgmt_tx_ack_work_handler(void *ack_work) work->sub_type, work->status); /* Call the Ack Cb registered by UMAC */ - ack_cb((tpAniSirGlobal) (wma_handle->mac_context), - work->status ? 0 : 1); + ack_cb(wma_handle->mac_context, work->status ? 0 : 1); end: qdf_mem_free(work); wma_handle->mgmt_ack_work_ctx = NULL; @@ -2654,6 +2652,8 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen, ol_pdev_handle ctrl_pdev; bool is_5g = false; + ol_txrx_pdev_handle pdev = cds_get_context(QDF_MODULE_ID_TXRX); + if (NULL == wma_handle) { WMA_LOGE("wma_handle is NULL"); cds_packet_free((void *)tx_frame); @@ -3045,6 +3045,16 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen, wmi_desc->nbuf = tx_frame; wmi_desc->tx_cmpl_cb = tx_frm_download_comp_cb; wmi_desc->ota_post_proc_cb = tx_frm_ota_comp_cb; + + if (pdev && cds_get_pktcap_mode_enable() && + (ol_cfg_pktcapture_mode(pdev->ctrl_pdev) & + PKT_CAPTURE_MODE_MGMT_ONLY) && + pdev->mon_cb) { + chanfreq = wma_handle->interfaces[vdev_id].mhz; + wma_process_mon_mgmt_tx(tx_frame, + qdf_nbuf_len(tx_frame), + &mgmt_param, chanfreq); + } status = wmi_mgmt_unified_cmd_send( wma_handle->wmi_handle, &mgmt_param); diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 21fe8e3ea403..2c6d0e91c380 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -553,6 +553,29 @@ wma_ol_txrx_vdev_detach(tp_wma_handle wma_handle, iface->is_vdev_valid = false; } +/* + * wma_handle_monitor_mode_vdev_detach() - Stop and down monitor mode vdev + * @wma_handle: wma handle + * @vdev_id: used to get wma interface txrx node + * + * Monitor mode is unconneted mode, so do explicit vdev stop and down + * + * Return: None + */ +static void wma_handle_monitor_mode_vdev_detach(tp_wma_handle wma, + uint8_t vdev_id) +{ + if (wma_send_vdev_stop_to_fw(wma, vdev_id)) { + WMA_LOGE("%s: %d Failed to send vdev stop", __func__, __LINE__); + wma_remove_vdev_req(wma, vdev_id, + WMA_TARGET_REQ_TYPE_VDEV_STOP); + } + + if (wma_send_vdev_down_to_fw(wma, vdev_id) != QDF_STATUS_SUCCESS) + WMA_LOGE("Failed to send vdev down cmd: vdev %d", vdev_id); +} + + static QDF_STATUS wma_handle_vdev_detach(tp_wma_handle wma_handle, struct del_sta_self_params *del_sta_self_req_param, uint8_t generate_rsp) @@ -562,6 +585,9 @@ static QDF_STATUS wma_handle_vdev_detach(tp_wma_handle wma_handle, struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id]; struct wma_target_req *msg = NULL; + if (cds_get_conparam() == QDF_GLOBAL_MONITOR_MODE) + wma_handle_monitor_mode_vdev_detach(wma_handle, vdev_id); + status = wmi_unified_vdev_delete_send(wma_handle->wmi_handle, vdev_id); if (QDF_IS_STATUS_ERROR(status)) { WMA_LOGE("Unable to remove an interface"); @@ -1897,6 +1923,10 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info, return -EINVAL; } + /* Ignore stop_response in Monitor mode */ + if (cds_get_conparam() == QDF_GLOBAL_MONITOR_MODE) + return QDF_STATUS_SUCCESS; + iface = &wma->interfaces[resp_event->vdev_id]; /* vdev in stopped state, no more waiting for key */ diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index d7f0ecb62148..fba86214196d 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -2364,8 +2364,8 @@ static int wma_rx_service_available_event(void *handle, uint8_t *cmd_param_info, wma_handle->wmi_service_ext_offset = ev->wmi_service_segment_offset; qdf_mem_copy(wma_handle->wmi_service_ext_bitmap, - &ev->wmi_service_segment_bitmap[0], - WMI_SERVICE_EXT_BM_SIZE32 * sizeof(A_UINT32)); + &ev->wmi_service_segment_bitmap[0], + WMI_SERVICE_SEGMENT_BM_SIZE32 * sizeof(A_UINT32)); return 0; } @@ -7793,6 +7793,11 @@ QDF_STATUS wma_mc_process_msg(void *cds_context, cds_msg_t *msg) (tSirRoamOffloadScanReq *) msg->bodyptr); break; + case WMA_ROAM_SYNC_TIMEOUT: + wma_handle_roam_sync_timeout(wma_handle, msg->bodyptr); + qdf_mem_free(msg->bodyptr); + break; + case WMA_RATE_UPDATE_IND: wma_process_rate_update_indicate(wma_handle, (tSirRateUpdateInd *) msg->bodyptr); @@ -8394,7 +8399,7 @@ QDF_STATUS wma_mc_process_msg(void *cds_context, cds_msg_t *msg) qdf_mem_free(msg->bodyptr); break; default: - WMA_LOGE("Unhandled WMA message of type %d", msg->type); + WMA_LOGD("Unhandled WMA message of type %d", msg->type); if (msg->bodyptr) qdf_mem_free(msg->bodyptr); } @@ -8414,7 +8419,7 @@ void wma_log_completion_timeout(void *data) { tp_wma_handle wma_handle; - WMA_LOGE("%s: Timeout occured for log completion command", __func__); + WMA_LOGD("%s: Timeout occurred for log completion command", __func__); wma_handle = (tp_wma_handle) data; if (!wma_handle) diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c index 2c5d519623e7..0307894ac535 100644 --- a/core/wma/src/wma_mgmt.c +++ b/core/wma/src/wma_mgmt.c @@ -2777,6 +2777,7 @@ static const char *wma_get_status_str(uint32_t status) #define RATE_LIMIT 16 #define RESERVE_BYTES 100 +#define NORMALIZED_TO_NOISE_FLOOR (-96) /** * wma_process_mon_mgmt_tx_data(): process management tx packets @@ -2875,12 +2876,10 @@ wma_process_mon_mgmt_tx_data(wmi_mgmt_hdr *hdr, txrx_status.chan_freq = hdr->chan_freq; /* hdr->rate is in Kbps, convert into Mbps */ txrx_status.rate = (hdr->rate_kbps / 1000); - txrx_status.ant_signal_db = hdr->rssi; - /* RSSI -128 is invalid rssi for TX, add 96 here, - * will be normalized during radiotap updation + /* RSSI is filled with TPC which will be normalized + * during radiotap updation, so add 96 here */ - if (txrx_status.ant_signal_db == -128) - txrx_status.ant_signal_db += 96; + txrx_status.ant_signal_db = hdr->rssi - NORMALIZED_TO_NOISE_FLOOR; txrx_status.nr_ant = 1; txrx_status.rtap_flags |= @@ -2893,6 +2892,9 @@ wma_process_mon_mgmt_tx_data(wmi_mgmt_hdr *hdr, IEEE80211_CHAN_2GHZ : IEEE80211_CHAN_5GHZ); txrx_status.chan_flags = channel_flags; txrx_status.rate = ((txrx_status.rate == 6 /* Mbps */) ? 0x0c : 0x02); + txrx_status.tx_status = status; + txrx_status.add_rtap_ext = true; + txrx_status.tx_retry_cnt = hdr->tx_retry_cnt; wh = (struct ieee80211_frame *)qdf_nbuf_data(nbuf); wh->i_fc[1] &= ~IEEE80211_FC1_WEP; @@ -2941,7 +2943,60 @@ static int wma_process_mon_mgmt_tx_completion(tp_wma_handle wma_handle, qdf_mem_copy(qdf_nbuf_data(wbuf), qdf_nbuf_data(nbuf), nbuf_len); - if (!wma_process_mon_mgmt_tx_data(mgmt_hdr, wbuf, status)) + if (!wma_process_mon_mgmt_tx_data( + mgmt_hdr, wbuf, + wma_mgmt_pktcapture_status_map(status))) + qdf_nbuf_free(wbuf); + + return 0; +} + +/** + * wma_process_mon_mgmt_tx() - process tx mgmt packets for mon interface + * without waiting for tx completion + * @nbuf: netbuf + * @nbuf_len: nbuf length + * + * Return: 0 for success or error code + */ +int wma_process_mon_mgmt_tx(qdf_nbuf_t nbuf, uint32_t nbuf_len, + struct wmi_mgmt_params *mgmt_param, + uint16_t chanfreq) +{ + qdf_nbuf_t wbuf; + wmi_mgmt_hdr mgmt_hdr = {0}; + + wbuf = qdf_nbuf_alloc(NULL, roundup(nbuf_len + RESERVE_BYTES, 4), + RESERVE_BYTES, 4, false); + + if (!wbuf) { + WMA_LOGE("%s: Failed to allocate wbuf for mgmt len(%u)", + __func__, nbuf_len); + return -ENOMEM; + } + + qdf_nbuf_put_tail(wbuf, nbuf_len); + + qdf_mem_copy(qdf_nbuf_data(wbuf), qdf_nbuf_data(nbuf), nbuf_len); + + mgmt_hdr.chan_freq = chanfreq; + /* Filling Tpc in rssi field. + * As Tpc is not available, filling with default value of tpc + */ + mgmt_hdr.rssi = 0; + /* Assigning the local timestamp as TSF timestamp is not available*/ + mgmt_hdr.tsf_l32 = (uint32_t)jiffies; + + if (mgmt_param->tx_param.preamble_type == (1 << WMI_RATE_PREAMBLE_CCK)) + mgmt_hdr.rate_kbps = 1000; /* Rate is 1 Mbps for CCK */ + else + mgmt_hdr.rate_kbps = 6000; /* Rate is 6 Mbps for OFDM */ + + /* The mgmt tx packet is send to mon interface before tx completion. + * we do not have status for this packet, using magic number(0xFF) + * as status for mgmt tx packet + */ + if (!wma_process_mon_mgmt_tx_data(&mgmt_hdr, wbuf, 0xFF)) qdf_nbuf_free(wbuf); return 0; @@ -3751,6 +3806,7 @@ wma_process_mon_mgmt_rx_data(wmi_mgmt_rx_hdr *hdr, IEEE80211_CHAN_2GHZ : IEEE80211_CHAN_5GHZ); txrx_status.chan_flags = channel_flags; txrx_status.rate = ((txrx_status.rate == 6 /* Mbps */) ? 0x0c : 0x02); + txrx_status.add_rtap_ext = true; wh = (struct ieee80211_frame *)qdf_nbuf_data(nbuf); wh->i_fc[1] &= ~IEEE80211_FC1_WEP; @@ -3947,7 +4003,7 @@ wma_mgmt_offload_data_event_handler(void *handle, uint8_t *data, qdf_nbuf_set_protocol(wbuf, ETH_P_CONTROL); qdf_mem_copy(qdf_nbuf_data(wbuf), param_tlvs->bufp, hdr->buf_len); - status = hdr->tx_status; + status = wma_mgmt_pktcapture_status_map(hdr->tx_status); if (!wma_process_mon_mgmt_tx_data(hdr, wbuf, status)) qdf_nbuf_free(wbuf); diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 9d3909950965..e99baba16613 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -888,7 +888,7 @@ static void wma_roam_scan_fill_fils_params(tp_wma_handle wma_handle, struct roam_fils_params *dst_fils_params, *src_fils_params; if (!params || !roam_req || !roam_req->is_fils_connection) { - WMA_LOGE("wma_roam_scan_fill_fils_params- NULL"); + WMA_LOGD("wma_roam_scan_fill_fils_params- NULL"); return; } @@ -2806,8 +2806,8 @@ static int wma_fill_roam_synch_buffer(tp_wma_handle wma, roam_synch_ind_ptr->rssi, roam_synch_ind_ptr->isBeacon); if (!QDF_IS_STATUS_SUCCESS( - wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context, - roam_synch_ind_ptr, NULL, SIR_ROAMING_DEREGISTER_STA))) { + wma->csr_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr, + NULL, SIR_ROAMING_DEREGISTER_STA))) { WMA_LOGE("LFR3: CSR Roam synch cb failed"); wma_free_roam_synch_frame_ind(iface); return status; @@ -3235,8 +3235,7 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event, goto cleanup_label; } qdf_mem_zero(bss_desc_ptr, sizeof(tSirBssDescription) + ie_len); - if (QDF_IS_STATUS_ERROR(wma->pe_roam_synch_cb( - (tpAniSirGlobal)wma->mac_context, + if (QDF_IS_STATUS_ERROR(wma->pe_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION))) { WMA_LOGE("LFR3: PE roam synch cb failed"); @@ -3245,8 +3244,8 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event, } wma_roam_update_vdev(wma, roam_synch_ind_ptr); - wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context, - roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION); + wma->csr_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr, + bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION); wma_process_roam_synch_complete(wma, synch_event->vdev_id); /* update freq and channel width */ @@ -3270,22 +3269,23 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event, wma->interfaces[synch_event->vdev_id].chan_width, &wma->interfaces[synch_event->vdev_id].chanmode); - wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context, - roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_COMPLETE); + wma->csr_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr, + bss_desc_ptr, SIR_ROAM_SYNCH_COMPLETE); wma->interfaces[synch_event->vdev_id].roam_synch_delay = qdf_get_system_timestamp() - roam_synch_received; WMA_LOGD("LFR3: roam_synch_delay:%d", wma->interfaces[synch_event->vdev_id].roam_synch_delay); - wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context, - roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_NAPI_OFF); + wma->csr_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr, + bss_desc_ptr, SIR_ROAM_SYNCH_NAPI_OFF); status = 0; cleanup_label: if (status != 0) { if (roam_synch_ind_ptr) - wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context, - roam_synch_ind_ptr, NULL, SIR_ROAMING_ABORT); + wma->csr_roam_synch_cb(wma->mac_context, + roam_synch_ind_ptr, NULL, + SIR_ROAMING_ABORT); roam_req = qdf_mem_malloc(sizeof(tSirRoamOffloadScanReq)); if (roam_req && synch_event) { roam_req->Command = ROAM_SCAN_OFFLOAD_STOP; @@ -6951,6 +6951,54 @@ static void wma_handle_btm_disassoc_imminent_msg(tp_wma_handle wma_handle, (void *)del_sta_ctx, 0); } +/* + * wma_invalid_roam_reason_handler() - Handle Invalid roam notification + * @wma: wma handle + * @vdev_id: vdev id + * @op_code: Operation to be done by the callback + * + * This function calls pe and csr callbacks with proper op_code + * + * Return: None + */ +static void wma_invalid_roam_reason_handler(tp_wma_handle wma_handle, + uint32_t vdev_id, + uint32_t notif) +{ + roam_offload_synch_ind *roam_synch_data = NULL; + enum sir_roam_op_code op_code; + + if (notif == WMI_ROAM_NOTIF_ROAM_START) { + wma_handle->interfaces[vdev_id].roaming_in_progress = true; + op_code = SIR_ROAMING_START; + } else if (notif == WMI_ROAM_NOTIF_ROAM_ABORT) { + wma_handle->interfaces[vdev_id].roaming_in_progress = false; + op_code = SIR_ROAMING_ABORT; + } else { + WMA_LOGE(FL("Invalid notif %d"), notif); + return; + } + + roam_synch_data = qdf_mem_malloc(sizeof(*roam_synch_data)); + if (!roam_synch_data) + return; + + roam_synch_data->roamedVdevId = vdev_id; + wma_handle->pe_roam_synch_cb(wma_handle->mac_context, roam_synch_data, + NULL, op_code); + wma_handle->csr_roam_synch_cb(wma_handle->mac_context, roam_synch_data, + NULL, op_code); + + qdf_mem_free(roam_synch_data); +} + +void wma_handle_roam_sync_timeout(tp_wma_handle wma_handle, + struct roam_sync_timeout_timer_info *info) +{ + wma_invalid_roam_reason_handler(wma_handle, info->vdev_id, + WMI_ROAM_NOTIF_ROAM_ABORT); +} + /** * wma_roam_event_callback() - roam event callback * @handle: wma handle @@ -6968,7 +7016,6 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf, WMI_ROAM_EVENTID_param_tlvs *param_buf; wmi_roam_event_fixed_param *wmi_event; struct sSirSmeRoamOffloadSynchInd *roam_synch_data; - enum sir_roam_op_code op_code = {0}; param_buf = (WMI_ROAM_EVENTID_param_tlvs *) event_buf; if (!param_buf) { @@ -7040,29 +7087,8 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf, break; #endif case WMI_ROAM_REASON_INVALID: - roam_synch_data = qdf_mem_malloc(sizeof(*roam_synch_data)); - if (NULL == roam_synch_data) { - WMA_LOGE("Memory unavailable for roam synch data"); - return -ENOMEM; - } - if (wmi_event->notif == WMI_ROAM_NOTIF_ROAM_START) { - op_code = SIR_ROAMING_START; - wma_handle->interfaces[wmi_event->vdev_id]. - roaming_in_progress = true; - } - if (wmi_event->notif == WMI_ROAM_NOTIF_ROAM_ABORT) { - op_code = SIR_ROAMING_ABORT; - wma_handle->interfaces[wmi_event->vdev_id]. - roaming_in_progress = false; - } - roam_synch_data->roamedVdevId = wmi_event->vdev_id; - wma_handle->pe_roam_synch_cb( - (tpAniSirGlobal)wma_handle->mac_context, - roam_synch_data, NULL, op_code); - wma_handle->csr_roam_synch_cb( - (tpAniSirGlobal)wma_handle->mac_context, - roam_synch_data, NULL, op_code); - qdf_mem_free(roam_synch_data); + wma_invalid_roam_reason_handler(wma_handle, wmi_event->vdev_id, + wmi_event->notif); break; case WMI_ROAM_REASON_RSO_STATUS: wma_rso_cmd_status_event_handler(wmi_event); @@ -7074,9 +7100,9 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf, return -ENOMEM; } roam_synch_data->roamedVdevId = wmi_event->vdev_id; - wma_handle->csr_roam_synch_cb( - (tpAniSirGlobal)wma_handle->mac_context, - roam_synch_data, NULL, SIR_ROAMING_INVOKE_FAIL); + wma_handle->csr_roam_synch_cb(wma_handle->mac_context, + roam_synch_data, NULL, + SIR_ROAMING_INVOKE_FAIL); qdf_mem_free(roam_synch_data); break; default: diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index 6e254d1cb79f..af9459c262e0 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -6577,3 +6577,33 @@ QDF_STATUS wma_get_roam_scan_stats(WMA_HANDLE handle, return QDF_STATUS_SUCCESS; } +/** + * wma_mgmt_pktcapture_status_map() - map Tx status for MGMT packets + * with packet capture Tx status + * @status: Tx status + * + * Return: pktcapture_tx_status enum + */ +enum pktcapture_tx_status +wma_mgmt_pktcapture_status_map(uint8_t status) +{ + enum pktcapture_tx_status tx_status; + + switch (status) { + case WMI_MGMT_TX_COMP_TYPE_COMPLETE_OK: + tx_status = pktcapture_tx_status_ok; + break; + case WMI_MGMT_TX_COMP_TYPE_DISCARD: + tx_status = pktcapture_tx_status_discard; + break; + case WMI_MGMT_TX_COMP_TYPE_COMPLETE_NO_ACK: + tx_status = pktcapture_tx_status_no_ack; + break; + default: + tx_status = pktcapture_tx_status_discard; + break; + } + + return tx_status; +} + |
