From d6583acd3bd4992798092b32cd07679b3d6f18bf Mon Sep 17 00:00:00 2001
From: Moises Silva <moy@sangoma.com>
Date: Wed, 8 Dec 2010 11:57:24 -0500
Subject: [PATCH 1/2] freetdm: mod_freetdm - fix progress media state for R2
 signaling          ftmod_r2 - Do not set the state to DIALING unless
 openr2_chan_make_call succeeds

---
 libs/freetdm/mod_freetdm/mod_freetdm.c     | 11 ++++++++++-
 libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c | 10 ++++++----
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c
index ca16e8bc71..7ea6bb6d37 100755
--- a/libs/freetdm/mod_freetdm/mod_freetdm.c
+++ b/libs/freetdm/mod_freetdm/mod_freetdm.c
@@ -2033,7 +2033,6 @@ static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
 		break;
 
 		case FTDM_SIGEVENT_PROGRESS:
-		case FTDM_SIGEVENT_PROGRESS_MEDIA:
 		{
 			if ((session = ftdm_channel_get_session(sigmsg->channel, 0))) {
 				channel = switch_core_session_get_channel(session);
@@ -2043,6 +2042,16 @@ static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
 		}
 		break;
 
+		case FTDM_SIGEVENT_PROGRESS_MEDIA:
+		{
+			if ((session = ftdm_channel_get_session(sigmsg->channel, 0))) {
+				channel = switch_core_session_get_channel(session);
+				switch_channel_mark_pre_answered(channel);
+				switch_core_session_rwunlock(session);
+			}
+		}
+		break;
+
 		case FTDM_SIGEVENT_UP:
 		{
 			if ((session = ftdm_channel_get_session(sigmsg->channel, 0))) {
diff --git a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
index 2a95b01fe9..02860189b9 100644
--- a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
+++ b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
@@ -382,9 +382,6 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(r2_outgoing_call)
 	}
 
 	ft_r2_clean_call(ftdmchan->call_data);
-	R2CALL(ftdmchan)->ftdm_call_started = 1;
-	R2CALL(ftdmchan)->chanstate = FTDM_CHANNEL_STATE_DOWN;
-	ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DIALING);
 
 	/* start io dump */
 	if (r2data->mf_dump_size) {
@@ -395,7 +392,7 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(r2_outgoing_call)
 	callstatus = openr2_chan_make_call(R2CALL(ftdmchan)->r2chan, 
 			ftdmchan->caller_data.cid_num.digits, 
 			ftdmchan->caller_data.dnis.digits, 
-			OR2_CALLING_PARTY_CATEGORY_NATIONAL_SUBSCRIBER);
+			r2data->category);
 
 	if (callstatus) {
 		ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "Failed to make call in R2 channel, openr2_chan_make_call failed\n");
@@ -408,6 +405,10 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(r2_outgoing_call)
 		return FTDM_BREAK;
 	}
 
+	R2CALL(ftdmchan)->ftdm_call_started = 1;
+	R2CALL(ftdmchan)->chanstate = FTDM_CHANNEL_STATE_DOWN;
+	ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DIALING);
+
 	ftdm_channel_set_feature(ftdmchan, FTDM_CHANNEL_FEATURE_IO_STATS);
 	ftdm_channel_command(ftdmchan, FTDM_COMMAND_FLUSH_TX_BUFFERS, NULL);
 	ftdm_channel_command(ftdmchan, FTDM_COMMAND_FLUSH_RX_BUFFERS, NULL);
@@ -1354,6 +1355,7 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_r2_configure_span_signaling)
 		hashtable_insert(spanpvt->r2calls, (void *)r2call->name, r2call, HASHTABLE_FLAG_FREE_VALUE);
 	}
 	r2data->mf_dump_size = r2conf.mf_dump_size;
+	r2data->category = r2conf.category;
 	r2data->flags = 0;
 	spanpvt->r2context = r2data->r2context;
 

From de23c6d375cef19961bcc82b9c3f79d32a95190f Mon Sep 17 00:00:00 2001
From: Moises Silva <moy@sangoma.com>
Date: Wed, 8 Dec 2010 12:01:13 -0500
Subject: [PATCH 2/2] freetdm: ftmod_r2 - Remove buggy collision check

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

diff --git a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
index 02860189b9..fa0479d48b 100644
--- a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
+++ b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
@@ -399,12 +399,6 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(r2_outgoing_call)
 		return FTDM_FAIL;
 	}
 
-	if (ftdmchan->state !=  FTDM_CHANNEL_STATE_DIALING) {
-		ftdm_log_chan(ftdmchan, FTDM_LOG_WARNING, "Collision after call attempt, try another channel, new state = %s\n",
-				ftdm_channel_state2str(ftdmchan->state));
-		return FTDM_BREAK;
-	}
-
 	R2CALL(ftdmchan)->ftdm_call_started = 1;
 	R2CALL(ftdmchan)->chanstate = FTDM_CHANNEL_STATE_DOWN;
 	ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DIALING);