[ovs-dev] [PATCH ovs V6 00/24] Introducing HW offload support for openvswitch

Marcelo Ricardo Leitner mleitner at redhat.com
Thu Mar 30 22:11:29 UTC 2017


On Thu, Mar 30, 2017 at 03:43:36PM -0300, Marcelo Ricardo Leitner wrote:
> On Wed, Mar 29, 2017 at 03:43:10PM +0300, Roi Dayan wrote:
> > This patch series introduces rule offload functionality to dpif-netlink
> > via netdev ports new flow offloading API. The user can specify whether to
> > enable rule offloading or not via OVS configuration. Netdev providers
> > are able to implement netdev flow offload API in order to offload rules.
> > 
> > This patch series also implements one offload scheme for netdev-linux,
> > using TC flower classifier, which was chosen because its sort of natural
> > to state OVS DP rules for this classifier. However, the code can be
> > extended to support other classifiers such as U32, eBPF, etc which support
> > offload as well.
> > 
> > The use-case we are currently addressing is the newly sriov switchdev mode
> > in the Linux kernel which was introduced in version 4.8 [1][2].
> > This series was tested against sriov vfs vports representors of the
> > Mellanox 100G ConnectX-4 series exposed by the mlx5 kernel driver.
> > 
> > 
> > V5->V6:
> >     - Rebase over master branch, fix compilation issue
> >     - Add Nicira copyright to tc interface
> 
> Hi,
> 
> I built rpm packages based on OVS upstream commit 36664f336664. Then I

Please s/36664f336664/36664f377d048/g in this email.
This was the commit used as base for the test:
commit 36664f377d04857256c1d8582057e1cf3e0e3923
Author: Ben Pfaff <blp at ovn.org>
Date:   Mon Mar 20 10:56:22 2017 -0700

    ovsdb-server: Drop unnecessary find_db() function.

Thanks

