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