struct ubus_subscriber;
struct ubus_notify_request;
+struct ubus_msghdr_buf {
+ struct ubus_msghdr hdr;
+ struct blob_attr *data;
+};
+
static inline struct blob_attr *
ubus_msghdr_data(struct ubus_msghdr *hdr)
{
- return (struct blob_attr *) (hdr + 1);
+ struct ubus_msghdr_buf *hdrbuf = container_of(hdr, typeof(*hdrbuf), hdr);
+ return hdrbuf->data;
}
typedef void (*ubus_lookup_handler_t)(struct ubus_context *ctx,
.methods = _methods \
}
+#define __UBUS_METHOD_NOARG(_name, _handler) \
+ .name = _name, \
+ .handler = _handler
+
+#define __UBUS_METHOD(_name, _handler, _policy) \
+ __UBUS_METHOD_NOARG(_name, _handler), \
+ .policy = _policy, \
+ .n_policy = ARRAY_SIZE(_policy)
+
#define UBUS_METHOD(_name, _handler, _policy) \
+ { __UBUS_METHOD(_name, _handler, _policy) }
+
+#define UBUS_METHOD_MASK(_name, _handler, _policy, _mask) \
{ \
- .name = _name, \
- .handler = _handler, \
- .policy = _policy, \
- .n_policy = ARRAY_SIZE(_policy) \
+ __UBUS_METHOD(_name, _handler, _policy),\
+ .mask = _mask \
}
#define UBUS_METHOD_NOARG(_name, _handler) \
- { \
- .name = _name, \
- .handler = _handler, \
- }
+ { __UBUS_METHOD_NOARG(_name, _handler) }
struct ubus_method {
const char *name;
ubus_handler_t handler;
+ unsigned long mask;
const struct blobmsg_policy *policy;
int n_policy;
};
struct list_head pending;
struct uloop_fd sock;
+ struct uloop_timeout pending_timer;
uint32_t local_id;
uint16_t request_seq;
void (*connection_lost)(struct ubus_context *ctx);
- struct {
- struct ubus_msghdr hdr;
- char data[UBUS_MAX_MSGLEN];
- } msgbuf;
+ struct ubus_msghdr_buf msgbuf;
+ uint32_t msgbuf_data_len;
+ int msgbuf_reduction_counter;
};
struct ubus_object_data {