diff mbox series

[6.1,1/2] wifi: mt76: fix receiving LLC packets on mt7615/mt7915

Message ID 20221005130824.23371-1-nbd@nbd.name (mailing list archive)
State Accepted
Commit 47c44088ac089adfa2f852770ac11e3b7ce8d7c5
Delegated to: Kalle Valo
Headers show
Series [6.1,1/2] wifi: mt76: fix receiving LLC packets on mt7615/mt7915 | expand

Commit Message

Felix Fietkau Oct. 5, 2022, 1:08 p.m. UTC
When 802.3 decap offload is enabled, the hardware indicates header translation
failure, whenever either the LLC-SNAP header was not found, or a VLAN header
with an unregcognized tag is present.
In that case, the hardware inserts a 2-byte length fields after the MAC
addresses. For VLAN packets, this tag needs to be removed. However,
for 802.3 LLC packets, the length bytes should be preserved, since there
is no separate ethertype field in the data.
This fixes an issue where the length field was omitted for LLC frames, causing
them to be malformed after hardware decap.

Fixes: 1eeff0b4c1a6 ("mt76: mt7915: fix decap offload corner case with 4-addr VLAN frames")
Reported-by: Chad Monroe <chad.monroe@smartrg.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
 drivers/net/wireless/mediatek/mt76/mt7615/mac.c | 8 ++++----
 drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 8 ++++----
 2 files changed, 8 insertions(+), 8 deletions(-)

Comments

Kalle Valo Oct. 11, 2022, 8:42 a.m. UTC | #1
Felix Fietkau <nbd@nbd.name> wrote:

> When 802.3 decap offload is enabled, the hardware indicates header translation
> failure, whenever either the LLC-SNAP header was not found, or a VLAN header
> with an unregcognized tag is present.
> In that case, the hardware inserts a 2-byte length fields after the MAC
> addresses. For VLAN packets, this tag needs to be removed. However,
> for 802.3 LLC packets, the length bytes should be preserved, since there
> is no separate ethertype field in the data.
> This fixes an issue where the length field was omitted for LLC frames, causing
> them to be malformed after hardware decap.
> 
> Fixes: 1eeff0b4c1a6 ("mt76: mt7915: fix decap offload corner case with 4-addr VLAN frames")
> Reported-by: Chad Monroe <chad.monroe@smartrg.com>
> Signed-off-by: Felix Fietkau <nbd@nbd.name>

2 patches applied to wireless.git, thanks.

47c44088ac08 wifi: mt76: fix receiving LLC packets on mt7615/mt7915
443dc85ad13e wifi: mt76: fix rx checksum offload on mt7615/mt7915/mt7921
diff mbox series

Patch

diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mac.c b/drivers/net/wireless/mediatek/mt76/mt7615/mac.c
index d6aae60c440d..cbc6859e38ac 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/mac.c
@@ -610,14 +610,14 @@  static int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb)
 			 * When header translation failure is indicated,
 			 * the hardware will insert an extra 2-byte field
 			 * containing the data length after the protocol
-			 * type field.
+			 * type field. This happens either when the LLC-SNAP
+			 * pattern did not match, or if a VLAN header was
+			 * detected.
 			 */
 			pad_start = 12;
 			if (get_unaligned_be16(skb->data + pad_start) == ETH_P_8021Q)
 				pad_start += 4;
-
-			if (get_unaligned_be16(skb->data + pad_start) !=
-			    skb->len - pad_start - 2)
+			else
 				pad_start = 0;
 		}
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 1070838e7e16..ec996a587142 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -446,14 +446,14 @@  mt7915_mac_fill_rx(struct mt7915_dev *dev, struct sk_buff *skb)
 			 * When header translation failure is indicated,
 			 * the hardware will insert an extra 2-byte field
 			 * containing the data length after the protocol
-			 * type field.
+			 * type field. This happens either when the LLC-SNAP
+			 * pattern did not match, or if a VLAN header was
+			 * detected.
 			 */
 			pad_start = 12;
 			if (get_unaligned_be16(skb->data + pad_start) == ETH_P_8021Q)
 				pad_start += 4;
-
-			if (get_unaligned_be16(skb->data + pad_start) !=
-			    skb->len - pad_start - 2)
+			else
 				pad_start = 0;
 		}