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>
---
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];
+        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];
+        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);
-- 
2.47.1


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

Reply via email to