qcacmn: check for vdev_id mismatch to deliver NBUFs to stack

Check for vdev_id mismatch to deliver NBUFs to stack to avoid
hold peer reference while giving nbuf list to stack

Change-Id: Ic475e00d5b1793ada7b26b7af3322ca2fa51836f
This commit is contained in:
Chaithanya Garrepalli
2019-12-12 20:24:40 +05:30
committed by nshrivas
parent 33fce952a9
commit 52511a17d1
4 changed files with 49 additions and 45 deletions

View File

@@ -335,7 +335,7 @@ dp_get_vdev_from_peer(struct dp_soc *soc,
if (unlikely(!peer)) {
if (peer_id != HTT_INVALID_PEER) {
vdev_id = DP_PEER_METADATA_ID_GET(
vdev_id = DP_PEER_METADATA_VDEV_ID_GET(
mpdu_desc_info.peer_meta_data);
QDF_TRACE(QDF_MODULE_ID_DP,
QDF_TRACE_LEVEL_DEBUG,
@@ -1593,7 +1593,6 @@ bool dp_is_special_data(qdf_nbuf_t nbuf)
static inline
void dp_rx_deliver_to_stack_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf)
{
uint32_t peer_mdata;
uint16_t peer_id;
uint8_t vdev_id;
struct dp_vdev *vdev;
@@ -1602,13 +1601,11 @@ void dp_rx_deliver_to_stack_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf)
uint32_t pkt_len = 0;
uint8_t *rx_tlv_hdr;
peer_mdata = QDF_NBUF_CB_RX_PEER_ID(nbuf);
peer_id = DP_PEER_METADATA_PEER_ID_GET(peer_mdata);
peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf);
if (peer_id > soc->max_peers)
goto deliver_fail;
vdev_id = DP_PEER_METADATA_ID_GET(peer_mdata);
vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf);
vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id);
if (!vdev || !vdev->osif_rx)
goto deliver_fail;
@@ -1717,6 +1714,7 @@ uint32_t dp_rx_process(struct dp_intr *int_ctx, hal_ring_handle_t hal_ring_hdl,
uint32_t l2_hdr_offset = 0;
uint16_t msdu_len = 0;
uint16_t peer_id;
uint8_t vdev_id;
struct dp_peer *peer;
struct dp_vdev *vdev;
uint32_t pkt_len = 0;
@@ -1897,6 +1895,8 @@ more_data:
peer_mdata = mpdu_desc_info.peer_meta_data;
QDF_NBUF_CB_RX_PEER_ID(rx_desc->nbuf) =
DP_PEER_METADATA_PEER_ID_GET(peer_mdata);
QDF_NBUF_CB_RX_VDEV_ID(rx_desc->nbuf) =
DP_PEER_METADATA_VDEV_ID_GET(peer_mdata);
/*
* save msdu flags first, last and continuation msdu in
@@ -1985,12 +1985,20 @@ done:
while (nbuf) {
next = nbuf->next;
rx_tlv_hdr = qdf_nbuf_data(nbuf);
vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf);
if (deliver_list_head && vdev && (vdev->vdev_id != vdev_id)) {
dp_rx_deliver_to_stack(vdev, peer, deliver_list_head,
deliver_list_tail);
deliver_list_head = NULL;
deliver_list_tail = NULL;
}
/* Get TID from struct cb->tid_val, save to tid */
if (qdf_nbuf_is_rx_chfrag_start(nbuf))
tid = qdf_nbuf_get_tid_val(nbuf);
peer_mdata = QDF_NBUF_CB_RX_PEER_ID(nbuf);
peer_id = DP_PEER_METADATA_PEER_ID_GET(peer_mdata);
peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf);
peer = dp_peer_find_by_id(soc, peer_id);
if (peer) {
@@ -2003,13 +2011,6 @@ done:
rx_bufs_used++;
if (deliver_list_head && peer && (vdev != peer->vdev)) {
dp_rx_deliver_to_stack(vdev, peer, deliver_list_head,
deliver_list_tail);
deliver_list_head = NULL;
deliver_list_tail = NULL;
}
if (qdf_likely(peer)) {
vdev = peer->vdev;
} else {