babeld: add add_interface function
authorNick Hainke <vincent@systemli.org>
Mon, 31 Jan 2022 22:14:22 +0000 (23:14 +0100)
committerNick Hainke <vincent@systemli.org>
Tue, 1 Feb 2022 19:05:53 +0000 (20:05 +0100)
An interface can be added dynmiacally to babeld by starting babeld with
the local management interface (-G) and saying:
  interface eth0

Add the ubus equivalent of this function:
  ubus call babeld add_interface '{"ifname":"eth0"}'

Signed-off-by: Nick Hainke <vincent@systemli.org>
babeld/src/ubus.c
babeld/src/ubus.h

index d22a5bda0148ceb7b8be56f0ba378e9063656364..ff37cd3a6c4bdc917be2f370d944e6b99ca3df79 100644 (file)
@@ -54,6 +54,42 @@ struct neighbour_list_entry {
   struct neighbour *neighbour;
 };
 
+// Definition of interface function enums (to be used with ubox's blobmsg
+// helpers).
+enum { INTERFACE_IFNAME, __INTERFACE_MAX };
+
+// Definition of interface parsing (to be used with ubox's blobmsg helpers).
+static const struct blobmsg_policy interface_policy[__INTERFACE_MAX] = {
+    [INTERFACE_IFNAME] = {"ifname", BLOBMSG_TYPE_STRING},
+};
+
+// Adds an inteface (ubus equivalent to "interface"-function).
+static int babeld_ubus_add_interface(struct ubus_context *ctx_local,
+                                     struct ubus_object *obj,
+                                     struct ubus_request_data *req,
+                                     const char *method,
+                                     struct blob_attr *msg) {
+  struct blob_attr *tb[__INTERFACE_MAX];
+  struct blob_buf b = {0};
+  struct interface *ifp = NULL;
+  int ret;
+  char *ifname;
+
+  blobmsg_parse(interface_policy, __INTERFACE_MAX, tb, blob_data(msg),
+                blob_len(msg));
+
+  if (!tb[INTERFACE_IFNAME])
+    return UBUS_STATUS_INVALID_ARGUMENT;
+
+  ifname = blobmsg_get_string(tb[INTERFACE_IFNAME]);
+
+  ifp = add_interface(ifname, NULL);
+  if (ifp == NULL)
+    return UBUS_STATUS_UNKNOWN_ERROR;
+
+  return UBUS_STATUS_OK;
+}
+
 // Sends a babel info message on ubus socket.
 static int babeld_ubus_babeld_info(struct ubus_context *ctx_local,
                                    struct ubus_object *obj,
@@ -328,6 +364,7 @@ static int babeld_ubus_get_neighbours(struct ubus_context *ctx_local,
 
 // List of functions we expose via the ubus bus.
 static const struct ubus_method babeld_methods[] = {
+    UBUS_METHOD("add_interface", babeld_ubus_add_interface, interface_policy),
     UBUS_METHOD_NOARG("get_info", babeld_ubus_babeld_info),
     UBUS_METHOD_NOARG("get_xroutes", babeld_ubus_get_xroutes),
     UBUS_METHOD_NOARG("get_routes", babeld_ubus_get_routes),
index 1dd5e6e3c670d407681667c6bbb9496d17c11cd2..951fee576d1653cc39173a593920da73fc9f84b4 100644 (file)
@@ -2,6 +2,7 @@
     IPC integration of babeld with OpenWrt.
 
     The ubus interface offers following functions:
+    - add_interface '{"ifname":"eth0"}'
     - get_info
     - get_neighbours
     - get_xroutes