aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroot <root@f38db490-d61c-443f-a65b-d21fe96a405b>2006-09-01 18:02:51 +0000
committerroot <root@f38db490-d61c-443f-a65b-d21fe96a405b>2006-09-01 18:02:51 +0000
commit7f8eb5f74d6aaa9413f1c90c9374d202eba1ea8f (patch)
treee7cee630ae90c5699958925aa124054b93bf2341
parentd9585becbd04a9bb1944a4efd305558f6e828752 (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.c12
-rw-r--r--include/asterisk/rtp.h2
-rw-r--r--rtp.c14
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);
diff --git a/rtp.c b/rtp.c
index 7de9727e9..376bd93ce 100644
--- a/rtp.c
+++ b/rtp.c
@@ -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)