Skip to content

Commit

Permalink
net/announce: Add HMP optional interface list
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
dagrh authored and jasowang committed Jul 2, 2019
1 parent ef2fdbf commit 0852827
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 3 deletions.
6 changes: 4 additions & 2 deletions hmp-commands.hx
Expand Up @@ -955,8 +955,8 @@ ETEXI

{
.name = "announce_self",
.args_type = "",
.params = "",
.args_type = "interfaces:s?",
.params = "[interfaces]",
.help = "Trigger GARP/RARP announcements",
.cmd = hmp_announce_self,
},
Expand All @@ -967,6 +967,8 @@ STEXI
Trigger a round of GARP/RARP broadcasts; this is useful for explicitly updating the
network infrastructure after a reconfiguration or some forms of migration.
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

{
Expand Down
38 changes: 37 additions & 1 deletion monitor/hmp-cmds.c
Expand Up @@ -27,6 +27,7 @@
#include "monitor/monitor-internal.h"
#include "monitor/qdev.h"
#include "qapi/error.h"
#include "qapi/clone-visitor.h"
#include "qapi/opts-visitor.h"
#include "qapi/qapi-builtin-visit.h"
#include "qapi/qapi-commands-block.h"
Expand All @@ -38,6 +39,7 @@
#include "qapi/qapi-commands-run-state.h"
#include "qapi/qapi-commands-tpm.h"
#include "qapi/qapi-commands-ui.h"
#include "qapi/qapi-visit-net.h"
#include "qapi/qmp/qdict.h"
#include "qapi/qmp/qerror.h"
#include "qapi/string-input-visitor.h"
Expand Down Expand Up @@ -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)
{
NameInfo *info;
Expand Down Expand Up @@ -1631,7 +1659,15 @@ void hmp_info_snapshots(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)
Expand Down

0 comments on commit 0852827

Please sign in to comment.