On Tue, 2025-02-25 at 00:01 +0100, Dumitru Ceara wrote:
> It makes more sense to make these static (internal) in the module
> where
> they're actually used.  They use "public" APIs to add advertised
> dynamic
> routes.
> 
> Fixes: cd4ad2f56179 ("northd: Redistribution of NAT/LB routes.")
> Signed-off-by: Dumitru Ceara <dce...@redhat.com>

I have no objections to moving these functions out of northd.c, so
overall this can have Acked-by me. However, since we are at it,
wouldn't it make sense to also move out the `build_parsed_routes` (and
related functions), as they too, seem to be only used from `en-
northd.c`.

Thanks,
Martin.

> ---
>  northd/en-advertised-route-sync.c | 233
> ++++++++++++++++++++++++++++++
>  northd/northd.c                   | 231 ----------------------------
> -
>  northd/northd.h                   |  14 --
>  3 files changed, 233 insertions(+), 245 deletions(-)
> 
> diff --git a/northd/en-advertised-route-sync.c b/northd/en-
> advertised-route-sync.c
> index 794a87cb3b..48a0b05deb 100644
> --- a/northd/en-advertised-route-sync.c
> +++ b/northd/en-advertised-route-sync.c
> @@ -20,7 +20,9 @@
>  #include "northd.h"
>  
>  #include "en-advertised-route-sync.h"
> +#include "en-lr-nat.h"
>  #include "en-lr-stateful.h"
> +#include "lb.h"
>  #include "lib/stopwatch-names.h"
>  #include "openvswitch/hmap.h"
>  #include "ovn-util.h"
> @@ -163,6 +165,237 @@ en_advertised_route_sync_run(struct engine_node
> *node, void *data OVS_UNUSED)
>      engine_set_node_state(node, EN_UPDATED);
>  }
>  
> +/* This function adds new parsed route for each entry in lr_nat
> record
> + * to "routes". Logical port of the route is set to "advertising_op"
> and
> + * tracked port is set to NAT's distributed gw port. If NAT doesn't
> have
> + * DGP (for example if it's set on gateway router), no tracked port
> will
> + * be set.*/
> +static void
> +build_nat_parsed_route_for_port(const struct ovn_port
> *advertising_op,
> +                                const struct lr_nat_record *lr_nat,
> +                                const struct hmap *ls_ports,
> +                                struct hmap *routes)
> +{
> +    const struct ovn_datapath *advertising_od = advertising_op->od;
> +
> +    for (size_t i = 0; i < lr_nat->n_nat_entries; i++) {
> +        const struct ovn_nat *nat = &lr_nat->nat_entries[i];
> +        if (!nat->is_valid) {
> +            continue;
> +        }
> +
> +        int plen = nat_entry_is_v6(nat) ? 128 : 32;
> +        struct in6_addr prefix;
> +        ip46_parse(nat->nb->external_ip, &prefix);
> +
> +        const struct ovn_port *tracked_port =
> +            nat->is_distributed
> +            ? ovn_port_find(ls_ports, nat->nb->logical_port)
> +            : nat->l3dgw_port;
> +        parsed_route_add(advertising_od, NULL, &prefix, plen, false,
> +                         nat->nb->external_ip, advertising_op, 0,
> false,
> +                         false, NULL, ROUTE_SOURCE_NAT, &nat->nb-
> >header_,
> +                         tracked_port, routes);
> +    }
> +}
> +
> +/* Generate parsed routes for NAT external IPs in lr_nat, for each
> ovn port
> + * in "od" that has enabled redistribution of NAT adresses.*/
> +static void
> +build_nat_parsed_routes(const struct ovn_datapath *od,
> +                        const struct lr_nat_record *lr_nat,
> +                        const struct hmap *ls_ports,
> +                        struct hmap *routes)
> +{
> +    const struct ovn_port *op;
> +    HMAP_FOR_EACH (op, dp_node, &od->ports) {
> +        if (!drr_mode_NAT_is_set(op->dynamic_routing_redistribute))
> {
> +            continue;
> +        }
> +
> +        build_nat_parsed_route_for_port(op, lr_nat, ls_ports,
> routes);
> +    }
> +}
> +
> +/* Similar to build_nat_parsed_routes, this function generates
> parsed routes
> + * for nat records in neighboring routers. For each ovn port in "od"
> that has
> + * enabled redistribution of NAT adresses, look up their neighbors
> (either
> + * directly routers, or routers connected through common LS) and
> advertise
> + * thier external NAT IPs too.*/
> +static void
> +build_nat_connected_parsed_routes(
> +    const struct ovn_datapath *od,
> +    const struct lr_stateful_table *lr_stateful_table,
> +    const struct hmap *ls_ports,
> +    struct hmap *routes)
> +{
> +    const struct ovn_port *op;
> +    HMAP_FOR_EACH (op, dp_node, &od->ports) {
> +        if (!drr_mode_NAT_is_set(op->dynamic_routing_redistribute))
> {
> +            continue;
> +        }
> +
> +        if (!op->peer) {
> +            continue;
> +        }
> +
> +        struct ovn_datapath *peer_od = op->peer->od;
> +        ovs_assert(peer_od->nbs || peer_od->nbr);
> +
> +        const struct ovn_port *peer_port = NULL;
> +        /* This is a directly connected LR peer. */
> +        if (peer_od->nbr) {
> +            peer_port = op->peer;
> +
> +            const struct lr_stateful_record *peer_lr_stateful =
> +                lr_stateful_table_find_by_index(lr_stateful_table,
> +                                                 peer_od->index);
> +            if (!peer_lr_stateful) {
> +                continue;
> +            }
> +
> +            /* Advertise peer's NAT routes via the local port too.
> */
> +            build_nat_parsed_route_for_port(op, peer_lr_stateful-
> >lrnat_rec,
> +                                            ls_ports, routes);
> +            return;
> +        }
> +
> +        /* This peer is LSP, we need to check all connected router
> ports
> +         * for NAT.*/
> +        for (size_t i = 0; i < peer_od->n_router_ports; i++) {
> +            peer_port = peer_od->router_ports[i]->peer;
> +            if (peer_port == op) {
> +                /* Skip advertising router. */
> +                continue;
> +            }
> +
> +            const struct lr_stateful_record *peer_lr_stateful =
> +                lr_stateful_table_find_by_index(lr_stateful_table,
> +                                                peer_port->od-
> >index);
> +            if (!peer_lr_stateful) {
> +                continue;
> +            }
> +
> +            /* Advertise peer's NAT routes via the local port too.
> */
> +            build_nat_parsed_route_for_port(op, peer_lr_stateful-
> >lrnat_rec,
> +                                            ls_ports, routes);
> +        }
> +    }
> +}
> +
> +/* This function adds new parsed route for each IP in lb_ips to
> "routes".*/
> +static void
> +build_lb_parsed_route_for_port(const struct ovn_port
> *advertising_op,
> +                               const struct ovn_port *tracked_port,
> +                               const struct ovn_lb_ip_set *lb_ips,
> +                               struct hmap *routes)
> +{
> +    const struct ovn_datapath *advertising_od = advertising_op->od;
> +
> +    const char *ip_address;
> +    SSET_FOR_EACH (ip_address, &lb_ips->ips_v4) {
> +        struct in6_addr prefix;
> +        ip46_parse(ip_address, &prefix);
> +        parsed_route_add(advertising_od, NULL, &prefix, 32, false,
> +                         ip_address, advertising_op, 0, false,
> false,
> +                         NULL, ROUTE_SOURCE_LB, &advertising_op-
> >nbrp->header_,
> +                         tracked_port, routes);
> +    }
> +    SSET_FOR_EACH (ip_address, &lb_ips->ips_v6) {
> +        struct in6_addr prefix;
> +        ip46_parse(ip_address, &prefix);
> +        parsed_route_add(advertising_od, NULL, &prefix, 128, false,
> +                         ip_address, advertising_op, 0, false,
> false,
> +                         NULL, ROUTE_SOURCE_LB, &advertising_op-
> >nbrp->header_,
> +                         tracked_port, routes);
> +    }
> +}
> +
> +/* Similar to build_lb_parsed_routes, this function generates parsed
> routes
> + * for LB VIPs of neighboring routers. For each ovn port in "od"
> that has
> + * enabled redistribution of LB VIPs, look up their neighbors
> (either
> + * directly routers, or routers connected through common LS) and
> advertise
> + * thier LB VIPs too.*/
> +static void
> +build_lb_connected_parsed_routes(
> +        const struct ovn_datapath *od,
> +        const struct lr_stateful_table *lr_stateful_table,
> +        struct hmap *routes)
> +{
> +    const struct ovn_port *op;
> +    HMAP_FOR_EACH (op, dp_node, &od->ports) {
> +        if (!drr_mode_LB_is_set(op->dynamic_routing_redistribute)) {
> +            continue;
> +        }
> +
> +        if (!op->peer) {
> +            continue;
> +        }
> +
> +        struct ovn_datapath *peer_od = op->peer->od;
> +        ovs_assert(peer_od->nbs || peer_od->nbr);
> +
> +        const struct lr_stateful_record *lr_stateful_rec;
> +        const struct ovn_port *peer_port = NULL;
> +        /* This is directly connected LR peer. */
> +        if (peer_od->nbr) {
> +            lr_stateful_rec = lr_stateful_table_find_by_index(
> +                lr_stateful_table, peer_od->index);
> +            peer_port = op->peer;
> +            build_lb_parsed_route_for_port(op, peer_port,
> +                                           lr_stateful_rec->lb_ips,
> routes);
> +            return;
> +        }
> +
> +        /* This peer is LSP, we need to check all connected router
> ports for
> +         * LBs.*/
> +        for (size_t i = 0; i < peer_od->n_router_ports; i++) {
> +            peer_port = peer_od->router_ports[i]->peer;
> +            if (peer_port == op) {
> +                /* no need to check for LBs on ovn_port that
> initiated this
> +                 * function.*/
> +                continue;
> +            }
> +            lr_stateful_rec = lr_stateful_table_find_by_index(
> +                lr_stateful_table, peer_port->od->index);
> +
> +            build_lb_parsed_route_for_port(op, peer_port,
> +                                           lr_stateful_rec->lb_ips,
> routes);
> +        }
> +    }
> +}
> +
> +static void
> +build_lb_parsed_routes(const struct ovn_datapath *od,
> +                       const struct ovn_lb_ip_set *lb_ips,
> +                       struct hmap *routes)
> +{
> +    const struct ovn_port *op;
> +    HMAP_FOR_EACH (op, dp_node, &od->ports) {
> +        if (!drr_mode_LB_is_set(op->dynamic_routing_redistribute)) {
> +            continue;
> +        }
> +
> +        /* Traffic processed by a load balancer is:
> +         * - handled by the chassis where a gateway router is bound
> +         * OR
> +         * - always redirected to a distributed gateway router port
> +         *
> +         * Advertise the LB IPs via all 'op' if this is a gateway
> router or
> +         * throuh all DGPs of this distributed router otherwise. */
> +        struct ovn_port *op_ = NULL;
> +        size_t n_tracked_ports = !od->is_gw_router ? od-
> >n_l3dgw_ports : 1;
> +        struct ovn_port **tracked_ports = !od->is_gw_router
> +                                          ? od->l3dgw_ports
> +                                          : &op_;
> +
> +        for (size_t i = 0; i < n_tracked_ports; i++) {
> +            build_lb_parsed_route_for_port(op, tracked_ports[i],
> lb_ips,
> +                                           routes);
> +        }
> +    }
> +}
> +
>  void *
>  en_dynamic_routes_init(struct engine_node *node OVS_UNUSED,
>                         struct engine_arg *arg OVS_UNUSED)
> diff --git a/northd/northd.c b/northd/northd.c
> index a91e48ac26..fdeb1d4670 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -11323,237 +11323,6 @@ build_parsed_routes(const struct
> ovn_datapath *od, const struct hmap *lr_ports,
>      }
>  }
>  
> -/* This function adds new parsed route for each entry in lr_nat
> record
> - * to "routes". Logical port of the route is set to "advertising_op"
> and
> - * tracked port is set to NAT's distributed gw port. If NAT doesn't
> have
> - * DGP (for example if it's set on gateway router), no tracked port
> will
> - * be set.*/
> -static void
> -build_nat_parsed_route_for_port(const struct ovn_port
> *advertising_op,
> -                                const struct lr_nat_record *lr_nat,
> -                                const struct hmap *ls_ports,
> -                                struct hmap *routes)
> -{
> -    const struct ovn_datapath *advertising_od = advertising_op->od;
> -
> -    for (size_t i = 0; i < lr_nat->n_nat_entries; i++) {
> -        const struct ovn_nat *nat = &lr_nat->nat_entries[i];
> -        if (!nat->is_valid) {
> -            continue;
> -        }
> -
> -        int plen = nat_entry_is_v6(nat) ? 128 : 32;
> -        struct in6_addr prefix;
> -        ip46_parse(nat->nb->external_ip, &prefix);
> -
> -        const struct ovn_port *tracked_port =
> -            nat->is_distributed
> -            ? ovn_port_find(ls_ports, nat->nb->logical_port)
> -            : nat->l3dgw_port;
> -        parsed_route_add(advertising_od, NULL, &prefix, plen, false,
> -                         nat->nb->external_ip, advertising_op, 0,
> false,
> -                         false, NULL, ROUTE_SOURCE_NAT, &nat->nb-
> >header_,
> -                         tracked_port, routes);
> -    }
> -}
> -
> -/* Generate parsed routes for NAT external IPs in lr_nat, for each
> ovn port
> - * in "od" that has enabled redistribution of NAT adresses.*/
> -void
> -build_nat_parsed_routes(const struct ovn_datapath *od,
> -                        const struct lr_nat_record *lr_nat,
> -                        const struct hmap *ls_ports,
> -                        struct hmap *routes)
> -{
> -    const struct ovn_port *op;
> -    HMAP_FOR_EACH (op, dp_node, &od->ports) {
> -        if (!drr_mode_NAT_is_set(op->dynamic_routing_redistribute))
> {
> -            continue;
> -        }
> -
> -        build_nat_parsed_route_for_port(op, lr_nat, ls_ports,
> routes);
> -    }
> -}
> -
> -/* Similar to build_nat_parsed_routes, this function generates
> parsed routes
> - * for nat records in neighboring routers. For each ovn port in "od"
> that has
> - * enabled redistribution of NAT adresses, look up their neighbors
> (either
> - * directly routers, or routers connected through common LS) and
> advertise
> - * thier external NAT IPs too.*/
> -void
> -build_nat_connected_parsed_routes(
> -    const struct ovn_datapath *od,
> -    const struct lr_stateful_table *lr_stateful_table,
> -    const struct hmap *ls_ports,
> -    struct hmap *routes)
> -{
> -    const struct ovn_port *op;
> -    HMAP_FOR_EACH (op, dp_node, &od->ports) {
> -        if (!drr_mode_NAT_is_set(op->dynamic_routing_redistribute))
> {
> -            continue;
> -        }
> -
> -        if (!op->peer) {
> -            continue;
> -        }
> -
> -        struct ovn_datapath *peer_od = op->peer->od;
> -        ovs_assert(peer_od->nbs || peer_od->nbr);
> -
> -        const struct ovn_port *peer_port = NULL;
> -        /* This is a directly connected LR peer. */
> -        if (peer_od->nbr) {
> -            peer_port = op->peer;
> -
> -            const struct lr_stateful_record *peer_lr_stateful =
> -                lr_stateful_table_find_by_index(lr_stateful_table,
> -                                                 peer_od->index);
> -            if (!peer_lr_stateful) {
> -                continue;
> -            }
> -
> -            /* Advertise peer's NAT routes via the local port too.
> */
> -            build_nat_parsed_route_for_port(op, peer_lr_stateful-
> >lrnat_rec,
> -                                            ls_ports, routes);
> -            return;
> -        }
> -
> -        /* This peer is LSP, we need to check all connected router
> ports
> -         * for NAT.*/
> -        for (size_t i = 0; i < peer_od->n_router_ports; i++) {
> -            peer_port = peer_od->router_ports[i]->peer;
> -            if (peer_port == op) {
> -                /* Skip advertising router. */
> -                continue;
> -            }
> -
> -            const struct lr_stateful_record *peer_lr_stateful =
> -                lr_stateful_table_find_by_index(lr_stateful_table,
> -                                                peer_port->od-
> >index);
> -            if (!peer_lr_stateful) {
> -                continue;
> -            }
> -
> -            /* Advertise peer's NAT routes via the local port too.
> */
> -            build_nat_parsed_route_for_port(op, peer_lr_stateful-
> >lrnat_rec,
> -                                            ls_ports, routes);
> -        }
> -    }
> -}
> -
> -/* This function adds new parsed route for each IP in lb_ips to
> "routes".*/
> -static void
> -build_lb_parsed_route_for_port(const struct ovn_port
> *advertising_op,
> -                               const struct ovn_port *tracked_port,
> -                               const struct ovn_lb_ip_set *lb_ips,
> -                               struct hmap *routes)
> -{
> -    const struct ovn_datapath *advertising_od = advertising_op->od;
> -
> -    const char *ip_address;
> -    SSET_FOR_EACH (ip_address, &lb_ips->ips_v4) {
> -        struct in6_addr prefix;
> -        ip46_parse(ip_address, &prefix);
> -        parsed_route_add(advertising_od, NULL, &prefix, 32, false,
> -                         ip_address, advertising_op, 0, false,
> false,
> -                         NULL, ROUTE_SOURCE_LB, &advertising_op-
> >nbrp->header_,
> -                         tracked_port, routes);
> -    }
> -    SSET_FOR_EACH (ip_address, &lb_ips->ips_v6) {
> -        struct in6_addr prefix;
> -        ip46_parse(ip_address, &prefix);
> -        parsed_route_add(advertising_od, NULL, &prefix, 128, false,
> -                         ip_address, advertising_op, 0, false,
> false,
> -                         NULL, ROUTE_SOURCE_LB, &advertising_op-
> >nbrp->header_,
> -                         tracked_port, routes);
> -    }
> -}
> -
> -/* Similar to build_lb_parsed_routes, this function generates parsed
> routes
> - * for LB VIPs of neighboring routers. For each ovn port in "od"
> that has
> - * enabled redistribution of LB VIPs, look up their neighbors
> (either
> - * directly routers, or routers connected through common LS) and
> advertise
> - * thier LB VIPs too.*/
> -void
> -build_lb_connected_parsed_routes(
> -        const struct ovn_datapath *od,
> -        const struct lr_stateful_table *lr_stateful_table,
> -        struct hmap *routes)
> -{
> -    const struct ovn_port *op;
> -    HMAP_FOR_EACH (op, dp_node, &od->ports) {
> -        if (!drr_mode_LB_is_set(op->dynamic_routing_redistribute)) {
> -            continue;
> -        }
> -
> -        if (!op->peer) {
> -            continue;
> -        }
> -
> -        struct ovn_datapath *peer_od = op->peer->od;
> -        ovs_assert(peer_od->nbs || peer_od->nbr);
> -
> -        const struct lr_stateful_record *lr_stateful_rec;
> -        const struct ovn_port *peer_port = NULL;
> -        /* This is directly connected LR peer. */
> -        if (peer_od->nbr) {
> -            lr_stateful_rec = lr_stateful_table_find_by_index(
> -                lr_stateful_table, peer_od->index);
> -            peer_port = op->peer;
> -            build_lb_parsed_route_for_port(op, peer_port,
> -                                           lr_stateful_rec->lb_ips,
> routes);
> -            return;
> -        }
> -
> -        /* This peer is LSP, we need to check all connected router
> ports for
> -         * LBs.*/
> -        for (size_t i = 0; i < peer_od->n_router_ports; i++) {
> -            peer_port = peer_od->router_ports[i]->peer;
> -            if (peer_port == op) {
> -                /* no need to check for LBs on ovn_port that
> initiated this
> -                 * function.*/
> -                continue;
> -            }
> -            lr_stateful_rec = lr_stateful_table_find_by_index(
> -                lr_stateful_table, peer_port->od->index);
> -
> -            build_lb_parsed_route_for_port(op, peer_port,
> -                                           lr_stateful_rec->lb_ips,
> routes);
> -        }
> -    }
> -}
> -
> -void
> -build_lb_parsed_routes(const struct ovn_datapath *od,
> -                       const struct ovn_lb_ip_set *lb_ips,
> -                       struct hmap *routes)
> -{
> -    const struct ovn_port *op;
> -    HMAP_FOR_EACH (op, dp_node, &od->ports) {
> -        if (!drr_mode_LB_is_set(op->dynamic_routing_redistribute)) {
> -            continue;
> -        }
> -
> -        /* Traffic processed by a load balancer is:
> -         * - handled by the chassis where a gateway router is bound
> -         * OR
> -         * - always redirected to a distributed gateway router port
> -         *
> -         * Advertise the LB IPs via all 'op' if this is a gateway
> router or
> -         * throuh all DGPs of this distributed router otherwise. */
> -        struct ovn_port *op_ = NULL;
> -        size_t n_tracked_ports = !od->is_gw_router ? od-
> >n_l3dgw_ports : 1;
> -        struct ovn_port **tracked_ports = !od->is_gw_router
> -                                          ? od->l3dgw_ports
> -                                          : &op_;
> -
> -        for (size_t i = 0; i < n_tracked_ports; i++) {
> -            build_lb_parsed_route_for_port(op, tracked_ports[i],
> lb_ips,
> -                                           routes);
> -        }
> -    }
> -
> -}
>  struct ecmp_route_list_node {
>      struct ovs_list list_node;
>      uint16_t id; /* starts from 1 */
> diff --git a/northd/northd.h b/northd/northd.h
> index de0d924c5f..12fccd7751 100644
> --- a/northd/northd.h
> +++ b/northd/northd.h
> @@ -833,20 +833,6 @@ void route_policies_destroy(struct
> route_policies_data *);
>  void build_parsed_routes(const struct ovn_datapath *, const struct
> hmap *,
>                           const struct hmap *, struct hmap *, struct
> simap *,
>                           struct hmap *);
> -void build_nat_parsed_routes(const struct ovn_datapath *,
> -                             const struct lr_nat_record *,
> -                             const struct hmap *ls_ports,
> -                             struct hmap *routes);
> -void build_nat_connected_parsed_routes(const struct ovn_datapath *,
> -                                       const struct
> lr_stateful_table *,
> -                                       const struct hmap *ls_ports,
> -                                       struct hmap *routes);
> -void build_lb_parsed_routes(const struct ovn_datapath *,
> -                            const struct ovn_lb_ip_set *,
> -                            struct hmap *);
> -void build_lb_connected_parsed_routes(const struct ovn_datapath *,
> -                                      const struct lr_stateful_table
> *,
> -                                      struct hmap *routes);
>  uint32_t get_route_table_id(struct simap *, const char *);
>  void routes_init(struct routes_data *);
>  void routes_destroy(struct routes_data *);

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to