From nobody Fri May 3 13:54:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1501071626738510.6209122143089; Wed, 26 Jul 2017 05:20:26 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9A46E883C0; Wed, 26 Jul 2017 12:20:21 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 41234784C9; Wed, 26 Jul 2017 12:20:21 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id E2ED8388A; Wed, 26 Jul 2017 12:20:20 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v6QCKErj032182 for ; Wed, 26 Jul 2017 08:20:14 -0400 Received: by smtp.corp.redhat.com (Postfix) id 4D291784BA; Wed, 26 Jul 2017 12:20:14 +0000 (UTC) Received: from inaba.usersys.redhat.com (unknown [10.43.2.85]) by smtp.corp.redhat.com (Postfix) with ESMTPS id C6F98784BD for ; Wed, 26 Jul 2017 12:20:13 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 9A46E883C0 Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com From: Andrea Bolognani To: libvir-list@redhat.com Date: Wed, 26 Jul 2017 14:20:04 +0200 Message-Id: <1501071605-25282-2-git-send-email-abologna@redhat.com> In-Reply-To: <1501071605-25282-1-git-send-email-abologna@redhat.com> References: <1501071605-25282-1-git-send-email-abologna@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 1/2] tests: Prepare for stricter NIC model validation X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Wed, 26 Jul 2017 12:20:22 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" While using "definitely-not-virtio" as a model name is very cute, it will also cause the relevant test to fail once we introduce stricter validation. Use "e1000", which is definitely not virtio but also a valid model name, instead. Signed-off-by: Andrea Bolognani --- tests/qemuxml2argvdata/qemuxml2argv-tap-vhost-incorrect.xml | 2 +- tests/qemuxml2xmloutdata/qemuxml2xmlout-tap-vhost-incorrect.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/qemuxml2argvdata/qemuxml2argv-tap-vhost-incorrect.xml b/= tests/qemuxml2argvdata/qemuxml2argv-tap-vhost-incorrect.xml index 1d6c0ff..a1532cb 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-tap-vhost-incorrect.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-tap-vhost-incorrect.xml @@ -24,7 +24,7 @@ - + diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-tap-vhost-incorrect.xm= l b/tests/qemuxml2xmloutdata/qemuxml2xmlout-tap-vhost-incorrect.xml index a39b8cb..3a95b60 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-tap-vhost-incorrect.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-tap-vhost-incorrect.xml @@ -28,7 +28,7 @@ - +
--=20 2.7.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Fri May 3 13:54:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1501071620988917.8104578504879; Wed, 26 Jul 2017 05:20:20 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D184E267DB; Wed, 26 Jul 2017 12:20:16 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id AAA605D96C; Wed, 26 Jul 2017 12:20:16 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 58C7B180597D; Wed, 26 Jul 2017 12:20:16 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v6QCKF4W032192 for ; Wed, 26 Jul 2017 08:20:15 -0400 Received: by smtp.corp.redhat.com (Postfix) id 6F598784B0; Wed, 26 Jul 2017 12:20:15 +0000 (UTC) Received: from inaba.usersys.redhat.com (unknown [10.43.2.85]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9BE03784AF for ; Wed, 26 Jul 2017 12:20:14 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com D184E267DB Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com From: Andrea Bolognani To: libvir-list@redhat.com Date: Wed, 26 Jul 2017 14:20:05 +0200 Message-Id: <1501071605-25282-3-git-send-email-abologna@redhat.com> In-Reply-To: <1501071605-25282-1-git-send-email-abologna@redhat.com> References: <1501071605-25282-1-git-send-email-abologna@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 2/2] conf: Introduce the virDomainNetModel enumeration X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Wed, 26 Jul 2017 12:20:17 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Up until now, we have stored the model name for network interfaces as raw strings in virDomainNetDef: this is suboptimal for a number of reasons, such as having to perform relatively expensive string allocations and comparisons all the time and not giving the compiler the opportunity to have our back in certain situations. Replace the strings with an enumeration similar to the ones we already use for pretty much everything else. Signed-off-by: Andrea Bolognani --- Most drivers already performed pretty strict validation of the model name, so there should be no problems there; the QEMU driver, however, though it would be a good idea to just accept any string that possibly kinda resembled a valid model name. The models I've included in the enumeration are those that were already referenced somewhere else in libvirt, but there's no guarantee that other model names are not used in the wild. One possibility would be to also add (a subset of) all models QEMU ever supported, even though some of them might have never been used, just to be safe; on the other side of the spectrum, we could go with the minimal set and possibly add more if breakages are reported. src/bhyve/bhyve_command.c | 6 ++-- src/bhyve/bhyve_parse_command.c | 6 +++- src/conf/domain_conf.c | 63 ++++++++++++++++++++++++++++++-------= ---- src/conf/domain_conf.h | 28 +++++++++++++++++- src/libvirt_private.syms | 2 ++ src/libxl/libxl_conf.c | 7 +++-- src/qemu/qemu_command.c | 14 +++++---- src/qemu/qemu_domain.c | 24 +++++++--------- src/qemu/qemu_domain_address.c | 47 +++++++++++++++++++----------- src/qemu/qemu_driver.c | 3 +- src/qemu/qemu_hotplug.c | 11 ++++--- src/qemu/qemu_interface.c | 8 +++--- src/qemu/qemu_parse_command.c | 10 +++++-- src/security/virt-aa-helper.c | 2 +- src/vbox/vbox_common.c | 27 +++++++++--------- src/vmx/vmx.c | 53 ++++++++++++++++------------------ src/xenconfig/xen_common.c | 21 ++++++++------ src/xenconfig/xen_sxpr.c | 23 +++++++++------ 18 files changed, 225 insertions(+), 130 deletions(-) diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c index b3ae315..ac9ea56 100644 --- a/src/bhyve/bhyve_command.c +++ b/src/bhyve/bhyve_command.c @@ -57,10 +57,10 @@ bhyveBuildNetArgStr(virConnectPtr conn, int ret =3D -1; virDomainNetType actualType =3D virDomainNetGetActualType(net); =20 - if (STREQ(net->model, "virtio")) { + if (net->model =3D=3D VIR_DOMAIN_NET_MODEL_VIRTIO) { if (VIR_STRDUP(nic_model, "virtio-net") < 0) return -1; - } else if (STREQ(net->model, "e1000")) { + } else if (net->model =3D=3D VIR_DOMAIN_NET_MODEL_E1000) { if ((bhyveDriverGetCaps(conn) & BHYVE_CAP_NET_E1000) !=3D 0) { if (VIR_STRDUP(nic_model, "e1000") < 0) return -1; @@ -73,7 +73,7 @@ bhyveBuildNetArgStr(virConnectPtr conn, } else { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("NIC model '%s' is not supported"), - net->model); + NULLSTR(virDomainNetModelTypeToString(net->model))); return -1; } =20 diff --git a/src/bhyve/bhyve_parse_command.c b/src/bhyve/bhyve_parse_comman= d.c index fcaaed2..f77ed27 100644 --- a/src/bhyve/bhyve_parse_command.c +++ b/src/bhyve/bhyve_parse_command.c @@ -515,8 +515,12 @@ bhyveParsePCINet(virDomainDefPtr def, if (VIR_STRDUP(net->data.bridge.brname, "virbr0") < 0) goto error; =20 - if (VIR_STRDUP(net->model, model) < 0) + if ((net->model =3D virDomainNetModelTypeFromString(model)) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("NIC model '%s' is not supported"), + model); goto error; + } =20 net->info.type =3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; net->info.addr.pci.slot =3D pcislot; diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 34c8f45..7a2ff8d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -418,6 +418,28 @@ VIR_ENUM_IMPL(virDomainNet, VIR_DOMAIN_NET_TYPE_LAST, "hostdev", "udp") =20 +VIR_ENUM_IMPL(virDomainNetModel, VIR_DOMAIN_NET_MODEL_LAST, + "none", + "usb-net", + "netfront", + "vlance", + "vmxnet", + "vmxnet2", + "vmxnet3", + "am79c970a", + "am79c973", + "82540em", + "82543gc", + "82545em", + "spapr-vlan", + "smc91c111", + "lan9118", + "rtl8139", + "e1000", + "e1000e", + "virtio", +); + VIR_ENUM_IMPL(virDomainNetBackend, VIR_DOMAIN_NET_BACKEND_TYPE_LAST, "default", "qemu", @@ -1986,7 +2008,7 @@ virDomainNetDefClear(virDomainNetDefPtr def) if (!def) return; =20 - VIR_FREE(def->model); + def->model =3D VIR_DOMAIN_NET_MODEL_NONE; =20 switch (def->type) { case VIR_DOMAIN_NET_TYPE_VHOSTUSER: @@ -4484,7 +4506,7 @@ virDomainDeviceDefPostParseInternal(virDomainDeviceDe= fPtr dev, =20 if (dev->type =3D=3D VIR_DOMAIN_DEVICE_NET) { virDomainNetDefPtr net =3D dev->data.net; - if (STRNEQ_NULLABLE(net->model, "virtio") && + if (net->model !=3D VIR_DOMAIN_NET_MODEL_VIRTIO && virDomainCheckVirtioOptions(net->virtio) < 0) return -1; } @@ -9769,9 +9791,6 @@ virDomainActualNetDefParseXML(xmlNodePtr node, return ret; } =20 -#define NET_MODEL_CHARS \ - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-" - =20 int virDomainNetAppendIPAddress(virDomainNetDefPtr def, @@ -10330,18 +10349,20 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xml= opt, * i82551 i82557b i82559er ne2k_pci pcnet rtl8139 e1000 virtio * QEMU PPC64 supports spapr-vlan */ - if (model !=3D NULL) { - if (strspn(model, NET_MODEL_CHARS) < strlen(model)) { - virReportError(VIR_ERR_INVALID_ARG, "%s", - _("Model name contains invalid characters")); + if (model) { + if ((val =3D virDomainNetModelTypeFromString(model)) < 0 || + val =3D=3D VIR_DOMAIN_NET_MODEL_NONE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unknown interface " + "has been specified"), + model); goto error; } - def->model =3D model; - model =3D NULL; + def->model =3D val; } =20 if (def->type !=3D VIR_DOMAIN_NET_TYPE_HOSTDEV && - STREQ_NULLABLE(def->model, "virtio")) { + def->model =3D=3D VIR_DOMAIN_NET_MODEL_VIRTIO) { if (backend !=3D NULL) { if ((val =3D virDomainNetBackendTypeFromString(backend)) < 0 || val =3D=3D VIR_DOMAIN_NET_BACKEND_TYPE_DEFAULT) { @@ -19479,10 +19500,11 @@ virDomainNetDefCheckABIStability(virDomainNetDefP= tr src, return false; } =20 - if (STRNEQ_NULLABLE(src->model, dst->model)) { + if (src->model !=3D dst->model) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Target network card model %s does not match sour= ce %s"), - NULLSTR(dst->model), NULLSTR(src->model)); + NULLSTR(virDomainNetModelTypeToString(dst->model)), + NULLSTR(virDomainNetModelTypeToString(src->model))); return false; } =20 @@ -22734,9 +22756,18 @@ virDomainNetDefFormat(virBufferPtr buf, virBufferAddLit(buf, "/>\n"); } if (def->model) { + const char *modelName =3D virDomainNetModelTypeToString(def->model= ); + + if (!modelName) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected net model %d"), def->model); + return -1; + } + virBufferEscapeString(buf, "\n", - def->model); - if (STREQ(def->model, "virtio")) { + modelName); + + if (def->model =3D=3D VIR_DOMAIN_NET_MODEL_VIRTIO) { char *str =3D NULL, *gueststr =3D NULL, *hoststr =3D NULL; int rc =3D 0; =20 diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 239b218..3d8dfdb 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -900,6 +900,32 @@ typedef enum { VIR_DOMAIN_NET_TYPE_LAST } virDomainNetType; =20 +typedef enum { + VIR_DOMAIN_NET_MODEL_NONE =3D 0, + VIR_DOMAIN_NET_MODEL_USB_NET, + VIR_DOMAIN_NET_MODEL_NETFRONT, + VIR_DOMAIN_NET_MODEL_VLANCE, + VIR_DOMAIN_NET_MODEL_VMXNET, + VIR_DOMAIN_NET_MODEL_VMXNET2, + VIR_DOMAIN_NET_MODEL_VMXNET3, + VIR_DOMAIN_NET_MODEL_AM79C970A, + VIR_DOMAIN_NET_MODEL_AM79C973, + VIR_DOMAIN_NET_MODEL_82540EM, + VIR_DOMAIN_NET_MODEL_82543GC, + VIR_DOMAIN_NET_MODEL_82545EM, + VIR_DOMAIN_NET_MODEL_SPAPR_VLAN, + VIR_DOMAIN_NET_MODEL_SMC91C111, + VIR_DOMAIN_NET_MODEL_LAN9118, + VIR_DOMAIN_NET_MODEL_RTL8139, + VIR_DOMAIN_NET_MODEL_E1000, + VIR_DOMAIN_NET_MODEL_E1000E, + VIR_DOMAIN_NET_MODEL_VIRTIO, + + VIR_DOMAIN_NET_MODEL_LAST +} virDomainNetModel; + +VIR_ENUM_DECL(virDomainNetModel); + /* the backend driver used for virtio interfaces */ typedef enum { VIR_DOMAIN_NET_BACKEND_TYPE_DEFAULT, /* prefer kernel, fall back to us= er */ @@ -960,7 +986,7 @@ struct _virDomainActualNetDef { struct _virDomainNetDef { virDomainNetType type; virMacAddr mac; - char *model; + int model; /* enum virDomainNetModel */ union { struct { virDomainNetBackendType name; /* which driver backend to use */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index fa2cd08..579ce98 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -433,6 +433,8 @@ virDomainNetGetActualType; virDomainNetGetActualVirtPortProfile; virDomainNetGetActualVlan; virDomainNetInsert; +virDomainNetModelTypeFromString; +virDomainNetModelTypeToString; virDomainNetRemove; virDomainNetRemoveHostdev; virDomainNetTypeFromString; diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 4416a09..b7950b4 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1022,15 +1022,16 @@ libxlMakeNic(virDomainDefPtr def, */ if (l_nic->model) { if (def->os.type =3D=3D VIR_DOMAIN_OSTYPE_XEN && - STRNEQ(l_nic->model, "netfront")) { + l_nic->model !=3D VIR_DOMAIN_NET_MODEL_NETFRONT) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("only model 'netfront' is supported for " "Xen PV domains")); return -1; } - if (VIR_STRDUP(x_nic->model, l_nic->model) < 0) + if (VIR_STRDUP(x_nic->model, + virDomainNetModelTypeToString(l_nic->model)) < 0) goto cleanup; - if (STREQ(l_nic->model, "netfront")) + if (l_nic->model =3D=3D VIR_DOMAIN_NET_MODEL_NETFRONT) x_nic->nictype =3D LIBXL_NIC_TYPE_VIF; else x_nic->nictype =3D LIBXL_NIC_TYPE_VIF_IOEMU; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 59ad93a..8302eb4 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3582,16 +3582,18 @@ qemuBuildNicStr(virDomainNetDefPtr net, { char *str; char macaddr[VIR_MAC_STRING_BUFLEN]; + const char *modelName =3D virDomainNetModelTypeToString(net->model); =20 ignore_value(virAsprintf(&str, "%smacaddr=3D%s,vlan=3D%d%s%s%s%s", prefix ? prefix : "", virMacAddrFormat(&net->mac, macaddr), vlan, - (net->model ? ",model=3D" : ""), - (net->model ? net->model : ""), + (modelName ? ",model=3D" : ""), + (modelName ? modelName : ""), (net->info.alias ? ",name=3D" : ""), (net->info.alias ? net->info.alias : ""))); + return str; } =20 @@ -3605,11 +3607,11 @@ qemuBuildNicDevStr(virDomainDefPtr def, virQEMUCapsPtr qemuCaps) { virBuffer buf =3D VIR_BUFFER_INITIALIZER; - const char *nic =3D net->model; + const char *nic =3D NULL; bool usingVirtio =3D false; char macaddr[VIR_MAC_STRING_BUFLEN]; =20 - if (STREQ(net->model, "virtio")) { + if (net->model =3D=3D VIR_DOMAIN_NET_MODEL_VIRTIO) { if (net->info.type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) nic =3D "virtio-net-ccw"; else if (net->info.type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRT= IO_S390) @@ -3620,9 +3622,11 @@ qemuBuildNicDevStr(virDomainDefPtr def, nic =3D "virtio-net-pci"; =20 usingVirtio =3D true; + } else { + nic =3D virDomainNetModelTypeToString(net->model); } =20 - virBufferAdd(&buf, nic, -1); + virBufferAdd(&buf, NULLSTR(nic), -1); if (usingVirtio && net->driver.virtio.txmode) { if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_TX_ALG)) { virBufferAddLit(&buf, ",tx=3D"); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 5c07302..b265ed4 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -3228,7 +3228,7 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef = *dev, goto cleanup; } =20 - if (STREQ_NULLABLE(net->model, "virtio") && + if (net->model =3D=3D VIR_DOMAIN_NET_MODEL_VIRTIO && net->driver.virtio.rx_queue_size & (net->driver.virtio.rx_queu= e_size - 1)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("rx_queue_size has to be a power of two")); @@ -3258,39 +3258,39 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDe= f *dev, } =20 =20 -static const char * +static virDomainNetModel qemuDomainDefaultNetModel(const virDomainDef *def, virQEMUCapsPtr qemuCaps) { if (ARCH_IS_S390(def->os.arch)) - return "virtio"; + return VIR_DOMAIN_NET_MODEL_VIRTIO; =20 if (def->os.arch =3D=3D VIR_ARCH_ARMV7L || def->os.arch =3D=3D VIR_ARCH_AARCH64) { if (STREQ(def->os.machine, "versatilepb")) - return "smc91c111"; + return VIR_DOMAIN_NET_MODEL_SMC91C111; =20 if (qemuDomainIsVirt(def)) - return "virtio"; + return VIR_DOMAIN_NET_MODEL_VIRTIO; =20 /* Incomplete. vexpress (and a few others) use this, but not all * arm boards */ - return "lan9118"; + return VIR_DOMAIN_NET_MODEL_LAN9118; } =20 /* Try several network devices in turn; each of these devices is * less likely be supported out-of-the-box by the guest operating * system than the previous one */ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_RTL8139)) - return "rtl8139"; + return VIR_DOMAIN_NET_MODEL_RTL8139; else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_E1000)) - return "e1000"; + return VIR_DOMAIN_NET_MODEL_E1000; else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_NET)) - return "virtio"; + return VIR_DOMAIN_NET_MODEL_VIRTIO; =20 /* We've had no luck detecting support for any network device, * but we have to return something: might as well be rtl8139 */ - return "rtl8139"; + return VIR_DOMAIN_NET_MODEL_RTL8139; } =20 =20 @@ -3569,9 +3569,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr de= v, if (dev->type =3D=3D VIR_DOMAIN_DEVICE_NET && dev->data.net->type !=3D VIR_DOMAIN_NET_TYPE_HOSTDEV && !dev->data.net->model) { - if (VIR_STRDUP(dev->data.net->model, - qemuDomainDefaultNetModel(def, qemuCaps)) < 0) - goto cleanup; + dev->data.net->model =3D qemuDomainDefaultNetModel(def, qemuCaps); } =20 /* set default disk types and drivers */ diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 8066ed1..7c5e87e 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -216,10 +216,8 @@ qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def, for (i =3D 0; i < def->nnets; i++) { virDomainNetDefPtr net =3D def->nets[i]; =20 - if (net->model && - STREQ(net->model, "spapr-vlan")) { + if (net->model =3D=3D VIR_DOMAIN_NET_MODEL_SPAPR_VLAN) net->info.type =3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO; - } =20 if (qemuDomainAssignSpaprVIOAddress(def, &net->info, VIO_ADDR_NET)= < 0) goto cleanup; @@ -291,7 +289,7 @@ qemuDomainPrimeVirtioDeviceAddresses(virDomainDefPtr de= f, for (i =3D 0; i < def->nnets; i++) { virDomainNetDefPtr net =3D def->nets[i]; =20 - if (STREQ(net->model, "virtio") && + if (net->model =3D=3D VIR_DOMAIN_NET_MODEL_VIRTIO && net->info.type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { net->info.type =3D type; } @@ -561,26 +559,43 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDev= iceDefPtr dev, /* the only type of filesystem so far is virtio-9p-pci */ return virtioFlags; =20 - case VIR_DOMAIN_DEVICE_NET: { - virDomainNetDefPtr net =3D dev->data.net; - + case VIR_DOMAIN_DEVICE_NET: /* NB: a type=3D'hostdev' will use PCI, but its * address is assigned when we're assigning the * addresses for other hostdev devices. */ - if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_HOSTDEV || - STREQ(net->model, "usb-net")) { + if (dev->data.net->type =3D=3D VIR_DOMAIN_NET_TYPE_HOSTDEV) return 0; - } =20 - if (STREQ(net->model, "virtio")) - return virtioFlags; - - if (STREQ(net->model, "e1000e")) + switch ((virDomainNetModel) dev->data.net->model) { + case VIR_DOMAIN_NET_MODEL_E1000E: return pcieFlags; =20 - return pciFlags; - } + case VIR_DOMAIN_NET_MODEL_VIRTIO: + return virtioFlags; + + case VIR_DOMAIN_NET_MODEL_RTL8139: + case VIR_DOMAIN_NET_MODEL_E1000: + return pciFlags; + + case VIR_DOMAIN_NET_MODEL_USB_NET: + case VIR_DOMAIN_NET_MODEL_NETFRONT: + case VIR_DOMAIN_NET_MODEL_VLANCE: + case VIR_DOMAIN_NET_MODEL_VMXNET: + case VIR_DOMAIN_NET_MODEL_VMXNET2: + case VIR_DOMAIN_NET_MODEL_VMXNET3: + case VIR_DOMAIN_NET_MODEL_AM79C970A: + case VIR_DOMAIN_NET_MODEL_AM79C973: + case VIR_DOMAIN_NET_MODEL_82540EM: + case VIR_DOMAIN_NET_MODEL_82545EM: + case VIR_DOMAIN_NET_MODEL_82543GC: + case VIR_DOMAIN_NET_MODEL_SPAPR_VLAN: + case VIR_DOMAIN_NET_MODEL_SMC91C111: + case VIR_DOMAIN_NET_MODEL_LAN9118: + case VIR_DOMAIN_NET_MODEL_NONE: + case VIR_DOMAIN_NET_MODEL_LAST: + return 0; + } =20 case VIR_DOMAIN_DEVICE_SOUND: switch ((virDomainSoundModel) dev->data.sound->model) { diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 9c54571..ab71e2c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6991,11 +6991,10 @@ static char *qemuConnectDomainXMLToNative(virConnec= tPtr conn, for (i =3D 0; i < vm->def->nnets; i++) { virDomainNetDefPtr net =3D vm->def->nets[i]; unsigned int bootIndex =3D net->info.bootIndex; - char *model =3D net->model; + int model =3D net->model; virMacAddr mac =3D net->mac; char *script =3D net->script; =20 - net->model =3D NULL; net->script =3D NULL; =20 virDomainNetDefClear(net); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 4be0f54..9ba18b4 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -3053,15 +3053,18 @@ qemuDomainChangeNet(virQEMUDriverPtr driver, goto cleanup; } =20 - if (STRNEQ_NULLABLE(olddev->model, newdev->model)) { + if (olddev->model !=3D newdev->model) { + const char *oldModel =3D virDomainNetModelTypeToString(olddev->mod= el); + const char *newModel =3D virDomainNetModelTypeToString(newdev->mod= el); + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("cannot modify network device model from %s to %s= "), - olddev->model ? olddev->model : "(default)", - newdev->model ? newdev->model : "(default)"); + oldModel ? oldModel : "(default)", + newModel ? newModel : "(default)"); goto cleanup; } =20 - if (olddev->model && STREQ(olddev->model, "virtio") && + if (olddev->model =3D=3D VIR_DOMAIN_NET_MODEL_VIRTIO && (olddev->driver.virtio.name !=3D newdev->driver.virtio.name || olddev->driver.virtio.txmode !=3D newdev->driver.virtio.txmode || olddev->driver.virtio.ioeventfd !=3D newdev->driver.virtio.ioeven= tfd || diff --git a/src/qemu/qemu_interface.c b/src/qemu/qemu_interface.c index cebb490..ec1a92f 100644 --- a/src/qemu/qemu_interface.c +++ b/src/qemu/qemu_interface.c @@ -264,7 +264,7 @@ qemuInterfaceDirectConnect(virDomainDefPtr def, virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); unsigned int macvlan_create_flags =3D VIR_NETDEV_MACVLAN_CREATE_WITH_T= AP; =20 - if (net->model && STREQ(net->model, "virtio")) + if (net->model =3D=3D VIR_DOMAIN_NET_MODEL_VIRTIO) macvlan_create_flags |=3D VIR_NETDEV_MACVLAN_VNET_HDR; =20 if (virNetDevMacVLanCreateWithVPortProfile(net->ifname, @@ -437,7 +437,7 @@ qemuInterfaceEthernetConnect(virDomainDefPtr def, template_ifname =3D true; } =20 - if (net->model && STREQ(net->model, "virtio")) + if (net->model =3D=3D VIR_DOMAIN_NET_MODEL_VIRTIO) tap_create_flags |=3D VIR_NETDEV_TAP_CREATE_VNET_HDR; =20 if (virNetDevTapCreate(&net->ifname, tunpath, tapfd, tapfdSize, @@ -536,7 +536,7 @@ qemuInterfaceBridgeConnect(virDomainDefPtr def, template_ifname =3D true; } =20 - if (net->model && STREQ(net->model, "virtio")) + if (net->model =3D=3D VIR_DOMAIN_NET_MODEL_VIRTIO) tap_create_flags |=3D VIR_NETDEV_TAP_CREATE_VNET_HDR; =20 if (virQEMUDriverIsPrivileged(driver)) { @@ -658,7 +658,7 @@ qemuInterfaceOpenVhostNet(virDomainDefPtr def, } =20 /* If the nic model isn't virtio, don't try to open. */ - if (!(net->model && STREQ(net->model, "virtio"))) { + if (net->model !=3D VIR_DOMAIN_NET_MODEL_VIRTIO) { if (net->driver.virtio.name =3D=3D VIR_DOMAIN_NET_BACKEND_TYPE_VHO= ST) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("vhost-net is only supported for " diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c index ee71127..b23de18 100644 --- a/src/qemu/qemu_parse_command.c +++ b/src/qemu/qemu_parse_command.c @@ -1118,8 +1118,14 @@ qemuParseCommandLineNet(virDomainXMLOptionPtr xmlopt, goto cleanup; } } else if (STREQ(keywords[i], "model")) { - def->model =3D values[i]; - values[i] =3D NULL; + if ((def->model =3D virDomainNetModelTypeFromString(values[i])= ) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown network interface model '%s'"), + values[i]); + virDomainNetDefFree(def); + def =3D NULL; + goto cleanup; + } } else if (STREQ(keywords[i], "vhost")) { if ((values[i] =3D=3D NULL) || STREQ(values[i], "on")) { def->driver.virtio.name =3D VIR_DOMAIN_NET_BACKEND_TYPE_VH= OST; diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index a751d6d..97a4e63 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -1137,7 +1137,7 @@ get_files(vahControl * ctl) if (net && net->model) { if (net->driver.virtio.name =3D=3D VIR_DOMAIN_NET_BACKEND_= TYPE_QEMU) continue; - if (STRNEQ(net->model, "virtio")) + if (net->model !=3D VIR_DOMAIN_NET_MODEL_VIRTIO) continue; } needsvhost =3D true; diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 92ee371..72a9ea8 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -1294,7 +1294,8 @@ vboxAttachNetwork(virDomainDefPtr def, vboxDriverPtr = data, IMachine *machine) macaddrvbox[VIR_MAC_STRING_BUFLEN - 6] =3D '\0'; =20 VIR_DEBUG("NIC(%zu): Type: %d", i, def->nets[i]->type); - VIR_DEBUG("NIC(%zu): Model: %s", i, def->nets[i]->model); + VIR_DEBUG("NIC(%zu): Model: %s", i, + NULLSTR(virDomainNetModelTypeToString(def->nets[i]->mode= l))); VIR_DEBUG("NIC(%zu): Mac: %s", i, macaddr); VIR_DEBUG("NIC(%zu): ifname: %s", i, def->nets[i]->ifname); if (def->nets[i]->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { @@ -1324,18 +1325,18 @@ vboxAttachNetwork(virDomainDefPtr def, vboxDriverPt= r data, IMachine *machine) gVBoxAPI.UINetworkAdapter.SetEnabled(adapter, 1); =20 if (def->nets[i]->model) { - if (STRCASEEQ(def->nets[i]->model, "Am79C970A")) { + if (def->nets[i]->model =3D=3D VIR_DOMAIN_NET_MODEL_AM79C970A)= { adapterType =3D NetworkAdapterType_Am79C970A; - } else if (STRCASEEQ(def->nets[i]->model, "Am79C973")) { + } else if (def->nets[i]->model =3D=3D VIR_DOMAIN_NET_MODEL_AM7= 9C973) { adapterType =3D NetworkAdapterType_Am79C973; - } else if (STRCASEEQ(def->nets[i]->model, "82540EM")) { + } else if (def->nets[i]->model =3D=3D VIR_DOMAIN_NET_MODEL_825= 40EM) { adapterType =3D NetworkAdapterType_I82540EM; - } else if (STRCASEEQ(def->nets[i]->model, "82545EM")) { + } else if (def->nets[i]->model =3D=3D VIR_DOMAIN_NET_MODEL_825= 45EM) { adapterType =3D NetworkAdapterType_I82545EM; - } else if (STRCASEEQ(def->nets[i]->model, "82543GC")) { + } else if (def->nets[i]->model =3D=3D VIR_DOMAIN_NET_MODEL_825= 43GC) { adapterType =3D NetworkAdapterType_I82543GC; } else if (gVBoxAPI.APIVersion >=3D 3000051 && - STRCASEEQ(def->nets[i]->model, "virtio")) { + def->nets[i]->model =3D=3D VIR_DOMAIN_NET_MODEL_VIR= TIO) { /* Only vbox 3.1 and later support NetworkAdapterType_Virt= o */ adapterType =3D NetworkAdapterType_Virtio; } @@ -3526,19 +3527,19 @@ vboxDumpNetwork(virDomainDefPtr def, vboxDriverPtr = data, IMachine *machine, PRUi =20 gVBoxAPI.UINetworkAdapter.GetAdapterType(adapter, &adapter= Type); if (adapterType =3D=3D NetworkAdapterType_Am79C970A) { - ignore_value(VIR_STRDUP(def->nets[netAdpIncCnt]->model= , "Am79C970A")); + def->nets[netAdpIncCnt]->model =3D VIR_DOMAIN_NET_MODE= L_AM79C970A; } else if (adapterType =3D=3D NetworkAdapterType_Am79C973)= { - ignore_value(VIR_STRDUP(def->nets[netAdpIncCnt]->model= , "Am79C973")); + def->nets[netAdpIncCnt]->model =3D VIR_DOMAIN_NET_MODE= L_AM79C973; } else if (adapterType =3D=3D NetworkAdapterType_I82540EM)= { - ignore_value(VIR_STRDUP(def->nets[netAdpIncCnt]->model= , "82540EM")); + def->nets[netAdpIncCnt]->model =3D VIR_DOMAIN_NET_MODE= L_82540EM; } else if (adapterType =3D=3D NetworkAdapterType_I82545EM)= { - ignore_value(VIR_STRDUP(def->nets[netAdpIncCnt]->model= , "82545EM")); + def->nets[netAdpIncCnt]->model =3D VIR_DOMAIN_NET_MODE= L_82545EM; } else if (adapterType =3D=3D NetworkAdapterType_I82543GC)= { - ignore_value(VIR_STRDUP(def->nets[netAdpIncCnt]->model= , "82543GC")); + def->nets[netAdpIncCnt]->model =3D VIR_DOMAIN_NET_MODE= L_82543GC; } else if (gVBoxAPI.APIVersion >=3D 3000051 && adapterType =3D=3D NetworkAdapterType_Virtio) { /* Only vbox 3.1 and later support NetworkAdapterType_= Virto */ - ignore_value(VIR_STRDUP(def->nets[netAdpIncCnt]->model= , "virtio")); + def->nets[netAdpIncCnt]->model =3D VIR_DOMAIN_NET_MODE= L_VIRTIO; } =20 gVBoxAPI.UINetworkAdapter.GetMACAddress(adapter, &MACAddre= ssUtf16); diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 96507f1..9af25c2 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -2520,6 +2520,7 @@ virVMXParseEthernet(virConfPtr conf, int controller, = virDomainNetDefPtr *def) =20 char virtualDev_name[48] =3D ""; char *virtualDev =3D NULL; + int model =3D VIR_DOMAIN_NET_MODEL_NONE; =20 char features_name[48] =3D ""; long long features =3D 0; @@ -2621,11 +2622,13 @@ virVMXParseEthernet(virConfPtr conf, int controller= , virDomainNetDefPtr *def) } =20 if (virtualDev !=3D NULL) { - if (STRCASENEQ(virtualDev, "vlance") && - STRCASENEQ(virtualDev, "vmxnet") && - STRCASENEQ(virtualDev, "vmxnet3") && - STRCASENEQ(virtualDev, "e1000") && - STRCASENEQ(virtualDev, "e1000e")) { + model =3D virDomainNetModelTypeFromString(virtualDev); + + if (model !=3D VIR_DOMAIN_NET_MODEL_VLANCE && + model !=3D VIR_DOMAIN_NET_MODEL_VMXNET && + model !=3D VIR_DOMAIN_NET_MODEL_VMXNET3 && + model !=3D VIR_DOMAIN_NET_MODEL_E1000 && + model !=3D VIR_DOMAIN_NET_MODEL_E1000E) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Expecting VMX entry '%s' to be 'vlance' or '= vmxnet' or " "'vmxnet3' or 'e1000' or 'e1000e' but found '= %s'"), @@ -2633,12 +2636,8 @@ virVMXParseEthernet(virConfPtr conf, int controller,= virDomainNetDefPtr *def) goto cleanup; } =20 - if (STRCASEEQ(virtualDev, "vmxnet") && features =3D=3D 15) { - VIR_FREE(virtualDev); - - if (VIR_STRDUP(virtualDev, "vmxnet2") < 0) - goto cleanup; - } + if (model =3D=3D VIR_DOMAIN_NET_MODEL_VMXNET && features =3D=3D 15) + model =3D VIR_DOMAIN_NET_MODEL_VMXNET2; } =20 /* vmx:networkName -> def:data.bridge.brname */ @@ -2662,10 +2661,9 @@ virVMXParseEthernet(virConfPtr conf, int controller,= virDomainNetDefPtr *def) /* Setup virDomainNetDef */ if (connectionType =3D=3D NULL || STRCASEEQ(connectionType, "bridged")= ) { (*def)->type =3D VIR_DOMAIN_NET_TYPE_BRIDGE; - (*def)->model =3D virtualDev; + (*def)->model =3D model; (*def)->data.bridge.brname =3D networkName; =20 - virtualDev =3D NULL; networkName =3D NULL; } else if (STRCASEEQ(connectionType, "hostonly")) { /* FIXME */ @@ -2675,16 +2673,13 @@ virVMXParseEthernet(virConfPtr conf, int controller= , virDomainNetDefPtr *def) goto cleanup; } else if (STRCASEEQ(connectionType, "nat")) { (*def)->type =3D VIR_DOMAIN_NET_TYPE_USER; - (*def)->model =3D virtualDev; - - virtualDev =3D NULL; + (*def)->model =3D model; } else if (STRCASEEQ(connectionType, "custom")) { (*def)->type =3D VIR_DOMAIN_NET_TYPE_BRIDGE; - (*def)->model =3D virtualDev; + (*def)->model =3D model; (*def)->data.bridge.brname =3D networkName; (*def)->ifname =3D vnet; =20 - virtualDev =3D NULL; networkName =3D NULL; vnet =3D NULL; } else { @@ -3718,28 +3713,30 @@ virVMXFormatEthernet(virDomainNetDefPtr def, int co= ntroller, virBufferAsprintf(buffer, "ethernet%d.present =3D \"true\"\n", control= ler); =20 /* def:model -> vmx:virtualDev, vmx:features */ - if (def->model !=3D NULL) { - if (STRCASENEQ(def->model, "vlance") && - STRCASENEQ(def->model, "vmxnet") && - STRCASENEQ(def->model, "vmxnet2") && - STRCASENEQ(def->model, "vmxnet3") && - STRCASENEQ(def->model, "e1000") && - STRCASENEQ(def->model, "e1000e")) { + if (def->model) { + if (def->model !=3D VIR_DOMAIN_NET_MODEL_VLANCE && + def->model !=3D VIR_DOMAIN_NET_MODEL_VMXNET && + def->model !=3D VIR_DOMAIN_NET_MODEL_VMXNET2 && + def->model !=3D VIR_DOMAIN_NET_MODEL_VMXNET3 && + def->model !=3D VIR_DOMAIN_NET_MODEL_E1000 && + def->model !=3D VIR_DOMAIN_NET_MODEL_E1000E) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Expecting domain XML entry 'devices/interfac= e/model' " "to be 'vlance' or 'vmxnet' or 'vmxnet2' or '= vmxnet3' " - "or 'e1000' or 'e1000e' but found '%s'"), def= ->model); + "or 'e1000' or 'e1000e' but found '%s'"), + NULLSTR(virDomainNetModelTypeToString(def->mode= l))); return -1; } =20 - if (STRCASEEQ(def->model, "vmxnet2")) { + if (def->model =3D=3D VIR_DOMAIN_NET_MODEL_VMXNET2) { virBufferAsprintf(buffer, "ethernet%d.virtualDev =3D \"vmxnet\= "\n", controller); virBufferAsprintf(buffer, "ethernet%d.features =3D \"15\"\n", controller); } else { virBufferAsprintf(buffer, "ethernet%d.virtualDev =3D \"%s\"\n", - controller, def->model); + controller, + NULLSTR(virDomainNetModelTypeToString(def->m= odel))); } } =20 diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c index 6d7dc2c..0cad78a 100644 --- a/src/xenconfig/xen_common.c +++ b/src/xenconfig/xen_common.c @@ -972,12 +972,11 @@ xenParseVif(virConfPtr conf, virDomainDefPtr def, con= st char *vif_typename) goto cleanup; =20 if (model[0] && - VIR_STRDUP(net->model, model) < 0) + (net->model =3D virDomainNetModelTypeFromString(model)) < = 0) goto cleanup; =20 - if (!model[0] && type[0] && STREQ(type, vif_typename) && - VIR_STRDUP(net->model, "netfront") < 0) - goto cleanup; + if (!model[0] && type[0] && STREQ(type, vif_typename)) + net->model =3D VIR_DOMAIN_NET_MODEL_NETFRONT; =20 if (vifname[0] && VIR_STRDUP(net->ifname, vifname) < 0) @@ -1240,14 +1239,18 @@ xenFormatNet(virConnectPtr conn, } =20 if (!hvm) { - if (net->model !=3D NULL) - virBufferAsprintf(&buf, ",model=3D%s", net->model); + if (net->model) { + virBufferAsprintf(&buf, ",model=3D%s", + NULLSTR(virDomainNetModelTypeToString(net->m= odel))); + } } else { - if (net->model !=3D NULL && STREQ(net->model, "netfront")) { + if (net->model =3D=3D VIR_DOMAIN_NET_MODEL_NETFRONT) { virBufferAsprintf(&buf, ",type=3D%s", vif_typename); } else { - if (net->model !=3D NULL) - virBufferAsprintf(&buf, ",model=3D%s", net->model); + if (net->model) { + virBufferAsprintf(&buf, ",model=3D%s", + NULLSTR(virDomainNetModelTypeToString(ne= t->model))); + } } } =20 diff --git a/src/xenconfig/xen_sxpr.c b/src/xenconfig/xen_sxpr.c index fefa61a..7351319 100644 --- a/src/xenconfig/xen_sxpr.c +++ b/src/xenconfig/xen_sxpr.c @@ -651,12 +651,13 @@ xenParseSxprNets(virDomainDefPtr def, } } =20 - if (VIR_STRDUP(net->model, model) < 0) + if (model && + (net->model =3D virDomainNetModelTypeFromString(model)) < = 0) { goto cleanup; + } =20 - if (!model && type && STREQ(type, "netfront") && - VIR_STRDUP(net->model, "netfront") < 0) - goto cleanup; + if (!model && type && STREQ(type, "netfront")) + net->model =3D VIR_DOMAIN_NET_MODEL_NETFRONT; =20 tmp =3D sexpr_node(node, "device/vif/rate"); if (tmp) { @@ -1945,14 +1946,18 @@ xenFormatSxprNet(virConnectPtr conn, virBufferEscapeSexpr(buf, "(vifname '%s')", def->ifname); =20 if (!hvm) { - if (def->model !=3D NULL) - virBufferEscapeSexpr(buf, "(model '%s')", def->model); + if (def->model) { + virBufferEscapeSexpr(buf, "(model '%s')", + NULLSTR(virDomainNetModelTypeToString(def= ->model))); + } } else { - if (def->model !=3D NULL && STREQ(def->model, "netfront")) { + if (def->model =3D=3D VIR_DOMAIN_NET_MODEL_NETFRONT) { virBufferAddLit(buf, "(type netfront)"); } else { - if (def->model !=3D NULL) - virBufferEscapeSexpr(buf, "(model '%s')", def->model); + if (def->model) { + virBufferEscapeSexpr(buf, "(model '%s')", + NULLSTR(virDomainNetModelTypeToString= (def->model))); + } } } =20 --=20 2.7.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list