]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip_sdp_rtp: RTP instance does not use same IP as explicit transport
authorRichard Begg <asterisk@meric.id.au>
Tue, 14 Mar 2017 21:22:42 +0000 (08:22 +1100)
committerRichard Begg <asterisk@meric.id.au>
Thu, 16 Mar 2017 19:14:46 +0000 (13:14 -0600)
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

res/res_pjsip_sdp_rtp.c

index 8c1c9383d3b301c4741499d54b404ad7c30bf149..388af28de3b27f82e8060d18a8f79dba1e281438 100644 (file)
@@ -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))) {