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",
|
.args_type = "netdev:O",
|
||||||
.params = "[user|tap|socket],id=str[,prop=value][,...]",
|
.params = "[user|tap|socket],id=str[,prop=value][,...]",
|
||||||
.help = "add host network device",
|
.help = "add host network device",
|
||||||
.user_print = monitor_user_noop,
|
.mhandler.cmd = hmp_netdev_add,
|
||||||
.mhandler.cmd_new = do_netdev_add,
|
|
||||||
},
|
},
|
||||||
|
|
||||||
STEXI
|
STEXI
|
||||||
|
21
hmp.c
21
hmp.c
@ -14,6 +14,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "hmp.h"
|
#include "hmp.h"
|
||||||
|
#include "net.h"
|
||||||
|
#include "qemu-option.h"
|
||||||
#include "qemu-timer.h"
|
#include "qemu-timer.h"
|
||||||
#include "qmp-commands.h"
|
#include "qmp-commands.h"
|
||||||
|
|
||||||
@ -969,3 +971,22 @@ void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict)
|
|||||||
&errp);
|
&errp);
|
||||||
hmp_handle_error(mon, &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_migrate(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_device_del(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_dump_guest_memory(Monitor *mon, const QDict *qdict);
|
||||||
|
void hmp_netdev_add(Monitor *mon, const QDict *qdict);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
40
net.c
40
net.c
@ -1234,27 +1234,39 @@ void net_host_device_remove(Monitor *mon, const QDict *qdict)
|
|||||||
qemu_del_vlan_client(vc);
|
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;
|
Error *local_err = NULL;
|
||||||
|
QemuOptsList *opts_list;
|
||||||
QemuOpts *opts;
|
QemuOpts *opts;
|
||||||
int res;
|
|
||||||
|
|
||||||
opts = qemu_opts_from_qdict(qemu_find_opts("netdev"), qdict, &local_err);
|
opts_list = qemu_find_opts_err("netdev", &local_err);
|
||||||
if (!opts) {
|
if (error_is_set(&local_err)) {
|
||||||
|
goto exit_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 0;
|
||||||
|
|
||||||
|
exit_err:
|
||||||
qerror_report_err(local_err);
|
qerror_report_err(local_err);
|
||||||
error_free(local_err);
|
error_free(local_err);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
res = net_client_init(opts, 1, &local_err);
|
|
||||||
if (res < 0) {
|
|
||||||
qerror_report_err(local_err);
|
|
||||||
error_free(local_err);
|
|
||||||
qemu_opts_del(opts);
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int do_netdev_del(Monitor *mon, const QDict *qdict, QObject **ret_data)
|
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_cleanup(void);
|
||||||
void net_host_device_add(Monitor *mon, const QDict *qdict);
|
void net_host_device_add(Monitor *mon, const QDict *qdict);
|
||||||
void net_host_device_remove(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);
|
int do_netdev_del(Monitor *mon, const QDict *qdict, QObject **ret_data);
|
||||||
|
|
||||||
#define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup"
|
#define DEFAULT_NETWORK_SCRIPT "/etc/qemu-ifup"
|
||||||
|
@ -1798,3 +1798,31 @@
|
|||||||
{ 'command': 'dump-guest-memory',
|
{ 'command': 'dump-guest-memory',
|
||||||
'data': { 'paging': 'bool', 'protocol': 'str', '*begin': 'int',
|
'data': { 'paging': 'bool', 'protocol': 'str', '*begin': 'int',
|
||||||
'*length': '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",
|
.name = "netdev_add",
|
||||||
.args_type = "netdev:O",
|
.args_type = "netdev:O",
|
||||||
.params = "[user|tap|socket],id=str[,prop=value][,...]",
|
.mhandler.cmd_new = qmp_netdev_add,
|
||||||
.help = "add host network device",
|
|
||||||
.user_print = monitor_user_noop,
|
|
||||||
.mhandler.cmd_new = do_netdev_add,
|
|
||||||
},
|
},
|
||||||
|
|
||||||
SQMP
|
SQMP
|
||||||
|
Loading…
Reference in New Issue
Block a user