[Babel-users] [PATCHv4] Allow to independently monitor and dump events for neighbour, interface, route, xroute
Christof Schulze
christof.schulze at gmx.net
Tue Oct 1 09:11:09 BST 2019
On Tue, Oct 01, 2019 at 03:44:56AM +0200, Christof Schulze wrote:
>In large networks there is much traffic on the socket. This induces high load
>even when only a subset of the data is relevant. This commit introduces new
>commands on the socket for:
Sorry about that - in one place tabs were used for indentation instead
of spaces....
>
>* (un)monitor neighbour
>* (un)monitor route
>* (un)monitor xroute,
>* (un)monitor interface
>* dump neighbour
>* dump route
>* dump xroute
>* dump interface
>
>that will exclusively show changes for these structures or disable
>showing specific changes.
>---
> babeld.man | 15 +++----
> configuration.c | 65 +++++++++++++++++++++++++-----
> configuration.h | 18 +++++++--
> local.c | 103 ++++++++++++++++++++++++++++++++++++++++--------
> local.h | 8 +++-
> 5 files changed, 168 insertions(+), 41 deletions(-)
>
>diff --git a/babeld.man b/babeld.man
>index e763723..7fe1906 100644
>--- a/babeld.man
>+++ b/babeld.man
>@@ -612,20 +612,15 @@ replies with one or more lines of data terminated by one of
> or
> .BR bad .
>
>-The following requests are currently defined:
>+All configuration file directives are valid socket requests, including:
> .IP \(bu 2
>-any configuration file directive, including
>-.BR interface ;
>+.BR "[flush] interface"
> .IP \(bu
>-.BR "flush interface" ;
>+.BR "dump [neighbour|route|xroute|interface]"
> .IP \(bu
>-.BR dump ;
>+.BR "[un]monitor [neighbour|route|xroute|interface]"
> .IP \(bu
>-.B monitor
>-and
>-.BR unmonitor ;
>-.IP \(bu
>-.BR quit .
>+.BR quit
> .SH EXAMPLES
> You can participate in a Babel network by simply running
> .IP
>diff --git a/configuration.c b/configuration.c
>index d4d7421..659a99a 100644
>--- a/configuration.c
>+++ b/configuration.c
>@@ -991,20 +991,65 @@ parse_config_line(int c, gnc_t gnc, void *closure,
> goto fail;
> *action_return = CONFIG_ACTION_QUIT;
> } else if(strcmp(token, "dump") == 0) {
>- c = skip_eol(c, gnc, closure);
>- if(c < -1 || !action_return)
>- goto fail;
> *action_return = CONFIG_ACTION_DUMP;
>+ char *token2 = NULL;
>+ c = skip_whitespace(c, gnc, closure);
>+ c = getword(c, &token2, gnc, closure);
>+ if (token2)
>+ {
>+ if (strcmp(token2, "route") == 0)
>+ *action_return = CONFIG_ACTION_DUMP_ROUTE;
>+ else if (strcmp(token2, "interface") == 0)
>+ *action_return = CONFIG_ACTION_DUMP_INTERFACE;
>+ else if (strcmp(token2, "xroute") == 0)
>+ *action_return = CONFIG_ACTION_DUMP_XROUTE;
>+ else if (strcmp(token2, "neighbour") == 0)
>+ *action_return = CONFIG_ACTION_DUMP_NEIGHBOUR;
>+ free(token2);
>+ c = skip_eol(c, gnc, closure);
>+ }
>+ else
>+ c = -1;
> } else if(strcmp(token, "monitor") == 0) {
>- c = skip_eol(c, gnc, closure);
>- if(c < -1 || !action_return)
>- goto fail;
>- *action_return = CONFIG_ACTION_MONITOR;
>+ *action_return = CONFIG_ACTION_MONITOR;
>+ char *token2 = NULL;
>+ c = skip_whitespace(c, gnc, closure);
>+ c = getword(c, &token2, gnc, closure);
>+ if (token2)
>+ {
>+ if (strcmp(token2, "route") == 0)
>+ *action_return = CONFIG_ACTION_MONITOR_ROUTE;
>+ else if (strcmp(token2, "interface") == 0)
>+ *action_return = CONFIG_ACTION_MONITOR_INTERFACE;
>+ else if (strcmp(token2, "xroute") == 0)
>+ *action_return = CONFIG_ACTION_MONITOR_XROUTE;
>+ else if (strcmp(token2, "neighbour") == 0)
>+ *action_return = CONFIG_ACTION_MONITOR_NEIGHBOUR;
>+ free(token2);
>+ c = skip_eol(c, gnc, closure);
>+ }
>+ else
>+ c = -1;
> } else if(strcmp(token, "unmonitor") == 0) {
>- c = skip_eol(c, gnc, closure);
>- if(c < -1 || !action_return)
>- goto fail;
> *action_return = CONFIG_ACTION_UNMONITOR;
>+ char *token2 = NULL;
>+ c = skip_whitespace(c, gnc, closure);
>+ c = getword(c, &token2, gnc, closure);
>+ if (token2)
>+ {
>+ if (strcmp(token2, "route") == 0)
>+ *action_return = CONFIG_ACTION_UNMONITOR_ROUTE;
>+ else if (strcmp(token2, "interface") == 0)
>+ *action_return = CONFIG_ACTION_UNMONITOR_INTERFACE;
>+ else if (strcmp(token2, "xroute") == 0)
>+ *action_return = CONFIG_ACTION_UNMONITOR_XROUTE;
>+ else if (strcmp(token2, "neighbour") == 0)
>+ *action_return = CONFIG_ACTION_UNMONITOR_NEIGHBOUR;
>+ free(token2);
>+ c = skip_eol(c, gnc, closure);
>+ }
>+ else // ummonitor was detected but none of the specialties - unmonitoring everything.
>+ c = -1;
> } else if(config_finalised && !local_server_write) {
> /* The remaining directives are only allowed in read-write mode. */
> c = skip_to_eol(c, gnc, closure);
>diff --git a/configuration.h b/configuration.h
>index 0ebfd48..d12addb 100644
>--- a/configuration.h
>+++ b/configuration.h
>@@ -25,9 +25,21 @@ THE SOFTWARE.
> #define CONFIG_ACTION_DONE 0
> #define CONFIG_ACTION_QUIT 1
> #define CONFIG_ACTION_DUMP 2
>-#define CONFIG_ACTION_MONITOR 3
>-#define CONFIG_ACTION_UNMONITOR 4
>-#define CONFIG_ACTION_NO 5
>+#define CONFIG_ACTION_DUMP_NEIGHBOUR 3
>+#define CONFIG_ACTION_DUMP_ROUTE 4
>+#define CONFIG_ACTION_DUMP_XROUTE 5
>+#define CONFIG_ACTION_DUMP_INTERFACE 6
>+#define CONFIG_ACTION_MONITOR 7
>+#define CONFIG_ACTION_UNMONITOR 8
>+#define CONFIG_ACTION_NO 9
>+#define CONFIG_ACTION_MONITOR_NEIGHBOUR 10
>+#define CONFIG_ACTION_UNMONITOR_NEIGHBOUR 11
>+#define CONFIG_ACTION_MONITOR_ROUTE 12
>+#define CONFIG_ACTION_UNMONITOR_ROUTE 13
>+#define CONFIG_ACTION_MONITOR_XROUTE 14
>+#define CONFIG_ACTION_UNMONITOR_XROUTE 15
>+#define CONFIG_ACTION_MONITOR_INTERFACE 16
>+#define CONFIG_ACTION_UNMONITOR_INTERFACE 17
>
> struct filter_result {
> unsigned int add_metric; /* allow = 0, deny = INF, metric = <0..INF> */
>diff --git a/local.c b/local.c
>index bb8fe8b..91866bf 100644
>--- a/local.c
>+++ b/local.c
>@@ -131,7 +131,7 @@ local_notify_interface(struct interface *ifp, int kind)
> {
> int i;
> for(i = 0; i < num_local_sockets; i++) {
>- if(local_sockets[i].monitor)
>+ if(local_sockets[i].monitor & (0x01 << SHOW_INTERFACE))
> local_notify_interface_1(&local_sockets[i], ifp, kind);
> }
> }
>@@ -186,7 +186,7 @@ local_notify_neighbour(struct neighbour *neigh, int kind)
> {
> int i;
> for(i = 0; i < num_local_sockets; i++) {
>- if(local_sockets[i].monitor)
>+ if(local_sockets[i].monitor & (0x01 << SHOW_NEIGHBOUR))
> local_notify_neighbour_1(&local_sockets[i], neigh, kind);
> }
> }
>@@ -223,7 +223,7 @@ local_notify_xroute(struct xroute *xroute, int kind)
> {
> int i;
> for(i = 0; i < num_local_sockets; i++) {
>- if(local_sockets[i].monitor)
>+ if(local_sockets[i].monitor & (0x01 << SHOW_XROUTE))
> local_notify_xroute_1(&local_sockets[i], xroute, kind);
> }
> }
>@@ -268,26 +268,36 @@ local_notify_route(struct babel_route *route, int kind)
> {
> int i;
> for(i = 0; i < num_local_sockets; i++) {
>- if(local_sockets[i].monitor)
>+ if(local_sockets[i].monitor & (0x01 << SHOW_ROUTE))
> local_notify_route_1(&local_sockets[i], route, kind);
> }
> }
>
>+
> static void
>-local_notify_all_1(struct local_socket *s)
>+local_notify_all_neighbour_1(struct local_socket *s)
> {
>- struct interface *ifp;
> struct neighbour *neigh;
>- struct xroute_stream *xroutes;
>- struct route_stream *routes;
>+
>+ FOR_ALL_NEIGHBOURS(neigh) {
>+ local_notify_neighbour_1(s, neigh, LOCAL_ADD);
>+ }
>+}
>+
>+static void
>+local_notify_all_interface_1(struct local_socket *s)
>+{
>+ struct interface *ifp;
>
> FOR_ALL_INTERFACES(ifp) {
> local_notify_interface_1(s, ifp, LOCAL_ADD);
> }
>+}
>
>- FOR_ALL_NEIGHBOURS(neigh) {
>- local_notify_neighbour_1(s, neigh, LOCAL_ADD);
>- }
>+static void
>+local_notify_all_xroute_1(struct local_socket *s)
>+{
>+ struct xroute_stream *xroutes;
>
> xroutes = xroute_stream();
> if(xroutes) {
>@@ -299,6 +309,12 @@ local_notify_all_1(struct local_socket *s)
> }
> xroute_stream_done(xroutes);
> }
>+}
>+
>+static void
>+local_notify_all_route_1(struct local_socket *s)
>+{
>+ struct route_stream *routes;
>
> routes = route_stream(ROUTE_ALL);
> if(routes) {
>@@ -310,7 +326,48 @@ local_notify_all_1(struct local_socket *s)
> }
> route_stream_done(routes);
> }
>- return;
>+}
>+
>+static void
>+local_notify_all(struct local_socket *s, unsigned int mask)
>+{
>+ if(mask & (0x01 << SHOW_INTERFACE))
>+ local_notify_all_interface_1(s);
>+ if(mask & (0x01 << SHOW_NEIGHBOUR))
>+ local_notify_all_neighbour_1(s);
>+ if(mask & (0x01 << SHOW_XROUTE))
>+ local_notify_all_xroute_1(s);
>+ if(mask & (0x01 << SHOW_ROUTE))
>+ local_notify_all_route_1(s);
>+}
>+
>+
>+static unsigned int
>+show_flags_map(int rc)
>+{
>+ switch(rc) {
>+ case CONFIG_ACTION_MONITOR_ROUTE:
>+ case CONFIG_ACTION_UNMONITOR_ROUTE:
>+ case CONFIG_ACTION_DUMP_ROUTE:
>+ return 0x01 << SHOW_ROUTE;
>+ case CONFIG_ACTION_MONITOR_INTERFACE:
>+ case CONFIG_ACTION_UNMONITOR_INTERFACE:
>+ case CONFIG_ACTION_DUMP_INTERFACE:
>+ return 0x01 << SHOW_INTERFACE;
>+ case CONFIG_ACTION_MONITOR_XROUTE:
>+ case CONFIG_ACTION_UNMONITOR_XROUTE:
>+ case CONFIG_ACTION_DUMP_XROUTE:
>+ return 0x01 << SHOW_XROUTE;
>+ case CONFIG_ACTION_MONITOR_NEIGHBOUR:
>+ case CONFIG_ACTION_UNMONITOR_NEIGHBOUR:
>+ case CONFIG_ACTION_DUMP_NEIGHBOUR:
>+ return 0x01 << SHOW_NEIGHBOUR;
>+ case CONFIG_ACTION_MONITOR:
>+ case CONFIG_ACTION_UNMONITOR:
>+ case CONFIG_ACTION_DUMP:
>+ return 0xff;
>+ }
>+ return 0;
> }
>
> int
>@@ -350,15 +407,27 @@ local_read(struct local_socket *s)
> shutdown(s->fd, 1);
> reply[0] = '\0';
> break;
>- case CONFIG_ACTION_DUMP:
>- local_notify_all_1(s);
>+ case CONFIG_ACTION_DUMP_INTERFACE:
>+ case CONFIG_ACTION_DUMP_ROUTE:
>+ case CONFIG_ACTION_DUMP_XROUTE:
>+ case CONFIG_ACTION_DUMP_NEIGHBOUR:
>+ case CONFIG_ACTION_DUMP:
>+ local_notify_all(s, show_flags_map(rc));
> break;
>+ case CONFIG_ACTION_MONITOR_INTERFACE:
>+ case CONFIG_ACTION_MONITOR_ROUTE:
>+ case CONFIG_ACTION_MONITOR_XROUTE:
>+ case CONFIG_ACTION_MONITOR_NEIGHBOUR:
> case CONFIG_ACTION_MONITOR:
>- local_notify_all_1(s);
>- s->monitor = 1;
>+ s->monitor |= show_flags_map(rc);
>+ local_notify_all(s, show_flags_map(rc));
> break;
>+ case CONFIG_ACTION_UNMONITOR_INTERFACE:
>+ case CONFIG_ACTION_UNMONITOR_ROUTE:
>+ case CONFIG_ACTION_UNMONITOR_XROUTE:
>+ case CONFIG_ACTION_UNMONITOR_NEIGHBOUR:
> case CONFIG_ACTION_UNMONITOR:
>- s->monitor = 0;
>+ s->monitor &= ~show_flags_map(rc);
> break;
> case CONFIG_ACTION_NO:
> snprintf(reply, sizeof(reply), "no%s%s\n",
>diff --git a/local.h b/local.h
>index 2316111..9d3929e 100644
>--- a/local.h
>+++ b/local.h
>@@ -38,9 +38,15 @@ struct local_socket {
> int fd;
> char *buf;
> int n;
>- int monitor;
>+ unsigned int monitor;
> };
>
>+#define SHOW_NEIGHBOUR 1
>+#define SHOW_INTERFACE 2
>+#define SHOW_ROUTE 3
>+#define SHOW_XROUTE 4
>+
>+
> extern int local_server_socket;
> extern struct local_socket local_sockets[MAX_LOCAL_SOCKETS];
> extern int num_local_sockets;
--
() ascii ribbon campaign - against html e-mail
/\ www.asciiribbon.org - against proprietary attachments
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
URL: <http://alioth-lists.debian.net/pipermail/babel-users/attachments/20191001/5338afb0/attachment.sig>
More information about the Babel-users
mailing list