cfm: Make argument to ovs-appctl "cfm/show" command optional.
authorJustin Pettit <jpettit@nicira.com>
Mon, 26 Sep 2011 22:40:53 +0000 (15:40 -0700)
committerJustin Pettit <jpettit@nicira.com>
Fri, 30 Sep 2011 01:52:28 +0000 (18:52 -0700)
If an argument isn't passed to "cfm/show", it will print information
about all interfaces with CFM enabled.

NEWS
lib/cfm.c
vswitchd/ovs-vswitchd.8.in

diff --git a/NEWS b/NEWS
index 1d209e9fe2414247f788e28f15d09a71920a0b62..c2f62a11ae08b255a0c7ef0937e183466919e334 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,7 +5,9 @@ Post-v1.2.0
         NXM fields.
       - Added an OpenFlow extension for flexible learning.
     - 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:
       - The software switch now supports 255 OpenFlow tables, instead
         of just one.  By default, only table 0 is consulted, but the
index 0bb2bf19e47593572cf62bac223315710b79d5be..ff401dc54ee74771203f466baa7ebc6de9a295bd 100644 (file)
--- a/lib/cfm.c
+++ b/lib/cfm.c
@@ -220,7 +220,8 @@ lookup_remote_mp(const struct cfm *cfm, uint64_t mpid)
 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
@@ -517,37 +518,50 @@ cfm_find(const char *name)
 }
 
 static void
-cfm_unixctl_show(struct unixctl_conn *conn,
-                 const char *args, void *aux OVS_UNUSED)
+cfm_print_details(struct ds *ds, const struct cfm *cfm)
 {
-    struct ds ds = DS_EMPTY_INITIALIZER;
-    const struct cfm *cfm;
     struct remote_mp *rmp;
 
-    cfm = cfm_find(args);
-    if (!cfm) {
-        unixctl_command_reply(conn, 501, "no such CFM object");
-        return;
-    }
-
-    ds_put_format(&ds, "MPID %"PRIu64":%s%s\n", cfm->mpid,
+    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",
+    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",
+    ds_put_format(ds, "\tnext fault check: %lldms\n",
                   timer_msecs_until_expired(&cfm->fault_timer));
 
-    ds_put_cstr(&ds, "\n");
+    ds_put_cstr(ds, "\n");
     HMAP_FOR_EACH (rmp, node, &cfm->remote_mps) {
-        ds_put_format(&ds, "Remote MPID %"PRIu64":%s\n",
+        ds_put_format(ds, "Remote MPID %"PRIu64":%s\n",
                       rmp->mpid,
                       rmp->rdi ? " rdi" : "");
-        ds_put_format(&ds, "\trecv since check: %s",
+        ds_put_format(ds, "\trecv since check: %s",
                       rmp->recv ? "true" : "false");
     }
+}
+
+static void
+cfm_unixctl_show(struct unixctl_conn *conn,
+                 const char *args, void *aux OVS_UNUSED)
+{
+    struct ds ds = DS_EMPTY_INITIALIZER;
+    const struct cfm *cfm;
+
+    if (strlen(args)) {
+        cfm = cfm_find(args);
+        if (!cfm) {
+            unixctl_command_reply(conn, 501, "no such CFM object");
+            return;
+        }
+        cfm_print_details(&ds, cfm);
+    } else {
+        HMAP_FOR_EACH (cfm, hmap_node, &all_cfms) {
+            cfm_print_details(&ds, cfm);
+        }
+    }
 
     unixctl_command_reply(conn, 200, ds_cstr(&ds));
     ds_destroy(&ds);
index 516e6da774da485fb8daeeea54df46c53cefd285..f9023d6b98d25435f2ea9f26076a335538304f49 100644 (file)
@@ -111,9 +111,11 @@ Causes \fBovs\-vswitchd\fR to gracefully terminate.
 .IP "\fBqos/show\fR \fIinterface\fR"
 Queries the kernel for Quality of Service configuration and statistics
 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
-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"
 These commands manage bridges.
 .IP "\fBfdb/show\fR \fIbridge\fR"