summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYun Park <yunp@qca.qualcomm.com>2016-05-05 15:59:10 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-05-10 05:27:37 -0700
commita06be174279673e4836ab8ee1d0f5e12209a3d48 (patch)
tree3f9a5d72d9a4910789f4032155a702308c9fd566
parent67101f981beaff904bc42a1ce270af07eb226bfe (diff)
qcacld-2.0: Skip Rx packet aggregation logic for ICMP packets
Rx packet aggregation logic causes ping RTT regression. Fix this by filtering ICMP packets to exclude them for Rx packet aggregation. Change-Id: I61367d8843fb4f913df11e210c68feea93baec8b CRs-Fixed: 978742
-rw-r--r--CORE/HDD/src/wlan_hdd_ipa.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/CORE/HDD/src/wlan_hdd_ipa.c b/CORE/HDD/src/wlan_hdd_ipa.c
index bace00000884..e85dbe551c1c 100644
--- a/CORE/HDD/src/wlan_hdd_ipa.c
+++ b/CORE/HDD/src/wlan_hdd_ipa.c
@@ -2754,8 +2754,8 @@ static void hdd_ipa_destory_rm_resource(struct hdd_ipa_priv *hdd_ipa)
static void hdd_ipa_send_skb_to_network(adf_nbuf_t skb, hdd_adapter_t *adapter)
{
int result;
-
#ifndef QCA_CONFIG_SMP
+ struct iphdr* ip_h;
static atomic_t softirq_mitigation_cntr =
ATOMIC_INIT(IPA_WLAN_RX_SOFTIRQ_THRESH);
#endif
@@ -2787,15 +2787,21 @@ static void hdd_ipa_send_skb_to_network(adf_nbuf_t skb, hdd_adapter_t *adapter)
#ifdef QCA_CONFIG_SMP
result = netif_rx_ni(skb);
#else
- /* Call netif_rx_ni for every IPA_WLAN_RX_SOFTIRQ_THRESH packets to
- * avoid excessive softirq's.
- */
- if (atomic_dec_and_test(&softirq_mitigation_cntr)) {
+ ip_h = (struct iphdr*)((uint8_t*)skb->data);
+ if ((skb->protocol == htons(ETH_P_IP)) &&
+ (ip_h->protocol == IPPROTO_ICMP)) {
result = netif_rx_ni(skb);
- atomic_set(&softirq_mitigation_cntr,
- IPA_WLAN_RX_SOFTIRQ_THRESH);
} else {
- result = netif_rx(skb);
+ /* Call netif_rx_ni for every IPA_WLAN_RX_SOFTIRQ_THRESH packets
+ * to avoid excessive softirq's.
+ */
+ if (atomic_dec_and_test(&softirq_mitigation_cntr)){
+ result = netif_rx_ni(skb);
+ atomic_set(&softirq_mitigation_cntr,
+ IPA_WLAN_RX_SOFTIRQ_THRESH);
+ } else {
+ result = netif_rx(skb);
+ }
}
#endif
if (result == NET_RX_SUCCESS)