From a67c5aa48ec7501feb358584a1d6337ea7c622fd Mon Sep 17 00:00:00 2001 From: Automerge script Date: Wed, 20 Jun 2012 00:22:02 +0000 Subject: [PATCH] Merged revisions 369091 via svnmerge from file:///srv/subversion/repos/asterisk/branches/10 ........ r369091 | may | 2012-06-19 18:32:06 -0500 (Tue, 19 Jun 2012) | 9 lines check rtptimeouts in ooh323 channels as per config file (rtp voice, video, udptl except rtcp) (closes issue ASTERISK-19179) Reported by: TSAREGORODTSEV Yury Patches: 19179-ooh323-ast10.patch ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10-digiumphones@369107 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- addons/chan_ooh323.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/addons/chan_ooh323.c b/addons/chan_ooh323.c index f9ee8f9977..069e14a2ec 100644 --- a/addons/chan_ooh323.c +++ b/addons/chan_ooh323.c @@ -1141,6 +1141,8 @@ static int ooh323_write(struct ast_channel *ast, struct ast_frame *f) if (p) { ast_mutex_lock(&p->lock); + p->lastrtptx = time(NULL); + if (f->frametype == AST_FRAME_MODEM) { ast_debug(1, "Send UDPTL %d/%d len %d for %s\n", f->frametype, f->subclass.integer, f->datalen, ast->name); @@ -3700,6 +3702,24 @@ static void *do_monitor(void *data) h323_next = h323->next; /* TODO: Need to add rtptimeout keepalive support */ + + if (h323->rtp && h323->rtptimeout && h323->lastrtptx && + h323->lastrtptx + h323->rtptimeout < t) { + ast_rtp_instance_sendcng(h323->rtp, 0); + h323->lastrtptx = time(NULL); + } + + if (h323->rtp && h323->owner && h323->rtptimeout && + h323->lastrtprx && + h323->lastrtprx + h323->rtptimeout < t) { + if (!ast_channel_trylock(h323->owner)) { + ast_softhangup_nolock(h323->owner, AST_SOFTHANGUP_DEV); + ast_log(LOG_NOTICE, "Disconnecting call '%s' for lack of RTP activity in %ld seconds\n", h323->owner->name, (long) (t - h323->lastrtprx)); + ast_channel_unlock(h323->owner); + } + + } + if (ast_test_flag(h323, H323_NEEDDESTROY)) { ooh323_destroy (h323); } /* else if (ast_test_flag(h323, H323_NEEDSTART) && h323->owner) { @@ -4568,12 +4588,14 @@ struct ast_frame *ooh323_rtp_read(struct ast_channel *ast, struct ooh323_pvt *p) switch (ast->fdno) { case 0: f = ast_rtp_instance_read(p->rtp, 0); /* RTP Audio */ + p->lastrtprx = time(NULL); break; case 1: f = ast_rtp_instance_read(p->rtp, 1); /* RTCP Control Channel */ break; case 2: f = ast_rtp_instance_read(p->vrtp, 0); /* RTP Video */ + p->lastrtprx = time(NULL); break; case 3: f = ast_rtp_instance_read(p->vrtp, 1); /* RTCP Control Channel for video */ @@ -4584,6 +4606,7 @@ struct ast_frame *ooh323_rtp_read(struct ast_channel *ast, struct ooh323_pvt *p) ast_debug(1, "Got UDPTL %d/%d len %d for %s\n", f->frametype, f->subclass.integer, f->datalen, ast->name); } + p->lastrtprx = time(NULL); break; default: