@@ -43,7 +43,7 @@
#include "qemu/iov.h"
#include "qemu/main-loop.h"
#include "qapi-visit.h"
-#include "qapi/opts-visitor.h"
+#include "qapi/qobject-input-visitor.h"
#include "sysemu/sysemu.h"
#include "net/filter.h"
#include "qapi/string-output-visitor.h"
@@ -1065,7 +1065,20 @@ int net_client_init(QemuOpts *opts, bool is_netdev, Error **errp)
void *object = NULL;
Error *err = NULL;
int ret = -1;
- Visitor *v = opts_visitor_new(opts);
+ /*
+ * Needs autocreate_lists=true in order support existing
+ * syntax for list options where the bare key is repeated
+ *
+ * Needs autocreate_struct_levels=3 in order to deal with
+ * 3 level nesting in NetLegacy option args, which was
+ * exposed as a flat namespace with OptVisitor
+ */
+ Visitor *v = qobject_input_visitor_new_opts(opts, true, 3, false, &err);
+
+ if (err) {
+ error_propagate(errp, err);
+ return -1;
+ }
{
/* Parse convenience option format ip6-net=fec0::0[/64] */
The -net/-netdev command line parsing code uses OptsVisitor for parsing options to populate NetLegacy or NetDev struct respectively. Although those structs have nesting, the OptsVisitor flattens them, so we must enable compatibility options to auto-create structs. This allows the legacy syntax -net tap,id=net0,vlan=3,fd=3,script=/bin/ifup-qemu to be treated as equivalent to the modern QAPI based syntax -net id=net0,vlan=3,opts.type=tap,opts.data.fd=3,opts.data.script=/bin/ifup-qemu Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- net/net.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)