Hi Dumitru
Thanks for your review.

Em seg., 22 de jun. de 2026 às 11:22, Dumitru Ceara <[email protected]>
escreveu:

> Hi Lucas,
>
> Thanks for v3.  I have some comments, but once those are addressed I
> think we'll be close to accepting this fix.
>
> On 6/18/26 3:38 PM, Lucas Vargas Dias wrote:
> > 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
>
> Did you mean to say "if all LRPs learn routes"?
>
>
You're right.


> > 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]>
> > ---
>
>
> >  controller/ovn-controller.c      |  15 ++++
> >  controller/route-exchange.c      |  48 ++++++++++-
> >  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, 337 insertions(+), 4 deletions(-)
> >
> > diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
> > index fd848c54c..e65962d9f 100644
> > --- a/controller/ovn-controller.c
> > +++ b/controller/ovn-controller.c
> > @@ -5681,11 +5681,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 = {
> > @@ -7003,6 +7016,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..a3c0968c6 100644
> > --- a/controller/route-exchange.c
> > +++ b/controller/route-exchange.c
> > @@ -27,6 +27,7 @@
> >  #include "openvswitch/list.h"
> >
> >  #include "lib/ovn-sb-idl.h"
> > +#include "lib/uuidset.h"
> >
> >  #include "binding.h"
> >  #include "ha-chassis.h"
> > @@ -86,7 +87,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 +103,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,28 +146,65 @@ 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 route_entry *route_e = NULL;
> > +    struct uuidset lrp_with_dr_port_name =
> > +
> UUIDSET_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);
> > +        const char *dynamic_routing_port_name =
> > +            smap_get(&sb_route->logical_port->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");
> > +        }
>
> Could we optimize this part a bit?
>
> Yes, I could.


> In general, we might learn more (a lot?) routes for the same
> logical_port.  This code does the following, for each learned_route
> entry (but all having the exact same route->logical_port):
>
> - check if there's a cr-pb for the route->logical_port
> - if the route->logical_port.options:dynamic-routing-port-name value is
> set or of the cr-pb.options:dynamic-routing-port-name value is set then
> store the route->logical_port uuid in the uuidset.
>
> We could first build a hmapx with all unique sb_route->logical_port
> (const struct sbrec_port_binding *) values.
>
> Then later just before walking &sync_routes, walk this new hmapx and
> just remove the pointers that don't have a dynamic-routing-port-name set
> or a cr-pb with dynamic-routing-port-name set.
>
>
I agree


>
> > +
> > +        if (sb_route->logical_port->chassis == chassis ||
> > +            (cr_pb && cr_pb->chassis == chassis)) {
> > +            route_e = route_add_entry(&sync_routes, sb_route, false);
> > +            if (dynamic_routing_port_name) {
> > +                uuidset_insert(&lrp_with_dr_port_name,
> > +                               &sb_route->logical_port->header_.uuid);
> > +            }
> > +        }
>
> If we didn't match the condition above in the current iteration but we
> matched it in the previous one then route_e here is non-NULL (pointing
> to the route entry we added in the previous iteration.
>
> We'll incorrectly mark it as stale below potentially.
>
> We should make 'route_e' a local variable of the
> SBREC_LEARNED_ROUTE_FOR_EACH_EQUAL() loop.
>
> > +
> >          /* 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. */
> >          if (!smap_get_node(bound_ports,
> >                             sb_route->logical_port->logical_port)) {
> > +            route_e = NULL;
> > +            continue;
> > +        }
> > +        if (route_e) {
> > +            route_e->stale = true;
> >              continue;
> >          }
> >          route_add_entry(&sync_routes, sb_route, true);
> >      }
> >      sbrec_learned_route_index_destroy_row(filter);
> >
> > +    if (!uuidset_is_empty(&lrp_with_dr_port_name)) {
> > +        HMAP_FOR_EACH_SAFE (route_e, hmap_node, &sync_routes) {
>
> HMAP_FOR_EACH() would be enough, we're not changing the hmap structure.
>
>
I agree


> > +            if (!uuidset_find(&lrp_with_dr_port_name,
> > +                &route_e->sb_route->logical_port->header_.uuid)) {
> > +                route_e->stale = true;
> > +            }
> > +        }
> > +    }
> > +    uuidset_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,
> > @@ -363,7 +402,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 069f2a677..e5be00be7 100644
> > --- a/tests/multinode.at
> > +++ b/tests/multinode.at
> > @@ -2984,6 +2984,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 3750339d0..4fe39cf69 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 35df0ec2f..af2dc8a83 100644
> > --- a/tests/system-ovn.at
> > +++ b/tests/system-ovn.at
> > @@ -21865,3 +21865,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
> > +])
>
> Regards,
> Dumitru
>
>

Regards,
Lucas

-- 




_‘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