[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <f20094d8-fd3a-eb1f-8bbf-8d01997ae0e0@ti.com>
Date: Fri, 21 Aug 2020 11:10:54 -0400
From: Murali Karicheri <m-karicheri2@...com>
To: "netdev@...r.kernel.org" <netdev@...r.kernel.org>,
Grygorii Strashko <grygorii.strashko@...com>,
<jpirko@...hat.com>
Subject: Re: VLAN over HSR/PRP - Issue with rx_handler not called for VLAN hw
acceleration
Hello Jiri,
On 8/19/20 12:08 PM, Murali Karicheri wrote:
> All,
>
> I am working to add VLAN interface creation over HSR/PRP interface.
> It works fine after I fixed the HSR driver to allow creation of
> VLAN over it and with VLAN without hw acceleration. But with hw
> acceleration, the HSR hook is bypassed in net/core/dev.c as
>
> if (skb_vlan_tag_present(skb)) {
> if (pt_prev) {
> ret = deliver_skb(skb, pt_prev, orig_dev);
> pt_prev = NULL;
> }
> if (vlan_do_receive(&skb))
> goto another_round;
> else if (unlikely(!skb))
> goto out;
> }
>
> rx_handler = rcu_dereference(skb->dev->rx_handler);
> if (rx_handler) {
> if (pt_prev) {
> ret = deliver_skb(skb, pt_prev, orig_dev);
> pt_prev = NULL;
> }
> switch (rx_handler(&skb)) {
> case RX_HANDLER_CONSUMED:
> ret = NET_RX_SUCCESS;
> goto out;
> case RX_HANDLER_ANOTHER:
> goto another_round;
> case RX_HANDLER_EXACT:
> deliver_exact = true;
> case RX_HANDLER_PASS:
> break;
> default:
> BUG();
> }
> }
>
> What is the best way to address this issue? With VLAN hw acceleration,
> skb_vlan_tag_present(skb) is true and rx_handler() is not called.
>
I find that you have modified vlan_do_receive() in the past and
wondering if you have some insight into the issue. I also see the same
issue when I create VLAN interfaces over a linux bridge over TI's cpsw
interfaces. I understand that bridge code also use the same hook
(rx_handler) as HSR to receive the frames. The vlan interface doesn't
get the frames. With VLAN acceleration disabled, VLAN interfaces seems
to work fine. I have two AM572x IDKs with CPSW port connected back to
back. I setup Linux bridge and run stp to avoid looks. I don't
understand what vlan_do_receive() is doing. Could you explain?
probably it needs to false for Linux bridge and HSR case so that
the rx_handler will receive the frame? As a HACK, I will muck around
with this code to return false and see if that helps.
Setup used for my work.
192.168.100.10 192.168.101.10 192.168.100.20 192.168.101.20
br0.100 br0.101 br0.100 br0.101
|-----------| |--------------|
| |
br0 (192.168.2.10) br0 (192.168.2.20)
DUT-1-----|--eth0 <-------------------------> eth0---|-----DUT-1
|--eth1 <-------------------------> eth1---|
Now Ping between 192.168.100.10 and 192.168.100.20 or
192.168.101.10 and 192.168.101.20
Commands below.
DUT-1
brctl addbr br0
brctl addif br0 eth0
brctl addif br0 eth1
ifconfig eth0 up
ifconfig eth1 up
brctl stp br0 yes
ifconfig br0 192.168.2.10
ip link add link br0 name br0.100 type vlan id 100
ip link add link br0 name br0.101 type vlan id 101
ifconfig br0.100 192.168.100.10
ifconfig br0.101 192.168.101.10
DUT-2
brctl addbr br0
brctl addif br0 eth0
brctl addif br0 eth1
ifconfig eth0 up
ifconfig eth1 up
brctl stp br0 yes
ifconfig br0 192.168.2.20
ip link add link br0 name br0.100 type vlan id 100
ip link add link br0 name br0.101 type vlan id 101
ifconfig br0.100 192.168.100.20
ifconfig br0.101 192.168.101.20
> Thanks
>
--
Murali Karicheri
Texas Instruments
Powered by blists - more mailing lists