Decouple DNS-based seed discovery from the broadcast timer.
Some checks are pending
Build Tilde Friends / Build-All (push) Waiting to run
Some checks are pending
Build Tilde Friends / Build-All (push) Waiting to run
This commit is contained in:
parent
f621feb843
commit
d32999f178
29
src/ssb.c
29
src/ssb.c
@ -77,6 +77,9 @@ enum
|
||||
k_tf_ssb_rpc_message_body_length_max = 1 * 1024 * 1024,
|
||||
k_debug_close_message_count = 256,
|
||||
k_debug_close_connection_count = 32,
|
||||
k_seed_expire_seconds = 10 * 60,
|
||||
k_seed_check_interval_seconds = 5 * 50,
|
||||
k_udp_discovery_expires_seconds = 10,
|
||||
};
|
||||
|
||||
typedef struct _tf_ssb_broadcast_t tf_ssb_broadcast_t;
|
||||
@ -116,6 +119,7 @@ typedef struct _tf_ssb_broadcast_t
|
||||
tf_ssb_broadcast_t* next;
|
||||
time_t ctime;
|
||||
time_t mtime;
|
||||
time_t expires_at;
|
||||
char host[256];
|
||||
struct sockaddr_in addr;
|
||||
tf_ssb_connection_t* tunnel_connection;
|
||||
@ -262,6 +266,7 @@ typedef struct _tf_ssb_t
|
||||
bool is_room;
|
||||
char* room_name;
|
||||
char seeds_host[256];
|
||||
time_t last_seed_check;
|
||||
|
||||
tf_ssb_timer_t** timers;
|
||||
int timers_count;
|
||||
@ -357,7 +362,7 @@ static JSClassID _connection_class_id;
|
||||
static int s_connection_index;
|
||||
static int s_tunnel_index;
|
||||
|
||||
static void _tf_ssb_add_broadcast(tf_ssb_t* ssb, const tf_ssb_broadcast_t* broadcast);
|
||||
static void _tf_ssb_add_broadcast(tf_ssb_t* ssb, const tf_ssb_broadcast_t* broadcast, int expires_seconds);
|
||||
static void _tf_ssb_connection_client_send_hello(tf_ssb_connection_t* connection);
|
||||
static void _tf_ssb_connection_close(tf_ssb_connection_t* connection, const char* reason);
|
||||
static void _tf_ssb_connection_destroy(tf_ssb_connection_t* connection, const char* reason);
|
||||
@ -2946,7 +2951,7 @@ static void _tf_ssb_update_seeds_after_work(tf_ssb_t* ssb, int status, void* use
|
||||
tf_ssb_broadcast_t broadcast = { 0 };
|
||||
if (_tf_ssb_parse_broadcast(seeds->seeds[i], &broadcast))
|
||||
{
|
||||
_tf_ssb_add_broadcast(ssb, &broadcast);
|
||||
_tf_ssb_add_broadcast(ssb, &broadcast, k_seed_expire_seconds);
|
||||
}
|
||||
tf_free(seeds->seeds[i]);
|
||||
}
|
||||
@ -2971,11 +2976,12 @@ static void _tf_ssb_broadcast_timer(uv_timer_t* timer)
|
||||
uv_free_interface_addresses(info, count);
|
||||
}
|
||||
|
||||
seeds_t* seeds = tf_malloc(sizeof(seeds_t));
|
||||
*seeds = (seeds_t) { 0 };
|
||||
|
||||
if (*ssb->seeds_host)
|
||||
time_t now = time(NULL);
|
||||
if (*ssb->seeds_host && now - ssb->last_seed_check > k_seed_check_interval_seconds)
|
||||
{
|
||||
seeds_t* seeds = tf_malloc(sizeof(seeds_t));
|
||||
*seeds = (seeds_t) { 0 };
|
||||
ssb->last_seed_check = now;
|
||||
tf_ssb_run_work(ssb, _tf_ssb_update_seeds_work, _tf_ssb_update_seeds_after_work, seeds);
|
||||
}
|
||||
}
|
||||
@ -3090,7 +3096,7 @@ static void _tf_ssb_notify_broadcasts_changed(tf_ssb_t* ssb)
|
||||
}
|
||||
}
|
||||
|
||||
static void _tf_ssb_add_broadcast(tf_ssb_t* ssb, const tf_ssb_broadcast_t* broadcast)
|
||||
static void _tf_ssb_add_broadcast(tf_ssb_t* ssb, const tf_ssb_broadcast_t* broadcast, int expires_seconds)
|
||||
{
|
||||
if (memcmp(broadcast->pub, ssb->pub, sizeof(ssb->pub)) == 0)
|
||||
{
|
||||
@ -3104,6 +3110,7 @@ static void _tf_ssb_add_broadcast(tf_ssb_t* ssb, const tf_ssb_broadcast_t* broad
|
||||
if (node->tunnel_connection == broadcast->tunnel_connection && memcmp(node->pub, broadcast->pub, sizeof(node->pub)) == 0)
|
||||
{
|
||||
node->mtime = time(NULL);
|
||||
node->expires_at = node->mtime + expires_seconds;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -3116,6 +3123,7 @@ static void _tf_ssb_add_broadcast(tf_ssb_t* ssb, const tf_ssb_broadcast_t* broad
|
||||
node->addr.sin_addr.s_addr == broadcast->addr.sin_addr.s_addr && memcmp(node->pub, broadcast->pub, sizeof(node->pub)) == 0)
|
||||
{
|
||||
node->mtime = time(NULL);
|
||||
node->expires_at = node->mtime + expires_seconds;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -3132,6 +3140,7 @@ static void _tf_ssb_add_broadcast(tf_ssb_t* ssb, const tf_ssb_broadcast_t* broad
|
||||
node->next = ssb->broadcasts;
|
||||
node->ctime = time(NULL);
|
||||
node->mtime = node->ctime;
|
||||
node->expires_at = node->mtime + expires_seconds;
|
||||
ssb->broadcasts = node;
|
||||
ssb->broadcasts_count++;
|
||||
|
||||
@ -3157,7 +3166,7 @@ static void _tf_ssb_on_broadcast_listener_recv(uv_udp_t* handle, ssize_t nread,
|
||||
tf_ssb_broadcast_t broadcast = { 0 };
|
||||
if (_tf_ssb_parse_broadcast(entry, &broadcast))
|
||||
{
|
||||
_tf_ssb_add_broadcast(ssb, &broadcast);
|
||||
_tf_ssb_add_broadcast(ssb, &broadcast, k_udp_discovery_expires_seconds);
|
||||
}
|
||||
entry = strtok_r(NULL, k_delim, &state);
|
||||
}
|
||||
@ -3188,7 +3197,7 @@ static void _tf_ssb_broadcast_cleanup_timer(uv_timer_t* timer)
|
||||
time_t now = time(NULL);
|
||||
for (tf_ssb_broadcast_t** it = &ssb->broadcasts; *it;)
|
||||
{
|
||||
if (!(*it)->tunnel_connection && (*it)->mtime < now - 10)
|
||||
if (!(*it)->tunnel_connection && now > (*it)->expires_at)
|
||||
{
|
||||
tf_ssb_broadcast_t* node = *it;
|
||||
*it = node->next;
|
||||
@ -3604,7 +3613,7 @@ void tf_ssb_connection_add_room_attendant(tf_ssb_connection_t* connection, const
|
||||
.tunnel_connection = connection,
|
||||
};
|
||||
tf_ssb_id_str_to_bin(broadcast.pub, id);
|
||||
_tf_ssb_add_broadcast(connection->ssb, &broadcast);
|
||||
_tf_ssb_add_broadcast(connection->ssb, &broadcast, 0);
|
||||
}
|
||||
|
||||
void tf_ssb_connection_remove_room_attendant(tf_ssb_connection_t* connection, const char* id)
|
||||
|
Loading…
Reference in New Issue
Block a user