Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 5 additions & 10 deletions babeld.man
Original file line number Diff line number Diff line change
Expand Up @@ -594,20 +594,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
Expand Down
65 changes: 55 additions & 10 deletions configuration.c
Original file line number Diff line number Diff line change
Expand Up @@ -1127,20 +1127,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);
Expand Down
18 changes: 15 additions & 3 deletions configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

#define AUTH_TYPE_NONE 0
#define AUTH_TYPE_SHA256 1
Expand Down
101 changes: 85 additions & 16 deletions local.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,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);
}
}
Expand Down Expand Up @@ -188,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)
if(local_sockets[i].monitor & (0x01 << SHOW_NEIGHBOUR))
local_notify_neighbour_1(&local_sockets[i], neigh, kind);
}
}
Expand Down Expand Up @@ -225,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)
if(local_sockets[i].monitor & (0x01 << SHOW_XROUTE))
local_notify_xroute_1(&local_sockets[i], xroute, kind);
}
}
Expand Down Expand Up @@ -270,26 +270,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) {
Expand All @@ -301,6 +311,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(0);
if(routes) {
Expand All @@ -312,7 +328,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
Expand Down Expand Up @@ -352,15 +409,27 @@ 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_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",
Expand Down
8 changes: 7 additions & 1 deletion local.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down