|
|
@ -1750,7 +1750,7 @@ struct stream_fd *__stream_fd_new(struct udp_fd *fd, struct call *call) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static struct endpoint_map *__get_endpoint_map(struct call_media *media, unsigned int num_ports, |
|
|
static struct endpoint_map *__get_endpoint_map(struct call_media *media, unsigned int num_ports, |
|
|
const struct endpoint *ep) |
|
|
|
|
|
|
|
|
const struct endpoint *ep, unsigned int wanted_start_port) |
|
|
{ |
|
|
{ |
|
|
GSList *l; |
|
|
GSList *l; |
|
|
struct endpoint_map *em; |
|
|
struct endpoint_map *em; |
|
|
@ -1802,7 +1802,7 @@ static struct endpoint_map *__get_endpoint_map(struct call_media *media, unsigne |
|
|
alloc: |
|
|
alloc: |
|
|
if (num_ports > G_N_ELEMENTS(fd_arr)) |
|
|
if (num_ports > G_N_ELEMENTS(fd_arr)) |
|
|
return NULL; |
|
|
return NULL; |
|
|
if (__get_consecutive_ports(fd_arr, num_ports, 0, media->call)) |
|
|
|
|
|
|
|
|
if (__get_consecutive_ports(fd_arr, num_ports, wanted_start_port, media->call)) |
|
|
return NULL; |
|
|
return NULL; |
|
|
|
|
|
|
|
|
__C_DBG("allocating stream_fds for %u ports", num_ports); |
|
|
__C_DBG("allocating stream_fds for %u ports", num_ports); |
|
|
@ -1841,10 +1841,10 @@ static void __assign_stream_fds(struct call_media *media, GList *sfds) { |
|
|
ice_restart(media->ice_agent); |
|
|
ice_restart(media->ice_agent); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static int __wildcard_endpoint_map(struct call_media *media, unsigned int num_ports) { |
|
|
|
|
|
|
|
|
static int __wildcard_endpoint_map(struct call_media *media, unsigned int num_ports, unsigned int wanted_start_port) { |
|
|
struct endpoint_map *em; |
|
|
struct endpoint_map *em; |
|
|
|
|
|
|
|
|
em = __get_endpoint_map(media, num_ports, NULL); |
|
|
|
|
|
|
|
|
em = __get_endpoint_map(media, num_ports, NULL, wanted_start_port); |
|
|
if (!em) |
|
|
if (!em) |
|
|
return -1; |
|
|
return -1; |
|
|
|
|
|
|
|
|
@ -2595,7 +2595,9 @@ int monologue_offer_answer(struct call_monologue *other_ml, GQueue *streams, |
|
|
|
|
|
|
|
|
/* get that many ports for each side, and one packet stream for each port, then |
|
|
/* get that many ports for each side, and one packet stream for each port, then |
|
|
* assign the ports to the streams */ |
|
|
* assign the ports to the streams */ |
|
|
em = __get_endpoint_map(media, num_ports, &sp->rtp_endpoint); |
|
|
|
|
|
|
|
|
em = __get_endpoint_map(media, num_ports, &sp->rtp_endpoint, |
|
|
|
|
|
(unsigned int)GPOINTER_TO_UINT(g_queue_pop_head(&call->rtp_bridge_ports))); |
|
|
|
|
|
|
|
|
if (!em) |
|
|
if (!em) |
|
|
goto error; |
|
|
goto error; |
|
|
|
|
|
|
|
|
@ -2606,7 +2608,8 @@ int monologue_offer_answer(struct call_monologue *other_ml, GQueue *streams, |
|
|
/* new streams created on OTHER side. normally only happens in |
|
|
/* new streams created on OTHER side. normally only happens in |
|
|
* initial offer. create a wildcard endpoint_map to be filled in |
|
|
* initial offer. create a wildcard endpoint_map to be filled in |
|
|
* when the answer comes. */ |
|
|
* when the answer comes. */ |
|
|
if (__wildcard_endpoint_map(other_media, num_ports)) |
|
|
|
|
|
|
|
|
if (__wildcard_endpoint_map(other_media, num_ports, |
|
|
|
|
|
(unsigned int)GPOINTER_TO_UINT(g_queue_pop_head(&call->rtp_bridge_ports)))) |
|
|
goto error; |
|
|
goto error; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -3160,6 +3163,8 @@ static void __call_free(void *p) { |
|
|
g_slice_free1(sizeof(*ps), ps); |
|
|
g_slice_free1(sizeof(*ps), ps); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
g_queue_clear(&c->rtp_bridge_ports); |
|
|
|
|
|
|
|
|
assert(c->stream_fds == NULL); |
|
|
assert(c->stream_fds == NULL); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -3178,6 +3183,7 @@ static struct call *call_create(const str *callid, struct callmaster *m) { |
|
|
c->created = poller_now; |
|
|
c->created = poller_now; |
|
|
c->dtls_cert = dtls_cert(); |
|
|
c->dtls_cert = dtls_cert(); |
|
|
c->tos = m->conf.default_tos; |
|
|
c->tos = m->conf.default_tos; |
|
|
|
|
|
g_queue_init(&c->rtp_bridge_ports); |
|
|
return c; |
|
|
return c; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|