Netdev Archive on lore.kernel.org
help / color / mirror / Atom feed
From: Florian Fainelli <f.fainelli@gmail.com>
To: Luiz Angelo Daros de Luca <luizluca@gmail.com>,
	Frank Wunderlich <frank-w@public-files.de>
Cc: "Alvin Šipraga" <ALSI@bang-olufsen.dk>,
	"netdev@vger.kernel.org" <netdev@vger.kernel.org>,
	"linus.walleij@linaro.org" <linus.walleij@linaro.org>,
	"andrew@lunn.ch" <andrew@lunn.ch>,
	"vivien.didelot@gmail.com" <vivien.didelot@gmail.com>,
	"olteanv@gmail.com" <olteanv@gmail.com>,
	"arinc.unal@arinc9.com" <arinc.unal@arinc9.com>
Subject: Re: [PATCH net-next v4 11/11] net: dsa: realtek: rtl8365mb: multiple cpu ports, non cpu extint
Date: Sun, 30 Jan 2022 09:24:23 -0800	[thread overview]
Message-ID: <5355fa92-cf8c-4fa5-5157-9b6574f1c876@gmail.com> (raw)
In-Reply-To: <CAJq09z4tpxjog2XusyFvvTcr+S6XX24r_QBLW9Sov1L1Tebb5A@mail.gmail.com>



On 1/29/2022 8:42 PM, Luiz Angelo Daros de Luca wrote:
>>> I suggested it might be checksum problem because I'm also affected. In
>>> my case, I have an mt7620a SoC connected to the rtl8367s switch. The
>>> OS offloads checksum to HW but the mt7620a cannot calculate the
>>> checksum with the (EtherType) Realtek CPU Tag in place. I'll try to
>>> move the CPU tag to test if the mt7620a will then digest the frame
>>> correctly.
>>
>> I implemented a new DSA tag (rtl8_4t, with "t" as in trailing) that
>> puts the DSA tag before the Ethernet CRC (the switch supports both).
>> With no tag in the mac layer, mediatek correctly calculated the ip
>> checksum. However, mediatek SoC included the extra bytes from the DSA
>> tag in the TCP checksum, even if they are after the ip length.
>>
>> This is the packet leaving the OS:
>>
>> 0000   04 0e 3c fc 4f aa 50 d4 f7 33 15 8a 08 00 45 10
>> 0010   00 3c 00 00 40 00 40 06 b7 58 c0 a8 01 01 c0 a8
>> 0020   01 02 00 16 a1 50 80 da 39 e9 b2 2a 23 cf a0 12
>> 0030   fe 88 83 82 00 00 02 04 05 b4 04 02 08 0a 01 64
>> 0040   fb 28 66 42 e0 79 01 03 03 03 88 99 04 00 00 20
>> 0050   00 08
>>
>> TCP checksum is at 0x0032 with 0x8382 is the tcp checksum
>> DSA Tag is at 0x4a with 8899040000200008
>>
>> This is what arrived at the other end:
>>
>> 0000   04 0e 3c fc 4f aa 50 d4 f7 33 15 8a 08 00 45 10
>> 0010   00 3c 00 00 40 00 40 06 b7 58 c0 a8 01 01 c0 a8
>> 0020   01 02 00 16 a1 50 80 da 39 e9 b2 2a 23 cf a0 12
>> 0030   fe 88 c3 e8 00 00 02 04 05 b4 04 02 08 0a 01 64
>> 0040   fb 28 66 42 e0 79 01 03 03 03
>>
>> TCP checksum is 0xc3e8, but the correct one should be 0x50aa
>> If you calculate tcp checksum including 8899040000200008, you'll get exactly
>> 0xc3e8 (I did the math).
>>
>> So, If we use a trailing DSA tag, we can leave the IP checksum offloading on
>> and just turn off the TCP checksum offload. Is it worth it?
> 
> No, IP checksum is always done in SW.
> 
>> Is it still interesting to have the rtl8_4t merged?
> 
> Maybe it is. It has uncovered a problem. The case of trailing tags
> seems to be unsolvable even with csum_start. AFAIK, the driver must
> cksum from "skb->csum_start up to the end". When the switch is using
> an incompatible tag, we have:
> 
> slave(): my features copied from master tells me I can offload
> checksum. Do nothing
> tagger(): add tag to the end of skb
> master(): Offloading HW, chksum from csum_start until the end,
> including the added tag
> switch(): remove the tag, forward to the network
> remove_client(): I got a packet with a broken checksum.

This is unfortunately expected here, because you program the hardware 
with the full Ethernet frame length which does include the trailer tag, 
and it then uses that length to calculate the transport header checksum 
over the enter payload, thinking the trailer tag is the UDP/TCP payload.

