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 <lorenzo.bianc...@redhat.com> > Signed-off-by: Felix Huettner <felix.huettner@stackit.cloud> > ---
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 d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev