summaryrefslogtreecommitdiff
path: root/channels/chan_dahdi.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2011-05-03 19:22:29 +0000
committerRichard Mudgett <rmudgett@digium.com>2011-05-03 19:22:29 +0000
commit810b9c887949fc4bd9f01dcdc0d3a4f476cb00de (patch)
treea77169329ee6e2e802cd540894a69e421e5fb5c3 /channels/chan_dahdi.c
parentdb72ee299a3e2ffc9e29651a036bc23b3bdc565c (diff)
Merged revisions 316224 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r316224 | rmudgett | 2011-05-03 14:18:30 -0500 (Tue, 03 May 2011) | 16 lines The dahdi_hangup() call does not clean up the channel fully. After dahdi_hangup() has supposedly hungup an ISDN channel there is still traffic on the S0-bus because the channel was not cleaned up fully. Shuffled the hangup code to include some missing cleanup. Also fixed some code formatting in the area. I think the primary missing clean up code was the call to tone_zone_play_tone() to turn off any active tones on the channel. (closes issue #19188) Reported by: jg1234 Patches: issue19188_v1.8.patch uploaded by rmudgett (license 664) Tested by: jg1234 ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@316240 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_dahdi.c')
-rw-r--r--channels/chan_dahdi.c75
1 files changed, 52 insertions, 23 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index c09d39654..80f0211d7 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -6135,10 +6135,11 @@ static int dahdi_hangup(struct ast_channel *ast)
p->cid_subaddr[0] = '\0';
}
-#ifdef HAVE_PRI
+#if defined(HAVE_PRI)
if (dahdi_sig_pri_lib_handles(p->sig)) {
x = 1;
- ast_channel_setoption(ast,AST_OPTION_AUDIO_MODE,&x,sizeof(char),0);
+ ast_channel_setoption(ast, AST_OPTION_AUDIO_MODE, &x, sizeof(char), 0);
+
dahdi_confmute(p, 0);
p->muting = 0;
restore_gains(p);
@@ -6147,17 +6148,12 @@ static int dahdi_hangup(struct ast_channel *ast)
p->dsp = NULL;
}
p->ignoredtmf = 0;
- revert_fax_buffers(p, ast);
- dahdi_setlinear(p->subs[SUB_REAL].dfd, 0);
- p->law = p->law_default;
- law = p->law_default;
- res = ioctl(p->subs[SUB_REAL].dfd, DAHDI_SETLAW, &law);
- dahdi_disable_ec(p);
- update_conf(p);
- reset_conf(p);
- sig_pri_hangup(p->sig_pvt, ast);
+
+ /* Real channel, do some fixup */
p->subs[SUB_REAL].owner = NULL;
p->subs[SUB_REAL].needbusy = 0;
+ dahdi_setlinear(p->subs[SUB_REAL].dfd, 0);
+
p->owner = NULL;
p->cid_tag[0] = '\0';
p->ringt = 0;/* Probably not used in this mode. Reset anyway. */
@@ -6167,14 +6163,45 @@ static int dahdi_hangup(struct ast_channel *ast)
p->digital = 0;
p->faxhandled = 0;
p->pulsedial = 0;/* Probably not used in this mode. Reset anyway. */
+
+ revert_fax_buffers(p, ast);
+
+ p->law = p->law_default;
+ law = p->law_default;
+ res = ioctl(p->subs[SUB_REAL].dfd, DAHDI_SETLAW, &law);
+ if (res < 0) {
+ ast_log(LOG_WARNING, "Unable to set law on channel %d to default: %s\n",
+ p->channel, strerror(errno));
+ }
+
+ sig_pri_hangup(p->sig_pvt, ast);
+
+ tone_zone_play_tone(p->subs[SUB_REAL].dfd, -1);
+ dahdi_disable_ec(p);
+
+ x = 0;
+ ast_channel_setoption(ast, AST_OPTION_TDD, &x, sizeof(char), 0);
+ p->didtdd = 0;/* Probably not used in this mode. Reset anyway. */
+
+ p->rdnis[0] = '\0';
+ update_conf(p);
+ reset_conf(p);
+
+ /* Restore data mode */
+ x = 0;
+ ast_channel_setoption(ast, AST_OPTION_AUDIO_MODE, &x, sizeof(char), 0);
+
+ if (num_restart_pending == 0) {
+ restart_monitor();
+ }
goto hangup_out;
}
-#endif
+#endif /* defined(HAVE_PRI) */
#if defined(HAVE_SS7)
if (p->sig == SIG_SS7) {
x = 1;
- ast_channel_setoption(ast,AST_OPTION_AUDIO_MODE,&x,sizeof(char),0);
+ ast_channel_setoption(ast, AST_OPTION_AUDIO_MODE, &x, sizeof(char), 0);
dahdi_confmute(p, 0);
p->muting = 0;
@@ -6188,7 +6215,6 @@ static int dahdi_hangup(struct ast_channel *ast)
/* Real channel, do some fixup */
p->subs[SUB_REAL].owner = NULL;
p->subs[SUB_REAL].needbusy = 0;
- p->polarity = POLARITY_IDLE;
dahdi_setlinear(p->subs[SUB_REAL].dfd, 0);
p->owner = NULL;
@@ -6205,28 +6231,30 @@ static int dahdi_hangup(struct ast_channel *ast)
p->law = p->law_default;
law = p->law_default;
res = ioctl(p->subs[SUB_REAL].dfd, DAHDI_SETLAW, &law);
- if (res < 0)
- ast_log(LOG_WARNING, "Unable to set law on channel %d to default: %s\n", p->channel, strerror(errno));
+ if (res < 0) {
+ ast_log(LOG_WARNING, "Unable to set law on channel %d to default: %s\n",
+ p->channel, strerror(errno));
+ }
sig_ss7_hangup(p->sig_pvt, ast);
tone_zone_play_tone(p->subs[SUB_REAL].dfd, -1);
dahdi_disable_ec(p);
+
x = 0;
- ast_channel_setoption(ast,AST_OPTION_TONE_VERIFY,&x,sizeof(char),0);
- ast_channel_setoption(ast,AST_OPTION_TDD,&x,sizeof(char),0);
+ ast_channel_setoption(ast, AST_OPTION_TDD, &x, sizeof(char), 0);
p->didtdd = 0;/* Probably not used in this mode. Reset anyway. */
+
update_conf(p);
reset_conf(p);
/* Restore data mode */
x = 0;
- ast_channel_setoption(ast,AST_OPTION_AUDIO_MODE,&x,sizeof(char),0);
+ ast_channel_setoption(ast, AST_OPTION_AUDIO_MODE, &x, sizeof(char), 0);
- if (num_restart_pending == 0)
+ if (num_restart_pending == 0) {
restart_monitor();
-
- ast->tech_pvt = NULL;
+ }
goto hangup_out;
}
#endif /* defined(HAVE_SS7) */
@@ -6440,6 +6468,7 @@ static int dahdi_hangup(struct ast_channel *ast)
break;
default:
tone_zone_play_tone(p->subs[SUB_REAL].dfd, -1);
+ break;
}
if (p->sig)
dahdi_disable_ec(p);
@@ -6473,8 +6502,8 @@ static int dahdi_hangup(struct ast_channel *ast)
p->cidcwexpire = 0;
p->cid_suppress_expire = 0;
p->oprmode = 0;
- ast->tech_pvt = NULL;
hangup_out:
+ ast->tech_pvt = NULL;
ast_free(p->cidspill);
p->cidspill = NULL;