Hi, On 19 Oct 2023, at 17:06, Vladislav Odintsov via discuss <ovs-discuss@openvswitch.org> wrote:
On 18 Oct 2023, at 18:43, Ilya Maximets via discuss <ovs-discuss@openvswitch.org> wrote: On 10/18/23 16:24, Vladislav Odintsov wrote: Hi Ilya, thanks for your response! On 18 Oct 2023, at 15:59, Ilya Maximets via discuss <ovs-discuss@openvswitch.org> wrote: On 10/17/23 16:30, Vladislav Odintsov via discuss wrote: Hi, I’m testing OVS hardware offload with tc flower with Mellanox/NVidia ConnectX-6 Dx smartnic and see next warning in ovs-vswitchd log: 2023-10-17T14:23:15.116Z|00386|tc(handler20)|WARN|Kernel flower acknowledgment does not match request! Set dpif_netlink to dbg to see which rule caused this error. With dpif_netlink debug logs enabled, after this message appears two additional lines: 2023-10-17T14:23:15.117Z|00387|dpif_netlink(handler20)|DBG|added flow 2023-10-17T14:23:15.117Z|00388|dpif_netlink(handler20)|DBG|system@ovs-system: put[create] ufid:d8a3ab6d-77d1-4574-8bbf-634b01a116f3 recirc_id(0),dp_hash(0/0),skb_priority(0/0),tunnel(tun_id=0x10,src=10.1.0.105,dst=10.1.0.109,ttl=64/0,tp_src=59507/0,tp_dst=6081/0,geneve({class=0x102,type=0x80,len=4,0x60002}),flags(-df+csum+key)),in_port(4),skb_mark(0/0),ct_state(0/0x2f),ct_zone(0/0),ct_mark(0/0),ct_label(0/0x3),eth(src=00:00:ba:a4:6e:ad,dst=00:01:ba:a4:6e:ad),eth_type(0x0800),ipv4(src=172.32.2.4/0.0.0.0,dst=172.32.1.4/0.0.0.0,proto=1,tos=0/0x3,ttl=63/0,frag=no),icmp(type=8/0,code=0/0), actions:set(tunnel(tun_id=0xff0011,src=10.1.0.109,dst=10.1.1.18,ttl=64,tp_src=59507,tp_dst=6081,geneve({class=0x102,type=0x80,len=4,0x18000b}),flags(df|csum|key))),4 Could you also enable debug logs for 'tc' module in OVS? It shoudl give more infomation about where exactly is the difference between what OVS asked for and what the kenrel reported back. In general this warning typically signifies a kernel bug, but it could be that OVS doesn't format something correctly as well. With enabled tc logs I see mismatches in expected/real keys and actions: 2023-10-18T13:33:35.882Z|00118|tc(handler21)|DBG|tc flower compare failed action compare Expected Mask: 00000000 ff ff 00 00 ff ff ff ff-ff ff ff ff ff ff ff ff 00000030 00 00 2f 00 00 00 00 00-00 00 00 00 00 00 00 00 00000040 03 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00000050 00 00 00 00 ff ff ff ff-00 00 00 00 00 00 00 00 00000060 00 00 00 00 ff 00 00 00-00 00 00 00 00 00 00 00 00000090 00 00 00 00 00 00 00 00-ff ff ff ff ff ff ff ff 000000c0 ff 00 00 00 ff ff 00 00-ff ff ff ff ff ff ff ff 000000d0 08 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 000000e0 ff ff ff 01 ff ff ff ff-00 00 00 00 00 00 00 00 Received Mask: 00000000 ff ff 00 00 ff ff ff ff-ff ff ff ff ff ff ff ff 00000030 00 00 2f 00 00 00 00 00-00 00 00 00 00 00 00 00 00000040 03 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00000050 00 00 00 00 ff ff ff ff-00 00 00 00 00 00 00 00 00000060 00 00 00 00 ff 00 00 00-00 00 00 00 00 00 00 00 00000090 00 00 00 00 00 00 00 00-ff ff ff ff ff ff ff ff 000000c0 ff 00 00 00 ff ff 00 00-ff ff ff ff ff ff ff ff 000000d0 08 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 000000e0 ff ff ff 01 ff ff ff ff-00 00 00 00 00 00 00 00 Expected Key: 00000000 08 06 00 00 ff ff ff ff-ff ff 00 00 ba a4 6e ad 00000050 a9 fe 64 01 a9 fe 64 03-00 00 ba a4 6e ad 00 00 <— mismatch in this line 00000060 00 00 00 00 01 00 00 00-00 00 00 00 00 00 00 00 00000090 00 00 00 00 00 00 00 00-0a 01 00 68 0a 01 00 6d 000000c0 00 40 c0 5b 17 c1 00 00-00 00 00 00 00 00 00 10 <— mismatch in this line 000000d0 08 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 000000e0 01 02 80 01 00 03 00 02-00 00 00 00 00 00 00 00 Received Key: 00000000 08 06 00 00 ff ff ff ff-ff ff 00 00 ba a4 6e ad 00000050 00 00 00 00 a9 fe 64 03-00 00 00 00 00 00 00 00 <— mismatch in this line 00000060 00 00 00 00 01 00 00 00-00 00 00 00 00 00 00 00 00000090 00 00 00 00 00 00 00 00-0a 01 00 68 0a 01 00 6d 000000c0 00 00 00 00 17 c1 00 00-00 00 00 00 00 00 00 10 <— mismatch in this line 000000d0 08 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 000000e0 01 02 80 01 00 03 00 02-00 00 00 00 00 00 00 00 These are not very important, it is expected that the kernel clears out fields that are not coverd by a mask. We do not have the difference in the masks and we do not have a diference in the masked keys, so that is fine. Expected Masked Key: 00000000 08 06 00 00 ff ff ff ff-ff ff 00 00 ba a4 6e ad 00000050 00 00 00 00 a9 fe 64 03-00 00 00 00 00 00 00 00 00000060 00 00 00 00 01 00 00 00-00 00 00 00 00 00 00 00 00000090 00 00 00 00 00 00 00 00-0a 01 00 68 0a 01 00 6d 000000c0 00 00 00 00 17 c1 00 00-00 00 00 00 00 00 00 10 000000d0 08 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 000000e0 01 02 80 01 00 03 00 02-00 00 00 00 00 00 00 00 Received Masked Key: 00000000 08 06 00 00 ff ff ff ff-ff ff 00 00 ba a4 6e ad 00000050 00 00 00 00 a9 fe 64 03-00 00 00 00 00 00 00 00 00000060 00 00 00 00 01 00 00 00-00 00 00 00 00 00 00 00 00000090 00 00 00 00 00 00 00 00-0a 01 00 68 0a 01 00 6d 000000c0 00 00 00 00 17 c1 00 00-00 00 00 00 00 00 00 10 000000d0 08 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 000000e0 01 02 80 01 00 03 00 02-00 00 00 00 00 00 00 00 Action 0 mismatch: We do have the difference in the actions, that is the main issue here. - Expected Action: 0x1000000000000000000000000ff0011c05b17c1004000000a01006d0a010112000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000010280010018000b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000 - Received Action: 0x1000000000000000000000000ff0011000017c1004000000a01006d0a010112000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000010280010018000b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000 2023-10-18T13:33:35.882Z|00119|tc(handler21)|WARN|Kernel flower acknowledgment does not match request! Set dpif_netlink to dbg to see which rule caused this error. 2023-10-18T13:33:35.882Z|00120|dpif_netlink(handler21)|DBG|added flow 2023-10-18T13:33:35.882Z|00121|dpif_netlink(handler21)|DBG|system@ovs-system: put[create] ufid:dc160f96-84ef-4bf7-919a-3729c19382b8 recirc_id(0),dp_hash(0/0),skb_priority(0/0),tunnel(tun_id=0x10,src=10.1.0.104,dst=10.1.0.109,ttl=64/0,tp_src=49243/0,tp_dst=6081/0,geneve({class=0x102,type=0x80,len=4,0x30002}),flags(-df+csum+key)),in_port(4),skb_mark(0/0),ct_state(0/0x2f),ct_zone(0/0),ct_mark(0/0),ct_label(0/0x3),eth(src=00:00:ba:a4:6e:ad,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=169.254.100.1/0.0.0.0,tip=169.254.100.3,op=1,sha=00:00:ba:a4:6e:ad/00:00:00:00:00:00,tha=00:00:00:00:00:00/00:00:00:00:00:00), actions:set(tunnel(tun_id=0xff0011,src=10.1.0.109,dst=10.1.1.18,ttl=64,tp_src=49243,tp_dst=6081,geneve({class=0x102,type=0x80,len=4,0x18000b}),flags(df|csum|key))),4 Is there any documentation or maybe code in OVS (or kernel, etc) to read to understand the reason for this mismatch in more details? Or, maybe you have a good next steps to advice? Unfortunately, that is just a direct hex dump of the tc_action structure: https://github.com/openvswitch/ovs/blob/c29ba54018520f957c48d947325ed50c9442b831/lib/tc.h#L233 The only way to figure out what exactly is wrong here is to find which bytes in the expected and received actions are different and find which field in the tc_action structure the difference is in. That's not fun. The following patch may make the spotting the difference a little easier: diff --git a/lib/tc.c b/lib/tc.c index f85703633..39fe9c5cc 100644 --- a/lib/tc.c +++ b/lib/tc.c @@ -3875,12 +3875,13 @@ log_tc_flower_match(const char *msg, for (int i = 0; i < a->action_count; i++, action_a++, action_b++) { if (memcmp(action_a, action_b, sizeof *action_a)) { - ds_put_format(&s, - "\nAction %d mismatch:\n - Expected Action: ", - i); - ds_put_hex(&s, action_a, sizeof *action_a); + ds_put_format(&s, "\nAction %d mismatch:" + "\n - Expected Action:\n", i); + ds_put_sparse_hex_dump(&s, action_a, sizeof *action_a, + 0, false); ds_put_cstr(&s, "\n - Received Action: "); - ds_put_hex(&s, action_b, sizeof *action_b); + ds_put_sparse_hex_dump(&s, action_b, sizeof *action_b, + 0, false); } } } --- You may also need to use something like pahole on your OVS binary to see the exact layout of the structure. Unfortunately, I’m not experienced with pahole, so need some assistance from you if possible. I’ve built OVS with modified RPM spec file adding '--with-debug' to configure flags. Then I’ve installed the rebuilt openvswitch and openvswitch-debuginfo RPMs and ran pahole, but got error "unable to find type": # pahole -C tc_action /usr/lib/debug/usr/lib64/libopenvswitch-3.1.so.0.0.3-3.1.3-1.el8_4.x86_64.debug WARNING: DW_TAG_partial_unit used, some types will not be considered! Probably this was optimized using a tool like 'dwz' A future version of pahole will support this. pahole: type 'tc_action' not found I’m sure there should be a trivial mistake, but I couldn’t solve it. The difference seems to be in these 2 bytes: 0x 1000000000000000000000000ff0011c05b17c1004000000a01006d0a010112 0x 1000000000000000000000000ff0011000017c1004000000a01006d0a010112 ^^^^ So, 16 byte offset within the structure. Let's guess it is an encap field. Then it must be encap.tp_src. And that checks out, because 0xc05b equals 49243, which is indeed a source port for the tunnel encapsulation. So, it seems like for some reason kernel decided to not populate the tunnel source port in the tunnel key after decapsulation, even though it was asked to do so. @Eelco, @Marcelo, do you have some thoughts on that? Eelco, Marcelo, if you have any comments here, I’d be very happy to get them. Thanks in advance. The test system is a CentOS 8.4 with installed elrepo mainline kernel 6.5.5, OVS 3.1.1 and OVN 22.09.1. 3.1.1 contains some known bugs in TC offloading code, so you may want to try the latest 3.1.3. Though it's unlikely to be related ot the issue you're facing here. I’ve upgraded OVS to 3.1.3 to eliminate the possible known OVS bugs, but this didn’t help. Same warnings and mismatches still are reported. The workload I’m testing is a L3 Gateway for OVN IC (cross-az traffic). tc monitor at the same moment outputs next: replaced filter dev genev_sys_6081 ingress protocol ip pref 2 flower chain 0 handle 0x3 dst_mac 00:01:ba:a4:6e:ad src_mac 00:00:ba:a4:6e:ad eth_type ipv4 ip_proto icmp ip_tos 0/0x3 enc_dst_ip 10.1.0.109 enc_src_ip 10.1.0.105 enc_key_id 16 enc_dst_port 6081 enc_tos 0 geneve_opts 0102:80:00060002/ffff:ff:ffffffff ip_flags nofrag ct_state -trk-new-est ct_label 00000000000000000000000000000000/030000000000000000000000000000 in_hw in_hw_count 2 action order 1: tunnel_key unset pipe index 5 ref 1 bind 1 no_percpu used_hw_stats delayed action order 2: tunnel_key set src_ip 10.1.0.109 dst_ip 10.1.1.18 key_id 16711697 dst_port 6081 And we can see here, TC only populates the dst_port, not the src_port into the tunnel key, even though the source port was in the tunnel(set()) action OVS requested. geneve_opts 0102:80:0018000b csum ttl 64 pipe index 6 ref 1 bind 1 no_percpu used_hw_stats delayed action order 3: mirred (Egress Redirect to device genev_sys_6081) stolen index 3 ref 1 bind 1 cookie 6daba3d87445d1774b63bf8bf316a101 no_percpu used_hw_stats delayed Despite of these warnings, the flow is finally offloaded and the traffic traverses this gw node well, only first packets of an ICMP sequence reach CPU (seen in tcpdump): The warning is a warning. It doesn't prevent the flow to be installed. Though the installed flow may be incorrect and the traffic may be handled in the wrong way. Enabling debug logs for tc should show what exacltly is wrong. # ovs-appctl dpctl/dump-flows type=offloaded tunnel(tun_id=0x10,src=10.1.0.107,dst=10.1.0.109,tp_dst=6081,geneve({class=0x102,type=0x80,len=4,0x50002}),flags(+key)),ct_state(-new-est-rel-rpl-trk),ct_label(0/0x3),recirc_id(0),in_port(4),eth(src=00:00:ba:a4:6e:ad,dst=00:01:ba:a4:6e:ad),eth_type(0x0800),ipv4(proto=1,tos=0/0x3,frag=no), packets:3192, bytes:312816, used:1.240s, actions:set(tunnel(tun_id=0xff0011,src=10.1.0.109,dst=10.1.1.18,ttl=64,tp_dst=6081,geneve({class=0x102,type=0x80,len=4,0x18000b}),flags(csum|key))),4 tunnel(tun_id=0xff0011,src=10.1.1.18,dst=10.1.0.109,tp_dst=6081,geneve({class=0x102,type=0x80,len=4,0xb0018}),flags(+key)),ct_state(-new-est-rel-rpl-trk),ct_label(0/0x3),recirc_id(0),in_port(4),eth(src=00:01:ba:a4:6e:ad,dst=00:00:ba:a4:6e:ad),eth_type(0x0800),ipv4(src=172.32.1.0/255.255.255.0,dst=172.32.0.4,proto=1,tos=0/0x3,ttl=63,frag=no), packets:3192, bytes:312816, used:1.240s, actions:set(tunnel(tun_id=0x11,src=10.1.0.109,dst=10.1.0.107,ttl=64,tp_dst=6081,geneve({class=0x102,type=0x80,len=4,0x10002}),flags(csum|key))),set(eth(src=d0:fe:00:00:00:1d,dst=0a:00:66:ec:f7:40)),set(ipv4(ttl=62)),4 tunnel(tun_id=0x10,src=10.1.0.105,dst=10.1.0.109,tp_dst=6081,geneve({class=0x102,type=0x80,len=4,0x60002}),flags(+key)),ct_state(-new-est-rel-rpl-trk),ct_label(0/0x3),recirc_id(0),in_port(4),eth(src=00:00:ba:a4:6e:ad,dst=00:01:ba:a4:6e:ad),eth_type(0x0800),ipv4(proto=1,tos=0/0x3,frag=no), packets:293, bytes:28714, used:1.240s, actions:set(tunnel(tun_id=0xff0011,src=10.1.0.109,dst=10.1.1.18,ttl=64,tp_dst=6081,geneve({class=0x102,type=0x80,len=4,0x18000b}),flags(csum|key))),4 tunnel(tun_id=0xff0011,src=10.1.1.18,dst=10.1.0.109,tp_dst=6081,geneve({class=0x102,type=0x80,len=4,0xb0018}),flags(+key)),ct_state(-new-est-rel-rpl-trk),ct_label(0/0x3),recirc_id(0),in_port(4),eth(src=00:01:ba:a4:6e:ad,dst=00:00:ba:a4:6e:ad),eth_type(0x0800),ipv4(src=172.32.1.0/255.255.255.0,dst=172.32.2.4,proto=1,tos=0/0x3,ttl=63,frag=no), packets:293, bytes:28714, used:1.240s, actions:set(tunnel(tun_id=0x17,src=10.1.0.109,dst=10.1.0.105,ttl=64,tp_dst=6081,geneve({class=0x102,type=0x80,len=4,0x10002}),flags(csum|key))),set(eth(src=d0:fe:00:00:00:8e,dst=0a:00:40:c2:76:a0)),set(ipv4(ttl=62)),4 tunnel(tun_id=0x10,src=10.1.0.104,dst=10.1.0.109,tp_dst=6081,geneve({class=0x102,type=0x80,len=4,0x30002}),flags(+key)),ct_state(-new-est-rel-rpl-trk),ct_label(0/0x3),recirc_id(0),in_port(4),eth(src=00:00:ba:a4:6e:ad,dst=00:01:ba:a4:6e:ad),eth_type(0x0800),ipv4(proto=6,tos=0/0x3,frag=no), packets:0, bytes:0, used:never, actions:set(tunnel(tun_id=0xff0011,src=10.1.0.109,dst=10.1.1.18,ttl=64,tp_dst=6081,geneve({class=0x102,type=0x80,len=4,0x18000b}),flags(csum|key))),4 tunnel(tun_id=0xff0011,src=10.1.1.18,dst=10.1.0.109,tp_dst=6081,geneve({class=0x102,type=0x80,len=4,0xb0018}),flags(+key)),ct_state(-new-est-rel-rpl-trk),ct_label(0/0x3),recirc_id(0),in_port(4),eth(src=00:01:ba:a4:6e:ad,dst=00:00:ba:a4:6e:ad),eth_type(0x0800),ipv4(src=169.254.96.0/255.255.252.0,dst=169.254.99.0,proto=6,tos=0/0x3,ttl=254,frag=no), packets:0, bytes:0, used:never, actions:set(tunnel(tun_id=0xe,src=10.1.0.109,dst=10.1.0.104,ttl=64,tp_dst=6081,geneve({class=0x102,type=0x80,len=4,0x20001}),flags(csum|key))),set(eth(src=10:00:ba:a4:6e:ad,dst=02:00:ba:a4:6e:ad)),set(ipv4(ttl=253)),4 I’m wonder, whether this is a known issue (I couldn’t find any related messages searching in internet). Could someone give any advice/help with this? Thanks in advance. Regards, Vladislav Odintsov _______________________________________________ discuss mailing list disc...@openvswitch.org<mailto:disc...@openvswitch.org> <mailto:disc...@openvswitch.org> https://mail.openvswitch.org/mailman/listinfo/ovs-discuss <https://mail.openvswitch.org/mailman/listinfo/ovs-discuss> Regards, Vladislav Odintsov _______________________________________________ discuss mailing list disc...@openvswitch.org<mailto:disc...@openvswitch.org> https://mail.openvswitch.org/mailman/listinfo/ovs-discuss Regards, Vladislav Odintsov _______________________________________________ discuss mailing list disc...@openvswitch.org<mailto:disc...@openvswitch.org> https://mail.openvswitch.org/mailman/listinfo/ovs-discuss
_______________________________________________ discuss mailing list disc...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-discuss