f3eedcddba
As qemu_opts_parse_noisily() flattens the QAPI structures ("type" field
of Netdev structure can collides with "type" field of SocketAddress),
we introduce a way to bypass qemu_opts_parse_noisily() and use directly
visit_type_Netdev() to parse the backend parameters.
More details from Markus:
qemu_init() passes the argument of -netdev, -nic, and -net to
net_client_parse().
net_client_parse() parses with qemu_opts_parse_noisily(), passing
QemuOptsList qemu_netdev_opts for -netdev, qemu_nic_opts for -nic, and
qemu_net_opts for -net. Their desc[] are all empty, which means any
keys are accepted. The result of the parse (a QemuOpts) is stored in
the QemuOptsList.
Note that QemuOpts is flat by design. In some places, we layer non-flat
on top using dotted keys convention, but not here.
net_init_clients() iterates over the stored QemuOpts, and passes them to
net_init_netdev(), net_param_nic(), or net_init_client(), respectively.
These functions pass the QemuOpts to net_client_init(). They also do
other things with the QemuOpts, which we can ignore here.
net_client_init() uses the opts visitor to convert the (flat) QemOpts to
a (non-flat) QAPI object Netdev. Netdev is also the argument of QMP
command netdev_add.
The opts visitor was an early attempt to support QAPI in
(QemuOpts-based) CLI. It restricts QAPI types to a certain shape; see
commit
|
||
---|---|---|
.. | ||
arch_init.c | ||
balloon.c | ||
bootdevice.c | ||
cpu-throttle.c | ||
cpu-timers.c | ||
cpus.c | ||
datadir.c | ||
device_tree.c | ||
dirtylimit.c | ||
dma-helpers.c | ||
globals.c | ||
icount.c | ||
ioport.c | ||
main.c | ||
memory_mapping.c | ||
memory.c | ||
meson.build | ||
physmem.c | ||
qdev-monitor.c | ||
qemu-seccomp.c | ||
qtest.c | ||
rtc.c | ||
runstate-action.c | ||
runstate.c | ||
timers-state.h | ||
tpm.c | ||
trace-events | ||
trace.h | ||
vl.c |