summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--proto.h1
-rw-r--r--ubus.c17
2 files changed, 18 insertions, 0 deletions
diff --git a/proto.h b/proto.h
index e066b43..c1b97b2 100644
--- a/proto.h
+++ b/proto.h
@@ -28,6 +28,7 @@ struct interface_proto_state {
void (*proto_event)(struct interface_proto_state *, enum interface_proto_event ev);
/* filled in by the protocol handler */
+ int (*notify)(struct interface_proto_state *, struct blob_attr *data);
int (*cb)(struct interface_proto_state *, enum interface_proto_cmd cmd, bool force);
void (*free)(struct interface_proto_state *);
};
diff --git a/ubus.c b/ubus.c
index c8f178c..a8d3e3c 100644
--- a/ubus.c
+++ b/ubus.c
@@ -2,6 +2,7 @@
#include "netifd.h"
#include "interface.h"
+#include "proto.h"
#include "ubus.h"
static struct ubus_context *ctx = NULL;
@@ -241,6 +242,21 @@ netifd_iface_handle_device(struct ubus_context *ctx, struct ubus_object *obj,
}
+static int
+netifd_iface_notify_proto(struct ubus_context *ctx, struct ubus_object *obj,
+ struct ubus_request_data *req, const char *method,
+ struct blob_attr *msg)
+{
+ struct interface *iface;
+
+ iface = container_of(obj, struct interface, ubus);
+
+ if (!iface->proto || !iface->proto->notify)
+ return UBUS_STATUS_NOT_SUPPORTED;
+
+ return iface->proto->notify(iface->proto, msg);
+}
+
static struct ubus_method iface_object_methods[] = {
{ .name = "up", .handler = netifd_handle_up },
{ .name = "down", .handler = netifd_handle_down },
@@ -249,6 +265,7 @@ static struct ubus_method iface_object_methods[] = {
.policy = dev_policy, .n_policy = __DEV_MAX_NOFORCE },
{ .name = "remove_device", .handler = netifd_iface_handle_device,
.policy = dev_policy, .n_policy = __DEV_MAX_NOFORCE },
+ { .name = "notify_proto", .handler = netifd_iface_notify_proto },
};
static struct ubus_object_type iface_object_type =