From c7e0abdfed527966d7c609c2c989b9b770353cb7 Mon Sep 17 00:00:00 2001
From: Christian Richter <christian.richter@beronet.com>
Date: Wed, 22 Feb 2006 16:48:25 +0000
Subject: [PATCH] fixed a ETSI violation (after RELEASE we need to
 RELEASE_COMPLETE (network side) one needs to upgread mISDNuser for that fix
 as well. also fixed the reload issue #6547

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@10713 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_misdn.c            | 27 +++++++++++++++++----------
 channels/misdn/isdn_lib.c        | 19 ++++++++++---------
 channels/misdn/isdn_msg_parser.c |  4 ++--
 channels/misdn_config.c          |  2 +-
 4 files changed, 30 insertions(+), 22 deletions(-)

diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c
index 1e01f9646e..ab23bb732c 100644
--- a/channels/chan_misdn.c
+++ b/channels/chan_misdn.c
@@ -1915,14 +1915,16 @@ static int misdn_hangup(struct ast_channel *ast)
 			chan_misdn_log(1, bc->port, " --> cause %d\n",bc->cause);
 			chan_misdn_log(1, bc->port, " --> out_cause %d\n",bc->out_cause);
 			
+			bc->out_cause=-1;
 			misdn_lib_send_event(bc,EVENT_RELEASE);
 			break;
 		default:
 			/*  Alerting or Disconect */
 
-			if (bc->nt)
+			if (bc->nt) {
+				bc->out_cause=-1;
 				misdn_lib_send_event(bc, EVENT_RELEASE);
-			else
+			} else
 				misdn_lib_send_event(bc, EVENT_DISCONNECT);
 			p->state=MISDN_CLEANING; /* MISDN_HUNGUP_FROM_AST; */
 		}
@@ -3377,12 +3379,14 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
 		}
 		
 		stop_bc_tones(ch);
-		bc->out_cause=16;
+		/*bc->out_cause=16;*/
+		bc->out_cause=-1;
 		
-		//if (ch->state == MISDN_CONNECTED) 
-		//misdn_lib_send_event(bc,EVENT_RELEASE);
-		//else
-		//misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE);
+		/*if (ch->state == MISDN_CONNECTED) 
+		misdn_lib_send_event(bc,EVENT_RELEASE);
+		else
+		misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE);
+		*/
 		
 		misdn_lib_send_event(bc,EVENT_RELEASE);
 		
@@ -3401,15 +3405,18 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
 				  before, so we should RELEASE_COMPLETE after that Disconnect
 				  (looks like ALERTING State at misdn_hangup !!
 				*/
-				return RESPONSE_OK;
+				
+				/*return RESPONSE_OK;*/
 				break;
 			}
 			
 			
 			bc->out_cause=16;
 			
-			stop_bc_tones(ch);
-			release_chan(bc);
+			/*stop_bc_tones(ch);
+			  release_chan(bc);*/
+			
+			misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE);
 		}
 		break;
 	case EVENT_RELEASE_COMPLETE:
diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c
index ee0e988de7..8839be0f1a 100644
--- a/channels/misdn/isdn_lib.c
+++ b/channels/misdn/isdn_lib.c
@@ -1659,13 +1659,13 @@ handle_event_nt(void *dat, void *arg)
 
 		case CC_RELEASE|CONFIRM:
 		{
-			struct misdn_bchannel *bc=find_bc_by_l3id(stack, hh->dinfo);
-			cb_log(3, stack->port, " --> RELEASE CONFIRM, doing nothin\n");
-			cb_event(EVENT_CLEANUP, bc, glob_mgr->user_data);
-			empty_chan_in_stack(stack,bc->channel);
-			empty_bc(bc);
-			free_msg(msg);
-			return 0;
+			/*struct misdn_bchannel *bc=find_bc_by_l3id(stack, hh->dinfo);
+			  cb_log(3, stack->port, " --> RELEASE CONFIRM, doing nothin\n");
+			  cb_event(EVENT_CLEANUP, bc, glob_mgr->user_data);
+			  empty_chan_in_stack(stack,bc->channel);
+			  empty_bc(bc);
+			  free_msg(msg);
+			  return 0;*/
 		}
 		break;  
 		case CC_RELEASE|INDICATION:
@@ -2035,7 +2035,7 @@ int handle_bchan(msg_t *msg)
 				
 				int i=cb_event( EVENT_BCHAN_DATA, bc, glob_mgr->user_data);
 				if (i<0) {
-					cb_log(2,stack->port,"cb_event returned <0\n");
+					cb_log(5,stack->port,"cb_event returned <0\n");
 					/*clean_up_bc(bc);*/
 				}
 			}
@@ -2990,11 +2990,12 @@ int misdn_lib_init(char *portlist, struct misdn_lib_iface *iface, void *user_dat
 	glob_mgr = mgr;
   
 	msg_init();
-	debug_init(0 , NULL, NULL, NULL);
 #if 0
 	int flags=0xff;
 	flags &= ~DBGM_MSG;
 	debug_init( flags , NULL, NULL, NULL);
+#else
+	debug_init(0 , NULL, NULL, NULL);
 #endif	
 	if (!portlist || (*portlist == 0) ) return 1;
 	
diff --git a/channels/misdn/isdn_msg_parser.c b/channels/misdn/isdn_msg_parser.c
index a8d9c1beac..5bce3f523b 100644
--- a/channels/misdn/isdn_msg_parser.c
+++ b/channels/misdn/isdn_msg_parser.c
@@ -798,8 +798,8 @@ msg_t *build_release (struct isdn_msg msgs[], struct misdn_bchannel *bc, int nt)
  
 	release=(RELEASE_t*)((msg->data+HEADER_LEN)); 
   
-  
-	enc_ie_cause(&release->CAUSE, msg, nt?1:0, bc->out_cause, nt,bc);
+	if (bc->out_cause>= 0)
+		enc_ie_cause(&release->CAUSE, msg, nt?1:0, bc->out_cause, nt,bc);
   
 #if DEBUG 
 	printf("Building RELEASE Msg\n"); 
diff --git a/channels/misdn_config.c b/channels/misdn_config.c
index 94114baca2..b6366ef9f9 100644
--- a/channels/misdn_config.c
+++ b/channels/misdn_config.c
@@ -214,7 +214,7 @@ static void _free_port_cfg (void)
 {
 	int i, j;
 	int gn = map[MISDN_CFG_GROUPNAME];
-	union misdn_cfg_pt* free_list[max_ports + 1];
+	union misdn_cfg_pt* free_list[max_ports + 2];
 	
 	memset(free_list, 0, sizeof(free_list));
 	free_list[0] = port_cfg[0];
-- 
GitLab