From nobody Tue May 7 15:53:43 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.24 as permitted sender) client-ip=209.132.183.24; envelope-from=libvir-list-bounces@redhat.com; helo=mx3-phx2.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.24 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by mx.zohomail.com with SMTPS id 1485966762393579.997254682767; Wed, 1 Feb 2017 08:32:42 -0800 (PST) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v11GT9le021205; Wed, 1 Feb 2017 11:29:09 -0500 Received: from smtp.corp.redhat.com (int-mx16.intmail.prod.int.phx2.redhat.com [10.5.11.28]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v11GT7xR031355 for ; Wed, 1 Feb 2017 11:29:07 -0500 Received: by smtp.corp.redhat.com (Postfix) id 0CDEEB5BC4; Wed, 1 Feb 2017 16:29:07 +0000 (UTC) Received: from mx1.redhat.com (ext-mx09.extmail.prod.ext.phx2.redhat.com [10.5.110.38]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 06010B324E for ; Wed, 1 Feb 2017 16:29:07 +0000 (UTC) Received: from mail-lf0-f65.google.com (mail-lf0-f65.google.com [209.85.215.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5E2A84DD6E for ; Wed, 1 Feb 2017 16:29:05 +0000 (UTC) Received: by mail-lf0-f65.google.com with SMTP id x1so36955034lff.0 for ; Wed, 01 Feb 2017 08:29:04 -0800 (PST) Received: from kloomba.my.domain ([213.147.213.252]) by smtp.gmail.com with ESMTPSA id o5sm5855474lfo.35.2017.02.01.08.29.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 01 Feb 2017 08:29:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=LroSRYErWKvvc1llL4LmILT1pWYiVAM8Gi+z8Hnym14=; b=HrIkttQu6+gbB0mLsnh7N+v0E9hsNVjSEY2y+tB+2v7XmHtwdsCf8BFMu2ogQlVSRH IzW0ITFG3GUs9ScD0GOjndAuZ2X59+xUfKm3wXMFZ7hoYDnueEvGwgJ2SiLGONWAW6G+ sqXi7Is9THnsTsqYy9TZlJnBJC1X3mbW6n26NeS/l3BfATw1v0RjnBO0a/DGxdf0K3Wm LV0XqfIPXNV60EM44JBaFP7TsgWoEClNormQcUzk/zVqmYjdaxOrk0enrsCx1OiY5kDb qYNSdQb8e8HQTfcGaiEQJGPQx2pPQH6DZf0Yd0Rs4qbc5zwjBwKnuzBsklwo7js/ba38 Pn/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=LroSRYErWKvvc1llL4LmILT1pWYiVAM8Gi+z8Hnym14=; b=t2r9tXTOM7TZKQtSs/kIcSvE7r97G//igZ5MqqBqovVnNwXRV2vjOtfVqj8crVeR1Z EGy36YaMvd0ucJKSffiGhSvcyFPOxDfvs8xr9sCPhhmfRLS27AvFAV1C6WJRh5QaIdS0 2Xs2FXwrh2Q5Ic9eXxiGMNWbxoktE3lNd3wIxkghLIBljkD1szIsHMDuDXtglUkZKO9a npiCQpD4XPCyuFFmKut2/0hCirsWM7shqYG3T5SmRE2csz3CJ6+PFEofSj/DtOIXxEaM 7WNd7pN3R+7khh74+dRrG2dfjzP3IfAfqbClHiPAM2fsvm7rVbVCQJP18ilFc217ulvJ U8nA== X-Gm-Message-State: AIkVDXKO5KojURSOr6I3Elv3W49KcFEF+ux/2ViS4VGJLxxQ+6XNDxqnlAiH/RIPwB2YWw== X-Received: by 10.25.18.218 with SMTP id 87mr1230331lfs.128.1485966542368; Wed, 01 Feb 2017 08:29:02 -0800 (PST) From: Roman Bogorodskiy To: libvir-list@redhat.com Date: Wed, 1 Feb 2017 20:28:52 +0400 Message-Id: <20170201162852.97246-1-bogorodskiy@gmail.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 01 Feb 2017 16:29:05 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 01 Feb 2017 16:29:05 +0000 (UTC) for IP:'209.85.215.65' DOMAIN:'mail-lf0-f65.google.com' HELO:'mail-lf0-f65.google.com' FROM:'bogorodskiy@gmail.com' RCPT:'' X-RedHat-Spam-Score: 1.17 * (BAYES_50, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, RCVD_IN_SORBS_SPAM, SPF_PASS) 209.85.215.65 mail-lf0-f65.google.com 209.85.215.65 mail-lf0-f65.google.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.38 X-Scanned-By: MIMEDefang 2.74 on 10.5.11.28 X-loop: libvir-list@redhat.com Cc: Roman Bogorodskiy Subject: [libvirt] [PATCH v4] bhyve: add e1000 nic support 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-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Recently e1000 NIC support was added to bhyve; implement that in the bhyve driver: - Add capability check by analyzing output of the 'bhyve -s 0,e1000' command - Modify bhyveBuildNetArgStr() to support e1000 and also pass virConnectPtr so it could call bhyveDriverGetCaps() to check if this NIC is supported - Modify command parsing code to add support for e1000 and adjust tests - Add net-e1000 test --- src/bhyve/bhyve_capabilities.c | 26 ++++++++++++++++++ src/bhyve/bhyve_capabilities.h | 1 + src/bhyve/bhyve_command.c | 31 ++++++++++++++++++= +--- src/bhyve/bhyve_parse_command.c | 10 ++++++- tests/bhyveargv2xmldata/bhyveargv2xml-e1000.args | 8 ++++++ tests/bhyveargv2xmldata/bhyveargv2xml-e1000.xml | 30 ++++++++++++++++++= +++ .../bhyveargv2xmldata/bhyveargv2xml-virtio-net.xml | 2 ++ .../bhyveargv2xml-virtio-net4.xml | 1 + tests/bhyveargv2xmltest.c | 1 + .../bhyvexml2argvdata/bhyvexml2argv-net-e1000.args | 9 +++++++ .../bhyvexml2argv-net-e1000.ldargs | 3 +++ .../bhyvexml2argvdata/bhyvexml2argv-net-e1000.xml | 22 +++++++++++++++ tests/bhyvexml2argvtest.c | 7 ++++- 13 files changed, 145 insertions(+), 6 deletions(-) create mode 100644 tests/bhyveargv2xmldata/bhyveargv2xml-e1000.args create mode 100644 tests/bhyveargv2xmldata/bhyveargv2xml-e1000.xml create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-net-e1000.args create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-net-e1000.ldargs create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-net-e1000.xml diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c index 83e3ae1b4..a647cd19b 100644 --- a/src/bhyve/bhyve_capabilities.c +++ b/src/bhyve/bhyve_capabilities.c @@ -216,6 +216,29 @@ bhyveProbeCapsAHCI32Slot(unsigned int *caps, char *bin= ary) return ret; } =20 +static int +bhyveProbeCapsNetE1000(unsigned int *caps, char *binary) +{ + char *error; + virCommandPtr cmd =3D NULL; + int ret =3D 0, exit; + + cmd =3D virCommandNew(binary); + virCommandAddArgList(cmd, "-s", "0,e1000", NULL); + virCommandSetErrorBuffer(cmd, &error); + if (virCommandRun(cmd, &exit) < 0) { + ret =3D -1; + goto out; + } + + if (strstr(error, "pci slot 0:0: unknown device \"e1000\"") =3D=3D NUL= L) + *caps |=3D BHYVE_CAP_NET_E1000; + + out: + VIR_FREE(error); + virCommandFree(cmd); + return ret; +} =20 int virBhyveProbeCaps(unsigned int *caps) @@ -235,6 +258,9 @@ virBhyveProbeCaps(unsigned int *caps) if ((ret =3D bhyveProbeCapsAHCI32Slot(caps, binary))) goto out; =20 + if ((ret =3D bhyveProbeCapsNetE1000(caps, binary))) + goto out; + out: VIR_FREE(binary); return ret; diff --git a/src/bhyve/bhyve_capabilities.h b/src/bhyve/bhyve_capabilities.h index 55581bd68..690feadb8 100644 --- a/src/bhyve/bhyve_capabilities.h +++ b/src/bhyve/bhyve_capabilities.h @@ -39,6 +39,7 @@ typedef enum { typedef enum { BHYVE_CAP_RTC_UTC =3D 1 << 0, BHYVE_CAP_AHCI32SLOT =3D 1 << 1, + BHYVE_CAP_NET_E1000 =3D 1 << 2, } virBhyveCapsFlags; =20 int virBhyveProbeGrubCaps(virBhyveGrubCapsFlags *caps); diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c index a50bd1066..5c86c9f1b 100644 --- a/src/bhyve/bhyve_command.c +++ b/src/bhyve/bhyve_command.c @@ -44,7 +44,8 @@ VIR_LOG_INIT("bhyve.bhyve_command"); =20 static int -bhyveBuildNetArgStr(const virDomainDef *def, +bhyveBuildNetArgStr(virConnectPtr conn, + const virDomainDef *def, virDomainNetDefPtr net, virCommandPtr cmd, bool dryRun) @@ -52,9 +53,30 @@ bhyveBuildNetArgStr(const virDomainDef *def, char macaddr[VIR_MAC_STRING_BUFLEN]; char *realifname =3D NULL; char *brname =3D NULL; + char *nic_model =3D NULL; int ret =3D -1; virDomainNetType actualType =3D virDomainNetGetActualType(net); =20 + if (STREQ(net->model, "virtio")) { + if (VIR_STRDUP(nic_model, "virtio-net") < 0) + return -1; + } else if (STREQ(net->model, "e1000")) { + if ((bhyveDriverGetCaps(conn) & BHYVE_CAP_NET_E1000) !=3D 0) { + if (VIR_STRDUP(nic_model, "e1000") < 0) + return -1; + } else { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("NIC model 'e1000' is not supported " + "by given bhyve binary")); + return -1; + } + } else { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("NIC model '%s' is not supported"), + net->model); + return -1; + } + if (actualType =3D=3D VIR_DOMAIN_NET_TYPE_BRIDGE) { if (VIR_STRDUP(brname, virDomainNetGetActualBridgeName(net)) < 0) goto cleanup; @@ -101,8 +123,8 @@ bhyveBuildNetArgStr(const virDomainDef *def, =20 =20 virCommandAddArg(cmd, "-s"); - virCommandAddArgFormat(cmd, "%d:0,virtio-net,%s,mac=3D%s", - net->info.addr.pci.slot, + virCommandAddArgFormat(cmd, "%d:0,%s,%s,mac=3D%s", + net->info.addr.pci.slot, nic_model, realifname, virMacAddrFormat(&net->mac, macaddr= )); =20 ret =3D 0; @@ -111,6 +133,7 @@ bhyveBuildNetArgStr(const virDomainDef *def, VIR_FREE(net->ifname); VIR_FREE(brname); VIR_FREE(realifname); + VIR_FREE(nic_model); =20 return ret; } @@ -345,7 +368,7 @@ virBhyveProcessBuildBhyveCmd(virConnectPtr conn, } for (i =3D 0; i < def->nnets; i++) { virDomainNetDefPtr net =3D def->nets[i]; - if (bhyveBuildNetArgStr(def, net, cmd, dryRun) < 0) + if (bhyveBuildNetArgStr(conn, def, net, cmd, dryRun) < 0) goto error; } for (i =3D 0; i < def->ndisks; i++) { diff --git a/src/bhyve/bhyve_parse_command.c b/src/bhyve/bhyve_parse_comman= d.c index e31f5fbd1..fcaaed275 100644 --- a/src/bhyve/bhyve_parse_command.c +++ b/src/bhyve/bhyve_parse_command.c @@ -496,6 +496,7 @@ bhyveParsePCINet(virDomainDefPtr def, unsigned pcislot, unsigned pcibus, unsigned function, + const char *model, const char *config) { /* -s slot,virtio-net,tapN[,mac=3Dxx:xx:xx:xx:xx:xx] */ @@ -514,6 +515,9 @@ bhyveParsePCINet(virDomainDefPtr def, if (VIR_STRDUP(net->data.bridge.brname, "virbr0") < 0) goto error; =20 + if (VIR_STRDUP(net->model, model) < 0) + goto error; + net->info.type =3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; net->info.addr.pci.slot =3D pcislot; net->info.addr.pci.bus =3D pcibus; @@ -620,7 +624,11 @@ bhyveParseBhyvePCIArg(virDomainDefPtr def, nahcidisk, conf); else if (STREQ(emulation, "virtio-net")) - bhyveParsePCINet(def, xmlopt, caps, pcislot, bus, function, conf); + bhyveParsePCINet(def, xmlopt, caps, pcislot, bus, function, + "virtio", conf); + else if (STREQ(emulation, "e1000")) + bhyveParsePCINet(def, xmlopt, caps, pcislot, bus, function, + "e1000", conf); =20 VIR_FREE(emulation); VIR_FREE(slotdef); diff --git a/tests/bhyveargv2xmldata/bhyveargv2xml-e1000.args b/tests/bhyve= argv2xmldata/bhyveargv2xml-e1000.args new file mode 100644 index 000000000..aa568fe3a --- /dev/null +++ b/tests/bhyveargv2xmldata/bhyveargv2xml-e1000.args @@ -0,0 +1,8 @@ +/usr/sbin/bhyve \ +-c 1 \ +-m 214 \ +-H \ +-P \ +-s 0:0,hostbridge \ +-s 1:0,e1000,tap0 \ +-s 1:1,e1000,tap1,mac=3DFE:ED:AD:EA:DF:15 bhyve diff --git a/tests/bhyveargv2xmldata/bhyveargv2xml-e1000.xml b/tests/bhyvea= rgv2xmldata/bhyveargv2xml-e1000.xml new file mode 100644 index 000000000..c6b6c0ef8 --- /dev/null +++ b/tests/bhyveargv2xmldata/bhyveargv2xml-e1000.xml @@ -0,0 +1,30 @@ + + bhyve + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + destroy + destroy + destroy + + + + + + +
+ + + + + + +
+ + + diff --git a/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-net.xml b/tests/b= hyveargv2xmldata/bhyveargv2xml-virtio-net.xml index 5895c8c53..ed3279d9d 100644 --- a/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-net.xml +++ b/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-net.xml @@ -16,12 +16,14 @@ +
+
diff --git a/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-net4.xml b/tests/= bhyveargv2xmldata/bhyveargv2xml-virtio-net4.xml index 5f1972080..7c5493cbb 100644 --- a/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-net4.xml +++ b/tests/bhyveargv2xmldata/bhyveargv2xml-virtio-net4.xml @@ -16,6 +16,7 @@ +
diff --git a/tests/bhyveargv2xmltest.c b/tests/bhyveargv2xmltest.c index 0995f6928..e759e4fa3 100644 --- a/tests/bhyveargv2xmltest.c +++ b/tests/bhyveargv2xmltest.c @@ -175,6 +175,7 @@ mymain(void) DO_TEST("ahci-hd"); DO_TEST("virtio-blk"); DO_TEST("virtio-net"); + DO_TEST("e1000"); DO_TEST_WARN("virtio-net2"); DO_TEST_WARN("virtio-net3"); DO_TEST_WARN("virtio-net4"); diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-net-e1000.args b/tests/b= hyvexml2argvdata/bhyvexml2argv-net-e1000.args new file mode 100644 index 000000000..09e30db46 --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-net-e1000.args @@ -0,0 +1,9 @@ +/usr/sbin/bhyve \ +-c 1 \ +-m 214 \ +-u \ +-H \ +-P \ +-s 0:0,hostbridge \ +-s 2:0,ahci,hd:/tmp/freebsd.img \ +-s 3:0,e1000,faketapdev,mac=3D52:54:00:00:00:00 bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-net-e1000.ldargs b/tests= /bhyvexml2argvdata/bhyvexml2argv-net-e1000.ldargs new file mode 100644 index 000000000..32538b558 --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-net-e1000.ldargs @@ -0,0 +1,3 @@ +/usr/sbin/bhyveload \ +-m 214 \ +-d /tmp/freebsd.img bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-net-e1000.xml b/tests/bh= yvexml2argvdata/bhyvexml2argv-net-e1000.xml new file mode 100644 index 000000000..805efe301 --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-net-e1000.xml @@ -0,0 +1,22 @@ + + bhyve + df3be7e7-a104-11e3-aeb0-50e5492bd3dc + 219136 + 1 + + hvm + + + + + + +
+ + + + +
+ + + diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index e80705780..158f9617e 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -162,7 +162,7 @@ mymain(void) DO_TEST_FULL(name, FLAG_EXPECT_PARSE_ERROR) =20 driver.grubcaps =3D BHYVE_GRUB_CAP_CONSDEV; - driver.bhyvecaps =3D BHYVE_CAP_RTC_UTC | BHYVE_CAP_AHCI32SLOT; + driver.bhyvecaps =3D BHYVE_CAP_RTC_UTC | BHYVE_CAP_AHCI32SLOT | BHYVE_= CAP_NET_E1000; =20 DO_TEST("base"); DO_TEST("acpiapic"); @@ -185,6 +185,7 @@ mymain(void) DO_TEST("disk-cdrom-grub"); DO_TEST("serial-grub"); DO_TEST("localtime"); + DO_TEST("net-e1000"); =20 /* Address allocation tests */ DO_TEST("addr-single-sata-disk"); @@ -201,6 +202,10 @@ mymain(void) =20 DO_TEST("serial-grub-nocons"); =20 + driver.bhyvecaps &=3D ~BHYVE_CAP_NET_E1000; + + DO_TEST_FAILURE("net-e1000"); + virObjectUnref(driver.caps); virObjectUnref(driver.xmlopt); =20 --=20 2.11.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list