]> git.meshlink.io Git - utcp/commitdiff
Add a poll callback to UTCP connections.
authorGuus Sliepen <guus@meshlink.io>
Wed, 1 Oct 2014 17:18:40 +0000 (19:18 +0200)
committerGuus Sliepen <guus@meshlink.io>
Wed, 1 Oct 2014 17:18:40 +0000 (19:18 +0200)
The callback is called whenever the send buffer of a connection is more
than half empty when utcp_timeout() is called. An argument is passed to
the callee informing him of the maximum number of bytes that will be
accepted when calling utcp_send().

utcp.c
utcp.h
utcp_priv.h

diff --git a/utcp.c b/utcp.c
index 5962820805d60f822a3a16d28b4098c604bb380f..ca3c132f60c9132da69b019e3583d83db11974df 100644 (file)
--- a/utcp.c
+++ b/utcp.c
@@ -1022,6 +1022,9 @@ int utcp_timeout(struct utcp *utcp) {
                        retransmit(c);
                }
 
                        retransmit(c);
                }
 
+               if(c->poll && c->sndbufsize < c->maxsndbufsize / 2)
+                       c->poll(c, c->maxsndbufsize - c->sndbufsize);
+
                if(timerisset(&c->conn_timeout) && timercmp(&c->conn_timeout, &next, <))
                        next = c->conn_timeout;
 
                if(timerisset(&c->conn_timeout) && timercmp(&c->conn_timeout, &next, <))
                        next = c->conn_timeout;
 
@@ -1097,6 +1100,10 @@ size_t utcp_get_sndbuf(struct utcp_connection *c) {
        return c->maxsndbufsize;
 }
 
        return c->maxsndbufsize;
 }
 
+size_t utcp_get_sndbuf_free(struct utcp_connection *c) {
+       return c->maxsndbufsize - c->sndbufsize;
+}
+
 void utcp_set_sndbuf(struct utcp_connection *c, size_t size) {
        c->maxsndbufsize = size;
        if(c->maxsndbufsize != size)
 void utcp_set_sndbuf(struct utcp_connection *c, size_t size) {
        c->maxsndbufsize = size;
        if(c->maxsndbufsize != size)
@@ -1122,3 +1129,11 @@ void utcp_set_keepalive(struct utcp_connection *c, bool keepalive) {
 size_t utcp_get_outq(struct utcp_connection *c) {
        return seqdiff(c->snd.nxt, c->snd.una);
 }
 size_t utcp_get_outq(struct utcp_connection *c) {
        return seqdiff(c->snd.nxt, c->snd.una);
 }
+
+void utcp_set_recv_cb(struct utcp_connection *c, utcp_recv_t recv) {
+       c->recv = recv;
+}
+
+void utcp_set_poll_cb(struct utcp_connection *c, utcp_poll_t poll) {
+       c->poll = poll;
+}
diff --git a/utcp.h b/utcp.h
index 0bf841771a6f76be5d3c75da34559b6eb015ae67..53a107fd13a20196ce7485b93a754771d2a36b62 100644 (file)
--- a/utcp.h
+++ b/utcp.h
@@ -44,6 +44,8 @@ typedef void (*utcp_accept_t)(struct utcp_connection *utcp_connection, uint16_t
 typedef ssize_t (*utcp_send_t)(struct utcp *utcp, const void *data, size_t len);
 typedef ssize_t (*utcp_recv_t)(struct utcp_connection *connection, const void *data, size_t len);
 
 typedef ssize_t (*utcp_send_t)(struct utcp *utcp, const void *data, size_t len);
 typedef ssize_t (*utcp_recv_t)(struct utcp_connection *connection, const void *data, size_t len);
 
+typedef void (*utcp_poll_t)(struct utcp_connection *connection, size_t len);
+
 extern struct utcp *utcp_init(utcp_accept_t accept, utcp_pre_accept_t pre_accept, utcp_send_t send, void *priv);
 extern void utcp_exit(struct utcp *utcp);
 
 extern struct utcp *utcp_init(utcp_accept_t accept, utcp_pre_accept_t pre_accept, utcp_send_t send, void *priv);
 extern void utcp_exit(struct utcp *utcp);
 
@@ -55,6 +57,8 @@ extern int utcp_close(struct utcp_connection *connection);
 extern int utcp_abort(struct utcp_connection *connection);
 extern int utcp_shutdown(struct utcp_connection *connection, int how);
 extern int utcp_timeout(struct utcp *utcp);
 extern int utcp_abort(struct utcp_connection *connection);
 extern int utcp_shutdown(struct utcp_connection *connection, int how);
 extern int utcp_timeout(struct utcp *utcp);
+extern void utcp_set_recv_cb(struct utcp_connection *connection, utcp_recv_t recv);
+extern void utcp_set_poll_cb(struct utcp_connection *connection, utcp_poll_t poll);
 
 // Global socket options
 
 
 // Global socket options
 
@@ -69,6 +73,8 @@ extern void utcp_set_mtu(struct utcp *utcp, uint16_t mtu);
 extern size_t utcp_get_sndbuf(struct utcp_connection *connection);
 extern void utcp_set_sndbuf(struct utcp_connection *connection, size_t size);
 
 extern size_t utcp_get_sndbuf(struct utcp_connection *connection);
 extern void utcp_set_sndbuf(struct utcp_connection *connection, size_t size);
 
+extern size_t utcp_get_sndbuf_free(struct utcp_connection *connection);
+
 extern bool utcp_get_nodelay(struct utcp_connection *connection);
 extern void utcp_set_nodelay(struct utcp_connection *connection, bool nodelay);
 
 extern bool utcp_get_nodelay(struct utcp_connection *connection);
 extern void utcp_set_nodelay(struct utcp_connection *connection, bool nodelay);
 
index d8f65546dcd810f9d6fe33259dbda4578e5a89b9..d73d664d51e9981c82150e7766a98de0dd76fed9 100644 (file)
@@ -80,6 +80,7 @@ struct utcp_connection {
        // Callbacks
 
        utcp_recv_t recv;
        // Callbacks
 
        utcp_recv_t recv;
+       utcp_poll_t poll;
 
        // TCP State
 
 
        // TCP State