From 2e9ca6310e76847bdd648f8210065f58ddaa6572 Mon Sep 17 00:00:00 2001 From: Janusz Dziedzic Date: Fri, 11 Jul 2014 11:00:00 +0200 Subject: [PATCH] ath10k: skip frames with tcp/ip checksum Seems FW don't report FCS errors correctly. As a workaround check tpc/ip checksum also and remove frames with wrong CRC. Signed-off-by: Janusz Dziedzic --- drivers/net/wireless/ath/ath10k/htt_rx.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c index 9dec96f..0cb5b44 100644 --- a/drivers/net/wireless/ath/ath10k/htt_rx.c +++ b/drivers/net/wireless/ath/ath10k/htt_rx.c @@ -882,6 +882,7 @@ static void ath10k_htt_rx_amsdu(struct ath10k_htt *htt, unsigned int hdr_len; struct amsdu_subframe_hdr subframe_hdr; struct ieee80211_rx_status *status; + int ip_summed; rxd = (void *)skb->data - sizeof(*rxd); enctype = MS(__le32_to_cpu(rxd->mpdu_start.info0), @@ -902,7 +903,13 @@ static void ath10k_htt_rx_amsdu(struct ath10k_htt *htt, RX_MSDU_START_INFO1_DECAP_FORMAT); decap_hdr = (void *)rxd->rx_hdr_status; - skb->ip_summed = ath10k_htt_rx_get_csum_state(skb); + ip_summed = ath10k_htt_rx_get_csum_state(skb); + if (ip_summed == -1) { + ath10k_htt_rx_free_msdu_chain(first); + return; + } + + skb->ip_summed = ip_summed; /* First frame in an A-MSDU chain has more decapped data. */ if (skb == first) { @@ -998,6 +1005,7 @@ static void ath10k_htt_rx_msdu(struct ath10k_htt *htt, enum htt_rx_mpdu_encrypt_type enctype; int hdr_len; void *rfc1042; + int ip_summed; /* This shouldn't happen. If it does than it may be a FW bug. */ if (skb->next) { @@ -1014,7 +1022,13 @@ static void ath10k_htt_rx_msdu(struct ath10k_htt *htt, hdr = (struct ieee80211_hdr *)rxd->rx_hdr_status; hdr_len = ieee80211_hdrlen(hdr->frame_control); - skb->ip_summed = ath10k_htt_rx_get_csum_state(skb); + ip_summed = ath10k_htt_rx_get_csum_state(skb); + if (ip_summed == -1) { + ath10k_htt_rx_free_msdu_chain(skb); + return; + } + + skb->ip_summed = ip_summed; switch (fmt) { case RX_MSDU_DECAP_RAW: @@ -1083,9 +1097,9 @@ static int ath10k_htt_rx_get_csum_state(struct sk_buff *skb) if (!is_tcp && !is_udp) return CHECKSUM_NONE; if (!ip_csum_ok) - return CHECKSUM_NONE; + return -1; if (!tcpudp_csum_ok) - return CHECKSUM_NONE; + return -1; return CHECKSUM_UNNECESSARY; } -- 1.7.9.5