Now functions.d being removed again; adding manpage-entries. Two smaller info-output changes (x.y instead of xxx.xxx; "-%c" in a printf instead of just "%c" when entering an unknown command).
Cheers, Linus
This commit introduces the -t switch for originator table output. It makes use of the new last-seen field in batman-adv, the user can specify a timeout interval in seconds (with 3 digits precision before and after a possible dot) if he/she considers a node as dead after this time. (of course this is just influencing the displaying and not actually declearing a node as dead for routing decisions)
Signed-off-by: Linus Lüssing linus.luessing@web.de --- batctl/debug.c | 23 ++++++++++++++++++++--- batctl/functions.c | 9 ++++++++- batctl/functions.h | 3 ++- batctl/sys.c | 8 ++++---- 4 files changed, 34 insertions(+), 9 deletions(-)
diff --git a/batctl/debug.c b/batctl/debug.c index c57355a..fb9c74b 100644 --- a/batctl/debug.c +++ b/batctl/debug.c @@ -40,6 +40,7 @@ void originators_usage(void) printf(" \t -h print this help\n"); printf(" \t -n don't replace mac addresses with bat-host names\n"); printf(" \t -w watch mode - refresh the originator table continuously\n"); + printf(" \t -t timeout interval - don't print originators not seen for x.y seconds \n"); }
void trans_local_usage(void) @@ -74,8 +75,9 @@ int handle_debug_table(int argc, char **argv, char *file_path, void table_usage( int optchar, read_opt = USE_BAT_HOSTS; char full_path[MAX_PATH+1]; char *debugfs_mnt; + float orig_timeout;
- while ((optchar = getopt(argc, argv, "hnw")) != -1) { + while ((optchar = getopt(argc, argv, "hnwt:")) != -1) { switch (optchar) { case 'h': table_usage(); @@ -86,6 +88,21 @@ int handle_debug_table(int argc, char **argv, char *file_path, void table_usage( case 'w': read_opt |= CLR_CONT_READ; break; + case 't': + if (table_usage != originators_usage) { + table_usage(); + return EXIT_FAILURE; + } + + read_opt |= NO_OLD_ORIGS; + if (!sscanf(optarg, "%f", &orig_timeout)) { + printf("Error - provided argument of -t is not a number\n"); + return EXIT_FAILURE; + } + break; + case '?': + if (optopt == 't' && table_usage == originators_usage) + return EXIT_FAILURE; default: table_usage(); return EXIT_FAILURE; @@ -99,7 +116,7 @@ int handle_debug_table(int argc, char **argv, char *file_path, void table_usage( }
debugfs_make_path(DEBUG_BATIF_PATH "/", full_path, sizeof(full_path)); - return read_file(full_path, file_path, read_opt); + return read_file(full_path, file_path, read_opt, orig_timeout); }
static void log_usage(void) @@ -137,7 +154,7 @@ int log_print(int argc, char **argv) }
debugfs_make_path(DEBUG_BATIF_PATH "/", full_path, sizeof(full_path)); - res = read_file(full_path, DEBUG_LOG, read_opt); + res = read_file(full_path, DEBUG_LOG, read_opt, 0);
if ((res != EXIT_SUCCESS) && (errno == ENOENT)) printf("To read the debug log you need to compile the module with debugging enabled (see the README)\n"); diff --git a/batctl/functions.c b/batctl/functions.c index 9b697b3..0aeb99a 100644 --- a/batctl/functions.c +++ b/batctl/functions.c @@ -117,11 +117,12 @@ static int check_sys_dir(char *dir) return EXIT_FAILURE; }
-int read_file(char *dir, char *fname, int read_opt) +int read_file(char *dir, char *fname, int read_opt, float orig_timeout) { struct ether_addr *mac_addr; struct bat_host *bat_host; int res = EXIT_FAILURE; + float last_seen; char full_path[500], *buff_ptr, *space_ptr, extra_char; size_t len = 0; ssize_t read; @@ -157,6 +158,12 @@ read: if (read_opt & USE_READ_BUFF) break;
+ /* skip timed out originators */ + if (read_opt & NO_OLD_ORIGS) + if (sscanf(line_ptr, "%*s %f", &last_seen) + && (last_seen > orig_timeout)) + continue; + if (!(read_opt & USE_BAT_HOSTS)) { printf("%s", line_ptr); continue; diff --git a/batctl/functions.h b/batctl/functions.h index 885df34..3fb8f35 100644 --- a/batctl/functions.h +++ b/batctl/functions.h @@ -33,7 +33,7 @@ double end_timer(void); char *ether_ntoa_long(const struct ether_addr *addr); char *get_name_by_macaddr(struct ether_addr *mac_addr, int read_opt); char *get_name_by_macstr(char *mac_str, int read_opt); -int read_file(char *dir, char *path, int read_opt); +int read_file(char *dir, char *path, int read_opt, float orig_timeout); int write_file(char *dir, char *fname, char *arg1, char *arg2);
extern char *line_ptr; @@ -46,4 +46,5 @@ enum { LOG_MODE = 0x08, USE_READ_BUFF = 0x10, SILENCE_ERRORS = 0x20, + NO_OLD_ORIGS = 0x40, }; diff --git a/batctl/sys.c b/batctl/sys.c index 321dfc9..7135841 100644 --- a/batctl/sys.c +++ b/batctl/sys.c @@ -79,7 +79,7 @@ static int print_interfaces(void)
while ((iface_dir = readdir(iface_base_dir)) != NULL) { snprintf(path_buff, PATH_BUFF_LEN, SYS_MESH_IFACE_FMT, iface_dir->d_name); - res = read_file("", path_buff, SINGLE_READ | USE_READ_BUFF | SILENCE_ERRORS); + res = read_file("", path_buff, SINGLE_READ | USE_READ_BUFF | SILENCE_ERRORS, 0); if (res != EXIT_SUCCESS) continue;
@@ -93,7 +93,7 @@ static int print_interfaces(void) line_ptr = NULL;
snprintf(path_buff, PATH_BUFF_LEN, SYS_IFACE_STATUS_FMT, iface_dir->d_name); - res = read_file("", path_buff, SINGLE_READ | USE_READ_BUFF | SILENCE_ERRORS); + res = read_file("", path_buff, SINGLE_READ | USE_READ_BUFF | SILENCE_ERRORS, 0); if (res != EXIT_SUCCESS) { printf("<error reading status>\n"); continue; @@ -196,7 +196,7 @@ int handle_loglevel(int argc, char **argv) goto out; }
- res = read_file(SYS_BATIF_PATH, SYS_LOG_LEVEL, SINGLE_READ | USE_READ_BUFF); + res = read_file(SYS_BATIF_PATH, SYS_LOG_LEVEL, SINGLE_READ | USE_READ_BUFF, 0);
if (res != EXIT_SUCCESS) goto out; @@ -271,7 +271,7 @@ int handle_sys_setting(int argc, char **argv, }
if (argc == 1) - return read_file(SYS_BATIF_PATH, file_path, SINGLE_READ); + return read_file(SYS_BATIF_PATH, file_path, SINGLE_READ, 0);
if (!sysfs_param) goto write_file;
If you are running a very mobile mesh network with a fast originator interval, then the last-seen interval might not update fast enough depending on the actual scenario, because the default polling interval of batctl is 1 second. With this patch, an optional interval in seconds and a precision of 3 digits before and after an optional dot can be added, making the batctl-watch-mode updates faster.
Signed-off-by: Linus Lüssing linus.luessing@web.de --- batctl/debug.c | 38 +++++++++++++++++++++++++++++--------- batctl/functions.c | 7 ++++--- batctl/functions.h | 3 ++- batctl/sys.c | 8 ++++---- 4 files changed, 39 insertions(+), 17 deletions(-)
diff --git a/batctl/debug.c b/batctl/debug.c index fb9c74b..3045f67 100644 --- a/batctl/debug.c +++ b/batctl/debug.c @@ -39,7 +39,7 @@ void originators_usage(void) printf("options:\n"); printf(" \t -h print this help\n"); printf(" \t -n don't replace mac addresses with bat-host names\n"); - printf(" \t -w watch mode - refresh the originator table continuously\n"); + printf(" \t -w [interval] watch mode - refresh the originator table continuously\n"); printf(" \t -t timeout interval - don't print originators not seen for x.y seconds \n"); }
@@ -49,7 +49,7 @@ void trans_local_usage(void) printf("options:\n"); printf(" \t -h print this help\n"); printf(" \t -n don't replace mac addresses with bat-host names\n"); - printf(" \t -w watch mode - refresh the local translation table continuously\n"); + printf(" \t -w [interval] watch mode - refresh the local translation table continuously\n"); }
void trans_global_usage(void) @@ -58,7 +58,7 @@ void trans_global_usage(void) printf("options:\n"); printf(" \t -h print this help\n"); printf(" \t -n don't replace mac addresses with bat-host names\n"); - printf(" \t -w watch mode - refresh the global translation table continuously\n"); + printf(" \t -w [interval] watch mode - refresh the global translation table continuously\n"); }
void gateways_usage(void) @@ -67,7 +67,7 @@ void gateways_usage(void) printf("options:\n"); printf(" \t -h print this help\n"); printf(" \t -n don't replace mac addresses with bat-host names\n"); - printf(" \t -w watch mode - refresh the gateway server list continuously\n"); + printf(" \t -w [interval] watch mode - refresh the gateway server list continuously\n"); }
int handle_debug_table(int argc, char **argv, char *file_path, void table_usage(void)) @@ -76,8 +76,10 @@ int handle_debug_table(int argc, char **argv, char *file_path, void table_usage( char full_path[MAX_PATH+1]; char *debugfs_mnt; float orig_timeout; + float watch_interval = 1; + opterr = 0;
- while ((optchar = getopt(argc, argv, "hnwt:")) != -1) { + while ((optchar = getopt(argc, argv, "hnw:t:")) != -1) { switch (optchar) { case 'h': table_usage(); @@ -87,6 +89,15 @@ int handle_debug_table(int argc, char **argv, char *file_path, void table_usage( break; case 'w': read_opt |= CLR_CONT_READ; + if (optarg[0] == '-') { + optind--; + break; + } + + if (!sscanf(optarg, "%f", &watch_interval)) { + printf("Error - provided argument of -w is not a number\n"); + return EXIT_FAILURE; + } break; case 't': if (table_usage != originators_usage) { @@ -101,8 +112,17 @@ int handle_debug_table(int argc, char **argv, char *file_path, void table_usage( } break; case '?': - if (optopt == 't' && table_usage == originators_usage) - return EXIT_FAILURE; + if (optopt == 't') + printf("Error - argument -t needs a number\n"); + + else if (optopt == 'w') { + read_opt |= CLR_CONT_READ; + break; + } + else + printf("Error - unrecognised option -%c\n", optopt); + + return EXIT_FAILURE; default: table_usage(); return EXIT_FAILURE; @@ -116,7 +136,7 @@ int handle_debug_table(int argc, char **argv, char *file_path, void table_usage( }
debugfs_make_path(DEBUG_BATIF_PATH "/", full_path, sizeof(full_path)); - return read_file(full_path, file_path, read_opt, orig_timeout); + return read_file(full_path, file_path, read_opt, orig_timeout, watch_interval); }
static void log_usage(void) @@ -154,7 +174,7 @@ int log_print(int argc, char **argv) }
debugfs_make_path(DEBUG_BATIF_PATH "/", full_path, sizeof(full_path)); - res = read_file(full_path, DEBUG_LOG, read_opt, 0); + res = read_file(full_path, DEBUG_LOG, read_opt, 0, 0);
if ((res != EXIT_SUCCESS) && (errno == ENOENT)) printf("To read the debug log you need to compile the module with debugging enabled (see the README)\n"); diff --git a/batctl/functions.c b/batctl/functions.c index 0aeb99a..497e166 100644 --- a/batctl/functions.c +++ b/batctl/functions.c @@ -117,7 +117,8 @@ static int check_sys_dir(char *dir) return EXIT_FAILURE; }
-int read_file(char *dir, char *fname, int read_opt, float orig_timeout) +int read_file(char *dir, char *fname, int read_opt, + float orig_timeout, float watch_interval) { struct ether_addr *mac_addr; struct bat_host *bat_host; @@ -218,14 +219,14 @@ written: }
if (read_opt & CONT_READ) { - sleep(1); + usleep(1000000 * watch_interval); goto read; }
if (read_opt & CLR_CONT_READ) { if (fp) fclose(fp); - sleep(1); + usleep(1000000 * watch_interval); goto open; }
diff --git a/batctl/functions.h b/batctl/functions.h index 3fb8f35..6aa9487 100644 --- a/batctl/functions.h +++ b/batctl/functions.h @@ -33,7 +33,8 @@ double end_timer(void); char *ether_ntoa_long(const struct ether_addr *addr); char *get_name_by_macaddr(struct ether_addr *mac_addr, int read_opt); char *get_name_by_macstr(char *mac_str, int read_opt); -int read_file(char *dir, char *path, int read_opt, float orig_timeout); +int read_file(char *dir, char *path, int read_opt, + float orig_timeout, float watch_interval); int write_file(char *dir, char *fname, char *arg1, char *arg2);
extern char *line_ptr; diff --git a/batctl/sys.c b/batctl/sys.c index 7135841..4c07866 100644 --- a/batctl/sys.c +++ b/batctl/sys.c @@ -79,7 +79,7 @@ static int print_interfaces(void)
while ((iface_dir = readdir(iface_base_dir)) != NULL) { snprintf(path_buff, PATH_BUFF_LEN, SYS_MESH_IFACE_FMT, iface_dir->d_name); - res = read_file("", path_buff, SINGLE_READ | USE_READ_BUFF | SILENCE_ERRORS, 0); + res = read_file("", path_buff, SINGLE_READ | USE_READ_BUFF | SILENCE_ERRORS, 0, 0); if (res != EXIT_SUCCESS) continue;
@@ -93,7 +93,7 @@ static int print_interfaces(void) line_ptr = NULL;
snprintf(path_buff, PATH_BUFF_LEN, SYS_IFACE_STATUS_FMT, iface_dir->d_name); - res = read_file("", path_buff, SINGLE_READ | USE_READ_BUFF | SILENCE_ERRORS, 0); + res = read_file("", path_buff, SINGLE_READ | USE_READ_BUFF | SILENCE_ERRORS, 0, 0); if (res != EXIT_SUCCESS) { printf("<error reading status>\n"); continue; @@ -196,7 +196,7 @@ int handle_loglevel(int argc, char **argv) goto out; }
- res = read_file(SYS_BATIF_PATH, SYS_LOG_LEVEL, SINGLE_READ | USE_READ_BUFF, 0); + res = read_file(SYS_BATIF_PATH, SYS_LOG_LEVEL, SINGLE_READ | USE_READ_BUFF, 0, 0);
if (res != EXIT_SUCCESS) goto out; @@ -271,7 +271,7 @@ int handle_sys_setting(int argc, char **argv, }
if (argc == 1) - return read_file(SYS_BATIF_PATH, file_path, SINGLE_READ, 0); + return read_file(SYS_BATIF_PATH, file_path, SINGLE_READ, 0, 0);
if (!sysfs_param) goto write_file;
This patch documents the new ability to specifiy a custom refresh interval and the new originator timeout filter in the manpage.
Signed-off-by: Linus Lüssing linus.luessing@web.de --- batctl/man/batctl.8 | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/batctl/man/batctl.8 b/batctl/man/batctl.8 index 8089b24..ccd3546 100644 --- a/batctl/man/batctl.8 +++ b/batctl/man/batctl.8 @@ -56,8 +56,8 @@ protocol. .IP "\fBinterface\fP|\fBif\fP [\fBadd\fP|\fBdel iface(s)\fP]" If no parameter is given or the first parameter is neither "add" nor "del" the current interface settings are displayed. In order to add or delete interfaces specify "add" or "del" as first argument and append the interface names you wish to add or delete. .br -.IP "\fBoriginators\fP|\fBo\fP [\fB-w\fP][\fB-n\fP]" -Once started batctl will display the list of announced gateways in the network. Use the "-w" option to let batctl refresh the list every second. If "-n" is given batctl will not replace the MAC addresses with bat-host names in the output. +.IP "\fBoriginators\fP|\fBo\fP [\fB-w\fP [\fI\interval\fP]][\fB-n\fP][\fB-t\fP]" +Once started batctl will display the list of announced gateways in the network. Use the "-w" option to let batctl refresh the list every second or add a number to let it refresh at a custom interval in seconds (with optional decimal places). If "-n" is given batctl will not replace the MAC addresses with bat-host names in the output. The "-t" option filters all originators that have not been seen for the specified amount of seconds (with optional decimal places) from the output. .br .IP "\fBinterval\fP|\fBit\fP [\fBorig_interval\fP]" If no parameter is given the current originator interval setting is displayed otherwise the parameter is used to set the originator interval. The interval is in units of milliseconds. @@ -110,14 +110,14 @@ chooses the gateway with the best link quality but switches to another gateway a .RE .RE .br -.IP "\fBgateways|gwl\fP [\fB-w\fP][\fB-n\fP]" -Once started batctl will display the list of announced gateways in the network. Use the "-w" option to let batctl refresh the list every second. If "-n" was given batctl will not replace the mac addresses with bat-host names in the output. +.IP "\fBgateways|gwl\fP [\fB-w\fP [\fI\interval\fP]][\fB-n\fP]" +Once started batctl will display the list of announced gateways in the network. Use the "-w" option to let batctl refresh the list every second or add a number to let it refresh at a custom interval in seconds (with optional decimal places). If "-n" was given batctl will not replace the mac addresses with bat-host names in the output. .br -.IP "\fBtranslocal\fP|\fBtl\fP [\fB-w\fP][\fB-n\fP]" -Display the local translation table. batctl will refresh the list every second if the "-w" option was given. Use "-n" to let batctl not replace the MAC addresses with bat-host names in the output. +.IP "\fBtranslocal\fP|\fBtl\fP [\fB-w\fP [\fI\interval\fP]][\fB-n\fP]" +Display the local translation table. batctl will refresh the list every second if the "-w" option was given or add a number to let it refresh at a custom interval in seconds (with optional decimal places). Use "-n" to let batctl not replace the MAC addresses with bat-host names in the output. .br -.IP "\fBtransglobal\fP|\fBtg\fP [\fB-w\fP][\fB-n\fP]" -Display the global translation table. batctl will refresh the list every second if the "-w" option was given. Use "-n" to let batctl not replace the MAC addresses with bat-host names in the output. +.IP "\fBtransglobal\fP|\fBtg\fP [\fB-w\fP [\fI\interval\fP]][\fB-n\fP]" +Display the global translation table. batctl will refresh the list every second if the "-w" option was given or add a number to let it refresh at a custom interval in seconds (with optional decimal places). Use "-n" to let batctl not replace the MAC addresses with bat-host names in the output. .br .IP "\fBvis_mode|vm\fP [\fBmode\fP]\fP" If no parameter is given the current vis mode is displayed otherwise the parameter is used to set the vis mode.
On Friday, July 02, 2010 02:10:24 Linus Lüssing wrote:
Now functions.d being removed again; adding manpage-entries. Two smaller info-output changes (x.y instead of xxx.xxx; "-%c" in a printf instead of just "%c" when entering an unknown command).
I applied the three patches in revision 1732, 1733 and 1734.
Thanks, Marek
b.a.t.m.a.n@lists.open-mesh.org