This function checks two arrays of virDomainNetPortForwards for
equality. It seemed silly to send a separate #elements for each array
just to check for their equality, but I could easily be convinced to
do it that way (rather than having the caller check for equal #element
and then just send it once).
Signed-off-by: Laine Stump <laine@redhat.com>
---
src/conf/domain_conf.c | 53 ++++++++++++++++++++++++++++++++++++++++
src/conf/domain_conf.h | 3 +++
src/libvirt_private.syms | 1 +
3 files changed, 57 insertions(+)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 9ca5c2450c..d00a43e969 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -21037,6 +21037,59 @@ virDomainNetBackendIsEqual(virDomainNetBackend *src,
return true;
}
+static bool
+virDomainNetPortForwardRangeIsEqual(virDomainNetPortForwardRange *r1,
+ virDomainNetPortForwardRange *r2)
+{
+ if (!r1 && !r2)
+ return true;
+ if (!(r1 && r2))
+ return false;
+
+ return (r1->start == r2->start &&
+ r1->end == r2->end &&
+ r1->to == r2->to &&
+ r1->exclude == r2->exclude);
+}
+
+
+bool
+virDomainNetPortForwardsIsEqual(virDomainNetPortForward **pfs1,
+ virDomainNetPortForward **pfs2,
+ size_t npfs)
+{
+ size_t i;
+
+ if (!pfs1 && !pfs2)
+ return true;
+ if (!(pfs1 && pfs2))
+ return false;
+
+ for (i = 0; i < npfs; i++) {
+ virDomainNetPortForward *pf1 = pfs1[0];
+ virDomainNetPortForward *pf2 = pfs2[0];
+
+ if (!pf1 && !pf2)
+ continue;
+ if (!(pf1 && pf2))
+ return false;
+
+ if (STRNEQ_NULLABLE(pf1->dev, pf2->dev) ||
+ pf1->proto != pf2->proto ||
+ !virSocketAddrEqual(&pf1->address, &pf2->address) ||
+ pf1->nRanges != pf2->nRanges) {
+ return false;
+ }
+
+ for (i = 0; i < pf1->nRanges; i++) {
+ if (!virDomainNetPortForwardRangeIsEqual(pf1->ranges[i], pf2->ranges[i]))
+ return false;
+ }
+ }
+
+ return true;
+}
+
static bool
virDomainNetDefCheckABIStability(virDomainNetDef *src,
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index cb35ff06bd..83d49969d3 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -4099,6 +4099,9 @@ void virDomainNetInsert(virDomainDef *def, virDomainNetDef *net);
void virDomainNetUpdate(virDomainDef *def, size_t netidx, virDomainNetDef *newnet);
bool virDomainNetBackendIsEqual(virDomainNetBackend *src,
virDomainNetBackend *dst);
+bool virDomainNetPortForwardsIsEqual(virDomainNetPortForward **pfs1,
+ virDomainNetPortForward **pfs2,
+ size_t npfs);
int virDomainNetDHCPInterfaces(virDomainDef *def, virDomainInterfacePtr **ifaces);
int virDomainNetARPInterfaces(virDomainDef *def, virDomainInterfacePtr **ifaces);
virDomainNetDef *virDomainNetRemove(virDomainDef *def, size_t i);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 4e57e4a8f6..ab2ab8afd2 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -577,6 +577,7 @@ virDomainNetModelTypeFromString;
virDomainNetModelTypeToString;
virDomainNetNotifyActualDevice;
virDomainNetPortForwardFree;
+virDomainNetPortForwardsIsEqual;
virDomainNetReleaseActualDevice;
virDomainNetRemove;
virDomainNetRemoveByObj;
--
2.52.0
© 2016 - 2026 Red Hat, Inc.