Re: [PATCH v3 03/46] net: add qemu_create_nic_bus_devices()

2024-01-26 Thread Thomas Huth

On 08/01/2024 21.26, David Woodhouse wrote:

From: David Woodhouse 

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 
Reviewed-by: Paul Durrant 
---
  include/net/net.h |  3 +++
  net/net.c | 53 +++
  2 files changed, 56 insertions(+)


Reviewed-by: Thomas Huth 





[PATCH v3 03/46] net: add qemu_create_nic_bus_devices()

2024-01-08 Thread David Woodhouse
From: David Woodhouse 

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 
Reviewed-by: Paul Durrant 
---
 include/net/net.h |  3 +++
 net/net.c | 53 +++
 2 files changed, 56 insertions(+)

diff --git a/include/net/net.h b/include/net/net.h
index 25ea83fd12..31e63d1f0d 100644
--- a/include/net/net.h
+++ b/include/net/net.h
@@ -213,6 +213,9 @@ bool qemu_configure_nic_device(DeviceState *dev, bool 
match_default,
const char *alias);
 DeviceState *qemu_create_nic_device(const char *typename, bool match_default,
 const char *alias);
+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 = _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, _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.41.0