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 (unlikely(!peer)) {
if (peer_id != HTT_INVALID_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); mpdu_desc_info.peer_meta_data);
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE(QDF_MODULE_ID_DP,
QDF_TRACE_LEVEL_DEBUG, QDF_TRACE_LEVEL_DEBUG,
@@ -1593,7 +1593,6 @@ bool dp_is_special_data(qdf_nbuf_t nbuf)
static inline static inline
void dp_rx_deliver_to_stack_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf) void dp_rx_deliver_to_stack_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf)
{ {
uint32_t peer_mdata;
uint16_t peer_id; uint16_t peer_id;
uint8_t vdev_id; uint8_t vdev_id;
struct dp_vdev *vdev; 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; uint32_t pkt_len = 0;
uint8_t *rx_tlv_hdr; uint8_t *rx_tlv_hdr;
peer_mdata = QDF_NBUF_CB_RX_PEER_ID(nbuf); peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf);
peer_id = DP_PEER_METADATA_PEER_ID_GET(peer_mdata);
if (peer_id > soc->max_peers) if (peer_id > soc->max_peers)
goto deliver_fail; 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); vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id);
if (!vdev || !vdev->osif_rx) if (!vdev || !vdev->osif_rx)
goto deliver_fail; 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; uint32_t l2_hdr_offset = 0;
uint16_t msdu_len = 0; uint16_t msdu_len = 0;
uint16_t peer_id; uint16_t peer_id;
uint8_t vdev_id;
struct dp_peer *peer; struct dp_peer *peer;
struct dp_vdev *vdev; struct dp_vdev *vdev;
uint32_t pkt_len = 0; uint32_t pkt_len = 0;
@@ -1897,6 +1895,8 @@ more_data:
peer_mdata = mpdu_desc_info.peer_meta_data; peer_mdata = mpdu_desc_info.peer_meta_data;
QDF_NBUF_CB_RX_PEER_ID(rx_desc->nbuf) = QDF_NBUF_CB_RX_PEER_ID(rx_desc->nbuf) =
DP_PEER_METADATA_PEER_ID_GET(peer_mdata); 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 * save msdu flags first, last and continuation msdu in
@@ -1985,12 +1985,20 @@ done:
while (nbuf) { while (nbuf) {
next = nbuf->next; next = nbuf->next;
rx_tlv_hdr = qdf_nbuf_data(nbuf); 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 */ /* Get TID from struct cb->tid_val, save to tid */
if (qdf_nbuf_is_rx_chfrag_start(nbuf)) if (qdf_nbuf_is_rx_chfrag_start(nbuf))
tid = qdf_nbuf_get_tid_val(nbuf); tid = qdf_nbuf_get_tid_val(nbuf);
peer_mdata = QDF_NBUF_CB_RX_PEER_ID(nbuf); peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf);
peer_id = DP_PEER_METADATA_PEER_ID_GET(peer_mdata);
peer = dp_peer_find_by_id(soc, peer_id); peer = dp_peer_find_by_id(soc, peer_id);
if (peer) { if (peer) {
@@ -2003,13 +2011,6 @@ done:
rx_bufs_used++; 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)) { if (qdf_likely(peer)) {
vdev = peer->vdev; vdev = peer->vdev;
} else { } else {

View File

@@ -47,14 +47,14 @@
#define DP_PEER_METADATA_PEER_ID_MASK 0x0000ffff #define DP_PEER_METADATA_PEER_ID_MASK 0x0000ffff
#define DP_PEER_METADATA_PEER_ID_SHIFT 0 #define DP_PEER_METADATA_PEER_ID_SHIFT 0
#define DP_PEER_METADATA_VDEV_ID_MASK 0x00070000 #define DP_PEER_METADATA_VDEV_ID_MASK 0x003f0000
#define DP_PEER_METADATA_VDEV_ID_SHIFT 16 #define DP_PEER_METADATA_VDEV_ID_SHIFT 16
#define DP_PEER_METADATA_PEER_ID_GET(_peer_metadata) \ #define DP_PEER_METADATA_PEER_ID_GET(_peer_metadata) \
(((_peer_metadata) & DP_PEER_METADATA_PEER_ID_MASK) \ (((_peer_metadata) & DP_PEER_METADATA_PEER_ID_MASK) \
>> DP_PEER_METADATA_PEER_ID_SHIFT) >> DP_PEER_METADATA_PEER_ID_SHIFT)
#define DP_PEER_METADATA_ID_GET(_peer_metadata) \ #define DP_PEER_METADATA_VDEV_ID_GET(_peer_metadata) \
(((_peer_metadata) & DP_PEER_METADATA_VDEV_ID_MASK) \ (((_peer_metadata) & DP_PEER_METADATA_VDEV_ID_MASK) \
>> DP_PEER_METADATA_VDEV_ID_SHIFT) >> DP_PEER_METADATA_VDEV_ID_SHIFT)

View File

@@ -104,24 +104,24 @@ typedef union {
* @rx.dev.priv_cb_w.protocol_tag: protocol tag set by app for rcvd packet type * @rx.dev.priv_cb_w.protocol_tag: protocol tag set by app for rcvd packet type
* @rx.dev.priv_cb_w.flow_tag: flow tag set by application for 5 tuples rcvd * @rx.dev.priv_cb_w.flow_tag: flow tag set by application for 5 tuples rcvd
* *
* @rx.dev.priv_cb_m.peer_cached_buf_frm: peer cached buffer
* @rx.dev.priv_cb_m.flush_ind: flush indication
* @rx.dev.priv_cb_m.packet_buf_pool: packet buff bool
* @rx.dev.priv_cb_m.tcp_seq_num: TCP sequence number * @rx.dev.priv_cb_m.tcp_seq_num: TCP sequence number
* @rx.dev.priv_cb_m.tcp_ack_num: TCP ACK number * @rx.dev.priv_cb_m.tcp_ack_num: TCP ACK number
* @rx.dev.priv_cb_m.lro_ctx: LRO context * @rx.dev.priv_cb_m.lro_ctx: LRO context
* @rx.dev.priv_cb_m.dp.wifi3.msdu_len: length of RX packet * @rx.dev.priv_cb_m.dp.wifi3.msdu_len: length of RX packet
* @rx.dev.priv_cb_m.dp.wifi3.peer_id: peer_id for RX packet * @rx.dev.priv_cb_m.dp.wifi3.peer_id: peer_id for RX packet
* @rx.dev.priv_cb_m.dp.wifi2.map_index: * @rx.dev.priv_cb_m.dp.wifi2.map_index:
* @rx.dev.priv_cb_m.vdev_id: vdev_id for RX pkt
* @rx.dev.priv_cb_m.ipa_owned: packet owned by IPA * @rx.dev.priv_cb_m.ipa_owned: packet owned by IPA
* *
* @rx.lro_eligible: flag to indicate whether the MSDU is LRO eligible * @rx.lro_eligible: flag to indicate whether the MSDU is LRO eligible
* @rx.peer_cached_buf_frm: peer cached buffer
* @rx.tcp_proto: L4 protocol is TCP * @rx.tcp_proto: L4 protocol is TCP
* @rx.tcp_pure_ack: A TCP ACK packet with no payload * @rx.tcp_pure_ack: A TCP ACK packet with no payload
* @rx.ipv6_proto: L3 protocol is IPV6 * @rx.ipv6_proto: L3 protocol is IPV6
* @rx.ip_offset: offset to IP header * @rx.ip_offset: offset to IP header
* @rx.tcp_offset: offset to TCP header * @rx.tcp_offset: offset to TCP header
* @rx_ctx_id: Rx context id * @rx_ctx_id: Rx context id
* @flush_ind: flush indication
* @num_elements_in_list: number of elements in the nbuf list * @num_elements_in_list: number of elements in the nbuf list
* *
* @rx.tcp_udp_chksum: L4 payload checksum * @rx.tcp_udp_chksum: L4 payload checksum
@@ -132,7 +132,7 @@ typedef union {
* @rx.flag_chfrag_start: first MSDU in an AMSDU * @rx.flag_chfrag_start: first MSDU in an AMSDU
* @rx.flag_chfrag_cont: middle or part of MSDU in an AMSDU * @rx.flag_chfrag_cont: middle or part of MSDU in an AMSDU
* @rx.flag_chfrag_end: last MSDU in an AMSDU * @rx.flag_chfrag_end: last MSDU in an AMSDU
* @rx.packet_buff_pool: indicate packet from pre-allocated pool for Rx ring * @rx.flag_retry: flag to indicate MSDU is retried
* @rx.flag_da_mcbc: flag to indicate mulicast or broadcast packets * @rx.flag_da_mcbc: flag to indicate mulicast or broadcast packets
* @rx.flag_da_valid: flag to indicate DA is valid for RX packet * @rx.flag_da_valid: flag to indicate DA is valid for RX packet
* @rx.flag_sa_valid: flag to indicate SA is valid for RX packet * @rx.flag_sa_valid: flag to indicate SA is valid for RX packet
@@ -146,12 +146,12 @@ typedef union {
* @rx.trace.packet_track: RX_DATA packet * @rx.trace.packet_track: RX_DATA packet
* @rx.trace.rsrvd: enable packet logging * @rx.trace.rsrvd: enable packet logging
* *
* @rx.ftype: mcast2ucast, TSO, SG, MESH * @rx.vdev_id: vdev_id for RX pkt
* @rx.is_raw_frame: RAW frame * @rx.is_raw_frame: RAW frame
* @rx.fcs_err: FCS error * @rx.fcs_err: FCS error
* @rx.tid_val: tid value * @rx.tid_val: tid value
* @rx.flag_retry: flag to indicate MSDU is retried
* @rx.reserved: reserved * @rx.reserved: reserved
* @rx.ftype: mcast2ucast, TSO, SG, MESH
* *
* @tx.dev.priv_cb_w.fctx: ctx to handle special pkts defined by ftype * @tx.dev.priv_cb_w.fctx: ctx to handle special pkts defined by ftype
* @tx.dev.priv_cb_w.ext_cb_ptr: extended cb pointer * @tx.dev.priv_cb_w.ext_cb_ptr: extended cb pointer
@@ -219,9 +219,11 @@ struct qdf_nbuf_cb {
* Do not change location of this bit. * Do not change location of this bit.
*/ */
uint32_t ipa_owned:1, uint32_t ipa_owned:1,
reserved:15, peer_cached_buf_frm:1,
vdev_id:8, flush_ind:1,
reserved1:8; packet_buf_pool:1,
reserved:12,
reserved1:16;
uint32_t tcp_seq_num; uint32_t tcp_seq_num;
uint32_t tcp_ack_num; uint32_t tcp_ack_num;
union { union {
@@ -237,14 +239,14 @@ struct qdf_nbuf_cb {
} priv_cb_m; } priv_cb_m;
} dev; } dev;
uint32_t lro_eligible:1, uint32_t lro_eligible:1,
peer_cached_buf_frm:1, is_raw_frame:1,
tcp_proto:1, tcp_proto:1,
tcp_pure_ack:1, tcp_pure_ack:1,
ipv6_proto:1, ipv6_proto:1,
ip_offset:7, ip_offset:7,
tcp_offset:7, tcp_offset:7,
rx_ctx_id:4, rx_ctx_id:4,
flush_ind:1, fcs_err:1,
num_elements_in_list:8; num_elements_in_list:8;
uint32_t tcp_udp_chksum:16, uint32_t tcp_udp_chksum:16,
tcp_win:16; tcp_win:16;
@@ -252,7 +254,7 @@ struct qdf_nbuf_cb {
uint8_t flag_chfrag_start:1, uint8_t flag_chfrag_start:1,
flag_chfrag_cont:1, flag_chfrag_cont:1,
flag_chfrag_end:1, flag_chfrag_end:1,
packet_buff_pool:1, flag_retry:1,
flag_da_mcbc:1, flag_da_mcbc:1,
flag_da_valid:1, flag_da_valid:1,
flag_sa_valid:1, flag_sa_valid:1,
@@ -263,12 +265,9 @@ struct qdf_nbuf_cb {
packet_track:4, packet_track:4,
rsrvd:3; rsrvd:3;
} trace; } trace;
uint8_t ftype; uint16_t vdev_id:8,
uint8_t is_raw_frame:1,
fcs_err:1,
tid_val:4, tid_val:4,
flag_retry:1, ftype:4;
reserved:1;
} rx; } rx;
/* Note: MAX: 40 bytes */ /* Note: MAX: 40 bytes */
@@ -347,8 +346,6 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
#define QDF_NBUF_CB_RX_LRO_ELIGIBLE(skb) \ #define QDF_NBUF_CB_RX_LRO_ELIGIBLE(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.lro_eligible) (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.lro_eligible)
#define QDF_NBUF_CB_RX_PEER_CACHED_FRM(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.peer_cached_buf_frm)
#define QDF_NBUF_CB_RX_TCP_PROTO(skb) \ #define QDF_NBUF_CB_RX_TCP_PROTO(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.tcp_proto) (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.tcp_proto)
#define QDF_NBUF_CB_RX_TCP_PURE_ACK(skb) \ #define QDF_NBUF_CB_RX_TCP_PURE_ACK(skb) \
@@ -361,8 +358,6 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.tcp_offset) (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.tcp_offset)
#define QDF_NBUF_CB_RX_CTX_ID(skb) \ #define QDF_NBUF_CB_RX_CTX_ID(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.rx_ctx_id) (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.rx_ctx_id)
#define QDF_NBUF_CB_RX_FLUSH_IND(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.flush_ind)
#define QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST(skb) \ #define QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.num_elements_in_list) (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.num_elements_in_list)
@@ -382,6 +377,9 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
#define QDF_NBUF_CB_RX_FTYPE(skb) \ #define QDF_NBUF_CB_RX_FTYPE(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.ftype) (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.ftype)
#define QDF_NBUF_CB_RX_VDEV_ID(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.vdev_id)
#define QDF_NBUF_CB_RX_CHFRAG_START(skb) \ #define QDF_NBUF_CB_RX_CHFRAG_START(skb) \
(((struct qdf_nbuf_cb *) \ (((struct qdf_nbuf_cb *) \
((skb)->cb))->u.rx.flag_chfrag_start) ((skb)->cb))->u.rx.flag_chfrag_start)
@@ -391,9 +389,6 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
#define QDF_NBUF_CB_RX_CHFRAG_END(skb) \ #define QDF_NBUF_CB_RX_CHFRAG_END(skb) \
(((struct qdf_nbuf_cb *) \ (((struct qdf_nbuf_cb *) \
((skb)->cb))->u.rx.flag_chfrag_end) ((skb)->cb))->u.rx.flag_chfrag_end)
#define QDF_NBUF_CB_RX_PACKET_BUFF_POOL(skb) \
(((struct qdf_nbuf_cb *) \
((skb)->cb))->u.rx.packet_buff_pool)
#define QDF_NBUF_CB_RX_DA_MCBC(skb) \ #define QDF_NBUF_CB_RX_DA_MCBC(skb) \
(((struct qdf_nbuf_cb *) \ (((struct qdf_nbuf_cb *) \

View File

@@ -34,9 +34,6 @@
#define QDF_NBUF_CB_RX_LRO_CTX(skb) \ #define QDF_NBUF_CB_RX_LRO_CTX(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.lro_ctx) (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.lro_ctx)
#define QDF_NBUF_CB_RX_VDEV_ID(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.vdev_id)
#define QDF_NBUF_CB_TX_IPA_OWNED(skb) \ #define QDF_NBUF_CB_TX_IPA_OWNED(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_m.ipa.owned) (((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_m.ipa.owned)
#define QDF_NBUF_CB_TX_IPA_PRIV(skb) \ #define QDF_NBUF_CB_TX_IPA_PRIV(skb) \
@@ -61,6 +58,17 @@
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.dp. \ (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.dp. \
wifi2.map_index) wifi2.map_index)
#define QDF_NBUF_CB_RX_PEER_CACHED_FRM(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
peer_cached_buf_frm)
#define QDF_NBUF_CB_RX_FLUSH_IND(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.flush_ind)
#define QDF_NBUF_CB_RX_PACKET_BUFF_POOL(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
packet_buf_pool)
#define __qdf_nbuf_ipa_owned_get(skb) \ #define __qdf_nbuf_ipa_owned_get(skb) \
QDF_NBUF_CB_TX_IPA_OWNED(skb) QDF_NBUF_CB_TX_IPA_OWNED(skb)