On 2/6/25 3:19 PM, Felix Huettner via dev wrote:
> Previously all routes of a logical router where announced. However in
> some cases it makes more sense to only announce static or connected
> routes. Therefor we add options to LR and LRP to define which routes to
> advertise.
> 
> Acked-by: Lorenzo Bianconi <[email protected]>
> Signed-off-by: Felix Huettner <[email protected]>
> ---

Hi Felix,

> v6->v7:
>   * addressed review comments
> v5->v6:
>   * addressed review comments
>   * changed option to "dynamic-routing-redistribute"
> v4->v5: skipped
> v2->v3:
>   * A lot of minor review comments.
>   * Reworked NEWs entry to make default more clear
> 
>  NEWS                              |  8 ++-
>  northd/en-advertised-route-sync.c | 10 ++++
>  northd/northd.c                   | 41 +++++++++++++++
>  northd/northd.h                   | 18 +++++++
>  ovn-nb.xml                        | 51 ++++++++++++++++++
>  tests/ovn-northd.at               | 87 ++++++++++++++++++++++++++++++-
>  6 files changed, 211 insertions(+), 4 deletions(-)
> 
> diff --git a/NEWS b/NEWS
> index dd17a579b..94a0a558c 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -42,9 +42,13 @@ Post v24.09.0
>       options:requested-chassis for router ports; if the chassis is remote
>       then the router port will behave as a remote port.
>     - Dynamic Routing:
> -     * Add the option "dynamic-routing" to Logical Routers. If set to true 
> all
> -       static and connected routes attached to the router are shared to the
> +     * Add the option "dynamic-routing" to Logical Routers. If set to true
> +       static and connected routes matching the below filter are shared to 
> the
>         southbound "Advertised_Route" table for sharing outside of OVN.
> +       The routes can further be configured by setting
> +       `dynamic-routing-redistribute` on the LR or LRP. The LRP settings
> +       overwrite the LR settings for all routes using this interface to
> +       forward traffic on.
>  
>  OVN v24.09.0 - 13 Sep 2024
>  --------------------------
> diff --git a/northd/en-advertised-route-sync.c 
> b/northd/en-advertised-route-sync.c
> index 3c5065154..0fa91f5aa 100644
> --- a/northd/en-advertised-route-sync.c
> +++ b/northd/en-advertised-route-sync.c
> @@ -149,6 +149,16 @@ advertised_route_table_sync(
>              continue;
>          }
>  
> +        enum dynamic_routing_redistribute_mode drr =
> +            route->out_port->dynamic_routing_redistribute;
> +        if (route->source == ROUTE_SOURCE_CONNECTED &&
> +              (drr & DRRM_CONNECTED) == 0) {

If we go for the "magic" suggestion I'm mentioning below this could become:

!drr_mode_CONNECTED_is_set(drr)

> +            continue;
> +        }
> +        if (route->source == ROUTE_SOURCE_STATIC && (drr & DRRM_STATIC) == 
> 0) {
> +            continue;
> +        }
> +
>          char *ip_prefix = normalize_v46_prefix(&route->prefix, route->plen);
>          route_e = ar_add_entry(&sync_routes, route->od->sb,
>                                 route->out_port->sb, ip_prefix);
> diff --git a/northd/northd.c b/northd/northd.c
> index ce39cee6c..3ba0e69c2 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -801,6 +801,43 @@ ovn_datapath_update_external_ids(struct ovn_datapath *od)
>      smap_destroy(&ids);
>  }
>  
> +static enum dynamic_routing_redistribute_mode
> +parse_dynamic_routing_redistribute(
> +    const struct smap *options,
> +    const enum dynamic_routing_redistribute_mode default_dynamic_mode)

No need for const enum.  Arguments are passed by value.

