From 081e73d9f3f90f74ce83f89966f513c130f6b20a Mon Sep 17 00:00:00 2001
From: Moises Silva <moy@sangoma.com>
Date: Thu, 6 Oct 2011 17:54:46 -0400
Subject: [PATCH 01/12] freetdm: ftmod_wanpipe - remove debug idle messages for
 good, not worth the noise

---
 libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c
index d0d66205a5..696a41f0cf 100644
--- a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c
+++ b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c
@@ -884,12 +884,6 @@ static void wanpipe_write_stats(ftdm_channel_t *ftdmchan, wp_tdm_api_tx_hdr_t *t
 	}
 
 	if (ftdmchan->iostats.tx.idle_packets < tx_stats->wp_api_tx_hdr_tx_idle_packets) {
-		/* HDLC channels do not always transmit, so its ok for drivers to fill with idle
-		 * also do not report idle warning when we just started transmitting */
-		if (ftdmchan->iostats.tx.packets && FTDM_IS_VOICE_CHANNEL(ftdmchan)) {
-			ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Tx idle changed from %d to %d\n", 
-					ftdmchan->iostats.tx.idle_packets, tx_stats->wp_api_tx_hdr_tx_idle_packets);
-		}
 		ftdmchan->iostats.tx.idle_packets = tx_stats->wp_api_tx_hdr_tx_idle_packets;
 	}
 

From bca480e667c714332c638100428962739dc782e4 Mon Sep 17 00:00:00 2001
From: yannick <yannick@sangoma.com>
Date: Thu, 6 Oct 2011 17:36:50 -0400
Subject: [PATCH 02/12] ftdm: fixing reset on in-use channel causing infinite
 state loop.

---
 .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c |  8 +++++--
 .../ftmod_sangoma_ss7_main.c                  | 24 ++++++++++++++-----
 2 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
index 9ff19bac02..ee97e9f356 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
@@ -29,6 +29,10 @@
  * LIABILITY|WHETHER IN CONTRACT|STRICT LIABILITY|OR TORT (INCLUDING
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  * SOFTWARE|EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Contributors:
+ * James Zhang <jzhang@sangoma.com>
+ *
  */
 
 #if 0 
@@ -1198,7 +1202,7 @@ static ftdm_status_t handle_show_blocks(ftdm_stream_handle_t *stream, int span,
 				} 
 
 #ifdef SMG_RELAY_DBG
-				stream->write_function(stream, " blk_flag= %x     ckt_flag = %d", ss7_info->blk_flags, ss7_info->ckt_flags );
+				stream->write_function(stream," blk_flag=%x | ckt_flag=%x | chan_flag=%x", ss7_info->blk_flags, ss7_info->ckt_flags, ftdmchan->flags);
 #endif
 				stream->write_function(stream, "\n");				
 			} /* if ( span and chan) */
@@ -1312,7 +1316,7 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span,
 					}
 		
 #ifdef SMG_RELAY_DBG
-					stream->write_function(stream," blk_flag= %x     ckt_flag = %d", ss7_info->blk_flags, ss7_info->ckt_flags );
+					stream->write_function(stream," blk_flag=%x | ckt_flag=%x | chan_flag=%x", ss7_info->blk_flags, ss7_info->ckt_flags, ftdmchan->flags);
 #endif
 					stream->write_function(stream, "\n");
 				} /* if ( hole, sig, voice) */
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
index 5341983e46..44870a69a9 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
@@ -842,9 +842,18 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
 		if (sngss7_test_ckt_flag (sngss7_info, FLAG_REMOTE_REL)) {
 			/* check if this hangup is from a tx RSC */
 			if (sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_TX)) {
-				/* go to RESTART State until RSCa is received */
-				state_flag = 0;
-				ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
+				if (!sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_SENT)) {
+					ft_to_sngss7_rsc (ftdmchan);
+					sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_SENT);
+					ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
+				} else if (sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_TX_RSP)) {
+					state_flag = 0;
+					ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
+				} else {
+					/* go to RESTART State until RSCa is received */
+					state_flag = 0;
+					ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
+				}	
 			} else {
 				/* if the hangup is from a rx RSC, rx GRS, or glare don't sent RLC */
 				if (!(sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_RX)) &&
@@ -1040,9 +1049,12 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
 		if ((sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_TX)) &&
 			!(sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_SENT))) {
 
-			/* send a reset request */
-			ft_to_sngss7_rsc (ftdmchan);
-			sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_SENT);
+			/* don't send out reset before finished hanging up if I'm in-use. */
+			if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE)) {
+				/* send a reset request */
+				ft_to_sngss7_rsc (ftdmchan);
+				sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_SENT);
+			}
 
 		} /* if (sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_TX)) */
 

