diff options
author | Richard Begg <asterisk@meric.id.au> | 2017-03-15 08:22:42 +1100 |
---|---|---|
committer | Richard Begg <asterisk@meric.id.au> | 2017-03-16 13:14:58 -0600 |
commit | 44568fc712c3ed9e820221830a68cd707e83dd44 (patch) | |
tree | a283435f521a1c0c431f4d1f34dabf4b97ffc59c | |
parent | 84f0871cba30a9f3562f01fd347c6674d9058aad (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.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/res/res_pjsip_sdp_rtp.c b/res/res_pjsip_sdp_rtp.c index 9f39256e5..178524afe 100644 --- a/res/res_pjsip_sdp_rtp.c +++ b/res/res_pjsip_sdp_rtp.c @@ -196,6 +196,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))) { |