mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 09:58:01 +00:00
cfm: Make argument to ovs-appctl "cfm/show" command optional.
If an argument isn't passed to "cfm/show", it will print information about all interfaces with CFM enabled.
This commit is contained in:
parent
7ff2009a95
commit
ae75dae345
4
NEWS
4
NEWS
@ -5,7 +5,9 @@ Post-v1.2.0
|
|||||||
NXM fields.
|
NXM fields.
|
||||||
- Added an OpenFlow extension for flexible learning.
|
- Added an OpenFlow extension for flexible learning.
|
||||||
- ovs-appctl:
|
- ovs-appctl:
|
||||||
- New "version" command to determine version of running daemon
|
- New "version" command to determine version of running daemon.
|
||||||
|
- If no argument is provided for "cfm/show", displays detailed
|
||||||
|
information about all interfaces with CFM enabled.
|
||||||
- ovs-vswitchd:
|
- ovs-vswitchd:
|
||||||
- The software switch now supports 255 OpenFlow tables, instead
|
- The software switch now supports 255 OpenFlow tables, instead
|
||||||
of just one. By default, only table 0 is consulted, but the
|
of just one. By default, only table 0 is consulted, but the
|
||||||
|
64
lib/cfm.c
64
lib/cfm.c
@ -220,7 +220,8 @@ lookup_remote_mp(const struct cfm *cfm, uint64_t mpid)
|
|||||||
void
|
void
|
||||||
cfm_init(void)
|
cfm_init(void)
|
||||||
{
|
{
|
||||||
unixctl_command_register("cfm/show", "interface", cfm_unixctl_show, NULL);
|
unixctl_command_register("cfm/show", "[interface]", cfm_unixctl_show,
|
||||||
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocates a 'cfm' object called 'name'. 'cfm' should be initialized by
|
/* Allocates a 'cfm' object called 'name'. 'cfm' should be initialized by
|
||||||
@ -516,37 +517,50 @@ cfm_find(const char *name)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cfm_print_details(struct ds *ds, const struct cfm *cfm)
|
||||||
|
{
|
||||||
|
struct remote_mp *rmp;
|
||||||
|
|
||||||
|
ds_put_format(ds, "---- %s ----\n", cfm->name);
|
||||||
|
ds_put_format(ds, "MPID %"PRIu64":%s%s\n", cfm->mpid,
|
||||||
|
cfm->fault ? " fault" : "",
|
||||||
|
cfm->unexpected_recv ? " unexpected_recv" : "");
|
||||||
|
|
||||||
|
ds_put_format(ds, "\tinterval: %dms\n", cfm->ccm_interval_ms);
|
||||||
|
ds_put_format(ds, "\tnext CCM tx: %lldms\n",
|
||||||
|
timer_msecs_until_expired(&cfm->tx_timer));
|
||||||
|
ds_put_format(ds, "\tnext fault check: %lldms\n",
|
||||||
|
timer_msecs_until_expired(&cfm->fault_timer));
|
||||||
|
|
||||||
|
ds_put_cstr(ds, "\n");
|
||||||
|
HMAP_FOR_EACH (rmp, node, &cfm->remote_mps) {
|
||||||
|
ds_put_format(ds, "Remote MPID %"PRIu64":%s\n",
|
||||||
|
rmp->mpid,
|
||||||
|
rmp->rdi ? " rdi" : "");
|
||||||
|
ds_put_format(ds, "\trecv since check: %s",
|
||||||
|
rmp->recv ? "true" : "false");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cfm_unixctl_show(struct unixctl_conn *conn,
|
cfm_unixctl_show(struct unixctl_conn *conn,
|
||||||
const char *args, void *aux OVS_UNUSED)
|
const char *args, void *aux OVS_UNUSED)
|
||||||
{
|
{
|
||||||
struct ds ds = DS_EMPTY_INITIALIZER;
|
struct ds ds = DS_EMPTY_INITIALIZER;
|
||||||
const struct cfm *cfm;
|
const struct cfm *cfm;
|
||||||
struct remote_mp *rmp;
|
|
||||||
|
|
||||||
cfm = cfm_find(args);
|
if (strlen(args)) {
|
||||||
if (!cfm) {
|
cfm = cfm_find(args);
|
||||||
unixctl_command_reply(conn, 501, "no such CFM object");
|
if (!cfm) {
|
||||||
return;
|
unixctl_command_reply(conn, 501, "no such CFM object");
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
ds_put_format(&ds, "MPID %"PRIu64":%s%s\n", cfm->mpid,
|
cfm_print_details(&ds, cfm);
|
||||||
cfm->fault ? " fault" : "",
|
} else {
|
||||||
cfm->unexpected_recv ? " unexpected_recv" : "");
|
HMAP_FOR_EACH (cfm, hmap_node, &all_cfms) {
|
||||||
|
cfm_print_details(&ds, cfm);
|
||||||
ds_put_format(&ds, "\tinterval: %dms\n", cfm->ccm_interval_ms);
|
}
|
||||||
ds_put_format(&ds, "\tnext CCM tx: %lldms\n",
|
|
||||||
timer_msecs_until_expired(&cfm->tx_timer));
|
|
||||||
ds_put_format(&ds, "\tnext fault check: %lldms\n",
|
|
||||||
timer_msecs_until_expired(&cfm->fault_timer));
|
|
||||||
|
|
||||||
ds_put_cstr(&ds, "\n");
|
|
||||||
HMAP_FOR_EACH (rmp, node, &cfm->remote_mps) {
|
|
||||||
ds_put_format(&ds, "Remote MPID %"PRIu64":%s\n",
|
|
||||||
rmp->mpid,
|
|
||||||
rmp->rdi ? " rdi" : "");
|
|
||||||
ds_put_format(&ds, "\trecv since check: %s",
|
|
||||||
rmp->recv ? "true" : "false");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unixctl_command_reply(conn, 200, ds_cstr(&ds));
|
unixctl_command_reply(conn, 200, ds_cstr(&ds));
|
||||||
|
@ -111,9 +111,11 @@ Causes \fBovs\-vswitchd\fR to gracefully terminate.
|
|||||||
.IP "\fBqos/show\fR \fIinterface\fR"
|
.IP "\fBqos/show\fR \fIinterface\fR"
|
||||||
Queries the kernel for Quality of Service configuration and statistics
|
Queries the kernel for Quality of Service configuration and statistics
|
||||||
associated with the given \fIinterface\fR.
|
associated with the given \fIinterface\fR.
|
||||||
.IP "\fBcfm/show\fR \fIinterface\fR"
|
.IP "\fBcfm/show\fR [\fIinterface\fR]"
|
||||||
Displays detailed information about Connectivity Fault Management
|
Displays detailed information about Connectivity Fault Management
|
||||||
configured on \fIinterface\fR.
|
configured on \fIinterface\fR. If \fIinterface\fR is not specified,
|
||||||
|
then displays detailed information about all interfaces with CFM
|
||||||
|
enabled.
|
||||||
.SS "BRIDGE COMMANDS"
|
.SS "BRIDGE COMMANDS"
|
||||||
These commands manage bridges.
|
These commands manage bridges.
|
||||||
.IP "\fBfdb/show\fR \fIbridge\fR"
|
.IP "\fBfdb/show\fR \fIbridge\fR"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user