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 *);
};
#include "netifd.h"
#include "interface.h"
+#include "proto.h"
#include "ubus.h"
static struct ubus_context *ctx = NULL;
}
+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 },
.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 =