Most of the commands were already converted to the new command infrastructure. To use the new state and pre-initialization steps, the debugfs tables also have to be converted.
Signed-off-by: Sven Eckelmann sven@narfation.org --- debug.c | 228 +++++++++++++++++++++++++++++----------------------- debug.h | 35 +++----- functions.c | 10 +-- main.c | 19 +---- main.h | 2 +- 5 files changed, 150 insertions(+), 144 deletions(-)
diff --git a/debug.c b/debug.c index 9bc4d0c..016b148 100644 --- a/debug.c +++ b/debug.c @@ -32,101 +32,34 @@ #include "netlink.h" #include "sys.h"
-const struct debug_table_data batctl_debug_tables[BATCTL_TABLE_NUM] = { - { - .opt_long = "neighbors", - .opt_short = "n", - .debugfs_name = "neighbors", - .header_lines = 2, - .netlink_fn = netlink_print_neighbors, - }, - { - .opt_long = "originators", - .opt_short = "o", - .debugfs_name = "originators", - .header_lines = 2, - .netlink_fn = netlink_print_originators, - }, - { - .opt_long = "gateways", - .opt_short = "gwl", - .debugfs_name = "gateways", - .header_lines = 1, - .netlink_fn = netlink_print_gateways, - }, - { - .opt_long = "translocal", - .opt_short = "tl", - .debugfs_name = "transtable_local", - .header_lines = 2, - .netlink_fn = netlink_print_translocal, - }, - { - .opt_long = "transglobal", - .opt_short = "tg", - .debugfs_name = "transtable_global", - .header_lines = 2, - .netlink_fn = netlink_print_transglobal, - }, - { - .opt_long = "claimtable", - .opt_short = "cl", - .debugfs_name = "bla_claim_table", - .header_lines = 2, - .netlink_fn = netlink_print_bla_claim, - }, - { - .opt_long = "backbonetable", - .opt_short = "bbt", - .debugfs_name = "bla_backbone_table", - .header_lines = 2, - .netlink_fn = netlink_print_bla_backbone, - }, - { - .opt_long = "dat_cache", - .opt_short = "dc", - .debugfs_name = "dat_cache", - .header_lines = 2, - .netlink_fn = netlink_print_dat_cache, - }, - { - .opt_long = "nc_nodes", - .opt_short = "nn", - .debugfs_name = "nc_nodes", - .header_lines = 0, - }, - { - .opt_long = "mcast_flags", - .opt_short = "mf", - .debugfs_name = "mcast_flags", - .header_lines = 6, - .netlink_fn = netlink_print_mcast_flags, - }, -}; - -static void debug_table_usage(int debug_table) +static void debug_table_usage(struct state *state) { + struct debug_table_data *debug_table = state->cmd->arg; + fprintf(stderr, "Usage: batctl [options] %s|%s [parameters]\n", - batctl_debug_tables[debug_table].opt_long, batctl_debug_tables[debug_table].opt_short); + state->cmd->name, state->cmd->abbr); fprintf(stderr, "parameters:\n"); fprintf(stderr, " \t -h print this help\n"); fprintf(stderr, " \t -n don't replace mac addresses with bat-host names\n"); fprintf(stderr, " \t -H don't show the header\n"); fprintf(stderr, " \t -w [interval] watch mode - refresh the table continuously\n");
- if (debug_table == BATCTL_TABLE_ORIGINATORS) { + if (debug_table->option_watch_interval) fprintf(stderr, " \t -t timeout interval - don't print originators not seen for x.y seconds \n"); + + if (debug_table->option_orig_iface) fprintf(stderr, " \t -i [interface] - show multiif originator table for a specific interface\n"); - }
- if (debug_table == BATCTL_TABLE_TRANSLOCAL || - debug_table == BATCTL_TABLE_TRANSGLOBAL) { - fprintf(stderr, " \t -u|-m print unicast or multicast mac addresses only\n"); - } + if (debug_table->option_unicast_only) + fprintf(stderr, " \t -u print unicast mac addresses only\n"); + + if (debug_table->option_multicast_only) + fprintf(stderr, " \t -m print multicast mac addresses only\n"); }
-int handle_debug_table(char *mesh_iface, int debug_table, int argc, char **argv) +int handle_debug_table(struct state *state, int argc, char **argv) { + struct debug_table_data *debug_table = state->cmd->arg; int optchar, read_opt = USE_BAT_HOSTS; char full_path[MAX_PATH+1]; char *debugfs_mnt; @@ -138,7 +71,7 @@ int handle_debug_table(char *mesh_iface, int debug_table, int argc, char **argv) while ((optchar = getopt(argc, argv, "hnw:t:Humi:")) != -1) { switch (optchar) { case 'h': - debug_table_usage(debug_table); + debug_table_usage(state); return EXIT_SUCCESS; case 'n': read_opt &= ~USE_BAT_HOSTS; @@ -156,9 +89,9 @@ int handle_debug_table(char *mesh_iface, int debug_table, int argc, char **argv) } break; case 't': - if (debug_table != BATCTL_TABLE_ORIGINATORS) { + if (debug_table->option_watch_interval) { fprintf(stderr, "Error - unrecognised option '-%c'\n", optchar); - debug_table_usage(debug_table); + debug_table_usage(state); return EXIT_FAILURE; }
@@ -172,33 +105,31 @@ int handle_debug_table(char *mesh_iface, int debug_table, int argc, char **argv) read_opt |= SKIP_HEADER; break; case 'u': - if (debug_table != BATCTL_TABLE_TRANSLOCAL && - debug_table != BATCTL_TABLE_TRANSGLOBAL) { + if (debug_table->option_unicast_only) { fprintf(stderr, "Error - unrecognised option '-%c'\n", optchar); - debug_table_usage(debug_table); + debug_table_usage(state); return EXIT_FAILURE; }
read_opt |= UNICAST_ONLY; break; case 'm': - if (debug_table != BATCTL_TABLE_TRANSLOCAL && - debug_table != BATCTL_TABLE_TRANSGLOBAL) { + if (debug_table->option_multicast_only) { fprintf(stderr, "Error - unrecognised option '-%c'\n", optchar); - debug_table_usage(debug_table); + debug_table_usage(state); return EXIT_FAILURE; }
read_opt |= MULTICAST_ONLY; break; case 'i': - if (debug_table != BATCTL_TABLE_ORIGINATORS) { + if (debug_table->option_orig_iface) { fprintf(stderr, "Error - unrecognised option '-%c'\n", optchar); - debug_table_usage(debug_table); + debug_table_usage(state); return EXIT_FAILURE; }
- if (check_mesh_iface_ownership(mesh_iface, optarg) != EXIT_SUCCESS) + if (check_mesh_iface_ownership(state->mesh_iface, optarg) != EXIT_SUCCESS) return EXIT_FAILURE;
orig_iface = optarg; @@ -217,7 +148,7 @@ int handle_debug_table(char *mesh_iface, int debug_table, int argc, char **argv)
return EXIT_FAILURE; default: - debug_table_usage(debug_table); + debug_table_usage(state); return EXIT_FAILURE; } } @@ -226,7 +157,7 @@ int handle_debug_table(char *mesh_iface, int debug_table, int argc, char **argv)
if (read_opt & UNICAST_ONLY && read_opt & MULTICAST_ONLY) { fprintf(stderr, "Error - '-u' and '-m' are exclusive options\n"); - debug_table_usage(debug_table); + debug_table_usage(state); return EXIT_FAILURE; }
@@ -236,9 +167,9 @@ int handle_debug_table(char *mesh_iface, int debug_table, int argc, char **argv) return EXIT_FAILURE; }
- if (batctl_debug_tables[debug_table].netlink_fn) { - err = batctl_debug_tables[debug_table].netlink_fn( - mesh_iface, orig_iface, read_opt, orig_timeout, + if (debug_table->netlink_fn) { + err = debug_table->netlink_fn( + state->mesh_iface, orig_iface, read_opt, orig_timeout, watch_interval); if (err != -EOPNOTSUPP) return err; @@ -247,11 +178,11 @@ int handle_debug_table(char *mesh_iface, int debug_table, int argc, char **argv) if (orig_iface) debugfs_make_path(DEBUG_BATIF_PATH_FMT "/", orig_iface, full_path, sizeof(full_path)); else - debugfs_make_path(DEBUG_BATIF_PATH_FMT "/", mesh_iface, full_path, sizeof(full_path)); + debugfs_make_path(DEBUG_BATIF_PATH_FMT "/", state->mesh_iface, full_path, sizeof(full_path));
- return read_file(full_path, (char *)batctl_debug_tables[debug_table].debugfs_name, + return read_file(full_path, debug_table->debugfs_name, read_opt, orig_timeout, watch_interval, - batctl_debug_tables[debug_table].header_lines); + debug_table->header_lines); }
int debug_print_routing_algos(void) @@ -268,3 +199,98 @@ int debug_print_routing_algos(void) debugfs_make_path(DEBUG_BATIF_PATH_FMT, "", full_path, sizeof(full_path)); return read_file(full_path, DEBUG_ROUTING_ALGOS, 0, 0, 0, 0); } + +static struct debug_table_data batctl_debug_table_neighbors = { + .debugfs_name = "neighbors", + .header_lines = 2, + .netlink_fn = netlink_print_neighbors, +}; + +COMMAND_NAMED(DEBUGTABLE, neighbors, "n", handle_debug_table, + COMMAND_FLAG_MESH_IFACE, &batctl_debug_table_neighbors, ""); + +static struct debug_table_data batctl_debug_table_originators = { + .debugfs_name = "originators", + .header_lines = 2, + .netlink_fn = netlink_print_originators, + .option_watch_interval = 1, + .option_orig_iface = 1, +}; + +COMMAND_NAMED(DEBUGTABLE, originators, "o", handle_debug_table, + COMMAND_FLAG_MESH_IFACE, &batctl_debug_table_originators, ""); + +static struct debug_table_data batctl_debug_table_gateways = { + .debugfs_name = "gateways", + .header_lines = 1, + .netlink_fn = netlink_print_gateways, +}; + +COMMAND_NAMED(DEBUGTABLE, gateways, "gwl", handle_debug_table, + COMMAND_FLAG_MESH_IFACE, &batctl_debug_table_gateways, ""); + +static struct debug_table_data batctl_debug_table_translocal = { + .debugfs_name = "transtable_local", + .header_lines = 2, + .netlink_fn = netlink_print_translocal, + .option_unicast_only = 1, + .option_multicast_only = 1, +}; + +COMMAND_NAMED(DEBUGTABLE, translocal, "tl", handle_debug_table, + COMMAND_FLAG_MESH_IFACE, &batctl_debug_table_translocal, ""); + +static struct debug_table_data batctl_debug_table_transglobal = { + .debugfs_name = "transtable_global", + .header_lines = 2, + .netlink_fn = netlink_print_transglobal, + .option_unicast_only = 1, + .option_multicast_only = 1, +}; + +COMMAND_NAMED(DEBUGTABLE, transglobal, "tg", handle_debug_table, + COMMAND_FLAG_MESH_IFACE, &batctl_debug_table_transglobal, ""); + +static struct debug_table_data batctl_debug_table_claimtable = { + .debugfs_name = DEBUG_CLAIMTABLE, + .header_lines = 2, + .netlink_fn = netlink_print_bla_claim, +}; + +COMMAND_NAMED(DEBUGTABLE, claimtable, "cl", handle_debug_table, + COMMAND_FLAG_MESH_IFACE, &batctl_debug_table_claimtable, ""); + +static struct debug_table_data batctl_debug_table_backbonetable = { + .debugfs_name = DEBUG_BACKBONETABLE, + .header_lines = 2, + .netlink_fn = netlink_print_bla_backbone, +}; + +COMMAND_NAMED(DEBUGTABLE, backbonetable, "bbt", handle_debug_table, + COMMAND_FLAG_MESH_IFACE, &batctl_debug_table_backbonetable, ""); + +static struct debug_table_data batctl_debug_table_dat_cache = { + .debugfs_name = DEBUG_DAT_CACHE, + .header_lines = 2, + .netlink_fn = netlink_print_dat_cache, +}; + +COMMAND_NAMED(DEBUGTABLE, dat_cache, "dc", handle_debug_table, + COMMAND_FLAG_MESH_IFACE, &batctl_debug_table_dat_cache, ""); + +static struct debug_table_data batctl_debug_table_nc_nodes = { + .debugfs_name = DEBUG_NC_NODES, + .header_lines = 0, +}; + +COMMAND_NAMED(DEBUGTABLE, nc_nodes, "nn", handle_debug_table, + COMMAND_FLAG_MESH_IFACE, &batctl_debug_table_nc_nodes, ""); + +static struct debug_table_data batctl_debug_table_mcast_flags = { + .debugfs_name = DEBUG_MCAST_FLAGS, + .header_lines = 6, + .netlink_fn = netlink_print_mcast_flags, +}; + +COMMAND_NAMED(DEBUGTABLE, mcast_flags, "mf", handle_debug_table, + COMMAND_FLAG_MESH_IFACE, &batctl_debug_table_mcast_flags, ""); diff --git a/debug.h b/debug.h index d9a2e3a..79c489a 100644 --- a/debug.h +++ b/debug.h @@ -28,35 +28,26 @@
#define DEBUG_BATIF_PATH_FMT "%s/batman_adv/%s" #define DEBUG_TRANSTABLE_GLOBAL "transtable_global" +#define DEBUG_BACKBONETABLE "bla_backbone_table" +#define DEBUG_CLAIMTABLE "bla_claim_table" +#define DEBUG_DAT_CACHE "dat_cache" +#define DEBUG_NC_NODES "nc_nodes" +#define DEBUG_MCAST_FLAGS "mcast_flags" #define DEBUG_LOG "log" #define DEBUG_ROUTING_ALGOS "routing_algos"
-enum batctl_debug_tables { - BATCTL_TABLE_NEIGHBORS, - BATCTL_TABLE_ORIGINATORS, - BATCTL_TABLE_GATEWAYS, - BATCTL_TABLE_TRANSLOCAL, - BATCTL_TABLE_TRANSGLOBAL, - BATCTL_TABLE_BLA_CLAIMS, - BATCTL_TABLE_BLA_BACKBONES, - BATCTL_TABLE_DAT, - BATCTL_TABLE_NETWORK_CODING_NODES, - BATCTL_TABLE_MCAST_FLAGS, - BATCTL_TABLE_NUM, -}; - struct debug_table_data { - const char opt_long[OPT_LONG_MAX_LEN]; - const char opt_short[OPT_SHORT_MAX_LEN]; - const char debugfs_name[DEBUG_TABLE_PATH_MAX_LEN]; - size_t header_lines; - int (*netlink_fn)(char *mesh_iface, char *hard_iface, int read_opt, + const char *debugfs_name; + size_t header_lines; + int (*netlink_fn)(char *mesh_iface, char *hard_iface, int read_opt, float orig_timeout, float watch_interval); + unsigned int option_unicast_only:1; + unsigned int option_multicast_only:1; + unsigned int option_watch_interval:1; + unsigned int option_orig_iface:1; };
-extern const struct debug_table_data batctl_debug_tables[BATCTL_TABLE_NUM]; - -int handle_debug_table(char *mesh_iface, int debug_table, int argc, char **argv); +int handle_debug_table(struct state *state, int argc, char **argv); int debug_print_routing_algos(void);
#endif diff --git a/functions.c b/functions.c index e0e9978..faa9478 100644 --- a/functions.c +++ b/functions.c @@ -73,11 +73,11 @@ const char *fs_compile_out_param[] = { batctl_settings[BATCTL_SETTINGS_DAT].sysfs_name, batctl_settings[BATCTL_SETTINGS_NETWORK_CODING].sysfs_name, batctl_settings[BATCTL_SETTINGS_MULTICAST_MODE].sysfs_name, - batctl_debug_tables[BATCTL_TABLE_BLA_CLAIMS].debugfs_name, - batctl_debug_tables[BATCTL_TABLE_BLA_BACKBONES].debugfs_name, - batctl_debug_tables[BATCTL_TABLE_DAT].debugfs_name, - batctl_debug_tables[BATCTL_TABLE_NETWORK_CODING_NODES].debugfs_name, - batctl_debug_tables[BATCTL_TABLE_MCAST_FLAGS].debugfs_name, + DEBUG_DAT_CACHE, + DEBUG_BACKBONETABLE, + DEBUG_DAT_CACHE, + DEBUG_NC_NODES, + DEBUG_MCAST_FLAGS, NULL, };
diff --git a/main.c b/main.c index 251d753..f5920a4 100644 --- a/main.c +++ b/main.c @@ -43,6 +43,7 @@ static void print_usage(void) { enum command_type type[] = { SUBCOMMAND, + DEBUGTABLE, }; const struct command **p; int opt_indent; @@ -63,6 +64,9 @@ static void print_usage(void) case SUBCOMMAND: fprintf(stderr, "commands:\n"); break; + case DEBUGTABLE: + fprintf(stderr, "debug tables: \tdisplay the corresponding debug table\n"); + break; }
for (p = __start___command; p < __stop___command; p++) { @@ -97,12 +101,6 @@ static void print_usage(void) } } } - - fprintf(stderr, "\n"); - - fprintf(stderr, "debug tables: \tdisplay the corresponding debug table\n"); - for (i = 0; i < BATCTL_TABLE_NUM; i++) - fprintf(stderr, " \t%s|%s\n", batctl_debug_tables[i].opt_long, batctl_debug_tables[i].opt_short); }
static void version(void) @@ -212,15 +210,6 @@ int main(int argc, char **argv) goto out; }
- for (i = 0; i < BATCTL_TABLE_NUM; i++) { - if ((strcmp(argv[0], batctl_debug_tables[i].opt_long) != 0) && - (strcmp(argv[0], batctl_debug_tables[i].opt_short) != 0)) - continue; - - ret = handle_debug_table(state.mesh_iface, i, argc, argv); - goto out; - } - fprintf(stderr, "Error - no valid command or debug table specified: %s\n", argv[0]); diff --git a/main.h b/main.h index 052304c..5fa248c 100644 --- a/main.h +++ b/main.h @@ -34,7 +34,6 @@ #define OPT_LONG_MAX_LEN 25 #define OPT_SHORT_MAX_LEN 5
-#define DEBUG_TABLE_PATH_MAX_LEN 20 #define SETTINGS_PATH_MAX_LEN 25
#if BYTE_ORDER == BIG_ENDIAN @@ -63,6 +62,7 @@ enum command_flags {
enum command_type { SUBCOMMAND, + DEBUGTABLE, };
struct state {