|
@@ -986,6 +986,7 @@ static void __hdd_hard_start_xmit(struct sk_buff *skb,
|
|
|
if (qdf_nbuf_data_is_arp_req(skb) &&
|
|
|
(adapter->track_arp_ip == qdf_nbuf_get_arp_tgt_ip(skb))) {
|
|
|
is_arp = true;
|
|
|
+ QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_NOTIFY_COMP(skb) = 1;
|
|
|
++adapter->hdd_stats.hdd_arp_stats.tx_arp_req_count;
|
|
|
QDF_TRACE(QDF_MODULE_ID_HDD_DATA,
|
|
|
QDF_TRACE_LEVEL_INFO_HIGH,
|
|
@@ -996,9 +997,11 @@ static void __hdd_hard_start_xmit(struct sk_buff *skb,
|
|
|
subtype = qdf_nbuf_get_eapol_subtype(skb);
|
|
|
if (subtype == QDF_PROTO_EAPOL_M2) {
|
|
|
++adapter->hdd_stats.hdd_eapol_stats.eapol_m2_count;
|
|
|
+ QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_NOTIFY_COMP(skb) = 1;
|
|
|
is_eapol = true;
|
|
|
} else if (subtype == QDF_PROTO_EAPOL_M4) {
|
|
|
++adapter->hdd_stats.hdd_eapol_stats.eapol_m4_count;
|
|
|
+ QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_NOTIFY_COMP(skb) = 1;
|
|
|
is_eapol = true;
|
|
|
}
|
|
|
} else if (QDF_NBUF_CB_GET_PACKET_TYPE(skb) ==
|
|
@@ -1006,9 +1009,11 @@ static void __hdd_hard_start_xmit(struct sk_buff *skb,
|
|
|
subtype = qdf_nbuf_get_dhcp_subtype(skb);
|
|
|
if (subtype == QDF_PROTO_DHCP_DISCOVER) {
|
|
|
++adapter->hdd_stats.hdd_dhcp_stats.dhcp_dis_count;
|
|
|
+ QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_NOTIFY_COMP(skb) = 1;
|
|
|
is_dhcp = true;
|
|
|
} else if (subtype == QDF_PROTO_DHCP_REQUEST) {
|
|
|
++adapter->hdd_stats.hdd_dhcp_stats.dhcp_req_count;
|
|
|
+ QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_NOTIFY_COMP(skb) = 1;
|
|
|
is_dhcp = true;
|
|
|
}
|
|
|
}
|
|
@@ -3369,3 +3374,39 @@ bool wlan_hdd_rx_rpm_mark_last_busy(struct hdd_context *hdd_ctx,
|
|
|
else
|
|
|
return false;
|
|
|
}
|
|
|
+
|
|
|
+void hdd_sta_notify_tx_comp_cb(qdf_nbuf_t skb, void *ctx, uint16_t flag)
|
|
|
+{
|
|
|
+ struct hdd_adapter *adapter = ctx;
|
|
|
+ enum qdf_proto_subtype subtype;
|
|
|
+
|
|
|
+ if (hdd_validate_adapter(adapter))
|
|
|
+ return;
|
|
|
+
|
|
|
+ switch (QDF_NBUF_CB_GET_PACKET_TYPE(skb)) {
|
|
|
+ case QDF_NBUF_CB_PACKET_TYPE_ARP:
|
|
|
+ if (flag & BIT(QDF_TX_RX_STATUS_DOWNLOAD_SUCC))
|
|
|
+ ++adapter->hdd_stats.hdd_arp_stats.
|
|
|
+ tx_host_fw_sent;
|
|
|
+ if (flag & BIT(QDF_TX_RX_STATUS_OK))
|
|
|
+ ++adapter->hdd_stats.hdd_arp_stats.tx_ack_cnt;
|
|
|
+ break;
|
|
|
+ case QDF_NBUF_CB_PACKET_TYPE_EAPOL:
|
|
|
+ subtype = qdf_nbuf_get_eapol_subtype(skb);
|
|
|
+ if (!(flag & BIT(QDF_TX_RX_STATUS_OK)) &&
|
|
|
+ subtype != QDF_PROTO_INVALID)
|
|
|
+ ++adapter->hdd_stats.hdd_eapol_stats.
|
|
|
+ tx_noack_cnt[subtype - QDF_PROTO_EAPOL_M1];
|
|
|
+ break;
|
|
|
+ case QDF_NBUF_CB_PACKET_TYPE_DHCP:
|
|
|
+ subtype = qdf_nbuf_get_dhcp_subtype(skb);
|
|
|
+ if (!(flag & BIT(QDF_TX_RX_STATUS_OK)) &&
|
|
|
+ subtype != QDF_PROTO_INVALID &&
|
|
|
+ subtype <= QDF_PROTO_DHCP_ACK)
|
|
|
+ ++adapter->hdd_stats.hdd_dhcp_stats.
|
|
|
+ tx_noack_cnt[subtype - QDF_PROTO_DHCP_DISCOVER];
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|