qapi: convert netdev_add

This is not a full QAPI conversion, but an intermediate step.

In essence, do_netdev_add() is split into three functions:

 1. netdev_add(): performs the actual work. This function is fully
    converted to Error (thus, it's "qapi-friendly")

 2. qmp_netdev_add(): the QMP front-end for netdev_add(). This is
    coded by hand and not auto-generated (gen=no in the schema). The
    reason for this it's a lot easier and simpler to with QemuOpts
    this way

 3. hmp_netdev_add(): HMP front-end.

This design was suggested by Paolo Bonzini.

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
Reviewed-By: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
Luiz Capitulino 2012-04-18 17:34:15 -03:00
parent 4559a1dbcc
commit 928059a37b
7 changed files with 78 additions and 19 deletions

View File

@ -1037,8 +1037,7 @@ ETEXI
.args_type = "netdev:O",
.params = "[user|tap|socket],id=str[,prop=value][,...]",
.help = "add host network device",
.user_print = monitor_user_noop,
.mhandler.cmd_new = do_netdev_add,
.mhandler.cmd = hmp_netdev_add,
},
STEXI

21
hmp.c
View File

@ -14,6 +14,8 @@
*/
#include "hmp.h"
#include "net.h"
#include "qemu-option.h"
#include "qemu-timer.h"
#include "qmp-commands.h"
@ -969,3 +971,22 @@ void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict)
&errp);
hmp_handle_error(mon, &errp);
}
void hmp_netdev_add(Monitor *mon, const QDict *qdict)
{
Error *err = NULL;
QemuOpts *opts;
opts = qemu_opts_from_qdict(qemu_find_opts("netdev"), qdict, &err);
if (error_is_set(&err)) {
goto out;
}
netdev_add(opts, &err);
if (error_is_set(&err)) {
qemu_opts_del(opts);
}
out:
hmp_handle_error(mon, &err);
}

1
hmp.h
View File

@ -62,5 +62,6 @@ void hmp_block_job_cancel(Monitor *mon, const QDict *qdict);
void hmp_migrate(Monitor *mon, const QDict *qdict);
void hmp_device_del(Monitor *mon, const QDict *qdict);
void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict);
void hmp_netdev_add(Monitor *mon, const QDict *qdict);
#endif

36
net.c
View File

@ -1234,27 +1234,39 @@ void net_host_device_remove(Monitor *mon, const QDict *qdict)
qemu_del_vlan_client(vc);
}
int do_netdev_add(Monitor *mon, const QDict *qdict, QObject **ret_data)
void netdev_add(QemuOpts *opts, Error **errp)
{
net_client_init(opts, 1, errp);
}
int qmp_netdev_add(Monitor *mon, const QDict *qdict, QObject **ret)
{
Error *local_err = NULL;
QemuOptsList *opts_list;
QemuOpts *opts;
int res;
opts = qemu_opts_from_qdict(qemu_find_opts("netdev"), qdict, &local_err);
if (!opts) {
qerror_report_err(local_err);
error_free(local_err);
return -1;
opts_list = qemu_find_opts_err("netdev", &local_err);
if (error_is_set(&local_err)) {
goto exit_err;
}
res = net_client_init(opts, 1, &local_err);
if (res < 0) {
qerror_report_err(local_err);
error_free(local_err);
opts = qemu_opts_from_qdict(opts_list, qdict, &local_err);
if (error_is_set(&local_err)) {
goto exit_err;
}
netdev_add(opts, &local_err);
if (error_is_set(&local_err)) {
qemu_opts_del(opts);
goto exit_err;
}
return res;
return 0;
exit_err:
qerror_report_err(local_err);
error_free(local_err);
return -1;
}
int do_netdev_del(Monitor *mon, const QDict *qdict, QObject **ret_data)

3
net.h
View File

@ -170,7 +170,8 @@ void net_check_clients(void);
void net_cleanup(void);
void net_host_device_add(Monitor *mon, const QDict *qdict);
void net_host_device_remove(Monitor *mon, const QDict *qdict);
int do_netdev_add(Monitor *mon, const QDict *qdict, QObject **ret_data);
void netdev_add(QemuOpts *opts, Error **errp);
int qmp_netdev_add(Monitor *mon, const QDict *qdict, QObject **ret);
int do_netdev_del(Monitor *mon, const QDict *qdict, QObject **ret_data);
#define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup"

View File

@ -1798,3 +1798,31 @@
{ 'command': 'dump-guest-memory',
'data': { 'paging': 'bool', 'protocol': 'str', '*begin': 'int',
'*length': 'int' } }
##
# @netdev_add:
#
# Add a network backend.
#
# @type: the type of network backend. Current valid values are 'user', 'tap',
# 'vde', 'socket', 'dump' and 'bridge'
#
# @id: the name of the new network backend
#
# @props: #optional a list of properties to be passed to the backend in
# the format 'name=value', like 'ifname=tap0,script=no'
#
# Notes: The semantics of @props is not well defined. Future commands will be
# introduced that provide stronger typing for backend creation.
#
# Since: 0.14.0
#
# Returns: Nothing on success
# If @type is not a valid network backend, DeviceNotFound
# If @id is not a valid identifier, InvalidParameterValue
# if @id already exists, DuplicateId
# If @props contains an invalid parameter for this backend,
# InvalidParameter
##
{ 'command': 'netdev_add',
'data': {'type': 'str', 'id': 'str', '*props': '**'},
'gen': 'no' }

View File

@ -642,10 +642,7 @@ EQMP
{
.name = "netdev_add",
.args_type = "netdev:O",
.params = "[user|tap|socket],id=str[,prop=value][,...]",
.help = "add host network device",
.user_print = monitor_user_noop,
.mhandler.cmd_new = do_netdev_add,
.mhandler.cmd_new = qmp_netdev_add,
},
SQMP