qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: David Woodhouse <dwmw2@infradead.org>
To: qemu-devel@nongnu.org
Subject: [PULL 03/47] net: add qemu_create_nic_bus_devices()
Date: Thu,  1 Feb 2024 16:43:28 +0000	[thread overview]
Message-ID: <20240201164412.785520-4-dwmw2@infradead.org> (raw)
In-Reply-To: <20240201164412.785520-1-dwmw2@infradead.org>

From: David Woodhouse <dwmw@amazon.co.uk>

This will instantiate any NICs which live on a given bus type. Each bus
is allowed *one* substitution (for PCI it's virtio → virtio-net-pci, for
Xen it's xen → xen-net-device; no point in overengineering it unless we
actually want more).

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Paul Durrant <paul@xen.org>
Reviewed-by: Thomas Huth <thuth@redhat.com>
---
 include/net/net.h | 22 ++++++++++++++++++++
 net/net.c         | 53 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 75 insertions(+)

diff --git a/include/net/net.h b/include/net/net.h
index dff1872b4d..728ca965af 100644
--- a/include/net/net.h
+++ b/include/net/net.h
@@ -248,6 +248,28 @@ bool qemu_configure_nic_device(DeviceState *dev, bool match_default,
  */
 DeviceState *qemu_create_nic_device(const char *typename, bool match_default,
                                     const char *alias);
+
+/*
+ * qemu_create_nic_bus_devices: Create configured NIC devices for a given bus
+ * @bus: Bus on which to create devices
+ * @parent_type: Object type for devices to be created (e.g. TYPE_PCI_DEVICE)
+ * @default_model: Object type name for default NIC model (or %NULL)
+ * @alias: Additional model string to replace, for user convenience
+ * @alias_target: Actual object type name to be used in place of @alias
+ *
+ * Instantiate dynamic NICs on a given bus, typically a PCI bus. This scans
+ * for available NIC configurations which either specify a model which is
+ * a child type of @parent_type, or which do not specify a model when
+ * @default_model is non-NULL. Each device is instantiated on the given @bus.
+ *
+ * A single substitution is supported, e.g. "xen" → "xen-net-device" for the
+ * Xen bus, or "virtio" → "virtio-net-pci" for PCI. This allows the user to
+ * specify a more understandable "model=" parameter on the command line, not
+ * only the real object typename.
+ */
+void qemu_create_nic_bus_devices(BusState *bus, const char *parent_type,
+                                 const char *default_model,
+                                 const char *alias, const char *alias_target);
 void print_net_client(Monitor *mon, NetClientState *nc);
 void net_socket_rs_init(SocketReadState *rs,
                         SocketReadStateFinalize *finalize,
diff --git a/net/net.c b/net/net.c
index 962904eaef..4651b3f443 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1223,6 +1223,59 @@ DeviceState *qemu_create_nic_device(const char *typename, bool match_default,
     return dev;
 }
 
+void qemu_create_nic_bus_devices(BusState *bus, const char *parent_type,
+                                 const char *default_model,
+                                 const char *alias, const char *alias_target)
+{
+    GPtrArray *nic_models = qemu_get_nic_models(parent_type);
+    const char *model;
+    DeviceState *dev;
+    NICInfo *nd;
+    int i;
+
+    if (nic_model_help) {
+        if (alias_target) {
+            add_nic_model_help(alias_target, alias);
+        }
+        for (i = 0; i < nic_models->len - 1; i++) {
+            add_nic_model_help(nic_models->pdata[i], NULL);
+        }
+    }
+
+    /* Drop the NULL terminator which would make g_str_equal() unhappy */
+    nic_models->len--;
+
+    for (i = 0; i < nb_nics; i++) {
+        nd = &nd_table[i];
+
+        if (!nd->used || nd->instantiated) {
+            continue;
+        }
+
+        model = nd->model ? nd->model : default_model;
+        if (!model) {
+            continue;
+        }
+
+        /* Each bus type is allowed *one* substitution */
+        if (g_str_equal(model, alias)) {
+            model = alias_target;
+        }
+
+        if (!g_ptr_array_find_with_equal_func(nic_models, model,
+                                              g_str_equal, NULL)) {
+            /* This NIC does not live on this bus. */
+            continue;
+        }
+
+        dev = qdev_new(model);
+        qdev_set_nic_properties(dev, nd);
+        qdev_realize_and_unref(dev, bus, &error_fatal);
+    }
+
+    g_ptr_array_free(nic_models, true);
+}
+
 static int (* const net_client_init_fun[NET_CLIENT_DRIVER__MAX])(
     const Netdev *netdev,
     const char *name,
-- 
2.43.0



  parent reply	other threads:[~2024-02-01 16:52 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-01 16:43 [PULL 00/47] nic-config.for-upstream queue David Woodhouse
2024-02-01 16:43 ` [PULL 01/47] net: add qemu_{configure, create}_nic_device(), qemu_find_nic_info() David Woodhouse
2024-02-01 16:43 ` [PULL 02/47] net: report list of available models according to platform David Woodhouse
2024-02-01 16:43 ` David Woodhouse [this message]
2024-02-01 16:43 ` [PULL 04/47] hw/pci: add pci_init_nic_devices(), pci_init_nic_in_slot() David Woodhouse
2024-02-01 16:43 ` [PULL 05/47] hw/i386/pc: use qemu_get_nic_info() and pci_init_nic_devices() David Woodhouse
2024-02-01 16:43 ` [PULL 06/47] hw/xen: use qemu_create_nic_bus_devices() to instantiate Xen NICs David Woodhouse
2024-02-01 16:43 ` [PULL 07/47] hw/alpha/dp264: use pci_init_nic_devices() David Woodhouse
2024-02-01 16:43 ` [PULL 08/47] hw/arm/sbsa-ref: " David Woodhouse
2024-02-01 16:43 ` [PULL 09/47] hw/arm/virt: " David Woodhouse
2024-02-01 16:43 ` [PULL 10/47] hw/hppa: " David Woodhouse
2024-02-01 16:43 ` [PULL 11/47] hw/loongarch: " David Woodhouse
2024-02-01 16:43 ` [PULL 12/47] hw/mips/fuloong2e: " David Woodhouse
2024-02-01 16:43 ` [PULL 13/47] hw/mips/malta: " David Woodhouse
2024-02-01 16:43 ` [PULL 14/47] hw/mips/loongson3_virt: " David Woodhouse
2024-02-01 16:43 ` [PULL 15/47] hw/ppc/prep: " David Woodhouse
2024-02-01 16:43 ` [PULL 16/47] hw/ppc/spapr: use qemu_get_nic_info() and pci_init_nic_devices() David Woodhouse
2024-02-01 16:43 ` [PULL 17/47] hw/ppc: use pci_init_nic_devices() David Woodhouse
2024-02-01 16:43 ` [PULL 18/47] hw/sh4/r2d: " David Woodhouse
2024-02-01 16:43 ` [PULL 19/47] hw/sparc64/sun4u: " David Woodhouse
2024-02-01 16:43 ` [PULL 20/47] hw/xtensa/virt: " David Woodhouse
2024-02-01 16:43 ` [PULL 21/47] hw/arm/allwinner: use qemu_configure_nic_device() David Woodhouse
2024-02-01 16:43 ` [PULL 22/47] hw/arm/aspeed: " David Woodhouse
2024-02-01 16:43 ` [PULL 23/47] hw/arm/exynos4: use qemu_create_nic_device() David Woodhouse
2024-02-01 16:43 ` [PULL 24/47] hw/arm/fsl: use qemu_configure_nic_device() David Woodhouse
2024-02-01 16:43 ` [PULL 25/47] hw/net/smc91c111: " David Woodhouse
2024-02-01 16:43 ` [PULL 26/47] hw/net/lan9118: " David Woodhouse
2024-02-01 16:43 ` [PULL 27/47] hw/arm/highbank: use qemu_create_nic_device() David Woodhouse
2024-02-01 16:43 ` [PULL 28/47] hw/arm/npcm7xx: use qemu_configure_nic_device, allow emc0/emc1 as aliases David Woodhouse
2024-02-01 16:43 ` [PULL 29/47] hw/arm/stellaris: use qemu_find_nic_info() David Woodhouse
2024-02-01 16:43 ` [PULL 30/47] hw/arm: use qemu_configure_nic_device() David Woodhouse
2024-02-01 16:43 ` [PULL 31/47] hw/net/etraxfs-eth: " David Woodhouse
2024-02-01 16:43 ` [PULL 32/47] hw/m68k/mcf5208: use qemu_create_nic_device() David Woodhouse
2024-02-01 16:43 ` [PULL 33/47] hw/m68k/q800: use qemu_find_nic_info() David Woodhouse
2024-02-01 16:43 ` [PULL 34/47] hw/microblaze: use qemu_configure_nic_device() David Woodhouse
2024-02-01 16:44 ` [PULL 35/47] hw/mips/mipssim: use qemu_create_nic_device() David Woodhouse
2024-02-01 16:44 ` [PULL 36/47] hw/mips/jazz: use qemu_find_nic_info() David Woodhouse
2024-02-01 16:44 ` [PULL 37/47] hw/net/lasi_i82596: Re-enable build David Woodhouse
2024-02-01 16:44 ` [PULL 38/47] hw/net/lasi_i82596: use qemu_create_nic_device() David Woodhouse
2024-02-01 16:44 ` [PULL 39/47] hw/openrisc/openrisc_sim: " David Woodhouse
2024-02-01 16:44 ` [PULL 40/47] hw/riscv: use qemu_configure_nic_device() David Woodhouse
2024-02-01 16:44 ` [PULL 41/47] hw/s390x/s390-virtio-ccw: use qemu_create_nic_device() David Woodhouse
2024-02-01 16:44 ` [PULL 42/47] hw/sparc/sun4m: use qemu_find_nic_info() David Woodhouse
2024-02-01 16:44 ` [PULL 43/47] hw/xtensa/xtfpga: use qemu_create_nic_device() David Woodhouse
2024-02-01 16:44 ` [PULL 44/47] net: remove qemu_check_nic_model() David Woodhouse
2024-02-01 16:44 ` [PULL 45/47] hw/pci: remove pci_nic_init_nofail() David Woodhouse
2024-02-01 16:44 ` [PULL 46/47] net: remove qemu_show_nic_models(), qemu_find_nic_model() David Woodhouse
2024-02-01 16:44 ` [PULL 47/47] net: make nb_nics and nd_table[] static in net/net.c David Woodhouse
2024-02-02 15:32 ` [PULL 00/47] nic-config.for-upstream queue Peter Maydell
2024-02-02 15:36   ` David Woodhouse
2024-02-02 15:40     ` Peter Maydell
2024-02-05  6:56       ` Thomas Huth
2024-02-05 10:11         ` Thomas Huth
2024-02-05 10:55           ` Peter Maydell
2024-02-02 16:01   ` David Woodhouse
2024-02-02 16:15     ` Peter Maydell
2024-02-02 17:01       ` David Woodhouse

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240201164412.785520-4-dwmw2@infradead.org \
    --to=dwmw2@infradead.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).