Hardware offload lost when applying mirror in DOCA

Hi,

I’m using OVS on a DPU with DOCA and have a bridge br-inside with ports P1 and pf1hpf. I want to create a mirror from P1 to pf1hpf for using Flow Inspector, but when I do, the hardware offload is lost and everything goes to software.

Is this expected when doing mirroring with DOCA? Is there a way to keep hardware offload while mirroring in a Smart Flow?

I applied this conf:

Create SF
/opt/mellanox/iproute2/sbin/mlxdevm port add pci/0000:03:00.0 flavour pcisf pfnum 0 sfnum 1
/opt/mellanox/iproute2/sbin/mlxdevm port add pci/0000:03:00.0 flavour pcisf pfnum 0 sfnum 2

/opt/mellanox/iproute2/sbin/mlxdevm port function set pci/0000:03:00.0/229441 hw_addr 02:25:f2:8d:a2:1c trust on state active
/opt/mellanox/iproute2/sbin/mlxdevm port function set pci/0000:03:00.0/229442 hw_addr 02:25:f2:8d:a2:2c trust on state active


echo mlx5_core.sf.3 > /sys/bus/auxiliary/drivers/mlx5_core.sf_cfg/unbind
echo mlx5_core.sf.3 > /sys/bus/auxiliary/drivers/mlx5_core.sf/bind

echo mlx5_core.sf.4 > /sys/bus/auxiliary/drivers/mlx5_core.sf_cfg/unbind
echo mlx5_core.sf.4 > /sys/bus/auxiliary/drivers/mlx5_core.sf/bind

add to bridge 
ovs-vsctl add-port br-inside en3f0pf0sf2 -- set Interface en3f0pf0sf2 type=dpdk
ovs-vsctl add-port br-outside en3f0pf0sf1 -- set Interface en3f0pf0sf1 type=dpdk


#Mirror
#pf1hpf->en3f0pf0sf2
ovs-vsctl – --id=@p1 get port en3f0pf0sf2 
– --id=@p2 get port pf1hpf 
– --id=@m create mirror name=mirror_inside select-dst-port=@p2 select-src-port=@p2 output-port=@p1 
– set bridge br-inside mirrors=@m

#p1->en3f0pf0sf2
ovs-vsctl – --id=@p1 get port en3f0pf0sf2 
– --id=@p2 get port p1 
– --id=@m create mirror name=mirror_inside select-dst-port=@p2 select-src-port=@p2 output-port=@p1 
– set bridge br-inside mirrors=@m

#pf0hpf->en3f0pf0sf1
ovs-vsctl – --id=@p1 get port en3f0pf0sf1 
– --id=@p2 get port pf0hpf 
– --id=@m create mirror name=mirror_outside select-dst-port=@p2 select-src-port=@p2 output-port=@p1 
– set bridge br-outside mirrors=@m

#p0->en3f0pf0sf1
ovs-vsctl – --id=@p1 get port en3f0pf0sf1 
– --id=@p2 get port p0 
– --id=@m create mirror name=mirror_outside select-dst-port=@p2 select-src-port=@p2 output-port=@p1 
– set bridge br-outside mirrors=@m

if lost offload I get traffic

_uuid               : 9ce194a9-31e2-4b4d-8c21-f947a9b4c3aa

external_ids        : {}

name                : mirror_inside

output_port         : b056fc1f-8905-4940-960a-4486fb5b00de

output_vlan         : []

select_all          : false

select_dst_port     : [0b782bdf-1ce0-4e2e-80ac-88c9d5ba4753]

select_src_port     : [0b782bdf-1ce0-4e2e-80ac-88c9d5ba4753]

select_vlan         : []

snaplen             : []

statistics          : {tx_bytes=35836, tx_packets=188}

if offload is working don’t have traffic in mirror

_uuid               : 827b2d06-ea63-4548-8f23-d185c764d671

external_ids        : {}

name                : mirror_inside

output_port         : bdef92ab-6f62-4dae-938a-2c0959fd49ac

output_vlan         : []

select_all          : false

select_dst_port     : []

select_src_port     : []

select_vlan         : []

snaplen             : []

statistics          : {tx_bytes=0, tx_packets=0}

LOG Flow

I can see action unsupported: output port’

