[ovs-dev] [compgen v2 4/5] command-line: Add function to print command usage.

Alex Wang alexw at nicira.com
Mon Oct 20 05:50:22 UTC 2014


This commit adds a new variable in 'struct command' for
recording the command usage.  Also, a new function is
added to print the usage given the array of defined
commands.

Later patche will use the output in bash command-line
completion script.

Signed-off-by: Alex Wang <alexw at nicira.com>
---
PATCH -> V2:
- new patch in V2.
---
 lib/command-line.c        |   15 ++++
 lib/command-line.h        |    2 +
 ovsdb/ovsdb-tool.c        |   33 +++++----
 tests/ovstest.c           |    5 +-
 tests/test-bitmap.c       |    6 +-
 tests/test-classifier.c   |   24 +++----
 tests/test-cmap.c         |    6 +-
 tests/test-heap.c         |   15 ++--
 tests/test-jsonrpc.c      |   10 +--
 tests/test-ovsdb.c        |   70 +++++++++---------
 tests/test-reconnect.c    |   32 ++++-----
 tests/test-util.c         |   32 ++++-----
 tests/test-vconn.c        |   18 ++---
 utilities/ovs-benchmark.c |   10 +--
 utilities/ovs-ofctl.c     |  176 +++++++++++++++++++++++++++++----------------
 15 files changed, 265 insertions(+), 189 deletions(-)

diff --git a/lib/command-line.c b/lib/command-line.c
index 1f26c5c..eb0a83b 100644
--- a/lib/command-line.c
+++ b/lib/command-line.c
@@ -52,6 +52,21 @@ long_options_to_short_options(const struct option options[])
     return xstrdup(short_options);
 }
 
+/* Given the 'struct command' array, prints the usage of all commands. */
+void
+print_commands(const struct command commands[])
+{
+    struct ds ds = DS_EMPTY_INITIALIZER;
+
+    ds_put_cstr(&ds, "The available commands are:\n");
+    for (; commands->name; commands++) {
+        const struct command *c = commands;
+        ds_put_format(&ds, "  %-23s %s\n", c->name, c->usage ? c->usage : "");
+    }
+    printf("%s", ds.string);
+    ds_destroy(&ds);
+}
+
 /* Given the GNU-style options in 'options', prints all options. */
 void
 print_options(const struct option options[])
