Skip to content

Commit

Permalink
qapi: convert netdev_add
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-By: Laszlo Ersek <[email protected]>
  • Loading branch information
Luiz Capitulino committed Jun 4, 2012
1 parent 4559a1d commit 928059a
Show file tree
Hide file tree
Showing 7 changed files with 78 additions and 19 deletions.
3 changes: 1 addition & 2 deletions hmp-commands.hx
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
21 changes: 21 additions & 0 deletions hmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
*/

#include "hmp.h"
#include "net.h"
#include "qemu-option.h"
#include "qemu-timer.h"
#include "qmp-commands.h"

Expand Down Expand Up @@ -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 change: 1 addition & 0 deletions hmp.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 24 additions & 12 deletions net.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
3 changes: 2 additions & 1 deletion net.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
28 changes: 28 additions & 0 deletions qapi-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -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' }
5 changes: 1 addition & 4 deletions qmp-commands.hx
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 928059a

Please sign in to comment.