iwlwifi: pcie: gen2: build A-MSDU only for GSO
authorJohannes Berg <johannes.berg@intel.com>
Fri, 1 Jun 2018 07:45:55 +0000 (09:45 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Nov 2019 17:47:47 +0000 (18:47 +0100)
[ Upstream commit 53f474e6a8d74d5dc0c3a015d889471f9a157685 ]

If the incoming frame should be an A-MSDU, it may already be one,
for example in the case of NAN multicast being encapsulated in an
A-MSDU. Thus, use the GSO algorithm to build A-MSDU only if the
skb actually contains GSO data.

Fixes: 6ffe5de35b05 ("iwlwifi: pcie: add AMSDU to gen2")
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c

index b99f33f..61ffa1d 100644 (file)
@@ -526,7 +526,12 @@ struct iwl_tfh_tfd *iwl_pcie_gen2_build_tfd(struct iwl_trans *trans,
 
        hdr_len = ieee80211_hdrlen(hdr->frame_control);
 
-       if (amsdu)
+       /*
+        * Only build A-MSDUs here if doing so by GSO, otherwise it may be
+        * an A-MSDU for other reasons, e.g. NAN or an A-MSDU having been
+        * built in the higher layers already.
+        */
+       if (amsdu && skb_shinfo(skb)->gso_size)
                return iwl_pcie_gen2_build_tx_amsdu(trans, txq, dev_cmd, skb,
                                                    out_meta, hdr_len, len);