--- channels/chan_sip.c 2013-03-27 19:51:29.000000000 +0000 +++ ../../asterisk-11.4.0-rc1/channels/chan_sip.c 2013-04-13 01:40:43.028832054 +0000 @@ -1397,7 +1397,7 @@ static int process_sdp_a_video(const char *a, struct sip_pvt *p, struct ast_rtp_codecs *newvideortp, int *last_rtpmap_codec); static int process_sdp_a_text(const char *a, struct sip_pvt *p, struct ast_rtp_codecs *newtextrtp, char *red_fmtp, int *red_num_gen, int *red_data_pt, int *last_rtpmap_codec); static int process_sdp_a_image(const char *a, struct sip_pvt *p); -static void add_ice_to_sdp(struct ast_rtp_instance *instance, struct ast_str **a_buf); +static void add_ice_to_sdp(struct ast_rtp_instance *instance, struct ast_str **a_buf, struct ast_sockaddr *dest); // include public IP to fix https://issues.asterisk.org/jira/browse/ASTERISK-21383 static void add_dtls_to_sdp(struct ast_rtp_instance *instance, struct ast_str **a_buf); static void start_ice(struct ast_rtp_instance *instance); static void add_codec_to_sdp(const struct sip_pvt *p, struct ast_format *codec, @@ -12524,7 +12524,7 @@ } /*! \brief Add ICE attributes to SDP */ -static void add_ice_to_sdp(struct ast_rtp_instance *instance, struct ast_str **a_buf) +static void add_ice_to_sdp(struct ast_rtp_instance *instance, struct ast_str **a_buf, struct ast_sockaddr *dest) // include public IP to fix https://issues.asterisk.org/jira/browse/ASTERISK-21383 { struct ast_rtp_engine_ice *ice = ast_rtp_instance_get_ice(instance); const char *username, *password; @@ -12548,7 +12548,18 @@ while ((candidate = ao2_iterator_next(&i))) { ast_str_append(a_buf, 0, "a=candidate:%s %d %s %d ", candidate->foundation, candidate->id, candidate->transport, candidate->priority); - ast_str_append(a_buf, 0, "%s ", ast_sockaddr_stringify_host(&candidate->address)); + + if (candidate->type == AST_RTP_ICE_CANDIDATE_TYPE_HOST) { + ast_log(LOG_WARNING, "ASTERISK-21383 fix - replace host candidates Local IP with Public IP\n"); + ast_log(LOG_WARNING, "ASTERISK-21383 fix - Asterisk Local IP: %s\n", ast_sockaddr_stringify_host(&candidate->address)); + ast_log(LOG_WARNING, "ASTERISK-21383 fix - Asterisk Public IP: %s\n", ast_sockaddr_stringify_host(dest)); + // for a host candidate, override local Asterisk IP with the Public IP + ast_str_append(a_buf, 0, "%s ", ast_sockaddr_stringify_host(dest)); // https://issues.asterisk.org/jira/browse/ASTERISK-21383 + } else { + // for a srflx or relay candidate, use the default candidate address + ast_str_append(a_buf, 0, "%s ", ast_sockaddr_stringify_host(&candidate->address)); + } + ast_str_append(a_buf, 0, "%s typ ", ast_sockaddr_stringify_port(&candidate->address)); if (candidate->type == AST_RTP_ICE_CANDIDATE_TYPE_HOST) { @@ -13113,7 +13124,7 @@ if (!doing_directmedia) { if (ast_test_flag(&p->flags[2], SIP_PAGE3_ICE_SUPPORT)) { - add_ice_to_sdp(p->vrtp, &a_video); + add_ice_to_sdp(p->vrtp, &a_video, &dest); // ASTERISK-21383 - Replace host candidate local IP with public IP } add_dtls_to_sdp(p->vrtp, &a_video); @@ -13134,7 +13145,7 @@ if (!doing_directmedia) { if (ast_test_flag(&p->flags[2], SIP_PAGE3_ICE_SUPPORT)) { - add_ice_to_sdp(p->trtp, &a_text); + add_ice_to_sdp(p->trtp, &a_text, &dest); // ASTERISK-21383 - Replace host candidate local IP with public IP } add_dtls_to_sdp(p->trtp, &a_text); @@ -13237,7 +13248,7 @@ if (!doing_directmedia) { if (ast_test_flag(&p->flags[2], SIP_PAGE3_ICE_SUPPORT)) { - add_ice_to_sdp(p->rtp, &a_audio); + add_ice_to_sdp(p->rtp, &a_audio, &dest); // ASTERISK-21383 - Replace host candidate local IP with public IP } add_dtls_to_sdp(p->rtp, &a_audio);