|
|
|
@ -1064,13 +1064,13 @@ 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, ports_q *links, struct port_pool *pp, struct poller *poller) { |
|
|
|
if (!r->local.port || r->fd == -1) |
|
|
|
static void release_port_poller(struct socket_port_link *spl, struct poller *poller) { |
|
|
|
if (!spl->socket.local.port || spl->socket.fd == -1) |
|
|
|
return; |
|
|
|
struct late_port_release *lpr = g_slice_alloc(sizeof(*lpr)); |
|
|
|
move_socket(&lpr->socket, r); |
|
|
|
lpr->pp = pp; |
|
|
|
lpr->pp_links = *links; |
|
|
|
move_socket(&lpr->socket, &spl->socket); |
|
|
|
lpr->pp = spl->pp; |
|
|
|
lpr->pp_links = spl->links; |
|
|
|
if (!poller) |
|
|
|
release_port_push(lpr); |
|
|
|
else { |
|
|
|
@ -1078,11 +1078,11 @@ static void release_port_poller(socket_t *r, ports_q *links, struct port_pool *p |
|
|
|
rtpe_poller_del_item_callback(poller, lpr->socket.fd, release_port_push, lpr); |
|
|
|
} |
|
|
|
} |
|
|
|
static void release_port(socket_t *r, ports_q *links, struct port_pool *pp) { |
|
|
|
release_port_poller(r, links, pp, NULL); |
|
|
|
static void release_port(struct socket_port_link *spl) { |
|
|
|
release_port_poller(spl, NULL); |
|
|
|
} |
|
|
|
static void free_port(struct socket_port_link *spl) { |
|
|
|
release_port(&spl->socket, &spl->links, spl->pp); |
|
|
|
release_port(spl); |
|
|
|
g_free(spl); |
|
|
|
} |
|
|
|
/** |
|
|
|
@ -3198,24 +3198,22 @@ out: |
|
|
|
|
|
|
|
|
|
|
|
static void stream_fd_free(stream_fd *f) { |
|
|
|
release_port(&f->socket, &f->port_pool_links, &f->local_intf->spec->port_pool); |
|
|
|
release_port(&f->spl); |
|
|
|
crypto_cleanup(&f->crypto); |
|
|
|
dtls_connection_cleanup(&f->dtls); |
|
|
|
|
|
|
|
obj_put(f->call); |
|
|
|
} |
|
|
|
|
|
|
|
stream_fd *stream_fd_new(socket_t *fd, ports_q *links, call_t *call, struct local_intf *lif) { |
|
|
|
stream_fd *stream_fd_new(struct socket_port_link *spl, call_t *call, struct local_intf *lif) { |
|
|
|
stream_fd *sfd; |
|
|
|
struct poller_item pi; |
|
|
|
|
|
|
|
sfd = obj_alloc0(stream_fd, stream_fd_free); |
|
|
|
sfd->unique_id = t_queue_get_length(&call->stream_fds); |
|
|
|
sfd->socket = *fd; |
|
|
|
sfd->call = obj_get(call); |
|
|
|
sfd->local_intf = lif; |
|
|
|
if (links) |
|
|
|
sfd->port_pool_links = *links; |
|
|
|
sfd->spl = *spl; |
|
|
|
t_queue_push_tail(&call->stream_fds, sfd); /* hand over ref */ |
|
|
|
|
|
|
|
__C_DBG("stream_fd_new localport=%d", sfd->socket.local.port); |
|
|
|
@ -3264,7 +3262,7 @@ void stream_fd_release(stream_fd *sfd) { |
|
|
|
&sfd->socket.local); // releases reference |
|
|
|
} |
|
|
|
|
|
|
|
release_port_poller(&sfd->socket, &sfd->port_pool_links, &sfd->local_intf->spec->port_pool, sfd->poller); |
|
|
|
release_port_poller(&sfd->spl, sfd->poller); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|