Thread (1 message) 1 message, 1 author, 2019-11-27

Re: Question about flow table offload in mlx5e

From: wenxu <hidden>
Date: 2019-11-27 12:16:53

Sorry maybe something mess you,  Ignore with my patches.


I also did the test like you with route tc rules to ft callback.


please also did the following test:  mlx_p0 is the pf and mlx_pf0vf0 is the vf .

ifconfig mlx_p0 172.168.152.75/24 up
ip n replace 172.168.152.241 dev mlx_p0 lladdr aa:bb:cc:dd:ee:ff

ip l add dev tun1 type gretap external
tc qdisc add dev tun1 ingress
tc qdisc add dev mlx_pf0vf0 ingress

tc filter add dev mlx_pf0vf0 pref 2 ingress  protocol ip flower skip_sw
ip_proto tcp dst_ip 10.0.1.241 src_ip 10.0.0.75 src_port 5002 dst_port 5001
tcp_flags 0/0x5  action tunnel_key set dst_ip 172.168.152.241 src_ip 0 id 1000
nocsum pipe action mirred egress redirect dev tun1

In the virtual machine:
ifconfig eth0 10.0.0.75/24
ip r a default via 10.0.0.1
ip n replace 10.0.0.1 dev eth0 lladdr aa:bb:cc:dd:ee:01

iperf -c 10.0.1.241  -i 2  -B 10.0.0.75:5002  -t 10


The script above can offload the syn packets, The packet can't be captured on mlx_pf0vf0.

I think the rule is ok.  The problem is that if I add another rule in device tun1 as following.
It will lead the syn packet can't be offloaded

tc filter add dev tun1 pref 2 ingress  protocol ip flower ip_proto tcp src_ip
10.0.1.241 dst_ip 10.0.0.75 src_port 5001 dst_port 5002 tcp_flags 0/0x5
enc_key_id 1000 enc_src_ip 172.168.152.241 action tunnel_key unset pipe
action mirred egress redirect dev mlx_pf0vf0






在 2019/11/27 19:51, Paul Blakey 写道:
quoted hunk
Sorry I didn't have time apply your patches.

