Hello, I noticed a big difference in the flow generated by northd between releases 24.09 and 25.03
In the 25.03 northd fail to find similar routes and form ecmp group. I append following information: 1. Testcase scenario that can be easily copy-pasted to ovn-ic.at 2. Test output if ran in 24.09 3. Test output if ran in 25.03 Could you please clarify is this real issue? Thank you, Alexander =============== TEST ===================== OVN_FOR_EACH_NORTHD([ AT_SETUP([ovn-ic -- east-west - 2az]) ovn_init_ic_db ovn-ic-nbctl ts-add rtb-1 ovn-ic-nbctl ts-add rtb-2 ovn_start az1 ovn_as az1 ovn_as az1 check ovn-ic-nbctl --wait=sb sync ovn_as az1 check ovn-nbctl set nb_global . options:ic-route-learn=true ovn_as az1 check ovn-nbctl set nb_global . options:ic-route-adv=true ovn_as az1 check ovn-nbctl ls-add subnet-A ovn_as az1 check ovn-nbctl lsp-add subnet-A subnet-A-up -- lsp-set-type subnet-A-up router -- lsp-set-addresses subnet-A-up router -- lsp-set-options subnet-A-up router-port=subnet-A ovn_as az1 check ovn-nbctl lsp-add subnet-A client -- lsp-set-addresses client "0a:00:43:1e:92:20 172.31.0.4" ovn_as az1 check ovn-nbctl lsp-add rtb-1 rtb-1-down1 -- lsp-set-type rtb-1-down1 router -- lsp-set-addresses rtb-1-down1 router -- lsp-set-options rtb-1-down1 router-port=rtb-1 ovn_as az1 check ovn-nbctl lsp-add rtb-2 rtb-2-down1 -- lsp-set-type rtb-2-down1 router -- lsp-set-addresses rtb-2-down1 router -- lsp-set-options rtb-2-down1 router-port=rtb-2 ovn_as az1 check ovn-nbctl lr-add vpc ovn_as az1 check ovn-nbctl lrp-add vpc subnet-A "d0:fe:00:00:00:14" "172.31.0.1/24" -- lrp-set-options subnet-A route_table=table1 ovn_as az1 check ovn-nbctl lrp-add vpc rtb-1 "00:00:a0:9e:9d:40" "169.254.100.1/27" -- lrp-set-options rtb-1 route_table=table1 ovn_as az1 check ovn-nbctl lrp-add vpc rtb-2 "00:00:60:15:b8:20" "169.254.100.33/27" -- lrp-set-options rtb-2 route_table=table2 ovn_start az2 ovn_as az2 ovn_as az2 check ovn-ic-nbctl --wait=sb sync ovn_as az2 check ovn-nbctl set nb_global . options:ic-route-learn=true ovn_as az2 check ovn-nbctl set nb_global . options:ic-route-adv=true ovn_as az2 check ovn-nbctl ls-add subnet-D ovn_as az2 check ovn-nbctl lsp-add subnet-D subnet-D-up -- lsp-set-type subnet-D-up router -- lsp-set-addresses subnet-D-up router -- lsp-set-options subnet-D-up router-port=subnet-D ovn_as az2 check ovn-nbctl lsp-add subnet-D filter2 -- lsp-set-addresses filter2 "0a:01:39:eb:b1:41 172.31.3.4" ovn_as az2 check ovn-nbctl lsp-add rtb-1 rtb-1-down2 -- lsp-set-type rtb-1-down2 router -- lsp-set-addresses rtb-1-down2 router -- lsp-set-options rtb-1-down2 router-port=rtb-1 ovn_as az2 check ovn-nbctl lsp-add rtb-2 rtb-2-down2 -- lsp-set-type rtb-2-down2 router -- lsp-set-addresses rtb-2-down2 router -- lsp-set-options rtb-2-down2 router-port=rtb-2 ovn_as az2 check ovn-nbctl lr-add vpc ovn_as az2 check ovn-nbctl lrp-add vpc subnet-D "d0:fe:00:00:00:17" "172.31.3.1/24" -- lrp-set-options subnet-D route_table=table2 ovn_as az2 check ovn-nbctl lrp-add vpc rtb-1 "00:01:a0:9e:9d:40" "169.254.100.2/27" -- lrp-set-options rtb-1 route_table=table1 ovn_as az2 check ovn-nbctl lrp-add vpc rtb-2 "00:01:60:15:b8:20" "169.254.100.34/27" -- lrp-set-options rtb-2 route_table=table2 check ovn-ic-nbctl --wait=sb sync ovn_as az1 ovn-nbctl list logical_router_static ovn_as az1 ovn-nbctl lr-route-list vpc ovn_as az1 ovn-sbctl lflow-list vpc | grep lr_in_ip_routing OVN_CLEANUP_IC([az1], [az2]) AT_CLEANUP ]) =============== CUT ===================== =============== OUTPUT 24.09.02 ===================== _uuid : ca00ec23-dbb7-4fe1-87ab-04765efa5d7f bfd : [] external_ids : {ic-learned-route="cde67ffc-bcfa-4470-bd8e-93ac59401344"} ip_prefix : "172.31.3.1/24" nexthop : "169.254.100.2" options : {origin=connected} output_port : [] policy : [] route_table : "" _uuid : 421525df-80d0-4a92-ad8d-e00dde47d60d bfd : [] external_ids : {ic-learned-route="fa63cc12-5fdf-44df-9b07-e8006641d7b4"} ip_prefix : "172.31.3.1/24" nexthop : "169.254.100.34" options : {origin=connected} output_port : [] policy : [] route_table : "" IPv4 Routes Route Table <main>: 172.31.3.0/24 169.254.100.2 dst-ip (learned) ecmp 172.31.3.0/24 169.254.100.34 dst-ip (learned) ecmp table=13(lr_in_ip_routing_pre), priority=100 , match=(inport == "rtb-1"), action=(reg7 = 2; next;) table=13(lr_in_ip_routing_pre), priority=100 , match=(inport == "rtb-2"), action=(reg7 = 1; next;) table=13(lr_in_ip_routing_pre), priority=100 , match=(inport == "subnet-A"), action=(reg7 = 2; next;) table=13(lr_in_ip_routing_pre), priority=0 , match=(1), action=(reg7 = 0; next;) table=14(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;) table=14(lr_in_ip_routing ), priority=194 , match=(inport == "rtb-1" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[0..15] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:a0ff:fe9e:9d40; eth.src = 00:00:a0:9e:9d:40; outport = "rtb-1"; flags.loopback = 1; next;) table=14(lr_in_ip_routing ), priority=194 , match=(inport == "rtb-2" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[0..15] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:60ff:fe15:b820; eth.src = 00:00:60:15:b8:20; outport = "rtb-2"; flags.loopback = 1; next;) table=14(lr_in_ip_routing ), priority=194 , match=(inport == "subnet-A" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[0..15] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::d2fe:ff:fe00:14; eth.src = d0:fe:00:00:00:14; outport = "subnet-A"; flags.loopback = 1; next;) table=14(lr_in_ip_routing ), priority=83 , match=(ip4.dst == 169.254.100.0/27), action=(ip.ttl--; reg8[0..15] = 0; reg0 = ip4.dst; reg1 = 169.254.100.1; eth.src = 00:00:a0:9e:9d:40; outport = "rtb-1"; flags.loopback = 1; next;) table=14(lr_in_ip_routing ), priority=83 , match=(ip4.dst == 169.254.100.32/27), action=(ip.ttl--; reg8[0..15] = 0; reg0 = ip4.dst; reg1 = 169.254.100.33; eth.src = 00:00:60:15:b8:20; outport = "rtb-2"; flags.loopback = 1; next;) table=14(lr_in_ip_routing ), priority=74 , match=(ip4.dst == 172.31.0.0/24), action=(ip.ttl--; reg8[0..15] = 0; reg0 = ip4.dst; reg1 = 172.31.0.1; eth.src = d0:fe:00:00:00:14; outport = "subnet-A"; flags.loopback = 1; next;) table=14(lr_in_ip_routing ), priority=74 , match=(ip4.dst == 172.31.3.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[0..15] = 1; reg8[16..31] = select(1, 2);) table=14(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;) table=15(lr_in_ip_routing_ecmp), priority=150 , match=(reg8[0..15] == 0), action=(next;) table=15(lr_in_ip_routing_ecmp), priority=100 , match=(reg8[0..15] == 1 && reg8[16..31] == 1), action=(reg0 = 169.254.100.34; reg1 = 169.254.100.33; eth.src = 00:00:60:15:b8:20; outport = "rtb-2"; next;) table=15(lr_in_ip_routing_ecmp), priority=100 , match=(reg8[0..15] == 1 && reg8[16..31] == 2), action=(reg0 = 169.254.100.2; reg1 = 169.254.100.1; eth.src = 00:00:a0:9e:9d:40; outport = "rtb-1"; next;) table=15(lr_in_ip_routing_ecmp), priority=0 , match=(1), action=(drop;) =============== CUT ===================== =============== OUTPUT 25.03.00 ===================== _uuid : 18e0b3b1-4d5b-4e8f-937b-d5d7b33d3f9c bfd : [] external_ids : {ic-learned-route="974ae0e0-6b21-4e5f-9a61-5ad329a7b3af"} ip_prefix : "172.31.3.1/24" nexthop : "169.254.100.34" options : {origin=connected} output_port : [] policy : [] route_table : "" selection_fields : [] _uuid : a00be0c2-48e1-406d-945d-e0084888e10d bfd : [] external_ids : {ic-learned-route="613ac324-26cb-4b78-b0bc-3a91be53fe12"} ip_prefix : "172.31.3.1/24" nexthop : "169.254.100.2" options : {origin=connected} output_port : [] policy : [] route_table : "" selection_fields : [] IPv4 Routes Route Table <main>: 172.31.3.0/24 169.254.100.2 dst-ip (learned) ecmp 172.31.3.0/24 169.254.100.34 dst-ip (learned) ecmp table=14(lr_in_ip_routing_pre), priority=100 , match=(inport == "rtb-1"), action=(reg7 = 1; next;) table=14(lr_in_ip_routing_pre), priority=100 , match=(inport == "rtb-2"), action=(reg7 = 2; next;) table=14(lr_in_ip_routing_pre), priority=100 , match=(inport == "subnet-A"), action=(reg7 = 1; next;) table=14(lr_in_ip_routing_pre), priority=0 , match=(1), action=(reg7 = 0; next;) table=15(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;) table=15(lr_in_ip_routing ), priority=518 , match=(inport == "rtb-1" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[0..15] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:a0ff:fe9e:9d40; eth.src = 00:00:a0:9e:9d:40; outport = "rtb-1"; flags.loopback = 1; reg9[9] = 0; next;) table=15(lr_in_ip_routing ), priority=518 , match=(inport == "rtb-2" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[0..15] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:60ff:fe15:b820; eth.src = 00:00:60:15:b8:20; outport = "rtb-2"; flags.loopback = 1; reg9[9] = 0; next;) table=15(lr_in_ip_routing ), priority=518 , match=(inport == "subnet-A" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[0..15] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::d2fe:ff:fe00:14; eth.src = d0:fe:00:00:00:14; outport = "subnet-A"; flags.loopback = 1; reg9[9] = 0; next;) table=15(lr_in_ip_routing ), priority=222 , match=(ip4.dst == 169.254.100.0/27), action=(ip.ttl--; reg8[0..15] = 0; reg0 = ip4.dst; reg5 = 169.254.100.1; eth.src = 00:00:a0:9e:9d:40; outport = "rtb-1"; flags.loopback = 1; reg9[9] = 1; next;) table=15(lr_in_ip_routing ), priority=222 , match=(ip4.dst == 169.254.100.32/27), action=(ip.ttl--; reg8[0..15] = 0; reg0 = ip4.dst; reg5 = 169.254.100.33; eth.src = 00:00:60:15:b8:20; outport = "rtb-2"; flags.loopback = 1; reg9[9] = 1; next;) table=15(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 172.31.0.0/24), action=(ip.ttl--; reg8[0..15] = 0; reg0 = ip4.dst; reg5 = 172.31.0.1; eth.src = d0:fe:00:00:00:14; outport = "subnet-A"; flags.loopback = 1; reg9[9] = 1; next;) table=15(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 172.31.3.0/24), action=(ip.ttl--; reg8[0..15] = 0; reg0 = 169.254.100.2; reg5 = 169.254.100.1; eth.src = 00:00:a0:9e:9d:40; outport = "rtb-1"; flags.loopback = 1; reg9[9] = 1; next;) table=15(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 172.31.3.0/24), action=(ip.ttl--; reg8[0..15] = 0; reg0 = 169.254.100.34; reg5 = 169.254.100.33; eth.src = 00:00:60:15:b8:20; outport = "rtb-2"; flags.loopback = 1; reg9[9] = 1; next;) table=15(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;) table=16(lr_in_ip_routing_ecmp), priority=150 , match=(reg8[0..15] == 0), action=(next;) table=16(lr_in_ip_routing_ecmp), priority=0 , match=(1), action=(drop;) =============== CUT ===================== _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev