babeld: add rxcost to the ubus add_interface function

Allow to set rxcosts when adding an interface via ubus add_interface
function. Example:

  ubus call babeld add_interface '{"ifname":"eth0", "rxcost":1024}'

Signed-off-by: Nick Hainke <vincent@systemli.org>
This commit is contained in:
Nick Hainke 2022-03-25 13:54:36 +01:00
parent d078190b84
commit a8fe0bfeca
4 changed files with 104 additions and 3 deletions

View file

@ -0,0 +1,50 @@
From 23d4e0d8fdd69caa1644c88dc8e6518edb7fb5b5 Mon Sep 17 00:00:00 2001
From: Nick Hainke <vincent@systemli.org>
Date: Fri, 25 Mar 2022 14:08:58 +0100
Subject: [PATCH] Put add_ifcon to configuration.h
If you want to add an interface with a different config you need to call
add_interface with an interface_conf as an argument. add_interface is
already located in the configuration.h. However, add_ifconf is not
available. The commit puts add_ifcon into the header. Further, it also
adds interface_confs to the header. The add_ifconf requires as a
parameter the interface_confs list.
Signed-off-by: Nick Hainke <vincent@systemli.org>
---
configuration.c | 4 ++--
configuration.h | 2 ++
2 files changed, 4 insertions(+), 2 deletions(-)
--- a/configuration.c
+++ b/configuration.c
@@ -46,7 +46,7 @@ static struct filter *output_filters = N
static struct filter *redistribute_filters = NULL;
static struct filter *install_filters = NULL;
struct interface_conf *default_interface_conf = NULL;
-static struct interface_conf *interface_confs = NULL;
+struct interface_conf *interface_confs = NULL;
/* This indicates whether initial configuration is done. See
finalize_config below. */
@@ -742,7 +742,7 @@ merge_ifconf(struct interface_conf *dest
#undef MERGE
}
-static void
+void
add_ifconf(struct interface_conf *if_conf, struct interface_conf **if_confs)
{
if(*if_confs == NULL) {
--- a/configuration.h
+++ b/configuration.h
@@ -55,7 +55,9 @@ struct filter {
};
extern struct interface_conf *default_interface_conf;
+extern struct interface_conf *interface_confs;
+void add_ifconf(struct interface_conf *if_conf, struct interface_conf **if_confs);
void flush_ifconf(struct interface_conf *if_conf);
int parse_config_from_file(const char *filename, int *line_return);

View file

@ -0,0 +1,39 @@
From 34b67764fd57ce63b9bbe313553471cf5539abe4 Mon Sep 17 00:00:00 2001
From: Nick Hainke <vincent@systemli.org>
Date: Fri, 25 Mar 2022 14:25:14 +0100
Subject: [PATCH] Put merge_ifconf to configuration.h
You want to use default_interface_conf as a basis to write an interface
config. To do so, you write an empty interface config and use
merge_ifconf to merge the default settings into your interface config.
This commit puts merge_ifconf into the header.
Signed-off-by: Nick Hainke <vincent@systemli.org>
---
configuration.c | 2 +-
configuration.h | 3 +++
2 files changed, 4 insertions(+), 1 deletion(-)
--- a/configuration.c
+++ b/configuration.c
@@ -709,7 +709,7 @@ add_filter(struct filter *filter, struct
}
}
-static void
+void
merge_ifconf(struct interface_conf *dest,
const struct interface_conf *src1,
const struct interface_conf *src2)
--- a/configuration.h
+++ b/configuration.h
@@ -59,6 +59,9 @@ extern struct interface_conf *interface_
void add_ifconf(struct interface_conf *if_conf, struct interface_conf **if_confs);
void flush_ifconf(struct interface_conf *if_conf);
+void merge_ifconf(struct interface_conf *dest,
+ const struct interface_conf *src1,
+ const struct interface_conf *src2);
int parse_config_from_file(const char *filename, int *line_return);
int parse_config_from_string(char *string, int n, const char **message_return);

View file

@ -56,11 +56,12 @@ struct neighbour_list_entry {
// Definition of interface function enums (to be used with ubox's blobmsg // Definition of interface function enums (to be used with ubox's blobmsg
// helpers). // helpers).
enum { INTERFACE_IFNAME, __INTERFACE_MAX }; enum { INTERFACE_IFNAME, INTERFACE_RXCOST, __INTERFACE_MAX };
// Definition of interface parsing (to be used with ubox's blobmsg helpers). // Definition of interface parsing (to be used with ubox's blobmsg helpers).
static const struct blobmsg_policy interface_policy[__INTERFACE_MAX] = { static const struct blobmsg_policy interface_policy[__INTERFACE_MAX] = {
[INTERFACE_IFNAME] = {"ifname", BLOBMSG_TYPE_STRING}, [INTERFACE_IFNAME] = {"ifname", BLOBMSG_TYPE_STRING},
[INTERFACE_RXCOST] = {"rxcost", BLOBMSG_TYPE_INT32},
}; };
// Adds an inteface (ubus equivalent to "interface"-function). // Adds an inteface (ubus equivalent to "interface"-function).
@ -72,6 +73,7 @@ static int babeld_ubus_add_interface(struct ubus_context *ctx_local,
struct blob_attr *tb[__INTERFACE_MAX]; struct blob_attr *tb[__INTERFACE_MAX];
struct blob_buf b = {0}; struct blob_buf b = {0};
struct interface *ifp = NULL; struct interface *ifp = NULL;
struct interface_conf *if_conf = NULL;
char *ifname; char *ifname;
blobmsg_parse(interface_policy, __INTERFACE_MAX, tb, blob_data(msg), blobmsg_parse(interface_policy, __INTERFACE_MAX, tb, blob_data(msg),
@ -80,9 +82,19 @@ static int babeld_ubus_add_interface(struct ubus_context *ctx_local,
if (!tb[INTERFACE_IFNAME]) if (!tb[INTERFACE_IFNAME])
return UBUS_STATUS_INVALID_ARGUMENT; return UBUS_STATUS_INVALID_ARGUMENT;
if (tb[INTERFACE_RXCOST]) {
int cost = blobmsg_get_u32(tb[INTERFACE_RXCOST]);
if_conf = calloc(1, sizeof(struct interface_conf));
if (if_conf == NULL)
return UBUS_STATUS_UNKNOWN_ERROR;
if_conf->cost = cost;
//merge_ifconf(if_conf, if_conf, default_interface_conf);
//add_ifconf(if_conf, &interface_confs);
}
ifname = blobmsg_get_string(tb[INTERFACE_IFNAME]); ifname = blobmsg_get_string(tb[INTERFACE_IFNAME]);
ifp = add_interface(ifname, NULL); ifp = add_interface(ifname, if_conf);
if (ifp == NULL) if (ifp == NULL)
return UBUS_STATUS_UNKNOWN_ERROR; return UBUS_STATUS_UNKNOWN_ERROR;

View file

@ -2,7 +2,7 @@
IPC integration of babeld with OpenWrt. IPC integration of babeld with OpenWrt.
The ubus interface offers following functions: The ubus interface offers following functions:
- add_interface '{"ifname":"eth0"}' - add_interface '{"ifname":"eth0", "rxcost":1024}'
- get_info - get_info
- get_neighbours - get_neighbours
- get_xroutes - get_xroutes