Merged revisions 316224 via svnmerge from
authorRichard Mudgett <rmudgett@digium.com>
Tue, 3 May 2011 19:22:29 +0000 (19:22 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 3 May 2011 19:22:29 +0000 (19:22 +0000)
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

channels/chan_dahdi.c
channels/sig_analog.c
channels/sig_pri.c

index c09d396..80f0211 100644 (file)
@@ -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;
 
index 5fcb485..5489f04 100644 (file)
@@ -1470,7 +1470,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);
 
index c032bf2..ad72f69 100644 (file)
@@ -7179,8 +7179,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;
 }