realtek: correct l2 offloading tag handling

Makes sure the DSA trailer information on any L2 offloading done
by the switch is honoured by the bridge layer

Signed-off-by: Birger Koblitz <git@birger-koblitz.de>
This commit is contained in:
Birger Koblitz 2021-01-21 14:32:44 +01:00 committed by Petr Štetiar
parent dc9cc0d3e2
commit 56ac4fced0

View File

@ -9,21 +9,24 @@
+ trailer[1] = dp->index; + trailer[1] = dp->index;
+#else +#else
trailer[1] = 1 << dp->index; trailer[1] = 1 << dp->index;
+#endif /* CONFIG_NET_DSA_RTL83XX */ +#endif /* CONFIG_NET_DSA_RTL838X */
trailer[2] = 0x10; trailer[2] = 0x10;
trailer[3] = 0x00; trailer[3] = 0x00;
@@ -61,12 +66,20 @@ static struct sk_buff *trailer_rcv(struc @@ -61,12 +69,23 @@ static struct sk_buff *trailer_rcv(struc
return NULL; return NULL;
trailer = skb_tail_pointer(skb) - 4; trailer = skb_tail_pointer(skb) - 4;
+ +
+#ifdef CONFIG_NET_DSA_RTL83XX +#ifdef CONFIG_NET_DSA_RTL83XX
+ if (trailer[0] != 0x80 || (trailer[1] & 0xe0) != 0x00 || + if (trailer[0] != 0x80 || (trailer[1] & 0x80) != 0x00 ||
+ (trailer[2] & 0xef) != 0x00 || trailer[3] != 0x00) + (trailer[2] & 0xef) != 0x00 || trailer[3] != 0x00)
+ return NULL; + return NULL;
+ +
+ source_port = trailer[1] & 0x1f; + if (trailer[1] & 0x40)
+ skb->offload_fwd_mark = 1;
+
+ source_port = trailer[1] & 0x3f;
+#else +#else
if (trailer[0] != 0x80 || (trailer[1] & 0xf8) != 0x00 || if (trailer[0] != 0x80 || (trailer[1] & 0xf8) != 0x00 ||
(trailer[2] & 0xef) != 0x00 || trailer[3] != 0x00) (trailer[2] & 0xef) != 0x00 || trailer[3] != 0x00)