diff options
author | root <root@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-09-01 18:02:51 +0000 |
---|---|---|
committer | root <root@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-09-01 18:02:51 +0000 |
commit | 7f8eb5f74d6aaa9413f1c90c9374d202eba1ea8f (patch) | |
tree | e7cee630ae90c5699958925aa124054b93bf2341 | |
parent | d9585becbd04a9bb1944a4efd305558f6e828752 (diff) |
automerge commit
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2-netsec@41734 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | channels/chan_sip.c | 12 | ||||
-rw-r--r-- | include/asterisk/rtp.h | 2 | ||||
-rw-r--r-- | rtp.c | 14 |
3 files changed, 19 insertions, 9 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 41948a160..5259a459f 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -13051,13 +13051,14 @@ static struct ast_rtp *sip_get_vrtp_peer(struct ast_channel *chan) static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp, int codecs, int nat_active) { struct sip_pvt *p; + int changed = 0; p = chan->tech_pvt; if (!p) return -1; ast_mutex_lock(&p->lock); if (rtp) { - ast_rtp_get_peer(rtp, &p->redirip); + changed |= ast_rtp_get_peer(rtp, &p->redirip); #ifdef SIP_MIDCOM if (m_cb) m_cb->ast_rtp_get_their_nat_audio_hook(rtp, p->r); @@ -13066,7 +13067,7 @@ static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struc else memset(&p->redirip, 0, sizeof(p->redirip)); if (vrtp) { - ast_rtp_get_peer(vrtp, &p->vredirip); + changed |= ast_rtp_get_peer(vrtp, &p->vredirip); #ifdef SIP_MIDCOM if (m_cb) m_cb->ast_rtp_get_their_nat_video_hook(vrtp, p->r); @@ -13074,8 +13075,11 @@ static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struc } else memset(&p->vredirip, 0, sizeof(p->vredirip)); - p->redircodecs = codecs; - if (codecs && !ast_test_flag(p, SIP_GOTREFER)) { + if (codecs && (p->redircodecs != codecs)) { + p->redircodecs = codecs; + changed = 1; + } + if (changed && !ast_test_flag(p, SIP_GOTREFER)) { if (!p->pendinginvite) { if (option_debug > 2) { char iabuf[INET_ADDRSTRLEN]; diff --git a/include/asterisk/rtp.h b/include/asterisk/rtp.h index f1e771e34..45c1e5a07 100644 --- a/include/asterisk/rtp.h +++ b/include/asterisk/rtp.h @@ -96,7 +96,7 @@ struct ast_rtp *ast_rtp_new_with_bindaddr(struct sched_context *sched, struct io void ast_rtp_set_peer(struct ast_rtp *rtp, struct sockaddr_in *them); -void ast_rtp_get_peer(struct ast_rtp *rtp, struct sockaddr_in *them); +int ast_rtp_get_peer(struct ast_rtp *rtp, struct sockaddr_in *them); void ast_rtp_get_us(struct ast_rtp *rtp, struct sockaddr_in *us); @@ -1045,11 +1045,17 @@ void ast_rtp_set_peer(struct ast_rtp *rtp, struct sockaddr_in *them) rtp->rxseqno = 0; } -void ast_rtp_get_peer(struct ast_rtp *rtp, struct sockaddr_in *them) +int ast_rtp_get_peer(struct ast_rtp *rtp, struct sockaddr_in *them) { - them->sin_family = AF_INET; - them->sin_port = rtp->them.sin_port; - them->sin_addr = rtp->them.sin_addr; + if ((them->sin_family != AF_INET) || + (them->sin_port != rtp->them.sin_port) || + (them->sin_addr.s_addr != rtp->them.sin_addr.s_addr)) { + them->sin_family = AF_INET; + them->sin_port = rtp->them.sin_port; + them->sin_addr = rtp->them.sin_addr; + return 1; + } + return 0; } void ast_rtp_get_us(struct ast_rtp *rtp, struct sockaddr_in *us) |