[3/3] batctl: add unicast/multicast address filter option for TT output

Message ID 1393215104-28184-3-git-send-email-linus.luessing@web.de (mailing list archive)
State Superseded, archived
Headers

Commit Message

Linus Lüssing Feb. 24, 2014, 4:11 a.m. UTC
  This patch adds the new "-u" and "-m" options for the local and global
translation table output to only display announced unicast or multicast
mac addresses to enhance readability.

Signed-off-by: Linus Lüssing <linus.luessing@web.de>
---
 debug.c      |   27 ++++++++++++++++++++++++++-
 functions.c  |   16 ++++++++++++++++
 functions.h  |    2 ++
 man/batctl.8 |    2 ++
 4 files changed, 46 insertions(+), 1 deletion(-)
  

Comments

Antonio Quartulli Feb. 27, 2014, 12:24 p.m. UTC | #1
On 24/02/14 05:11, Linus Lüssing wrote:
> @@ -138,6 +143,26 @@ int handle_debug_table(char *mesh_iface, int debug_table, int argc, char **argv)
>  		case 'H':
>  			read_opt |= SKIP_HEADER;
>  			break;
> +		case 'u':
> +			if (debug_table != BATCTL_TABLE_TRANSLOCAL &&
> +			    debug_table != BATCTL_TABLE_TRANSGLOBAL) {
> +				fprintf(stderr, "Error - unrecognised option '-%c'\n", optchar);
> +				debug_table_usage(debug_table);
> +				return EXIT_FAILURE;
> +			}
> +
> +			read_opt |= UNICAST_ONLY;
> +			break;
> +		case 'm':
> +			if (debug_table != BATCTL_TABLE_TRANSLOCAL &&
> +			    debug_table != BATCTL_TABLE_TRANSGLOBAL) {
> +				fprintf(stderr, "Error - unrecognised option '-%c'\n", optchar);
> +				debug_table_usage(debug_table);
> +				return EXIT_FAILURE;
> +			}
> +
> +			read_opt |= MULTICAST_ONLY;
> +			break;

do we really want to allow the user to specify both flags? Or should we
throw an error in that case? I think the second option would be better, no?

>  		case '?':
>  			if (optopt == 't')
>  				fprintf(stderr, "Error - option '-t' needs a number as argument\n");
> diff --git a/functions.c b/functions.c
> index 36804bd..41eabb2 100644
> --- a/functions.c
> +++ b/functions.c
> @@ -224,6 +224,22 @@ read:
>  			    && (last_seen > orig_timeout))
>  				continue;
>  
> +		/* translation table: skip multicast */
> +		if (line > header_lines &&
> +		    read_opt & UNICAST_ONLY &&
> +		    strlen(line_ptr) > strlen(" * xx:xx:xx:") &&
> +		    (!strncmp(line_ptr+3, "33:33:", strlen("33:33:")) ||
> +		     !strncmp(line_ptr+3, "01:00:5e:", strlen("01:00:5e:"))))
> +			continue;
> +
> +		/* translation table: skip unicast */
> +		if (line > header_lines &&
> +		    read_opt & MULTICAST_ONLY &&
> +		    strlen(line_ptr) > strlen(" * xx:xx:xx:") &&
> +		    strncmp(line_ptr+3, "33:33:", strlen("33:33:")) &&
> +		    strncmp(line_ptr+3, "01:00:5e:", strlen("01:00:5e:")))
> +			continue;
> +

why not just converting to an integer the first octect of the MAC
address and checking for the multicast bit being set or not? Wouldn't
that be more elegant and generic?



Cheers,
  

Patch

diff --git a/debug.c b/debug.c
index 6836857..b8f9a07 100644
--- a/debug.c
+++ b/debug.c
@@ -91,6 +91,11 @@  static void debug_table_usage(int debug_table)
 
 	if (debug_table == BATCTL_TABLE_ORIGINATORS)
 		fprintf(stderr, " \t -t timeout interval - don't print originators not seen for x.y seconds \n");