I did test it again with route tc rules to ft callback, here's the diff:
@@ -1291,7 +1304,7 @@ static int mlx5e_rep_setup_tc(struct net_device *dev, enum tc_setup_type type,
        case TC_SETUP_BLOCK:
                return flow_block_cb_setup_simple(type_data,
                                                  &mlx5e_rep_block_tc_cb_list,
-                                                 mlx5e_rep_setup_tc_cb,
+                                                 mlx5e_rep_setup_ft_cb,
                                                  priv, priv, true);
        case TC_SETUP_FT:
                return flow_block_cb_setup_simple(type_data,

I ran this script after creating a VF (ens1f2) and entering switchdev mode (creating represntor ens1f0_0):

ip l add dev tun1 type gretap external
tc qdisc add dev tun1 ingress
ifconfig tun1 up

ifconfig ens1f0_0 0 up
tc qdisc add dev ens1f0_0 ingress

ifconfig ens1f0 172.168.152.75/24 up
ip n replace 172.168.162.241 dev ens1f0 lladdr aa:bb:cc:dd:ee:01

tc filter del dev ens1f0_0 ingress

tc filter add dev ens1f0_0 pref 2 ingress proto ip flower \
     skip_sw \
     ip_proto tcp dst_ip 5.5.5.6 src_ip 5.5.5.5 tcp_flags 0/0x5 \
     action tunnel_key set dst_ip 172.168.152.241 src_ip 0 id 1000 nocsum pipe \
     action mirred egress redirect dev tun1

tc filter add dev ens1f0_0 pref 1 ingress proto ip flower \
     skip_hw \
     action drop

ifconfig ens1f2 5.5.5.5/24 up
ip n replace 5.5.5.6 dev ens1f2 lladdr aa:bb:cc:dd:ee:ff

timeout 3 iperf -c 5.5.5.6

tc -s filter show dev ens1f0_0 ingress



Notice I run iperf client without Iperf server, so I get only syn packets.

Here is the tcpdump on the VF (ens1f2):

Executing: sudo tcpdump -nnep  -i ens1f2

Executing: sudo tcpdump -nnep  -i ens1f2
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens1f2, link-type EN10MB (Ethernet), capture size 262144 bytes
13:49:10.610376 24:8a:07:a5:28:01 > aa:bb:cc:dd:ee:ff, ethertype IPv4 (0x0800), length 74: 5.5.5.5.49846 > 5.5.5.6.5001: Flags [S], seq 1395738427, win 64240, options [mss 1460,sackOK,TS val 2249857484 ecr 0,nop,wscale 7], length 0
13:49:11.616262 24:8a:07:a5:28:01 > aa:bb:cc:dd:ee:ff, ethertype IPv4 (0x0800), length 74: 5.5.5.5.49846 > 5.5.5.6.5001: Flags [S], seq 1395738427, win 64240, options [mss 1460,sackOK,TS val 2249858489 ecr 0,nop,wscale 7], length 0
13:49:13.664261 24:8a:07:a5:28:01 > aa:bb:cc:dd:ee:ff, ethertype IPv4 (0x0800), length 74: 5.5.5.5.49846 > 5.5.5.6.5001: Flags [S], seq 1395738427, win 64240, options [mss 1460,sackOK,TS val 2249860537 ecr 0,nop,wscale 7], length 0
13:49:17.696261 24:8a:07:a5:28:01 > aa:bb:cc:dd:e

I get:

filter protocol ip pref 1 flower chain 0
filter protocol ip pref 1 flower chain 0 handle 0x1
  eth_type ipv4
  skip_hw
  not_in_hw
        action order 1: gact action drop
         random type none pass val 0
         index 1 ref 1 bind 1 installed 3 sec used 3 sec
        Action statistics:
        Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
        backlog 0b 0p requeues 0

filter protocol ip pref 2 flower chain 0
filter protocol ip pref 2 flower chain 0 handle 0x1
  eth_type ipv4
  ip_proto tcp
  dst_ip 5.5.5.6
  src_ip 5.5.5.5
  tcp_flags 0/5
  skip_sw
  in_hw
        action order 1: tunnel_key set
        src_ip 0.0.0.0
        dst_ip 172.168.152.241
        key_id 1000
        nocsum pipe
        index 1 ref 1 bind 1 installed 3 sec used 3 sec
        Action statistics:
        Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
        backlog 0b 0p requeues 0

        action order 2: mirred (Egress Redirect to device tun1) stolen
        index 1 ref 1 bind 1 installed 3 sec used 1 sec
        Action statistics:
        Sent 232 bytes 2 pkt (dropped 0, overlimits 0 requeues 0)
        backlog 0b 0p requeues 0


And it counts the 2 syn packets in hardware, the packets are leaving the VF (ens1f2) and not arriving at the mlx5 representor device (ens1f0_0),

which means hardware got them. It's also couned in the above encap rule. And the software only (skip_hw, prio 1) rule didn't catch any packets.


Thanks,

Paul.



On 11/26/2019 10:18 AM, wenxu wrote:

Hi Paul,

Did your test for this case? There are some problem that I reported?


BR

wenxu

On 11/24/2019 4:46 PM, Paul Blakey wrote:


Hi,

The syn packet might not be actually offloaded because there isn't a neighbor to resolve the destination mac for the tunnel destination ip (next hop mac).
Try setting the neighbor via "ip neigh replace dev mlx5_p0 172.168.152.241 lladdr <next hop mac>"
Or running ping to 172.168.152.241 before adding (or in background) the rule to resolve the mac and make available.
I'll test it on my end.


Thanks,
Paul.




-----Original Message-----
From: wenxu <redacted><mailto:wenxu@ucloud.cn>
Sent: Friday, November 22, 2019 8:26 AM
To: Paul Blakey <redacted><mailto:paulb@mellanox.com>
Cc: pablo@netfilter.org<mailto:pablo@netfilter.org>; netdev@vger.kernel.org<mailto:netdev@vger.kernel.org>; Mark Bloch
[off-list ref]<mailto:markb@mellanox.com>
Subject: Re: Question about flow table offload in mlx5e

Hi Paul,


There are some update. I also test it through replacing mlx5e_rep_setup_tc
_cb with mlx5e_rep_setup_ft_cb


ifconfig mlx_p0 172.168.152.75/24 up

ip l add dev tun1 type gretap external
tc qdisc add dev tun1 ingress
tc qdisc add dev mlx_pf0vf0 ingress

tc filter add dev mlx_pf0vf0 pref 2 ingress  protocol ip flower skip_sw
ip_proto tcp dst_ip 10.0.1.241 src_ip 10.0.0.75 src_port 5002 dst_port 5001
tcp_flags 0/0x5  action tunnel_key set dst_ip 172.168.152.241 src_ip 0 id 1000
nocsum pipe action mirred egress redirect dev tun1

tc filter add dev tun1 pref 2 ingress  protocol ip flower ip_proto tcp src_ip
10.0.1.241 dst_ip 10.0.0.75 src_port 5001 dst_port 5002 tcp_flags 0/0x5
enc_key_id 1000 enc_src_ip 172.168.152.241 action tunnel_key unset pipe
action mirred egress redirect dev mlx_pf0vf0


If you run this script on the host,  and in the virtual machine  run "iperf -c
10.0.1.241  -i 2  -B 10.0.0.75:5002  -t 1000"

The tcp syn packet will not be offloaded


But if you  only run the script  without the last filter as following , The tcp syn
packet will be offloaded.

ifconfig mlx_p0 172.168.152.75/24 up

ip l add dev tun1 type gretap external
tc qdisc add dev tun1 ingress
tc qdisc add dev mlx_pf0vf0 ingress

tc filter add dev mlx_pf0vf0 pref 2 ingress  protocol ip flower skip_sw
ip_proto tcp dst_ip 10.0.1.241 src_ip 10.0.0.75 src_port 5002 dst_port 5001
tcp_flags 0/0x5  action tunnel_key set dst_ip 172.168.152.241 src_ip 0 id 1000
nocsum pipe action mirred egress redirect dev tun1.

I think there are some problem in mlx5e_rep_setup_ft_cb.

On 11/21/2019 9:05 PM, Paul Blakey wrote:


        I see, I will test that, and how about normal FWD rules?

        Paul.



                -----Original Message-----
                From: wenxu [off-list ref]<mailto:wenxu@ucloud.cn>
<mailto:wenxu@ucloud.cn><mailto:wenxu@ucloud.cn>
                Sent: Thursday, November 21, 2019 2:35 PM
                To: Paul Blakey [off-list ref]<mailto:paulb@mellanox.com>
<mailto:paulb@mellanox.com><mailto:paulb@mellanox.com>
                Cc: pablo@netfilter.org<mailto:pablo@netfilter.org> <mailto:pablo@netfilter.org><mailto:pablo@netfilter.org> ;
netdev@vger.kernel.org<mailto:netdev@vger.kernel.org> <mailto:netdev@vger.kernel.org><mailto:netdev@vger.kernel.org> ; Mark Bloch
                [off-list ref]<mailto:markb@mellanox.com> <mailto:markb@mellanox.com><mailto:markb@mellanox.com>
                Subject: Re: Question about flow table offload in mlx5e


                在 2019/11/21 19:39, Paul Blakey 写道:

                        They are good fixes, exactly what we had when we
tested this, thanks.

                        Regarding encap, I don't know what changes you did,
how does the encap

                rule look? Is it a FWD to vxlan device? If not it should be, as
our driver
                expects that.
                It is fwd to a gretap devices


                        I tried it on my setup via tc, by changing the callback
of tc

                (mlx5e_rep_setup_tc_cb) to that of ft
(mlx5e_rep_setup_ft_cb),

                        and testing a vxlan encap rule:
                        sudo tc qdisc add dev ens1f0_0 ingress
                        sudo ifconfig ens1f0 7.7.7.7/24 up
                        sudo ip link add name vxlan0 type vxlan dev ens1f0
remote 7.7.7.8 dstport

                4789 external

                        sudo ifconfig vxlan0 up
                        sudo tc filter add dev ens1f0_0 ingress prio 1 chain 0
protocol ip flower

                dst_mac aa:bb:cc:dd:ee:ff ip_proto udp skip_sw  action
tunnel_key set
                src_ip 0.0.0.0 dst_ip 7.7.7.8 id 1234 dst_port 4789 pipe action
mirred egress
                redirect dev vxlan


                        then tc show:
                        filter protocol ip pref 1 flower chain 0 handle 0x1
dst_mac aa:bb:cc:dd:ee:ff

                ip_proto udp skip_sw in_hw in_hw_count 1

                                tunnel_key set src_ip 0.0.0.0 dst_ip 7.7.7.8 key_id
1234 dst_port 4789

                csum pipe

                                Stats: used 119 sec      0 pkt
                                mirred (Egress Redirect to device vxlan0)
                                Stats: used 119 sec      0 pkt


                Can you send packet that match this offloaded flow to check
it is real
                offloaded?

                In the flowtable offload with my patches both
TC_SETUP_BLOCK and
                TC_SETUP_FT can offload the rule success

                But in the TC_SETUP_FT case the packet is not real offloaded.


                I  will test like u did.






                                -----Original Message-----
                                From: wenxu [off-list ref]<mailto:wenxu@ucloud.cn>
<mailto:wenxu@ucloud.cn><mailto:wenxu@ucloud.cn>
                                Sent: Thursday, November 21, 2019 10:29 AM
                                To: Paul Blakey [off-list ref]<mailto:paulb@mellanox.com>
<mailto:paulb@mellanox.com><mailto:paulb@mellanox.com>
                                Cc: pablo@netfilter.org<mailto:pablo@netfilter.org>
<mailto:pablo@netfilter.org><mailto:pablo@netfilter.org> ; netdev@vger.kernel.org<mailto:netdev@vger.kernel.org>
<mailto:netdev@vger.kernel.org><mailto:netdev@vger.kernel.org> ; Mark Bloch
                                [off-list ref]<mailto:markb@mellanox.com>
<mailto:markb@mellanox.com><mailto:markb@mellanox.com>
                                Subject: Re: Question about flow table
offload in mlx5e


                                On 11/21/2019 3:42 PM, Paul Blakey wrote:

                                        Hi,

                                        The original design was the block
setup to use TC_SETUP_FT type, and

                the

                                tc event type to be case
TC_SETUP_CLSFLOWER.

                                        We will post a patch to change that. I
would advise to wait till we fix that

                                😊

                                        I'm not sure how you get to this
function mlx5e_rep_setup_ft_cb() if it

                the

                                nf_flow_table_offload ndo_setup_tc event
was TC_SETUP_BLOCK, and

                not

                                TC_SETUP_FT.


                                Yes I change the TC_SETUP_BLOCK to
TC_SETUP_FT in the
                                nf_flow_table_offload_setup.

                                Two fixes patch provide:

                                http://patchwork.ozlabs.org/patch/1197818/

                                http://patchwork.ozlabs.org/patch/1197876/

                                So this change made by me is not correct
currently?


                                        In our driver en_rep.c we have:

                                        -------switch (type) {
                                        -------case TC_SETUP_BLOCK:
                                        ------->-------return
flow_block_cb_setup_simple(type_data,
                                        ------->------->------->------->------->---
----

                &mlx5e_rep_block_tc_cb_list,

                                        ------->------->------->------->------->---
----  mlx5e_rep_setup_tc_cb,
                                        ------->------->------->------->------->---
----  priv, priv, true);
                                        -------case TC_SETUP_FT:
                                        ------->-------return
flow_block_cb_setup_simple(type_data,
                                        ------->------->------->------->------->---
----

                &mlx5e_rep_block_ft_cb_list,

                                        ------->------->------->------->------->---
----  mlx5e_rep_setup_ft_cb,
                                        ------->------->------->------->------->---
----  priv, priv, true);
                                        -------default:
                                        ------->-------return -EOPNOTSUPP;
                                        -------}

                                        In nf_flow_table_offload.c:

                                        -------bo.binder_type>-=

                FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS;

                                        -------bo.extack>------= &extack;
                                        -------INIT_LIST_HEAD(&bo.cb_list);
                                        -------err = dev->netdev_ops-


ndo_setup_tc(dev, TC_SETUP_BLOCK,


                                &bo);

                                        -------if (err < 0)
                                        ------->-------return err;
                                        -------return
nf_flow_table_block_setup(flowtable, &bo, cmd);

                                        }

        EXPORT_SYMBOL_GPL(nf_flow_table_offload_setup);


                                        So unless you changed that as well,
you should have gotten to

                                mlx5e_rep_setup_tc_cb and not
mlx5e_rep_setup_tc_ft.

                                        Regarding the encap action, there
should be no difference on which

                chain

                                the rule is on.


                                But for the same encap rule can be real
offloaded when setup through
                                through TC_SETUP_BLOCK. But TC_SETUP_FT
can't.

                                So it is the problem of TC_SETUP_FT in
mlx5e_rep_setup_ft_cb ?




                                        -----Original Message-----
                                        From: wenxu [off-list ref]<mailto:wenxu@ucloud.cn>
<mailto:wenxu@ucloud.cn><mailto:wenxu@ucloud.cn>
                                        Sent: Thursday, November 21, 2019
9:30 AM
                                        To: Paul Blakey
[off-list ref]<mailto:paulb@mellanox.com> <mailto:paulb@mellanox.com><mailto:paulb@mellanox.com>
                                        Cc: pablo@netfilter.org<mailto:pablo@netfilter.org>
<mailto:pablo@netfilter.org><mailto:pablo@netfilter.org> ; netdev@vger.kernel.org<mailto:netdev@vger.kernel.org>
<mailto:netdev@vger.kernel.org><mailto:netdev@vger.kernel.org> ; Mark Bloch
                                        [off-list ref]<mailto:markb@mellanox.com>
<mailto:markb@mellanox.com><mailto:markb@mellanox.com>
                                        Subject: Question about flow table
offload in mlx5e

                                        Hi  paul,

                                        The flow table offload in the mlx5e is
based on TC_SETUP_FT.


                                        It is almost the same as
TC_SETUP_BLOCK.

                                        It just set
MLX5_TC_FLAG(FT_OFFLOAD) flags and change
                                        cls_flower.common.chain_index =
FDB_FT_CHAIN;

                                        In following codes line 1380 and 1392

                                        1368 static int
mlx5e_rep_setup_ft_cb(enum tc_setup_type type, void
                                        *type_data,
                                        1369                                  void *cb_priv)
                                        1370 {
                                        1371         struct flow_cls_offload *f =
type_data;
                                        1372         struct flow_cls_offload
cls_flower;
                                        1373         struct mlx5e_priv *priv =
cb_priv;
                                        1374         struct mlx5_eswitch *esw;
                                        1375         unsigned long flags;
                                        1376         int err;
                                        1377
                                        1378         flags =
MLX5_TC_FLAG(INGRESS) |
                                        1379
MLX5_TC_FLAG(ESW_OFFLOAD) |
                                        1380
MLX5_TC_FLAG(FT_OFFLOAD);
                                        1381         esw = priv->mdev-


priv.eswitch;


                                        1382
                                        1383         switch (type) {
                                        1384         case
TC_SETUP_CLSFLOWER:
                                        1385                 if
(!mlx5_eswitch_prios_supported(esw) || f-

                                        common.chain_index)

                                        1386                         return -
EOPNOTSUPP;
                                        1387
                                        1388                 /* Re-use tc offload
path by moving the ft flow to the
                                        1389                  * reserved ft chain.
                                        1390                  */
                                        1391                 memcpy(&cls_flower, f,
sizeof(*f));
                                        1392
cls_flower.common.chain_index = FDB_FT_CHAIN;
                                        1393                 err =
mlx5e_rep_setup_tc_cls_flower(priv, &cls_flower,

                                flags);

                                        1394                 memcpy(&f->stats,
&cls_flower.stats, sizeof(f->stats));


                                        I want to add tunnel offload support
in the flow table, I  add some

                patches

                                in

                                        nf_flow_table_offload.

                                        Also add the indr setup support in the
mlx driver. And Now I can  flow

                                table

                                        offload with decap.


                                        But I meet a problem with the encap.
The encap rule can be added in
                                        hardware  successfully But it can't be
offloaded.

                                        But I think the rule I added is correct.
If I mask the line 1392. The rule

                also

                                can

                                        be add success and can be offloaded.

                                        So there are some limit for encap
operation for FT_OFFLOAD in
                                        FDB_FT_CHAIN?


                                        BR

                                        wenxu
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help