diff --git a/lib/command-line.h b/lib/command-line.h
index 157cb58..0c9e2d9 100644
--- a/lib/command-line.h
+++ b/lib/command-line.h
@@ -25,6 +25,7 @@ struct option;
 
 struct command {
     const char *name;
+    const char *usage;
     int min_args;
     int max_args;
     void (*handler)(int argc, char *argv[]);
@@ -32,6 +33,7 @@ struct command {
 
 char *long_options_to_short_options(const struct option *options);
 void print_options(const struct option *options);
+void print_commands(const struct command *commands);
 void run_command(int argc, char *argv[], const struct command[]);
 
 void proctitle_init(int argc, char **argv);
diff --git a/ovsdb/ovsdb-tool.c b/ovsdb/ovsdb-tool.c
index 27bd1e6..509668c 100644
--- a/ovsdb/ovsdb-tool.c
+++ b/ovsdb/ovsdb-tool.c
@@ -563,20 +563,27 @@ do_help(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
     usage();
 }
 
+static void
+do_list_commands(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
+{
+     print_commands(get_all_commands());
+}
+
 static const struct command all_commands[] = {
-    { "create", 0, 2, do_create },
-    { "compact", 0, 2, do_compact },
-    { "convert", 0, 3, do_convert },
-    { "needs-conversion", 0, 2, do_needs_conversion },
-    { "db-version", 0, 1, do_db_version },
-    { "db-cksum", 0, 1, do_db_cksum },
-    { "schema-version", 0, 1, do_schema_version },
-    { "schema-cksum", 0, 1, do_schema_cksum },
-    { "query", 1, 2, do_query },
-    { "transact", 1, 2, do_transact },
-    { "show-log", 0, 1, do_show_log },
-    { "help", 0, INT_MAX, do_help },
-    { NULL, 0, 0, NULL },
+    { "create", "[db [schema]]", 0, 2, do_create },
+    { "compact", "[db [dst]]", 0, 2, do_compact },
+    { "convert", "[db [schema [dst]]]", 0, 3, do_convert },
+    { "needs-conversion", NULL, 0, 2, do_needs_conversion },
+    { "db-version", "[db]",  0, 1, do_db_version },
+    { "db-cksum", "[db]", 0, 1, do_db_cksum },
+    { "schema-version", "[schema]", 0, 1, do_schema_version },
+    { "schema-cksum", "[schema]", 0, 1, do_schema_cksum },
+    { "query", "[db] trns", 1, 2, do_query },
+    { "transact", "[db] trns", 1, 2, do_transact },
+    { "show-log", "[db]", 0, 1, do_show_log },
+    { "help", NULL, 0, INT_MAX, do_help },
+    { "list-commands", NULL, 0, INT_MAX, do_list_commands },
+    { NULL, NULL, 0, 0, NULL },
 };
 
 static const struct command *get_all_commands(void)
diff --git a/tests/ovstest.c b/tests/ovstest.c
index dbb4555..dc6d18f 100644
--- a/tests/ovstest.c
+++ b/tests/ovstest.c
@@ -32,7 +32,7 @@ static size_t allocated_commands = 0;
 static void
 add_command(struct command *cmd)
 {
-    const struct command nil = {NULL, 0, 0, NULL};
+    const struct command nil = {NULL, NULL, 0, 0, NULL};
 
     while (n_commands + 1 >= allocated_commands) {
         commands = x2nrealloc(commands, &allocated_commands,
@@ -85,7 +85,7 @@ help(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
 static void
 add_top_level_commands(void)
 {
-    struct command help_cmd = {"--help", 0, 0, help};
+    struct command help_cmd = {"--help", NULL, 0, 0, help};
 
     add_command(&help_cmd);
 }
@@ -96,6 +96,7 @@ ovstest_register(const char *test_name, ovstest_func f)
     struct command test_cmd;
 
     test_cmd.name = test_name;
+    test_cmd.usage = NULL;
     test_cmd.min_args = 0;
     test_cmd.max_args = INT_MAX;
     test_cmd.handler = f;
diff --git a/tests/test-bitmap.c b/tests/test-bitmap.c
index 9e874b5..5008f51 100644
--- a/tests/test-bitmap.c
+++ b/tests/test-bitmap.c
@@ -150,9 +150,9 @@ run_benchmarks(int argc OVS_UNUSED, char *argv[])
 }
 
 static const struct command commands[] = {
-    {"check", 0, 0, run_tests},
-    {"benchmark", 1, 1, run_benchmarks},
-    {NULL, 0, 0, NULL},
+    {"check", NULL, 0, 0, run_tests},
+    {"benchmark", NULL, 1, 1, run_benchmarks},
+    {NULL, NULL, 0, 0, NULL},
 };
 
 static void
diff --git a/tests/test-classifier.c b/tests/test-classifier.c
index 0dfa910..eb4f099 100644
--- a/tests/test-classifier.c
+++ b/tests/test-classifier.c
@@ -1403,21 +1403,21 @@ test_minimask_combine(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
 
 static const struct command commands[] = {
     /* Classifier tests. */
-    {"empty", 0, 0, test_empty},
-    {"destroy-null", 0, 0, test_destroy_null},
-    {"single-rule", 0, 0, test_single_rule},
-    {"rule-replacement", 0, 0, test_rule_replacement},
-    {"many-rules-in-one-list", 0, 0, test_many_rules_in_one_list},
-    {"many-rules-in-one-table", 0, 0, test_many_rules_in_one_table},
-    {"many-rules-in-two-tables", 0, 0, test_many_rules_in_two_tables},
-    {"many-rules-in-five-tables", 0, 0, test_many_rules_in_five_tables},
+    {"empty", NULL, 0, 0, test_empty},
+    {"destroy-null", NULL, 0, 0, test_destroy_null},
+    {"single-rule", NULL, 0, 0, test_single_rule},
+    {"rule-replacement", NULL, 0, 0, test_rule_replacement},
+    {"many-rules-in-one-list", NULL, 0, 0, test_many_rules_in_one_list},
+    {"many-rules-in-one-table", NULL, 0, 0, test_many_rules_in_one_table},
+    {"many-rules-in-two-tables", NULL, 0, 0, test_many_rules_in_two_tables},
+    {"many-rules-in-five-tables", NULL, 0, 0, test_many_rules_in_five_tables},
 
     /* Miniflow and minimask tests. */
-    {"miniflow", 0, 0, test_miniflow},
-    {"minimask_has_extra", 0, 0, test_minimask_has_extra},
-    {"minimask_combine", 0, 0, test_minimask_combine},
+    {"miniflow", NULL, 0, 0, test_miniflow},
+    {"minimask_has_extra", NULL, 0, 0, test_minimask_has_extra},
+    {"minimask_combine", NULL, 0, 0, test_minimask_combine},
 
-    {NULL, 0, 0, NULL},
+    {NULL, NULL, 0, 0, NULL},
 };
 
 static void
diff --git a/tests/test-cmap.c b/tests/test-cmap.c
index 2976d5f..8825e6f 100644
--- a/tests/test-cmap.c
+++ b/tests/test-cmap.c
@@ -638,9 +638,9 @@ benchmark_hmap(void)
 }
 
 static const struct command commands[] = {
-    {"check", 0, 1, run_tests},
-    {"benchmark", 3, 4, run_benchmarks},
-    {NULL, 0, 0, NULL},
+    {"check", NULL, 0, 1, run_tests},
+    {"benchmark", NULL, 3, 4, run_benchmarks},
+    {NULL, NULL, 0, 0, NULL},
 };
 
 static void
diff --git a/tests/test-heap.c b/tests/test-heap.c
index 3a0afa5..fcb33cc 100644
--- a/tests/test-heap.c
+++ b/tests/test-heap.c
@@ -465,16 +465,17 @@ test_heap_raw_delete(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
 }
 
 static const struct command commands[] = {
-    { "insert-delete-same-order", 0, 0, test_heap_insert_delete_same_order, },
-    { "insert-delete-reverse-order", 0, 0,
+    { "insert-delete-same-order", NULL, 0, 0,
+      test_heap_insert_delete_same_order, },
+    { "insert-delete-reverse-order", NULL, 0, 0,
       test_heap_insert_delete_reverse_order, },
-    { "insert-delete-every-order", 0, 0,
+    { "insert-delete-every-order", NULL, 0, 0,
       test_heap_insert_delete_every_order, },
-    { "insert-delete-same-order-with-dups", 0, 0,
+    { "insert-delete-same-order-with-dups", NULL, 0, 0,
       test_heap_insert_delete_same_order_with_dups, },
-    { "raw-insert", 0, 0, test_heap_raw_insert, },
-    { "raw-delete", 0, 0, test_heap_raw_delete, },
-    { NULL, 0, 0, NULL, },
+    { "raw-insert", NULL, 0, 0, test_heap_raw_insert, },
+    { "raw-delete", NULL, 0, 0, test_heap_raw_delete, },
+    { NULL, NULL, 0, 0, NULL, },
 };
 
 static void
diff --git a/tests/test-jsonrpc.c b/tests/test-jsonrpc.c
index cf90c44..1fd753f 100644
--- a/tests/test-jsonrpc.c
+++ b/tests/test-jsonrpc.c
@@ -330,11 +330,11 @@ do_help(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
 }
 
 static struct command all_commands[] = {
-    { "listen", 1, 1, do_listen },
-    { "request", 3, 3, do_request },
-    { "notify", 3, 3, do_notify },
-    { "help", 0, INT_MAX, do_help },
-    { NULL, 0, 0, NULL },
+    { "listen", NULL, 1, 1, do_listen },
+    { "request", NULL, 3, 3, do_request },
+    { "notify", NULL, 3, 3, do_notify },
+    { "help", NULL, 0, INT_MAX, do_help },
+    { NULL, NULL, 0, 0, NULL },
 };
 
 static struct command *
diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c
index 4d73a0d..b95f1db 100644
--- a/tests/test-ovsdb.c
+++ b/tests/test-ovsdb.c
@@ -1508,13 +1508,13 @@ static void
 do_transact(int argc, char *argv[])
 {
     static const struct command do_transact_commands[] = {
-        { "commit", 0, 0, do_transact_commit },
-        { "abort", 0, 0, do_transact_abort },
-        { "insert", 2, 3, do_transact_insert },
-        { "delete", 1, 1, do_transact_delete },
-        { "modify", 2, 3, do_transact_modify },
-        { "print", 0, 0, do_transact_print },
-        { NULL, 0, 0, NULL },
+        { "commit", NULL, 0, 0, do_transact_commit },
+        { "abort", NULL, 0, 0, do_transact_abort },
+        { "insert", NULL, 2, 3, do_transact_insert },
+        { "delete", NULL, 1, 1, do_transact_delete },
+        { "modify", NULL, 2, 3, do_transact_modify },
+        { "print", NULL, 0, 0, do_transact_print },
+        { NULL, NULL, 0, 0, NULL },
     };
 
     struct ovsdb_schema *schema;
@@ -1963,34 +1963,34 @@ do_idl(int argc, char *argv[])
 }
 
 static struct command all_commands[] = {
-    { "log-io", 2, INT_MAX, do_log_io },
-    { "default-atoms", 0, 0, do_default_atoms },
-    { "default-data", 0, 0, do_default_data },
-    { "parse-atomic-type", 1, 1, do_parse_atomic_type },
-    { "parse-base-type", 1, 1, do_parse_base_type },
-    { "parse-type", 1, 1, do_parse_type },
-    { "parse-atoms", 2, INT_MAX, do_parse_atoms },
-    { "parse-atom-strings", 2, INT_MAX, do_parse_atom_strings },
-    { "parse-data", 2, INT_MAX, do_parse_data },
-    { "parse-data-strings", 2, INT_MAX, do_parse_data_strings },
-    { "sort-atoms", 2, 2, do_sort_atoms },
-    { "parse-column", 2, 2, do_parse_column },
-    { "parse-table", 2, 3, do_parse_table },
-    { "parse-rows", 2, INT_MAX, do_parse_rows },
-    { "compare-rows", 2, INT_MAX, do_compare_rows },
-    { "parse-conditions", 2, INT_MAX, do_parse_conditions },
-    { "evaluate-conditions", 3, 3, do_evaluate_conditions },
-    { "parse-mutations", 2, INT_MAX, do_parse_mutations },
-    { "execute-mutations", 3, 3, do_execute_mutations },
-    { "query", 3, 3, do_query },
-    { "query-distinct", 4, 4, do_query_distinct },
-    { "transact", 1, INT_MAX, do_transact },
-    { "parse-schema", 1, 1, do_parse_schema },
-    { "execute", 2, INT_MAX, do_execute },
-    { "trigger", 2, INT_MAX, do_trigger },
-    { "idl", 1, INT_MAX, do_idl },
-    { "help", 0, INT_MAX, do_help },
-    { NULL, 0, 0, NULL },
+    { "log-io", NULL, 2, INT_MAX, do_log_io },
+    { "default-atoms", NULL, 0, 0, do_default_atoms },
+    { "default-data", NULL, 0, 0, do_default_data },
+    { "parse-atomic-type", NULL, 1, 1, do_parse_atomic_type },
+    { "parse-base-type", NULL, 1, 1, do_parse_base_type },
+    { "parse-type", NULL, 1, 1, do_parse_type },
+    { "parse-atoms", NULL, 2, INT_MAX, do_parse_atoms },
+    { "parse-atom-strings", NULL, 2, INT_MAX, do_parse_atom_strings },
+    { "parse-data", NULL, 2, INT_MAX, do_parse_data },
+    { "parse-data-strings", NULL, 2, INT_MAX, do_parse_data_strings },
+    { "sort-atoms", NULL, 2, 2, do_sort_atoms },
+    { "parse-column", NULL, 2, 2, do_parse_column },
+    { "parse-table", NULL, 2, 3, do_parse_table },
+    { "parse-rows", NULL, 2, INT_MAX, do_parse_rows },
+    { "compare-rows", NULL, 2, INT_MAX, do_compare_rows },
+    { "parse-conditions", NULL, 2, INT_MAX, do_parse_conditions },
+    { "evaluate-conditions", NULL, 3, 3, do_evaluate_conditions },
+    { "parse-mutations", NULL, 2, INT_MAX, do_parse_mutations },
+    { "execute-mutations", NULL, 3, 3, do_execute_mutations },
+    { "query", NULL, 3, 3, do_query },
+    { "query-distinct", NULL, 4, 4, do_query_distinct },
+    { "transact", NULL, 1, INT_MAX, do_transact },
+    { "parse-schema", NULL, 1, 1, do_parse_schema },
+    { "execute", NULL, 2, INT_MAX, do_execute },
+    { "trigger", NULL, 2, INT_MAX, do_trigger },
+    { "idl", NULL, 1, INT_MAX, do_idl },
+    { "help", NULL, 0, INT_MAX, do_help },
+    { NULL, NULL, 0, 0, NULL },
 };
 
 static struct command *
diff --git a/tests/test-reconnect.c b/tests/test-reconnect.c
index 35d5f41..a3e97b0 100644
--- a/tests/test-reconnect.c
+++ b/tests/test-reconnect.c
@@ -271,22 +271,22 @@ do_listen_error(int argc OVS_UNUSED, char *argv[])
 }
 
 static const struct command all_commands[] = {
-    { "enable", 0, 0, do_enable },
-    { "disable", 0, 0, do_disable },
-    { "force-reconnect", 0, 0, do_force_reconnect },
-    { "disconnected", 0, 1, do_disconnected },
-    { "connecting", 0, 0, do_connecting },
-    { "connect-failed", 0, 1, do_connect_failed },
-    { "connected", 0, 0, do_connected },
-    { "activity", 0, 0, do_activity },
-    { "run", 0, 1, do_run },
-    { "advance", 1, 1, do_advance },
-    { "timeout", 0, 0, do_timeout },
-    { "set-max-tries", 1, 1, do_set_max_tries },
-    { "passive", 0, 0, do_set_passive },
-    { "listening", 0, 0, do_listening },
-    { "listen-error", 1, 1, do_listen_error },
-    { NULL, 0, 0, NULL },
+    { "enable", NULL, 0, 0, do_enable },
+    { "disable", NULL, 0, 0, do_disable },
+    { "force-reconnect", NULL, 0, 0, do_force_reconnect },
+    { "disconnected", NULL, 0, 1, do_disconnected },
+    { "connecting", NULL, 0, 0, do_connecting },
+    { "connect-failed", NULL, 0, 1, do_connect_failed },
+    { "connected", NULL, 0, 0, do_connected },
+    { "activity", NULL, 0, 0, do_activity },
+    { "run", NULL, 0, 1, do_run },
+    { "advance", NULL, 1, 1, do_advance },
+    { "timeout", NULL, 0, 0, do_timeout },
+    { "set-max-tries", NULL, 1, 1, do_set_max_tries },
+    { "passive", NULL, 0, 0, do_set_passive },
+    { "listening", NULL, 0, 0, do_listening },
+    { "listen-error", NULL, 1, 1, do_listen_error },
+    { NULL, NULL, 0, 0, NULL },
 };
 
 static const struct command *
diff --git a/tests/test-util.c b/tests/test-util.c
index a8060b0..fd01fcb 100644
--- a/tests/test-util.c
+++ b/tests/test-util.c
@@ -1053,24 +1053,24 @@ test_file_name(int argc, char *argv[])
 #endif /* _WIN32 */
 
 static const struct command commands[] = {
-    {"ctz", 0, 0, test_ctz},
-    {"clz", 0, 0, test_clz},
-    {"round_up_pow2", 0, 0, test_round_up_pow2},
-    {"round_down_pow2", 0, 0, test_round_down_pow2},
-    {"count_1bits", 0, 0, test_count_1bits},
-    {"log_2_floor", 0, 0, test_log_2_floor},
-    {"bitwise_copy", 0, 0, test_bitwise_copy},
-    {"bitwise_zero", 0, 0, test_bitwise_zero},
-    {"bitwise_one", 0, 0, test_bitwise_one},
-    {"bitwise_is_all_zeros", 0, 0, test_bitwise_is_all_zeros},
-    {"follow-symlinks", 1, INT_MAX, test_follow_symlinks},
-    {"assert", 0, 0, test_assert},
-    {"ovs_scan", 0, 0, test_ovs_scan},
-    {"snprintf", 0, 0, test_snprintf},
+    {"ctz", NULL, 0, 0, test_ctz},
+    {"clz", NULL, 0, 0, test_clz},
+    {"round_up_pow2", NULL, 0, 0, test_round_up_pow2},
+    {"round_down_pow2", NULL, 0, 0, test_round_down_pow2},
+    {"count_1bits", NULL, 0, 0, test_count_1bits},
+    {"log_2_floor", NULL, 0, 0, test_log_2_floor},
+    {"bitwise_copy", NULL, 0, 0, test_bitwise_copy},
+    {"bitwise_zero", NULL, 0, 0, test_bitwise_zero},
+    {"bitwise_one", NULL, 0, 0, test_bitwise_one},
+    {"bitwise_is_all_zeros", NULL, 0, 0, test_bitwise_is_all_zeros},
+    {"follow-symlinks", NULL, 1, INT_MAX, test_follow_symlinks},
+    {"assert", NULL, 0, 0, test_assert},
+    {"ovs_scan", NULL, 0, 0, test_ovs_scan},
+    {"snprintf", NULL, 0, 0, test_snprintf},
 #ifndef _WIN32
-    {"file_name", 1, INT_MAX, test_file_name},
+    {"file_name", NULL, 1, INT_MAX, test_file_name},
 #endif
-    {NULL, 0, 0, NULL},
+    {NULL, NULL, 0, 0, NULL},
 };
 
 static void
diff --git a/tests/test-vconn.c b/tests/test-vconn.c
index 266ad4e..bcaa3da 100644
--- a/tests/test-vconn.c
+++ b/tests/test-vconn.c
@@ -433,15 +433,15 @@ test_send_invalid_version_hello(int argc OVS_UNUSED, char *argv[])
 }
 
 static const struct command commands[] = {
-    {"refuse-connection", 1, 1, test_refuse_connection},
-    {"accept-then-close", 1, 1, test_accept_then_close},
-    {"read-hello", 1, 1, test_read_hello},
-    {"send-plain-hello", 1, 1, test_send_plain_hello},
-    {"send-long-hello", 1, 1, test_send_long_hello},
-    {"send-echo-hello", 1, 1, test_send_echo_hello},
-    {"send-short-hello", 1, 1, test_send_short_hello},
-    {"send-invalid-version-hello", 1, 1, test_send_invalid_version_hello},
-    {NULL, 0, 0, NULL},
+    {"refuse-connection", NULL, 1, 1, test_refuse_connection},
+    {"accept-then-close", NULL, 1, 1, test_accept_then_close},
+    {"read-hello", NULL, 1, 1, test_read_hello},
+    {"send-plain-hello", NULL, 1, 1, test_send_plain_hello},
+    {"send-long-hello", NULL, 1, 1, test_send_long_hello},
+    {"send-echo-hello", NULL, 1, 1, test_send_echo_hello},
+    {"send-short-hello", NULL, 1, 1, test_send_short_hello},
+    {"send-invalid-version-hello", NULL, 1, 1, test_send_invalid_version_hello},
+    {NULL, NULL, 0, 0, NULL},
 };
 
 static void
diff --git a/utilities/ovs-benchmark.c b/utilities/ovs-benchmark.c
index 386e654..010d686 100644
--- a/utilities/ovs-benchmark.c
+++ b/utilities/ovs-benchmark.c
@@ -617,11 +617,11 @@ cmd_help(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
 }
 
 static const struct command all_commands[] = {
-    { "listen", 0, 0, cmd_listen },
-    { "rate", 0, 0, cmd_rate },
-    { "latency", 0, 0, cmd_latency },
-    { "help", 0, 0, cmd_help },
-    { NULL, 0, 0, NULL },
+    { "listen", NULL, 0, 0, cmd_listen },
+    { "rate", NULL, 0, 0, cmd_rate },
+    { "latency", NULL, 0, 0, cmd_latency },
+    { "help", NULL, 0, 0, cmd_help },
+    { NULL, NULL, 0, 0, NULL },
 };
 
 static const struct command *get_all_commands(void)
diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
index 77f5a29..b6b775f 100644
--- a/utilities/ovs-ofctl.c
+++ b/utilities/ovs-ofctl.c
@@ -2239,6 +2239,12 @@ ofctl_help(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
 {
     usage();
 }
+
+static void
+ofctl_list_commands(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
+{
+    print_commands(get_all_commands());
+}
 
 /* replace-flows and diff-flows commands. */
 
@@ -3443,71 +3449,115 @@ ofctl_encode_hello(int argc OVS_UNUSED, char *argv[])
 }
 
 static const struct command all_commands[] = {
-    { "show", 1, 1, ofctl_show },
-    { "monitor", 1, 3, ofctl_monitor },
-    { "snoop", 1, 1, ofctl_snoop },
-    { "dump-desc", 1, 1, ofctl_dump_desc },
-    { "dump-tables", 1, 1, ofctl_dump_tables },
-    { "dump-table-features", 1, 1, ofctl_dump_table_features },
-    { "dump-flows", 1, 2, ofctl_dump_flows },
-    { "dump-aggregate", 1, 2, ofctl_dump_aggregate },
-    { "queue-stats", 1, 3, ofctl_queue_stats },
-    { "queue-get-config", 2, 2, ofctl_queue_get_config },
-    { "add-flow", 2, 2, ofctl_add_flow },
-    { "add-flows", 2, 2, ofctl_add_flows },
-    { "mod-flows", 2, 2, ofctl_mod_flows },
-    { "del-flows", 1, 2, ofctl_del_flows },
-    { "replace-flows", 2, 2, ofctl_replace_flows },
-    { "diff-flows", 2, 2, ofctl_diff_flows },
-    { "add-meter", 2, 2, ofctl_add_meter },
-    { "mod-meter", 2, 2, ofctl_mod_meter },
-    { "del-meter", 2, 2, ofctl_del_meters },
-    { "del-meters", 1, 1, ofctl_del_meters },
-    { "dump-meter", 2, 2, ofctl_dump_meters },
-    { "dump-meters", 1, 1, ofctl_dump_meters },
-    { "meter-stats", 1, 2, ofctl_meter_stats },
-    { "meter-features", 1, 1, ofctl_meter_features },
-    { "packet-out", 4, INT_MAX, ofctl_packet_out },
-    { "dump-ports", 1, 2, ofctl_dump_ports },
-    { "dump-ports-desc", 1, 2, ofctl_dump_ports_desc },
-    { "mod-port", 3, 3, ofctl_mod_port },
-    { "mod-table", 3, 3, ofctl_mod_table },
-    { "get-frags", 1, 1, ofctl_get_frags },
-    { "set-frags", 2, 2, ofctl_set_frags },
-    { "probe", 1, 1, ofctl_probe },
-    { "ping", 1, 2, ofctl_ping },
-    { "benchmark", 3, 3, ofctl_benchmark },
-
-    { "ofp-parse", 1, 1, ofctl_ofp_parse },
-    { "ofp-parse-pcap", 1, INT_MAX, ofctl_ofp_parse_pcap },
-
-    { "add-group", 1, 2, ofctl_add_group },
-    { "add-groups", 1, 2, ofctl_add_groups },
-    { "mod-group", 1, 2, ofctl_mod_group },
-    { "del-groups", 1, 2, ofctl_del_groups },
-    { "dump-groups", 1, 2, ofctl_dump_group_desc },
-    { "dump-group-stats", 1, 2, ofctl_dump_group_stats },
-    { "dump-group-features", 1, 1, ofctl_dump_group_features },
-    { "help", 0, INT_MAX, ofctl_help },
+    { "show", "switch",
+      1, 1, ofctl_show },
+    { "monitor", "switch [misslen] [invalid_ttl] [watch:[...]]",
+      1, 3, ofctl_monitor },
+    { "snoop", "switch",
+      1, 1, ofctl_snoop },
+    { "dump-desc", "switch",
+      1, 1, ofctl_dump_desc },
+    { "dump-tables", "switch",
+      1, 1, ofctl_dump_tables },
+    { "dump-table-features", "switch",
+      1, 1, ofctl_dump_table_features },
+    { "dump-flows", "switch",
+      1, 2, ofctl_dump_flows },
+    { "dump-aggregate", "switch",
+      1, 2, ofctl_dump_aggregate },
+    { "queue-stats", "switch [port [queue]]",
+      1, 3, ofctl_queue_stats },
+    { "queue-get-config", "switch port",
+      2, 2, ofctl_queue_get_config },
+    { "add-flow", "switch flow",
+      2, 2, ofctl_add_flow },
+    { "add-flows", "switch file",
+      2, 2, ofctl_add_flows },
+    { "mod-flows", "switch flow",
+      2, 2, ofctl_mod_flows },
+    { "del-flows", "switch [flow]",
+      1, 2, ofctl_del_flows },
+    { "replace-flows", "switch file",
+      2, 2, ofctl_replace_flows },
+    { "diff-flows", "source1 source2",
+      2, 2, ofctl_diff_flows },
+    { "add-meter", "switch meter",
+      2, 2, ofctl_add_meter },
+    { "mod-meter", "switch meter",
+      2, 2, ofctl_mod_meter },
+    { "del-meter", "switch meter",
+      2, 2, ofctl_del_meters },
+    { "del-meters", "switch",
+      1, 1, ofctl_del_meters },
+    { "dump-meter", "switch meter",
+      2, 2, ofctl_dump_meters },
+    { "dump-meters", "switch",
+      1, 1, ofctl_dump_meters },
+    { "meter-stats", "switch [meter]",
+      1, 2, ofctl_meter_stats },
+    { "meter-features", "switch",
+      1, 1, ofctl_meter_features },
+    { "packet-out", "switch in_port actions packet...",
+      4, INT_MAX, ofctl_packet_out },
+    { "dump-ports", "switch [port]",
+      1, 2, ofctl_dump_ports },
+    { "dump-ports-desc", "switch [port]",
+      1, 2, ofctl_dump_ports_desc },
+    { "mod-port", "switch iface act",
+      3, 3, ofctl_mod_port },
+    { "mod-table", "switch mod",
+      3, 3, ofctl_mod_table },
+    { "get-frags", "switch",
+      1, 1, ofctl_get_frags },
+    { "set-frags", "switch frag_mode",
+      2, 2, ofctl_set_frags },
+    { "probe", "target",
+      1, 1, ofctl_probe },
+    { "ping", "target [n]",
+      1, 2, ofctl_ping },
+    { "benchmark", "target n count",
+      3, 3, ofctl_benchmark },
+
+    { "ofp-parse", "file",
+      1, 1, ofctl_ofp_parse },
+    { "ofp-parse-pcap", "pcap",
+      1, INT_MAX, ofctl_ofp_parse_pcap },
+
+    { "add-group", "switch group",
+      1, 2, ofctl_add_group },
+    { "add-groups", "switch file",
+      1, 2, ofctl_add_groups },
+    { "mod-group", "switch group",
+      1, 2, ofctl_mod_group },
+    { "del-groups", "switch [group]",
+      1, 2, ofctl_del_groups },
+    { "dump-groups", "switch [group]",
+      1, 2, ofctl_dump_group_desc },
+    { "dump-group-stats", "switch [group]",
+      1, 2, ofctl_dump_group_stats },
+    { "dump-group-features", "switch",
+      1, 1, ofctl_dump_group_features },
+    { "help", NULL, 0, INT_MAX, ofctl_help },
+    { "list-commands", NULL, 0, INT_MAX, ofctl_list_commands },
 
     /* Undocumented commands for testing. */
-    { "parse-flow", 1, 1, ofctl_parse_flow },
-    { "parse-flows", 1, 1, ofctl_parse_flows },
-    { "parse-nx-match", 0, 0, ofctl_parse_nxm },
-    { "parse-nxm", 0, 0, ofctl_parse_nxm },
-    { "parse-oxm", 1, 1, ofctl_parse_oxm },
-    { "parse-actions", 1, 1, ofctl_parse_actions },
-    { "parse-instructions", 1, 1, ofctl_parse_instructions },
-    { "parse-ofp10-match", 0, 0, ofctl_parse_ofp10_match },
-    { "parse-ofp11-match", 0, 0, ofctl_parse_ofp11_match },
-    { "parse-pcap", 1, 1, ofctl_parse_pcap },
-    { "check-vlan", 2, 2, ofctl_check_vlan },
-    { "print-error", 1, 1, ofctl_print_error },
-    { "encode-error-reply", 2, 2, ofctl_encode_error_reply },
-    { "ofp-print", 1, 2, ofctl_ofp_print },
-    { "encode-hello", 1, 1, ofctl_encode_hello },
-
-    { NULL, 0, 0, NULL },
+    { "parse-flow", NULL, 1, 1, ofctl_parse_flow },
+    { "parse-flows", NULL, 1, 1, ofctl_parse_flows },
+    { "parse-nx-match", NULL, 0, 0, ofctl_parse_nxm },
+    { "parse-nxm", NULL, 0, 0, ofctl_parse_nxm },
+    { "parse-oxm", NULL, 1, 1, ofctl_parse_oxm },
+    { "parse-actions", NULL, 1, 1, ofctl_parse_actions },
+    { "parse-instructions", NULL, 1, 1, ofctl_parse_instructions },
+    { "parse-ofp10-match", NULL, 0, 0, ofctl_parse_ofp10_match },
+    { "parse-ofp11-match", NULL, 0, 0, ofctl_parse_ofp11_match },
+    { "parse-pcap", NULL, 1, 1, ofctl_parse_pcap },
+    { "check-vlan", NULL, 2, 2, ofctl_check_vlan },
+    { "print-error", NULL, 1, 1, ofctl_print_error },
+    { "encode-error-reply", NULL, 2, 2, ofctl_encode_error_reply },
+    { "ofp-print", NULL, 1, 2, ofctl_ofp_print },
+    { "encode-hello", NULL, 1, 1, ofctl_encode_hello },
+
+    { NULL, NULL, 0, 0, NULL },
 };
 
 static const struct command *get_all_commands(void)
-- 
1.7.9.5




More information about the dev mailing list