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/branches/1.8@316224 65c4cc65-6c06-0410-ace0-fbb531ad65f3
certified/1.8.6
Richard Mudgett 14 years ago
parent 981716535a
commit c5ad2f12a0

@ -6069,10 +6069,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);
@ -6081,17 +6082,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. */
@ -6101,14 +6097,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;
@ -6122,7 +6149,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;
@ -6139,28 +6165,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) */
@ -6374,6 +6402,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);
@ -6407,8 +6436,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;

@ -1467,7 +1467,6 @@ int analog_hangup(struct analog_pvt *p, struct ast_channel *ast)
}
analog_stop_callwait(p);
ast->tech_pvt = NULL;
ast_verb(3, "Hanging up on '%s'\n", ast->name);

@ -6260,8 +6260,6 @@ int sig_pri_hangup(struct sig_pri_chan *p, struct ast_channel *ast)
sig_pri_span_devstate_changed(p->pri);
pri_rel(p->pri);
ast->tech_pvt = NULL;
return 0;
}

Loading…
Cancel
Save