]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Propagate the discovered PMTU between nodes to UTCP.
[meshlink] / src / meshlink.c
index fccfecbc404b24e9a9cbfcd67ecce53e221cbeb6..38ef57508b7e13540644bdababfc27f2d1042602 100644 (file)
@@ -995,10 +995,18 @@ static bool ecdsa_keygen(meshlink_handle_t *mesh) {
        return true;
 }
 
-static struct timeval idle(event_loop_t *loop, void *data) {
+static bool timespec_lt(const struct timespec *a, const struct timespec *b) {
+       if(a->tv_sec == b->tv_sec) {
+               return a->tv_nsec < b->tv_nsec;
+       } else {
+               return a->tv_sec < b->tv_sec;
+       }
+}
+
+static struct timespec idle(event_loop_t *loop, void *data) {
        (void)loop;
        meshlink_handle_t *mesh = data;
-       struct timeval t, tmin = {3600, 0};
+       struct timespec t, tmin = {3600, 0};
 
        for splay_each(node_t, n, mesh->nodes) {
                if(!n->utcp) {
@@ -1007,7 +1015,7 @@ static struct timeval idle(event_loop_t *loop, void *data) {
 
                t = utcp_timeout(n->utcp);
 
-               if(timercmp(&t, &tmin, <)) {
+               if(timespec_lt(&t, &tmin)) {
                        tmin = t;
                }
        }
@@ -3234,7 +3242,7 @@ static bool blacklist(meshlink_handle_t *mesh, node_t *n) {
        n->status.udp_confirmed = false;
 
        if(n->status.reachable) {
-               n->last_unreachable = mesh->loop.now.tv_sec;
+               n->last_unreachable = time(NULL);
        }
 
        /* Graph updates will suppress status updates for blacklisted nodes, so we need to
@@ -3308,7 +3316,7 @@ static bool whitelist(meshlink_handle_t *mesh, node_t *n) {
        n->status.blacklisted = false;
 
        if(n->status.reachable) {
-               n->last_reachable = mesh->loop.now.tv_sec;
+               n->last_reachable = time(NULL);
                update_node_status(mesh, n);
        }
 
@@ -3664,6 +3672,7 @@ void meshlink_set_channel_accept_cb(meshlink_handle_t *mesh, meshlink_channel_ac
        for splay_each(node_t, n, mesh->nodes) {
                if(!n->utcp && n != mesh->self) {
                        n->utcp = utcp_init(channel_accept, channel_pre_accept, channel_send, n);
+                       utcp_set_mtu(n->utcp, n->mtu - sizeof(meshlink_packethdr_t));
                }
        }
 
@@ -3712,6 +3721,7 @@ meshlink_channel_t *meshlink_channel_open_ex(meshlink_handle_t *mesh, meshlink_n
 
        if(!n->utcp) {
                n->utcp = utcp_init(channel_accept, channel_pre_accept, channel_send, n);
+               utcp_set_mtu(n->utcp, n->mtu - sizeof(meshlink_packethdr_t));
                mesh->receive_cb = channel_receive;
 
                if(!n->utcp) {
@@ -3999,6 +4009,15 @@ size_t meshlink_channel_get_recvq(meshlink_handle_t *mesh, meshlink_channel_t *c
        return utcp_get_recvq(channel->c);
 }
 
+size_t meshlink_channel_get_mss(meshlink_handle_t *mesh, meshlink_channel_t *channel) {
+       if(!mesh || !channel) {
+               meshlink_errno = MESHLINK_EINVAL;
+               return -1;
+       }
+
+       return utcp_get_mss(channel->node->utcp);
+}
+
 void meshlink_set_node_channel_timeout(meshlink_handle_t *mesh, meshlink_node_t *node, int timeout) {
        if(!mesh || !node) {
                meshlink_errno = MESHLINK_EINVAL;
@@ -4011,6 +4030,7 @@ void meshlink_set_node_channel_timeout(meshlink_handle_t *mesh, meshlink_node_t
 
        if(!n->utcp) {
                n->utcp = utcp_init(channel_accept, channel_pre_accept, channel_send, n);
+               utcp_set_mtu(n->utcp, n->mtu - sizeof(meshlink_packethdr_t));
        }
 
        utcp_set_user_timeout(n->utcp, timeout);
@@ -4021,6 +4041,7 @@ void meshlink_set_node_channel_timeout(meshlink_handle_t *mesh, meshlink_node_t
 void update_node_status(meshlink_handle_t *mesh, node_t *n) {
        if(n->status.reachable && mesh->channel_accept_cb && !n->utcp) {
                n->utcp = utcp_init(channel_accept, channel_pre_accept, channel_send, n);
+               utcp_set_mtu(n->utcp, n->mtu - sizeof(meshlink_packethdr_t));
        }
 
        if(mesh->node_status_cb) {
@@ -4033,6 +4054,8 @@ void update_node_status(meshlink_handle_t *mesh, node_t *n) {
 }
 
 void update_node_pmtu(meshlink_handle_t *mesh, node_t *n) {
+       utcp_set_mtu(n->utcp, (n->minmtu > MINMTU ? n->minmtu : MINMTU) - sizeof(meshlink_packethdr_t));
+
        if(mesh->node_pmtu_cb && !n->status.blacklisted) {
                mesh->node_pmtu_cb(mesh, (meshlink_node_t *)n, n->minmtu);
        }