Browse Source

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
Vevek Venkatesan 5 years ago
parent
commit
07bddb2034

+ 1 - 1
core/dp/ol/inc/ol_txrx_osif_api.h

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

+ 7 - 3
core/dp/txrx/ol_tx.c

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

+ 0 - 2
core/hdd/inc/wlan_hdd_main.h

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

+ 0 - 7
core/hdd/src/wlan_hdd_assoc.c

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

+ 2 - 7
core/hdd/src/wlan_hdd_softap_tx_rx.c

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

+ 2 - 3
core/hdd/src/wlan_hdd_tx_rx.c

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