qcacmn: Handle scattered msdu in OOR error scenario

In OOR error handling scenario, msdu is spread across
two nbufs. Due to this, there is a mismatch between
msdu count fetched from MPDU desc detatils and count
fetched from rx link descriptor.

Fix is to create frag list for the case where msdu
is spread across multiple nbufs.

Change-Id: I1d600a0988b373e68aad6ef815fb2d775763b7cb
CRs-Fixed: 2665963
This commit is contained in:
Yeshwanth Sriram Guntuka
2020-04-21 22:23:01 +05:30
committed by nshrivas
parent 4c6b5c6f69
commit 7dad533e6c
4 changed files with 77 additions and 28 deletions

View File

@@ -1792,11 +1792,29 @@ void dp_rx_skip_tlvs(qdf_nbuf_t nbuf, uint32_t l3_padding)
QDF_NBUF_CB_RX_PACKET_L3_HDR_PAD(nbuf) = l3_padding;
qdf_nbuf_pull_head(nbuf, l3_padding + RX_PKT_TLVS_LEN);
}
/**
* dp_rx_set_hdr_pad() - set l3 padding in nbuf cb
* @nbuf: pkt skb pointer
* @l3_padding: l3 padding
*
* Return: None
*/
static inline
void dp_rx_set_hdr_pad(qdf_nbuf_t nbuf, uint32_t l3_padding)
{
QDF_NBUF_CB_RX_PACKET_L3_HDR_PAD(nbuf) = l3_padding;
}
#else
void dp_rx_skip_tlvs(qdf_nbuf_t nbuf, uint32_t l3_padding)
{
qdf_nbuf_pull_head(nbuf, l3_padding + RX_PKT_TLVS_LEN);
}
static inline
void dp_rx_set_hdr_pad(qdf_nbuf_t nbuf, uint32_t l3_padding)
{
}
#endif
@@ -2911,26 +2929,27 @@ dp_rx_nbuf_prepare(struct dp_soc *soc, struct dp_pdev *pdev)
#ifdef DP_RX_SPECIAL_FRAME_NEED
bool dp_rx_deliver_special_frame(struct dp_soc *soc, struct dp_peer *peer,
qdf_nbuf_t nbuf, uint32_t frame_mask)
qdf_nbuf_t nbuf, uint32_t frame_mask,
uint8_t *rx_tlv_hdr)
{
uint32_t l2_hdr_offset = 0;
uint16_t msdu_len = 0;
uint32_t pkt_len = 0;
uint8_t *rx_tlv_hdr;
uint32_t skip_len;
if (qdf_unlikely(qdf_nbuf_is_frag(nbuf)))
return false;
rx_tlv_hdr = qdf_nbuf_data(nbuf);
l2_hdr_offset =
hal_rx_msdu_end_l3_hdr_padding_get(soc->hal_soc, rx_tlv_hdr);
msdu_len = QDF_NBUF_CB_RX_PKT_LEN(nbuf);
pkt_len = msdu_len + l2_hdr_offset + RX_PKT_TLVS_LEN;
QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST(nbuf) = 1;
if (qdf_unlikely(qdf_nbuf_is_frag(nbuf))) {
skip_len = l2_hdr_offset;
} else {
msdu_len = QDF_NBUF_CB_RX_PKT_LEN(nbuf);
skip_len = l2_hdr_offset + RX_PKT_TLVS_LEN;
qdf_nbuf_set_pktlen(nbuf, msdu_len + skip_len);
}
qdf_nbuf_set_pktlen(nbuf, pkt_len);
dp_rx_skip_tlvs(nbuf, l2_hdr_offset);
QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST(nbuf) = 1;
dp_rx_set_hdr_pad(nbuf, l2_hdr_offset);
qdf_nbuf_pull_head(nbuf, skip_len);
if (dp_rx_is_special_frame(nbuf, frame_mask)) {
dp_rx_deliver_to_stack(soc, peer->vdev, peer,