summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Begg <asterisk@meric.id.au>2017-03-15 08:22:42 +1100
committerRichard Begg <asterisk@meric.id.au>2017-03-16 13:14:46 -0600
commit67204a0a3d4698b2e24dc0cb8ccb74602f2b1922 (patch)
tree47751cbab235d873733008fdb7d4b6c71a6cf818
parent6541a0708320970379d8197a8ede49b264a0c043 (diff)
res_pjsip_sdp_rtp: RTP instance does not use same IP as explicit transport
Currently a wildcard address is used for the local RTP socket, which will not always result in the same address as used by the SIP socket (e.g. if explicit transport addresses are configured). Use the transport's host address when binding new local RTP sockets if available. ASTERISK-26851 Change-Id: I098c29c9d1f79a4f970d72ba894874ac75954f1a
-rw-r--r--res/res_pjsip_sdp_rtp.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/res/res_pjsip_sdp_rtp.c b/res/res_pjsip_sdp_rtp.c
index 8c1c9383d..388af28de 100644
--- a/res/res_pjsip_sdp_rtp.c
+++ b/res/res_pjsip_sdp_rtp.c
@@ -197,6 +197,20 @@ static int create_rtp(struct ast_sip_session *session, struct ast_sip_session_me
if (session->endpoint->media.bind_rtp_to_media_address && !ast_strlen_zero(session->endpoint->media.address)) {
ast_sockaddr_parse(&temp_media_address, session->endpoint->media.address, 0);
media_address = &temp_media_address;
+ } else {
+ struct ast_sip_transport *transport =
+ ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "transport",
+ session->endpoint->transport);
+
+ if (transport && transport->state) {
+ char hoststr[PJ_INET6_ADDRSTRLEN];
+
+ pj_sockaddr_print(&transport->state->host, hoststr, sizeof(hoststr), 0);
+ ast_debug(1, "Transport: %s bound to host: %s, using this for media.\n",
+ session->endpoint->transport, hoststr);
+ ast_sockaddr_parse(media_address, hoststr, 0);
+ }
+ ao2_cleanup(transport);
}
if (!(session_media->rtp = ast_rtp_instance_new(session->endpoint->media.rtp.engine, sched, media_address, NULL))) {