[Babel-users] [PATCH] Allow to independently monitor events for neighbour, interface, route, xroute
Christof Schulze
christof.schulze at gmx.net
Wed Nov 28 21:52:17 GMT 2018
In large networks there is much traffic on the socket. This induces
load even when only a subset of the data is relevant. This commit
introduces new commands on the socket for neighbour-monitor,
route-monitor, xroute-monitor, interface-monitor that will exclusively
show changes for these structures.
---
babeld.man | 16 ++++++++++++
configuration.c | 40 ++++++++++++++++++++++++++++
configuration.h | 8 ++++++
local.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++----------
local.h | 7 ++++-
5 files changed, 137 insertions(+), 15 deletions(-)
diff --git a/babeld.man b/babeld.man
index cde4a2a..a05c82c 100644
--- a/babeld.man
+++ b/babeld.man
@@ -619,6 +619,22 @@ any configuration file directive, including
and
.BR unmonitor ;
.IP \(bu
+.B neighbour-monitor
+and
+.BR neighbour-unmonitor ;
+.IP \(bu
+.B route-monitor
+and
+.BR route-unmonitor ;
+.IP \(bu
+.B xroute-monitor
+and
+.BR xroute-unmonitor ;
+.IP \(bu
+.B interface-monitor
+and
+.BR interface-unmonitor ;
+.IP \(bu
.BR quit .
.SH EXAMPLES
You can participate in a Babel network by simply running
diff --git a/configuration.c b/configuration.c
index 6a11d53..cf0287f 100644
--- a/configuration.c
+++ b/configuration.c
@@ -986,6 +986,46 @@ parse_config_line(int c, gnc_t gnc, void *closure,
if(c < -1 || !action_return)
goto fail;
*action_return = CONFIG_ACTION_DUMP;
+ } else if(strcmp(token, "neighbour-monitor") == 0) {
+ c = skip_eol(c, gnc, closure);
+ if(c < -1 || !action_return)
+ goto fail;
+ *action_return = CONFIG_ACTION_NEIGHBOUR_MONITOR;
+ } else if(strcmp(token, "neighbour-unmonitor") == 0) {
+ c = skip_eol(c, gnc, closure);
+ if(c < -1 || !action_return)
+ goto fail;
+ *action_return = CONFIG_ACTION_NEIGHBOUR_UNMONITOR;
+ } else if(strcmp(token, "route-monitor") == 0) {
+ c = skip_eol(c, gnc, closure);
+ if(c < -1 || !action_return)
+ goto fail;
+ *action_return = CONFIG_ACTION_ROUTE_MONITOR;
+ } else if(strcmp(token, "route-unmonitor") == 0) {
+ c = skip_eol(c, gnc, closure);
+ if(c < -1 || !action_return)
+ goto fail;
+ *action_return = CONFIG_ACTION_ROUTE_UNMONITOR;
+ } else if(strcmp(token, "xroute-monitor") == 0) {
+ c = skip_eol(c, gnc, closure);
+ if(c < -1 || !action_return)
+ goto fail;
+ *action_return = CONFIG_ACTION_XROUTE_MONITOR;
+ } else if(strcmp(token, "xroute-unmonitor") == 0) {
+ c = skip_eol(c, gnc, closure);
+ if(c < -1 || !action_return)
+ goto fail;
+ *action_return = CONFIG_ACTION_XROUTE_UNMONITOR;
+ } else if(strcmp(token, "interface-monitor") == 0) {
+ c = skip_eol(c, gnc, closure);
+ if(c < -1 || !action_return)
+ goto fail;
+ *action_return = CONFIG_ACTION_INTERFACE_MONITOR;
+ } else if(strcmp(token, "interface-unmonitor") == 0) {
+ c = skip_eol(c, gnc, closure);
+ if(c < -1 || !action_return)
+ goto fail;
+ *action_return = CONFIG_ACTION_INTERFACE_UNMONITOR;
} else if(strcmp(token, "monitor") == 0) {
c = skip_eol(c, gnc, closure);
if(c < -1 || !action_return)
diff --git a/configuration.h b/configuration.h
index de2b1ba..8c7d395 100644
--- a/configuration.h
+++ b/configuration.h
@@ -28,6 +28,14 @@ THE SOFTWARE.
#define CONFIG_ACTION_MONITOR 3
#define CONFIG_ACTION_UNMONITOR 4
#define CONFIG_ACTION_NO 5
+#define CONFIG_ACTION_NEIGHBOUR_MONITOR 6
+#define CONFIG_ACTION_NEIGHBOUR_UNMONITOR 7
+#define CONFIG_ACTION_ROUTE_MONITOR 8
+#define CONFIG_ACTION_ROUTE_UNMONITOR 9
+#define CONFIG_ACTION_XROUTE_MONITOR 10
+#define CONFIG_ACTION_XROUTE_UNMONITOR 11
+#define CONFIG_ACTION_INTERFACE_MONITOR 12
+#define CONFIG_ACTION_INTERFACE_UNMONITOR 13
struct filter_result {
unsigned int add_metric; /* allow = 0, deny = INF, metric = <0..INF> */
diff --git a/local.c b/local.c
index bb8fe8b..434b463 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 << MONITOR_INTERFACE)) != 0x00 )
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 << MONITOR_NEIGHBOUR)) != 0x00 )
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 << MONITOR_XROUTE)) != 0x00 )
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 << MONITOR_ROUTE)) != 0x00 )
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,16 @@ local_notify_all_1(struct local_socket *s)
}
route_stream_done(routes);
}
- return;
+}
+
+
+static void
+local_notify_all_1(struct local_socket *s)
+{
+ local_notify_all_interface_1(s);
+ local_notify_all_neighbour_1(s);
+ local_notify_all_xroute_1(s);
+ local_notify_all_route_1(s);
}
int
@@ -353,12 +378,40 @@ local_read(struct local_socket *s)
case CONFIG_ACTION_DUMP:
local_notify_all_1(s);
break;
+ case CONFIG_ACTION_INTERFACE_MONITOR:
+ s->monitor |= 0x01 << MONITOR_INTERFACE;
+ local_notify_all_interface_1(s);
+ break;
+ case CONFIG_ACTION_INTERFACE_UNMONITOR:
+ s->monitor &= ~( 0x01 << MONITOR_INTERFACE );
+ break;
+ case CONFIG_ACTION_ROUTE_MONITOR:
+ s->monitor |= 0x01 << MONITOR_ROUTE;
+ local_notify_all_route_1(s);
+ break;
+ case CONFIG_ACTION_ROUTE_UNMONITOR:
+ s->monitor &= ~( 0x01 << MONITOR_ROUTE );
+ break;
+ case CONFIG_ACTION_XROUTE_MONITOR:
+ s->monitor |= 0x01 << MONITOR_XROUTE;
+ local_notify_all_xroute_1(s);
+ break;
+ case CONFIG_ACTION_XROUTE_UNMONITOR:
+ s->monitor &= ~( 0x01 << MONITOR_XROUTE );
+ break;
+ case CONFIG_ACTION_NEIGHBOUR_MONITOR:
+ s->monitor |= 0x01 << MONITOR_NEIGHBOUR;
+ local_notify_all_neighbour_1(s);
+ break;
+ case CONFIG_ACTION_NEIGHBOUR_UNMONITOR:
+ s->monitor &= ~( 0x01 << MONITOR_NEIGHBOUR );
+ break;
case CONFIG_ACTION_MONITOR:
+ s->monitor = 0xff;
local_notify_all_1(s);
- s->monitor = 1;
break;
case CONFIG_ACTION_UNMONITOR:
- s->monitor = 0;
+ s->monitor = 0x00;
break;
case CONFIG_ACTION_NO:
snprintf(reply, sizeof(reply), "no%s%s\n",
diff --git a/local.h b/local.h
index 2316111..6734527 100644
--- a/local.h
+++ b/local.h
@@ -38,9 +38,14 @@ struct local_socket {
int fd;
char *buf;
int n;
- int monitor;
+ uint8_t monitor;
};
+#define MONITOR_NEIGHBOUR 1
+#define MONITOR_INTERFACE 2
+#define MONITOR_ROUTE 3
+#define MONITOR_XROUTE 4
+
extern int local_server_socket;
extern struct local_socket local_sockets[MAX_LOCAL_SOCKETS];
extern int num_local_sockets;
--
2.11.0
More information about the Babel-users
mailing list