1
0

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:
Vevek Venkatesan
2019-09-11 20:21:37 +05:30
cometido por nshrivas
ascendente 0ac759fc1c
cometimento 07bddb2034
6 ficheiros modificados com 12 adições e 23 eliminações

Ver ficheiro

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

Ver ficheiro

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

Ver ficheiro

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

Ver ficheiro

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

Ver ficheiro

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

Ver ficheiro

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