qcacld-3.0: Check vdev from CDP vdev_id API

Check for validity of vdev obtained from the CDP
cdp_get_vdev_from_vdev_id API.

Change-Id: Ie7fb99a0e08135bd3f2cc6b63070a4bd72df943a
CRs-Fixed: 2434583
This commit is contained in:
Mohit Khanna 2019-04-12 10:04:57 -07:00
commit e1b8602571
5 changed files with 51 additions and 26 deletions

View file

@ -354,13 +354,15 @@ static enum wlan_ipa_forward_type wlan_ipa_intrabss_forward(
if ((desc & FW_RX_DESC_FORWARD_M)) {
void *vdev = cdp_get_vdev_from_vdev_id(soc, pdev,
iface_ctx->session_id);
if (!vdev)
goto drop_pkt;
if (cdp_tx_desc_thresh_reached(soc, vdev)) {
/* Drop the packet*/
ipa_ctx->stats.num_tx_fwd_err++;
dev_kfree_skb_any(skb);
ret = WLAN_IPA_FORWARD_PKT_DISCARD;
return ret;
goto drop_pkt;
}
ipa_debug_rl("Forward packet to Tx (fw_desc=%d)", desc);
ipa_ctx->ipa_tx_forward++;
@ -380,7 +382,11 @@ static enum wlan_ipa_forward_type wlan_ipa_intrabss_forward(
ret = WLAN_IPA_FORWARD_PKT_LOCAL_STACK;
}
}
return ret;
drop_pkt:
dev_kfree_skb_any(skb);
ret = WLAN_IPA_FORWARD_PKT_DISCARD;
return ret;
}

View file

@ -2126,7 +2126,6 @@ QDF_STATUS hdd_roam_register_sta(struct hdd_adapter *adapter,
(struct cdp_pdev *)pdev,
adapter->vdev_id);
if (!adapter->txrx_vdev) {
hdd_err("%s find vdev fail", __func__);
return QDF_STATUS_E_FAILURE;
}
@ -4020,6 +4019,7 @@ QDF_STATUS hdd_roam_register_tdlssta(struct hdd_adapter *adapter,
struct ol_txrx_ops txrx_ops;
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
struct cdp_vdev *txrx_vdev;
/*
* TDLS sta in BSS should be set as STA type TDLS and STA MAC should
@ -4039,12 +4039,16 @@ QDF_STATUS hdd_roam_register_tdlssta(struct hdd_adapter *adapter,
txrx_ops.rx.rx = hdd_rx_packet_cbk;
txrx_ops.rx.rx_stack = NULL;
}
txrx_vdev = cdp_get_vdev_from_vdev_id(soc,
(struct cdp_pdev *)pdev,
adapter->vdev_id);
if (!txrx_vdev)
return QDF_STATUS_E_FAILURE;
cdp_vdev_register(soc,
(struct cdp_vdev *)cdp_get_vdev_from_vdev_id(soc,
(struct cdp_pdev *)pdev, adapter->vdev_id),
adapter, (struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
&txrx_ops);
cdp_vdev_register(soc, txrx_vdev,
adapter,
(struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
&txrx_ops);
adapter->tx_fn = txrx_ops.tx.tx;
txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info;

View file

@ -4470,6 +4470,7 @@ static int __wlan_hdd_cfg80211_handle_wisa_cmd(struct wiphy *wiphy,
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
mac_handle_t mac_handle;
struct cdp_vdev *txrx_vdev = NULL;
hdd_enter_dev(dev);
ret_val = wlan_hdd_validate_context(hdd_ctx);
@ -4503,12 +4504,15 @@ static int __wlan_hdd_cfg80211_handle_wisa_cmd(struct wiphy *wiphy,
hdd_err("Unable to set WISA mode: %d to FW", wisa_mode);
ret_val = -EINVAL;
}
if (QDF_IS_STATUS_SUCCESS(status) || wisa_mode == false)
cdp_set_wisa_mode(soc,
(struct cdp_vdev *)cdp_get_vdev_from_vdev_id(soc,
(struct cdp_pdev *)pdev,
adapter->vdev_id),
wisa_mode);
if (QDF_IS_STATUS_SUCCESS(status) || !wisa_mode) {
txrx_vdev = cdp_get_vdev_from_vdev_id(soc,
(struct cdp_pdev *)pdev,
adapter->vdev_id);
if (!txrx_vdev)
ret_val = -EINVAL;
else
cdp_set_wisa_mode(soc, txrx_vdev, wisa_mode);
}
err:
hdd_exit();
return ret_val;

View file

@ -222,6 +222,7 @@ static int hdd_ocb_register_sta(struct hdd_adapter *adapter)
struct ol_txrx_ops txrx_ops;
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
struct cdp_vdev *vdev;
qdf_status = cdp_peer_register_ocb_peer(soc,
adapter->mac_addr.bytes,
@ -239,16 +240,19 @@ static int hdd_ocb_register_sta(struct hdd_adapter *adapter)
/* Register the vdev transmit and receive functions */
qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
txrx_ops.rx.rx = hdd_rx_packet_cbk;
cdp_vdev_register(soc,
(struct cdp_vdev *)cdp_get_vdev_from_vdev_id(soc,
(struct cdp_pdev *)pdev, adapter->vdev_id),
adapter, (struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
&txrx_ops);
vdev = cdp_get_vdev_from_vdev_id(soc,
(struct cdp_pdev *)pdev,
adapter->vdev_id);
if (!vdev)
return -EINVAL;
cdp_vdev_register(soc, vdev, adapter,
(struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
&txrx_ops);
txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info;
adapter->tx_fn = txrx_ops.tx.tx;
qdf_status = cdp_peer_register(soc,
(struct cdp_pdev *)pdev, &sta_desc);
qdf_status = cdp_peer_register(soc, (struct cdp_pdev *)pdev, &sta_desc);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
hdd_err("Failed to register. Status= %d [0x%08X]",
qdf_status, qdf_status);

View file

@ -1013,6 +1013,7 @@ QDF_STATUS hdd_softap_register_sta(struct hdd_adapter *adapter,
struct ol_txrx_ops txrx_ops;
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
struct cdp_vdev *txrx_vdev = NULL;
hdd_info("STA:%u, Auth:%u, Priv:%u, WMM:%u",
sta_id, auth_required, privacy_required, wmm_enabled);
@ -1048,11 +1049,17 @@ QDF_STATUS hdd_softap_register_sta(struct hdd_adapter *adapter,
txrx_ops.rx.rx_stack = NULL;
}
txrx_vdev = cdp_get_vdev_from_vdev_id(soc,
(struct cdp_pdev *)pdev,
adapter->vdev_id);
if (!txrx_vdev)
return QDF_STATUS_E_FAILURE;
cdp_vdev_register(soc,
(struct cdp_vdev *)cdp_get_vdev_from_vdev_id(soc,
(struct cdp_pdev *)pdev, adapter->vdev_id),
adapter, (struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
&txrx_ops);
txrx_vdev,
adapter,
(struct cdp_ctrl_objmgr_vdev *)adapter->vdev,
&txrx_ops);
adapter->txrx_vdev = (void *)cdp_get_vdev_from_vdev_id(soc,
(struct cdp_pdev *)pdev,
adapter->vdev_id);