From: Hyman Huang <yong.huang(a)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