From fb77b6c8009d1b670b0617e40c2f4958865a951b Mon Sep 17 00:00:00 2001
From: James Zhang <jzhang@sangoma.com>
Date: Thu, 6 Oct 2011 18:53:38 -0400
Subject: [PATCH 03/12] freetdm: ss7 - fixing reset on in-use channel causing
 signaling down in the receiving side

---
 .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c      | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
index 44870a69a9..049aa1546d 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
@@ -944,7 +944,9 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
 
 		/* check if we came from reset (aka we just processed a reset) */
 		if ((ftdmchan->last_state == FTDM_CHANNEL_STATE_RESTART) || 
-			(ftdmchan->last_state == FTDM_CHANNEL_STATE_SUSPENDED)) {
+			(ftdmchan->last_state == FTDM_CHANNEL_STATE_SUSPENDED) || 
+			(ftdmchan->last_state == FTDM_CHANNEL_STATE_HANGUP_COMPLETE)) {
+				
 
 			/* check if reset flags are up indicating there is more processing to do yet */
 			if (!(sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_TX)) &&

From e7ecb4d63aea56b9f17cf53a67e3c5a920077fee Mon Sep 17 00:00:00 2001
From: Moises Silva <moy@sangoma.com>
Date: Thu, 6 Oct 2011 12:45:00 -0400
Subject: [PATCH 04/12] freetdm: Added SS7 variables for location number
 (pending SIP-X header integration)

---
 .../ftmod_sangoma_ss7_handle.c                | 22 +++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
index cacb854372..bb6f19181b 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
@@ -223,6 +223,28 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
 					copy_tknStr_from_sngss7(siConEvnt->cgPtyNum1.addrSig, var, siConEvnt->cgPtyNum1.oddEven);
 					sngss7_add_var(sngss7_info, "ss7_loc_digits", var);
 				}
+				if (siConEvnt->cgPtyNum1.scrnInd.pres) {
+					/* fill in the screening indication value */
+					sprintf(var, "%d", siConEvnt->cgPtyNum1.scrnInd.val);
+					sngss7_add_var(sngss7_info, "ss7_loc_screen_ind", var);
+				}
+
+				if (siConEvnt->cgPtyNum1.presRest.pres) {
+					/* fill in the presentation value */
+					sprintf(var, "%d", siConEvnt->cgPtyNum1.presRest.val);
+					sngss7_add_var(sngss7_info, "ss7_loc_pres_ind", var);
+				}
+
+				if (siConEvnt->cgPtyNum1.natAddrInd.pres) {
+					sprintf(var, "%d", siConEvnt->cgPtyNum1.natAddrInd.val);
+					sngss7_add_var(sngss7_info, "ss7_loc_nadi", var);
+				}
+			} else {
+				SS7_DEBUG_CHAN(ftdmchan, "No Location Number information in IAM%s\n", " ");
+			}
+
+			sprintf(var, "%d", sngss7_info->circuit->cic);
+			sngss7_add_var(sngss7_info, "ss7_cic", var);
 
 				if (siConEvnt->cgPtyNum1.scrnInd.pres) {
 					/* fill in the screening indication value */

From edad46647b6b50b1fa67bb3b192147ef6c619710 Mon Sep 17 00:00:00 2001
From: James Zhang <jzhang@sangoma.com>
Date: Fri, 30 Sep 2011 16:03:08 -0400
Subject: [PATCH 05/12] ftdm: change max_path length from 255 to 4096

---
 .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h        | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h
index d58d2a5331..caef19af12 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h
@@ -51,7 +51,7 @@
 
 /* DEFINES ********************************************************************/
 #define MAX_NAME_LEN			25
-#define MAX_PATH				255
+#define MAX_PATH				4096
 
 #define MAX_CIC_LENGTH			5
 #define MAX_CIC_MAP_LENGTH		1000 

From 20abac27940f98368defe6d791f09497904fd40c Mon Sep 17 00:00:00 2001
From: James Zhang <jzhang@sangoma.com>
Date: Fri, 30 Sep 2011 10:25:21 -0400
Subject: [PATCH 06/12] ftdm_ss7: Adding OPC and Call Reference Number to SIP
 x-headers

---
 libs/freetdm/mod_freetdm/mod_freetdm.c            | 15 +++++++++++++++
 .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c  |  8 ++++++++
 2 files changed, 23 insertions(+)

diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c
index 043f353aa3..d18a647329 100755
--- a/libs/freetdm/mod_freetdm/mod_freetdm.c
+++ b/libs/freetdm/mod_freetdm/mod_freetdm.c
@@ -1830,6 +1830,21 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
 
 		switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Screen", "%d", channel_caller_data->screen);
 		switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Presentation", "%d", channel_caller_data->pres);
+		
+		var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_opc");
+		if (!ftdm_strlen_zero(var_value)) {
+			switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-OPC", "%s", var_value);
+		}
+		
+		var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_lac");
+		if (!ftdm_strlen_zero(var_value)) {
+			switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-LAC", "%s", var_value);
+		}
+		
+		var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_crn");
+		if (!ftdm_strlen_zero(var_value)) {
+			switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CRN", "%s", var_value);
+		}
 	}
 
 	/* Add any call variable to the dial plan */
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
index bb6f19181b..c625ff443c 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
@@ -269,6 +269,14 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
 			sprintf(var, "%d", sngss7_info->circuit->cic);
 			sngss7_add_var(sngss7_info, "ss7_cic", var);
 
