qcacld-3.0: Add filter for data packets in packet capture mode

Deliver data packets to monitor interface only if
corresponding filter is set by vendor command.

Change-Id: Ibf24349d17d1e649819447b1cde36a834e5579a4
CRs-Fixed: 3046233
This commit is contained in:
Vulupala Shashank Reddy
2021-09-08 16:29:00 +05:30
committed by Madan Koyyalamudi
parent 26da9327ad
commit b1e8b3f39e

View File

@@ -251,32 +251,13 @@ pkt_capture_process_ppdu_stats(void *log_data)
qdf_spin_unlock(&vdev_priv->lock_q); qdf_spin_unlock(&vdev_priv->lock_q);
} }
void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data, static void
u_int16_t peer_id, uint32_t status) pkt_capture_process_tx_data(void *soc, void *log_data, u_int16_t vdev_id,
uint32_t status)
{ {
uint8_t bssid[QDF_MAC_ADDR_SIZE];
uint8_t tid = 0;
struct dp_soc *psoc = soc; struct dp_soc *psoc = soc;
struct wlan_objmgr_vdev *vdev; uint8_t tid = 0;
struct pkt_capture_vdev_priv *vdev_priv; uint8_t bssid[QDF_MAC_ADDR_SIZE];
struct pkt_capture_frame_filter *frame_filter;
uint16_t vdev_id = 0;
vdev = pkt_capture_get_vdev();
if (!vdev)
return;
vdev_priv = pkt_capture_vdev_get_priv(vdev);
if (!vdev_priv) {
pkt_capture_err("vdev priv is NULL");
return;
}
frame_filter = &vdev_priv->frame_filter;
switch (event) {
case WDI_EVENT_PKT_CAPTURE_TX_DATA:
{
struct pkt_capture_tx_hdr_elem_t *ptr_pktcapture_hdr; struct pkt_capture_tx_hdr_elem_t *ptr_pktcapture_hdr;
struct pkt_capture_tx_hdr_elem_t pktcapture_hdr = {0}; struct pkt_capture_tx_hdr_elem_t pktcapture_hdr = {0};
struct hal_tx_completion_status tx_comp_status = {0}; struct hal_tx_completion_status tx_comp_status = {0};
@@ -291,9 +272,6 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data,
hal_tx_comp_get_status(&desc->comp, &tx_comp_status, hal_tx_comp_get_status(&desc->comp, &tx_comp_status,
psoc->hal_soc); psoc->hal_soc);
if (!frame_filter->data_tx_frame_filter)
return;
if (tx_comp_status.valid) if (tx_comp_status.valid)
pktcapture_hdr.ppdu_id = tx_comp_status.ppdu_id; pktcapture_hdr.ppdu_id = tx_comp_status.ppdu_id;
pktcapture_hdr.timestamp = tx_comp_status.tsf; pktcapture_hdr.timestamp = tx_comp_status.tsf;
@@ -406,6 +384,128 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data,
vdev_id, netbuf, TXRX_PROCESS_TYPE_DATA_TX_COMPL, vdev_id, netbuf, TXRX_PROCESS_TYPE_DATA_TX_COMPL,
tid, status, TXRX_PKTCAPTURE_PKT_FORMAT_8023, tid, status, TXRX_PKTCAPTURE_PKT_FORMAT_8023,
bssid, NULL, pktcapture_hdr.tx_retry_cnt); bssid, NULL, pktcapture_hdr.tx_retry_cnt);
}
/**
* pkt_capture_is_frame_filter_set() - Check frame filter is set
* @nbuf: buffer address
* @frame_filter: frame filter address
* @direction: frame direction
*
* Return: true, if filter bit is set
* false, if filter bit is not set
*/
static bool
pkt_capture_is_frame_filter_set(qdf_nbuf_t buf,
struct pkt_capture_frame_filter *frame_filter,
bool direction)
{
enum pkt_capture_data_frame_type data_frame_type =
PKT_CAPTURE_DATA_FRAME_TYPE_ALL;
if (qdf_nbuf_is_ipv4_arp_pkt(buf)) {
data_frame_type = PKT_CAPTURE_DATA_FRAME_TYPE_ARP;
} else if (qdf_nbuf_is_ipv4_eapol_pkt(buf)) {
data_frame_type = PKT_CAPTURE_DATA_FRAME_TYPE_EAPOL;
} else if (qdf_nbuf_data_is_tcp_syn(buf)) {
data_frame_type =
PKT_CAPTURE_DATA_FRAME_TYPE_TCP_SYN;
} else if (qdf_nbuf_data_is_tcp_syn_ack(buf)) {
data_frame_type =
PKT_CAPTURE_DATA_FRAME_TYPE_TCP_SYNACK;
} else if (qdf_nbuf_data_is_tcp_syn(buf)) {
data_frame_type =
PKT_CAPTURE_DATA_FRAME_TYPE_TCP_FIN;
} else if (qdf_nbuf_data_is_tcp_syn_ack(buf)) {
data_frame_type =
PKT_CAPTURE_DATA_FRAME_TYPE_TCP_FINACK;
} else if (qdf_nbuf_data_is_tcp_ack(buf)) {
data_frame_type =
PKT_CAPTURE_DATA_FRAME_TYPE_TCP_ACK;
} else if (qdf_nbuf_data_is_tcp_rst(buf)) {
data_frame_type =
PKT_CAPTURE_DATA_FRAME_TYPE_TCP_RST;
} else if (qdf_nbuf_is_ipv4_pkt(buf)) {
if (qdf_nbuf_is_ipv4_dhcp_pkt(buf))
data_frame_type =
PKT_CAPTURE_DATA_FRAME_TYPE_DHCPV4;
else if (qdf_nbuf_is_icmp_pkt(buf))
data_frame_type =
PKT_CAPTURE_DATA_FRAME_TYPE_ICMPV4;
else if (qdf_nbuf_data_is_dns_query(buf))
data_frame_type =
PKT_CAPTURE_DATA_FRAME_TYPE_DNSV4;
else if (qdf_nbuf_data_is_dns_response(buf))
data_frame_type =
PKT_CAPTURE_DATA_FRAME_TYPE_DNSV4;
} else if (qdf_nbuf_is_ipv6_pkt(buf)) {
if (qdf_nbuf_is_ipv6_dhcp_pkt(buf))
data_frame_type =
PKT_CAPTURE_DATA_FRAME_TYPE_DHCPV6;
else if (qdf_nbuf_is_icmpv6_pkt(buf))
data_frame_type =
PKT_CAPTURE_DATA_FRAME_TYPE_ICMPV6;
/* need to add code for
* PKT_CAPTURE_DATA_FRAME_TYPE_DNSV6
*/
}
/* Add code for
* PKT_CAPTURE_DATA_FRAME_TYPE_RTP
* PKT_CAPTURE_DATA_FRAME_TYPE_SIP
* PKT_CAPTURE_DATA_FRAME_QOS_NULL
*/
if (direction == IEEE80211_FC1_DIR_TODS) {
if (data_frame_type & frame_filter->data_tx_frame_filter)
return true;
else
return false;
} else {
if (data_frame_type & frame_filter->data_rx_frame_filter)
return true;
else
return false;
}
}
void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data,
u_int16_t peer_id, uint32_t status)
{
uint8_t bssid[QDF_MAC_ADDR_SIZE];
struct wlan_objmgr_vdev *vdev;
struct pkt_capture_vdev_priv *vdev_priv;
struct pkt_capture_frame_filter *frame_filter;
uint16_t vdev_id = 0;
vdev = pkt_capture_get_vdev();
if (!vdev)
return;
vdev_priv = pkt_capture_vdev_get_priv(vdev);
if (!vdev_priv) {
pkt_capture_err("vdev priv is NULL");
return;
}
frame_filter = &vdev_priv->frame_filter;
switch (event) {
case WDI_EVENT_PKT_CAPTURE_TX_DATA:
{
struct dp_tx_desc_s *desc = log_data;
if (!frame_filter->data_tx_frame_filter)
return;
if (frame_filter->data_tx_frame_filter &
PKT_CAPTURE_DATA_FRAME_TYPE_ALL) {
pkt_capture_process_tx_data(soc, log_data,
vdev_id, status);
} else if (pkt_capture_is_frame_filter_set(
desc->nbuf, frame_filter, IEEE80211_FC1_DIR_TODS)) {
pkt_capture_process_tx_data(soc, log_data,
vdev_id, status);
}
break; break;
} }
@@ -424,8 +524,19 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data,
return; return;
} }
pkt_capture_msdu_process_pkts(bssid, log_data, vdev_id, soc, if (frame_filter->data_rx_frame_filter &
status); PKT_CAPTURE_DATA_FRAME_TYPE_ALL) {
pkt_capture_msdu_process_pkts(bssid, log_data,
vdev_id, soc, status);
} else if (pkt_capture_is_frame_filter_set(
nbuf, frame_filter, IEEE80211_FC1_DIR_FROMDS)) {
pkt_capture_msdu_process_pkts(bssid, log_data,
vdev_id, soc, status);
} else {
if (status == RX_OFFLOAD_PKT)
qdf_nbuf_free(nbuf);
}
break; break;
} }
@@ -443,8 +554,19 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data,
return; return;
} }
pkt_capture_process_rx_data_no_peer(soc, vdev_id, bssid, status, if (frame_filter->data_rx_frame_filter &
nbuf); PKT_CAPTURE_DATA_FRAME_TYPE_ALL) {
pkt_capture_process_rx_data_no_peer(soc, vdev_id, bssid,
status, nbuf);
} else if (pkt_capture_is_frame_filter_set(
nbuf, frame_filter, IEEE80211_FC1_DIR_FROMDS)) {
pkt_capture_process_rx_data_no_peer(soc, vdev_id, bssid,
status, nbuf);
} else {
if (status == RX_OFFLOAD_PKT)
qdf_nbuf_free(nbuf);
}
break; break;
} }
@@ -453,6 +575,8 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data,
struct htt_tx_offload_deliver_ind_hdr_t *offload_deliver_msg; struct htt_tx_offload_deliver_ind_hdr_t *offload_deliver_msg;
bool is_pkt_during_roam = false; bool is_pkt_during_roam = false;
uint32_t freq = 0; uint32_t freq = 0;
qdf_nbuf_t buf = log_data +
sizeof(struct htt_tx_offload_deliver_ind_hdr_t);
if (!frame_filter->data_tx_frame_filter) if (!frame_filter->data_tx_frame_filter)
return; return;
@@ -470,9 +594,17 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data,
vdev_id = offload_deliver_msg->vdev_id; vdev_id = offload_deliver_msg->vdev_id;
} }
if (frame_filter->data_tx_frame_filter &
PKT_CAPTURE_DATA_FRAME_TYPE_ALL) {
pkt_capture_offload_deliver_indication_handler( pkt_capture_offload_deliver_indication_handler(
log_data, log_data,
vdev_id, bssid, soc); vdev_id, bssid, soc);
} else if (pkt_capture_is_frame_filter_set(
buf, frame_filter, IEEE80211_FC1_DIR_TODS)) {
pkt_capture_offload_deliver_indication_handler(
log_data,
vdev_id, bssid, soc);
}
break; break;
} }