net/announce: Add HMP optional interface list

Add the optional interface list to the HMP command.

i.e.

   All interfaces
        announce_self

   Just the named interfaces:
        announce_self vn1,vn2

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
Dr. David Alan Gilbert 2019-06-20 19:47:03 +01:00 committed by Jason Wang
parent ef2fdbfb4d
commit 0852827115
2 changed files with 41 additions and 3 deletions

View File

@ -955,8 +955,8 @@ ETEXI
{ {
.name = "announce_self", .name = "announce_self",
.args_type = "", .args_type = "interfaces:s?",
.params = "", .params = "[interfaces]",
.help = "Trigger GARP/RARP announcements", .help = "Trigger GARP/RARP announcements",
.cmd = hmp_announce_self, .cmd = hmp_announce_self,
}, },
@ -967,6 +967,8 @@ STEXI
Trigger a round of GARP/RARP broadcasts; this is useful for explicitly updating the Trigger a round of GARP/RARP broadcasts; this is useful for explicitly updating the
network infrastructure after a reconfiguration or some forms of migration. network infrastructure after a reconfiguration or some forms of migration.
The timings of the round are set by the migration announce parameters. The timings of the round are set by the migration announce parameters.
An optional comma separated @var{interfaces} list restricts the announce to the
named set of interfaces.
ETEXI ETEXI
{ {

View File

@ -27,6 +27,7 @@
#include "monitor/monitor-internal.h" #include "monitor/monitor-internal.h"
#include "monitor/qdev.h" #include "monitor/qdev.h"
#include "qapi/error.h" #include "qapi/error.h"
#include "qapi/clone-visitor.h"
#include "qapi/opts-visitor.h" #include "qapi/opts-visitor.h"
#include "qapi/qapi-builtin-visit.h" #include "qapi/qapi-builtin-visit.h"
#include "qapi/qapi-commands-block.h" #include "qapi/qapi-commands-block.h"
@ -38,6 +39,7 @@
#include "qapi/qapi-commands-run-state.h" #include "qapi/qapi-commands-run-state.h"
#include "qapi/qapi-commands-tpm.h" #include "qapi/qapi-commands-tpm.h"
#include "qapi/qapi-commands-ui.h" #include "qapi/qapi-commands-ui.h"
#include "qapi/qapi-visit-net.h"
#include "qapi/qmp/qdict.h" #include "qapi/qmp/qdict.h"
#include "qapi/qmp/qerror.h" #include "qapi/qmp/qerror.h"
#include "qapi/string-input-visitor.h" #include "qapi/string-input-visitor.h"
@ -67,6 +69,32 @@ static void hmp_handle_error(Monitor *mon, Error **errp)
} }
} }
/*
* Produce a strList from a comma separated list.
* A NULL or empty input string return NULL.
*/
static strList *strList_from_comma_list(const char *in)
{
strList *res = NULL;
strList **hook = &res;
while (in && in[0]) {
char *comma = strchr(in, ',');
*hook = g_new0(strList, 1);
if (comma) {
(*hook)->value = g_strndup(in, comma - in);
in = comma + 1; /* skip the , */
} else {
(*hook)->value = g_strdup(in);
in = NULL;
}
hook = &(*hook)->next;
}
return res;
}
void hmp_info_name(Monitor *mon, const QDict *qdict) void hmp_info_name(Monitor *mon, const QDict *qdict)
{ {
NameInfo *info; NameInfo *info;
@ -1631,7 +1659,15 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
void hmp_announce_self(Monitor *mon, const QDict *qdict) void hmp_announce_self(Monitor *mon, const QDict *qdict)
{ {
qmp_announce_self(migrate_announce_params(), NULL); const char *interfaces_str = qdict_get_try_str(qdict, "interfaces");
AnnounceParameters *params = QAPI_CLONE(AnnounceParameters,
migrate_announce_params());
qapi_free_strList(params->interfaces);
params->interfaces = strList_from_comma_list(interfaces_str);
params->has_interfaces = params->interfaces != NULL;
qmp_announce_self(params, NULL);
qapi_free_AnnounceParameters(params);
} }
void hmp_migrate_cancel(Monitor *mon, const QDict *qdict) void hmp_migrate_cancel(Monitor *mon, const QDict *qdict)