+			sprintf(var, "%d", g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].spc );
+			sngss7_add_var(sngss7_info, "ss7_opc", var);
+			
+			if (siConEvnt->callRef.callId.pres) {
+				sprintf(var, "%u", (unsigned int)siConEvnt->callRef.callId.val);
+				sngss7_add_var(sngss7_info, "ss7_crn", var);
+			}
+			
 			if (sngss7_info->circuit->transparent_iam) {
 				sngss7_save_iam(ftdmchan, siConEvnt);
 			}

From 591cbe78573051d9729911efb30e5f5d088720c4 Mon Sep 17 00:00:00 2001
From: James Zhang <jzhang@sangoma.com>
Date: Fri, 30 Sep 2011 11:52:33 -0400
Subject: [PATCH 07/12] fixing bug 1625 - relay status not reported properly in
 the cli

---
 .../src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c       | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
index ee97e9f356..9eb737a7f3 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
@@ -1308,7 +1308,9 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span,
 							stream->write_function(stream, "r_hw=N|");
 						}
 	
-						if (sngss7_test_ckt_blk_flag(ss7_info, FLAG_RELAY_DOWN)) {
+
+						if (g_ftdm_sngss7_data.cfg.procId != 1) {
+						/* if (sngss7_test_ckt_blk_flag(ss7_info, FLAG_RELAY_DOWN)) { */
 							stream->write_function(stream, "relay=Y|");
 						}else {
 							stream->write_function(stream, "relay=N");

From c0f988b292924f3e25aff5b5b1e6d243c61b9a06 Mon Sep 17 00:00:00 2001
From: root <james>
Date: Fri, 30 Sep 2011 13:09:13 -0400
Subject: [PATCH 08/12] freetdm: changing call reference to generic header;
 removing location area code

---
 libs/freetdm/mod_freetdm/mod_freetdm.c              | 13 ++-----------
 .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c    |  5 +++--
 libs/freetdm/src/include/freetdm.h                  |  1 +
 3 files changed, 6 insertions(+), 13 deletions(-)

diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c
index d18a647329..cd5dc07d01 100755
--- a/libs/freetdm/mod_freetdm/mod_freetdm.c
+++ b/libs/freetdm/mod_freetdm/mod_freetdm.c
@@ -1830,21 +1830,12 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
 
 		switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Screen", "%d", channel_caller_data->screen);
 		switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Presentation", "%d", channel_caller_data->pres);
-		
+		switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CallReference", "%d", channel_caller_data->call_reference);
+
 		var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_opc");
 		if (!ftdm_strlen_zero(var_value)) {
 			switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-OPC", "%s", var_value);
 		}
-		
-		var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_lac");
-		if (!ftdm_strlen_zero(var_value)) {
-			switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-LAC", "%s", var_value);
-		}
-		
-		var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_crn");
-		if (!ftdm_strlen_zero(var_value)) {
-			switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CRN", "%s", var_value);
-		}
 	}
 
 	/* Add any call variable to the dial plan */
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
index c625ff443c..5acc8d1214 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
@@ -273,8 +273,9 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
 			sngss7_add_var(sngss7_info, "ss7_opc", var);
 			
 			if (siConEvnt->callRef.callId.pres) {
-				sprintf(var, "%u", (unsigned int)siConEvnt->callRef.callId.val);
-				sngss7_add_var(sngss7_info, "ss7_crn", var);
+				ftdmchan->caller_data.call_reference = (unsigned int)siConEvnt->callRef.callId.val;
+			} else {
+				ftdmchan->caller_data.call_reference = 0;
 			}
 			
 			if (sngss7_info->circuit->transparent_iam) {
diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h
index 238314c560..585a5d72ae 100755
--- a/libs/freetdm/src/include/freetdm.h
+++ b/libs/freetdm/src/include/freetdm.h
@@ -362,6 +362,7 @@ typedef struct ftdm_caller_data {
 	/* user information layer 1 protocol */
 	ftdm_user_layer1_prot_t bearer_layer1;
 	ftdm_calling_party_category_t cpc; /*!< Calling party category */
+	uint32_t call_reference;
 
 	ftdm_channel_t *fchan; /*!< FreeTDM channel associated (can be NULL) */
 

From 3a44e4c1868435039a47c42e4cacaf77a4033960 Mon Sep 17 00:00:00 2001
From: James Zhang <jzhang@sangoma.com>
Date: Thu, 6 Oct 2011 19:16:03 -0400
Subject: [PATCH 09/12] freetdm: ss7 - fix cherry-pick conflict properly

---
 .../ftmod_sangoma_ss7_handle.c                | 22 -------------------
 1 file changed, 22 deletions(-)

diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
index 5acc8d1214..dab2035450 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
@@ -223,28 +223,6 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
 					copy_tknStr_from_sngss7(siConEvnt->cgPtyNum1.addrSig, var, siConEvnt->cgPtyNum1.oddEven);
 					sngss7_add_var(sngss7_info, "ss7_loc_digits", var);
 				}
-				if (siConEvnt->cgPtyNum1.scrnInd.pres) {
-					/* fill in the screening indication value */
-					sprintf(var, "%d", siConEvnt->cgPtyNum1.scrnInd.val);
-					sngss7_add_var(sngss7_info, "ss7_loc_screen_ind", var);
-				}
-
-				if (siConEvnt->cgPtyNum1.presRest.pres) {
-					/* fill in the presentation value */
-					sprintf(var, "%d", siConEvnt->cgPtyNum1.presRest.val);
-					sngss7_add_var(sngss7_info, "ss7_loc_pres_ind", var);
-				}
-
-				if (siConEvnt->cgPtyNum1.natAddrInd.pres) {
-					sprintf(var, "%d", siConEvnt->cgPtyNum1.natAddrInd.val);
-					sngss7_add_var(sngss7_info, "ss7_loc_nadi", var);
-				}
-			} else {
-				SS7_DEBUG_CHAN(ftdmchan, "No Location Number information in IAM%s\n", " ");
-			}
-
-			sprintf(var, "%d", sngss7_info->circuit->cic);
-			sngss7_add_var(sngss7_info, "ss7_cic", var);
 
 				if (siConEvnt->cgPtyNum1.scrnInd.pres) {
 					/* fill in the screening indication value */

From 946f8af5a9543978e561676018c45c55da34b5e7 Mon Sep 17 00:00:00 2001
From: yannick <yannick@sangoma.com>
Date: Tue, 27 Sep 2011 15:44:20 -0400
Subject: [PATCH 10/12] freetdm: resolve mtp2 on relay always down problem

---
 .../ftmod_sangoma_ss7_relay.c                 | 49 +++++++------------
 1 file changed, 17 insertions(+), 32 deletions(-)

diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c
index bfb6971297..c99a14a7e7 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c
@@ -49,7 +49,7 @@ ftdm_status_t handle_relay_disconnect(RyMngmt *sta);
 static ftdm_status_t reconfig_all_ckts_for_relay(void);
 static ftdm_status_t disable_all_ckts_for_relay(void);
 static ftdm_status_t block_all_ckts_for_relay(uint32_t procId);
-static ftdm_status_t unblock_all_ckts_for_relay(uint32_t procId);
+/* static ftdm_status_t unblock_all_ckts_for_relay(uint32_t procId); */
 static ftdm_status_t disable_all_sigs_for_relay(uint32_t procId);
 static ftdm_status_t disble_all_mtp2_sigs_for_relay(void);
 /******************************************************************************/
@@ -59,43 +59,26 @@ ftdm_status_t handle_relay_connect(RyMngmt *sta)
 {
 	sng_relay_t	*sng_relay = &g_ftdm_sngss7_data.cfg.relay[sta->t.usta.s.ryUpUsta.id];
 
-
-	/* test if this is the first time the channel comes up */
 	if (!sngss7_test_flag(sng_relay, SNGSS7_RELAY_INIT)) {
-		SS7_INFO("Relay Channel %d initial connection UP\n", sng_relay->id);
-
-		/* mark the channel as being up */
+		/* SS7_INFO("Relay Channel %d initial connection UP\n", sng_relay->id); */
 		sngss7_set_flag(sng_relay, SNGSS7_RELAY_INIT);
-	} else {
-		SS7_INFO("Relay Channel %d connection UP\n", sng_relay->id);
-
-		/* react based on type of channel */
-		switch (sng_relay->type) {
-		/******************************************************************/
-		case (LRY_CT_TCP_CLIENT):
-			/* reconfigure all ISUP ckts, since the main system would have lost all configs */
+	}
+	
+	SS7_INFO("Relay Channel %d connection UP\n", sng_relay->id);
+	if (sng_relay->type == LRY_CT_TCP_CLIENT) {
+		if (!sngss7_test_flag(sng_relay, SNGSS7_RELAY_INIT)) {
 			if (reconfig_all_ckts_for_relay()) {
 				SS7_ERROR("Failed to reconfigure ISUP Ckts!\n");
 				/* we're done....this is very bad! */
 			}
-			break;
-		/******************************************************************/
-		case (LRY_CT_TCP_SERVER):
-			/* bring the sig links on the client system back up */
-			ftmod_ss7_enable_grp_mtp3Link(sta->t.usta.s.ryUpUsta.id);
-			
-			/* unbloock the ckts on the client system */
-			unblock_all_ckts_for_relay(sta->t.usta.s.ryUpUsta.id);
-			
-			break;
-		/******************************************************************/
-		default:
-			break;
-		/******************************************************************/
-		} /* switch (g_ftdm_sngss7_data.cfg.relay[sta->t.usta.s.ryUpUsta.id].type) */
-	} /* intial up? */
-
-	return FTDM_SUCCESS;
+		}
+		return FTDM_SUCCESS;
+	} else if (sng_relay->type == LRY_CT_TCP_SERVER) {
+		ftmod_ss7_enable_grp_mtp3Link(sta->t.usta.s.ryUpUsta.id);
+		/* unbloock the ckts on the client system */
+		return FTDM_SUCCESS;
+	}
+	return FTDM_FAIL;
 }
 
 /******************************************************************************/
@@ -310,6 +293,7 @@ ftdm_status_t disble_all_mtp2_sigs_for_relay(void)
 
 }
 
