b.a.t.m.a.n.lists.open-mesh.org archive mirror
 help / color / mirror / Atom feed
From: "Linus Lüssing" <linus.luessing@web.de>
To: b.a.t.m.a.n@lists.open-mesh.org
Subject: [B.A.T.M.A.N.] [PATCH] batctl: Add an optional interval for watch-mode
Date: Wed, 30 Jun 2010 20:03:14 +0200	[thread overview]
Message-ID: <1277920995-25503-2-git-send-email-linus.luessing@web.de> (raw)
In-Reply-To: <1277920995-25503-1-git-send-email-linus.luessing@web.de>

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     |   79 ++++++++++++++++++++++++++++++++++++---------------
 batctl/functions.c |    7 ++--
 batctl/functions.h |    3 +-
 batctl/sys.c       |    8 ++--
 4 files changed, 66 insertions(+), 31 deletions(-)

diff --git a/batctl/debug.c b/batctl/debug.c
index 04d2ebc..7f0e8f3 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 xxx.xxx 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,32 @@ 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");
+}
+
+/* secstring is a string containing a time in seconds with an optional decimal
+ * dot. secstring has a maxmimum precision of "xxx.xxx".
+ * A return of -1 means an error in conversion. */
+int secstr_to_msecs(char *secstring) {
+	int seconds;
+	int mseconds;
+	char msecs_buff[4];
+	msecs_buff[3] = '\0';
+	memset(msecs_buff, '0', sizeof(msecs_buff)-1);
+
+	if (sscanf(secstring, "%3d.%3s", &seconds,
+			msecs_buff) == 2) {
+		if (strlen(msecs_buff) < 3)
+			msecs_buff[strlen(msecs_buff)] = '0';
+		sscanf(msecs_buff, "%d", &mseconds);
+		mseconds += 1000 * seconds;
+	}
+	else if (sscanf(secstring, "%3d", &seconds) == 1)
+		return (1000 * seconds);
+	else
+		return -1;
+
+	return mseconds;
 }
 
 int handle_debug_table(int argc, char **argv, char *file_path, void table_usage(void))
@@ -75,13 +100,11 @@ 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;
-	int orig_timeout_secs;
-	int orig_timeout_msecs;
-	char msecs_buff[4];
-	memset(msecs_buff, '0', sizeof(msecs_buff));
-	msecs_buff[3] = '\0';
+	int orig_timeout = 0;
+	int watch_interval = 1000;
+	opterr = 0;
 
-	while ((optchar = getopt(argc, argv, "hnwt:")) != -1) {
+	while ((optchar = getopt(argc, argv, "hnw:t:")) != -1) {
 		switch (optchar) {
 		case 'h':
 			table_usage();
@@ -91,6 +114,16 @@ 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;
+			}
+
+			watch_interval = secstr_to_msecs(optarg);
+			if (watch_interval < 0) {
+				printf("Error - provided argument of -w is not a number\n");
+				return EXIT_FAILURE;
+			}
 			break;
 		case 't':
 			if (table_usage != originators_usage) {
@@ -99,22 +132,22 @@ int handle_debug_table(int argc, char **argv, char *file_path, void table_usage(
 			}
 
 			read_opt |= NO_OLD_ORIGS;
-			if (sscanf(optarg, "%3d.%3s", &orig_timeout_secs,
-						msecs_buff) == 2) {
-				if (strlen(msecs_buff) < 3)
-					msecs_buff[strlen(msecs_buff)] = '0';
-				sscanf(msecs_buff, "%d", &orig_timeout_msecs);
-				orig_timeout_msecs += 1000 * orig_timeout_secs;
-			}
-			else if (sscanf(optarg, "%3d", &orig_timeout_secs) == 1) { ; }
-			else {
+			orig_timeout = secstr_to_msecs(optarg);
+			if (orig_timeout < 0) {
 				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;
+			if (optopt == 't')
+				printf("Error - argument -t needs a number\n");
+			
+			if (optopt == 'w') {
+				read_opt |= CLR_CONT_READ;
+				break;
+			}
+
+			return EXIT_FAILURE;
 		default:
 			table_usage();
 			return EXIT_FAILURE;
@@ -128,7 +161,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_msecs);
+	return read_file(full_path, file_path, read_opt, orig_timeout, watch_interval);
 }
 
 static void log_usage(void)
@@ -166,7 +199,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 272e08b..573ecb6 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, int orig_timeout)
+int read_file(char *dir, char *fname, int read_opt,
+	      int orig_timeout, int watch_interval)
 {
 	struct ether_addr *mac_addr;
 	struct bat_host *bat_host;
@@ -223,14 +224,14 @@ written:
 	}
 
 	if (read_opt & CONT_READ) {
-		sleep(1);
+		usleep(1000 * watch_interval);
 		goto read;
 	}
 
 	if (read_opt & CLR_CONT_READ) {
 		if (fp)
 			fclose(fp);
-		sleep(1);
+		usleep(1000 * watch_interval);
 		goto open;
 	}
 
diff --git a/batctl/functions.h b/batctl/functions.h
index 10903e0..0a8666a 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, int orig_timeout);
+int read_file(char *dir, char *path, int read_opt,
+	      int orig_timeout, int 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;
-- 
1.5.6.5


  reply	other threads:[~2010-06-30 18:03 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-30 18:03 [B.A.T.M.A.N.] [PATCH] batctl: Add timeout filtering option for originators Linus Lüssing
2010-06-30 18:03 ` Linus Lüssing [this message]
2010-06-30 19:35 ` Marek Lindner
2010-06-30 22:42   ` Linus Lüssing
2010-06-30 22:29 ` [B.A.T.M.A.N.] Simplifying new interval settings features in batctl Linus Lüssing
2010-06-30 22:29 ` [B.A.T.M.A.N.] [PATCH] batctl: Add timeout filtering option for originators Linus Lüssing
2010-07-01 15:33   ` Marek Lindner
2010-06-30 22:29 ` [B.A.T.M.A.N.] [PATCH] batctl: Add an optional interval for watch-mode Linus Lüssing
2010-07-02  0:10 [B.A.T.M.A.N.] batctl: timeout + refresh-interval, v3 Linus Lüssing
2010-07-02  0:10 ` [B.A.T.M.A.N.] [PATCH] batctl: Add an optional interval for watch-mode Linus Lüssing

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1277920995-25503-2-git-send-email-linus.luessing@web.de \
    --to=linus.luessing@web.de \
    --cc=b.a.t.m.a.n@lists.open-mesh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).