diff --git a/core/dp/ol/inc/ol_txrx_ctrl_api.h b/core/dp/ol/inc/ol_txrx_ctrl_api.h index e833e8dfb32c..5e426e9265ae 100644 --- a/core/dp/ol/inc/ol_txrx_ctrl_api.h +++ b/core/dp/ol/inc/ol_txrx_ctrl_api.h @@ -40,6 +40,7 @@ #include /* ol_sec_type */ #include /* MAX_SPATIAL_STREAM */ #include /* ol_pdev_handle, ol_vdev_handle, etc */ +#include #define OL_ATH_TX_DRAIN_WAIT_DELAY 50 diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index adcaea7e2c6f..a4a7b66db025 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -49,6 +49,7 @@ /* header files for our own APIs */ #include #include +#include /* header files for our internal definitions */ #include /* TXRX_ASSERT, etc. */ #include /* WDI events */ @@ -1586,6 +1587,279 @@ static A_STATUS ol_tx_filter_pass_thru(struct ol_txrx_msdu_info_t *tx_msdu_info) return A_OK; } +/** + * ol_txrx_peer_get_peer_mac_addr() - return mac_addr from peer handle. + * @peer: handle to peer + * + * returns mac addrs for module which do not know peer type + * + * Return: the mac_addr from peer + */ +uint8_t * +ol_txrx_peer_get_peer_mac_addr(ol_txrx_peer_handle peer) +{ + if (!peer) + return NULL; + + return peer->mac_addr.raw; +} + +/** + * ol_txrx_get_pn_info() - Returns pn info from peer + * @peer: handle to peer + * @last_pn_valid: return last_rmf_pn_valid value from peer. + * @last_pn: return last_rmf_pn value from peer. + * @rmf_pn_replays: return rmf_pn_replays value from peer. + * + * Return: NONE + */ +void +ol_txrx_get_pn_info(ol_txrx_peer_handle peer, uint8_t **last_pn_valid, + uint64_t **last_pn, uint32_t **rmf_pn_replays) +{ + *last_pn_valid = &peer->last_rmf_pn_valid; + *last_pn = &peer->last_rmf_pn; + *rmf_pn_replays = &peer->rmf_pn_replays; +} + +/** + * ol_txrx_get_opmode() - Return operation mode of vdev + * @vdev: vdev handle + * + * Return: operation mode. + */ +int ol_txrx_get_opmode(ol_txrx_vdev_handle vdev) +{ + return vdev->opmode; +} + +/** + * ol_txrx_get_peer_state() - Return peer state of peer + * @peer: peer handle + * + * Return: return peer state + */ +int ol_txrx_get_peer_state(ol_txrx_peer_handle peer) +{ + return peer->state; +} + +/** + * ol_txrx_get_vdev_for_peer() - Return vdev from peer handle + * @peer: peer handle + * + * Return: vdev handle from peer + */ +ol_txrx_vdev_handle +ol_txrx_get_vdev_for_peer(ol_txrx_peer_handle peer) +{ + return peer->vdev; +} + +/** + * ol_txrx_get_vdev_mac_addr() - Return mac addr of vdev + * @vdev: vdev handle + * + * Return: vdev mac address + */ +uint8_t * +ol_txrx_get_vdev_mac_addr(ol_txrx_vdev_handle vdev) +{ + if (!vdev) + return NULL; + + return vdev->mac_addr.raw; +} + +/** + * ol_txrx_get_vdev_struct_mac_addr() - Return handle to struct cdf_mac_addr of + * vdev + * @vdev: vdev handle + * + * Return: Handle to struct cdf_mac_addr + */ +struct cdf_mac_addr * +ol_txrx_get_vdev_struct_mac_addr(ol_txrx_vdev_handle vdev) +{ + return (struct cdf_mac_addr *)&(vdev->mac_addr); +} + +/** + * ol_txrx_get_pdev_from_vdev() - Return handle to pdev of vdev + * @vdev: vdev handle + * + * Return: Handle to pdev + */ +ol_txrx_pdev_handle ol_txrx_get_pdev_from_vdev(ol_txrx_vdev_handle vdev) +{ + return vdev->pdev; +} + +/** + * ol_txrx_get_ctrl_pdev_from_vdev() - Return control pdev of vdev + * @vdev: vdev handle + * + * Return: Handle to control pdev + */ +ol_pdev_handle +ol_txrx_get_ctrl_pdev_from_vdev(ol_txrx_vdev_handle vdev) +{ + return vdev->pdev->ctrl_pdev; +} + +/** + * ol_txrx_is_rx_fwd_disabled() - returns the rx_fwd_disabled status on vdev + * @vdev: vdev handle + * + * Return: Rx Fwd disabled status + */ +uint8_t +ol_txrx_is_rx_fwd_disabled(ol_txrx_vdev_handle vdev) +{ + struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *) + vdev->pdev->ctrl_pdev; + return cfg->rx_fwd_disabled; +} + +/** + * ol_txrx_update_ibss_add_peer_num_of_vdev() - update and return peer num + * @vdev: vdev handle + * @peer_num_delta: peer nums to be adjusted + * + * Return: -1 for failure or total peer nums after adjustment. + */ +int16_t +ol_txrx_update_ibss_add_peer_num_of_vdev(ol_txrx_vdev_handle vdev, + int16_t peer_num_delta) +{ + int16_t new_peer_num; + + new_peer_num = vdev->ibss_peer_num + peer_num_delta; + if (new_peer_num > MAX_IBSS_PEERS || new_peer_num < 0) + return OL_TXRX_INVALID_NUM_PEERS; + + vdev->ibss_peer_num = new_peer_num; + + return new_peer_num; +} + +/** + * ol_txrx_set_ibss_vdev_heart_beat_timer() - Update ibss vdev heart + * beat timer + * @vdev: vdev handle + * @timer_value_sec: new heart beat timer value + * + * Return: Old timer value set in vdev. + */ +uint16_t ol_txrx_set_ibss_vdev_heart_beat_timer(ol_txrx_vdev_handle vdev, + uint16_t timer_value_sec) +{ + uint16_t old_timer_value = vdev->ibss_peer_heart_beat_timer; + + vdev->ibss_peer_heart_beat_timer = timer_value_sec; + + return old_timer_value; +} + +/** + * ol_txrx_remove_peers_for_vdev() - remove all vdev peers with lock held + * @vdev: vdev handle + * @callback: callback function to remove the peer. + * @callback_context: handle for callback function + * @remove_last_peer: Does it required to last peer. + * + * Return: NONE + */ +void +ol_txrx_remove_peers_for_vdev(ol_txrx_vdev_handle vdev, + ol_txrx_vdev_peer_remove_cb callback, + void *callback_context, bool remove_last_peer) +{ + ol_txrx_peer_handle peer, temp; + /* remove all remote peers for vdev */ + cdf_spin_lock_bh(&vdev->pdev->peer_ref_mutex); + + temp = NULL; + TAILQ_FOREACH_REVERSE(peer, &vdev->peer_list, peer_list_t, + peer_list_elem) { + if (temp) { + cdf_spin_unlock_bh(&vdev->pdev->peer_ref_mutex); + if (cdf_atomic_read(&temp->delete_in_progress) == 0) { + callback(callback_context, temp->mac_addr.raw, + vdev->vdev_id, temp, false); + } + cdf_spin_lock_bh(&vdev->pdev->peer_ref_mutex); + } + /* self peer is deleted last */ + if (peer == TAILQ_FIRST(&vdev->peer_list)) { + TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, + "%s: self peer removed by caller ", + __func__); + break; + } else + temp = peer; + } + + if (remove_last_peer) { + /* remove IBSS bss peer last */ + peer = TAILQ_FIRST(&vdev->peer_list); + callback(callback_context, (uint8_t *) &vdev->mac_addr, + vdev->vdev_id, peer, false); + } + + cdf_spin_unlock_bh(&vdev->pdev->peer_ref_mutex); +} + +/** + * ol_txrx_remove_peers_for_vdev_no_lock() - remove vdev peers with no lock. + * @vdev: vdev handle + * @callback: callback function to remove the peer. + * @callback_context: handle for callback function + * + * Return: NONE + */ +void +ol_txrx_remove_peers_for_vdev_no_lock(ol_txrx_vdev_handle vdev, + ol_txrx_vdev_peer_remove_cb callback, + void *callback_context) +{ + ol_txrx_peer_handle peer = NULL; + + TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) { + TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, + "%s: peer found for vdev id %d. deleting the peer", + __func__, vdev->vdev_id); + callback(callback_context, (uint8_t *)&vdev->mac_addr, + vdev->vdev_id, peer, false); + } +} + +/** + * ol_txrx_set_ocb_chan_info() - set OCB channel info to vdev. + * @vdev: vdev handle + * @ocb_set_chan: OCB channel information to be set in vdev. + * + * Return: NONE + */ +void ol_txrx_set_ocb_chan_info(ol_txrx_vdev_handle vdev, + struct ol_txrx_ocb_set_chan ocb_set_chan) +{ + vdev->ocb_channel_info = ocb_set_chan.ocb_channel_info; + vdev->ocb_channel_count = ocb_set_chan.ocb_channel_count; +} + +/** + * ol_txrx_get_ocb_chan_info() - return handle to vdev ocb_channel_info + * @vdev: vdev handle + * + * Return: handle to struct ol_txrx_ocb_chan_info + */ +struct ol_txrx_ocb_chan_info * +ol_txrx_get_ocb_chan_info(ol_txrx_vdev_handle vdev) +{ + return vdev->ocb_channel_info; +} + QDF_STATUS ol_txrx_peer_state_update(struct ol_txrx_pdev_t *pdev, uint8_t *peer_mac, enum ol_txrx_peer_state state) diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h index f52ea035da1a..43e2461a9115 100644 --- a/core/dp/txrx/ol_txrx_types.h +++ b/core/dp/txrx/ol_txrx_types.h @@ -60,6 +60,8 @@ */ #define MAX_NUM_PEER_ID_PER_PEER 8 +#define OL_TXRX_INVALID_NUM_PEERS (-1) + #define OL_TXRX_MAC_ADDR_LEN 6 /* OL_TXRX_NUM_EXT_TIDS - diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 060fc6bf7871..8f5e5678c63f 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -1189,9 +1189,11 @@ QDF_STATUS hdd_change_peer_state(hdd_adapter_t *pAdapter, enum ol_txrx_peer_state sta_state, bool roam_synch_in_progress) { - struct ol_txrx_peer_t *peer; QDF_STATUS err; - struct ol_txrx_pdev_t *pdev = cds_get_context(QDF_MODULE_ID_TXRX); + uint8_t *peer_mac_addr; + struct ol_txrx_pdev_t *pdev = cds_get_context(CDF_MODULE_ID_TXRX); + ol_txrx_vdev_handle vdev; + ol_txrx_peer_handle peer; if (!pdev) { hdd_err("Failed to get txrx context"); @@ -1207,8 +1209,13 @@ QDF_STATUS hdd_change_peer_state(hdd_adapter_t *pAdapter, if (!peer) return QDF_STATUS_E_FAULT; - err = ol_txrx_peer_state_update(pdev, - (u_int8_t *) peer->mac_addr.raw, sta_state); + peer_mac_addr = ol_txrx_peer_get_peer_mac_addr(peer); + if (peer_mac_addr == NULL) { + hddLog(LOGE, "peer mac addr is NULL"); + return QDF_STATUS_E_FAULT; + } + + err = ol_txrx_peer_state_update(pdev, peer_mac_addr, sta_state); if (err != QDF_STATUS_SUCCESS) { hddLog(LOGE, "peer state update failed"); return QDF_STATUS_E_FAULT; @@ -1224,7 +1231,7 @@ QDF_STATUS hdd_change_peer_state(hdd_adapter_t *pAdapter, INIT_COMPLETION(pAdapter->sta_authorized_event); #endif - err = sme_set_peer_authorized(peer->mac_addr.raw, + err = sme_set_peer_authorized(peer_mac_addr, hdd_set_peer_authorized_event, pAdapter->sessionId); if (err != QDF_STATUS_SUCCESS) { @@ -1245,8 +1252,9 @@ QDF_STATUS hdd_change_peer_state(hdd_adapter_t *pAdapter, hddLog(LOG1, "%s: timeout waiting for sta_authorized_event", __func__); } - ol_txrx_vdev_unpause(peer->vdev, - OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED); + vdev = ol_txrx_get_vdev_for_peer(peer); + ol_txrx_vdev_unpause(vdev, + OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED); #endif } } diff --git a/core/wma/src/wma_data.c b/core/wma/src/wma_data.c index e0ea7a3a92b3..eaa85c57cd46 100644 --- a/core/wma/src/wma_data.c +++ b/core/wma/src/wma_data.c @@ -68,6 +68,8 @@ #include "cdp_txrx_flow_ctrl_legacy.h" #include "cdp_txrx_cmn.h" #include "cdp_txrx_misc.h" +#include +#include typedef struct { int32_t rate; @@ -964,7 +966,7 @@ int wma_peer_state_change_event_handler(void *handle, return -EINVAL; } - if (vdev->opmode == wlan_op_mode_sta + if (ol_txrx_get_opmode(vdev) == wlan_op_mode_sta && event->state == WMI_PEER_STATE_AUTHORIZED) { /* * set event so that hdd @@ -976,7 +978,7 @@ int wma_peer_state_change_event_handler(void *handle, __func__); return -EINVAL; } - wma_handle->peer_authorized_cb(vdev->vdev_id); + wma_handle->peer_authorized_cb(event->vdev_id); #endif } @@ -2227,6 +2229,7 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen, uint8_t proto_type = 0; #endif /* QCA_PKT_PROTO_TRACE */ struct wmi_mgmt_params mgmt_param = {0}; + ol_pdev_handle ctrl_pdev; if (NULL == wma_handle) { WMA_LOGE("wma_handle is NULL"); @@ -2457,8 +2460,12 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen, return QDF_STATUS_SUCCESS; } - is_high_latency = - ol_cfg_is_high_latency(txrx_vdev->pdev->ctrl_pdev); + ctrl_pdev = ol_txrx_get_ctrl_pdev_from_vdev(txrx_vdev); + if (ctrl_pdev == NULL) { + WMA_LOGE("ol_pdev_handle is NULL\n"); + return QDF_STATUS_E_FAILURE; + } + is_high_latency = ol_cfg_is_high_latency(ctrl_pdev); downld_comp_required = tx_frm_download_comp_cb && is_high_latency; diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 7c4a84bf99a9..2f8165e57963 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -69,6 +69,9 @@ #include "wma_ocb.h" #include "cdp_txrx_cfg.h" #include "cdp_txrx_flow_ctrl_legacy.h" +#include +#include +#include /** * wma_find_vdev_by_addr() - find vdev_id from mac address @@ -1018,6 +1021,7 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid, uint32_t peer_tid_bitmap = PEER_ALL_TID_BITMASK; uint8_t *peer_addr = bssid; struct peer_flush_params param = {0}; + uint8_t *peer_mac_addr; if (!wma->interfaces[vdev_id].peer_count) { WMA_LOGE("%s: Can't remove peer with peer_addr %pM vdevid %d peer_count %d", @@ -1028,6 +1032,14 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid, if (peer) ol_txrx_peer_detach(peer); + peer_mac_addr = ol_txrx_peer_get_peer_mac_addr(peer); + if (peer_mac_addr == NULL) { + WMA_LOGE("%s: peer mac addr is NULL, Can't remove peer with peer_addr %pM vdevid %d peer_count %d", + __func__, bssid, vdev_id, + wma->interfaces[vdev_id].peer_count); + return; + } + wma->interfaces[vdev_id].peer_count--; WMA_LOGE("%s: Removed peer with peer_addr %pM vdevid %d peer_count %d", __func__, bssid, vdev_id, wma->interfaces[vdev_id].peer_count); @@ -1040,10 +1052,10 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid, wmi_unified_peer_flush_tids_send(wma->wmi_handle, bssid, ¶m); - if ((peer) && (wma_is_vdev_in_ibss_mode(wma, vdev_id))) { + if (wma_is_vdev_in_ibss_mode(wma, vdev_id)) { WMA_LOGD("%s: bssid %pM peer->mac_addr %pM", __func__, - bssid, peer->mac_addr.raw); - peer_addr = peer->mac_addr.raw; + bssid, peer_mac_addr); + peer_addr = peer_mac_addr; } wmi_unified_peer_delete_send(wma->wmi_handle, peer_addr, vdev_id); @@ -1070,6 +1082,7 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, ol_txrx_pdev_handle pdev, { ol_txrx_peer_handle peer; struct peer_create_params param = {0}; + uint8_t *mac_addr_raw; if (++wma->interfaces[vdev_id].peer_count > wma->wlan_resource_config.num_peers) { @@ -1101,10 +1114,15 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, ol_txrx_pdev_handle pdev, WMA_LOGE("%s: Created peer with peer_addr %pM vdev_id %d, peer_count - %d", __func__, peer_addr, vdev_id, wma->interfaces[vdev_id].peer_count); + mac_addr_raw = ol_txrx_get_vdev_mac_addr(vdev); + if (mac_addr_raw == NULL) { + WMA_LOGE("%s: peer mac addr is NULL", __func__); + return QDF_STATUS_E_FAULT; + } + /* for each remote ibss peer, clear its keys */ if (wma_is_vdev_in_ibss_mode(wma, vdev_id) && - qdf_mem_cmp(peer_addr, vdev->mac_addr.raw, - IEEE80211_ADDR_LEN)) { + qdf_mem_cmp(peer_addr, mac_addr_raw, IEEE80211_ADDR_LEN)) { tSetStaKeyParams key_info; WMA_LOGD("%s: remote ibss peer %pM key clearing\n", __func__, @@ -1141,7 +1159,6 @@ err: static void wma_delete_all_ibss_peers(tp_wma_handle wma, A_UINT32 vdev_id) { ol_txrx_vdev_handle vdev; - ol_txrx_peer_handle peer, temp; if (!wma || vdev_id > wma->max_bssid) return; @@ -1151,31 +1168,9 @@ static void wma_delete_all_ibss_peers(tp_wma_handle wma, A_UINT32 vdev_id) return; /* remove all remote peers of IBSS */ - qdf_spin_lock_bh(&vdev->pdev->peer_ref_mutex); - - temp = NULL; - TAILQ_FOREACH_REVERSE(peer, &vdev->peer_list, peer_list_t, peer_list_elem) { - if (temp) { - qdf_spin_unlock_bh(&vdev->pdev->peer_ref_mutex); - if (qdf_atomic_read(&temp->delete_in_progress) == 0) { - wma_remove_peer(wma, temp->mac_addr.raw, - vdev_id, temp, false); - } - qdf_spin_lock_bh(&vdev->pdev->peer_ref_mutex); - } - /* self peer is deleted last */ - if (peer == TAILQ_FIRST(&vdev->peer_list)) { - WMA_LOGE("%s: self peer removed by caller ", __func__); - break; - } else - temp = peer; - } - qdf_spin_unlock_bh(&vdev->pdev->peer_ref_mutex); - - /* remove IBSS bss peer last */ - peer = TAILQ_FIRST(&vdev->peer_list); - wma_remove_peer(wma, wma->interfaces[vdev_id].bssid, vdev_id, peer, - false); + ol_txrx_remove_peers_for_vdev(vdev, + (ol_txrx_vdev_peer_remove_cb)wma_remove_peer, wma, + true); } #else /** @@ -1210,7 +1205,6 @@ static void wma_delete_all_ibss_peers(tp_wma_handle wma, A_UINT32 vdev_id) static void wma_delete_all_ap_remote_peers(tp_wma_handle wma, A_UINT32 vdev_id) { ol_txrx_vdev_handle vdev; - ol_txrx_peer_handle peer, temp; if (!wma || vdev_id > wma->max_bssid) return; @@ -1221,28 +1215,8 @@ static void wma_delete_all_ap_remote_peers(tp_wma_handle wma, A_UINT32 vdev_id) WMA_LOGE("%s: vdev_id - %d", __func__, vdev_id); /* remove all remote peers of SAP */ - qdf_spin_lock_bh(&vdev->pdev->peer_ref_mutex); - - temp = NULL; - TAILQ_FOREACH_REVERSE(peer, &vdev->peer_list, peer_list_t, - peer_list_elem) { - if (temp) { - qdf_spin_unlock_bh(&vdev->pdev->peer_ref_mutex); - if (qdf_atomic_read(&temp->delete_in_progress) == 0) { - wma_remove_peer(wma, temp->mac_addr.raw, - vdev_id, temp, false); - } - qdf_spin_lock_bh(&vdev->pdev->peer_ref_mutex); - } - /* self peer is deleted by caller */ - if (peer == TAILQ_FIRST(&vdev->peer_list)) { - WMA_LOGE("%s: self peer removed by caller ", __func__); - break; - } else - temp = peer; - } - - qdf_spin_unlock_bh(&vdev->pdev->peer_ref_mutex); + ol_txrx_remove_peers_for_vdev(vdev, + (ol_txrx_vdev_peer_remove_cb)wma_remove_peer, wma, false); } #ifdef QCA_IBSS_SUPPORT @@ -1258,9 +1232,12 @@ static void wma_recreate_ibss_vdev_and_bss_peer(tp_wma_handle wma, uint8_t vdev_id) { ol_txrx_vdev_handle vdev; + ol_txrx_pdev_handle pdev; struct add_sta_self_params add_sta_self_param; struct del_sta_self_params del_sta_param; QDF_STATUS status; + struct cdf_mac_addr *mac_addr; + uint8_t *mac_addr_raw; if (!wma) { WMA_LOGE("%s: Null wma handle", __func__); @@ -1273,9 +1250,16 @@ static void wma_recreate_ibss_vdev_and_bss_peer(tp_wma_handle wma, return; } + mac_addr = ol_txrx_get_vdev_struct_mac_addr(vdev); + if (mac_addr == NULL) { + WMA_LOGE("%s: mac_addr is NULL for vdev with id %d", __func__, + vdev_id); + return; + } + qdf_copy_macaddr( - (struct qdf_mac_addr *) &(add_sta_self_param.self_mac_addr), - (struct qdf_mac_addr *) &(vdev->mac_addr)); + (struct cdf_mac_addr *) &(add_sta_self_param.self_mac_addr), + mac_addr); add_sta_self_param.session_id = vdev_id; add_sta_self_param.type = WMI_VDEV_TYPE_IBSS; add_sta_self_param.sub_type = 0; @@ -1284,7 +1268,7 @@ static void wma_recreate_ibss_vdev_and_bss_peer(tp_wma_handle wma, /* delete old ibss vdev */ del_sta_param.session_id = vdev_id; qdf_mem_copy((void *)del_sta_param.self_mac_addr, - (void *)&(vdev->mac_addr), QDF_MAC_ADDR_SIZE); + (void *)mac_addr, CDF_MAC_ADDR_SIZE); wma_vdev_detach(wma, &del_sta_param, 0); /* create new vdev for ibss */ @@ -1294,19 +1278,22 @@ static void wma_recreate_ibss_vdev_and_bss_peer(tp_wma_handle wma, return; } + mac_addr_raw = ol_txrx_get_vdev_mac_addr(vdev); /* Register with TxRx Module for Data Ack Complete Cb */ ol_txrx_data_tx_cb_set(vdev, wma_data_tx_ack_comp_hdlr, wma); WMA_LOGA("new IBSS vdev created with mac %pM", add_sta_self_param.self_mac_addr); + pdev = ol_txrx_get_pdev_from_vdev(vdev); + /* create ibss bss peer */ - status = wma_create_peer(wma, vdev->pdev, vdev, vdev->mac_addr.raw, + status = wma_create_peer(wma, pdev, vdev, mac_addr_raw, WMI_PEER_TYPE_DEFAULT, vdev_id, false); if (status != QDF_STATUS_SUCCESS) WMA_LOGE("%s: Failed to create IBSS bss peer", __func__); else WMA_LOGA("IBSS BSS peer created with mac %pM", - vdev->mac_addr.raw); + mac_addr_raw); } #else /** @@ -2901,6 +2888,7 @@ static void wma_add_bss_ibss_mode(tp_wma_handle wma, tpAddBssParams add_bss) struct del_sta_self_params del_sta_param; tSetBssKeyParams key_info; struct sir_hw_mode_params hw_mode = {0}; + struct cdf_mac_addr *mac_addr; vdev = wma_find_vdev_by_addr(wma, add_bss->selfMacAddr, &vdev_id); if (!vdev) { @@ -2925,17 +2913,19 @@ static void wma_add_bss_ibss_mode(tp_wma_handle wma, tpAddBssParams add_bss) __func__, vdev_id); /* remove peers on the existing non-ibss vdev */ - TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) { - WMA_LOGE("%s: peer found for vdev id %d. deleting the peer", - __func__, vdev_id); - wma_remove_peer(wma, (uint8_t *) &vdev->mac_addr, - vdev_id, peer, false); + ol_txrx_remove_peers_for_vdev_no_lock(vdev, + (ol_txrx_vdev_peer_remove_cb)wma_remove_peer, wma); + mac_addr = ol_txrx_get_vdev_struct_mac_addr(vdev); + if (mac_addr == NULL) { + WMA_LOGE("%s: mac_addr is NULL for vdev with id %d", + __func__, vdev_id); + goto send_fail_resp; } /* remove the non-ibss vdev */ qdf_copy_macaddr( - (struct qdf_mac_addr *) &(del_sta_param.self_mac_addr), - (struct qdf_mac_addr *) &(vdev->mac_addr)); + (struct cdf_mac_addr *) &(del_sta_param.self_mac_addr), + mac_addr); del_sta_param.session_id = vdev_id; del_sta_param.status = 0; @@ -3473,7 +3463,7 @@ static void wma_add_sta_req_ap_mode(tp_wma_handle wma, tpAddStaParams add_sta) goto send_rsp; } - iface = &wma->interfaces[vdev->vdev_id]; + iface = &wma->interfaces[add_sta->smesessionId]; peer = ol_txrx_find_peer_by_addr_and_vdev(pdev, vdev, add_sta->staMac, &peer_id); @@ -3706,7 +3696,7 @@ static void wma_add_tdls_sta(tp_wma_handle wma, tpAddStaParams add_sta) qdf_mem_zero(peerStateParams, sizeof(*peerStateParams)); peerStateParams->peerState = WMI_TDLS_PEER_STATE_PEERING; - peerStateParams->vdevId = vdev->vdev_id; + peerStateParams->vdevId = add_sta->smesessionId; qdf_mem_copy(&peerStateParams->peerMacAddr, &add_sta->staMac, sizeof(tSirMacAddr)); wma_update_tdls_peer_state(wma, peerStateParams); @@ -3826,7 +3816,9 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params) status = QDF_STATUS_E_FAILURE; goto out; } - if (peer != NULL && peer->state == OL_TXRX_PEER_STATE_DISC) { + + if (peer != NULL && + (ol_txrx_get_peer_state(peer) == OL_TXRX_PEER_STATE_DISC)) { /* * This is the case for reassociation. * peer state update and peer_assoc is required since it @@ -4014,8 +4006,9 @@ static void wma_delete_sta_req_ap_mode(tp_wma_handle wma, tpDeleteStaParams del_sta) { ol_txrx_pdev_handle pdev; - struct ol_txrx_peer_t *peer; + ol_txrx_peer_handle peer; struct wma_target_req *msg; + uint8_t *peer_mac_addr; pdev = cds_get_context(QDF_MODULE_ID_TXRX); @@ -4032,8 +4025,9 @@ static void wma_delete_sta_req_ap_mode(tp_wma_handle wma, del_sta->status = QDF_STATUS_E_FAILURE; goto send_del_rsp; } + peer_mac_addr = ol_txrx_peer_get_peer_mac_addr(peer); - wma_remove_peer(wma, peer->mac_addr.raw, del_sta->smesessionId, peer, + wma_remove_peer(wma, peer_mac_addr, del_sta->smesessionId, peer, false); del_sta->status = QDF_STATUS_SUCCESS; @@ -4080,34 +4074,8 @@ send_del_rsp: */ static void wma_del_tdls_sta(tp_wma_handle wma, tpDeleteStaParams del_sta) { - ol_txrx_pdev_handle pdev; - ol_txrx_vdev_handle vdev; - struct ol_txrx_peer_t *peer; tTdlsPeerStateParams *peerStateParams; - pdev = cds_get_context(QDF_MODULE_ID_TXRX); - - if (NULL == pdev) { - WMA_LOGE("%s: Failed to find pdev", __func__); - del_sta->status = QDF_STATUS_E_FAILURE; - goto send_del_rsp; - } - - vdev = wma_find_vdev_by_id(wma, del_sta->smesessionId); - if (!vdev) { - WMA_LOGE("%s: Failed to find vdev", __func__); - del_sta->status = QDF_STATUS_E_FAILURE; - goto send_del_rsp; - } - - peer = ol_txrx_peer_find_by_local_id(pdev, del_sta->staIdx); - if (!peer) { - WMA_LOGE("%s: Failed to get peer handle using peer id %d", - __func__, del_sta->staIdx); - del_sta->status = QDF_STATUS_E_FAILURE; - goto send_del_rsp; - } - peerStateParams = qdf_mem_malloc(sizeof(tTdlsPeerStateParams)); if (!peerStateParams) { WMA_LOGE("%s: Failed to allocate memory for peerStateParams for: %pM", @@ -4118,7 +4086,7 @@ static void wma_del_tdls_sta(tp_wma_handle wma, tpDeleteStaParams del_sta) qdf_mem_zero(peerStateParams, sizeof(*peerStateParams)); peerStateParams->peerState = WMA_TDLS_PEER_STATE_TEARDOWN; - peerStateParams->vdevId = vdev->vdev_id; + peerStateParams->vdevId = del_sta->smesessionId; qdf_mem_copy(&peerStateParams->peerMacAddr, &del_sta->staMac, sizeof(tSirMacAddr)); @@ -4322,9 +4290,9 @@ void wma_delete_bss(tp_wma_handle wma, tpDeleteBssParams params) wma->interfaces[params->smesessionId].psnr_req = NULL; } - if (wlan_op_mode_ibss == txrx_vdev->opmode) { + if (wlan_op_mode_ibss == ol_txrx_get_opmode(txrx_vdev)) wma->ibss_started = 0; - } + if (wma_is_roam_synch_in_progress(wma, params->smesessionId)) { roam_synch_in_progress = true; WMA_LOGD("LFR3:%s: Setting vdev_up to FALSE for session %d", diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index ef525be6de37..c4477b1a498b 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -5468,7 +5468,8 @@ int wma_update_tdls_peer_state(WMA_HANDLE handle, uint32_t i; ol_txrx_pdev_handle pdev; uint8_t peer_id; - struct ol_txrx_peer_t *peer; + ol_txrx_peer_handle peer; + uint8_t *peer_mac_addr; int ret = 0; uint32_t *ch_mhz; @@ -5521,12 +5522,13 @@ int wma_update_tdls_peer_state(WMA_HANDLE handle, ret = -EIO; goto end_tdls_peer_state; } + peer_mac_addr = ol_txrx_peer_get_peer_mac_addr(peer); WMA_LOGD("%s: calling wma_remove_peer for peer " MAC_ADDRESS_STR " vdevId: %d", __func__, - MAC_ADDR_ARRAY(peer->mac_addr.raw), + MAC_ADDR_ARRAY(peer_mac_addr), peerStateParams->vdevId); - wma_remove_peer(wma_handle, peer->mac_addr.raw, + wma_remove_peer(wma_handle, peer_mac_addr, peerStateParams->vdevId, peer, false); } diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c index e7eed705db8b..f055d6f39ba3 100644 --- a/core/wma/src/wma_mgmt.c +++ b/core/wma/src/wma_mgmt.c @@ -67,6 +67,11 @@ #include "wma_internal.h" #include "cds_concurrency.h" #include "cdp_txrx_flow_ctrl_legacy.h" +#include +#include +#include +#include +#include /** * wma_send_bcn_buf_ll() - prepare and send beacon buffer to fw for LL @@ -1455,7 +1460,9 @@ void wma_set_bsskey(tp_wma_handle wma_handle, tpSetBssKeyParams key_info) QDF_STATUS status = QDF_STATUS_SUCCESS; uint32_t i; uint32_t def_key_idx = 0; + uint32_t wlan_opmode; ol_txrx_vdev_handle txrx_vdev; + uint8_t *mac_addr; WMA_LOGD("BSS key setup"); txrx_vdev = wma_find_vdev_by_id(wma_handle, key_info->smesessionId); @@ -1464,13 +1471,14 @@ void wma_set_bsskey(tp_wma_handle wma_handle, tpSetBssKeyParams key_info) key_info->status = QDF_STATUS_E_FAILURE; goto out; } + wlan_opmode = ol_txrx_get_opmode(txrx_vdev); /* * For IBSS, WMI expects the BSS key to be set per peer key * So cache the BSS key in the wma_handle and re-use it when the * STA key is been setup for a peer */ - if (wlan_op_mode_ibss == txrx_vdev->opmode) { + if (wlan_op_mode_ibss == wlan_opmode) { key_info->status = QDF_STATUS_SUCCESS; if (wma_handle->ibss_started > 0) goto out; @@ -1484,16 +1492,22 @@ void wma_set_bsskey(tp_wma_handle wma_handle, tpSetBssKeyParams key_info) key_params.key_type = key_info->encType; key_params.singl_tid_rc = key_info->singleTidRc; key_params.unicast = false; - if (txrx_vdev->opmode == wlan_op_mode_sta) { + if (wlan_opmode == wlan_op_mode_sta) { qdf_mem_copy(key_params.peer_mac, wma_handle->interfaces[key_info->smesessionId].bssid, IEEE80211_ADDR_LEN); } else { + mac_addr = ol_txrx_get_vdev_mac_addr(txrx_vdev); + if (mac_addr == NULL) { + WMA_LOGE("%s: mac_addr is NULL for vdev with id %d", + __func__, key_info->smesessionId); + goto out; + } /* vdev mac address will be passed for all other modes */ - qdf_mem_copy(key_params.peer_mac, txrx_vdev->mac_addr.raw, + qdf_mem_copy(key_params.peer_mac, mac_addr, IEEE80211_ADDR_LEN); WMA_LOGA("BSS Key setup with vdev_mac %pM\n", - txrx_vdev->mac_addr.raw); + mac_addr); } if (key_info->numKeys == 0 && @@ -1530,7 +1544,7 @@ void wma_set_bsskey(tp_wma_handle wma_handle, tpSetBssKeyParams key_info) key_info->key[i].keyLength); status = wma_setup_install_key_cmd(wma_handle, &key_params, - txrx_vdev->opmode); + wlan_opmode); if (status == QDF_STATUS_E_NOMEM) { WMA_LOGE("%s:Failed to setup install key buf", __func__); @@ -1608,18 +1622,17 @@ void wma_adjust_ibss_heart_beat_timer(tp_wma_handle wma, return; } - new_peer_num = vdev->ibss_peer_num + peer_num_delta; - if (new_peer_num > MAX_IBSS_PEERS || new_peer_num < 0) { + /* adjust peer numbers */ + new_peer_num = ol_txrx_update_ibss_add_peer_num_of_vdev(vdev, + peer_num_delta); + if (OL_TXRX_INVALID_NUM_PEERS == new_peer_num) { WMA_LOGE("new peer num %d out of valid boundary", new_peer_num); return; } - /* adjust peer numbers */ - vdev->ibss_peer_num = new_peer_num; - /* reset timer value if all peers departed */ if (new_peer_num == 0) { - vdev->ibss_peer_heart_beat_timer = 0; + ol_txrx_set_ibss_vdev_heart_beat_timer(vdev, 0); return; } @@ -1630,15 +1643,13 @@ void wma_adjust_ibss_heart_beat_timer(tp_wma_handle wma, new_timer_value_sec, new_peer_num); return; } - if (new_timer_value_sec == vdev->ibss_peer_heart_beat_timer) { + if (new_timer_value_sec == + ol_txrx_set_ibss_vdev_heart_beat_timer(vdev, new_timer_value_sec)) { WMA_LOGD("timer value %d stays same, no need to notify target", new_timer_value_sec); return; } - /* send new timer value to target */ - vdev->ibss_peer_heart_beat_timer = new_timer_value_sec; - new_timer_value_ms = ((uint32_t) new_timer_value_sec) * 1000; status = wma_vdev_set_param(wma->wmi_handle, vdev_id, @@ -1671,6 +1682,7 @@ static void wma_set_ibsskey_helper(tp_wma_handle wma_handle, uint32_t i; uint32_t def_key_idx = 0; ol_txrx_vdev_handle txrx_vdev; + int opmode; WMA_LOGD("BSS key setup for peer"); txrx_vdev = wma_find_vdev_by_id(wma_handle, key_info->smesessionId); @@ -1680,12 +1692,14 @@ static void wma_set_ibsskey_helper(tp_wma_handle wma_handle, return; } + qdf_mem_set(&key_params, sizeof(key_params), 0); + opmode = ol_txrx_get_opmode(txrx_vdev); qdf_mem_set(&key_params, sizeof(key_params), 0); key_params.vdev_id = key_info->smesessionId; key_params.key_type = key_info->encType; key_params.singl_tid_rc = key_info->singleTidRc; key_params.unicast = false; - ASSERT(wlan_op_mode_ibss == txrx_vdev->opmode); + ASSERT(wlan_op_mode_ibss == opmode); qdf_mem_copy(key_params.peer_mac, peer_macaddr.bytes, IEEE80211_ADDR_LEN); @@ -1719,7 +1733,7 @@ static void wma_set_ibsskey_helper(tp_wma_handle wma_handle, key_info->key[i].keyLength); status = wma_setup_install_key_cmd(wma_handle, &key_params, - txrx_vdev->opmode); + opmode); if (status == QDF_STATUS_E_NOMEM) { WMA_LOGE("%s:Failed to setup install key buf", __func__); @@ -1747,10 +1761,11 @@ void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info) QDF_STATUS status = QDF_STATUS_SUCCESS; ol_txrx_pdev_handle txrx_pdev; ol_txrx_vdev_handle txrx_vdev; - struct ol_txrx_peer_t *peer; + ol_txrx_peer_handle peer; uint8_t num_keys = 0, peer_id; struct wma_set_key_params key_params; uint32_t def_key_idx = 0; + int opmode; WMA_LOGD("STA key setup"); @@ -1777,11 +1792,12 @@ void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info) key_info->status = QDF_STATUS_E_FAILURE; goto out; } + opmode = ol_txrx_get_opmode(txrx_vdev); if (key_info->defWEPIdx == WMA_INVALID_KEY_IDX && (key_info->encType == eSIR_ED_WEP40 || key_info->encType == eSIR_ED_WEP104) && - txrx_vdev->opmode != wlan_op_mode_ap) { + opmode != wlan_op_mode_ap) { wma_read_cfg_wepkey(wma_handle, key_info->key, &def_key_idx, &num_keys); key_info->defWEPIdx = def_key_idx; @@ -1828,7 +1844,7 @@ void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info) key_params.key_len = key_info->key[i].keyLength; status = wma_setup_install_key_cmd(wma_handle, &key_params, - txrx_vdev->opmode); + opmode); if (status == QDF_STATUS_E_NOMEM) { WMA_LOGE("%s:Failed to setup install key buf", __func__); @@ -1850,7 +1866,7 @@ void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info) /* In IBSS mode, set the BSS KEY for this peer * BSS key is supposed to be cache into wma_handle */ - if (wlan_op_mode_ibss == txrx_vdev->opmode) { + if (wlan_op_mode_ibss == opmode) { wma_set_ibsskey_helper(wma_handle, &wma_handle->ibsskey_info, key_info->peer_macaddr); } @@ -2691,9 +2707,7 @@ wma_is_ccmp_pn_replay_attack(void *cds_ctx, struct ieee80211_frame *wh, } new_pn = wma_extract_ccmp_pn(ccmp_ptr); - last_pn_valid = &peer->last_rmf_pn_valid; - last_pn = &peer->last_rmf_pn; - rmf_pn_replays = &peer->rmf_pn_replays; + ol_txrx_get_pn_info(peer, &last_pn_valid, &last_pn, &rmf_pn_replays); if (*last_pn_valid) { if (new_pn > *last_pn) { diff --git a/core/wma/src/wma_ocb.c b/core/wma/src/wma_ocb.c index 624912eafc0e..8cfde6e8614f 100644 --- a/core/wma/src/wma_ocb.c +++ b/core/wma/src/wma_ocb.c @@ -34,6 +34,7 @@ #include "wma_ocb.h" #include "wmi_unified_api.h" #include "cds_utils.h" +#include /** * wma_ocb_resp() - send the OCB set config response via callback @@ -48,36 +49,40 @@ int wma_ocb_set_config_resp(tp_wma_handle wma_handle, uint8_t status) struct sir_ocb_config *req = wma_handle->ocb_config_req; ol_txrx_vdev_handle vdev = (req ? wma_handle->interfaces[req->session_id].handle : NULL); + struct ol_txrx_ocb_set_chan ocb_set_chan; /* * If the command was successful, save the channel information in the * vdev. */ if (status == QDF_STATUS_SUCCESS && vdev && req) { - if (vdev->ocb_channel_info) - qdf_mem_free(vdev->ocb_channel_info); - vdev->ocb_channel_count = + ocb_set_chan.ocb_channel_info = ol_txrx_get_ocb_chan_info(vdev); + if (ocb_set_chan.ocb_channel_info) + qdf_mem_free(ocb_set_chan.ocb_channel_info); + ocb_set_chan.ocb_channel_count = req->channel_count; if (req->channel_count) { int i; - int buf_size = sizeof(*vdev->ocb_channel_info) * + int buf_size = sizeof(*ocb_set_chan.ocb_channel_info) * req->channel_count; - vdev->ocb_channel_info = + ocb_set_chan.ocb_channel_info = qdf_mem_malloc(buf_size); - if (!vdev->ocb_channel_info) + if (!ocb_set_chan.ocb_channel_info) return -ENOMEM; - qdf_mem_zero(vdev->ocb_channel_info, buf_size); + qdf_mem_zero(ocb_set_chan.ocb_channel_info, buf_size); for (i = 0; i < req->channel_count; i++) { - vdev->ocb_channel_info[i].chan_freq = + ocb_set_chan.ocb_channel_info[i].chan_freq = req->channels[i].chan_freq; if (req->channels[i].flags & OCB_CHANNEL_FLAG_DISABLE_RX_STATS_HDR) - vdev->ocb_channel_info[i]. + ocb_set_chan.ocb_channel_info[i]. disable_rx_stats_hdr = 1; } } else { - vdev->ocb_channel_info = 0; + ocb_set_chan.ocb_channel_info = 0; + ocb_set_chan.ocb_channel_count = 0; } + ol_txrx_set_ocb_chan_info(vdev, ocb_set_chan); } /* Free the configuration that was saved in wma_ocb_set_config. */ diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index d6c6f7954ac2..2cc648d1f120 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -44,6 +44,8 @@ #include "wni_cfg.h" #include "cfg_api.h" #include "wlan_tgt_def_config.h" +#include +#include #include "qdf_nbuf.h" #include "qdf_types.h" @@ -4911,10 +4913,10 @@ QDF_STATUS wma_ipa_offload_enable_disable(tp_wma_handle wma, struct sir_ipa_offload_enable_disable *ipa_offload) { ol_txrx_vdev_handle vdev; - struct txrx_pdev_cfg_t *cfg; int32_t intra_bss_fwd = 0; struct ipa_offload_control_params params = {0}; QDF_STATUS status; + uint8_t rx_fwd_disabled; if (!wma || !wma->wmi_handle) { WMA_LOGE("%s: WMA is closed, can not issue cmd", @@ -4955,11 +4957,11 @@ QDF_STATUS wma_ipa_offload_enable_disable(tp_wma_handle wma, return QDF_STATUS_SUCCESS; /* Disable Intra-BSS FWD offload when gDisableIntraBssFwd=1 in INI */ - cfg = (struct txrx_pdev_cfg_t *)vdev->pdev->ctrl_pdev; - if (!ipa_offload->enable || cfg->rx_fwd_disabled) { + rx_fwd_disabled = ol_txrx_is_rx_fwd_disabled(vdev); + if (!ipa_offload->enable || rx_fwd_disabled) { WMA_LOGE("%s: ipa_offload->enable=%d, rx_fwd_disabled=%d", __func__, - ipa_offload->enable, cfg->rx_fwd_disabled); + ipa_offload->enable, rx_fwd_disabled); intra_bss_fwd = 1; }