The checksum is calculated "on the fly" as part of the DMA operation to 
send the packet on the wire, so you cannot decouple the checksum 
calculation from the DMA operation, other than by not asking the HW *not 
to* checksum the packet, and instead having software provide that.

Now looking at the datasheet you quoted, there is this:

241. FE_GLO_CFG: Frame Engine Global Configuration (offset: 0x0000)

7:4 RW L2_SPACE L2 Space
(unit: 8 bytes)
0xB

Can you play with this and see if you can account for the extra 4 bytes 
added by the Realtek tag?

> 
> ndo_features_check() will not help because, either in HW or SW, it is
> expected to calculate the checksum up to the end. However, there is no
> csum_end or csum_len. I don't know if HW offloading will support some
> kind of csum_end but it would not be a problem in SW (considering
> skb_checksum_help() is adapted to something like skb_checksum_trimmed
> without the clone).
> 
> That amount of bytes to ignore at the end is a complex question: the
> driver either needs some hint (like it happens with skb->csum_offset)
> to know where transport payload ends or the taggers (or the dsa) must
> save the amount of extra bytes (or which tags were added) in the
> sbk_buff. With that info, the driver can check if HW will work with a
> different csum_start / csum_end or if only a supported tag is in use.
> 
> In my case, using an incompatible tailing tag, I just made it work
> hacking dsa and forcing slave interfaces to disable offloading. This
> way, checksum is calculated before any tag is added and offloading is
> skipped. But it is not a real solution.

Not sure which one is not a "real solution", but for this specific 
combination of DSA conduit driver and switch tag, you have to disable 
checksum offload in the conduit driver and provide it in software. The 
other way would be to configure the realtek switch to work with 
DSA_TAG_8021Q and see if you can continue to offload the data path since 
tagging would use regular 802.1Q vlans, but that means you are going to 
lose a whole lot of management functionality offered by the native 
Realtek tag.
-- 
Florian

  reply	other threads:[~2022-01-30 17:24 UTC|newest]

