+uint16_t utcp_get_mtu(struct utcp *utcp) {
+ return utcp ? utcp->mtu : 0;
+}
+
+void utcp_set_mtu(struct utcp *utcp, uint16_t mtu) {
+ // TODO: handle overhead of the header
+ if(utcp)
+ utcp->mtu = mtu;
+}
+
+void utcp_reset_timers(struct utcp *utcp) {
+ if(!utcp)
+ return;
+ struct timeval now, then;
+ gettimeofday(&now, NULL);
+ then = now;
+ then.tv_sec += utcp->timeout;
+ for(int i = 0; i < utcp->nconnections; i++) {
+ utcp->connections[i]->rtrx_timeout = now;
+ utcp->connections[i]->conn_timeout = then;
+ utcp->connections[i]->rtt_start.tv_sec = 0;
+ }
+ if(utcp->rto > START_RTO)
+ utcp->rto = START_RTO;
+}
+
+int utcp_get_user_timeout(struct utcp *u) {
+ return u ? u->timeout : 0;
+}
+
+void utcp_set_user_timeout(struct utcp *u, int timeout) {
+ if(u)
+ u->timeout = timeout;
+}
+
+size_t utcp_get_sndbuf(struct utcp_connection *c) {
+ return c ? c->sndbuf.maxsize : 0;
+}
+
+size_t utcp_get_sndbuf_free(struct utcp_connection *c) {
+ if(c && (c->state == ESTABLISHED || c->state == CLOSE_WAIT))
+ return buffer_free(&c->sndbuf);
+ else
+ return 0;
+}
+
+void utcp_set_sndbuf(struct utcp_connection *c, size_t size) {
+ if(!c)
+ return;
+ c->sndbuf.maxsize = size;
+ if(c->sndbuf.maxsize != size)
+ c->sndbuf.maxsize = -1;
+}
+
+size_t utcp_get_rcvbuf(struct utcp_connection *c) {
+ return c ? c->rcvbuf.maxsize : 0;
+}
+
+size_t utcp_get_rcvbuf_free(struct utcp_connection *c) {
+ if(c && (c->state == ESTABLISHED || c->state == CLOSE_WAIT))
+ return buffer_free(&c->rcvbuf);
+ else
+ return 0;
+}
+
+void utcp_set_rcvbuf(struct utcp_connection *c, size_t size) {
+ if(!c)
+ return;
+ c->rcvbuf.maxsize = size;
+ if(c->rcvbuf.maxsize != size)
+ c->rcvbuf.maxsize = -1;
+}
+
+bool utcp_get_nodelay(struct utcp_connection *c) {
+ return c ? c->nodelay : false;
+}
+
+void utcp_set_nodelay(struct utcp_connection *c, bool nodelay) {
+ if(c)
+ c->nodelay = nodelay;
+}
+
+bool utcp_get_keepalive(struct utcp_connection *c) {
+ return c ? c->keepalive : false;
+}
+
+void utcp_set_keepalive(struct utcp_connection *c, bool keepalive) {
+ if(c)
+ c->keepalive = keepalive;
+}
+
+size_t utcp_get_outq(struct utcp_connection *c) {
+ return c ? seqdiff(c->snd.nxt, c->snd.una) : 0;
+}
+
+void utcp_set_recv_cb(struct utcp_connection *c, utcp_recv_t recv) {
+ if(c)
+ c->recv = recv;
+}
+
+void utcp_set_poll_cb(struct utcp_connection *c, utcp_poll_t poll) {
+ if(c)
+ c->poll = poll;
+}
+
+void utcp_set_accept_cb(struct utcp *utcp, utcp_accept_t accept, utcp_pre_accept_t pre_accept) {
+ if(utcp) {
+ utcp->accept = accept;
+ utcp->pre_accept = pre_accept;
+ }