projects
/
project
/
ubus.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
libubus: use calloc_a for queued msgs to reduce the number of allocations
[project/ubus.git]
/
libubus.h
diff --git
a/libubus.h
b/libubus.h
index bbed052e831c38e2106bb7fe74a1f5e011c67a67..94e5f950f7e6f89221dd05dacefd8cf2ba42b20a 100644
(file)
--- a/
libubus.h
+++ b/
libubus.h
@@
-1,5
+1,5
@@
/*
/*
- * Copyright (C) 2011-201
2
Felix Fietkau <nbd@openwrt.org>
+ * Copyright (C) 2011-201
4
Felix Fietkau <nbd@openwrt.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 2.1
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 2.1
@@
-34,6
+34,11
@@
struct ubus_event_handler;
struct ubus_subscriber;
struct ubus_notify_request;
struct ubus_subscriber;
struct ubus_notify_request;
+struct ubus_msghdr_buf {
+ struct ubus_msghdr hdr;
+ struct blob_attr *data;
+};
+
typedef void (*ubus_lookup_handler_t)(struct ubus_context *ctx,
struct ubus_object_data *obj,
void *priv);
typedef void (*ubus_lookup_handler_t)(struct ubus_context *ctx,
struct ubus_object_data *obj,
void *priv);
@@
-47,9
+52,11
@@
typedef void (*ubus_event_handler_t)(struct ubus_context *ctx, struct ubus_event
const char *type, struct blob_attr *msg);
typedef void (*ubus_data_handler_t)(struct ubus_request *req,
int type, struct blob_attr *msg);
const char *type, struct blob_attr *msg);
typedef void (*ubus_data_handler_t)(struct ubus_request *req,
int type, struct blob_attr *msg);
+typedef void (*ubus_fd_handler_t)(struct ubus_request *req, int fd);
typedef void (*ubus_complete_handler_t)(struct ubus_request *req, int ret);
typedef void (*ubus_notify_complete_handler_t)(struct ubus_notify_request *req,
int idx, int ret);
typedef void (*ubus_complete_handler_t)(struct ubus_request *req, int ret);
typedef void (*ubus_notify_complete_handler_t)(struct ubus_notify_request *req,
int idx, int ret);
+typedef void (*ubus_connect_handler_t)(struct ubus_context *ctx);
#define UBUS_OBJECT_TYPE(_name, _methods) \
{ \
#define UBUS_OBJECT_TYPE(_name, _methods) \
{ \
@@
-59,24
+66,32
@@
typedef void (*ubus_notify_complete_handler_t)(struct ubus_notify_request *req,
.methods = _methods \
}
.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) \
#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) \
}
#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;
struct ubus_method {
const char *name;
ubus_handler_t handler;
+ unsigned long mask;
const struct blobmsg_policy *policy;
int n_policy;
};
const struct blobmsg_policy *policy;
int n_policy;
};
@@
-124,6
+139,7
@@
struct ubus_context {
struct list_head pending;
struct uloop_fd sock;
struct list_head pending;
struct uloop_fd sock;
+ struct uloop_timeout pending_timer;
uint32_t local_id;
uint16_t request_seq;
uint32_t local_id;
uint16_t request_seq;
@@
-131,10
+147,9
@@
struct ubus_context {
void (*connection_lost)(struct ubus_context *ctx);
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 {
};
struct ubus_object_data {
@@
-148,7
+163,10
@@
struct ubus_request_data {
uint32_t object;
uint32_t peer;
uint16_t seq;
uint32_t object;
uint32_t peer;
uint16_t seq;
+
+ /* internal use */
bool deferred;
bool deferred;
+ int fd;
};
struct ubus_request {
};
struct ubus_request {
@@
-166,6
+184,7
@@
struct ubus_request {
ubus_data_handler_t raw_data_cb;
ubus_data_handler_t data_cb;
ubus_data_handler_t raw_data_cb;
ubus_data_handler_t data_cb;
+ ubus_fd_handler_t fd_cb;
ubus_complete_handler_t complete_cb;
struct ubus_context *ctx;
ubus_complete_handler_t complete_cb;
struct ubus_context *ctx;
@@
-182,7
+201,15
@@
struct ubus_notify_request {
uint32_t id[UBUS_MAX_NOTIFY_PEERS + 1];
};
uint32_t id[UBUS_MAX_NOTIFY_PEERS + 1];
};
+struct ubus_auto_conn {
+ struct ubus_context ctx;
+ struct uloop_timeout timer;
+ const char *path;
+ ubus_connect_handler_t cb;
+};
+
struct ubus_context *ubus_connect(const char *path);
struct ubus_context *ubus_connect(const char *path);
+void ubus_auto_connect(struct ubus_auto_conn *conn);
int ubus_reconnect(struct ubus_context *ctx, const char *path);
void ubus_free(struct ubus_context *ctx);
int ubus_reconnect(struct ubus_context *ctx, const char *path);
void ubus_free(struct ubus_context *ctx);
@@
-227,6
+254,13
@@
int ubus_remove_object(struct ubus_context *ctx, struct ubus_object *obj);
/* add a subscriber notifications from another object */
int ubus_register_subscriber(struct ubus_context *ctx, struct ubus_subscriber *obj);
/* add a subscriber notifications from another object */
int ubus_register_subscriber(struct ubus_context *ctx, struct ubus_subscriber *obj);
+
+static inline int
+ubus_unregister_subscriber(struct ubus_context *ctx, struct ubus_subscriber *obj)
+{
+ return ubus_remove_object(ctx, &obj->obj);
+}
+
int ubus_subscribe(struct ubus_context *ctx, struct ubus_subscriber *obj, uint32_t id);
int ubus_unsubscribe(struct ubus_context *ctx, struct ubus_subscriber *obj, uint32_t id);
int ubus_subscribe(struct ubus_context *ctx, struct ubus_subscriber *obj, uint32_t id);
int ubus_unsubscribe(struct ubus_context *ctx, struct ubus_subscriber *obj, uint32_t id);
@@
-253,6
+287,12
@@
static inline void ubus_defer_request(struct ubus_context *ctx,
req->deferred = true;
}
req->deferred = true;
}
+static inline void ubus_request_set_fd(struct ubus_context *ctx,
+ struct ubus_request_data *req, int fd)
+{
+ req->fd = fd;
+}
+
void ubus_complete_deferred_request(struct ubus_context *ctx,
struct ubus_request_data *req, int ret);
void ubus_complete_deferred_request(struct ubus_context *ctx,
struct ubus_request_data *req, int ret);