qcacld-3.0: cdp: Converge ol_txrx_ops
Currently txrx_ops.tx.tx is given vdev handle as its argument, which is directly accessed by the caller. This can cause a race-condition in access of the respective handle if it has been deleted in parallel. Hence as a part of cdp convergence, pass only the vdev_id, which will be used to get the respective handle and hence avoiding unwanted access of the handle if it has been deleted. Change-Id: Ie158a2ba805f52658cd6fb12c969fc0d677c1815 CRs-Fixed: 2541631
Este cometimento está contido em:

cometido por
nshrivas

ascendente
0ac759fc1c
cometimento
07bddb2034
@@ -69,7 +69,7 @@ qdf_nbuf_t ol_txrx_osif_tso_segment(ol_txrx_vdev_handle txrx_vdev,
|
||||
int max_seg_payload_bytes,
|
||||
qdf_nbuf_t jumbo_tcp_frame);
|
||||
|
||||
qdf_nbuf_t ol_tx_data(struct cdp_vdev *data_vdev, qdf_nbuf_t skb);
|
||||
qdf_nbuf_t ol_tx_data(struct cdp_soc_t *soc, uint8_t vdev_id, qdf_nbuf_t skb);
|
||||
|
||||
void ol_rx_data_process(struct ol_txrx_peer_t *peer,
|
||||
qdf_nbuf_t rx_buf_list);
|
||||
|
@@ -43,16 +43,20 @@
|
||||
|
||||
/**
|
||||
* ol_tx_data() - send data frame
|
||||
* @vdev: virtual device handle
|
||||
* @soc_hdl: datapath soc handle
|
||||
* @vdev_id: virtual interface id
|
||||
* @skb: skb
|
||||
*
|
||||
* Return: skb/NULL for success
|
||||
*/
|
||||
qdf_nbuf_t ol_tx_data(struct cdp_vdev *data_vdev, qdf_nbuf_t skb)
|
||||
qdf_nbuf_t ol_tx_data(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
||||
qdf_nbuf_t skb)
|
||||
{
|
||||
struct ol_txrx_pdev_t *pdev;
|
||||
qdf_nbuf_t ret;
|
||||
ol_txrx_vdev_handle vdev = (struct ol_txrx_vdev_t *)data_vdev;
|
||||
struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
|
||||
ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
|
||||
vdev_id);
|
||||
|
||||
if (qdf_unlikely(!vdev)) {
|
||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
|
||||
|
@@ -1058,8 +1058,6 @@ struct hdd_adapter {
|
||||
qdf_spinlock_t vdev_lock;
|
||||
uint8_t vdev_id;
|
||||
|
||||
struct cdp_vdev *txrx_vdev;
|
||||
|
||||
/** Handle to the network device */
|
||||
struct net_device *dev;
|
||||
|
||||
|
@@ -2144,13 +2144,6 @@ QDF_STATUS hdd_roam_register_sta(struct hdd_adapter *adapter,
|
||||
|
||||
txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info;
|
||||
|
||||
adapter->txrx_vdev = cdp_get_vdev_from_vdev_id(soc,
|
||||
(struct cdp_pdev *)pdev,
|
||||
adapter->vdev_id);
|
||||
if (!adapter->txrx_vdev) {
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
txrx_ops.tx.tx = NULL;
|
||||
cdp_vdev_register(soc, adapter->vdev_id, (ol_osif_vdev_handle)adapter,
|
||||
&txrx_ops);
|
||||
|
@@ -422,7 +422,7 @@ static void __hdd_softap_hard_start_xmit(struct sk_buff *skb,
|
||||
struct hdd_context *hdd_ctx = adapter->hdd_ctx;
|
||||
struct qdf_mac_addr *dest_mac_addr, *mac_addr;
|
||||
static struct qdf_mac_addr bcast_mac_addr = QDF_MAC_ADDR_BCAST_INIT;
|
||||
|
||||
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
|
||||
uint32_t num_seg;
|
||||
struct hdd_station_info *sta_info;
|
||||
|
||||
@@ -596,8 +596,7 @@ static void __hdd_softap_hard_start_xmit(struct sk_buff *skb,
|
||||
goto drop_pkt_and_release_skb;
|
||||
}
|
||||
|
||||
if (adapter->tx_fn(adapter->txrx_vdev,
|
||||
(qdf_nbuf_t)skb) != NULL) {
|
||||
if (adapter->tx_fn(soc, adapter->vdev_id, (qdf_nbuf_t)skb)) {
|
||||
QDF_TRACE(QDF_MODULE_ID_HDD_SAP_DATA, QDF_TRACE_LEVEL_INFO_HIGH,
|
||||
"%s: Failed to send packet to txrx for sta: "
|
||||
QDF_MAC_ADDR_STR, __func__,
|
||||
@@ -729,7 +728,6 @@ QDF_STATUS hdd_softap_deinit_tx_rx(struct hdd_adapter *adapter)
|
||||
if (!adapter)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
adapter->txrx_vdev = NULL;
|
||||
adapter->tx_fn = NULL;
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
@@ -1079,9 +1077,6 @@ QDF_STATUS hdd_softap_register_sta(struct hdd_adapter *adapter,
|
||||
adapter->vdev_id,
|
||||
(ol_osif_vdev_handle)adapter,
|
||||
&txrx_ops);
|
||||
adapter->txrx_vdev = cdp_get_vdev_from_vdev_id(soc,
|
||||
(struct cdp_pdev *)pdev,
|
||||
adapter->vdev_id);
|
||||
adapter->tx_fn = txrx_ops.tx.tx;
|
||||
|
||||
qdf_status = cdp_peer_register(soc,
|
||||
|
@@ -939,6 +939,7 @@ static void __hdd_hard_start_xmit(struct sk_buff *skb,
|
||||
bool is_arp = false;
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
struct hdd_context *hdd_ctx;
|
||||
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
|
||||
|
||||
#ifdef QCA_WIFI_FTM
|
||||
if (hdd_get_conparam() == QDF_GLOBAL_FTM_MODE) {
|
||||
@@ -1139,8 +1140,7 @@ static void __hdd_hard_start_xmit(struct sk_buff *skb,
|
||||
goto drop_pkt_and_release_skb;
|
||||
}
|
||||
|
||||
if (adapter->tx_fn(adapter->txrx_vdev,
|
||||
(qdf_nbuf_t)skb) != NULL) {
|
||||
if (adapter->tx_fn(soc, adapter->vdev_id, (qdf_nbuf_t)skb)) {
|
||||
QDF_TRACE(QDF_MODULE_ID_HDD_DATA, QDF_TRACE_LEVEL_INFO_HIGH,
|
||||
"%s: Failed to send packet to txrx for sta_id: "
|
||||
QDF_MAC_ADDR_STR,
|
||||
@@ -1349,7 +1349,6 @@ QDF_STATUS hdd_deinit_tx_rx(struct hdd_adapter *adapter)
|
||||
if (!adapter)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
|
||||
adapter->txrx_vdev = NULL;
|
||||
adapter->tx_fn = NULL;
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
|
Criar uma nova questão referindo esta
Bloquear um utilizador