summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnout Vandecappelle (Essensium/Mind) <arnout@mind.be>2021-03-25 22:45:02 +0100
committerFelix Fietkau <nbd@nbd.name>2021-05-31 18:39:31 +0200
commitc736e47f3e2ad8f895306e9917f7bd6143fd29d9 (patch)
treecfab7d33637343cb6a1618cbf893e22ed935a4e2
parent4becbd67de5867ec32a53cb15566a6ef505f4619 (diff)
downloadubus-c736e47f3e2ad8f895306e9917f7bd6143fd29d9.tar.gz
ubusd: add per-client tx queue limit
No new message can be enqueued if this brings the total queue length of that client over UBUS_CLIENT_MAX_TXQ_LEN. Set UBUS_CLIENT_MAX_TXQ_LEN to UBUS_MAX_MSGLEN, i.e. 1MB. This limit should be plenty for any practical use case. Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
-rw-r--r--ubusd.c5
-rw-r--r--ubusd.h2
-rw-r--r--ubusd_main.c1
3 files changed, 8 insertions, 0 deletions
diff --git a/ubusd.c b/ubusd.c
index c324c70..0e1b0c9 100644
--- a/ubusd.c
+++ b/ubusd.c
@@ -144,6 +144,9 @@ static void ubus_msg_enqueue(struct ubus_client *cl, struct ubus_msg_buf *ub)
{
struct ubus_msg_buf_list *ubl;
+ if (cl->txq_len + ub->len > UBUS_CLIENT_MAX_TXQ_LEN)
+ return;
+
ubl = calloc(1, sizeof(struct ubus_msg_buf_list));
if (!ubl)
return;
@@ -152,6 +155,7 @@ static void ubus_msg_enqueue(struct ubus_client *cl, struct ubus_msg_buf *ub)
ubl->msg = ubus_msg_ref(ub);
list_add_tail(&cl->tx_queue, &ubl->list);
+ cl->txq_len += ub->len;
}
/* takes the msgbuf reference */
@@ -172,6 +176,7 @@ void ubus_msg_send(struct ubus_client *cl, struct ubus_msg_buf *ub)
return;
cl->txq_ofs = written;
+ cl->txq_len = -written;
/* get an event once we can write to the socket again */
uloop_fd_add(&cl->sock, ULOOP_READ | ULOOP_WRITE | ULOOP_EDGE_TRIGGER);
diff --git a/ubusd.h b/ubusd.h
index f34cba1..c5d6d2a 100644
--- a/ubusd.h
+++ b/ubusd.h
@@ -24,6 +24,7 @@
#include "ubusd_acl.h"
#define UBUS_OBJ_HASH_BITS 4
+#define UBUS_CLIENT_MAX_TXQ_LEN UBUS_MAX_MSGLEN
extern struct blob_buf b;
@@ -54,6 +55,7 @@ struct ubus_client {
struct list_head tx_queue;
unsigned int txq_ofs;
+ unsigned int txq_len;
struct ubus_msg_buf *pending_msg;
struct ubus_msg_buf *retmsg;
diff --git a/ubusd_main.c b/ubusd_main.c
index 3728a42..d298b51 100644
--- a/ubusd_main.c
+++ b/ubusd_main.c
@@ -74,6 +74,7 @@ static void client_cb(struct uloop_fd *sock, unsigned int events)
}
cl->txq_ofs += written;
+ cl->txq_len -= written;
if (cl->txq_ofs < ub->len + sizeof(ub->hdr))
break;