From: Hyman Huang <yong.hu...@smartx.com>

The 'logFile' field within the virDomainNetBackend struct
is backend-specific. Refactor the code by introducing a
union struct to encapsulate backend-specific fields,
rather than using a plain field.

This refactoring is also a prerequisite for implementing
the 'openvswitch' backend of vhostuser interface in
upcoming commits.
---
 src/conf/domain_conf.c | 18 +++++++++++++-----
 src/conf/domain_conf.h |  7 +++++--
 src/qemu/qemu_passt.c  |  4 ++--
 3 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 1e24e41a48..9862a76023 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2917,7 +2917,8 @@ virDomainNetDefFree(virDomainNetDef *def)
 
     g_free(def->backend.tap);
     g_free(def->backend.vhost);
-    g_free(def->backend.logFile);
+    if (def->backend.type == VIR_DOMAIN_NET_BACKEND_PASST)
+        g_free(def->backend.data.passt.logFile);
     virDomainNetTeamingInfoFree(def->teaming);
     g_free(def->virtPortProfile);
     g_free(def->script);
@@ -9797,7 +9798,8 @@ virDomainNetBackendParseXML(xmlNodePtr node,
         return -1;
     }
 
-    def->backend.logFile = virXMLPropString(node, "logFile");
+    if (def->backend.type == VIR_DOMAIN_NET_BACKEND_PASST)
+        def->backend.data.passt.logFile = virXMLPropString(node, "logFile");
 
     if (tap)
         def->backend.tap = virFileSanitizePath(tap);
@@ -20798,10 +20800,14 @@ virDomainNetBackendIsEqual(virDomainNetBackend *src,
 {
     if (src->type != dst->type ||
         STRNEQ_NULLABLE(src->tap, dst->tap) ||
-        STRNEQ_NULLABLE(src->vhost, dst->vhost) ||
-        STRNEQ_NULLABLE(src->logFile, dst->logFile)) {
+        STRNEQ_NULLABLE(src->vhost, dst->vhost)) {
         return false;
     }
+
+    if (src->type == VIR_DOMAIN_NET_BACKEND_PASST) {
+        return !(STRNEQ_NULLABLE(src->data.passt.logFile, 
dst->data.passt.logFile));
+    }
+
     return true;
 }
 
@@ -24933,7 +24939,9 @@ virDomainNetBackendFormat(virBuffer *buf,
     }
     virBufferEscapeString(&attrBuf, " tap='%s'", backend->tap);
     virBufferEscapeString(&attrBuf, " vhost='%s'", backend->vhost);
-    virBufferEscapeString(&attrBuf, " logFile='%s'", backend->logFile);
+    if (backend->type == VIR_DOMAIN_NET_BACKEND_PASST) {
+        virBufferEscapeString(&attrBuf, " logFile='%s'", 
backend->data.passt.logFile);
+    }
     virXMLFormatElement(buf, "backend", &attrBuf, NULL);
 }
 
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 6997cf7c09..6d43654f0a 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1074,8 +1074,11 @@ struct _virDomainNetBackend {
     virDomainNetBackendType type;
     char *tap;
     char *vhost;
-    /* The following are currently only valid/used when backend type='passt' */
-    char *logFile;  /* path to logfile used by passt process */
+    union {
+        struct {
+            char *logFile;  /* path to logfile used by passt process */
+        } passt;
+    } data;
 };
 
 struct _virDomainNetPortForwardRange {
diff --git a/src/qemu/qemu_passt.c b/src/qemu/qemu_passt.c
index fcc34de384..d74fc2ee47 100644
--- a/src/qemu/qemu_passt.c
+++ b/src/qemu/qemu_passt.c
@@ -226,8 +226,8 @@ qemuPasstStart(virDomainObj *vm,
     if (net->sourceDev)
         virCommandAddArgList(cmd, "--interface", net->sourceDev, NULL);
 
-    if (net->backend.logFile)
-        virCommandAddArgList(cmd, "--log-file", net->backend.logFile, NULL);
+    if (net->backend.data.passt.logFile)
+        virCommandAddArgList(cmd, "--log-file", 
net->backend.data.passt.logFile, NULL);
 
     /* Add IP address info */
     for (i = 0; i < net->guestIP.nips; i++) {
-- 
2.27.0

Reply via email to