On 8/5/26 1:55 PM, Lucas Vargas Dias wrote:
> Hi Lorenzo, Dumitru,
> 

Hi Lucas,

> 
> 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.
> 

I checked and I think it may have been moved to superseded by accident.
I'll change it back to "new" and will try to review it as soon as possible.

Regards,
Dumitru

> [0] https://patchwork.ozlabs.org/project/ovn/
> patch/[email protected]/ <https://
> patchwork.ozlabs.org/project/ovn/patch/20260715182630.163873-1-
> [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 <http://multinode.at>               | 142 ++
>         +++++++++++++++++++++++++++++
>          tests/ovn-inc-proc-graph-dump.at <http://ovn-inc-proc-graph-
>         dump.at> |   2 +
>          tests/system-ovn.at <http://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 <http://multinode.at> b/tests/
>         multinode.at <http://multinode.at>
>         index 44faceb53..eec17502f 100644
>         --- a/tests/multinode.at <http://multinode.at>
>         +++ b/tests/multinode.at <http://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 <http://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 <http://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
>         <http://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
>         <http://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
>         <http://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
>         <http://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
>         <http://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
>         <http://10.10.3.0/24>
>         +m_wait_row_count Learned_Route 1 ip_prefix=10.10.3.0/24
>         <http://10.10.3.0/24> logical_port=$local_lp
>         +m_wait_row_count Learned_Route 1 ip_prefix=10.10.3.0/24
>         <http://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 <http://ovn-inc-
>         proc-graph-dump.at> b/tests/ovn-inc-proc-graph-dump.at <http://
>         ovn-inc-proc-graph-dump.at>
>         index 269766ded..5c87296fe 100644
>         --- a/tests/ovn-inc-proc-graph-dump.at <http://ovn-inc-proc-
>         graph-dump.at>
>         +++ b/tests/ovn-inc-proc-graph-dump.at <http://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 <http://system-ovn.at> b/tests/
>         system-ovn.at <http://system-ovn.at>
>         index 17b4dcb3d..8c31bd0c6 100644
>         --- a/tests/system-ovn.at <http://system-ovn.at>
>         +++ b/tests/system-ovn.at <http://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 <http://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 <http://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
>         <http://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

Reply via email to