qcacld-3.0: remove references to datapath structures from other modules

Core datapath structures should be opaque to non-datapath modules,
remove the references to them.

Change-Id: I3618253566a971c27f16b14923d1ff8028718918
CRs-Fixed: 994638
This commit is contained in:
Manjunathappa Prakash 2016-03-31 19:20:49 -07:00 • committed by Gerrit - the friendly Code Review server
commit 10d357a17c
10 changed files with 435 additions and 152 deletions

View file

@ -40,6 +40,7 @@
#include <ol_txrx_api.h> /* ol_sec_type */
#include <wlan_defs.h> /* MAX_SPATIAL_STREAM */
#include <cdp_txrx_cmn.h> /* ol_pdev_handle, ol_vdev_handle, etc */
#include <cdp_txrx_cfg.h>
#define OL_ATH_TX_DRAIN_WAIT_DELAY 50

View file

@ -49,6 +49,7 @@
/* header files for our own APIs */
#include <ol_txrx_api.h>
#include <ol_txrx_dbg.h>
#include <cdp_txrx_ocb.h>
/* header files for our internal definitions */
#include <ol_txrx_internal.h> /* TXRX_ASSERT, etc. */
#include <wdi_event.h> /* 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)

View file

@ -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 -

View file

@ -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
}
}

View file

@ -68,6 +68,8 @@
#include "cdp_txrx_flow_ctrl_legacy.h"
#include "cdp_txrx_cmn.h"
#include "cdp_txrx_misc.h"
#include <cdp_txrx_peer_ops.h>
#include <cdp_txrx_cfg.h>
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;

View file

@ -69,6 +69,9 @@
#include "wma_ocb.h"
#include "cdp_txrx_cfg.h"
#include "cdp_txrx_flow_ctrl_legacy.h"
#include <cdp_txrx_peer_ops.h>
#include <cdp_txrx_cfg.h>
#include <cdp_txrx_cmn.h>
/**
* 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,
&param);
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",

View file

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

View file

@ -67,6 +67,11 @@
#include "wma_internal.h"
#include "cds_concurrency.h"
#include "cdp_txrx_flow_ctrl_legacy.h"
#include <cdp_txrx_peer_ops.h>
#include <cdp_txrx_pmf.h>
#include <cdp_txrx_cfg.h>
#include <cdp_txrx_cmn.h>
#include <cdp_txrx_misc.h>
/**
* 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) {

View file

@ -34,6 +34,7 @@
#include "wma_ocb.h"
#include "wmi_unified_api.h"
#include "cds_utils.h"
#include <cdp_txrx_ocb.h>
/**
* 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. */

View file

@ -44,6 +44,8 @@
#include "wni_cfg.h"
#include "cfg_api.h"
#include "wlan_tgt_def_config.h"
#include <cdp_txrx_peer_ops.h>
#include <cdp_txrx_cfg.h>
#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;
}