|
|
|
|
@ -84,7 +84,7 @@ struct packet_handler_ctx {
|
|
|
|
|
};
|
|
|
|
|
struct late_port_release {
|
|
|
|
|
socket_t socket;
|
|
|
|
|
struct intf_spec *spec;
|
|
|
|
|
struct port_pool *pp;
|
|
|
|
|
};
|
|
|
|
|
struct interface_stats_interval {
|
|
|
|
|
struct interface_stats_block stats;
|
|
|
|
|
@ -962,12 +962,12 @@ static void release_port_push(void *p) {
|
|
|
|
|
__C_DBG("Adding the port '%u' to late-release list", lpr->socket.local.port);
|
|
|
|
|
t_queue_push_tail(&ports_to_release, lpr);
|
|
|
|
|
}
|
|
|
|
|
static void release_port_poller(socket_t *r, struct intf_spec *spec, struct poller *poller) {
|
|
|
|
|
static void release_port_poller(socket_t *r, struct port_pool *pp, struct poller *poller) {
|
|
|
|
|
if (!r->local.port || r->fd == -1)
|
|
|
|
|
return;
|
|
|
|
|
struct late_port_release *lpr = g_slice_alloc(sizeof(*lpr));
|
|
|
|
|
move_socket(&lpr->socket, r);
|
|
|
|
|
lpr->spec = spec;
|
|
|
|
|
lpr->pp = pp;
|
|
|
|
|
if (!poller)
|
|
|
|
|
release_port_push(lpr);
|
|
|
|
|
else {
|
|
|
|
|
@ -975,20 +975,19 @@ static void release_port_poller(socket_t *r, struct intf_spec *spec, struct poll
|
|
|
|
|
rtpe_poller_del_item_callback(poller, lpr->socket.fd, release_port_push, lpr);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
static void release_port(socket_t *r, struct intf_spec *spec) {
|
|
|
|
|
release_port_poller(r, spec, NULL);
|
|
|
|
|
static void release_port(socket_t *r, struct port_pool *pp) {
|
|
|
|
|
release_port_poller(r, pp, NULL);
|
|
|
|
|
}
|
|
|
|
|
static void free_port(socket_t *r, struct intf_spec *spec) {
|
|
|
|
|
release_port(r, spec);
|
|
|
|
|
static void free_port(socket_t *r, struct port_pool *pp) {
|
|
|
|
|
release_port(r, pp);
|
|
|
|
|
g_slice_free1(sizeof(*r), r);
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Logic responsible for devastating the `ports_to_release` queue.
|
|
|
|
|
* It's being called by main poller.
|
|
|
|
|
*/
|
|
|
|
|
static void release_port_now(socket_t *r, struct intf_spec *spec) {
|
|
|
|
|
static void release_port_now(socket_t *r, struct port_pool *pp) {
|
|
|
|
|
unsigned int port = r->local.port;
|
|
|
|
|
struct port_pool *pp = &spec->port_pool;
|
|
|
|
|
|
|
|
|
|
__C_DBG("Trying to release the port '%u'", port);
|
|
|
|
|
|
|
|
|
|
@ -1024,7 +1023,7 @@ enum thread_looper_action release_closed_sockets(void) {
|
|
|
|
|
mutex_unlock(&ports_to_release_glob_lock);
|
|
|
|
|
|
|
|
|
|
while ((lpr = t_queue_pop_head(&ports_left))) {
|
|
|
|
|
release_port_now(&lpr->socket, lpr->spec);
|
|
|
|
|
release_port_now(&lpr->socket, lpr->pp);
|
|
|
|
|
g_slice_free1(sizeof(*lpr), lpr);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -1073,7 +1072,7 @@ int __get_consecutive_ports(socket_q *out, unsigned int num_ports, unsigned int
|
|
|
|
|
free_ports_q = &pp->free_ports_q;
|
|
|
|
|
|
|
|
|
|
/* a presence of free lists data is critical for us */
|
|
|
|
|
if (!(free_ports_q && free_ports_q->head)) {
|
|
|
|
|
if (!free_ports_q->head) {
|
|
|
|
|
ilog(LOG_ERR, "Failure while trying to get a list of free ports");
|
|
|
|
|
goto fail;
|
|
|
|
|
}
|
|
|
|
|
@ -1224,7 +1223,7 @@ new_cycle:
|
|
|
|
|
release_restart:
|
|
|
|
|
/* release all previously engaged sockets */
|
|
|
|
|
while ((sk = t_queue_pop_head(out)))
|
|
|
|
|
free_port(sk, spec); /* engaged ports will be released here */
|
|
|
|
|
free_port(sk, pp); /* engaged ports will be released here */
|
|
|
|
|
|
|
|
|
|
/* do not re-try for specifically wanted ports */
|
|
|
|
|
if (wanted_start_port > 0)
|
|
|
|
|
@ -1299,7 +1298,7 @@ void free_socket_intf_list(struct socket_intf_list *il) {
|
|
|
|
|
socket_t *sock;
|
|
|
|
|
|
|
|
|
|
while ((sock = t_queue_pop_head(&il->list)))
|
|
|
|
|
free_port(sock, il->local_intf->spec);
|
|
|
|
|
free_port(sock, &il->local_intf->spec->port_pool);
|
|
|
|
|
g_slice_free1(sizeof(*il), il);
|
|
|
|
|
}
|
|
|
|
|
void free_sfd_intf_list(struct sfd_intf_list *il) {
|
|
|
|
|
@ -3112,7 +3111,7 @@ out:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void stream_fd_free(stream_fd *f) {
|
|
|
|
|
release_port(&f->socket, f->local_intf->spec);
|
|
|
|
|
release_port(&f->socket, &f->local_intf->spec->port_pool);
|
|
|
|
|
crypto_cleanup(&f->crypto);
|
|
|
|
|
dtls_connection_cleanup(&f->dtls);
|
|
|
|
|
|
|
|
|
|
@ -3177,7 +3176,7 @@ void stream_fd_release(stream_fd *sfd) {
|
|
|
|
|
&sfd->socket.local); // releases reference
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
release_port_poller(&sfd->socket, sfd->local_intf->spec, sfd->poller);
|
|
|
|
|
release_port_poller(&sfd->socket, &sfd->local_intf->spec->port_pool, sfd->poller);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|