lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <6400e73a-b165-41a8-9fc9-e2226060a68c@kontron.de>
Date: Wed, 29 Jan 2025 09:03:17 +0100
From: Frieder Schrempf <frieder.schrempf@...tron.de>
To: Andrew Lunn <andrew@...n.ch>
Cc: "netdev@...r.kernel.org" <netdev@...r.kernel.org>,
 Lukasz Majewski <lukma@...x.de>
Subject: Re: KSZ9477 HSR Offloading

On 29.01.25 8:24 AM, Frieder Schrempf wrote:
> Hi Andrew,
> 
> On 28.01.25 6:51 PM, Andrew Lunn wrote:
>> On Tue, Jan 28, 2025 at 05:14:46PM +0100, Frieder Schrempf wrote:
>>> Hi,
>>>
>>> I'm trying out HSR support on KSZ9477 with v6.12. My setup looks like this:
>>>
>>> +-------------+         +-------------+
>>> |             |         |             |
>>> |   Node A    |         |   Node D    |
>>> |             |         |             |
>>> |             |         |             |
>>> | LAN1   LAN2 |         | LAN1   LAN2 |
>>> +--+-------+--+         +--+------+---+
>>>    |       |               |      |
>>>    |       +---------------+      |
>>>    |                              |
>>>    |       +---------------+      |
>>>    |       |               |      |
>>> +--+-------+--+         +--+------+---+
>>> | LAN1   LAN2 |         | LAN1   LAN2 |
>>> |             |         |             |
>>> |             |         |             |
>>> |   Node B    |         |   Node C    |
>>> |             |         |             |
>>> +-------------+         +-------------+
>>>
>>> On each device the LAN1 and LAN2 are added as HSR slaves. Then I try to
>>> do ping tests between each of the HSR interfaces.
>>>
>>> The result is that I can reach the neighboring nodes just fine, but I
>>> can't reach the remote node that needs packages to be forwarded through
>>> the other nodes. For example I can't ping from node A to C.
>>>
>>> I've tried to disable HW offloading in the driver and then everything
>>> starts working.
>>>
>>> Is this a problem with HW offloading in the KSZ driver, or am I missing
>>> something essential?
>>
>> How are IP addresses configured? I assume you have a bridge, LAN1 and
>> LAN2 are members of the bridge, and the IP address is on the bridge
>> interface?
> 
> I have a HSR interface on each node that covers LAN1 and LAN2 as slaves
> and the IP addresses are on those HSR interfaces. For node A:
> 
> ip link add name hsr type hsr slave1 lan1 slave2 lan2 supervision 45
> version 1
> ip addr add 172.20.1.1/24 dev hsr
> 
> The other nodes have the addresses 172.20.1.2/24, 172.20.1.3/24 and
> 172.20.1.4/24 respectively.
> 
> Then on node A, I'm doing:
> 
> ping 172.20.1.2 # neighboring node B works
> ping 172.20.1.4 # neighboring node D works
> ping 172.20.1.3 # remote node C works only if I disable offloading

BTW, it's enough to disable the offloading of the forwarding for HSR
frames to make it work.

--- a/drivers/net/dsa/microchip/ksz9477.c
+++ b/drivers/net/dsa/microchip/ksz9477.c
@@ -1267,7 +1267,7 @@ int ksz9477_tc_cbs_set_cinc(struct ksz_device
*dev, int port, u32 val)
  * Moreover, the NETIF_F_HW_HSR_FWD feature is also enabled, as HSR frames
  * can be forwarded in the switch fabric between HSR ports.
  */
-#define KSZ9477_SUPPORTED_HSR_FEATURES (NETIF_F_HW_HSR_DUP |
NETIF_F_HW_HSR_FWD)
+#define KSZ9477_SUPPORTED_HSR_FEATURES (NETIF_F_HW_HSR_DUP)

 void ksz9477_hsr_join(struct dsa_switch *ds, int port, struct
net_device *hsr)
 {
@@ -1279,16 +1279,6 @@ void ksz9477_hsr_join(struct dsa_switch *ds, int
port, struct net_device *hsr)
        /* Program which port(s) shall support HSR */
        ksz_rmw32(dev, REG_HSR_PORT_MAP__4, BIT(port), BIT(port));

-       /* Forward frames between HSR ports (i.e. bridge together HSR
ports) */
-       if (dev->hsr_ports) {
-               dsa_hsr_foreach_port(hsr_dp, ds, hsr)
-                       hsr_ports |= BIT(hsr_dp->index);
-
-               hsr_ports |= BIT(dsa_upstream_port(ds, port));
-               dsa_hsr_foreach_port(hsr_dp, ds, hsr)
-                       ksz9477_cfg_port_member(dev, hsr_dp->index,
hsr_ports);
-       }
-
        if (!dev->hsr_ports) {
                /* Enable discarding of received HSR frames */
                ksz_read8(dev, REG_HSR_ALU_CTRL_0__1, &data);

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