Hi Lorenzo, Dumitru,
Looking for this patch in [0], its state is Superseded. But it's the correct version. If it was superseded by other patch that fix the same thing, let me know, please. [0] https://patchwork.ozlabs.org/project/ovn/patch/[email protected]/ Regards, Lucas Em sex., 17 de jul. de 2026 às 14:18, Lucas Vargas Dias <[email protected]> escreveu: > > > Em qua., 15 de jul. de 2026 às 15:26, Lucas Vargas Dias > <[email protected]> escreveu: > >> If logical router has more than one LRP as gateway router port >> and dynamic routing configured, dynamic-routing-port-name could be >> used to specify the LRP that will be used to dynamic routing. >> However, if all LRPs learning routes, routes from LRP without >> dynamic-routing-port-name must be flushed. >> This happens when LRPs are scheduled in the same chassis. >> >> Signed-off-by: Lucas Vargas Dias <[email protected]> >> --- >> > Recheck-request: github-robot-_Build_and_Test > > >> controller/ovn-controller.c | 15 ++++ >> controller/route-exchange.c | 68 +++++++++++++-- >> controller/route-exchange.h | 1 + >> tests/multinode.at | 142 +++++++++++++++++++++++++++++++ >> tests/ovn-inc-proc-graph-dump.at | 2 + >> tests/system-ovn.at | 133 +++++++++++++++++++++++++++++ >> 6 files changed, 355 insertions(+), 6 deletions(-) >> >> diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c >> index 552e87b53..0e698d725 100644 >> --- a/controller/ovn-controller.c >> +++ b/controller/ovn-controller.c >> @@ -5674,11 +5674,24 @@ en_route_exchange_run(struct engine_node *node, >> void *data) >> } >> >> vector_clear(&rt_notify->watches); >> + const struct ovsrec_open_vswitch_table *ovs_table = >> + EN_OVSDB_GET(engine_get_input("OVS_open_vswitch", node)); >> + const char *chassis_id = get_ovs_chassis_id(ovs_table); >> + ovs_assert(chassis_id); >> + >> + struct ovsdb_idl_index *sbrec_chassis_by_name = >> + engine_ovsdb_node_get_index( >> + engine_get_input("SB_chassis", node), >> + "name"); >> + const struct sbrec_chassis *chassis >> + = chassis_lookup_by_name(sbrec_chassis_by_name, chassis_id); >> + ovs_assert(chassis); >> >> struct route_exchange_ctx_in r_ctx_in = { >> .ovnsb_idl_txn = engine_get_context()->ovnsb_idl_txn, >> .sbrec_learned_route_by_datapath = >> sbrec_learned_route_by_datapath, >> .sbrec_port_binding_by_name = sbrec_port_binding_by_name, >> + .chassis = chassis, >> .announce_routes = &route_data->announce_routes, >> }; >> struct route_exchange_ctx_out r_ctx_out = { >> @@ -6996,6 +7009,8 @@ inc_proc_ovn_controller_init( >> engine_add_input(&en_route, &en_sb_datapath_binding, >> route_sb_datapath_binding_handler); >> >> + engine_add_input(&en_route_exchange, &en_ovs_open_vswitch, NULL); >> + engine_add_input(&en_route_exchange, &en_sb_chassis, NULL); >> engine_add_input(&en_route_exchange, &en_route, NULL); >> engine_add_input(&en_route_exchange, &en_sb_learned_route, >> engine_noop_handler); >> diff --git a/controller/route-exchange.c b/controller/route-exchange.c >> index b86eb43bf..027375071 100644 >> --- a/controller/route-exchange.c >> +++ b/controller/route-exchange.c >> @@ -86,7 +86,7 @@ maintained_route_table_add(uint32_t table_id) >> hmap_insert(&_maintained_route_tables, &mrt->node, hash); >> } >> >> -static void >> +static struct route_entry * >> route_add_entry(struct hmap *routes, >> const struct sbrec_learned_route *sb_route, >> bool stale) >> @@ -102,6 +102,7 @@ route_add_entry(struct hmap *routes, >> hash = hash_string(sb_route->ip_prefix, hash); >> >> hmap_insert(routes, &route_e->hmap_node, hash); >> + return route_e; >> } >> >> static struct route_entry * >> @@ -144,17 +145,36 @@ sb_sync_learned_routes(const struct vector >> *learned_routes, >> struct ovsdb_idl_txn *ovnsb_idl_txn, >> struct ovsdb_idl_index >> *sbrec_port_binding_by_name, >> struct ovsdb_idl_index >> *sbrec_learned_route_by_datapath, >> - bool *sb_changes_pending) >> + bool *sb_changes_pending, >> + const struct sbrec_chassis *chassis) >> { >> struct hmap sync_routes = HMAP_INITIALIZER(&sync_routes); >> const struct sbrec_learned_route *sb_route; >> - struct route_entry *route_e; >> + struct hmapx lrp_with_dr_port_name = >> + HMAPX_INITIALIZER(&lrp_with_dr_port_name); >> >> struct sbrec_learned_route *filter = >> >> sbrec_learned_route_index_init_row(sbrec_learned_route_by_datapath); >> sbrec_learned_route_index_set_datapath(filter, datapath); >> SBREC_LEARNED_ROUTE_FOR_EACH_EQUAL (sb_route, filter, >> sbrec_learned_route_by_datapath) >> { >> + const struct sbrec_port_binding *cr_pb = >> + lport_get_cr_port(sbrec_port_binding_by_name, >> + sb_route->logical_port, NULL); >> + struct route_entry *route_e = NULL; >> + >> + /* Collect the set of unique logical ports we learned routes on. >> The >> + * (potentially expensive) dynamic-routing-port-name lookups are >> + * postponed until after the loop so that they are performed >> once per >> + * logical port instead of once per learned route. */ >> + hmapx_add(&lrp_with_dr_port_name, >> + CONST_CAST(void *, sb_route->logical_port)); >> + >> + if (sb_route->logical_port->chassis == chassis || >> + (cr_pb && cr_pb->chassis == chassis)) { >> + route_e = route_add_entry(&sync_routes, sb_route, false); >> + } >> + >> /* If the port is not local we don't care about it. >> * Some other ovn-controller will handle it. >> * We may not use smap_get since the value might be validly >> NULL. */ >> @@ -162,10 +182,43 @@ sb_sync_learned_routes(const struct vector >> *learned_routes, >> sb_route->logical_port->logical_port)) { >> continue; >> } >> + if (route_e) { >> + route_e->stale = true; >> + continue; >> + } >> route_add_entry(&sync_routes, sb_route, true); >> } >> sbrec_learned_route_index_destroy_row(filter); >> >> + /* Drop the logical ports that don't have a >> dynamic-routing-port-name set, >> + * either directly or via their distributed gateway port. */ >> + struct hmapx_node *lrp_node; >> + HMAPX_FOR_EACH_SAFE (lrp_node, &lrp_with_dr_port_name) { >> + const struct sbrec_port_binding *lrp = lrp_node->data; >> + const struct sbrec_port_binding *cr_pb = >> + lport_get_cr_port(sbrec_port_binding_by_name, lrp, NULL); >> + const char *dynamic_routing_port_name = >> + smap_get(&lrp->options, "dynamic-routing-port-name"); >> + if (!dynamic_routing_port_name && cr_pb) { >> + dynamic_routing_port_name = >> + smap_get(&cr_pb->options, "dynamic-routing-port-name"); >> + } >> + if (!dynamic_routing_port_name) { >> + hmapx_delete(&lrp_with_dr_port_name, lrp_node); >> + } >> + } >> + >> + if (!hmapx_is_empty(&lrp_with_dr_port_name)) { >> + struct route_entry *route_e; >> + HMAP_FOR_EACH (route_e, hmap_node, &sync_routes) { >> + if (!hmapx_contains(&lrp_with_dr_port_name, >> + route_e->sb_route->logical_port)) { >> + route_e->stale = true; >> + } >> + } >> + } >> + hmapx_destroy(&lrp_with_dr_port_name); >> + >> struct re_nl_received_route_node *learned_route; >> VECTOR_FOR_EACH_PTR (learned_routes, learned_route) { >> char *ip_prefix = normalize_v46_prefix(&learned_route->prefix, >> @@ -195,8 +248,9 @@ sb_sync_learned_routes(const struct vector >> *learned_routes, >> continue; >> } >> >> - route_e = route_lookup(&sync_routes, datapath, >> - logical_port, ip_prefix, nexthop); >> + struct route_entry *route_e = >> + route_lookup(&sync_routes, datapath, >> + logical_port, ip_prefix, nexthop); >> if (route_e) { >> route_e->stale = false; >> } else { >> @@ -217,6 +271,7 @@ sb_sync_learned_routes(const struct vector >> *learned_routes, >> free(nexthop); >> } >> >> + struct route_entry *route_e; >> HMAP_FOR_EACH_POP (route_e, hmap_node, &sync_routes) { >> if (route_e->stale) { >> sbrec_learned_route_delete(route_e->sb_route); >> @@ -363,7 +418,8 @@ route_exchange_run(const struct route_exchange_ctx_in >> *r_ctx_in, >> r_ctx_in->ovnsb_idl_txn, >> >> r_ctx_in->sbrec_port_binding_by_name, >> sbrec_learned_route_by_datapath, >> - &r_ctx_out->sb_changes_pending); >> + &r_ctx_out->sb_changes_pending, >> + r_ctx_in->chassis); >> } >> vector_push(r_ctx_out->route_table_watches, &arte->table_id); >> vector_destroy(&received_routes); >> diff --git a/controller/route-exchange.h b/controller/route-exchange.h >> index 25db35568..a1ef4a359 100644 >> --- a/controller/route-exchange.h >> +++ b/controller/route-exchange.h >> @@ -24,6 +24,7 @@ struct route_exchange_ctx_in { >> struct ovsdb_idl_txn *ovnsb_idl_txn; >> struct ovsdb_idl_index *sbrec_port_binding_by_name; >> struct ovsdb_idl_index *sbrec_learned_route_by_datapath; >> + const struct sbrec_chassis *chassis; >> >> /* Contains struct advertise_datapath_entry */ >> const struct hmap *announce_routes; >> diff --git a/tests/multinode.at b/tests/multinode.at >> index 44faceb53..eec17502f 100644 >> --- a/tests/multinode.at >> +++ b/tests/multinode.at >> @@ -3034,6 +3034,148 @@ OVS_WAIT_UNTIL([m_as ovn-gw-2 ip netns exec >> frr-ns ping -W 1 -c 1 172.16.10.2]) >> >> AT_CLEANUP >> >> +AT_SETUP([ovn multinode dynamic-routing - BGP learned routes with router >> filter name and multiple DGPs]) >> + >> +# This is the multinode counterpart of the system test >> +# "dynamic-routing - BGP learned routes with router filter name and >> multiple >> +# DGPs": a single logical router with dynamic routing enabled has two >> +# distributed gateway ports scheduled on different chassis. Both LRPs >> are used >> +# for dynamic routing and each has its own dynamic-routing-port-name >> filter >> +# resolving to the interface local to the chassis hosting the port. >> +# >> +# Each chassis learns a route for the same prefix from its own VRF, so >> both >> +# gateway ports learn it. Because every LRP has a >> dynamic-routing-port-name >> +# that resolves to a local interface, neither route is flushed: the route >> +# learned on ovn-gw-1 (lrp-local-bgp-port) and the route learned on >> ovn-gw-2 >> +# (lrp-dgp-dummy) both remain. >> +# >> +# Topology: >> +# >> +# public ls-dummy >> +# (local-bgp-port, ovn-gw-1) (ovn-gw-2) >> +# | | >> +# lrp-local-bgp-port lrp-dgp-dummy >> +# (DGP @ ovn-gw-1, (DGP @ ovn-gw-2, >> +# port-name local-bgp-port) port-name dummy-bgp-port) >> +# \ / >> +# +------------- lr-frr -----------+ >> +# (dynamic-routing, vrf-id $vrf) >> + >> +# Check that ovn-fake-multinode setup is up and running. >> +check_fake_multinode_setup >> + >> +CHECK_VRF() >> + >> +# Delete the multinode NB and OVS resources before starting the test. >> +cleanup_multinode_resources >> + >> +CHECK_VRF() >> + >> +vrf=1000 >> + >> +# Create the VRF manually on both gateway chassis >> (dynamic-routing-maintain-vrf >> +# is false, so OVN does not create it) and learn/read routes from table >> $vrf. >> +for gw in ovn-gw-1 ovn-gw-2; do >> + check m_as $gw ip link add vrf-bgp type vrf table $vrf >> + on_exit "m_as $gw ip link del vrf-bgp" >> + check m_as $gw ip link set vrf-bgp up >> +done >> + >> +# Create the logical router with dynamic routing in VRF $vrf. >> +check multinode_nbctl lr-add lr-frr >> +check multinode_nbctl set Logical_Router lr-frr \ >> + options:dynamic-routing=true \ >> + options:dynamic-routing-vrf-id=$vrf \ >> + options:dynamic-routing-redistribute=static >> + >> +# The DGP that is used for dynamic routing, scheduled on ovn-gw-1. >> +check multinode_nbctl lrp-add lr-frr lrp-local-bgp-port >> 00:00:00:00:00:03 20.0.0.3/24 \ >> + -- set Logical_Router_Port lrp-local-bgp-port \ >> + options:dynamic-routing-maintain-vrf=false \ >> + -- set Logical_Router_Port lrp-local-bgp-port \ >> + options:routing-protocol-redirect=local-bgp-port >> +check multinode_nbctl lrp-set-gateway-chassis lrp-local-bgp-port ovn-gw-1 >> + >> +check multinode_nbctl ls-add public >> +check multinode_nbctl lsp-add-router-port public public-lr-frr >> lrp-local-bgp-port >> +check multinode_nbctl lsp-add public local-bgp-port \ >> + -- lsp-set-addresses local-bgp-port unknown >> + >> +# The second DGP used for dynamic routing, scheduled on ovn-gw-2. >> bgp-dummy is >> +# not an OVN logical port, so the dynamic-routing-port-name filter is >> resolved >> +# through the dynamic-routing-port-mapping configured on ovn-gw-2 below. >> +check multinode_nbctl lrp-add lr-frr lrp-dgp-dummy 00:00:00:00:00:04 >> 20.0.1.3/24 \ >> + -- set Logical_Router_Port lrp-dgp-dummy \ >> + options:dynamic-routing-maintain-vrf=false >> +check multinode_nbctl lrp-set-gateway-chassis lrp-dgp-dummy ovn-gw-2 >> + >> +check multinode_nbctl ls-add ls-dummy >> +check multinode_nbctl lsp-add-router-port ls-dummy lsp-dummy >> lrp-dgp-dummy >> + >> +check multinode_nbctl --wait=hv sync >> + >> +# Bind local-bgp-port on ovn-gw-1 and move its interface into the VRF. >> The >> +# dynamic-routing-port-name filter will be resolved to this interface >> name. >> +check m_as ovn-gw-1 ovs-vsctl add-port br-int local-bgp-port \ >> + -- set Interface local-bgp-port type=internal \ >> + -- set Interface local-bgp-port external_ids:iface-id=local-bgp-port >> +on_exit "m_as ovn-gw-1 ovs-vsctl del-port br-int local-bgp-port" >> +check m_as ovn-gw-1 ip link set local-bgp-port master vrf-bgp >> +check m_as ovn-gw-1 ip link set local-bgp-port address 00:00:00:00:00:03 >> +check m_as ovn-gw-1 ip addr add dev local-bgp-port 20.0.0.3/24 >> +check m_as ovn-gw-1 ip link set local-bgp-port up >> + >> +# ovn-gw-2 hosts lrp-dgp-dummy. Add an interface to its VRF so a route >> can be >> +# present in the VRF table and get learned on this gateway port, and map >> the >> +# dynamic-routing-port-name (dummy-bgp-port) to this interface so the >> filter >> +# resolves locally on ovn-gw-2. >> +check m_as ovn-gw-2 ip link add bgp-dummy type dummy >> +on_exit "m_as ovn-gw-2 ip link del bgp-dummy" >> +check m_as ovn-gw-2 ip link set bgp-dummy master vrf-bgp >> +check m_as ovn-gw-2 ip addr add dev bgp-dummy 20.0.1.3/24 >> +check m_as ovn-gw-2 ip link set bgp-dummy up >> + >> +check m_as ovn-gw-2 ovs-vsctl set open . \ >> + external-ids:dynamic-routing-port-mapping="dummy-bgp-port=bgp-dummy" >> +on_exit "m_as ovn-gw-2 ovs-vsctl remove open . external-ids >> dynamic-routing-port-mapping" >> + >> +m_wait_for_ports_up >> +check multinode_nbctl --wait=hv sync >> + >> +# Both gateway ports are flagged for dynamic routing. >> +m_check_row_count Port_Binding 1 logical_port=cr-lrp-local-bgp-port >> 'options:dynamic-routing=true' >> +m_check_row_count Port_Binding 1 logical_port=cr-lrp-dgp-dummy >> 'options:dynamic-routing=true' >> + >> +# Simulate a route learned via a dynamic routing protocol in each >> chassis' VRF >> +# for the same prefix. >> +check m_as ovn-gw-1 ip route add 10.10.3.0/24 via 20.0.0.25 vrf vrf-bgp >> proto bgp >> +check m_as ovn-gw-2 ip route add 10.10.3.0/24 via 20.0.1.25 vrf vrf-bgp >> proto bgp >> + >> +# Each chassis learns the route on its own gateway port, so there are two >> +# Learned_Route rows for the prefix. >> +m_wait_row_count Learned_Route 2 ip_prefix=10.10.3.0/24 >> + >> +# Configure a dynamic-routing-port-name filter on both LRPs, each >> resolving to >> +# the interface local to the chassis hosting the port: >> lrp-local-bgp-port -> >> +# local-bgp-port (ovn-gw-1) and lrp-dgp-dummy -> dummy-bgp-port >> (ovn-gw-2, via >> +# the port-mapping configured above). >> +check multinode_nbctl set Logical_Router_Port lrp-local-bgp-port \ >> + options:dynamic-routing-port-name=local-bgp-port >> +check multinode_nbctl --wait=hv set Logical_Router_Port lrp-dgp-dummy \ >> + options:dynamic-routing-port-name=dummy-bgp-port >> + >> +local_lp=$(m_fetch_column port_binding _uuid >> logical_port=lrp-local-bgp-port) >> +dummy_lp=$(m_fetch_column port_binding _uuid logical_port=lrp-dgp-dummy) >> + >> +# Both filters resolve to a local interface, so no route is flushed: the >> route >> +# learned on ovn-gw-1 (lrp-local-bgp-port) and the route learned on >> ovn-gw-2 >> +# (lrp-dgp-dummy) both remain. >> +m_wait_row_count Learned_Route 2 ip_prefix=10.10.3.0/24 >> +m_wait_row_count Learned_Route 1 ip_prefix=10.10.3.0/24 >> logical_port=$local_lp >> +m_wait_row_count Learned_Route 1 ip_prefix=10.10.3.0/24 >> logical_port=$dummy_lp >> + >> +AT_CLEANUP >> + >> AT_SETUP([HA: Check for missing garp on leader when BFD goes back up]) >> # Network topology >> # >> ┌────────────────────────────────────────────────────────────────────────────────────────────────────────┐ >> diff --git a/tests/ovn-inc-proc-graph-dump.at b/tests/ >> ovn-inc-proc-graph-dump.at >> index 269766ded..5c87296fe 100644 >> --- a/tests/ovn-inc-proc-graph-dump.at >> +++ b/tests/ovn-inc-proc-graph-dump.at >> @@ -461,6 +461,8 @@ digraph "Incremental-Processing-Engine" { >> route_table_notify [[style=filled, shape=box, fillcolor=white, >> label="route_table_notify"]]; >> route_exchange_status [[style=filled, shape=box, fillcolor=white, >> label="route_exchange_status"]]; >> route_exchange [[style=filled, shape=box, fillcolor=white, >> label="route_exchange"]]; >> + OVS_open_vswitch -> route_exchange [[label=""]]; >> + SB_chassis -> route_exchange [[label=""]]; >> route -> route_exchange [[label=""]]; >> SB_learned_route -> route_exchange >> [[label="engine_noop_handler"]]; >> SB_port_binding -> route_exchange [[label="engine_noop_handler"]]; >> diff --git a/tests/system-ovn.at b/tests/system-ovn.at >> index 17b4dcb3d..8c31bd0c6 100644 >> --- a/tests/system-ovn.at >> +++ b/tests/system-ovn.at >> @@ -21998,3 +21998,136 @@ OVS_TRAFFIC_VSWITCHD_STOP(["/failed to query >> port patch-.*/d >> >> AT_CLEANUP >> ]) >> + >> +OVN_FOR_EACH_NORTHD([ >> +AT_SETUP([dynamic-routing - BGP learned routes with router filter name >> and multiple DGPs]) >> + >> +# This test validates that BGP learned routes work correctly: >> +# 1. Routes added to the VRF appear in Learned_Route table >> +# 2. Remove routes learned in LRPs in same hypervisor when configure >> dynamic-routing-port-name >> +# 3. Keep learned route just in LRP with dynamic-routing-port-name >> configured. >> +# >> +# Topology: >> +# +---------+ >> +# | public | >> +# +----+----+ >> +# | >> +# +----+---+ +---------------+ >> +# | lr-frr |-----| lrp-dgp-dummy | (dynamic-routing-port-name NOT >> configured (hv1)) >> +# +----+---+ +---------------+ >> +# | >> +# +------+-----------+ >> +# |lrp-local-bgp-port| (dynamic-routing-port-name configured (hv1)) >> +# +------------------+ >> + >> +ovn_start >> +OVS_TRAFFIC_VSWITCHD_START() >> +ADD_BR([br-int]) >> +ADD_BR([br-ex]) >> + >> +check ovs-ofctl add-flow br-ex action=normal >> + >> +# Set external-ids in br-int needed for ovn-controller >> +check ovs-vsctl \ >> + -- set Open_vSwitch . external-ids:system-id=hv1 \ >> + -- set Open_vSwitch . >> external-ids:ovn-remote=unix:$ovs_base/ovn-sb/ovn-sb.sock \ >> + -- set Open_vSwitch . external-ids:ovn-encap-type=geneve \ >> + -- set Open_vSwitch . external-ids:ovn-encap-ip=169.0.0.1 \ >> + -- set bridge br-int fail-mode=secure >> other-config:disable-in-band=true >> + >> +# Configure bridge mappings for localnet. >> +check ovs-vsctl set Open_vSwitch . >> external-ids:ovn-bridge-mappings=phys:br-ex >> + >> +vrf=10 >> +VRF_RESERVE([$vrf]) >> + >> +# Start ovn-controller. >> +start_daemon ovn-controller >> + >> +check ip link add vrf-$vrf type vrf table $vrf >> +on_exit "ip link del vrf-$vrf" >> +check ip link set vrf-$vrf up >> + >> +# Create public logical switch with localnet port. >> +check ovn-nbctl ls-add public >> +check ovn-nbctl lsp-add-localnet-port public ln_port phys >> + >> +# Create lr-frr with dynamic routing in VRF $vrf. >> +check ovn-nbctl lr-add lr-frr \ >> + -- set Logical_Router lr-frr \ >> + options:dynamic-routing=true \ >> + options:dynamic-routing-vrf-id=$vrf \ >> + options:dynamic-routing-redistribute=static >> + >> +check ovn-nbctl lrp-add lr-frr lrp-local-bgp-port 00:00:00:00:00:03 >> 20.0.0.3/24 \ >> + -- set Logical_Router_Port lrp-local-bgp-port >> options:dynamic-routing-maintain-vrf=false \ >> + -- set Logical_Router_Port lrp-local-bgp-port >> options:routing-protocol-redirect=local-bgp-port >> + >> +check ovn-nbctl lrp-set-gateway-chassis lrp-local-bgp-port hv1 >> +check ovn-nbctl lsp-add-router-port public public-lr-frr >> lrp-local-bgp-port >> + >> +check ovn-nbctl lrp-add lr-frr lrp-dgp-dummy 00:00:00:00:00:04 >> 20.0.1.3/24 >> +check ovn-nbctl lrp-set-gateway-chassis lrp-dgp-dummy hv1 >> +check ovn-nbctl ls-add ls-dummy >> +check ovn-nbctl lsp-add-router-port ls-dummy lsp-dummy lrp-dgp-dummy >> + >> +# Create local-bgp-port in VRF 10. >> +check ovs-vsctl add-port br-int local-bgp-port \ >> + -- set Interface local-bgp-port type=internal \ >> + -- set Interface local-bgp-port external_ids:iface-id=local-bgp-port >> + >> +check ovn-nbctl lsp-add public local-bgp-port \ >> + -- lsp-set-addresses local-bgp-port unknown >> + >> +# Configure local-bgp-port interface and add to VRF. >> +check ip link set local-bgp-port master vrf-$vrf >> +check ip link set local-bgp-port address 00:00:00:00:00:03 >> +check ip addr add dev local-bgp-port 20.0.0.3/24 >> +check ip link set local-bgp-port up >> + >> +# Wait for everything to be ready. >> +wait_for_ports_up >> +check ovn-nbctl --wait=hv sync >> + >> +# Check lrp-local-bgp-port has dynamic-routing option set. >> +check_row_count Port_Binding 1 logical_port=cr-lrp-local-bgp-port >> 'options:dynamic-routing=true' >> +check_row_count Port_Binding 1 logical_port=cr-lrp-dgp-dummy >> 'options:dynamic-routing=true' >> + >> +# Add static routes. >> +check ovn-nbctl lr-route-add lr-frr 10.10.2.1 20.0.0.42 >> lrp-local-bgp-port >> + >> +# Verify advertised routes exist. >> +AS_BOX([Advertised_Route]) >> +wait_row_count Advertised_Route 1 ip_prefix=10.10.2.1 >> + >> +# Add a route to the VRF (simulating BGP learning a route). >> +check ip route add 10.10.3.1 via 20.0.0.25 vrf vrf-$vrf proto zebra >> + >> +# Verify learned route appears in SB database. >> +check_row_count Learned_Route 2 ip_prefix=10.10.3.1 >> + >> +check ovn-nbctl --wait=hv set Logical_Router_Port lrp-local-bgp-port >> options:dynamic-routing-port-name=local-bgp-port >> +lp=$(fetch_column port_binding _uuid logical_port=lrp-local-bgp-port) >> + >> +check_row_count Learned_Route 1 ip_prefix=10.10.3.1 >> +check_row_count Learned_Route 1 ip_prefix=10.10.3.1 logical_port=$lp >> + >> +check ovn-nbctl --wait=hv ls-del ls-dummy >> +check ovn-nbctl --wait=hv ls-del public >> +check ovn-nbctl --wait=hv lr-del lr-frr >> + >> +# Stop ovn-controller >> +OVN_CLEANUP_CONTROLLER([hv1]) >> +check ovn-nbctl --wait=sb sync >> + >> +# Verify routes are removed in SB database. >> +wait_row_count Learned_Route 0 >> + >> +OVN_CLEANUP_NORTHD >> + >> +as >> +OVS_TRAFFIC_VSWITCHD_STOP(["/.*error receiving.*/d >> +/failed to query port patch-.*/d >> +/.*terminating with signal 15.*/d"]) >> +AT_CLEANUP >> +]) >> -- >> 2.43.0 >> >> -- _‘Esta mensagem é direcionada apenas para os endereços constantes no cabeçalho inicial. Se você não está listado nos endereços constantes no cabeçalho, pedimos-lhe que desconsidere completamente o conteúdo dessa mensagem e cuja cópia, encaminhamento e/ou execução das ações citadas estão imediatamente anuladas e proibidas’._ * **‘Apesar do Magazine Luiza tomar todas as precauções razoáveis para assegurar que nenhum vírus esteja presente nesse e-mail, a empresa não poderá aceitar a responsabilidade por quaisquer perdas ou danos causados por esse e-mail ou por seus anexos’.* _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
