On Sun, Jun 28, 2026 at 12:12 PM chanyeol yoon <[email protected]> wrote:

> From: Chanyeol Yoon <[email protected]>
>
> ovn-northd publishes the IP/MAC bindings to advertise over EVPN in the
> SB Advertised_MAC_Binding table.  With the ovn-northd change "northd:
> Advertise distributed NAT IPs over EVPN" this now also includes the
> distributed floating IPs (dnat_and_snat NAT entries) of a Logical
> Router, attached to its peer provider Logical Switch.
>
> ovn-northd only populates a row when the datapath opted into
> advertising it (through the 'ip'/'nat' redistribute tokens), so
> advertise every Advertised_MAC_Binding row of the datapath as an EVPN
> Type-2 MAC+IP neighbor without re-checking the tokens.  When 'fdb' is
> set, the MAC is additionally programmed into the FDB, so that a
> floating IP is reachable as an EVPN Type-2 route on the chassis that
> hosts the workload.
>
> Suggested-by: Ales Musil <[email protected]>
> Signed-off-by: Chanyeol Yoon <[email protected]>
> ---
>  controller/neighbor.c | 52 +++++++++++++++++++++++++++++++------------
>  1 file changed, 38 insertions(+), 14 deletions(-)
>
> diff --git a/controller/neighbor.c b/controller/neighbor.c
> index 72fabe205..593cfa796 100644
> --- a/controller/neighbor.c
> +++ b/controller/neighbor.c
> @@ -46,8 +46,9 @@ neighbor_interface_monitor_alloc(enum neighbor_family
> family,
>  static void neighbor_collect_mac_to_advertise(
>      const struct neighbor_ctx_in *, struct hmap *neighbors,
>      struct sset *advertised_pbs, const struct sbrec_datapath_binding *);
> -static void neighbor_collect_ip_mac_to_advertise(
> -    const struct neighbor_ctx_in *,
> +static void neighbor_collect_advertised_mac_bindings(
> +    const struct neighbor_ctx_in *, enum neigh_redistribute_mode mode,
> +    struct hmap *fdb_neighbors,
>      struct hmap *neighbors_v4, struct hmap *neighbors_v6,
>      struct sset *advertised_pbs, const struct sbrec_datapath_binding *);
>  static const struct sbrec_port_binding
> *neighbor_get_relevant_port_binding(
> @@ -176,14 +177,15 @@ neighbor_run(struct neighbor_ctx_in *n_ctx_in,
>                                                n_ctx_out->advertised_pbs,
>                                                ld->datapath);
>          }
> -        if (nrm_mode_IP_is_set(mode) && br_v4 && br_v6) {
> -            neighbor_collect_ip_mac_to_advertise(n_ctx_in,
> -
>  &br_v4->announced_neighbors,
> -
>  &br_v6->announced_neighbors,
> -
>  n_ctx_out->advertised_pbs,
> -                                                 ld->datapath);
> -        }
> -
> +        /* Advertise every SB Advertised_MAC_Binding row of the datapath
> as an
> +         * EVPN Type-2 MAC+IP neighbor; ovn-northd only populates rows
> that are
> +         * meant to be advertised.  With 'fdb' set, also program them as
> FDB
> +         * entries. */
> +        neighbor_collect_advertised_mac_bindings(
> +            n_ctx_in, mode, lo ? &lo->announced_neighbors : NULL,
> +            br_v4 ? &br_v4->announced_neighbors : NULL,
> +            br_v6 ? &br_v6->announced_neighbors : NULL,
> +            n_ctx_out->advertised_pbs, ld->datapath);
>      }
>  }
>
> @@ -303,9 +305,18 @@ neighbor_collect_mac_to_advertise(const struct
> neighbor_ctx_in *n_ctx_in,
>      sbrec_port_binding_index_destroy_row(target);
>  }
>
> +/* Walks the SB Advertised_MAC_Binding rows of 'dp' and advertises each
> as an
> + * EVPN Type-2 MAC+IP neighbor (into 'neighbors_v4'/'neighbors_v6').
> + * ovn-northd only populates a row when the datapath opted into
> advertising it
> + * (via the 'ip'/'nat' redistribute tokens), so every present row is
> advertised
> + * here.  With 'fdb' set in 'mode' the MAC is additionally programmed
> into the
> + * FDB ('fdb_neighbors').  Any of the target hmaps may be NULL when the
> + * corresponding monitored interface does not exist. */
>  static void
> -neighbor_collect_ip_mac_to_advertise(
> +neighbor_collect_advertised_mac_bindings(
>          const struct neighbor_ctx_in *n_ctx_in,
> +        enum neigh_redistribute_mode mode,
> +        struct hmap *fdb_neighbors,
>          struct hmap *neighbors_v4,
>          struct hmap *neighbors_v6,
>          struct sset *advertised_pbs,
> @@ -345,12 +356,25 @@ neighbor_collect_ip_mac_to_advertise(
>              continue;
>          }
>
> +        bool advertised = false;
>          struct hmap *neighbors = IN6_IS_ADDR_V4MAPPED(&ip)
>                                   ? neighbors_v4 : neighbors_v6;
> -        if (!advertise_neigh_find(neighbors, ea, &ip)) {
> -            advertise_neigh_add(neighbors, ea, ip);
> +        if (neighbors) {
> +            if (!advertise_neigh_find(neighbors, ea, &ip)) {
> +                advertise_neigh_add(neighbors, ea, ip);
> +            }
> +            advertised = true;
> +        }
>

nit: Missing empty space.


> +        if (nrm_mode_FDB_is_set(mode) && fdb_neighbors) {
> +            if (!advertise_neigh_find(fdb_neighbors, ea, &in6addr_any)) {
> +                advertise_neigh_add(fdb_neighbors, ea, in6addr_any);
> +            }
> +            advertised = true;
> +        }
> +
> +        if (advertised) {
> +            sset_add(advertised_pbs, pb->logical_port);
>          }
> -        sset_add(advertised_pbs, pb->logical_port);
>      }
>
>      sbrec_advertised_mac_binding_index_destroy_row(target);
> --
> 2.54.0 (Apple Git-157)
>
>
Thank you Chanyeol,

applied to main with the nit addressed.

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

Reply via email to