]> git.meshlink.io Git - meshlink/commitdiff
Make the maximum outgoing connection timeout runtime configurable.
authorGuus Sliepen <guus@meshlink.io>
Wed, 24 Jun 2020 20:22:01 +0000 (22:22 +0200)
committerGuus Sliepen <guus@meshlink.io>
Wed, 24 Jun 2020 20:22:01 +0000 (22:22 +0200)
This moves maxtimeout to the dev_class_traits, and adds a function to
change it, similar to how we handle other configurable timeouts.

src/meshlink++.h
src/meshlink.c
src/meshlink.h
src/meshlink_internal.h
src/net_setup.c
src/net_socket.c

index bca39fd32332a2e3497e08a36f56c39056e49173..eeb1cd02ac1793921139e0e8285d7d2cd1fa593f 100644 (file)
@@ -1049,6 +1049,16 @@ public:
                meshlink_set_dev_class_fast_retry_period(handle, devclass, fast_retry_period);
        }
 
+       /// Set device class maximum timeout
+       /** This sets the maximum timeout for outgoing connection retries for a given device class.
+        *
+        *  @param devclass      The device class to update
+        *  @param maxtimeout    The maximum timeout between reconnection attempts, in seconds. The default is 900.
+        */
+       void set_dev_class_maxtimeout(dev_class_t devclass, int maxtimeout) {
+               meshlink_set_dev_class_maxtimeout(handle, devclass, maxtimeout);
+       }
+
        /// Set which order invitations are committed
        /** This determines in which order configuration files are written to disk during an invitation.
         *  By default, the invitee saves the configuration to disk first, then the inviter.
index d0b8bef5d7c6ee46533069baf865939610070887..57ada124db2560ec717e130cfe982796454201be 100644 (file)
@@ -1296,10 +1296,10 @@ void meshlink_open_params_free(meshlink_open_params_t *params) {
 
 /// Device class traits
 static const dev_class_traits_t default_class_traits[DEV_CLASS_COUNT] = {
-       { .pingtimeout = 5, .pinginterval = 60, .min_connects = 3, .max_connects = 10000, .edge_weight = 1 }, // DEV_CLASS_BACKBONE
-       { .pingtimeout = 5, .pinginterval = 60, .min_connects = 3, .max_connects = 100, .edge_weight = 3 },   // DEV_CLASS_STATIONARY
-       { .pingtimeout = 5, .pinginterval = 60, .min_connects = 3, .max_connects = 3, .edge_weight = 6 },     // DEV_CLASS_PORTABLE
-       { .pingtimeout = 5, .pinginterval = 60, .min_connects = 1, .max_connects = 1, .edge_weight = 9 },     // DEV_CLASS_UNKNOWN
+       { .pingtimeout = 5, .pinginterval = 60, .maxtimeout = 900, .min_connects = 3, .max_connects = 10000, .edge_weight = 1 }, // DEV_CLASS_BACKBONE
+       { .pingtimeout = 5, .pinginterval = 60, .maxtimeout = 900, .min_connects = 3, .max_connects = 100, .edge_weight = 3 },   // DEV_CLASS_STATIONARY
+       { .pingtimeout = 5, .pinginterval = 60, .maxtimeout = 900, .min_connects = 3, .max_connects = 3, .edge_weight = 6 },     // DEV_CLASS_PORTABLE
+       { .pingtimeout = 5, .pinginterval = 60, .maxtimeout = 900, .min_connects = 1, .max_connects = 1, .edge_weight = 9 },     // DEV_CLASS_UNKNOWN
 };
 
 meshlink_handle_t *meshlink_open(const char *confbase, const char *name, const char *appname, dev_class_t devclass) {
@@ -4260,6 +4260,22 @@ void meshlink_set_dev_class_fast_retry_period(meshlink_handle_t *mesh, dev_class
        assert(pthread_mutex_unlock(&mesh->mutex) == 0);
 }
 
+void meshlink_set_dev_class_maxtimeout(struct meshlink_handle *mesh, dev_class_t devclass, int maxtimeout) {
+       if(!mesh || devclass < 0 || devclass >= DEV_CLASS_COUNT) {
+               meshlink_errno = EINVAL;
+               return;
+       }
+
+       if(maxtimeout < 0) {
+               meshlink_errno = EINVAL;
+               return;
+       }
+
+       assert(pthread_mutex_lock(&mesh->mutex) == 0);
+       mesh->dev_class_traits[devclass].maxtimeout = maxtimeout;
+       assert(pthread_mutex_unlock(&mesh->mutex) == 0);
+}
+
 extern void meshlink_set_inviter_commits_first(struct meshlink_handle *mesh, bool inviter_commits_first) {
        if(!mesh) {
                meshlink_errno = EINVAL;
index 25a52d19dd43b6430627aecdaaa396434b3030a4..e0164b7fd7e8bae111743d65484c21d35a40790b 100644 (file)
@@ -1589,6 +1589,16 @@ void meshlink_set_dev_class_timeouts(struct meshlink_handle *mesh, dev_class_t d
  */
 void meshlink_set_dev_class_fast_retry_period(struct meshlink_handle *mesh, dev_class_t devclass, int fast_retry_period);
 
+/// Set device class maximum timeout
+/** This sets the maximum timeout for outgoing connection retries for a given device class.
+ *
+ *  \memberof meshlink_handle
+ *  @param mesh          A handle which represents an instance of MeshLink.
+ *  @param devclass      The device class to update
+ *  @param maxtimeout    The maximum timeout between reconnection attempts, in seconds. The default is 900.
+ */
+void meshlink_set_dev_class_maxtimeout(struct meshlink_handle *mesh, dev_class_t devclass, int maxtimeout);
+
 /// Set which order invitations are committed
 /** This determines in which order configuration files are written to disk during an invitation.
  *  By default, the invitee saves the configuration to disk first, then the inviter.
index d6dc87d04f414d7149fdfea3e190342cb728fa15..c75e6957bb0bf7181ab8ee46ac4da2f612d3074c 100644 (file)
@@ -74,6 +74,7 @@ typedef struct {
        int pinginterval;
        int pingtimeout;
        int fast_retry_period;
+       int maxtimeout;
        unsigned int min_connects;
        unsigned int max_connects;
        int edge_weight;
@@ -150,7 +151,6 @@ struct meshlink_handle {
        dev_class_t devclass;
 
        int invitation_timeout;
-       int maxtimeout;
        int udp_choice;
 
        dev_class_traits_t dev_class_traits[DEV_CLASS_COUNT];
index af49ea09944092fa0b2d90575cb660c0c290924b..a82d5d97817610ca611195927a264713e4129141 100644 (file)
@@ -522,12 +522,6 @@ static bool add_listen_sockets(meshlink_handle_t *mesh) {
   Configure node_t mesh->self and set up the local sockets (listen only)
 */
 static bool setup_myself(meshlink_handle_t *mesh) {
-       /* Set some defaults */
-
-       mesh->maxtimeout = 900;
-
-       /* Done */
-
        mesh->self->nexthop = mesh->self;
 
        node_add(mesh, mesh->self);
index 5464b95f8071ca57ee479270e32ffcf3c23e0b25..6af4f7386bcc37530057fc5251de2ff0103a1137 100644 (file)
@@ -93,8 +93,8 @@ void retry_outgoing(meshlink_handle_t *mesh, outgoing_t *outgoing) {
                outgoing->timeout += 5;
        }
 
-       if(outgoing->timeout > mesh->maxtimeout) {
-               outgoing->timeout = mesh->maxtimeout;
+       if(outgoing->timeout > mesh->dev_class_traits[mesh->devclass].maxtimeout) {
+               outgoing->timeout = mesh->dev_class_traits[mesh->devclass].maxtimeout;
        }
 
        timeout_add(&mesh->loop, &outgoing->ev, retry_outgoing_handler, outgoing, &(struct timespec) {