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:

committed by
nshrivas

parent
4c6b5c6f69
commit
7dad533e6c
@@ -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,
|
||||
|
Reference in New Issue
Block a user