diff options
author | oej <oej@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-12-02 11:32:51 +0000 |
---|---|---|
committer | oej <oej@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-12-02 11:32:51 +0000 |
commit | 26ab0f0fd495ae94a975ae475f618bb4459bff80 (patch) | |
tree | 3ee171b5893dfa8d8efdf644a78be63d96dffeae /channels | |
parent | eef3755e11518c7e7db722168eded36e103b6092 (diff) |
- Disable RTP hold timers while T.38 fax transmission happens
- Encapsulate RTP timers in the rtp structure so we have one for video and one for audio
The video one is not used in 1.4, really. Will be used for RTP keepalives when we can send
something that video phones support in the RTP stream.
I now this is a big architectual change at this stage for 1.4, but decided it was needed
to avoid future bug reports.
- Document the RTP NAT keepalive option in sip.conf.sample
Issue 7679 in the bug tracker. Please test.
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@48199 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_sip.c | 53 |
1 files changed, 32 insertions, 21 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 6b3be234c..80b009157 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -948,8 +948,6 @@ static struct sip_pvt { time_t lastrtprx; /*!< Last RTP received */ time_t lastrtptx; /*!< Last RTP sent */ int rtptimeout; /*!< RTP timeout time */ - int rtpholdtimeout; /*!< RTP timeout when on hold */ - int rtpkeepalive; /*!< Send RTP packets for keepalive */ struct sockaddr_in recv; /*!< Received as */ struct in_addr ourip; /*!< Our IP */ struct ast_channel *owner; /*!< Who owns us (if we have an owner) */ @@ -2593,17 +2591,21 @@ static int create_addr_from_peer(struct sip_pvt *dialog, struct sip_peer *peer) if (dialog->rtp) { ast_rtp_setdtmf(dialog->rtp, ast_test_flag(&dialog->flags[0], SIP_DTMF) != SIP_DTMF_INFO); ast_rtp_setdtmfcompensate(dialog->rtp, ast_test_flag(&dialog->flags[1], SIP_PAGE2_RFC2833_COMPENSATE)); + ast_rtp_set_rtptimeout(dialog->rtp, peer->rtptimeout); + ast_rtp_set_rtpholdtimeout(dialog->rtp, peer->rtpholdtimeout); + ast_rtp_set_rtpkeepalive(dialog->rtp, peer->rtpkeepalive); + /* Set Frame packetization */ + ast_rtp_codec_setpref(dialog->rtp, &dialog->prefs); + dialog->autoframing = peer->autoframing; } if (dialog->vrtp) { ast_rtp_setdtmf(dialog->vrtp, 0); ast_rtp_setdtmfcompensate(dialog->vrtp, 0); + ast_rtp_set_rtptimeout(dialog->vrtp, peer->rtptimeout); + ast_rtp_set_rtpholdtimeout(dialog->vrtp, peer->rtpholdtimeout); + ast_rtp_set_rtpkeepalive(dialog->vrtp, peer->rtpkeepalive); } - /* Set Frame packetization */ - if (dialog->rtp) { - ast_rtp_codec_setpref(dialog->rtp, &dialog->prefs); - dialog->autoframing = peer->autoframing; - } ast_string_field_set(dialog, peername, peer->username); ast_string_field_set(dialog, authname, peer->username); ast_string_field_set(dialog, username, peer->username); @@ -2642,8 +2644,6 @@ static int create_addr_from_peer(struct sip_pvt *dialog, struct sip_peer *peer) dialog->noncodeccapability &= ~AST_RTP_DTMF; ast_string_field_set(dialog, context, peer->context); dialog->rtptimeout = peer->rtptimeout; - dialog->rtpholdtimeout = peer->rtpholdtimeout; - dialog->rtpkeepalive = peer->rtpkeepalive; if (peer->call_limit) ast_set_flag(&dialog->flags[0], SIP_CALL_LIMIT); dialog->maxcallbitrate = peer->maxcallbitrate; @@ -4171,16 +4171,19 @@ static struct sip_pvt *sip_alloc(ast_string_field callid, struct sockaddr_in *si ast_rtp_setdtmf(p->rtp, ast_test_flag(&p->flags[0], SIP_DTMF) != SIP_DTMF_INFO); ast_rtp_setdtmfcompensate(p->rtp, ast_test_flag(&p->flags[1], SIP_PAGE2_RFC2833_COMPENSATE)); ast_rtp_settos(p->rtp, global_tos_audio); + ast_rtp_set_rtptimeout(p->rtp, global_rtptimeout); + ast_rtp_set_rtpholdtimeout(p->rtp, global_rtpholdtimeout); + ast_rtp_set_rtpkeepalive(p->rtp, global_rtpkeepalive); if (p->vrtp) { ast_rtp_settos(p->vrtp, global_tos_video); ast_rtp_setdtmf(p->vrtp, 0); ast_rtp_setdtmfcompensate(p->vrtp, 0); + ast_rtp_set_rtptimeout(p->vrtp, global_rtptimeout); + ast_rtp_set_rtpholdtimeout(p->vrtp, global_rtpholdtimeout); + ast_rtp_set_rtpkeepalive(p->vrtp, global_rtpkeepalive); } if (p->udptl) ast_udptl_settos(p->udptl, global_tos_audio); - p->rtptimeout = global_rtptimeout; - p->rtpholdtimeout = global_rtpholdtimeout; - p->rtpkeepalive = global_rtpkeepalive; p->maxcallbitrate = default_maxcallbitrate; } @@ -10184,6 +10187,7 @@ static int sip_show_settings(int fd, int argc, char *argv[]) ast_cli(fd, " T1 minimum: %d\n", global_t1min); ast_cli(fd, " Relax DTMF: %s\n", global_relaxdtmf ? "Yes" : "No"); ast_cli(fd, " Compact SIP headers: %s\n", compactheaders ? "Yes" : "No"); + ast_cli(fd, " RTP Keepalive: %d %s\n", global_rtpkeepalive, global_rtpkeepalive ? "" : "(Disabled)" ); ast_cli(fd, " RTP Timeout: %d %s\n", global_rtptimeout, global_rtptimeout ? "" : "(Disabled)" ); ast_cli(fd, " RTP Hold Timeout: %d %s\n", global_rtpholdtimeout, global_rtpholdtimeout ? "" : "(Disabled)"); ast_cli(fd, " MWI NOTIFY mime type: %s\n", default_notifymime); @@ -11598,6 +11602,9 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru if (bridgepvt->udptl) { if (p->t38.state == T38_PEER_REINVITE) { sip_handle_t38_reinvite(bridgepeer, p, 0); + ast_rtp_set_rtptimers_onhold(p->rtp); + if (p->vrtp) + ast_rtp_set_rtptimers_onhold(p->vrtp); /* Turn off RTP timers while we send fax */ } else if (p->t38.state == T38_DISABLED && bridgepeer && (bridgepvt->t38.state == T38_ENABLED)) { ast_log(LOG_WARNING, "RTP re-inivte after T38 session not handled yet !\n"); /* Insted of this we should somehow re-invite the other side of the bridge to RTP */ @@ -14714,23 +14721,23 @@ restartsearch: (sip->owner->_state == AST_STATE_UP) && !sip->redirip.sin_addr.s_addr) { if (sip->lastrtptx && - sip->rtpkeepalive && - (t > sip->lastrtptx + sip->rtpkeepalive)) { + ast_rtp_get_rtpkeepalive(sip->rtp) && + (t > sip->lastrtptx + ast_rtp_get_rtpkeepalive(sip->rtp))) { /* Need to send an empty RTP packet */ sip->lastrtptx = time(NULL); ast_rtp_sendcng(sip->rtp, 0); } if (sip->lastrtprx && - (sip->rtptimeout || sip->rtpholdtimeout) && - (t > sip->lastrtprx + sip->rtptimeout)) { + (ast_rtp_get_rtptimeout(sip->rtp) || ast_rtp_get_rtpholdtimeout(sip->rtp)) && + (t > sip->lastrtprx + ast_rtp_get_rtptimeout(sip->rtp))) { /* Might be a timeout now -- see if we're on hold */ struct sockaddr_in sin; ast_rtp_get_peer(sip->rtp, &sin); if (sin.sin_addr.s_addr || - (sip->rtpholdtimeout && - (t > sip->lastrtprx + sip->rtpholdtimeout))) { + (ast_rtp_get_rtpholdtimeout(sip->rtp) && + (t > sip->lastrtprx + ast_rtp_get_rtpholdtimeout(sip->rtp)))) { /* Needs a hangup */ - if (sip->rtptimeout) { + if (ast_rtp_get_rtptimeout(sip->rtp)) { while (sip->owner && ast_channel_trylock(sip->owner)) { ast_mutex_unlock(&sip->lock); usleep(1); @@ -14751,8 +14758,12 @@ restartsearch: has already been requested and we don't want to repeatedly request hangups */ - sip->rtptimeout = 0; - sip->rtpholdtimeout = 0; + ast_rtp_set_rtptimeout(sip->rtp, 0); + ast_rtp_set_rtpholdtimeout(sip->rtp, 0); + if (sip->vrtp) { + ast_rtp_set_rtptimeout(sip->vrtp, 0); + ast_rtp_set_rtpholdtimeout(sip->vrtp, 0); + } } } } |