A better integration of babeld with OpenWrt is to connect the daemon to the IPC. So far, we can only communicate via a websocket. With ubus we can send and receive commands in json format. The commit adds a ubus interface to babeld with following functions: - get_info - get_neighbours - get_xroutes - get_routes All output is divided into IPv4 and IPv6. Ubus has to be enabled by setting "config general" option 'ubus_bindings' 'true' Example: root@OpenWrt:~# ubus call babeld get_info { "babeld-version": "babeld-1.9.2", "my-id": "32:xx:xx:xx:xx:xx:xx:xx", "host": "OpenWrt" } root@OpenWrt:~# ubus call babeld get_neighbours { "IPv4": { }, "IPv6": { "fe80::xx:xx:xx:xxx": { "dev": "br-lan", "hello-reach": 65408, "uhello-reach": 0, "rxcost": 96, "txcost": 96, "rtt": 4338271, "channel": -2, "if_up": true } } } root@OpenWrt:~# ubus call babeld get_xroutes { "IPv4": { "10.0.0.3/32": { "src-prefix": "0.0.0.0/0", "metric": 0 }, "10.0.0.0/24": { "src-prefix": "0.0.0.0/0", "metric": 0 } }, "IPv6": { "fdfa:xx:xx::1/128": { "src-prefix": "::/0", "metric": 0 } } } root@OpenWrt:~# ubus call babeld get_routes { "IPv4": { "10.2.0.1/32": { "src-prefix": "0.0.0.0/0", "route_metric": 96, "route_smoothed_metric": 96, "refmetric": 0, "id": "62:xx:xx:xx:xx:xx:xx:xx", "seqno": 41381, "channels": "", "age": 17, "via": "fe80::xx:xxxx:xxxx:xxxx", "nexthop": " nexthop ", "installed": true, "feasible": true }, "IPv6": { } } Additional IPC functionality will follow. Further, we changed the version to $version-ubus-mod. Signed-off-by: Nick Hainke <vincent@systemli.org>
93 lines
2.9 KiB
Diff
93 lines
2.9 KiB
Diff
--- a/babeld.c
|
|
+++ b/babeld.c
|
|
@@ -55,6 +55,8 @@ THE SOFTWARE.
|
|
#include "rule.h"
|
|
#include "version.h"
|
|
|
|
+#include "ubus.h"
|
|
+
|
|
struct timeval now;
|
|
|
|
unsigned char myid[8];
|
|
@@ -536,6 +538,9 @@ main(int argc, char **argv)
|
|
}
|
|
}
|
|
|
|
+ if(ubus_bindings)
|
|
+ babeld_add_ubus();
|
|
+
|
|
init_signals();
|
|
rc = resize_receive_buffer(1500);
|
|
if(rc < 0)
|
|
@@ -635,6 +640,8 @@ main(int argc, char **argv)
|
|
FD_SET(local_sockets[i].fd, &readfds);
|
|
maxfd = MAX(maxfd, local_sockets[i].fd);
|
|
}
|
|
+ if(ubus_bindings)
|
|
+ maxfd = babeld_ubus_add_read_sock(&readfds, maxfd);
|
|
rc = select(maxfd + 1, &readfds, NULL, NULL, &tv);
|
|
if(rc < 0) {
|
|
if(errno != EINTR) {
|
|
@@ -703,6 +710,9 @@ main(int argc, char **argv)
|
|
i++;
|
|
}
|
|
|
|
+ if(ubus_bindings)
|
|
+ babeld_ubus_receive(&readfds);
|
|
+
|
|
if(reopening) {
|
|
kernel_dump_time = now.tv_sec;
|
|
check_neighbours_timeout = now;
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -11,11 +11,11 @@ LDLIBS = -lrt
|
|
|
|
SRCS = babeld.c net.c kernel.c util.c interface.c source.c neighbour.c \
|
|
route.c xroute.c message.c resend.c configuration.c local.c \
|
|
- disambiguation.c rule.c
|
|
+ disambiguation.c rule.c ubus.c
|
|
|
|
OBJS = babeld.o net.o kernel.o util.o interface.o source.o neighbour.o \
|
|
route.o xroute.o message.o resend.o configuration.o local.o \
|
|
- disambiguation.o rule.o
|
|
+ disambiguation.o rule.o ubus.o
|
|
|
|
babeld: $(OBJS)
|
|
$(CC) $(CFLAGS) $(LDFLAGS) -o babeld $(OBJS) $(LDLIBS)
|
|
--- a/generate-version.sh
|
|
+++ b/generate-version.sh
|
|
@@ -10,4 +10,4 @@ else
|
|
version="unknown"
|
|
fi
|
|
|
|
-echo "#define BABELD_VERSION \"$version\""
|
|
+echo "#define BABELD_VERSION \"$version-ubus-mod\""
|
|
--- a/configuration.c
|
|
+++ b/configuration.c
|
|
@@ -41,6 +41,7 @@ THE SOFTWARE.
|
|
#include "kernel.h"
|
|
#include "configuration.h"
|
|
#include "rule.h"
|
|
+#include "ubus.h"
|
|
|
|
static struct filter *input_filters = NULL;
|
|
static struct filter *output_filters = NULL;
|
|
@@ -850,7 +851,8 @@ parse_option(int c, gnc_t gnc, void *clo
|
|
strcmp(token, "daemonise") == 0 ||
|
|
strcmp(token, "skip-kernel-setup") == 0 ||
|
|
strcmp(token, "ipv6-subtrees") == 0 ||
|
|
- strcmp(token, "reflect-kernel-metric") == 0) {
|
|
+ strcmp(token, "reflect-kernel-metric") == 0 ||
|
|
+ strcmp(token, "ubus-bindings") == 0) {
|
|
int b;
|
|
c = getbool(c, &b, gnc, closure);
|
|
if(c < -1)
|
|
@@ -868,6 +870,8 @@ parse_option(int c, gnc_t gnc, void *clo
|
|
has_ipv6_subtrees = b;
|
|
else if(strcmp(token, "reflect-kernel-metric") == 0)
|
|
reflect_kernel_metric = b;
|
|
+ else if(strcmp(token, "ubus-bindings") == 0)
|
|
+ ubus_bindings = b;
|
|
else
|
|
abort();
|
|
} else if(strcmp(token, "protocol-group") == 0) {
|