ubus: add count test to validate large message sizes
[project/ubus.git] / libubus.h
index 60d9bb6..a63ce31 100644 (file)
--- a/libubus.h
+++ b/libubus.h
@@ -34,10 +34,16 @@ struct ubus_event_handler;
 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,
@@ -67,24 +73,32 @@ typedef void (*ubus_connect_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;
 };
@@ -132,6 +146,7 @@ struct ubus_context {
        struct list_head pending;
 
        struct uloop_fd sock;
+       struct uloop_timeout pending_timer;
 
        uint32_t local_id;
        uint16_t request_seq;
@@ -139,10 +154,9 @@ struct ubus_context {
 
        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 {