* [PULL 1/4] qapi/net: Rename NetDevPasstOptions to NetdevPasstOptions
2026-05-21 11:27 [PULL 0/4] QAPI patches for 2026-05-21 Markus Armbruster
@ 2026-05-21 11:27 ` Markus Armbruster
2026-05-21 11:27 ` [PULL 2/4] qapi/net: Wean passt off QAPI type String to improve documentation Markus Armbruster
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Markus Armbruster @ 2026-05-21 11:27 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau
We have eighteen QAPI type names starting with Netdev. Commit
854ee02b222 (net: Add passt network backend) added a first one
starting with NetDev. Rename it for consistency.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20260506105421.2461117-2-armbru@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
qapi/net.json | 6 +++---
net/passt.c | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/qapi/net.json b/qapi/net.json
index 118bd34965..8ed51b665c 100644
--- a/qapi/net.json
+++ b/qapi/net.json
@@ -115,7 +115,7 @@
'str': 'str' } }
##
-# @NetDevPasstOptions:
+# @NetdevPasstOptions:
#
# Unprivileged user-mode network connectivity using passt
#
@@ -191,7 +191,7 @@
#
# Since: 10.1
##
-{ 'struct': 'NetDevPasstOptions',
+{ 'struct': 'NetdevPasstOptions',
'data': {
'*path': 'str',
'*quiet': 'bool',
@@ -877,7 +877,7 @@
'discriminator': 'type',
'data': {
'nic': 'NetLegacyNicOptions',
- 'passt': { 'type': 'NetDevPasstOptions',
+ 'passt': { 'type': 'NetdevPasstOptions',
'if': 'CONFIG_PASST' },
'user': 'NetdevUserOptions',
'tap': 'NetdevTapOptions',
diff --git a/net/passt.c b/net/passt.c
index d3b5ab426c..223ccd1a1c 100644
--- a/net/passt.c
+++ b/net/passt.c
@@ -495,7 +495,7 @@ static int net_passt_vhost_user_init(NetPasstState *s, Error **errp)
}
#endif
-static GPtrArray *net_passt_decode_args(const NetDevPasstOptions *passt,
+static GPtrArray *net_passt_decode_args(const NetdevPasstOptions *passt,
gchar *pidfile, Error **errp)
{
GPtrArray *args = g_ptr_array_new_with_free_func(g_free);
--
2.54.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PULL 2/4] qapi/net: Wean passt off QAPI type String to improve documentation
2026-05-21 11:27 [PULL 0/4] QAPI patches for 2026-05-21 Markus Armbruster
2026-05-21 11:27 ` [PULL 1/4] qapi/net: Rename NetDevPasstOptions to NetdevPasstOptions Markus Armbruster
@ 2026-05-21 11:27 ` Markus Armbruster
2026-05-21 11:27 ` [PULL 3/4] qapi/net: Wean SLIRP " Markus Armbruster
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Markus Armbruster @ 2026-05-21 11:27 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau
String's doc comment is useless. Replace its use in
NetDevPasstOptions by identical types with hopefully useful
documentation.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20260506105421.2461117-3-armbru@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
[One Since: fixed up]
---
qapi/net.json | 43 +++++++++++++++++++++++++++++++++++++++----
net/passt.c | 8 ++++----
2 files changed, 43 insertions(+), 8 deletions(-)
diff --git a/qapi/net.json b/qapi/net.json
index 8ed51b665c..c95aa909a0 100644
--- a/qapi/net.json
+++ b/qapi/net.json
@@ -114,6 +114,41 @@
'data': {
'str': 'str' } }
+##
+# @PasstSearch:
+#
+# @str: DNS domain name suffix for host name lookup, or "none". See
+# passt(1) option --search.
+#
+# Since: 10.1
+##
+{ 'struct': 'PasstSearch',
+ 'data': {
+ 'str': 'str' } }
+
+##
+# @PasstPortForward:
+#
+# @str: passt port forwarding specification, see passt(1) option
+# --tcp-ports and --udp-ports.
+#
+# Since: 10.1
+##
+{ 'struct': 'PasstPortForward',
+ 'data': {
+ 'str': 'str' } }
+
+##
+# @PasstParameter:
+#
+# @str: Additional arguments for the passt executable, see passt(1)
+#
+# Since: 10.1
+##
+{ 'struct': 'PasstParameter',
+ 'data': {
+ 'str': 'str' } }
+
##
# @NetdevPasstOptions:
#
@@ -206,7 +241,7 @@
'*outbound-if4': 'str',
'*outbound-if6': 'str',
'*dns': 'str',
- '*search': ['String'],
+ '*search': ['PasstSearch'],
'*fqdn': 'str',
'*dhcp-dns': 'bool',
'*dhcp-search': 'bool',
@@ -224,9 +259,9 @@
'*freebind': 'bool',
'*ipv4': 'bool',
'*ipv6': 'bool',
- '*tcp-ports': ['String'],
- '*udp-ports': ['String'],
- '*param': ['String'] },
+ '*tcp-ports': ['PasstPortForward'],
+ '*udp-ports': ['PasstPortForward'],
+ '*param': ['PasstParameter'] },
'if': 'CONFIG_PASST' }
##
diff --git a/net/passt.c b/net/passt.c
index 223ccd1a1c..45440c399b 100644
--- a/net/passt.c
+++ b/net/passt.c
@@ -637,7 +637,7 @@ static GPtrArray *net_passt_decode_args(const NetdevPasstOptions *passt,
}
if (passt->has_search && passt->search) {
- const StringList *list = passt->search;
+ const PasstSearchList *list = passt->search;
GString *domains = g_string_new(list->value->str);
list = list->next;
@@ -652,7 +652,7 @@ static GPtrArray *net_passt_decode_args(const NetdevPasstOptions *passt,
}
if (passt->has_tcp_ports && passt->tcp_ports) {
- const StringList *list = passt->tcp_ports;
+ const PasstPortForwardList *list = passt->tcp_ports;
GString *tcp_ports = g_string_new(list->value->str);
list = list->next;
@@ -667,7 +667,7 @@ static GPtrArray *net_passt_decode_args(const NetdevPasstOptions *passt,
}
if (passt->has_udp_ports && passt->udp_ports) {
- const StringList *list = passt->udp_ports;
+ const PasstPortForwardList *list = passt->udp_ports;
GString *udp_ports = g_string_new(list->value->str);
list = list->next;
@@ -682,7 +682,7 @@ static GPtrArray *net_passt_decode_args(const NetdevPasstOptions *passt,
}
if (passt->has_param && passt->param) {
- const StringList *list = passt->param;
+ const PasstParameterList *list = passt->param;
while (list) {
g_ptr_array_add(args, g_strdup(list->value->str));
--
2.54.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PULL 3/4] qapi/net: Wean SLIRP off QAPI type String to improve documentation
2026-05-21 11:27 [PULL 0/4] QAPI patches for 2026-05-21 Markus Armbruster
2026-05-21 11:27 ` [PULL 1/4] qapi/net: Rename NetDevPasstOptions to NetdevPasstOptions Markus Armbruster
2026-05-21 11:27 ` [PULL 2/4] qapi/net: Wean passt off QAPI type String to improve documentation Markus Armbruster
@ 2026-05-21 11:27 ` Markus Armbruster
2026-05-21 11:27 ` [PULL 4/4] qapi/net: Drop unused type String Markus Armbruster
2026-05-21 19:20 ` [PULL 0/4] QAPI patches for 2026-05-21 Stefan Hajnoczi
4 siblings, 0 replies; 6+ messages in thread
From: Markus Armbruster @ 2026-05-21 11:27 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau
String's doc comment is useless. Replace its use in NetdevUserOptions
by identical types with hopefully useful documentation.
While there, add a non-doc comment explaining why the port forwarding
interface is problematic.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20260506105421.2461117-4-armbru@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
[Commit message typo fixed]
---
qapi/net.json | 52 ++++++++++++++++++++++++++++++++++++++++++++++++---
net/slirp.c | 27 ++++++++++++++++++++------
2 files changed, 70 insertions(+), 9 deletions(-)
diff --git a/qapi/net.json b/qapi/net.json
index c95aa909a0..2f85956c32 100644
--- a/qapi/net.json
+++ b/qapi/net.json
@@ -264,6 +264,52 @@
'*param': ['PasstParameter'] },
'if': 'CONFIG_PASST' }
+##
+# @NetdevUserDomainSuffix:
+#
+# @str: DNS domain name suffix for host name lookup, similar to
+# resolv.conf(5)
+#
+# Since: 1.2
+##
+{ 'struct': 'NetdevUserDomainSuffix',
+ 'data': {
+ 'str': 'str' } }
+
+##
+# @NetdevUserHostForward:
+#
+# @str: Host port forwarding rule
+#
+# TODO: This string gets parsed by slirp_hostfwd(). We fail to
+# document syntax and semantics here. We do in qemu-options.hx.
+# Parsing structured configuration from strings is a no-no for QMP.
+# This should really be a struct. Not sure it's worth the bother
+# now.
+#
+# Since: 1.2
+##
+{ 'struct': 'NetdevUserHostForward',
+ 'data': {
+ 'str': 'str' } }
+
+##
+# @NetdevUserGuestForward:
+#
+# @str: Guest port forwarding rule
+#
+# TODO: This string gets parsed by slirp_guestfwd(). We fail to
+# document syntax and semantics here. We do in qemu-options.hx.
+# Parsing structured configuration from strings is a no-no for QMP.
+# This should really be a struct. Not sure it's worth the bother
+# now.
+#
+# Since: 1.2
+##
+{ 'struct': 'NetdevUserGuestForward',
+ 'data': {
+ 'str': 'str' } }
+
##
# @NetdevUserOptions:
#
@@ -340,7 +386,7 @@
'*bootfile': 'str',
'*dhcpstart': 'str',
'*dns': 'str',
- '*dnssearch': ['String'],
+ '*dnssearch': ['NetdevUserDomainSuffix'],
'*domainname': 'str',
'*ipv6-prefix': 'str',
'*ipv6-prefixlen': 'int',
@@ -348,8 +394,8 @@
'*ipv6-dns': 'str',
'*smb': 'str',
'*smbserver': 'str',
- '*hostfwd': ['String'],
- '*guestfwd': ['String'],
+ '*hostfwd': ['NetdevUserHostForward'],
+ '*guestfwd': ['NetdevUserGuestForward'],
'*tftp-server-name': 'str' } }
##
diff --git a/net/slirp.c b/net/slirp.c
index 04925f3318..a00e0a9651 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -1215,14 +1215,14 @@ void hmp_info_usernet(Monitor *mon, const QDict *qdict)
}
static void
-net_init_slirp_configs(const StringList *fwd, int flags)
+net_init_slirp_configs_host(const NetdevUserHostForwardList *fwd)
{
while (fwd) {
struct slirp_config_str *config;
config = g_malloc0(sizeof(*config));
pstrcpy(config->str, sizeof(config->str), fwd->value->str);
- config->flags = flags;
+ config->flags = SLIRP_CFG_HOSTFWD;
config->next = slirp_configs;
slirp_configs = config;
@@ -1230,9 +1230,24 @@ net_init_slirp_configs(const StringList *fwd, int flags)
}
}
-static const char **slirp_dnssearch(const StringList *dnsname)
+static void
+net_init_slirp_configs_guest(const NetdevUserGuestForwardList *fwd)
{
- const StringList *c = dnsname;
+ while (fwd) {
+ struct slirp_config_str *config;
+
+ config = g_malloc0(sizeof(*config));
+ pstrcpy(config->str, sizeof(config->str), fwd->value->str);
+ config->next = slirp_configs;
+ slirp_configs = config;
+
+ fwd = fwd->next;
+ }
+}
+
+static const char **slirp_dnssearch(const NetdevUserDomainSuffixList *dnsname)
+{
+ const NetdevUserDomainSuffixList *c = dnsname;
size_t i = 0, num_opts = 0;
const char **ret;
@@ -1285,8 +1300,8 @@ int net_init_slirp(const Netdev *netdev, const char *name,
/* all optional fields are initialized to "all bits zero" */
- net_init_slirp_configs(user->hostfwd, SLIRP_CFG_HOSTFWD);
- net_init_slirp_configs(user->guestfwd, 0);
+ net_init_slirp_configs_host(user->hostfwd);
+ net_init_slirp_configs_guest(user->guestfwd);
ret = net_slirp_init(peer, "user", name, user->q_restrict,
ipv4, vnet, user->host,
--
2.54.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PULL 4/4] qapi/net: Drop unused type String
2026-05-21 11:27 [PULL 0/4] QAPI patches for 2026-05-21 Markus Armbruster
` (2 preceding siblings ...)
2026-05-21 11:27 ` [PULL 3/4] qapi/net: Wean SLIRP " Markus Armbruster
@ 2026-05-21 11:27 ` Markus Armbruster
2026-05-21 19:20 ` [PULL 0/4] QAPI patches for 2026-05-21 Stefan Hajnoczi
4 siblings, 0 replies; 6+ messages in thread
From: Markus Armbruster @ 2026-05-21 11:27 UTC (permalink / raw)
To: qemu-devel; +Cc: stefanha, Marc-André Lureau
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20260506105421.2461117-5-armbru@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
qapi/net.json | 11 -----------
1 file changed, 11 deletions(-)
diff --git a/qapi/net.json b/qapi/net.json
index 2f85956c32..1a6382825c 100644
--- a/qapi/net.json
+++ b/qapi/net.json
@@ -103,17 +103,6 @@
'*addr': 'str',
'*vectors': 'uint32' } }
-##
-# @String:
-#
-# A fat type wrapping 'str', to be embedded in lists.
-#
-# Since: 1.2
-##
-{ 'struct': 'String',
- 'data': {
- 'str': 'str' } }
-
##
# @PasstSearch:
#
--
2.54.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PULL 0/4] QAPI patches for 2026-05-21
2026-05-21 11:27 [PULL 0/4] QAPI patches for 2026-05-21 Markus Armbruster
` (3 preceding siblings ...)
2026-05-21 11:27 ` [PULL 4/4] qapi/net: Drop unused type String Markus Armbruster
@ 2026-05-21 19:20 ` Stefan Hajnoczi
4 siblings, 0 replies; 6+ messages in thread
From: Stefan Hajnoczi @ 2026-05-21 19:20 UTC (permalink / raw)
To: Markus Armbruster; +Cc: qemu-devel, stefanha
[-- Attachment #1: Type: text/plain, Size: 116 bytes --]
Applied, thanks.
Please update the changelog at https://wiki.qemu.org/ChangeLog/11.1 for any user-visible changes.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread