From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by passt.top (Postfix) with ESMTP id 358BC5A0265 for ; Thu, 20 Oct 2022 11:04:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666256663; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=E3rscf+h30DuzHXPnW+mgh5M6+bGIv2eh9V9+XXTA/E=; b=TklPkgUHBZntAGgAoM3vi1u2AemQLIqApF6AhjTfX6o7WdZeVOc4U13gh5kPo1MAFIw00k WgVJeszt3+GIe3NpEtNyDM3JzfydJm7aeP0H5JvY7WlvZ+MtgJ2IpFYQtlgbYfYpAHcQCH lWwTDuMUeLTL8DYPX4yYIBjRuQh3OGw= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-504-8NKpvheTNQ-kF1hxASvieg-1; Thu, 20 Oct 2022 05:04:22 -0400 X-MC-Unique: 8NKpvheTNQ-kF1hxASvieg-1 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id B76B01C07598 for ; Thu, 20 Oct 2022 09:04:21 +0000 (UTC) Received: from harajuku.usersys.redhat.com.homenet.telecomitalia.it (ovpn-194-226.brq.redhat.com [10.40.194.226]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 448F149BB60 for ; Thu, 20 Oct 2022 09:04:21 +0000 (UTC) From: Andrea Bolognani To: passt-dev@passt.top Subject: [PATCH] qrap: Support JSON syntax for -device Date: Thu, 20 Oct 2022 11:04:19 +0200 Message-Id: <20221020090419.820559-1-abologna@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.9 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true Message-ID-Hash: TLDPJY2OH4AMACMBG2ZAKOX4FRK3ESBS X-Message-ID-Hash: TLDPJY2OH4AMACMBG2ZAKOX4FRK3ESBS X-MailFrom: abologna@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.3 Precedence: list List-Id: Development discussion and patches for passt Archived-At: <> Archived-At: List-Archive: <> List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Starting with version 8.1.0, libvirt uses JSON syntax when generating the arguments to -device, so they will now look like {"driver":"virtio-scsi-pci","bus":"pci.3","addr":"0x0"} instead of virtio-scsi-pci,bus=pci.3,addr=0x0 qrap needs to parse these arguments and extract the bus number in order to figure out what address to use for the virtio-net device it adds, and the libvirt change described above has broken this parsing logic. Tweak the code so that both styles are accepted and handled correctly. Note that, when JSON is in use, qrap needs to generate its own command line options in that format as well or things will not work as expected. Signed-off-by: Andrea Bolognani --- qrap.c | 51 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/qrap.c b/qrap.c index a9a0fc1..3c6f5b8 100644 --- a/qrap.c +++ b/qrap.c @@ -69,6 +69,8 @@ static const struct drop_arg { * @name: Device ("-device") name to insert * @template: Prefix for device specification (first part of address) * @template_post: Suffix for device specification (last part of address) + * @template_json: Device prefix for when JSON is used + * @template_json_post: Device suffix for when JSON is used * @first: First usable PCI address * @last: Last usable PCI address */ @@ -77,15 +79,29 @@ static const struct pci_dev { char *name; char *template; char *template_post; + char *template_json; + char *template_json_post; int first; int last; } pci_devs[] = { - { "pc-q35", "virtio-net-pci", - "bus=pci.", ",addr=0x0", 3, /* 2: hotplug bus */ 16 }, - { "pc-", "virtio-net-pci", - "bus=pci.0,addr=0x", "", 2, /* 1: ISA bridge */ 16 }, - { "s390-ccw", "virtio-net-ccw", - "devno=fe.0.", "", 1, 16 }, + { + "pc-q35", "virtio-net-pci", + "bus=pci.", ",addr=0x0", + "\"bus\":\"pci.", ",\"addr\":\"0x0\"", + 3, /* 2: hotplug bus */ 16 + }, + { + "pc-", "virtio-net-pci", + "bus=pci.0,addr=0x", "", + "\"bus\":\"pci.0\",\"addr=0x", "", + 2, /* 1: ISA bridge */ 16 + }, + { + "s390-ccw", "virtio-net-ccw", + "devno=fe.0.", "", + "\"devno\":\"fe.0.", "", + 1, 16 + }, { 0 }, }; @@ -115,7 +131,7 @@ void usage(const char *name) */ int main(int argc, char **argv) { - int i, s, qemu_argc = 0, addr_map = 0, has_dev = 0, retry_on_reset, rc; + int i, s, qemu_argc = 0, addr_map = 0, has_dev = 0, has_json = 0, retry_on_reset, rc; struct timeval tv = { .tv_sec = 0, .tv_usec = (long)(500 * 1000) }; char *qemu_argv[ARG_MAX], dev_str[ARG_MAX]; struct sockaddr_un addr = { @@ -227,14 +243,22 @@ int main(int argc, char **argv) } if (!strcmp(argv[i], "-device") && i + 1 < argc) { + char *template = NULL; char *p; has_dev = 1; if ((p = strstr(argv[i + 1], dev->template))) { + template = dev->template; + } else if ((p = strstr(argv[i + 1], dev->template_json))) { + template = dev->template_json; + has_json = 1; + } + + if (template) { long n; - n = strtol(p + strlen(dev->template), NULL, 16); + n = strtol(p + strlen(template), NULL, 16); if (!errno) addr_map |= (1 << n); } @@ -254,8 +278,15 @@ int main(int argc, char **argv) if (has_dev) { qemu_argv[qemu_argc++] = "-device"; - snprintf(dev_str, ARG_MAX, "%s,%s%x%s,netdev=hostnet0,x-txburst=4096", - dev->name, dev->template, i, dev->template_post); + if (!has_json) { + snprintf(dev_str, ARG_MAX, + "%s,%s%x%s,netdev=hostnet0,x-txburst=4096", + dev->name, dev->template, i, dev->template_post); + } else { + snprintf(dev_str, ARG_MAX, + "{\"driver\":\"%s\",%s%x\"%s,\"netdev\":\"hostnet0\",\"x-txburst\":4096}", + dev->name, dev->template_json, i, dev->template_json_post); + } qemu_argv[qemu_argc++] = dev_str; } -- 2.37.3