From 758a9b8fa89543f6e907cb419128bd2d45bf9898 Mon Sep 17 00:00:00 2001 From: Christof Schulze Date: Sun, 20 Oct 2019 20:52:41 +0200 Subject: [PATCH 1/4] Allow to independently monitor and dump events. 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 monitor neighbour, monitor route, monitor xroute, monitor interface that will exclusively show changes for these structures. --- babeld.man | 13 ++---- configuration.c | 46 +++++++++++++++---- configuration.h | 24 ++++++++-- local.c | 117 +++++++++++++++++++++++++++++++++++++++++------- local.h | 7 ++- 5 files changed, 169 insertions(+), 38 deletions(-) diff --git a/babeld.man b/babeld.man index 814e1834..5f07d21c 100644 --- a/babeld.man +++ b/babeld.man @@ -607,18 +607,13 @@ replies with one or more lines of data terminated by one of or .BR bad . -The following requests are currently defined: -.IP \(bu 2 -any configuration file directive, including -.BR interface ; +All configuration file directives are valid socket requests, including: .IP \(bu -.BR "flush interface" ; +.BR "[flush] interface" .IP \(bu -.BR dump ; +.BR "dump [neighbour|route|xroute|interface]" .IP \(bu -.B monitor -and -.BR unmonitor ; +.BR "[un]monitor [neighbour|route|xroute|interface]" .IP \(bu .BR quit . .SH EXAMPLES diff --git a/configuration.c b/configuration.c index e9787267..4c6b754f 100644 --- a/configuration.c +++ b/configuration.c @@ -969,6 +969,40 @@ parse_option(int c, gnc_t gnc, void *closure, char *token) } +int +parse_monitor_dump_filter(char *token, int *action_return, int c, gnc_t *gnc, void *closure) +{ + char *token2 = NULL; + c = skip_whitespace(c, *gnc, closure); + + c = getword(c, &token2, *gnc, closure); + + int filter = 0; + if(token2) { + if(strcmp(token2, "route") == 0) + filter = FILTER_ROUTE; + else if(strcmp(token2, "interface") == 0) + filter = FILTER_INTERFACE; + else if(strcmp(token2, "xroute") == 0) + filter = FILTER_XROUTE; + else if(strcmp(token2, "neighbour") == 0) + filter = FILTER_NEIGHBOUR; + else + filter = FILTER_INVALID; + free(token2); + } + + c = skip_eol(c, *gnc, closure); + if(filter < FILTER_INVALID) { + *action_return += filter; + if(!filter) // no (invalid) filters detected, show everything + c = -1; + } else { + c = -2; + } + return c; +} + static int parse_config_line(int c, gnc_t gnc, void *closure, int *action_return, const char **message_return) @@ -996,20 +1030,14 @@ 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; + c = parse_monitor_dump_filter(token, action_return, c, &gnc, closure); } else if(strcmp(token, "monitor") == 0) { - c = skip_eol(c, gnc, closure); - if(c < -1 || !action_return) - goto fail; *action_return = CONFIG_ACTION_MONITOR; + c = parse_monitor_dump_filter(token, action_return, c, &gnc, closure); } else if(strcmp(token, "unmonitor") == 0) { - c = skip_eol(c, gnc, closure); - if(c < -1 || !action_return) - goto fail; *action_return = CONFIG_ACTION_UNMONITOR; + c = parse_monitor_dump_filter(token, action_return, c, &gnc, closure); } 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 0ebfd481..cc7272c2 100644 --- a/configuration.h +++ b/configuration.h @@ -25,9 +25,27 @@ 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_NO 7 +#define CONFIG_ACTION_MONITOR 8 +#define CONFIG_ACTION_MONITOR_NEIGHBOUR 9 +#define CONFIG_ACTION_MONITOR_ROUTE 10 +#define CONFIG_ACTION_MONITOR_XROUTE 11 +#define CONFIG_ACTION_MONITOR_INTERFACE 12 +#define CONFIG_ACTION_UNMONITOR 13 +#define CONFIG_ACTION_UNMONITOR_NEIGHBOUR 14 +#define CONFIG_ACTION_UNMONITOR_ROUTE 15 +#define CONFIG_ACTION_UNMONITOR_XROUTE 16 +#define CONFIG_ACTION_UNMONITOR_INTERFACE 17 + +#define FILTER_NEIGHBOUR 1 +#define FILTER_ROUTE 2 +#define FILTER_XROUTE 3 +#define FILTER_INTERFACE 4 +#define FILTER_INVALID 255 struct filter_result { unsigned int add_metric; /* allow = 0, deny = INF, metric = <0..INF> */ diff --git a/local.c b/local.c index 45d07679..e4758772 100644 --- a/local.c +++ b/local.c @@ -133,11 +133,12 @@ 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); } } + static void local_notify_neighbour_1(struct local_socket *s, struct neighbour *neigh, int kind) @@ -188,7 +189,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); } } @@ -225,7 +226,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); } } @@ -270,26 +271,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) { @@ -301,6 +312,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) { @@ -312,9 +329,60 @@ 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_ROUTE)) + local_notify_all_route_1(s); + if(mask & (0x01 << SHOW_XROUTE)) + local_notify_all_xroute_1(s); +} + +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); +} + +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 local_read(struct local_socket *s) { @@ -352,19 +420,36 @@ local_read(struct local_socket *s) shutdown(s->fd, 1); reply[0] = '\0'; break; + 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_1(s); + local_notify_all(s, show_flags_map(rc)); break; case CONFIG_ACTION_MONITOR: + s->monitor = 0xff; local_notify_all_1(s); - s->monitor = 1; + break; + case CONFIG_ACTION_MONITOR_NEIGHBOUR: + case CONFIG_ACTION_MONITOR_INTERFACE: + case CONFIG_ACTION_MONITOR_ROUTE: + case CONFIG_ACTION_MONITOR_XROUTE: + s->monitor |= show_flags_map(rc); + local_notify_all(s, show_flags_map(rc)); + break; + case CONFIG_ACTION_UNMONITOR_NEIGHBOUR: + case CONFIG_ACTION_UNMONITOR_INTERFACE: + case CONFIG_ACTION_UNMONITOR_ROUTE: + case CONFIG_ACTION_UNMONITOR_XROUTE: + s->monitor &= ~show_flags_map(rc); break; case CONFIG_ACTION_UNMONITOR: - s->monitor = 0; + s->monitor = 0x00; break; case CONFIG_ACTION_NO: snprintf(reply, sizeof(reply), "no%s%s\n", - message ? " " : "", message ? message : ""); + message ? " " : "", message ? message : ""); break; default: snprintf(reply, sizeof(reply), "bad\n"); diff --git a/local.h b/local.h index 23161111..0b2c4960 100644 --- a/local.h +++ b/local.h @@ -38,9 +38,14 @@ 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; From 13226d17caae0a898d9ba2e1db54adb8e8690397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonin=20D=C3=A9cimo?= Date: Tue, 21 Apr 2020 18:50:23 +0200 Subject: [PATCH 2/4] Fix nits in independent monitor code. --- configuration.c | 52 ++++++++++++++++++++++++------------------------- local.c | 35 +++++++++++++++------------------ local.h | 8 ++++---- 3 files changed, 46 insertions(+), 49 deletions(-) diff --git a/configuration.c b/configuration.c index 4c6b754f..b4df841b 100644 --- a/configuration.c +++ b/configuration.c @@ -969,38 +969,38 @@ parse_option(int c, gnc_t gnc, void *closure, char *token) } -int -parse_monitor_dump_filter(char *token, int *action_return, int c, gnc_t *gnc, void *closure) +static int +parse_monitor_dump_filter(int *action_return, int c, gnc_t *gnc, void *closure) { - char *token2 = NULL; - c = skip_whitespace(c, *gnc, closure); - - c = getword(c, &token2, *gnc, closure); - int filter = 0; - if(token2) { - if(strcmp(token2, "route") == 0) - filter = FILTER_ROUTE; - else if(strcmp(token2, "interface") == 0) - filter = FILTER_INTERFACE; - else if(strcmp(token2, "xroute") == 0) - filter = FILTER_XROUTE; - else if(strcmp(token2, "neighbour") == 0) - filter = FILTER_NEIGHBOUR; - else - filter = FILTER_INVALID; - free(token2); + char *token = NULL; + + c = skip_whitespace(c, *gnc, closure); + c = getword(c, &token, *gnc, closure); + if(c < -1 || token == NULL) { + free(token); + return c; } + if(strcmp(token, "route") == 0) + filter = FILTER_ROUTE; + else if(strcmp(token, "interface") == 0) + filter = FILTER_INTERFACE; + else if(strcmp(token, "xroute") == 0) + filter = FILTER_XROUTE; + else if(strcmp(token, "neighbour") == 0) + filter = FILTER_NEIGHBOUR; + else + filter = FILTER_INVALID; + free(token); + c = skip_eol(c, *gnc, closure); if(filter < FILTER_INVALID) { *action_return += filter; if(!filter) // no (invalid) filters detected, show everything - c = -1; - } else { - c = -2; + return -1; } - return c; + return -2; } static int @@ -1031,13 +1031,13 @@ parse_config_line(int c, gnc_t gnc, void *closure, *action_return = CONFIG_ACTION_QUIT; } else if(strcmp(token, "dump") == 0) { *action_return = CONFIG_ACTION_DUMP; - c = parse_monitor_dump_filter(token, action_return, c, &gnc, closure); + c = parse_monitor_dump_filter(action_return, c, &gnc, closure); } else if(strcmp(token, "monitor") == 0) { *action_return = CONFIG_ACTION_MONITOR; - c = parse_monitor_dump_filter(token, action_return, c, &gnc, closure); + c = parse_monitor_dump_filter(action_return, c, &gnc, closure); } else if(strcmp(token, "unmonitor") == 0) { *action_return = CONFIG_ACTION_UNMONITOR; - c = parse_monitor_dump_filter(token, action_return, c, &gnc, closure); + c = parse_monitor_dump_filter(action_return, c, &gnc, closure); } 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/local.c b/local.c index e4758772..86573094 100644 --- a/local.c +++ b/local.c @@ -133,12 +133,11 @@ local_notify_interface(struct interface *ifp, int kind) { int i; for(i = 0; i < num_local_sockets; i++) { - if(local_sockets[i].monitor & (0x01 << SHOW_INTERFACE)) + if(local_sockets[i].monitor & SHOW_INTERFACE) local_notify_interface_1(&local_sockets[i], ifp, kind); } } - static void local_notify_neighbour_1(struct local_socket *s, struct neighbour *neigh, int kind) @@ -189,7 +188,7 @@ local_notify_neighbour(struct neighbour *neigh, int kind) { int i; for(i = 0; i < num_local_sockets; i++) { - if(local_sockets[i].monitor & (0x01 << SHOW_NEIGHBOUR)) + if(local_sockets[i].monitor & SHOW_NEIGHBOUR) local_notify_neighbour_1(&local_sockets[i], neigh, kind); } } @@ -226,7 +225,7 @@ local_notify_xroute(struct xroute *xroute, int kind) { int i; for(i = 0; i < num_local_sockets; i++) { - if(local_sockets[i].monitor & (0x01 << SHOW_XROUTE)) + if(local_sockets[i].monitor & SHOW_XROUTE) local_notify_xroute_1(&local_sockets[i], xroute, kind); } } @@ -271,7 +270,7 @@ local_notify_route(struct babel_route *route, int kind) { int i; for(i = 0; i < num_local_sockets; i++) { - if(local_sockets[i].monitor & (0x01 << SHOW_ROUTE)) + if(local_sockets[i].monitor & SHOW_ROUTE) local_notify_route_1(&local_sockets[i], route, kind); } } @@ -334,13 +333,13 @@ local_notify_all_route_1(struct local_socket *s) static void local_notify_all(struct local_socket *s, unsigned int mask) { - if(mask & (0x01 << SHOW_INTERFACE)) + if(mask & SHOW_INTERFACE) local_notify_all_interface_1(s); - if(mask & (0x01 << SHOW_NEIGHBOUR)) + if(mask & SHOW_NEIGHBOUR) local_notify_all_neighbour_1(s); - if(mask & (0x01 << SHOW_ROUTE)) + if(mask & SHOW_ROUTE) local_notify_all_route_1(s); - if(mask & (0x01 << SHOW_XROUTE)) + if(mask & SHOW_XROUTE) local_notify_all_xroute_1(s); } @@ -360,29 +359,27 @@ show_flags_map(int rc) case CONFIG_ACTION_MONITOR_ROUTE: case CONFIG_ACTION_UNMONITOR_ROUTE: case CONFIG_ACTION_DUMP_ROUTE: - return 0x01 << SHOW_ROUTE; + return SHOW_ROUTE; case CONFIG_ACTION_MONITOR_INTERFACE: case CONFIG_ACTION_UNMONITOR_INTERFACE: case CONFIG_ACTION_DUMP_INTERFACE: - return 0x01 << SHOW_INTERFACE; + return SHOW_INTERFACE; case CONFIG_ACTION_MONITOR_XROUTE: case CONFIG_ACTION_UNMONITOR_XROUTE: case CONFIG_ACTION_DUMP_XROUTE: - return 0x01 << SHOW_XROUTE; + return SHOW_XROUTE; case CONFIG_ACTION_MONITOR_NEIGHBOUR: case CONFIG_ACTION_UNMONITOR_NEIGHBOUR: case CONFIG_ACTION_DUMP_NEIGHBOUR: - return 0x01 << SHOW_NEIGHBOUR; + return SHOW_NEIGHBOUR; case CONFIG_ACTION_MONITOR: case CONFIG_ACTION_UNMONITOR: case CONFIG_ACTION_DUMP: - return 0xff; + return ~0U; } - return 0; + return 0U; } - - int local_read(struct local_socket *s) { @@ -445,11 +442,11 @@ local_read(struct local_socket *s) s->monitor &= ~show_flags_map(rc); break; case CONFIG_ACTION_UNMONITOR: - s->monitor = 0x00; + s->monitor = 0U; break; case CONFIG_ACTION_NO: snprintf(reply, sizeof(reply), "no%s%s\n", - message ? " " : "", message ? message : ""); + message ? " " : "", message ? message : ""); break; default: snprintf(reply, sizeof(reply), "bad\n"); diff --git a/local.h b/local.h index 0b2c4960..89247eb2 100644 --- a/local.h +++ b/local.h @@ -41,10 +41,10 @@ struct local_socket { unsigned int monitor; }; -#define SHOW_NEIGHBOUR 1 -#define SHOW_INTERFACE 2 -#define SHOW_ROUTE 3 -#define SHOW_XROUTE 4 +#define SHOW_NEIGHBOUR (1 << 0) +#define SHOW_INTERFACE (1 << 1) +#define SHOW_ROUTE (1 << 2) +#define SHOW_XROUTE (1 << 3) extern int local_server_socket; extern struct local_socket local_sockets[MAX_LOCAL_SOCKETS]; From 1a6ac21565ef2c7b70448e185e66173b814bfe27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonin=20D=C3=A9cimo?= Date: Sun, 20 Dec 2020 22:33:40 +0100 Subject: [PATCH 3/4] Factor codes for configured objects. --- configuration.c | 14 ++++---- configuration.h | 29 ++++++----------- local.c | 86 +++++++++++++++++++++++++------------------------ local.h | 5 --- 4 files changed, 60 insertions(+), 74 deletions(-) diff --git a/configuration.c b/configuration.c index b4df841b..c0bb0877 100644 --- a/configuration.c +++ b/configuration.c @@ -983,13 +983,13 @@ parse_monitor_dump_filter(int *action_return, int c, gnc_t *gnc, void *closure) } if(strcmp(token, "route") == 0) - filter = FILTER_ROUTE; + filter = FILTER(ROUTE); else if(strcmp(token, "interface") == 0) - filter = FILTER_INTERFACE; + filter = FILTER(INTERFACE); else if(strcmp(token, "xroute") == 0) - filter = FILTER_XROUTE; + filter = FILTER(XROUTE); else if(strcmp(token, "neighbour") == 0) - filter = FILTER_NEIGHBOUR; + filter = FILTER(NEIGHBOUR); else filter = FILTER_INVALID; free(token); @@ -1030,13 +1030,13 @@ parse_config_line(int c, gnc_t gnc, void *closure, goto fail; *action_return = CONFIG_ACTION_QUIT; } else if(strcmp(token, "dump") == 0) { - *action_return = CONFIG_ACTION_DUMP; + *action_return = CONFIG_ACTION_DUMP(0); c = parse_monitor_dump_filter(action_return, c, &gnc, closure); } else if(strcmp(token, "monitor") == 0) { - *action_return = CONFIG_ACTION_MONITOR; + *action_return = CONFIG_ACTION_MONITOR(0); c = parse_monitor_dump_filter(action_return, c, &gnc, closure); } else if(strcmp(token, "unmonitor") == 0) { - *action_return = CONFIG_ACTION_UNMONITOR; + *action_return = CONFIG_ACTION_UNMONITOR(0); c = parse_monitor_dump_filter(action_return, c, &gnc, closure); } else if(config_finalised && !local_server_write) { /* The remaining directives are only allowed in read-write mode. */ diff --git a/configuration.h b/configuration.h index cc7272c2..a2ee4e00 100644 --- a/configuration.h +++ b/configuration.h @@ -20,31 +20,20 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* Values returned by parse_config_from_string. */ +#define NEIGHBOUR 1 +#define ROUTE 2 +#define XROUTE 3 +#define INTERFACE 4 +/* Values returned by parse_config_from_string. */ #define CONFIG_ACTION_DONE 0 #define CONFIG_ACTION_QUIT 1 -#define CONFIG_ACTION_DUMP 2 -#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_DUMP(thing) (2 + (thing)) #define CONFIG_ACTION_NO 7 -#define CONFIG_ACTION_MONITOR 8 -#define CONFIG_ACTION_MONITOR_NEIGHBOUR 9 -#define CONFIG_ACTION_MONITOR_ROUTE 10 -#define CONFIG_ACTION_MONITOR_XROUTE 11 -#define CONFIG_ACTION_MONITOR_INTERFACE 12 -#define CONFIG_ACTION_UNMONITOR 13 -#define CONFIG_ACTION_UNMONITOR_NEIGHBOUR 14 -#define CONFIG_ACTION_UNMONITOR_ROUTE 15 -#define CONFIG_ACTION_UNMONITOR_XROUTE 16 -#define CONFIG_ACTION_UNMONITOR_INTERFACE 17 +#define CONFIG_ACTION_MONITOR(thing) (8 + (thing)) +#define CONFIG_ACTION_UNMONITOR(thing) (13 + (thing)) -#define FILTER_NEIGHBOUR 1 -#define FILTER_ROUTE 2 -#define FILTER_XROUTE 3 -#define FILTER_INTERFACE 4 +#define FILTER(thing) (thing) #define FILTER_INVALID 255 struct filter_result { diff --git a/local.c b/local.c index 86573094..8503bf20 100644 --- a/local.c +++ b/local.c @@ -42,6 +42,8 @@ THE SOFTWARE. #include "local.h" #include "version.h" +#define SHOW(thing) (1U << ((thing)-1)) + int local_server_socket = -1; struct local_socket local_sockets[MAX_LOCAL_SOCKETS]; int num_local_sockets = 0; @@ -133,7 +135,7 @@ local_notify_interface(struct interface *ifp, int kind) { int i; for(i = 0; i < num_local_sockets; i++) { - if(local_sockets[i].monitor & SHOW_INTERFACE) + if(local_sockets[i].monitor & SHOW(INTERFACE)) local_notify_interface_1(&local_sockets[i], ifp, kind); } } @@ -188,7 +190,7 @@ local_notify_neighbour(struct neighbour *neigh, int kind) { int i; for(i = 0; i < num_local_sockets; i++) { - if(local_sockets[i].monitor & SHOW_NEIGHBOUR) + if(local_sockets[i].monitor & SHOW(NEIGHBOUR)) local_notify_neighbour_1(&local_sockets[i], neigh, kind); } } @@ -225,7 +227,7 @@ local_notify_xroute(struct xroute *xroute, int kind) { int i; for(i = 0; i < num_local_sockets; i++) { - if(local_sockets[i].monitor & SHOW_XROUTE) + if(local_sockets[i].monitor & SHOW(XROUTE)) local_notify_xroute_1(&local_sockets[i], xroute, kind); } } @@ -270,7 +272,7 @@ local_notify_route(struct babel_route *route, int kind) { int i; for(i = 0; i < num_local_sockets; i++) { - if(local_sockets[i].monitor & SHOW_ROUTE) + if(local_sockets[i].monitor & SHOW(ROUTE)) local_notify_route_1(&local_sockets[i], route, kind); } } @@ -333,13 +335,13 @@ local_notify_all_route_1(struct local_socket *s) static void local_notify_all(struct local_socket *s, unsigned int mask) { - if(mask & SHOW_INTERFACE) + if(mask & SHOW(INTERFACE)) local_notify_all_interface_1(s); - if(mask & SHOW_NEIGHBOUR) + if(mask & SHOW(NEIGHBOUR)) local_notify_all_neighbour_1(s); - if(mask & SHOW_ROUTE) + if(mask & SHOW(ROUTE)) local_notify_all_route_1(s); - if(mask & SHOW_XROUTE) + if(mask & SHOW(XROUTE)) local_notify_all_xroute_1(s); } @@ -356,25 +358,25 @@ 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 SHOW_ROUTE; - case CONFIG_ACTION_MONITOR_INTERFACE: - case CONFIG_ACTION_UNMONITOR_INTERFACE: - case CONFIG_ACTION_DUMP_INTERFACE: - return SHOW_INTERFACE; - case CONFIG_ACTION_MONITOR_XROUTE: - case CONFIG_ACTION_UNMONITOR_XROUTE: - case CONFIG_ACTION_DUMP_XROUTE: - return SHOW_XROUTE; - case CONFIG_ACTION_MONITOR_NEIGHBOUR: - case CONFIG_ACTION_UNMONITOR_NEIGHBOUR: - case CONFIG_ACTION_DUMP_NEIGHBOUR: - return SHOW_NEIGHBOUR; - case CONFIG_ACTION_MONITOR: - case CONFIG_ACTION_UNMONITOR: - case CONFIG_ACTION_DUMP: + case CONFIG_ACTION_MONITOR(ROUTE): + case CONFIG_ACTION_UNMONITOR(ROUTE): + case CONFIG_ACTION_DUMP(ROUTE): + return SHOW(ROUTE); + case CONFIG_ACTION_MONITOR(INTERFACE): + case CONFIG_ACTION_UNMONITOR(INTERFACE): + case CONFIG_ACTION_DUMP(INTERFACE): + return SHOW(INTERFACE); + case CONFIG_ACTION_MONITOR(XROUTE): + case CONFIG_ACTION_UNMONITOR(XROUTE): + case CONFIG_ACTION_DUMP(XROUTE): + return SHOW(XROUTE); + case CONFIG_ACTION_MONITOR(NEIGHBOUR): + case CONFIG_ACTION_UNMONITOR(NEIGHBOUR): + case CONFIG_ACTION_DUMP(NEIGHBOUR): + return SHOW(NEIGHBOUR); + case CONFIG_ACTION_MONITOR(0): + case CONFIG_ACTION_UNMONITOR(0): + case CONFIG_ACTION_DUMP(0): return ~0U; } return 0U; @@ -417,31 +419,31 @@ local_read(struct local_socket *s) shutdown(s->fd, 1); reply[0] = '\0'; break; - case CONFIG_ACTION_DUMP_INTERFACE: - case CONFIG_ACTION_DUMP_ROUTE: - case CONFIG_ACTION_DUMP_XROUTE: - case CONFIG_ACTION_DUMP_NEIGHBOUR: - case CONFIG_ACTION_DUMP: + case CONFIG_ACTION_DUMP(INTERFACE): + case CONFIG_ACTION_DUMP(ROUTE): + case CONFIG_ACTION_DUMP(XROUTE): + case CONFIG_ACTION_DUMP(NEIGHBOUR): + case CONFIG_ACTION_DUMP(0): local_notify_all(s, show_flags_map(rc)); break; - case CONFIG_ACTION_MONITOR: + case CONFIG_ACTION_MONITOR(0): s->monitor = 0xff; local_notify_all_1(s); break; - case CONFIG_ACTION_MONITOR_NEIGHBOUR: - case CONFIG_ACTION_MONITOR_INTERFACE: - case CONFIG_ACTION_MONITOR_ROUTE: - case CONFIG_ACTION_MONITOR_XROUTE: + case CONFIG_ACTION_MONITOR(NEIGHBOUR): + case CONFIG_ACTION_MONITOR(INTERFACE): + case CONFIG_ACTION_MONITOR(ROUTE): + case CONFIG_ACTION_MONITOR(XROUTE): s->monitor |= show_flags_map(rc); local_notify_all(s, show_flags_map(rc)); break; - case CONFIG_ACTION_UNMONITOR_NEIGHBOUR: - case CONFIG_ACTION_UNMONITOR_INTERFACE: - case CONFIG_ACTION_UNMONITOR_ROUTE: - case CONFIG_ACTION_UNMONITOR_XROUTE: + case CONFIG_ACTION_UNMONITOR(NEIGHBOUR): + case CONFIG_ACTION_UNMONITOR(INTERFACE): + case CONFIG_ACTION_UNMONITOR(ROUTE): + case CONFIG_ACTION_UNMONITOR(XROUTE): s->monitor &= ~show_flags_map(rc); break; - case CONFIG_ACTION_UNMONITOR: + case CONFIG_ACTION_UNMONITOR(0): s->monitor = 0U; break; case CONFIG_ACTION_NO: diff --git a/local.h b/local.h index 89247eb2..53d230c2 100644 --- a/local.h +++ b/local.h @@ -41,11 +41,6 @@ struct local_socket { unsigned int monitor; }; -#define SHOW_NEIGHBOUR (1 << 0) -#define SHOW_INTERFACE (1 << 1) -#define SHOW_ROUTE (1 << 2) -#define SHOW_XROUTE (1 << 3) - extern int local_server_socket; extern struct local_socket local_sockets[MAX_LOCAL_SOCKETS]; extern int num_local_sockets; From c45e4e2e189c5c23dabd6628f5863f7db4c23cb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonin=20D=C3=A9cimo?= Date: Sun, 20 Dec 2020 22:39:16 +0100 Subject: [PATCH 4/4] Fix style of flag-is-set test. --- local.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/local.c b/local.c index 8503bf20..5040620a 100644 --- a/local.c +++ b/local.c @@ -135,7 +135,7 @@ local_notify_interface(struct interface *ifp, int kind) { int i; for(i = 0; i < num_local_sockets; i++) { - if(local_sockets[i].monitor & SHOW(INTERFACE)) + if((local_sockets[i].monitor & SHOW(INTERFACE)) != 0) local_notify_interface_1(&local_sockets[i], ifp, kind); } } @@ -190,7 +190,7 @@ local_notify_neighbour(struct neighbour *neigh, int kind) { int i; for(i = 0; i < num_local_sockets; i++) { - if(local_sockets[i].monitor & SHOW(NEIGHBOUR)) + if((local_sockets[i].monitor & SHOW(NEIGHBOUR)) != 0) local_notify_neighbour_1(&local_sockets[i], neigh, kind); } } @@ -227,7 +227,7 @@ local_notify_xroute(struct xroute *xroute, int kind) { int i; for(i = 0; i < num_local_sockets; i++) { - if(local_sockets[i].monitor & SHOW(XROUTE)) + if((local_sockets[i].monitor & SHOW(XROUTE)) != 0) local_notify_xroute_1(&local_sockets[i], xroute, kind); } } @@ -272,7 +272,7 @@ local_notify_route(struct babel_route *route, int kind) { int i; for(i = 0; i < num_local_sockets; i++) { - if(local_sockets[i].monitor & SHOW(ROUTE)) + if((local_sockets[i].monitor & SHOW(ROUTE)) != 0) local_notify_route_1(&local_sockets[i], route, kind); } } @@ -335,13 +335,13 @@ local_notify_all_route_1(struct local_socket *s) static void local_notify_all(struct local_socket *s, unsigned int mask) { - if(mask & SHOW(INTERFACE)) + if((mask & SHOW(INTERFACE)) != 0) local_notify_all_interface_1(s); - if(mask & SHOW(NEIGHBOUR)) + if((mask & SHOW(NEIGHBOUR)) != 0) local_notify_all_neighbour_1(s); - if(mask & SHOW(ROUTE)) + if((mask & SHOW(ROUTE)) != 0) local_notify_all_route_1(s); - if(mask & SHOW(XROUTE)) + if((mask & SHOW(XROUTE)) != 0) local_notify_all_xroute_1(s); }