diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 937a942ccf6323282de388bb6d7e498e1b5b3a86..b461284d1fdfd6246bb8aee59f62691ed575d6df 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -7576,7 +7576,7 @@ restartsearch: sip = iflist; while(sip) { ast_mutex_lock(&sip->lock); - if (sip->rtp && sip->lastrtprx && (sip->rtptimeout || sip->rtpholdtimeout)) { + if (sip->rtp && sip->lastrtprx && (sip->rtptimeout || sip->rtpholdtimeout) && !sip->redirip.sin_addr.s_addr) { if (t > sip->lastrtprx + sip->rtptimeout) { /* Might be a timeout now -- see if we're on hold */ struct sockaddr_in sin; @@ -8592,19 +8592,29 @@ static int reload_config(void) static struct ast_rtp *sip_get_rtp_peer(struct ast_channel *chan) { struct sip_pvt *p; + struct ast_rtp *rtp = NULL; p = chan->pvt->pvt; - if (p && p->rtp && p->canreinvite) - return p->rtp; - return NULL; + if (p) { + ast_mutex_lock(&p->lock); + if (p->rtp && p->canreinvite) + rtp = p->rtp; + ast_mutex_unlock(&p->lock); + } + return rtp; } static struct ast_rtp *sip_get_vrtp_peer(struct ast_channel *chan) { struct sip_pvt *p; + struct ast_rtp *rtp = NULL; p = chan->pvt->pvt; - if (p && p->vrtp && p->canreinvite) - return p->vrtp; - return NULL; + if (p) { + ast_mutex_lock(&p->lock); + if (p->vrtp && p->canreinvite) + rtp = p->vrtp; + ast_mutex_unlock(&p->lock); + } + return rtp; } static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp, int codecs) @@ -8612,6 +8622,7 @@ static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struc struct sip_pvt *p; p = chan->pvt->pvt; if (p) { + ast_mutex_lock(&p->lock); if (rtp) ast_rtp_get_peer(rtp, &p->redirip); else @@ -8629,6 +8640,9 @@ static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struc p->needreinvite = 1; } } + /* Reset lastrtprx timer */ + time(&p->lastrtprx); + ast_mutex_unlock(&p->lock); return 0; } return -1;