+#if 0
 /******************************************************************************/
 static ftdm_status_t unblock_all_ckts_for_relay(uint32_t procId)
 {
@@ -345,6 +329,7 @@ static ftdm_status_t unblock_all_ckts_for_relay(uint32_t procId)
 
 	return FTDM_SUCCESS;
 }
+#endif
 
 /******************************************************************************/
 /* For Emacs:

From 3b74246b1695f319dcb2022caff67f0b50aba9dd Mon Sep 17 00:00:00 2001
From: Moises Silva <moy@sangoma.com>
Date: Mon, 24 Oct 2011 12:43:54 -0400
Subject: [PATCH 11/12] freetdm: * Avoid acquiring the span mutex if the
 pendingchans queue is available for use *          * FreeTDM modules using
 the old FTDM_SPAN_STATE_CHANGE flag should be updated   *          * until
 then, they are still vulnerable to deadlock situations                  *    
      * Modules pending update: (ftmod_analog, ftmod_libpri, ftmod_isdn)      
        *          * Fixes Sangoma redmine ticket #1791 0 FTDM span stop
 deadlock                  *

---
 libs/freetdm/src/ftdm_state.c                 | 13 ++++++++++---
 libs/freetdm/src/include/private/ftdm_types.h |  6 ++++++
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/libs/freetdm/src/ftdm_state.c b/libs/freetdm/src/ftdm_state.c
index 54ecde530d..d3f99f6074 100644
--- a/libs/freetdm/src/ftdm_state.c
+++ b/libs/freetdm/src/ftdm_state.c
@@ -370,12 +370,19 @@ end:
 	}
 	ftdm_set_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE);
 
-	ftdm_mutex_lock(ftdmchan->span->mutex);
-	ftdm_set_flag(ftdmchan->span, FTDM_SPAN_STATE_CHANGE);
 	if (ftdmchan->span->pendingchans) {
 		ftdm_queue_enqueue(ftdmchan->span->pendingchans, ftdmchan);
+	} else {
+		/* there is a potential deadlock here, if a signaling module is processing
+		 * state changes while the ftdm_span_stop() function is called, the signaling
+		 * thread will block until it can acquire the span lock, but the thread calling
+		 * ftdm_span_stop() which holds the span lock is waiting on the signaling thread
+		 * to finish ... The only reason to acquire the span lock is this flag, new
+		 * signaling modules should use the pendingchans queue instead of this flag,
+		 * as of today a few modules need still to be updated before we can get rid of
+		 * this flag (ie, ftmod_libpri, ftmod_isdn, ftmod_analog) */
+		ftdm_set_flag_locked(ftdmchan->span, FTDM_SPAN_STATE_CHANGE);
 	}