Thread overview: 88+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-05  3:15 [PATCH net-next v4 00/11] net: dsa: realtek: MDIO interface and RTL8367S Luiz Angelo Daros de Luca
2022-01-05  3:15 ` [PATCH net-next v4 01/11] net: dsa: realtek-smi: move to subdirectory Luiz Angelo Daros de Luca
2022-01-05  3:15 ` [PATCH net-next v4 02/11] net: dsa: realtek: rename realtek_smi to realtek_priv Luiz Angelo Daros de Luca
2022-01-07  3:42   ` Jakub Kicinski
2022-01-10 12:33   ` Alvin Šipraga
2022-01-16  0:04   ` Linus Walleij
2022-01-20 14:37   ` Vladimir Oltean
2022-01-05  3:15 ` [PATCH net-next v4 03/11] net: dsa: realtek: remove direct calls to realtek-smi Luiz Angelo Daros de Luca
2022-01-10 12:38   ` Alvin Šipraga
2022-01-16  0:05   ` Linus Walleij
2022-01-17  3:46   ` Florian Fainelli
2022-01-05  3:15 ` [PATCH net-next v4 04/11] net: dsa: realtek: convert subdrivers into modules Luiz Angelo Daros de Luca
2022-01-10 12:43   ` Alvin Šipraga
2022-01-17  4:02   ` Florian Fainelli
2022-01-05  3:15 ` [PATCH net-next v4 05/11] net: dsa: realtek: use phy_read in ds->ops Luiz Angelo Daros de Luca
2022-01-10 13:09   ` Alvin Šipraga
2022-01-17  4:15   ` Florian Fainelli
2022-01-18  2:55     ` Luiz Angelo Daros de Luca
2022-01-18 13:16       ` Andrew Lunn
2022-01-21 22:13         ` Luiz Angelo Daros de Luca
2022-01-21 23:48           ` Andrew Lunn
2022-01-05  3:15 ` [PATCH net-next v4 06/11] net: dsa: realtek: add new mdio interface for drivers Luiz Angelo Daros de Luca
2022-01-10 13:09   ` Alvin Šipraga
2022-01-17  4:22   ` Florian Fainelli
2022-01-18  4:38     ` Luiz Angelo Daros de Luca
2022-01-05  3:15 ` [PATCH net-next v4 07/11] net: dsa: realtek: rtl8365mb: rename extport to extint, add "realtek,ext-int" Luiz Angelo Daros de Luca
2022-01-10 13:15   ` Alvin Šipraga
2022-01-17  4:25   ` Florian Fainelli
2022-01-05  3:15 ` [PATCH net-next v4 08/11] net: dsa: realtek: rtl8365mb: use GENMASK(n-1,0) instead of BIT(n)-1 Luiz Angelo Daros de Luca
2022-01-10 13:18   ` Alvin Šipraga
2022-01-17  4:25   ` Florian Fainelli
2022-01-05  3:15 ` [PATCH net-next v4 09/11] net: dsa: realtek: rtl8365mb: use DSA CPU port Luiz Angelo Daros de Luca
2022-01-07  3:37   ` Jakub Kicinski
2022-01-10 13:22   ` Alvin Šipraga
2022-01-17  4:26   ` Florian Fainelli
2022-01-05  3:15 ` [PATCH net-next v4 10/11] net: dsa: realtek: rtl8365mb: add RTL8367S support Luiz Angelo Daros de Luca
2022-01-10 13:26   ` Alvin Šipraga
2022-01-17  4:26   ` Florian Fainelli
2022-01-05  3:15 ` [PATCH net-next v4 11/11] net: dsa: realtek: rtl8365mb: multiple cpu ports, non cpu extint Luiz Angelo Daros de Luca
2022-01-10 13:39   ` Alvin Šipraga
2022-01-10 13:53     ` Aw: " Frank Wunderlich
2022-01-11 18:17       ` Alvin Šipraga
2022-01-11 18:45         ` Aw: " Frank Wunderlich
2022-01-13 12:37           ` Alvin Šipraga
2022-01-13 15:56             ` Aw: " Frank Wunderlich
2022-01-18  4:58               ` Luiz Angelo Daros de Luca
2022-01-18 10:13                 ` Alvin Šipraga
2022-01-18 13:20                 ` Re: Re: " Andrew Lunn
2022-01-20 15:12                   ` Vladimir Oltean
2022-01-20 23:35                     ` Luiz Angelo Daros de Luca
2022-01-21  2:06                       ` Vladimir Oltean
2022-01-21  3:13                         ` Luiz Angelo Daros de Luca
2022-01-21  3:22                           ` Florian Fainelli
2022-01-21  3:42                             ` Luiz Angelo Daros de Luca
2022-01-21  3:50                               ` Florian Fainelli
2022-01-21  4:37                                 ` Luiz Angelo Daros de Luca
2022-01-21  9:07                                 ` Arınç ÜNAL
2022-01-21 18:50                           ` Vladimir Oltean
2022-01-21 21:51                             ` Luiz Angelo Daros de Luca
2022-01-21 22:49                               ` Vladimir Oltean
2022-01-22 20:12                                 ` Luiz Angelo Daros de Luca
2022-01-24 15:31                                   ` Vladimir Oltean
2022-01-24 16:46                                     ` Jakub Kicinski
2022-01-24 16:55                                       ` Vladimir Oltean
2022-01-24 17:01                                         ` Florian Fainelli
2022-01-24 17:21                                           ` Vladimir Oltean
2022-01-24 17:30                                             ` Florian Fainelli
2022-01-24 17:35                                             ` Jakub Kicinski
2022-01-24 18:20                                               ` Jakub Kicinski
2022-01-24 19:08                                                 ` Vladimir Oltean
2022-01-24 19:38                                                   ` Jakub Kicinski
2022-01-24 20:56                                                     ` Vladimir Oltean
2022-01-24 21:42                                                       ` Jakub Kicinski
2022-01-24 22:30                                                         ` Vladimir Oltean
2022-01-25  7:15                                                           ` Luiz Angelo Daros de Luca
2022-01-25  9:47                                                             ` Vladimir Oltean
2022-01-25 22:29                                                               ` Luiz Angelo Daros de Luca
2022-01-25 23:56                                                                 ` Florian Fainelli
2022-01-26 22:49                                                                   ` Luiz Angelo Daros de Luca
2022-01-25  9:44                                                           ` Arınç ÜNAL
2022-01-22 15:51                               ` Andrew Lunn
2022-01-30  1:54                 ` Re: Re: " Luiz Angelo Daros de Luca
2022-01-30  4:42                   ` Luiz Angelo Daros de Luca
2022-01-30 17:24                     ` Florian Fainelli [this message]
2022-01-31 17:26                       ` Luiz Angelo Daros de Luca
2022-02-01 14:46                         ` Vladimir Oltean
2022-01-20 14:36 ` [PATCH net-next v4 00/11] net: dsa: realtek: MDIO interface and RTL8367S Vladimir Oltean
2022-01-20 17:46   ` Luiz Angelo Daros de Luca

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5355fa92-cf8c-4fa5-5157-9b6574f1c876@gmail.com \
    --to=f.fainelli@gmail.com \
    --cc=ALSI@bang-olufsen.dk \
    --cc=andrew@lunn.ch \
    --cc=arinc.unal@arinc9.com \
    --cc=frank-w@public-files.de \
    --cc=linus.walleij@linaro.org \
    --cc=luizluca@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=olteanv@gmail.com \
    --cc=vivien.didelot@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).