> +{
> +    char *save_ptr = NULL;
> +    enum dynamic_routing_redistribute_mode out = DRRM_NONE;
> +
> +    const char *dynamic_routing_redistribute = smap_get(
> +        options, "dynamic-routing-redistribute");
> +    if (!dynamic_routing_redistribute) {
> +        return default_dynamic_mode;
> +    }
> +
> +    char *tokstr = xstrdup(dynamic_routing_redistribute);
> +
> +    for (char *token = strtok_r(tokstr, ";", &save_ptr);
> +         token != NULL;
> +         token = strtok_r(NULL, ";", &save_ptr)) {
> +
> +        if (!strcmp(token, "connected")) {
> +            out |= DRRM_CONNECTED;
> +            continue;
> +        }
> +        if (!strcmp(token, "static")) {
> +            out |= DRRM_STATIC;
> +            continue;
> +        }
> +        static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
> +        VLOG_WARN_RL(&rl, "unkown dynamic-routing-redistribute option '%s'",
> +                     token);
> +    }
> +
> +    free(tokstr);
> +    return out;
> +}
> +
>  static void
>  join_datapaths(const struct nbrec_logical_switch_table *nbrec_ls_table,
>                 const struct nbrec_logical_router_table *nbrec_lr_table,
> @@ -896,6 +933,8 @@ join_datapaths(const struct nbrec_logical_switch_table 
> *nbrec_ls_table,
>          }
>          od->dynamic_routing = smap_get_bool(&od->nbr->options,
>                                              "dynamic-routing", false);
> +        od->dynamic_routing_redistribute = 
> parse_dynamic_routing_redistribute(
> +            &od->nbr->options, DRRM_NONE);
>          ovs_list_push_back(lr_list, &od->lr_list);
>      }
>  }
> @@ -2233,6 +2272,8 @@ join_logical_ports_lrp(struct hmap *ports,
>  
>      op->prefix_delegation = smap_get_bool(&op->nbrp->options,
>                                            "prefix_delegation", false);
> +    op->dynamic_routing_redistribute = parse_dynamic_routing_redistribute(
> +        &op->nbrp->options, od->dynamic_routing_redistribute);
>  
>      for (size_t j = 0; j < op->lrp_networks.n_ipv4_addrs; j++) {
>          sset_add(&op->od->router_ips,
> diff --git a/northd/northd.h b/northd/northd.h
> index 7d0cfa9ef..06314730d 100644
> --- a/northd/northd.h
> +++ b/northd/northd.h
> @@ -300,6 +300,17 @@ struct mcast_port_info {
>                           * (e.g., IGMP join/leave). */
>  };
>  
> +enum dynamic_routing_redistribute_mode_bits {
> +    DRRM_CONNECTED_BIT = 0,
> +    DRRM_STATIC_BIT    = 1,
> +};
> +
> +enum dynamic_routing_redistribute_mode {
> +    DRRM_NONE      = 0,
> +    DRRM_CONNECTED = (1 << DRRM_CONNECTED_BIT),
> +    DRRM_STATIC    = (1 << DRRM_STATIC_BIT),
> +};

We could use some "magic" here:

#define DRR_MODES          \
    DRR_MODE(CONNECTED, 0) \
    DRR_MODE(STATIC,    1)

enum dynamic_routing_redistribute_mode_bits {
#define DRR_MODE(PROTOCOL, BIT) DRRM_##PROTOCOL##_BIT = BIT,
    DRR_MODES
#undef DRR_MODE
};

enum dynamic_routing_redistribute_mode {
    DRRM_NONE      = 0,
#define DRR_MODE(PROTOCOL, BIT) DRRM_##PROTOCOL = (1 << DRRM_##PROTOCOL##_BIT),
    DRR_MODES
#undef DRR_MODE
};

#define DRR_MODE(PROTOCOL, BIT)                       \
    static inline bool drr_mode_##PROTOCOL##_is_set(  \
        enum dynamic_routing_redistribute_mode value) \
    {                                                 \
        return !!(value & DRRM_##PROTOCOL);           \
    }
DRR_MODES
#undef DRR_MODE

This generates:

enum dynamic_routing_redistribute_mode_bits {
    DRRM_CONNECTED_BIT = 0,
    DRRM_STATIC_BIT    = 1,
};

enum dynamic_routing_redistribute_mode {
    DRRM_NONE      = 0,
    DRRM_CONNECTED = (1 << DRRM_CONNECTED_BIT),
    DRRM_STATIC    = (1 << DRRM_STATIC_BIT),
};

But also helpers:

static inline bool drr_mode_CONNECTED_is_set(value)
static inline bool drr_mode_STATIC_is_set(value)

What do you think?

Regards,
Dumitru

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to