-	ftdm_mutex_unlock(ftdmchan->span->mutex);
 
 	if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NONBLOCK)) {
 		/* the channel should not block waiting for state processing */
diff --git a/libs/freetdm/src/include/private/ftdm_types.h b/libs/freetdm/src/include/private/ftdm_types.h
index 2ed9fd04c5..6df25fe4d2 100755
--- a/libs/freetdm/src/include/private/ftdm_types.h
+++ b/libs/freetdm/src/include/private/ftdm_types.h
@@ -173,6 +173,12 @@ typedef enum {
 	FTDM_SPAN_SUSPENDED = (1 << 3),
 	FTDM_SPAN_IN_THREAD = (1 << 4),
 	FTDM_SPAN_STOP_THREAD = (1 << 5),
+	/*! Signaling modules set this flag to use fchan->pendingchans queue instead
+	 *  of the FTDM_SPAN_STATE_CHANGE flag to detect when there is channels with
+	 *  a state change pending in the span. If you set this member you can't rely
+	 *  on FTDM_SPAN_STATE_CHANGE anymore and must use the queue only instead. This
+	 *  is the new way of detecting state changes, new modules should always set this
+	 *  flag, the old modules still relying on FTDM_SPAN_STATE_CHANGE should be updated */
 	FTDM_SPAN_USE_CHAN_QUEUE = (1 << 6),
 	FTDM_SPAN_SUGGEST_CHAN_ID = (1 << 7),
 	FTDM_SPAN_USE_AV_RATE = (1 << 8),

From 680d92967f41de660a64a5981e88b1a12e1a1089 Mon Sep 17 00:00:00 2001
From: Moises Silva <moy@sangoma.com>
Date: Mon, 24 Oct 2011 13:21:15 -0400
Subject: [PATCH 12/12] freetdm: mod_freetdm - add SIP x header for
 FreeTDM-NADI value

---
 libs/freetdm/mod_freetdm/mod_freetdm.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c
index cd5dc07d01..055040858f 100755
--- a/libs/freetdm/mod_freetdm/mod_freetdm.c
+++ b/libs/freetdm/mod_freetdm/mod_freetdm.c
@@ -1773,6 +1773,11 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
 		switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Plan", "%d", channel_caller_data->rdnis.plan);
 		switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CPC", "%s", ftdm_calling_party_category2str(channel_caller_data->cpc));
 		
+		var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_clg_nadi");
+		if (!ftdm_strlen_zero(var_value)) {
+			switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-NADI", "%d", var_value);
+		}
+
 		var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdnis_screen_ind");
 		if (!ftdm_strlen_zero(var_value)) {
 			switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Screen", "%d", var_value);