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:
parent
4559a1dbcc
commit
928059a37b
@ -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
21
hmp.c
@ -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
1
hmp.h
@ -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
36
net.c
@ -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
3
net.h
@ -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"
|
||||
|
@ -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' }
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user