The following commit has been merged in the master branch:
commit 5ec3a9163b107bb6180e73c445caf3994e6a4cbf
Author: Marek Lindner <lindner_marek(a)yahoo.de>
Date: Sat Jun 23 13:53:23 2012 +0200
batctl: unify settings handling and remove redundant code
Signed-off-by: Marek Lindner <lindner_marek(a)yahoo.de>
diff --git a/functions.c b/functions.c
index 36a4d40..d08c7a0 100644
--- a/functions.c
+++ b/functions.c
@@ -44,7 +44,7 @@ char *line_ptr = NULL;
const char *sysfs_compile_out_param[] = {
SYS_LOG,
SYS_LOG_LEVEL,
- SYS_BRIDGE_LOOP_AVOIDANCE,
+ batctl_settings[BATCTL_SETTINGS_BLA].sysfs_name,
NULL,
};
diff --git a/main.c b/main.c
index 1482dbe..ae0b3d2 100644
--- a/main.c
+++ b/main.c
@@ -45,7 +45,7 @@ char module_ver_path[] = "/sys/module/batman_adv/version";
void print_usage(void)
{
- int i;
+ int i, opt_indent;
printf("Usage: batctl [options] command|debug table \n");
printf("options:\n");
@@ -56,17 +56,24 @@ void print_usage(void)
printf("commands:\n");
printf(" \tinterface|if [add|del iface(s)]\tdisplay or modify the interface settings\n");
- printf(" \tinterval|it [orig_interval] \tdisplay or modify the originator interval (in ms)\n");
+ for (i = 0; i < BATCTL_SETTINGS_NUM; i++) {
+ printf(" \t%s|%s", batctl_settings[i].opt_long, batctl_settings[i].opt_short);
+ opt_indent = strlen(batctl_settings[i].opt_long) + strlen(batctl_settings[i].opt_short);
+
+ if (batctl_settings[i].params == sysfs_param_enable)
+ printf("%*s display or modify %s setting\n",
+ 31 - opt_indent, "[0|1]", batctl_settings[i].opt_long);
+ else if (batctl_settings[i].params == sysfs_param_server)
+ printf("%*s display or modify %s setting\n",
+ 41 - opt_indent, "[client|server]", batctl_settings[i].opt_long);
+ else
+ printf(" display or modify %s setting\n",
+ batctl_settings[i].opt_long);
+ }
printf(" \tloglevel|ll [level] \tdisplay or modify the log level\n");
printf(" \tlog|l \tread the log produced by the kernel module\n");
printf(" \tgw_mode|gw [mode] \tdisplay or modify the gateway mode\n");
- printf(" \tvis_mode|vm [mode] \tdisplay or modify the status of the VIS server\n");
printf(" \tvis_data|vd [dot|JSON] \tdisplay the VIS data in dot or JSON format\n");
- printf(" \taggregation|ag [0|1] \tdisplay or modify the packet aggregation setting\n");
- printf(" \tbonding|b [0|1] \tdisplay or modify the bonding mode setting\n");
- printf(" \tbridge_loop_avoidance|bl [0|1] \tdisplay or modify the bridge loop avoidance setting\n");
- printf(" \tfragmentation|f [0|1] \tdisplay or modify the fragmentation mode setting\n");
- printf(" \tap_isolation|ap [0|1] \tdisplay or modify the ap isolation mode setting\n");
printf("\n");
printf("debug tables: \tdisplay the corresponding debug table\n");
@@ -153,16 +160,6 @@ int main(int argc, char **argv)
ret = log_print(mesh_iface, argc - 1, argv + 1);
- } else if ((strcmp(argv[1], "interval") == 0) || (strcmp(argv[1], "it") == 0)) {
-
- ret = handle_sys_setting(mesh_iface, argc - 1, argv + 1,
- SYS_ORIG_INTERVAL, orig_interval_usage, NULL);
-
- } else if ((strcmp(argv[1], "vis_mode") == 0) || (strcmp(argv[1], "vm") == 0)) {
-
- ret = handle_sys_setting(mesh_iface, argc - 1, argv + 1,
- SYS_VIS_MODE, vis_mode_usage, sysfs_param_server);
-
} else if ((strcmp(argv[1], "vis_data") == 0) || (strcmp(argv[1], "vd") == 0)) {
ret = vis_data(mesh_iface, argc - 1, argv + 1);
@@ -171,31 +168,6 @@ int main(int argc, char **argv)
ret = handle_gw_setting(mesh_iface, argc - 1, argv + 1);
- } else if ((strcmp(argv[1], "aggregation") == 0) || (strcmp(argv[1], "ag") == 0)) {
-
- ret = handle_sys_setting(mesh_iface, argc - 1, argv + 1,
- SYS_AGGR, aggregation_usage, sysfs_param_enable);
-
- } else if ((strcmp(argv[1], "bonding") == 0) || (strcmp(argv[1], "b") == 0)) {
-
- ret = handle_sys_setting(mesh_iface, argc - 1, argv + 1,
- SYS_BONDING, bonding_usage, sysfs_param_enable);
-
- } else if ((strcmp(argv[1], "bridge_loop_avoidance") == 0) || (strcmp(argv[1], "bl") == 0)) {
-
- ret = handle_sys_setting(mesh_iface, argc - 1, argv + 1,
- SYS_BRIDGE_LOOP_AVOIDANCE, bridge_loop_avoidance_usage, sysfs_param_enable);
-
- } else if ((strcmp(argv[1], "fragmentation") == 0) || (strcmp(argv[1], "f") == 0)) {
-
- ret = handle_sys_setting(mesh_iface, argc - 1, argv + 1,
- SYS_FRAG, fragmentation_usage, sysfs_param_enable);
-
- } else if ((strcmp(argv[1], "ap_isolation") == 0) || (strcmp(argv[1], "ap") == 0)) {
-
- ret = handle_sys_setting(mesh_iface, argc - 1, argv + 1,
- SYS_AP_ISOLA, ap_isolation_usage, sysfs_param_enable);
-
} else if ((strcmp(argv[1], "statistics") == 0) || (strcmp(argv[1], "s") == 0)) {
ret = ioctl_statistics_get(mesh_iface);
@@ -206,6 +178,15 @@ int main(int argc, char **argv)
} else {
+ for (i = 0; i < BATCTL_SETTINGS_NUM; i++) {
+ if ((strcmp(argv[1], batctl_settings[i].opt_long) != 0) &&
+ (strcmp(argv[1], batctl_settings[i].opt_short) != 0))
+ continue;
+
+ ret = handle_sys_setting(mesh_iface, i, argc - 1, argv + 1);
+ goto out;
+ }
+
for (i = 0; i < BATCTL_TABLE_NUM; i++) {
if ((strcmp(argv[1], batctl_debug_tables[i].opt_long) != 0) &&
(strcmp(argv[1], batctl_debug_tables[i].opt_short) != 0))
diff --git a/main.h b/main.h
index 782ffde..4c8b60b 100644
--- a/main.h
+++ b/main.h
@@ -31,6 +31,7 @@
#define OPT_SHORT_MAX_LEN 5
#define DEBUG_TABLE_PATH_MAX_LEN 20
+#define SETTINGS_PATH_MAX_LEN 25
#define __packed __attribute((packed)) /* linux kernel compat */
diff --git a/sys.c b/sys.c
index 5702c6c..6a1071a 100644
--- a/sys.c
+++ b/sys.c
@@ -49,6 +49,52 @@ const char *sysfs_param_server[] = {
NULL,
};
+const struct settings_data batctl_settings[BATCTL_SETTINGS_NUM] = {
+ {
+ .opt_long = "orig_interval",
+ .opt_short = "it",
+ .sysfs_name = "orig_interval",
+ .params = NULL,
+ },
+ {
+ .opt_long = "ap_isolation",
+ .opt_short = "ap",
+ .sysfs_name = "ap_isolation",
+ .params = sysfs_param_enable,
+ },
+ {
+ .opt_long = "bridge_loop_avoidance",
+ .opt_short = "bl",
+ .sysfs_name = "bridge_loop_avoidance",
+ .params = sysfs_param_enable,
+ },
+ {
+ .opt_long = "vis_mode",
+ .opt_short = "vm",
+ .sysfs_name = "vis_mode",
+ .params = sysfs_param_server,
+ },
+ {
+ .opt_long = "aggregation",
+ .opt_short = "ag",
+ .sysfs_name = "aggregated_ogms",
+ .params = sysfs_param_enable,
+ },
+ {
+ .opt_long = "bonding",
+ .opt_short = "b",
+ .sysfs_name = "bonding",
+ .params = sysfs_param_enable,
+ },
+ {
+ .opt_long = "fragmentation",
+ .opt_short = "f",
+ .sysfs_name = "fragmentation",
+ .params = sysfs_param_enable,
+ },
+
+};
+
static void interface_usage(void)
{
printf("Usage: batctl interface [options] [add|del iface(s)] \n");
@@ -276,65 +322,23 @@ out:
return res;
}
-void aggregation_usage(void)
-{
- printf("Usage: batctl [options] aggregation [0|1]\n");
- printf("options:\n");
- printf(" \t -h print this help\n");
-}
-
-void bonding_usage(void)
-{
- printf("Usage: batctl [options] bonding [0|1]\n");
- printf("options:\n");
- printf(" \t -h print this help\n");
-}
-
-void bridge_loop_avoidance_usage(void)
-{
- printf("Usage: batctl [options] bridge_loop_avoidance [0|1]\n");
- printf("options:\n");
- printf(" \t -h print this help\n");
-}
-
-void gw_mode_usage(void)
-{
- printf("Usage: batctl [options] gw_mode [mode] [sel_class|bandwidth]\n");
- printf("options:\n");
- printf(" \t -h print this help\n");
-}
-
-void vis_mode_usage(void)
+static void settings_usage(int setting)
{
- printf("Usage: batctl [options] vis_mode [mode]\n");
- printf("options:\n");
- printf(" \t -h print this help\n");
-}
+ printf("Usage: batctl [options] %s|%s",
+ (char *)batctl_settings[setting].opt_long, (char *)batctl_settings[setting].opt_short);
-void orig_interval_usage(void)
-{
- printf("Usage: batctl [options] interval \n");
- printf("options:\n");
- printf(" \t -h print this help\n");
-}
-
-void fragmentation_usage(void)
-{
- printf("Usage: batctl [options] fragmentation [0|1]\n");
- printf("options:\n");
- printf(" \t -h print this help\n");
-}
+ if (batctl_settings[setting].params == sysfs_param_enable)
+ printf(" [0|1]\n");
+ else if (batctl_settings[setting].params == sysfs_param_server)
+ printf(" [client|server]\n");
+ else
+ printf("\n");
-void ap_isolation_usage(void)
-{
- printf("Usage: batctl [options] ap_isolation [0|1]\n");
printf("options:\n");
printf(" \t -h print this help\n");
}
-int handle_sys_setting(char *mesh_iface, int argc, char **argv,
- char *file_path, void setting_usage(void),
- const char *sysfs_param[])
+int handle_sys_setting(char *mesh_iface, int setting, int argc, char **argv)
{
int optchar, res = EXIT_FAILURE;
char *path_buff;
@@ -343,10 +347,10 @@ int handle_sys_setting(char *mesh_iface, int argc, char **argv,
while ((optchar = getopt(argc, argv, "h")) != -1) {
switch (optchar) {
case 'h':
- setting_usage();
+ settings_usage(setting);
return EXIT_SUCCESS;
default:
- setting_usage();
+ settings_usage(setting);
return EXIT_FAILURE;
}
}
@@ -355,14 +359,15 @@ int handle_sys_setting(char *mesh_iface, int argc, char **argv,
snprintf(path_buff, PATH_BUFF_LEN, SYS_BATIF_PATH_FMT, mesh_iface);
if (argc == 1) {
- res = read_file(path_buff, file_path, NO_FLAGS, 0, 0);
+ res = read_file(path_buff, (char *)batctl_settings[setting].sysfs_name,
+ NO_FLAGS, 0, 0);
goto out;
}
- if (!sysfs_param)
+ if (!batctl_settings[setting].params)
goto write_file;
- ptr = sysfs_param;
+ ptr = batctl_settings[setting].params;
while (*ptr) {
if (strcmp(*ptr, argv[1]) == 0)
goto write_file;
@@ -373,7 +378,7 @@ int handle_sys_setting(char *mesh_iface, int argc, char **argv,
printf("Error - the supplied argument is invalid: %s\n", argv[1]);
printf("The following values are allowed:\n");
- ptr = sysfs_param;
+ ptr = batctl_settings[setting].params;
while (*ptr) {
printf(" * %s\n", *ptr);
ptr++;
@@ -382,13 +387,21 @@ int handle_sys_setting(char *mesh_iface, int argc, char **argv,
goto out;
write_file:
- res = write_file(path_buff, file_path, argv[1], argc > 2 ? argv[2] : NULL);
+ res = write_file(path_buff, (char *)batctl_settings[setting].sysfs_name,
+ argv[1], argc > 2 ? argv[2] : NULL);
out:
free(path_buff);
return res;
}
+static void gw_mode_usage(void)
+{
+ printf("Usage: batctl [options] gw_mode [mode] [sel_class|bandwidth]\n");
+ printf("options:\n");
+ printf(" \t -h print this help\n");
+}
+
int handle_gw_setting(char *mesh_iface, int argc, char **argv)
{
int optchar, res = EXIT_FAILURE;
diff --git a/sys.h b/sys.h
index f48902e..1fc473e 100644
--- a/sys.h
+++ b/sys.h
@@ -23,20 +23,24 @@
#define SYS_BATIF_PATH_FMT "/sys/class/net/%s/mesh/"
#define SYS_LOG_LEVEL "log_level"
#define SYS_LOG "log"
-#define SYS_AGGR "aggregated_ogms"
-#define SYS_BONDING "bonding"
-#define SYS_BRIDGE_LOOP_AVOIDANCE "bridge_loop_avoidance"
#define SYS_GW_MODE "gw_mode"
#define SYS_GW_SEL "gw_sel_class"
#define SYS_GW_BW "gw_bandwidth"
-#define SYS_VIS_MODE "vis_mode"
-#define SYS_ORIG_INTERVAL "orig_interval"
#define SYS_IFACE_PATH "/sys/class/net"
#define SYS_IFACE_DIR SYS_IFACE_PATH"/%s/"
#define SYS_MESH_IFACE_FMT SYS_IFACE_PATH"/%s/batman_adv/mesh_iface"
#define SYS_IFACE_STATUS_FMT SYS_IFACE_PATH"/%s/batman_adv/iface_status"
-#define SYS_FRAG "fragmentation"
-#define SYS_AP_ISOLA "ap_isolation"
+
+enum batctl_settings_list {
+ BATCTL_SETTINGS_ORIG_INTERVAL,
+ BATCTL_SETTINGS_AP_ISOLATION,
+ BATCTL_SETTINGS_BLA,
+ BATCTL_SETTINGS_VIS_MODE,
+ BATCTL_SETTINGS_AGGREGATION,
+ BATCTL_SETTINGS_BONDING,
+ BATCTL_SETTINGS_FRAGMENTATION,
+ BATCTL_SETTINGS_NUM,
+};
enum gw_modes {
GW_MODE_OFF,
@@ -44,20 +48,18 @@ enum gw_modes {
GW_MODE_SERVER,
};
+struct settings_data {
+ const char opt_long[OPT_LONG_MAX_LEN];
+ const char opt_short[OPT_SHORT_MAX_LEN];
+ const char sysfs_name[SETTINGS_PATH_MAX_LEN];
+ const char **params;
+};
+
extern const char *sysfs_param_enable[];
extern const char *sysfs_param_server[];
+extern const struct settings_data batctl_settings[BATCTL_SETTINGS_NUM];
-void aggregation_usage(void);
-void bonding_usage(void);
-void bridge_loop_avoidance_usage(void);
-void fragmentation_usage(void);
-void ap_isolation_usage(void);
-void gw_mode_usage(void);
-void vis_mode_usage(void);
-void orig_interval_usage(void);
int interface(char *mesh_iface, int argc, char **argv);
int handle_loglevel(char *mesh_iface, int argc, char **argv);
-int handle_sys_setting(char *mesh_iface, int argc, char **argv,
- char *file_path, void setting_usage(void),
- const char *sysfs_param[]);
+int handle_sys_setting(char *mesh_iface, int setting, int argc, char **argv);
int handle_gw_setting(char *mesh_iface, int argc, char **argv);
--
batctl