Em sex., 31 de out. de 2025 às 17:14, Lucas Vargas Dias <
[email protected]> escreveu:

> Logical router adv in ovn-ic the sb learned routes from
> dynamic routing. Also, it doesn't learn route in ovn-ic
> if prefix is already learned in sb learned route table.
>
> Signed-off-by: Lucas Vargas Dias <[email protected]>
> ---
>  ic/ovn-ic.c     | 108 +++++++++++++++++++++++++++++++++----
>  tests/ovn-ic.at | 138 ++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 237 insertions(+), 9 deletions(-)
>
> diff --git a/ic/ovn-ic.c b/ic/ovn-ic.c
> index 1fe8bebce..0d891a85b 100644
> --- a/ic/ovn-ic.c
> +++ b/ic/ovn-ic.c
> @@ -70,7 +70,9 @@ struct ic_context {
>      struct ovsdb_idl_index *nbrec_lrp_by_name;
>      struct ovsdb_idl_index *nbrec_port_by_name;
>      struct ovsdb_idl_index *sbrec_chassis_by_name;
> +    struct ovsdb_idl_index *sbrec_learned_route_by_datapath;
>      struct ovsdb_idl_index *sbrec_port_binding_by_name;
> +    struct ovsdb_idl_index *sbrec_datapath_binding_by_nb_uuid;
>      struct ovsdb_idl_index *sbrec_service_monitor_by_remote_type;
>      struct ovsdb_idl_index *sbrec_service_monitor_by_ic_learned;
>      struct ovsdb_idl_index
> *sbrec_service_monitor_by_remote_type_logical_port;
> @@ -660,6 +662,23 @@ find_sb_pb_by_name(struct ovsdb_idl_index
> *sbrec_port_binding_by_name,
>      return pb;
>  }
>
> +static const struct sbrec_datapath_binding *
> +find_dp_by_uuid(struct ovsdb_idl_index *sbrec_datapath_binding,
> +                const struct uuid *nb_uuid)
> +{
> +    const struct sbrec_datapath_binding *key =
> +        sbrec_datapath_binding_index_init_row(sbrec_datapath_binding);
> +
> +    sbrec_datapath_binding_set_nb_uuid(key, nb_uuid, 1);
> +
> +    const struct sbrec_datapath_binding *dp =
> +        sbrec_datapath_binding_index_find(sbrec_datapath_binding, key);
> +    sbrec_datapath_binding_index_destroy_row(key);
> +
> +
> +    return dp;
> +}
> +
>  static const struct sbrec_port_binding *
>  find_peer_port(struct ic_context *ctx,
>                 const struct sbrec_port_binding *sb_pb)
> @@ -1574,7 +1593,7 @@ add_to_routes_ad(struct hmap *routes_ad, const
> struct in6_addr prefix,
>                   const struct nbrec_load_balancer *nb_lb,
>                   const char *route_tag)
>  {
> -    ovs_assert(nb_route || nb_lrp || nb_lb);
> +    ovs_assert(nb_route || nb_lrp || nb_lb || nb_lr);
>
>      if (route_table == NULL) {
>          route_table = "";
> @@ -1606,9 +1625,12 @@ add_to_routes_ad(struct hmap *routes_ad, const
> struct in6_addr prefix,
>          } else if (nb_lb) {
>              VLOG_WARN_RL(&rl, msg_fmt, origin, "loadbalancer",
>                           UUID_ARGS(&nb_lb->header_.uuid));
> -        } else {
> +        } else if (nb_lrp){
>              VLOG_WARN_RL(&rl, msg_fmt, origin, "lrp",
>                           UUID_ARGS(&nb_lrp->header_.uuid));
> +        } else {
> +            VLOG_WARN_RL(&rl, msg_fmt, origin, "route",
> +                UUID_ARGS(&nb_lr->header_.uuid));
>          }
>      }
>  }
> @@ -1684,8 +1706,16 @@ add_network_to_routes_ad(struct hmap *routes_ad,
> const char *network,
>
>      if (!route_need_advertise(NULL, &prefix, plen, nb_options,
>                                nb_lr, ts_lrp)) {
> -        VLOG_DBG("Route ad: skip network %s of lrp %s.",
> -                 network, nb_lrp->name);
> +        if (VLOG_IS_DBG_ENABLED()) {
> +            struct ds msg = DS_EMPTY_INITIALIZER;
> +            ds_put_format(&msg, "Route ad: skip network %s", network);
> +            if (nb_lrp) {
> +                ds_put_format(&msg, " of lrp %s", nb_lrp->name);
> +            }
> +            ds_put_format(&msg, ".");
> +            VLOG_DBG("%s", ds_cstr(&msg));
> +            ds_destroy(&msg);
> +        }
>          return;
>      }
>
> @@ -1699,8 +1729,12 @@ add_network_to_routes_ad(struct hmap *routes_ad,
> const char *network,
>          struct ds msg = DS_EMPTY_INITIALIZER;
>
>          ds_put_format(&msg, "Adding direct network route to <main>
> routing "
> -                      "table: %s of lrp %s, nexthop ", network,
> nb_lrp->name);
> +                      "table: %s", network);
>
> +        if (nb_lrp) {
> +            ds_put_format(&msg, " of lrp %s,", nb_lrp->name);
> +        }
> +        ds_put_format(&msg, " nexthop ");
>          if (IN6_IS_ADDR_V4MAPPED(&nexthop)) {
>              ds_put_format(&msg, IP_FMT,
>                            IP_ARGS(in6_addr_get_mapped_ipv4(&nexthop)));
> @@ -1881,7 +1915,8 @@ route_matches_local_lb(const struct
> nbrec_load_balancer *nb_lb,
>  }
>
>  static bool
> -route_need_learn(const struct nbrec_logical_router *lr,
> +route_need_learn(struct ic_context *ctx,
> +                 const struct nbrec_logical_router *lr,
>                   const struct icsbrec_route *isb_route,
>                   struct in6_addr *prefix, unsigned int plen,
>                   const struct smap *nb_options,
> @@ -1951,6 +1986,25 @@ route_need_learn(const struct nbrec_logical_router
> *lr,
>          }
>      }
>
> +    const struct sbrec_datapath_binding *dp =
> +        find_dp_by_uuid(ctx->sbrec_datapath_binding_by_nb_uuid,
> +                        &lr->header_.uuid);
> +    if (!dp) {
> +        return true;
> +    }
> +
> +
> +    struct sbrec_learned_route *filter =
> sbrec_learned_route_index_init_row(
> +        ctx->sbrec_learned_route_by_datapath);
> +    sbrec_learned_route_index_set_datapath(filter, dp);
> +    struct sbrec_learned_route *sb_route;
> +    SBREC_LEARNED_ROUTE_FOR_EACH_EQUAL (sb_route, filter,
> +
> ctx->sbrec_learned_route_by_datapath) {
> +        if (!strcmp(isb_route->ip_prefix, sb_route->ip_prefix)) {
> +            return false;
> +        }
> +    }
> +
>      return true;
>  }
>
> @@ -2124,7 +2178,7 @@ sync_learned_routes(struct ic_context *ctx,
>                               isb_route->nexthop);
>                  continue;
>              }
> -            if (!route_need_learn(ic_lr->lr, isb_route, &prefix, plen,
> +            if (!route_need_learn(ctx, ic_lr->lr, isb_route, &prefix,
> plen,
>                                    &nb_global->options, lrp, &nexthop)) {
>                  continue;
>              }
> @@ -2195,7 +2249,8 @@ ad_route_sync_external_ids(const struct
> ic_route_info *route_adv,
>      smap_get_uuid(&isb_route->external_ids, "lr-id", &isb_ext_lr_id);
>      nb_id = route_adv->nb_lb ? route_adv->nb_lb->header_.uuid :
>              route_adv->nb_route ? route_adv->nb_route->header_.uuid :
> -            route_adv->nb_lrp->header_.uuid;
> +            route_adv->nb_lrp ? route_adv->nb_lrp->header_.uuid :
> +            route_adv->nb_lr->header_.uuid;
>
>      lr_id = route_adv->nb_lr->header_.uuid;
>      if (!uuid_equals(&isb_ext_id, &nb_id)) {
> @@ -2387,6 +2442,25 @@ build_ts_routes_to_adv(struct ic_context *ctx,
>              }
>          }
>      }
> +
> +    const struct sbrec_datapath_binding *dp =
> +        find_dp_by_uuid(ctx->sbrec_datapath_binding_by_nb_uuid,
> +                        &lr->header_.uuid);
> +    if (!dp) {
> +        return;
> +    }
> +
> +    struct sbrec_learned_route *filter =
> sbrec_learned_route_index_init_row(
> +        ctx->sbrec_learned_route_by_datapath);
> +    sbrec_learned_route_index_set_datapath(filter, dp);
> +    struct sbrec_learned_route *sb_route;
> +    SBREC_LEARNED_ROUTE_FOR_EACH_EQUAL (sb_route, filter,
> +
> ctx->sbrec_learned_route_by_datapath) {
> +        add_network_to_routes_ad(routes_ad, sb_route->ip_prefix, NULL,
> +                                 ts_port_addrs,
> +                                 &nb_global->options,
> +                                 lr, route_tag, ts_lrp);
> +    }
>  }
>
>  static void
> @@ -2483,7 +2557,7 @@ delete_orphan_ic_routes(struct ic_context *ctx,
>  static void
>  route_run(struct ic_context *ctx)
>  {
> -    if (!ctx->ovnisb_txn || !ctx->ovnnb_txn) {
> +    if (!ctx->ovnisb_txn || !ctx->ovnnb_txn || !ctx->ovnsb_txn) {
>          return;
>      }
>
> @@ -3471,6 +3545,11 @@ main(int argc, char *argv[])
>      ovsdb_idl_add_column(ovnsb_idl_loop.idl,
>                           &sbrec_service_monitor_col_options);
>
> +    ovsdb_idl_add_table(ovnsb_idl_loop.idl, &sbrec_table_learned_route);
> +    ovsdb_idl_add_column(ovnsb_idl_loop.idl,
> +                         &sbrec_learned_route_col_ip_prefix);
> +    ovsdb_idl_add_column(ovnsb_idl_loop.idl,
> +                         &sbrec_learned_route_col_datapath);
>      /* Create IDL indexes */
>      struct ovsdb_idl_index *nbrec_ls_by_name
>          = ovsdb_idl_index_create1(ovnnb_idl_loop.idl,
> @@ -3486,10 +3565,17 @@ main(int argc, char *argv[])
>      struct ovsdb_idl_index *sbrec_port_binding_by_name
>          = ovsdb_idl_index_create1(ovnsb_idl_loop.idl,
>                                    &sbrec_port_binding_col_logical_port);
> +    struct ovsdb_idl_index *sbrec_datapath_binding_by_nb_uuid
> +        = ovsdb_idl_index_create1(ovnsb_idl_loop.idl,
> +                                  &sbrec_datapath_binding_col_nb_uuid);
>      struct ovsdb_idl_index *sbrec_chassis_by_name
>          = ovsdb_idl_index_create1(ovnsb_idl_loop.idl,
>                                    &sbrec_chassis_col_name);
>
> +    struct ovsdb_idl_index *sbrec_learned_route_by_datapath
> +        = ovsdb_idl_index_create1(ovnsb_idl_loop.idl,
> +                                  &sbrec_learned_route_col_datapath);
> +
>     struct ovsdb_idl_index *sbrec_service_monitor_by_remote_type
>          = ovsdb_idl_index_create1(ovnsb_idl_loop.idl,
>                                    &sbrec_service_monitor_col_remote);
> @@ -3597,7 +3683,11 @@ main(int argc, char *argv[])
>                  .nbrec_lrp_by_name = nbrec_lrp_by_name,
>                  .nbrec_port_by_name = nbrec_port_by_name,
>                  .sbrec_port_binding_by_name = sbrec_port_binding_by_name,
> +                .sbrec_datapath_binding_by_nb_uuid =
> +                    sbrec_datapath_binding_by_nb_uuid,
>                  .sbrec_chassis_by_name = sbrec_chassis_by_name,
> +                .sbrec_learned_route_by_datapath =
> +                  sbrec_learned_route_by_datapath,
>                  .sbrec_service_monitor_by_remote_type =
>                      sbrec_service_monitor_by_remote_type,
>                  .sbrec_service_monitor_by_ic_learned =
> diff --git a/tests/ovn-ic.at b/tests/ovn-ic.at
> index 47de0d605..0ab28715e 100644
> --- a/tests/ovn-ic.at
> +++ b/tests/ovn-ic.at
> @@ -3502,6 +3502,144 @@ OVN_CLEANUP_IC([az1], [az2])
>  AT_CLEANUP
>  ])
>
> +OVN_FOR_EACH_NORTHD([
> +AT_SETUP([ovn-ic -- Check ovn-ic adv and learn from SB Learned Route])
> +
> +ovn_init_ic_db
> +
> +for i in 1 2; do
> +    ovn_start az$i
> +    ovn_as az$i
> +
> +    # Enable route learning at AZ level
> +    check ovn-nbctl set nb_global . options:ic-route-learn=true
> +    # Enable route advertising at AZ level
> +    check ovn-nbctl set nb_global . options:ic-route-adv=true
> +done
> +
> +# Create new transit switches and LRs. Test topology is next:
> +#
> +#
> +# logical router (lr11) - transit switch (ts11) - logical router (lr12)
> +#
> +#
> +
> +# Create lr11, lr12 and ts11 and connect them
> +for i in 1 2; do
> +    ovn_as az$i
> +
> +    lr=lr1$i
> +    check ovn-nbctl lr-add $lr
> +
> +    for j in 1; do
> +        ts=ts1$j
> +        check ovn-ic-nbctl --wait=sb --may-exist ts-add $ts
> +
> +        lrp=lrp-$lr-$ts
> +        lsp=lsp-$ts-$lr
> +        # Create LRP and connect to TS
> +        check ovn-nbctl lrp-add $lr $lrp aa:aa:aa:aa:a$j:0$i
> 169.254.10$j.$i/24
> +        check ovn-nbctl lsp-add $ts $lsp \
> +                -- lsp-set-addresses $lsp router \
> +                -- lsp-set-type $lsp router \
> +                -- lsp-set-options $lsp router-port=$lrp
> +    done
> +done
> +
> +# Create directly-connected route in lr11
> +check ovn_as az2 ovn-nbctl lrp-add lr12 lrp-lr12 aa:aa:aa:aa:bb:01 "
> 192.168.0.1/24"
> +OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl lr-route-list lr11 | grep
> 192.168 |
> +             grep learned | awk '{print $1, $2}' | sort ], [0], [dnl
> +192.168.0.0/24 169.254.101.2
> +])
> +
> +ovn_as az2
> +check ovn-nbctl --wait=sb set Logical_Router lr12
> option:dynamic-routing=true \
> +    option:dynamic-routing-redistribute="connected,static"
> +check ovn_as az2 ovn-nbctl --wait=sb lrp-add lr12 lr12-dr1
> 00:00:00:00:ff:01 10.0.0.1/24
> +dr1=$(fetch_column port_binding _uuid logical_port=lr12-dr1)
> +datapath=$(fetch_column datapath_binding _uuid external_ids:name=lr12)
> +
> +check_uuid ovn-sbctl create Learned_Route \
> +    datapath=$datapath                    \
> +    logical_port=$dr1                     \
> +    ip_prefix=192.168.1.0/24              \
> +    nexthop=10.0.0.20
> +
> +# Check Learned_Route adv in ovn-ic
> +OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl lr-route-list lr11 | grep
> 192.168 |
> +             grep learned | awk '{print $1, $2}' | sort ], [0], [dnl
> +192.168.0.0/24 169.254.101.2
> +192.168.1.0/24 169.254.101.2
> +])
> +
> +ovn_as az2
> +learned=$(fetch_column Learned_Route _uuid ip_prefix=192.168.1.0/24)
> +check ovn-sbctl destroy Learned_Route $learned
> +
> +# Check Learned_Route removed is not adv and learned.
> +OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl lr-route-list lr11 | grep
> 192.168 |
> +             grep learned | awk '{print $1, $2}' | sort ], [0], [dnl
> +192.168.0.0/24 169.254.101.2
> +])
> +
> +
> +# Duplicate routes, SB learn route by two paths.
> +ovn_as az2
> +check_uuid ovn-sbctl create Learned_Route \
> +               datapath=$datapath         \
> +               logical_port=$dr1          \
> +               ip_prefix=192.168.1.0/24   \
> +               nexthop=10.0.0.20
> +
> +check ovn-nbctl --wait=sb lrp-add lr12 lr12-dr2 00:00:00:00:ff:02
> 169.254.254.1/24
> +dr2=$(fetch_column port_binding _uuid logical_port=lr12-dr2)
> +
> +check_uuid ovn-sbctl create Learned_Route \
> +    datapath=$datapath                    \
> +    logical_port=$dr2                     \
> +    ip_prefix=192.168.1.0/24              \
> +    nexthop=169.254.254.3
> +
> +check_uuid ovn-sbctl create Learned_Route \
> +    datapath=$datapath                    \
> +    logical_port=$dr2                     \
> +    ip_prefix=192.168.2.0/24              \
> +    nexthop=169.254.254.3
> +
> +OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl lr-route-list lr11 | grep
> 192.168 |
> +             grep learned | awk '{print $1, $2}' | sort ], [0], [dnl
> +192.168.0.0/24 169.254.101.2
> +192.168.1.0/24 169.254.101.2
> +192.168.2.0/24 169.254.101.2
> +])
> +
> +# Insert the same route Learned Route in the lr11 and don't learn by
> ovn-ic.
> +ovn_as az1
> +datapath_lr11=$(fetch_column datapath_binding _uuid
> external_ids:name=lr11)
> +check ovn-nbctl --wait=sb lrp-add lr11 lr11-dr1 00:00:00:00:ff:03
> 169.254.254.2/24
> +sw1_dr1=$(fetch_column port_binding _uuid logical_port=lr11-dr1)
> +check_uuid ovn-sbctl create Learned_Route \
> +    datapath=$datapath_lr11               \
> +    logical_port=$sw1_dr1                 \
> +    ip_prefix=192.168.1.0/24              \
> +    nexthop=169.254.254.3
> +
> +OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl lr-route-list lr11 | grep
> 192.168 |
> +             grep learned | awk '{print $1, $2}' | sort ], [0], [dnl
> +192.168.0.0/24 169.254.101.2
> +192.168.2.0/24 169.254.101.2
> +])
> +
> +OVS_WAIT_FOR_OUTPUT([ovn_as az2 ovn-nbctl lr-route-list lr12 | grep
> 192.168 |
> +             grep learned | awk '{print $1, $2}' | sort ], [0], [dnl
> +])
> +
> +OVN_CLEANUP_IC([az1], [az2])
> +
> +AT_CLEANUP
> +])
> +
>  AT_BANNER([OVN Interconnection Service Monitor synchronization])
>  OVN_FOR_EACH_NORTHD([
>  AT_SETUP([ovn-ic -- Service Monitor synchronization: mock_test])
> --
> 2.43.0
>
>
Recheck-request: github-robot-_Build_and_Test

-- 




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