+	if (debug_table == BATCTL_TABLE_TRANSLOCAL ||
+	    debug_table == BATCTL_TABLE_TRANSGLOBAL) {
+		fprintf(stderr, " \t -u print unicast mac addresses only\n");
+		fprintf(stderr, " \t -m print multicast mac addresses only\n");
+	}
 }
 
 int handle_debug_table(char *mesh_iface, int debug_table, int argc, char **argv)
@@ -102,7 +107,7 @@  int handle_debug_table(char *mesh_iface, int debug_table, int argc, char **argv)
 	float watch_interval = 1;
 	opterr = 0;
 
-	while ((optchar = getopt(argc, argv, "hnw:t:H")) != -1) {
+	while ((optchar = getopt(argc, argv, "hnw:t:Hum")) != -1) {
 		switch (optchar) {
 		case 'h':
 			debug_table_usage(debug_table);
@@ -138,6 +143,26 @@  int handle_debug_table(char *mesh_iface, int debug_table, int argc, char **argv)
 		case 'H':
 			read_opt |= SKIP_HEADER;
 			break;
+		case 'u':
+			if (debug_table != BATCTL_TABLE_TRANSLOCAL &&
+			    debug_table != BATCTL_TABLE_TRANSGLOBAL) {
+				fprintf(stderr, "Error - unrecognised option '-%c'\n", optchar);
+				debug_table_usage(debug_table);
+				return EXIT_FAILURE;
+			}
+
+			read_opt |= UNICAST_ONLY;
+			break;
+		case 'm':
+			if (debug_table != BATCTL_TABLE_TRANSLOCAL &&
+			    debug_table != BATCTL_TABLE_TRANSGLOBAL) {
+				fprintf(stderr, "Error - unrecognised option '-%c'\n", optchar);
+				debug_table_usage(debug_table);
+				return EXIT_FAILURE;
+			}
+
+			read_opt |= MULTICAST_ONLY;
+			break;
 		case '?':
 			if (optopt == 't')
 				fprintf(stderr, "Error - option '-t' needs a number as argument\n");
diff --git a/functions.c b/functions.c
index 36804bd..41eabb2 100644
--- a/functions.c
+++ b/functions.c
@@ -224,6 +224,22 @@  read:
 			    && (last_seen > orig_timeout))
 				continue;
 
+		/* translation table: skip multicast */
+		if (line > header_lines &&
+		    read_opt & UNICAST_ONLY &&
+		    strlen(line_ptr) > strlen(" * xx:xx:xx:") &&
+		    (!strncmp(line_ptr+3, "33:33:", strlen("33:33:")) ||
+		     !strncmp(line_ptr+3, "01:00:5e:", strlen("01:00:5e:"))))
+			continue;
+
+		/* translation table: skip unicast */
+		if (line > header_lines &&
+		    read_opt & MULTICAST_ONLY &&
+		    strlen(line_ptr) > strlen(" * xx:xx:xx:") &&
+		    strncmp(line_ptr+3, "33:33:", strlen("33:33:")) &&
+		    strncmp(line_ptr+3, "01:00:5e:", strlen("01:00:5e:")))
+			continue;
+
 		if (!(read_opt & USE_BAT_HOSTS)) {
 			printf("%s", line_ptr);
 			continue;
diff --git a/functions.h b/functions.h
index 14ba525..43c3d9c 100644
--- a/functions.h
+++ b/functions.h
@@ -57,6 +57,8 @@  enum {
 	NO_OLD_ORIGS = 0x40,
 	COMPAT_FILTER = 0x80,
 	SKIP_HEADER = 0x100,
+	UNICAST_ONLY = 0x200,
+	MULTICAST_ONLY = 0x400,
 };
 
 #endif
diff --git a/man/batctl.8 b/man/batctl.8
index a8e8868..6b43d5e 100644
--- a/man/batctl.8
+++ b/man/batctl.8
@@ -178,6 +178,8 @@  All of the debug tables support the following options:
 The originator table also supports the "\-t" filter option to remove all originators from the output that have not been seen
 for the specified amount of seconds (with optional decimal places).
 
+The local and global translation tables also support the "\-u" and "\-m" option to only display unicast or multicast translation table announcements respectively.
+
 List of debug tables:
 .RS 10
 \- originators|o