[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 03/47] net: add qemu_create_nic_bus_devices()
From: |
David Woodhouse |
Subject: |
[PULL 03/47] net: add qemu_create_nic_bus_devices() |
Date: |
Thu, 1 Feb 2024 16:43:28 +0000 |
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
- [PULL 39/47] hw/openrisc/openrisc_sim: use qemu_create_nic_device(), (continued)
- [PULL 39/47] hw/openrisc/openrisc_sim: use qemu_create_nic_device(), David Woodhouse, 2024/02/01
- [PULL 40/47] hw/riscv: use qemu_configure_nic_device(), David Woodhouse, 2024/02/01
- [PULL 19/47] hw/sparc64/sun4u: use pci_init_nic_devices(), David Woodhouse, 2024/02/01
- [PULL 35/47] hw/mips/mipssim: use qemu_create_nic_device(), David Woodhouse, 2024/02/01
- [PULL 26/47] hw/net/lan9118: use qemu_configure_nic_device(), David Woodhouse, 2024/02/01
- [PULL 20/47] hw/xtensa/virt: use pci_init_nic_devices(), David Woodhouse, 2024/02/01
- [PULL 15/47] hw/ppc/prep: use pci_init_nic_devices(), David Woodhouse, 2024/02/01
- [PULL 01/47] net: add qemu_{configure, create}_nic_device(), qemu_find_nic_info(), David Woodhouse, 2024/02/01
- [PULL 06/47] hw/xen: use qemu_create_nic_bus_devices() to instantiate Xen NICs, David Woodhouse, 2024/02/01
- [PULL 18/47] hw/sh4/r2d: use pci_init_nic_devices(), David Woodhouse, 2024/02/01
- [PULL 03/47] net: add qemu_create_nic_bus_devices(),
David Woodhouse <=
- [PULL 13/47] hw/mips/malta: use pci_init_nic_devices(), David Woodhouse, 2024/02/01
- [PULL 22/47] hw/arm/aspeed: use qemu_configure_nic_device(), David Woodhouse, 2024/02/01
- [PULL 28/47] hw/arm/npcm7xx: use qemu_configure_nic_device, allow emc0/emc1 as aliases, David Woodhouse, 2024/02/01
- [PULL 24/47] hw/arm/fsl: use qemu_configure_nic_device(), David Woodhouse, 2024/02/01
- [PULL 46/47] net: remove qemu_show_nic_models(), qemu_find_nic_model(), David Woodhouse, 2024/02/01
- [PULL 37/47] hw/net/lasi_i82596: Re-enable build, David Woodhouse, 2024/02/01
- [PULL 38/47] hw/net/lasi_i82596: use qemu_create_nic_device(), David Woodhouse, 2024/02/01
- [PULL 17/47] hw/ppc: use pci_init_nic_devices(), David Woodhouse, 2024/02/01
- [PULL 36/47] hw/mips/jazz: use qemu_find_nic_info(), David Woodhouse, 2024/02/01
- [PULL 09/47] hw/arm/virt: use pci_init_nic_devices(), David Woodhouse, 2024/02/01