Index: channels/chan_sip.c =================================================================== --- channels/chan_sip.c (revision 42882) +++ channels/chan_sip.c (working copy) @@ -16181,16 +16181,14 @@ if (rtp) { changed |= ast_rtp_get_peer(rtp, &p->redirip); - } else if (p->redirip.sin_addr.s_addr || ntohs(p->redirip.sin_port) != 0) { + } else memset(&p->redirip, 0, sizeof(p->redirip)); - changed = 1; - } + if (vrtp) { changed |= ast_rtp_get_peer(vrtp, &p->vredirip); - } else if (p->vredirip.sin_addr.s_addr || ntohs(p->vredirip.sin_port) != 0) { + } else memset(&p->vredirip, 0, sizeof(p->vredirip)); - changed = 1; - } + if (codecs && (p->redircodecs != codecs)) { p->redircodecs = codecs; changed = 1; Index: main/rtp.c =================================================================== --- main/rtp.c (revision 42882) +++ main/rtp.c (working copy) @@ -2728,7 +2728,7 @@ ast_log(LOG_DEBUG, "Oooh, '%s' was %s:%d/(format %d)\n", c1->name, ast_inet_ntoa(vac1.sin_addr), ntohs(vac1.sin_port), oldcodec1); } - if (pr0->set_rtp_peer(c0, t1.sin_addr.s_addr ? p1 : NULL, vt1.sin_addr.s_addr ? vp1 : NULL, codec1, ast_test_flag(p1, FLAG_NAT_ACTIVE))) + if (pr0->set_rtp_peer(c0, t1.sin_addr.s_addr || t1.sin_port ? p1 : NULL, vt1.sin_addr.s_addr || vt1.sin_port ? vp1 : NULL, codec1, ast_test_flag(p1, FLAG_NAT_ACTIVE))) ast_log(LOG_WARNING, "Channel '%s' failed to update to '%s'\n", c0->name, c1->name); memcpy(&ac1, &t1, sizeof(ac1)); memcpy(&vac1, &vt1, sizeof(vac1)); @@ -2742,7 +2742,7 @@ ast_log(LOG_DEBUG, "Oooh, '%s' was %s:%d/(format %d)\n", c0->name, ast_inet_ntoa(ac0.sin_addr), ntohs(ac0.sin_port), oldcodec0); } - if (pr1->set_rtp_peer(c1, t0.sin_addr.s_addr ? p0 : NULL, vt0.sin_addr.s_addr ? vp0 : NULL, codec0, ast_test_flag(p0, FLAG_NAT_ACTIVE))) + if (pr1->set_rtp_peer(c1, t0.sin_addr.s_addr || t0.sin_port ? p0 : NULL, vt0.sin_addr.s_addr || vt0.sin_port ? vp0 : NULL, codec0, ast_test_flag(p0, FLAG_NAT_ACTIVE))) ast_log(LOG_WARNING, "Channel '%s' failed to update to '%s'\n", c1->name, c0->name); memcpy(&ac0, &t0, sizeof(ac0)); memcpy(&vac0, &vt0, sizeof(vac0));