diff options
author | Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be> | 2021-03-25 22:45:02 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2021-05-31 18:39:31 +0200 |
commit | c736e47f3e2ad8f895306e9917f7bd6143fd29d9 (patch) | |
tree | cfab7d33637343cb6a1618cbf893e22ed935a4e2 | |
parent | 4becbd67de5867ec32a53cb15566a6ef505f4619 (diff) | |
download | ubus-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.c | 5 | ||||
-rw-r--r-- | ubusd.h | 2 | ||||
-rw-r--r-- | ubusd_main.c | 1 |
3 files changed, 8 insertions, 0 deletions
@@ -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); @@ -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; |