> built a new set of packages with this patchset, v6, applied.
> 
> When offloading is enabled, the rules are merged in an unexpected way.
> See the results below from the two scenarios.
> 
> openvswitch-2.7.90-1.fc24.36664f336664.x86_64.rpm
>                           ^^^^^^^^^^^^ upstream ovs commit
> 
> [root at wsfd-netdev36 ~]# ovs-ofctl dump-flows ovs_pvp_br0
> NXST_FLOW reply (xid=0x4):
>  cookie=0x0, duration=12.501s, table=0, n_packets=1022759, n_bytes=61365540, idle_age=0, ip,in_port=1,nw_src=16.0.0.1,nw_dst=1.0.0.1 actions=output:2
>  cookie=0x0, duration=12.501s, table=0, n_packets=1020990, n_bytes=61259400, idle_age=0, ip,in_port=1,nw_src=16.0.0.2,nw_dst=1.0.0.2 actions=output:2
>  cookie=0x0, duration=12.500s, table=0, n_packets=1023860, n_bytes=61431600, idle_age=0, ip,in_port=1,nw_src=16.0.0.3,nw_dst=1.0.0.3 actions=output:2
>  cookie=0x0, duration=12.500s, table=0, n_packets=1022554, n_bytes=61353240, idle_age=0, ip,in_port=1,nw_src=16.0.0.4,nw_dst=1.0.0.4 actions=output:2
>  cookie=0x0, duration=12.500s, table=0, n_packets=1021516, n_bytes=61290960, idle_age=0, ip,in_port=1,nw_src=16.0.0.5,nw_dst=1.0.0.5 actions=output:2
>  cookie=0x0, duration=12.500s, table=0, n_packets=1020599, n_bytes=61235940, idle_age=0, ip,in_port=1,nw_src=16.0.0.6,nw_dst=1.0.0.6 actions=output:2
>  cookie=0x0, duration=12.500s, table=0, n_packets=1022285, n_bytes=61337100, idle_age=0, ip,in_port=1,nw_src=16.0.0.7,nw_dst=1.0.0.7 actions=output:2
>  cookie=0x0, duration=12.500s, table=0, n_packets=1021725, n_bytes=61303500, idle_age=0, ip,in_port=1,nw_src=16.0.0.8,nw_dst=1.0.0.8 actions=output:2
>  cookie=0x0, duration=12.500s, table=0, n_packets=1022281, n_bytes=61336860, idle_age=0, ip,in_port=1,nw_src=16.0.0.9,nw_dst=1.0.0.9 actions=output:2
>  cookie=0x0, duration=12.500s, table=0, n_packets=1022449, n_bytes=61346940, idle_age=0, ip,in_port=1,nw_src=16.0.0.10,nw_dst=1.0.0.10 actions=output:2
>  cookie=0x0, duration=12.208s, table=0, n_packets=2580, n_bytes=154800, idle_age=0, ip,in_port=2,nw_src=16.0.0.1,nw_dst=1.0.0.1 actions=output:1
>  cookie=0x0, duration=12.208s, table=0, n_packets=2675, n_bytes=160500, idle_age=0, ip,in_port=2,nw_src=16.0.0.2,nw_dst=1.0.0.2 actions=output:1
>  cookie=0x0, duration=12.208s, table=0, n_packets=2520, n_bytes=151200, idle_age=0, ip,in_port=2,nw_src=16.0.0.3,nw_dst=1.0.0.3 actions=output:1
>  cookie=0x0, duration=12.208s, table=0, n_packets=2587, n_bytes=155220, idle_age=0, ip,in_port=2,nw_src=16.0.0.4,nw_dst=1.0.0.4 actions=output:1
>  cookie=0x0, duration=12.208s, table=0, n_packets=2640, n_bytes=158400, idle_age=0, ip,in_port=2,nw_src=16.0.0.5,nw_dst=1.0.0.5 actions=output:1
>  cookie=0x0, duration=12.208s, table=0, n_packets=2593, n_bytes=155580, idle_age=0, ip,in_port=2,nw_src=16.0.0.6,nw_dst=1.0.0.6 actions=output:1
>  cookie=0x0, duration=12.208s, table=0, n_packets=2634, n_bytes=158040, idle_age=0, ip,in_port=2,nw_src=16.0.0.7,nw_dst=1.0.0.7 actions=output:1
>  cookie=0x0, duration=12.208s, table=0, n_packets=2549, n_bytes=152940, idle_age=0, ip,in_port=2,nw_src=16.0.0.8,nw_dst=1.0.0.8 actions=output:1
>  cookie=0x0, duration=12.207s, table=0, n_packets=2627, n_bytes=157620, idle_age=0, ip,in_port=2,nw_src=16.0.0.9,nw_dst=1.0.0.9 actions=output:1
>  cookie=0x0, duration=12.207s, table=0, n_packets=2530, n_bytes=151800, idle_age=0, ip,in_port=2,nw_src=16.0.0.10,nw_dst=1.0.0.10 actions=output:1
> 
> [root at wsfd-netdev36 ~]# ovs-dpctl dump-flows 
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.7,dst=1.0.0.7,frag=no), packets:1162916, bytes:69774960, used:0.000s, actions:1
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.10,dst=1.0.0.10,frag=no), packets:1163402, bytes:69804120, used:0.000s, actions:1
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.6,dst=1.0.0.6,frag=no), packets:2969, bytes:178140, used:0.011s, actions:2
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.4,dst=1.0.0.4,frag=no), packets:2940, bytes:176400, used:0.011s, actions:2
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.2,dst=1.0.0.2,frag=no), packets:3028, bytes:181680, used:0.011s, actions:2
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.9,dst=1.0.0.9,frag=no), packets:3025, bytes:181500, used:0.011s, actions:2
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.5,dst=1.0.0.5,frag=no), packets:3008, bytes:180480, used:0.011s, actions:2
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.3,dst=1.0.0.3,frag=no), packets:1164847, bytes:69890820, used:0.000s, actions:1
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.4,dst=1.0.0.4,frag=no), packets:1162983, bytes:69778980, used:0.000s, actions:1
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.6,dst=1.0.0.6,frag=no), packets:1161018, bytes:69661080, used:0.000s, actions:1
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.8,dst=1.0.0.8,frag=no), packets:2876, bytes:172560, used:0.011s, actions:2
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.1,dst=1.0.0.1,frag=no), packets:2968, bytes:178080, used:0.011s, actions:2
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.8,dst=1.0.0.8,frag=no), packets:1161890, bytes:69713400, used:0.000s, actions:1
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.9,dst=1.0.0.9,frag=no), packets:1163228, bytes:69793680, used:0.000s, actions:1
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.2,dst=1.0.0.2,frag=no), packets:1161539, bytes:69692340, used:0.000s, actions:1
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.5,dst=1.0.0.5,frag=no), packets:1161402, bytes:69684120, used:0.000s, actions:1
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.10,dst=1.0.0.10,frag=no), packets:2880, bytes:172800, used:0.011s, actions:2
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.1,dst=1.0.0.1,frag=no), packets:1163599, bytes:69815940, used:0.000s, actions:1
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.7,dst=1.0.0.7,frag=no), packets:2984, bytes:179040, used:0.011s, actions:2
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.3,dst=1.0.0.3,frag=no), packets:2889, bytes:173340, used:0.011s, actions:2
> 
> 
> Now with
> openvswitch-2.7.90-1.fc24.36664f336664.v6.x86_64.rpm
>                           ^^^^^^^^^^^^^^^ this upstream commit + V6 patchset
> 
> [root at wsfd-netdev36 ~]# ovs-ofctl dump-flows ovs_pvp_br0 
> NXST_FLOW reply (xid=0x4):
>  cookie=0x0, duration=6.876s, table=0, n_packets=171, n_bytes=10260, idle_age=5, ip,in_port=1,nw_src=16.0.0.1,nw_dst=1.0.0.1 actions=output:2
>  cookie=0x0, duration=6.877s, table=0, n_packets=139976996, n_bytes=8398290046, idle_age=0, ip,in_port=1,nw_src=16.0.0.2,nw_dst=1.0.0.2 actions=output:2
>  cookie=0x0, duration=6.877s, table=0, n_packets=171, n_bytes=10260, idle_age=5, ip,in_port=1,nw_src=16.0.0.3,nw_dst=1.0.0.3 actions=output:2
>  cookie=0x0, duration=6.877s, table=0, n_packets=170, n_bytes=10200, idle_age=5, ip,in_port=1,nw_src=16.0.0.4,nw_dst=1.0.0.4 actions=output:2
>  cookie=0x0, duration=6.877s, table=0, n_packets=170, n_bytes=10200, idle_age=5, ip,in_port=1,nw_src=16.0.0.5,nw_dst=1.0.0.5 actions=output:2
>  cookie=0x0, duration=6.876s, table=0, n_packets=170, n_bytes=10200, idle_age=5, ip,in_port=1,nw_src=16.0.0.6,nw_dst=1.0.0.6 actions=output:2
>  cookie=0x0, duration=6.876s, table=0, n_packets=170, n_bytes=10200, idle_age=5, ip,in_port=1,nw_src=16.0.0.7,nw_dst=1.0.0.7 actions=output:2
>  cookie=0x0, duration=6.876s, table=0, n_packets=170, n_bytes=10200, idle_age=5, ip,in_port=1,nw_src=16.0.0.8,nw_dst=1.0.0.8 actions=output:2
>  cookie=0x0, duration=6.876s, table=0, n_packets=170, n_bytes=10200, idle_age=5, ip,in_port=1,nw_src=16.0.0.9,nw_dst=1.0.0.9 actions=output:2
>  cookie=0x0, duration=6.876s, table=0, n_packets=170, n_bytes=10200, idle_age=5, ip,in_port=1,nw_src=16.0.0.10,nw_dst=1.0.0.10 actions=output:2
>  cookie=0x0, duration=6.585s, table=0, n_packets=82, n_bytes=4920, idle_age=5, ip,in_port=2,nw_src=16.0.0.1,nw_dst=1.0.0.1 actions=output:1
>  cookie=0x0, duration=6.585s, table=0, n_packets=81, n_bytes=4860, idle_age=5, ip,in_port=2,nw_src=16.0.0.2,nw_dst=1.0.0.2 actions=output:1
>  cookie=0x0, duration=6.584s, table=0, n_packets=77, n_bytes=4620, idle_age=5, ip,in_port=2,nw_src=16.0.0.3,nw_dst=1.0.0.3 actions=output:1
>  cookie=0x0, duration=6.584s, table=0, n_packets=78, n_bytes=4680, idle_age=5, ip,in_port=2,nw_src=16.0.0.4,nw_dst=1.0.0.4 actions=output:1
>  cookie=0x0, duration=6.584s, table=0, n_packets=72, n_bytes=4320, idle_age=5, ip,in_port=2,nw_src=16.0.0.5,nw_dst=1.0.0.5 actions=output:1
>  cookie=0x0, duration=6.584s, table=0, n_packets=67, n_bytes=4020, idle_age=5, ip,in_port=2,nw_src=16.0.0.6,nw_dst=1.0.0.6 actions=output:1
>  cookie=0x0, duration=6.584s, table=0, n_packets=75, n_bytes=4500, idle_age=5, ip,in_port=2,nw_src=16.0.0.7,nw_dst=1.0.0.7 actions=output:1
>  cookie=0x0, duration=6.584s, table=0, n_packets=63, n_bytes=3780, idle_age=5, ip,in_port=2,nw_src=16.0.0.8,nw_dst=1.0.0.8 actions=output:1
>  cookie=0x0, duration=6.584s, table=0, n_packets=61708007, n_bytes=3702480420, idle_age=0, ip,in_port=2,nw_src=16.0.0.9,nw_dst=1.0.0.9 actions=output:1
>  cookie=0x0, duration=6.583s, table=0, n_packets=65, n_bytes=3900, idle_age=5, ip,in_port=2,nw_src=16.0.0.10,nw_dst=1.0.0.10 actions=output:1
> [root at wsfd-netdev36 ~]# ovs-dpctl dump-flows 
> in_port(1),eth(dst=00:00:00:00:00:01),eth_type(0x0800), packets:86436432, bytes:5186185920, used:0.430s, actions:2
> in_port(2),eth(dst=00:00:00:00:00:01),eth_type(0x0800), packets:196008690, bytes:11760191686, used:0.430s, actions:1
>    ^--- issue above
> listing tc filter rules gives exactly the rules above too, on both
> interfaces.
> 
> Then:
> # ovs-vsctl set Open_vSwitch . other_config:hw-offload=false
> # systemctl restart openvswitch.service
> 
> [root at wsfd-netdev36 ~]# ovs-ofctl dump-flows ovs_pvp_br0
> NXST_FLOW reply (xid=0x4):
>  cookie=0x0, duration=5.710s, table=0, n_packets=399560, n_bytes=23973600, idle_age=0, ip,in_port=1,nw_src=16.0.0.1,nw_dst=1.0.0.1 actions=output:2
>  cookie=0x0, duration=5.710s, table=0, n_packets=399256, n_bytes=23955360, idle_age=0, ip,in_port=1,nw_src=16.0.0.2,nw_dst=1.0.0.2 actions=output:2
>  cookie=0x0, duration=5.710s, table=0, n_packets=400018, n_bytes=24001080, idle_age=0, ip,in_port=1,nw_src=16.0.0.3,nw_dst=1.0.0.3 actions=output:2
>  cookie=0x0, duration=5.709s, table=0, n_packets=399667, n_bytes=23980020, idle_age=0, ip,in_port=1,nw_src=16.0.0.4,nw_dst=1.0.0.4 actions=output:2
>  cookie=0x0, duration=5.709s, table=0, n_packets=400011, n_bytes=24000660, idle_age=0, ip,in_port=1,nw_src=16.0.0.5,nw_dst=1.0.0.5 actions=output:2
>  cookie=0x0, duration=5.709s, table=0, n_packets=399651, n_bytes=23979060, idle_age=0, ip,in_port=1,nw_src=16.0.0.6,nw_dst=1.0.0.6 actions=output:2
>  cookie=0x0, duration=5.709s, table=0, n_packets=400000, n_bytes=24000000, idle_age=0, ip,in_port=1,nw_src=16.0.0.7,nw_dst=1.0.0.7 actions=output:2
>  cookie=0x0, duration=5.709s, table=0, n_packets=399198, n_bytes=23951880, idle_age=0, ip,in_port=1,nw_src=16.0.0.8,nw_dst=1.0.0.8 actions=output:2
>  cookie=0x0, duration=5.709s, table=0, n_packets=400489, n_bytes=24029340, idle_age=0, ip,in_port=1,nw_src=16.0.0.9,nw_dst=1.0.0.9 actions=output:2
>  cookie=0x0, duration=5.709s, table=0, n_packets=399782, n_bytes=23986920, idle_age=0, ip,in_port=1,nw_src=16.0.0.10,nw_dst=1.0.0.10 actions=output:2
>  cookie=0x0, duration=5.419s, table=0, n_packets=1081, n_bytes=64860, idle_age=0, ip,in_port=2,nw_src=16.0.0.1,nw_dst=1.0.0.1 actions=output:1
>  cookie=0x0, duration=5.419s, table=0, n_packets=1037, n_bytes=62220, idle_age=0, ip,in_port=2,nw_src=16.0.0.2,nw_dst=1.0.0.2 actions=output:1
>  cookie=0x0, duration=5.419s, table=0, n_packets=1048, n_bytes=62880, idle_age=0, ip,in_port=2,nw_src=16.0.0.3,nw_dst=1.0.0.3 actions=output:1
>  cookie=0x0, duration=5.419s, table=0, n_packets=1072, n_bytes=64320, idle_age=0, ip,in_port=2,nw_src=16.0.0.4,nw_dst=1.0.0.4 actions=output:1
>  cookie=0x0, duration=5.418s, table=0, n_packets=1096, n_bytes=65760, idle_age=0, ip,in_port=2,nw_src=16.0.0.5,nw_dst=1.0.0.5 actions=output:1
>  cookie=0x0, duration=5.418s, table=0, n_packets=1028, n_bytes=61680, idle_age=0, ip,in_port=2,nw_src=16.0.0.6,nw_dst=1.0.0.6 actions=output:1
>  cookie=0x0, duration=5.418s, table=0, n_packets=1042, n_bytes=62520, idle_age=0, ip,in_port=2,nw_src=16.0.0.7,nw_dst=1.0.0.7 actions=output:1
>  cookie=0x0, duration=5.418s, table=0, n_packets=1017, n_bytes=61020, idle_age=0, ip,in_port=2,nw_src=16.0.0.8,nw_dst=1.0.0.8 actions=output:1
>  cookie=0x0, duration=5.418s, table=0, n_packets=1080, n_bytes=64800, idle_age=0, ip,in_port=2,nw_src=16.0.0.9,nw_dst=1.0.0.9 actions=output:1
>  cookie=0x0, duration=5.418s, table=0, n_packets=1055, n_bytes=63300, idle_age=0, ip,in_port=2,nw_src=16.0.0.10,nw_dst=1.0.0.10 actions=output:1
> [root at wsfd-netdev36 ~]# ovs-dpctl dump-flows
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.2,dst=1.0.0.2,frag=no), packets:608565, bytes:36513900, used:0.000s, actions:1
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.3,dst=1.0.0.3,frag=no), packets:610002, bytes:36600120, used:0.000s, actions:1
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.5,dst=1.0.0.5,frag=no), packets:1595, bytes:95700, used:0.013s, actions:2
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.5,dst=1.0.0.5,frag=no), packets:609962, bytes:36597720, used:0.000s, actions:1
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.10,dst=1.0.0.10,frag=no), packets:1573, bytes:94380, used:0.013s, actions:2
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.7,dst=1.0.0.7,frag=no), packets:610297, bytes:36617820, used:0.000s, actions:1
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.9,dst=1.0.0.9,frag=no), packets:1656, bytes:99360, used:0.013s, actions:2
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.6,dst=1.0.0.6,frag=no), packets:608943, bytes:36536580, used:0.000s, actions:1
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.3,dst=1.0.0.3,frag=no), packets:1595, bytes:95700, used:0.038s, actions:2
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.1,dst=1.0.0.1,frag=no), packets:1627, bytes:97620, used:0.013s, actions:2
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.2,dst=1.0.0.2,frag=no), packets:1588, bytes:95280, used:0.013s, actions:2
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.8,dst=1.0.0.8,frag=no), packets:608778, bytes:36526680, used:0.000s, actions:1
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.4,dst=1.0.0.4,frag=no), packets:1550, bytes:93000, used:0.013s, actions:2
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.4,dst=1.0.0.4,frag=no), packets:609149, bytes:36548940, used:0.000s, actions:1
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.7,dst=1.0.0.7,frag=no), packets:1574, bytes:94440, used:0.038s, actions:2
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.9,dst=1.0.0.9,frag=no), packets:610471, bytes:36628260, used:0.000s, actions:1
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.8,dst=1.0.0.8,frag=no), packets:1566, bytes:93960, used:0.013s, actions:2
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.1,dst=1.0.0.1,frag=no), packets:609238, bytes:36554280, used:0.000s, actions:1
> recirc_id(0),in_port(2),eth_type(0x0800),ipv4(src=16.0.0.10,dst=1.0.0.10,frag=no), packets:609208, bytes:36552480, used:0.000s, actions:1
> recirc_id(0),in_port(1),eth_type(0x0800),ipv4(src=16.0.0.6,dst=1.0.0.6,frag=no), packets:1573, bytes:94380, used:0.013s, actions:2
>   ^--- rules are not merged anymore.
> 
> devlink inline-mode = transport for all tests above.
> 
> I can provide a packet capture if wanted. Replaying it should be enough
> to trigger it, though these packets have nothing really especial. They
> have all the same src/dst MAC addresses and increasing IP addresses, as
> seen above.
> 
> I tried checking ovs logs, but couldn't spot anything interesting.
> 
> This is also observed from a performance point of view. It doesn't
> matter if we add 10 or 10k flows with L3 matching, performance is always
> the same, as it's matching using only 2 L2 rules.
> 
> Please let me know if you need anything else.
> 
> Thanks,
> Marcelo


More information about the dev mailing list