[svn-commits] rmudgett: branch 1.8 r316224 - /branches/1.8/channels/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue May 3 14:18:38 CDT 2011


Author: rmudgett
Date: Tue May  3 14:18:30 2011
New Revision: 316224

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=316224
Log:
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

Modified:
    branches/1.8/channels/chan_dahdi.c
    branches/1.8/channels/sig_analog.c
    branches/1.8/channels/sig_pri.c

Modified: branches/1.8/channels/chan_dahdi.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_dahdi.c?view=diff&rev=316224&r1=316223&r2=316224
==============================================================================
--- branches/1.8/channels/chan_dahdi.c (original)
+++ branches/1.8/channels/chan_dahdi.c Tue May  3 14:18:30 2011
@@ -6069,10 +6069,11 @@
 		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 @@
 			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 @@
 		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 @@
 		/* 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 @@
 		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);
-
-		if (num_restart_pending == 0)
+		ast_channel_setoption(ast, AST_OPTION_AUDIO_MODE, &x, sizeof(char), 0);
+
+		if (num_restart_pending == 0) {
 			restart_monitor();
-
-		ast->tech_pvt = NULL;
+		}
 		goto hangup_out;
 	}
 #endif	/* defined(HAVE_SS7) */
@@ -6374,6 +6402,7 @@
 			break;
 		default:
 			tone_zone_play_tone(p->subs[SUB_REAL].dfd, -1);
+			break;
 		}
 		if (p->sig)
 			dahdi_disable_ec(p);
@@ -6407,8 +6436,8 @@
 	p->cidcwexpire = 0;
 	p->cid_suppress_expire = 0;
 	p->oprmode = 0;
+hangup_out:
 	ast->tech_pvt = NULL;
-hangup_out:
 	ast_free(p->cidspill);
 	p->cidspill = NULL;
 

Modified: branches/1.8/channels/sig_analog.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/sig_analog.c?view=diff&rev=316224&r1=316223&r2=316224
==============================================================================
--- branches/1.8/channels/sig_analog.c (original)
+++ branches/1.8/channels/sig_analog.c Tue May  3 14:18:30 2011
@@ -1467,7 +1467,6 @@
 	}
 
 	analog_stop_callwait(p);
-	ast->tech_pvt = NULL;
 
 	ast_verb(3, "Hanging up on '%s'\n", ast->name);
 

Modified: branches/1.8/channels/sig_pri.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/sig_pri.c?view=diff&rev=316224&r1=316223&r2=316224
==============================================================================
--- branches/1.8/channels/sig_pri.c (original)
+++ branches/1.8/channels/sig_pri.c Tue May  3 14:18:30 2011
@@ -6260,8 +6260,6 @@
 
 	sig_pri_span_devstate_changed(p->pri);
 	pri_rel(p->pri);
-
-	ast->tech_pvt = NULL;
 	return 0;
 }
 




More information about the svn-commits mailing list