On 12/10/24 3:12 PM, Felix Huettner via dev wrote:
> We already parse the networks of a port to the ovn_port struct, so there
> is no need to reference northbound.
> This is a prerequisite for later patches that use derived router ports.
>
> Acked-by: Lorenzo Bianconi <[email protected]>
> Signed-off-by: Felix Huettner <[email protected]>
> ---
Hi Felix,
> Changed to original patchset:
> * extract the lrp address formatting logic to ovn-util.c
>
> lib/ovn-util.c | 20 ++++++++++++++++++++
> lib/ovn-util.h | 2 ++
> northd/northd.c | 11 +++++++----
> 3 files changed, 29 insertions(+), 4 deletions(-)
>
> diff --git a/lib/ovn-util.c b/lib/ovn-util.c
> index 1ad347419..32f440ec0 100644
> --- a/lib/ovn-util.c
> +++ b/lib/ovn-util.c
> @@ -353,6 +353,26 @@ extract_lrp_networks(const struct
> nbrec_logical_router_port *lrp,
> return true;
> }
>
> +void
> +lrp_network_to_string(const struct lport_addresses *addresses, struct ds *s,
> + bool include_generated_v6)
> +{
> + ds_put_cstr(s, addresses->ea_s);
> + for (size_t i = 0; i < addresses->n_ipv4_addrs; i++) {
> + struct ipv4_netaddr addr = addresses->ipv4_addrs[i];
Nit: no need to copy.
> + ds_put_format(s, " %s/%d", addr.addr_s, addr.plen);
> + }
> + for (size_t i = 0; i < addresses->n_ipv6_addrs; i++) {
> + /* The generated v6 address is always at the end
> + * (see extract_lrp_networks). */
> + if (!include_generated_v6 && i == addresses->n_ipv6_addrs -1) {
> + break;
> + }
> + struct ipv6_netaddr addr = addresses->ipv6_addrs[i];
Nit: no need to copy.
> + ds_put_format(s, " %s/%d", addr.addr_s, addr.plen);
> + }
> +}
> +
> bool
> extract_sbrec_binding_first_mac(const struct sbrec_port_binding *binding,
> struct eth_addr *ea)
> diff --git a/lib/ovn-util.h b/lib/ovn-util.h
> index 7b98b9b9a..6c1c75524 100644
> --- a/lib/ovn-util.h
> +++ b/lib/ovn-util.h
> @@ -107,6 +107,8 @@ bool extract_ip_addresses(const char *address, struct
> lport_addresses *);
> bool extract_ip_address(const char *address, struct lport_addresses *);
> bool extract_lrp_networks(const struct nbrec_logical_router_port *,
> struct lport_addresses *);
> +void lrp_network_to_string(const struct lport_addresses *, struct ds *,
> + bool include_generated_v6);
> bool extract_sbrec_binding_first_mac(const struct sbrec_port_binding
> *binding,
> struct eth_addr *ea);
>
> diff --git a/northd/northd.c b/northd/northd.c
> index 3a488ff3d..fb30ecbd7 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -3142,11 +3142,14 @@ ovn_port_update_sbrec(struct ovsdb_idl_txn *ovnsb_txn,
> sbrec_port_binding_set_parent_port(op->sb, NULL);
> sbrec_port_binding_set_tag(op->sb, NULL, 0);
>
> + const struct lport_addresses *networks;
> + if (op->primary_port) {
> + networks = &op->primary_port->lrp_networks;
> + } else {
> + networks = &op->lrp_networks;
> + }
> struct ds s = DS_EMPTY_INITIALIZER;
> - ds_put_cstr(&s, op->nbrp->mac);
> - for (int i = 0; i < op->nbrp->n_networks; ++i) {
> - ds_put_format(&s, " %s", op->nbrp->networks[i]);
> - }
> + lrp_network_to_string(networks, &s, false);
> const char *addresses = ds_cstr(&s);
> sbrec_port_binding_set_mac(op->sb, &addresses, 1);
> ds_destroy(&s);
Thanks, Felix and Lorenzo!
I applied this to main with the following minor changes:
diff --git a/lib/ovn-util.c b/lib/ovn-util.c
index 32f440ec08..b78bdbfa11 100644
--- a/lib/ovn-util.c
+++ b/lib/ovn-util.c
@@ -359,8 +359,8 @@ lrp_network_to_string(const struct lport_addresses
*addresses, struct ds *s,
{
ds_put_cstr(s, addresses->ea_s);
for (size_t i = 0; i < addresses->n_ipv4_addrs; i++) {
- struct ipv4_netaddr addr = addresses->ipv4_addrs[i];
- ds_put_format(s, " %s/%d", addr.addr_s, addr.plen);
+ struct ipv4_netaddr *addr = &addresses->ipv4_addrs[i];
+ ds_put_format(s, " %s/%d", addr->addr_s, addr->plen);
}
for (size_t i = 0; i < addresses->n_ipv6_addrs; i++) {
/* The generated v6 address is always at the end
@@ -368,8 +368,8 @@ lrp_network_to_string(const struct lport_addresses
*addresses, struct ds *s,
if (!include_generated_v6 && i == addresses->n_ipv6_addrs -1) {
break;
}
- struct ipv6_netaddr addr = addresses->ipv6_addrs[i];
- ds_put_format(s, " %s/%d", addr.addr_s, addr.plen);
+ struct ipv6_netaddr *addr = &addresses->ipv6_addrs[i];
+ ds_put_format(s, " %s/%d", addr->addr_s, addr->plen);
}
}
diff --git a/northd/northd.c b/northd/northd.c
index e6322959b6..88adfbf6fc 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -3142,14 +3142,11 @@ ovn_port_update_sbrec(struct ovsdb_idl_txn
*ovnsb_txn,
sbrec_port_binding_set_parent_port(op->sb, NULL);
sbrec_port_binding_set_tag(op->sb, NULL, 0);
- const struct lport_addresses *networks;
- if (op->primary_port) {
- networks = &op->primary_port->lrp_networks;
- } else {
- networks = &op->lrp_networks;
- }
struct ds s = DS_EMPTY_INITIALIZER;
- lrp_network_to_string(networks, &s, false);
+ lrp_network_to_string(op->primary_port
+ ? &op->primary_port->lrp_networks
+ : &op->lrp_networks,
+ &s, false);
const char *addresses = ds_cstr(&s);
sbrec_port_binding_set_mac(op->sb, &addresses, 1);
ds_destroy(&s);
Regards,
Dumitru
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev