int s = socket_in_netns(aip->ai_family, aip->ai_socktype, aip->ai_protocol, mesh->netns);
+#ifdef SO_NOSIGPIPE
+ int nosigpipe = 1;
+ setsockopt(s, SOL_SOCKET, SO_NOSIGPIPE, &nosigpipe, sizeof(nosigpipe));
+#endif
+
if(s >= 0) {
set_timeout(s, 5000);
/// 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) {
assert(pthread_mutexattr_init(&attr) == 0);
assert(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) == 0);
assert(pthread_mutex_init(&mesh->mutex, &attr) == 0);
+ assert(pthread_cond_init(&mesh->cond, NULL) == 0);
assert(pthread_mutex_init(&mesh->discovery_mutex, NULL) == 0);
assert(pthread_cond_init(&mesh->discovery_cond, NULL) == 0);
continue;
}
+#ifdef SO_NOSIGPIPE
+ int nosigpipe = 1;
+ setsockopt(state.sock, SOL_SOCKET, SO_NOSIGPIPE, &nosigpipe, sizeof(nosigpipe));
+#endif
+
set_timeout(state.sock, 5000);
if(connect(state.sock, aip->ai_addr, aip->ai_addrlen)) {
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;
}
retry(mesh);
+ signal_trigger(&mesh->loop, &mesh->datafromapp);
}
void call_error_cb(meshlink_handle_t *mesh, meshlink_errno_t cb_errno) {