ufid:357c2b8a-d2c7-4e41-b8f1-9ad17e1979f5, recirc_id(0),dp_hash(0/0),skb_priority(0/0),nv_mp_pid(0/0),nv_mp_preferred(0/0),nv_mp_strict(0/0),in_port(p1),skb_mark(0/0),ct_state(0/0),ct_zone(0/0),ct_mark(0/0),ct_label(0/0),packet_type(ns=0,id=0),eth(src=10:f9:20:90:47:a8,dst=00:1e:bd:c4:d8:ff),eth_type(0x8100),vlan(vid=100,pcp=0/0x0),encap(eth_type(0x0800),ipv4(src=172.28.20.105/0.0.0.0,dst=172.28.20.10/0.0.0.0,proto=17/0,tos=0/0,ttl=250/0,frag=no),udp(src=5277/0,dst=5247/0)), packets:1394, bytes:489376, used:0.846s, dp:ovs, actions:en3f0pf0sf2,pf1hpf, dp-extra-info:miniflow_bits(4,2), dp-offload-info:'action unsupported: output port'

ufid:6376a820-a1e4-4b03-84d8-750e9d2f8e97, recirc_id(0),dp_hash(0/0),skb_priority(0/0),nv_mp_pid(0/0),nv_mp_preferred(0/0),nv_mp_strict(0/0),in_port(pf1hpf),skb_mark(0/0),ct_state(0/0),ct_zone(0/0),ct_mark(0/0),ct_label(0/0),packet_type(ns=0,id=0),eth(src=00:1e:bd:c4:d8:ff,dst=48:8b:0a:30:0c:60),eth_type(0x8100),vlan(vid=100,pcp=0/0x0),encap(eth_type(0x0800),ipv4(src=172.28.20.10/0.0.0.0,dst=172.28.20.106/0.0.0.0,proto=17/0,tos=0xc0/0,ttl=64/0,frag=no),udp(src=5246/0,dst=5260/0)), packets:668, bytes:295192, used:2.063s, dp:ovs, actions:p1,en3f0pf0sf2, dp-extra-info:miniflow_bits(4,2), dp-offload-info:'action unsupported: output port'

ufid:ca3591d5-aa5b-42d8-86e0-0ec337402d0b, recirc_id(0),dp_hash(0/0),skb_priority(0/0),nv_mp_pid(0/0),nv_mp_preferred(0/0),nv_mp_strict(0/0),in_port(pf1hpf),skb_mark(0/0),ct_state(0/0),ct_zone(0/0),ct_mark(0/0),ct_label(0/0),packet_type(ns=0,id=0),eth(src=48:e1:e9:ca:ad:0b,dst=58:97:bd:27:55:08),eth_type(0x8100),vlan(vid=600,pcp=0/0x0),encap(eth_type(0x0800),ipv4(src=172.31.30.68/0.0.0.0,dst=44.213.225.164/0.0.0.0,proto=6/0,tos=0/0,ttl=255/0,frag=no),tcp(src=56061/0,dst=443/0),tcp_flags(0/0)), packets:1, bytes:64, used:1.030s, flags:., dp:ovs, actions:p1,en3f0pf0sf2, dp-extra-info:miniflow_bits(4,2), dp-offload-info:'action unsupported: output port'

ufid:092218b4-f724-4230-bdf3-6f14d9116b02, recirc_id(0),dp_hash(0/0),skb_priority(0/0),nv_mp_pid(0/0),nv_mp_preferred(0/0),nv_mp_strict(0/0),in_port(pf1hpf),skb_mark(0/0),ct_state(0/0),ct_zone(0/0),ct_mark(0/0),ct_label(0/0),packet_type(ns=0,id=0),eth(src=00:1e:bd:c4:d8:ff,dst=10:f9:20:90:47:a8),eth_type(0x8100),vlan(vid=100,pcp=0/0x0),encap(eth_type(0x0800),ipv4(src=172.28.20.10/0.0.0.0,dst=172.28.20.105/0.0.0.0,proto=17/0,tos=0/0,ttl=255/0,frag=no),udp(src=5247/0,dst=5277/0)), packets:1, bytes:311, used:0.849s, dp:ovs, actions:p1,en3f0pf0sf2, dp-extra-info:miniflow_bits(4,2), dp-offload-info:'action unsupported: output port'

Hello @tuanama,

Thank you for posting your query on our community.

The behavior you are seeing is expected. OVS mirror flows often include multiple output actions, and the current OVS-DOCA offload provider cannot offload multi-output flows. This is a limitation of OVS-DOCA, not BF2/BF3 hardware. To maintain offload with mirroring, consider using tc-flower based mirroring, as described in documentation - https://docs.nvidia.com/doca/sdk/ovs-kernel-hardware-acceleration/index.html

Thanks,

Bhargavi