Fix up some of chan_sip's usage of the RTP engine API.
[asterisk/asterisk.git] / channels / chan_sip.c
index cb7fba9..793a31b 100644 (file)
@@ -8791,7 +8791,19 @@ static void get_our_media_address(struct sip_pvt *p, int needvideo, int needtext
                dest->sin_port = p->redirip.sin_port;
                dest->sin_addr = p->redirip.sin_addr;
        } else {
-               dest->sin_addr = media_address.sin_addr.s_addr ? media_address.sin_addr : p->ourip.sin_addr;
+               /*
+                * Audio Destination IP:
+                *
+                * 1. Specifically configured media address.
+                * 2. Local address as specified by the RTP engine.
+                * 3. The local IP as defined by chan_sip.
+                *
+                * Audio Destination Port:
+                *
+                * 1. Provided by the RTP engine.
+                */
+               dest->sin_addr = media_address.sin_addr.s_addr ? media_address.sin_addr :
+                                       (sin->sin_addr.s_addr ? sin->sin_addr : p->ourip.sin_addr);
                dest->sin_port = sin->sin_port;
        }
        if (needvideo) {
@@ -8800,7 +8812,19 @@ static void get_our_media_address(struct sip_pvt *p, int needvideo, int needtext
                        vdest->sin_addr = p->vredirip.sin_addr;
                        vdest->sin_port = p->vredirip.sin_port;
                } else {
-                       vdest->sin_addr = media_address.sin_addr.s_addr ? media_address.sin_addr : p->ourip.sin_addr;
+                       /*
+                        * Video Destination IP:
+                        *
+                        * 1. Specifically configured media address.
+                        * 2. Local address as specified by the RTP engine.
+                        * 3. The local IP as defined by chan_sip.
+                        *
+                        * Video Destination Port:
+                        *
+                        * 1. Provided by the RTP engine.
+                        */
+                       vdest->sin_addr = media_address.sin_addr.s_addr ? media_address.sin_addr :
+                                               (vsin->sin_addr.s_addr ? vsin->sin_addr : p->ourip.sin_addr);
                        vdest->sin_port = vsin->sin_port;
                }
        }
@@ -8810,7 +8834,19 @@ static void get_our_media_address(struct sip_pvt *p, int needvideo, int needtext
                        tdest->sin_addr = p->tredirip.sin_addr;
                        tdest->sin_port = p->tredirip.sin_port;
                } else {
-                       tdest->sin_addr = media_address.sin_addr.s_addr ? media_address.sin_addr : p->ourip.sin_addr;
+                       /*
+                        * Text Destination IP:
+                        *
+                        * 1. Specifically configured media address.
+                        * 2. Local address as specified by the RTP engine.
+                        * 3. The local IP as defined by chan_sip.
+                        *
+                        * Text Destination Port:
+                        *
+                        * 1. Provided by the RTP engine.
+                        */
+                       tdest->sin_addr = media_address.sin_addr.s_addr ? media_address.sin_addr :
+                                               (tsin->sin_addr.s_addr ? tsin->sin_addr : p->ourip.sin_addr);
                        tdest->sin_port = tsin->sin_port;
                }
        }
@@ -9235,6 +9271,7 @@ static int transmit_response_with_sdp(struct sip_pvt *p, const char *msg, const
                        ast_debug(1, "Setting framing from config on incoming call\n");
                        ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(p->rtp), p->rtp, &p->prefs);
                }
+               ast_rtp_instance_activate(p->rtp);
                try_suggested_sip_codec(p);
                if (p->t38.state == T38_ENABLED) {
                        add_sdp(&resp, p, oldsdp, TRUE, TRUE);
@@ -16671,6 +16708,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
                                /* Queue a progress frame only if we have SDP in 180 or 182 */
                                ast_queue_control(p->owner, AST_CONTROL_PROGRESS);
                        }
+                       ast_rtp_instance_activate(p->rtp);
                }
                check_pendings(p);
                break;
@@ -16708,6 +16746,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
                                /* Queue a progress frame */
                                ast_queue_control(p->owner, AST_CONTROL_PROGRESS);
                        }
+                       ast_rtp_instance_activate(p->rtp);
                } else {
                        /* Alcatel PBXs are known to send 183s with no SDP after sending
                         * a 100 Trying response. We're just going to treat this sort of thing
@@ -16730,6 +16769,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
                                        /* This 200 OK's SDP is not acceptable, so we need to ack, then hangup */
                                        /* For re-invites, we try to recover */
                                        ast_set_flag(&p->flags[0], SIP_PENDINGBYE);
+                       ast_rtp_instance_activate(p->rtp);
                }
 
                if (!req->ignore && p->owner && (get_rpid(p, req) || !reinvite)) {