Project "FreeSWITCH Source" received a push.

branch: master updated

  discards  642882727f015be345501f6f7c727ef23ec70c9f (commit)
  discards  d8add09a352cdfca64fa94688285ce6c96e6f6dc (commit)
  discards  c81bf01fc977fd1a12b521cf29abb5b466f1fda2 (commit)
       via: 86884e52568eb7cdca89995fa82f407d4c4059c9 (commit)
       via: c0e340b188f8899767e1e347cc011ee3c0a6e88a (commit)
       via: 4f254ebe15c6c512570cd8968d36e936a07a25f2 (commit)
       via: 145884c94ce9bcb25aa14d45e6d689b0d4af75ed (commit)
       via: e6be62b0e14a1865f14617abde8eafdb667bbadb (commit)
       via: edfb1e9943b12a085ebb90190c5119721bee8550 (commit)
       via: 381738f70027fb4641f840d16597151eed8d7f67 (commit)
       via: acd6333e33b9ff9e0f1a424cb7dc5e5b1d063b6a (commit)
       via: d8b11ce63b908ae893feda5345ed712c9125623a (commit)
       via: b8afa79b4446b80336285d1ce0bb4293cb9e04ed (commit)
       via: 2582d71689191909fd8a62b5f5693ebd1b4dc8d1 (commit)
       via: c17da69d6773e2ac37bc256ad0669ea901525bec (commit)
       via: 3546654615f88058fb6769fe79e07162602fa4af (commit)
       via: 46215605f42bf534ab040e63b9bd84a6c34c3e05 (commit)
       via: 361178089943c14bb3f842d7ff5cd8950cbe2493 (commit)
       via: 1ee94c11c7b2fd46508eebb463ffd9a1cf9b19ce (commit)
       via: 6f9da9a070517ce30e9edec6a7d2536db0646c33 (commit)
       via: eeac03ef5028b565b28364752ef5a48307ca17d4 (commit)
       via: 8037b69f40413784631c59942b5d4fc856cff845 (commit)
       via: 67edc7c3215f6476452f3ff7ee82ba559c39656f (commit)
       via: 2adfc50af7958eea12c15e023bcf80b18a4c73f9 (commit)
       via: 0cbac4ad25ed3921262a7676397206f824aade32 (commit)
       via: 2401fec54b48d8dfb1ec5a2f33a092dac076c0f3 (commit)
       via: 330d741853f4f7c548b61dbcb717266a2bf24107 (commit)
       via: 93501b288b34a7d4f5287f7bc2b498a2321d73c5 (commit)
       via: df4a18dcba1ad6a3ac20f67982642e8fe0e35471 (commit)
       via: 0e841a5f14810514ee60562481c405d7fb560e72 (commit)
       via: a93623618b83fb08f2a0a728800f431856b29f92 (commit)
       via: 1e09a4d2dafdd9a5ffa2ab606d2caebf52baf25f (commit)
       via: 92f51bd60332511c5689c0993cf561f4a5493297 (commit)
       via: 23b387b7f5f4b13ca40c9d62ab06a04c66810e63 (commit)

This update added new revisions after undoing existing revisions.  That is
to say, the old revision is not a strict subset of the new revision.  This
situation occurs when you --force push a change and generate a repository
containing something like this:

 * -- * -- B -- O -- O -- O (642882727f015be345501f6f7c727ef23ec70c9f)
            \
             N -- N -- N (86884e52568eb7cdca89995fa82f407d4c4059c9)

When this happens we assume that you've already had alert emails for all
of the O revisions, and so we here report only the revisions in the N
branch from the common base, B.


= COMMIT LOG ===========================================================
committer: Moises Silva
comments: 
Merge branch 'master' into netborder
committer: Konrad Hammel
comments: 
freetdm: ss7 - update cli usuage print

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 0298429..280107a 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
@@ -680,8 +680,8 @@ static ftdm_status_t handle_print_usuage(ftdm_stream_handle_t *stream)
 	stream->write_function(stream, "ftdm ss7 set mtrace X Y\n");
 	stream->write_function(stream, "\n");
 	stream->write_function(stream, "Ftmod_sangoma_ss7 information:\n");
-	stream->write_function(stream, "ftdm ss7 show status link X\n");
-	stream->write_function(stream, "ftdm ss7 show status linkset X\n");
+	stream->write_function(stream, "ftdm ss7 show status mtp3 X\n");
+	stream->write_function(stream, "ftdm ss7 show status mtp2 X\n");
 	stream->write_function(stream, "ftdm ss7 show status span X chan Y\n");
 	stream->write_function(stream, "ftdm ss7 show free span X chan Y\n");
 	stream->write_function(stream, "ftdm ss7 show inuse span X chan Y\n");
committer: Konrad Hammel
comments: 
freetdm: ss7: bug fix for ticket 6290, channel status was not showing channel 1

diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
index 2f67d3f..166fe5d 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
@@ -2833,7 +2833,7 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan)
 		}
 
 		/* find a spot for this circuit in the global structure */
-		x = (ccSpan->procId * 1000);
+		x = (ccSpan->procId * 1000) + 1;
 		flag = 0;
 		while (flag == 0) {
 		/**********************************************************************/
committer: Moises Silva
comments: 
Merge remote branch 'fsorig/master'
committer: Konrad Hammel
comments: 
freetdm: ss7 - bug fix for change in FreeTDM API

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 d38d25f..48579ad 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
@@ -366,7 +366,7 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj)
 		check_for_res_sus_flag(ftdmspan);
 
 		/* Poll for events, e.g HW DTMF */
-		switch (ftdm_span_poll_event(ftdmspan, 0)) {
+		switch (ftdm_span_poll_event(ftdmspan, 0, NULL)) {
 		/**********************************************************************/
 		case FTDM_SUCCESS:
 			while (ftdm_span_next_event(ftdmspan, &event) == FTDM_SUCCESS);
committer: Konrad Hammel
comments: 
Merge branch 'konrad.02-09-11'
committer: Konrad Hammel
comments: 
freetdm: ss7 - bug fix for configuration

diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
index 1b24e34..2f67d3f 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
@@ -1749,33 +1749,46 @@ static int ftmod_ss7_parse_isup_interface(ftdm_conf_node_t *isup_interface)
 	/* default the interface to paused state */
 	sngss7_set_flag(&sng_isup, SNGSS7_PAUSED);
 
-	/* trickle down the SPC to all sub entities */
-	lnkSet = &g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].lnkSets;
 
-	g_ftdm_sngss7_data.cfg.mtp3Link[lnkSet->lsId].spc = sng_isup.spc;
-	lnkSet = lnkSet->next;
 
+	/* trickle down the SPC to all sub entities */
+	lnkSet = &g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].lnkSets;
 	while (lnkSet->next != NULL) {
-		g_ftdm_sngss7_data.cfg.mtp3Link[lnkSet->lsId].spc = sng_isup.spc;
+	/**************************************************************************/
+		/* go through all the links and check if they belong to this linkset*/
+		i = 1;
+		while (g_ftdm_sngss7_data.cfg.mtp3Link[i].id != 0) {
+			/* check if this link is in the linkset */
+			if (g_ftdm_sngss7_data.cfg.mtp3Link[i].linkSetId == lnkSet->lsId) {
+				/* fill in the spc */
+				g_ftdm_sngss7_data.cfg.mtp3Link[i].spc = sng_isup.spc;
+			}
+	
+			i++;
+		}
+	
+		/* move to the next lnkSet */
 		lnkSet = lnkSet->next;
-	}
+	/**************************************************************************/
+	} /* while (lnkSet->next != NULL) */
 
 	/* pull values from the lower levels */
-	sng_isup.dpc = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].dpc;
-	sng_isup.switchType = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].switchType;
-	sng_isup.nwId = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].nwId;
-
 	sng_isap.switchType = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].switchType;
 
+	/* fill in the isap */
 	ftmod_ss7_fill_in_isap(&sng_isap);
 
-	sng_isup.isap = sng_isap.id;
+	/* pull values from the lower levels */
+	sng_isup.isap 		= sng_isap.id;
+	sng_isup.dpc 		= g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].dpc;
+	sng_isup.switchType	= g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].switchType;
+	sng_isup.nwId 		= g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].nwId;
 
+	/* fill in the isup interface */
 	ftmod_ss7_fill_in_isup_interface(&sng_isup);
 
 	/* setup the self mtp3 route */
 	i = sng_isup.mtpRouteId;
-
 	if(ftmod_ss7_fill_in_self_route(sng_isup.spc,
 									g_ftdm_sngss7_data.cfg.mtpRoute[i].linkType,
 									g_ftdm_sngss7_data.cfg.mtpRoute[i].switchType,
committer: Moises Silva
comments: 
freetdm: disallow completely core variables for freetdm outbound variables

diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c
index c0fdaa6..78874de 100755
--- a/libs/freetdm/mod_freetdm/mod_freetdm.c
+++ b/libs/freetdm/mod_freetdm/mod_freetdm.c
@@ -1055,28 +1055,18 @@ switch_io_routines_t freetdm_io_routines = {
 static const char* channel_get_variable(switch_core_session_t *session, switch_event_t *var_event, const char *variable_name)
 {
        const char *variable = NULL;
-
        if (var_event) {
                if ((variable = switch_event_get_header(var_event, variable_name))) {
                        return variable;
                }
        }
+
        if (session) {
                switch_channel_t *channel = switch_core_session_get_channel(session);
                if ((variable = switch_channel_get_variable(channel, variable_name))) {
                        return variable;
                }
        }
-
-
-	   // This is unsafe, I don't see anywhere in the whole code where this is called with NULL session anyway.
-	   // There is a new switch_core_get_variable_dup that will strdup it for you and then you must free it.
-	   // That messes up the abstraction completely so I am just commenting it out for you.....
-	   /*
-       if ((variable = switch_core_get_variable(variable_name))) {
-               return variable;
-       }
-	   */
        return NULL;
 }
 
committer: Anthony Minessale
comments: 
revert

diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c
index b098ede..be9b499 100644
--- a/src/mod/endpoints/mod_loopback/mod_loopback.c
+++ b/src/mod/endpoints/mod_loopback/mod_loopback.c
@@ -637,13 +637,8 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc
 		tech_pvt->other_tech_pvt &&
 		switch_test_flag(tech_pvt, TFLAG_BRIDGE) &&
 		switch_test_flag(tech_pvt->other_tech_pvt, TFLAG_BRIDGE) &&
-
 		switch_channel_test_flag(tech_pvt->channel, CF_BRIDGED) &&
 		switch_channel_test_flag(tech_pvt->other_channel, CF_BRIDGED) &&
-
-		!switch_channel_test_flag(tech_pvt->channel, CF_INNER_BRIDGE) &&
-		!switch_channel_test_flag(tech_pvt->other_channel, CF_INNER_BRIDGE) &&
-
 		switch_channel_test_flag(tech_pvt->channel, CF_ANSWERED) &&
 		switch_channel_test_flag(tech_pvt->other_channel, CF_ANSWERED) && !--tech_pvt->bowout_frame_count <= 0) {
 		const char *a_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
committer: cypromis
comments: 
Merge remote branch 'origin/master'
committer: Moises Silva
comments: 
freetdm: use packet_len as the base length in tone generation

diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c
index 1e282d1..bd4e896 100644
--- a/libs/freetdm/src/ftdm_io.c
+++ b/libs/freetdm/src/ftdm_io.c
@@ -3588,7 +3588,7 @@ static FIO_READ_FUNCTION(ftdm_raw_read)
 }
 
 /* This function takes care of automatically generating DTMF or FSK tones when needed */
-static ftdm_status_t handle_tone_generation(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
+static ftdm_status_t handle_tone_generation(ftdm_channel_t *ftdmchan)
 {
 	/*
 	 * datalen: size in bytes of the chunk of data the user requested to read (this function 
@@ -3650,9 +3650,7 @@ static ftdm_status_t handle_tone_generation(ftdm_channel_t *ftdmchan, ftdm_size_
 	/* if we picked a buffer, time to read from it and write the linear data to the device */
 	if (buffer) {
 		uint8_t auxbuf[1024];
-		/* we initialize dlen to datalen, which is the size in bytes the 
-		 * user wants to read (typically chunks of 160 bytes, 20ms G.711) */
-		ftdm_size_t dlen = datalen;
+		ftdm_size_t dlen = ftdmchan->packet_len;
 		ftdm_size_t len, br, max = sizeof(auxbuf);
 		
 		/* if the codec is not linear, then data is really twice as much cuz
@@ -3662,10 +3660,10 @@ static ftdm_status_t handle_tone_generation(ftdm_channel_t *ftdmchan, ftdm_size_
 		}
 
 		/* we do not expect the user chunks to be bigger than auxbuf */
-		ftdm_assert(dlen <= sizeof(auxbuf), "Unexpected size for user data chunk size\n");
+		ftdm_assert((dlen <= sizeof(auxbuf)), "Unexpected size for user data chunk size\n");
 
 		/* dblen is the size in use for dtmf_buffer or fsk_buffer, and dlen is the size
-		 * of the read chunks of the user, we pick the smaller one */
+		 * of the io chunks to write, we pick the smaller one */
 		len = dblen > dlen ? dlen : dblen;
 
 		/* we can't read more than the size of our auxiliary buffer */
@@ -3770,7 +3768,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read(ftdm_channel_t *ftdmchan, void *data
 			rdata[i] = ftdmchan->rxgain_table[rdata[i]];
 		}
 	}
-	handle_tone_generation(ftdmchan, *datalen);
+	handle_tone_generation(ftdmchan);
 
 	if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_TRANSCODE) && ftdmchan->effective_codec != ftdmchan->native_codec) {
 		if (ftdmchan->native_codec == FTDM_CODEC_ULAW && ftdmchan->effective_codec == FTDM_CODEC_SLIN) {
committer: Konrad Hammel
comments: 
freetdm: ss7 - added hardware dtmf

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 2f2e502..d38d25f 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
@@ -273,6 +273,7 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj)
 	ftdm_interrupt_t	*ftdm_sangoma_ss7_int[2];
 	ftdm_span_t 		*ftdmspan = (ftdm_span_t *) obj;
 	ftdm_channel_t 		*ftdmchan = NULL;
+	ftdm_event_t 		*event = NULL;
 	sngss7_event_data_t	*sngss7_event = NULL;
 	sngss7_span_data_t	*sngss7_span = (sngss7_span_data_t *)ftdmspan->signal_data;
 
@@ -363,6 +364,22 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj)
 
 		/* check each channel on the span to see if there is an un-procressed SUS/RES flag */
 		check_for_res_sus_flag(ftdmspan);
+
+		/* Poll for events, e.g HW DTMF */
+		switch (ftdm_span_poll_event(ftdmspan, 0)) {
+		/**********************************************************************/
+		case FTDM_SUCCESS:
+			while (ftdm_span_next_event(ftdmspan, &event) == FTDM_SUCCESS);
+			break;
+		/**********************************************************************/
+		case FTDM_TIMEOUT:
+			/* No events pending */
+			break;
+		/**********************************************************************/
+		default:
+			SS7_ERROR("%s:Failed to poll span event\n", ftdmspan->name);
+		/**********************************************************************/
+		} /* switch (ftdm_span_poll_event(span, 0)) */
 	} /* master while loop */
 
 	/* clear the IN_THREAD flag so that we know the thread is done */
committer: Anthony Minessale
comments: 
don't bow out on att_xfer bridge

diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c
index be9b499..b098ede 100644
--- a/src/mod/endpoints/mod_loopback/mod_loopback.c
+++ b/src/mod/endpoints/mod_loopback/mod_loopback.c
@@ -637,8 +637,13 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc
 		tech_pvt->other_tech_pvt &&
 		switch_test_flag(tech_pvt, TFLAG_BRIDGE) &&
 		switch_test_flag(tech_pvt->other_tech_pvt, TFLAG_BRIDGE) &&
+
 		switch_channel_test_flag(tech_pvt->channel, CF_BRIDGED) &&
 		switch_channel_test_flag(tech_pvt->other_channel, CF_BRIDGED) &&
+
+		!switch_channel_test_flag(tech_pvt->channel, CF_INNER_BRIDGE) &&
+		!switch_channel_test_flag(tech_pvt->other_channel, CF_INNER_BRIDGE) &&
+
 		switch_channel_test_flag(tech_pvt->channel, CF_ANSWERED) &&
 		switch_channel_test_flag(tech_pvt->other_channel, CF_ANSWERED) && !--tech_pvt->bowout_frame_count <= 0) {
 		const char *a_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE);
committer: Moises Silva
comments: 
Merge remote branch 'fsorig/master'
committer: Konrad Hammel
comments: 
Merge branch 'master' of git.sangoma.com:/smg_freeswitch
committer: Konrad Hammel
comments: 
freetdm: ss7 - bug fix for SPC no longer being part sng_gen config

diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c
index 20bcc3a..df0414a 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c
@@ -352,22 +352,6 @@ int  ft_to_sngss7_cfg_all(void)
 		x++;
 	} /* while (g_ftdm_sngss7_data.cfg.mtpRoute[x].id != 0) */
 
-	if (g_ftdm_sngss7_data.cfg.mtpRoute[1].id != 0) {
-		if (!(g_ftdm_sngss7_data.cfg.mtpRoute[0].flags & SNGSS7_CONFIGURED)) {
-	
-			if (ftmod_ss7_mtp3_route_config(0)) {
-				SS7_CRITICAL("MTP3 ROUTE 0 configuration FAILED!\n");
-				return 1;
-			} else {
-				SS7_INFO("MTP3 ROUTE 0 configuration DONE!\n");
-			}
-	
-			/* set the SNGSS7_CONFIGURED flag */
-			g_ftdm_sngss7_data.cfg.mtpRoute[0].flags |= SNGSS7_CONFIGURED;
-		} /* if !SNGSS7_CONFIGURED */
-	}
-
-
 	x = 1;
 	while (g_ftdm_sngss7_data.cfg.isap[x].id != 0) {
 		/* check if this link has been configured already */
@@ -1161,10 +1145,10 @@ int ftmod_ss7_mtp3_route_config(int id)
 	cfg.t.cfg.s.snRout.swtchType		= k->linkType;				/* switch type */
 	cfg.t.cfg.s.snRout.upSwtch			= k->switchType;			/* user part switch type */
 	cfg.t.cfg.s.snRout.cmbLnkSetId		= k->cmbLinkSetId;			/* combined link set ID */
-	if (k->id == 0) {
-		cfg.t.cfg.s.snRout.dir		 		= LSN_RTE_UP;				/* direction */
+	if (k->dir == SNG_RTE_UP) {
+		cfg.t.cfg.s.snRout.dir		 	= LSN_RTE_UP;				/* direction */
 	} else {
-		cfg.t.cfg.s.snRout.dir		 		= LSN_RTE_DN;				/* direction */
+		cfg.t.cfg.s.snRout.dir		 	= LSN_RTE_DN;				/* direction */
 	}
 	cfg.t.cfg.s.snRout.rteToAdjSp		= 0;						/* flag indicating this route to adjacent SP */ 
 	cfg.t.cfg.s.snRout.ssf				= k->ssf;					/* sub service field */
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 fe291fb..05c6351 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
@@ -83,6 +83,11 @@ typedef enum {
 } sng_ckt_type_t;
 
 typedef enum {
+	SNG_RTE_UP	= 0,
+	SNG_RTE_DN
+} sng_route_direction_t;
+
+typedef enum {
 	SNGSS7_LPA_FOR_COT		= (1 << 0),	/* send LPA when COT arrives */
 	SNGSS7_ACM_OBCI_BITA	= (1 << 10)	/* in-band indication */
 } sng_intf_options_t;
@@ -236,6 +241,7 @@ typedef struct sng_route {
 	uint32_t		ssf;
 	uint32_t		nwId;
 	uint32_t		isSTP;
+	uint32_t		dir;
 	uint32_t		t6;
 	uint32_t		t8;
 	uint32_t		t10;
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
index 46df990..1b24e34 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
@@ -2383,6 +2383,7 @@ static int ftmod_ss7_fill_in_mtp3_route(sng_route_t *mtp3_route)
 	g_ftdm_sngss7_data.cfg.mtpRoute[i].nwId			= mtp3_route->nwId;
 	g_ftdm_sngss7_data.cfg.mtpRoute[i].lnkSets		= mtp3_route->lnkSets;
 	g_ftdm_sngss7_data.cfg.mtpRoute[i].ssf			= mtp3_route->ssf;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].dir			= SNG_RTE_DN;
 	if (mtp3_route->t6 != 0) {
 		g_ftdm_sngss7_data.cfg.mtpRoute[i].t6		= mtp3_route->t6;
 	} else {
@@ -2443,6 +2444,52 @@ static int ftmod_ss7_fill_in_mtp3_route(sng_route_t *mtp3_route)
 }
 
 /******************************************************************************/
+static int ftmod_ss7_fill_in_self_route(int spc, int linkType, int switchType, int ssf)
+{
+	int i = 1;
+
+	while (g_ftdm_sngss7_data.cfg.mtpRoute[i].id != 0) {
+		if (g_ftdm_sngss7_data.cfg.mtpRoute[i].dpc == spc) {
+			/* we have a match so break out of this loop */
+			break;
+		}
+		/* move on to the next one */
+		i++;
+	}
+
+	if (g_ftdm_sngss7_data.cfg.mtpRoute[i].id == 0) {
+		g_ftdm_sngss7_data.cfg.mtpRoute[i].id = i;
+		SS7_DEBUG("found new mtp3 self route\n");
+	} else {
+		g_ftdm_sngss7_data.cfg.mtpRoute[i].id = i;
+		SS7_DEBUG("found existing mtp3 self route\n");
+	}
+
+	strncpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[i].name, "self-route", MAX_NAME_LEN-1);
+
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].id			= i;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].dpc			= spc;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].linkType		= linkType;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].switchType	= switchType;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].cmbLinkSetId	= i;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].isSTP		= 0;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].ssf			= ssf;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].dir			= SNG_RTE_UP;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].t6			= 8;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].t8			= 12;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].t10			= 300;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].t11			= 300;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].t15			= 30;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].t16			= 20;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].t18			= 200;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].t19			= 690;
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].t21			= 650; 
+	g_ftdm_sngss7_data.cfg.mtpRoute[i].t25			= 100;
+
+	return 0;
+}
+
+/******************************************************************************/
 static int ftmod_ss7_fill_in_nsap(sng_route_t *mtp3_route)
 {
 	int i;
@@ -2755,45 +2802,6 @@ static int ftmod_ss7_fill_in_isap(sng_isap_t *sng_isap)
 }
 
 /******************************************************************************/
-static int ftmod_ss7_fill_in_self_route(int spc, int linkType, int switchType, int ssf)
-{
-
-	if (g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc == 0){
-		SS7_DEBUG("found new mtp3 self route\n");
-	} else if (g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc == spc) {
-		SS7_DEBUG("found existing mtp3 self route\n");
-		return FTDM_SUCCESS;
-	} else {
-		SS7_ERROR("found new mtp3 self route but it does not match the route already configured (dpc=%d:spc=%d)\n",
-					g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc,
-					spc);
-		return FTDM_FAIL;
-	}
-
-	strncpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[0].name, "self-route", MAX_NAME_LEN-1);
-
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].id			= 0;
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc			= spc;
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].linkType		= linkType;
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].switchType	= switchType;
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].cmbLinkSetId	= 0;
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].isSTP		= 0;
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].ssf			= ssf;
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].t6			= 8;
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].t8			= 12;
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].t10			= 300;
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].t11			= 300;
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].t15			= 30;
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].t16			= 20;
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].t18			= 200;
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].t19			= 690;
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].t21			= 650; 
-	g_ftdm_sngss7_data.cfg.mtpRoute[0].t25			= 100;
-
-	return 0;
-}
-
-/******************************************************************************/
 static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan)
 {
 	sng_timeslot_t		timeslot;
committer: Moises Silva
comments: 
Merge branch 'master' of git.freeswitch.org:freeswitch
committer: Moises Silva
comments: 
freetdm: add code to troubleshoot crash on tone generation

diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c
index c9000de..1e282d1 100644
--- a/libs/freetdm/src/ftdm_io.c
+++ b/libs/freetdm/src/ftdm_io.c
@@ -2743,10 +2743,9 @@ static ftdm_status_t ftdmchan_activate_dtmf_buffer(ftdm_channel_t *ftdmchan)
 	if (!ftdmchan->dtmf_buffer) {
 		if (ftdm_buffer_create(&ftdmchan->dtmf_buffer, 1024, 3192, 0) != FTDM_SUCCESS) {
 			ftdm_log(FTDM_LOG_ERROR, "Failed to allocate DTMF Buffer!\n");
-			snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "buffer error");
 			return FTDM_FAIL;
 		} else {
-			ftdm_log(FTDM_LOG_DEBUG, "Created DTMF Buffer!\n");
+			ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Created DTMF buffer\n");
 		}
 	}
 
@@ -3588,8 +3587,17 @@ static FIO_READ_FUNCTION(ftdm_raw_read)
 	return status;
 }
 
-static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
+/* This function takes care of automatically generating DTMF or FSK tones when needed */
+static ftdm_status_t handle_tone_generation(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
 {
+	/*
+	 * datalen: size in bytes of the chunk of data the user requested to read (this function 
+	 *          is called from the ftdm_channel_read function)
+	 * dblen: size currently in use in any of the tone generation buffers (data available in the buffer)
+	 * gen_dtmf_buffer: buffer holding the raw ASCII digits that the user requested to generate
+	 * dtmf_buffer: raw linear tone data generated by teletone to be written to the devices
+	 * fsk_buffer: raw linear FSK modulated data for caller id
+	 */
 	ftdm_buffer_t *buffer = NULL;
 	ftdm_size_t dblen = 0;
 	int wrote = 0;
@@ -3604,7 +3612,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
 		}
 
 		if (ftdm_buffer_read(ftdmchan->gen_dtmf_buffer, digits, dblen) && !ftdm_strlen_zero_buf(digits)) {
-			ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generating DTMF [%s]\n", digits);	
+			ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generating DTMF [%s]\n", digits);
 		
 			cur = digits;
 
@@ -3618,7 +3626,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
 					ftdm_buffer_write(ftdmchan->dtmf_buffer, ftdmchan->tone_session.buffer, wrote * 2);
 					x++;
 				} else {
-					ftdm_log(FTDM_LOG_ERROR, "%d:%d Problem Adding DTMF SEQ [%s]\n", ftdmchan->span_id, ftdmchan->chan_id, digits);
+					ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Problem adding DTMF sequence [%s]\n", digits);
 					return FTDM_FAIL;
 				}
 			}
@@ -3631,6 +3639,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
 	
 
 	if (!ftdmchan->buffer_delay || --ftdmchan->buffer_delay == 0) {
+		/* time to pick a buffer, either the dtmf or fsk buffer */
 		if (ftdmchan->dtmf_buffer && (dblen = ftdm_buffer_inuse(ftdmchan->dtmf_buffer))) {
 			buffer = ftdmchan->dtmf_buffer;
 		} else if (ftdmchan->fsk_buffer && (dblen = ftdm_buffer_inuse(ftdmchan->fsk_buffer))) {
@@ -3638,22 +3647,41 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
 		}
 	}
 
+	/* if we picked a buffer, time to read from it and write the linear data to the device */
 	if (buffer) {
-		ftdm_size_t dlen = datalen;
 		uint8_t auxbuf[1024];
+		/* we initialize dlen to datalen, which is the size in bytes the 
+		 * user wants to read (typically chunks of 160 bytes, 20ms G.711) */
+		ftdm_size_t dlen = datalen;
 		ftdm_size_t len, br, max = sizeof(auxbuf);
 		
+		/* if the codec is not linear, then data is really twice as much cuz
+		   tone generation is done in linear (we assume anything different than linear is G.711) */
 		if (ftdmchan->native_codec != FTDM_CODEC_SLIN) {
 			dlen *= 2;
 		}
-		
+
+		/* we do not expect the user chunks to be bigger than auxbuf */
+		ftdm_assert(dlen <= sizeof(auxbuf), "Unexpected size for user data chunk size\n");
+
+		/* dblen is the size in use for dtmf_buffer or fsk_buffer, and dlen is the size
+		 * of the read chunks of the user, we pick the smaller one */
 		len = dblen > dlen ? dlen : dblen;
 
+		/* we can't read more than the size of our auxiliary buffer */
+		ftdm_assert((len <= sizeof(auxbuf)), "Unexpected size to read into auxbuf\n");
+
 		br = ftdm_buffer_read(buffer, auxbuf, len);		
+
+		/* the amount read can't possibly be bigger than what we requested */
+		ftdm_assert((br <= len), "Unexpected size read from tone generation buffer\n");
+
+		/* if we read less than the chunk size, we must fill in with silence the rest */
 		if (br < dlen) {
 			memset(auxbuf + br, 0, dlen - br);
 		}
 
+		/* finally we convert to the native format for the channel if necessary */
 		if (ftdmchan->native_codec != FTDM_CODEC_SLIN) {
 			if (ftdmchan->native_codec == FTDM_CODEC_ULAW) {
 				fio_slin2ulaw(auxbuf, max, &dlen);
@@ -3662,6 +3690,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
 			}
 		}
 		
+		/* write the tone to the channel */
 		return ftdm_raw_write(ftdmchan, auxbuf, &dlen);
 	} 
 
@@ -3741,7 +3770,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read(ftdm_channel_t *ftdmchan, void *data
 			rdata[i] = ftdmchan->rxgain_table[rdata[i]];
 		}
 	}
-	handle_dtmf(ftdmchan, *datalen);
+	handle_tone_generation(ftdmchan, *datalen);
 
 	if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_TRANSCODE) && ftdmchan->effective_codec != ftdmchan->native_codec) {
 		if (ftdmchan->native_codec == FTDM_CODEC_ULAW && ftdmchan->effective_codec == FTDM_CODEC_SLIN) {
@@ -3938,7 +3967,8 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_write(ftdm_channel_t *ftdmchan, void *dat
 	if (!ftdmchan->buffer_delay && 
 		((ftdmchan->dtmf_buffer && ftdm_buffer_inuse(ftdmchan->dtmf_buffer)) ||
 		 (ftdmchan->fsk_buffer && ftdm_buffer_inuse(ftdmchan->fsk_buffer)))) {
-		/* read size writing DTMF ATM */
+		/* generating some kind of tone at the moment (see handle_tone_generation), 
+		 * we ignore user data ... */
 		goto done;
 	}
 
committer: Christopher Rienzo
comments: 
FS-3043 break during mod_unimrcp can hang session

diff --git a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c
index 734ef21..d5bac5f 100644
--- a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c
+++ b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c
@@ -1363,7 +1363,7 @@ static switch_status_t speech_channel_stop(speech_channel_t *schannel)
 		}
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) %s stopped\n", schannel->name, speech_channel_type_to_string(schannel->type));
 	} else if (schannel->state == SPEECH_CHANNEL_DONE) {
-		speech_channel_set_state(schannel, SPEECH_CHANNEL_READY);
+		speech_channel_set_state_unlocked(schannel, SPEECH_CHANNEL_READY);
 	}
 
   done:
committer: Marc Olivier Chouinard
comments: 
mod_conference: Added to the Auto OutCall support to specify the conf profile to be used using variable : conference_auto_outcall_profile

diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c
index 961a140..0aee352 100644
--- a/src/mod/applications/mod_conference/mod_conference.c
+++ b/src/mod/applications/mod_conference/mod_conference.c
@@ -401,13 +401,14 @@ static switch_status_t conference_outcall(conference_obj_t *conference,
 										  char *bridgeto, uint32_t timeout, 
 										  char *flags, 
 										  char *cid_name, 
-										  char *cid_num, 
+										  char *cid_num,
+										  char *profile,
 										  switch_call_cause_t *cause,
 										  switch_call_cause_t *cancel_cause);
 static switch_status_t conference_outcall_bg(conference_obj_t *conference,
 											 char *conference_name,
 											 switch_core_session_t *session, char *bridgeto, uint32_t timeout, const char *flags, const char *cid_name,
-											 const char *cid_num, const char *call_uuid, switch_call_cause_t *cancel_cause);
+											 const char *cid_num, const char *call_uuid, const char *profile, switch_call_cause_t *cancel_cause);
 SWITCH_STANDARD_APP(conference_function);
 static void launch_conference_thread(conference_obj_t *conference);
 static void launch_conference_video_thread(conference_obj_t *conference);
@@ -2410,6 +2411,7 @@ static void conference_loop_output(conference_member_t *member)
 			const char *cid_num = switch_channel_get_variable(channel, "conference_auto_outcall_caller_id_number");
 			const char *toval = switch_channel_get_variable(channel, "conference_auto_outcall_timeout");
 			const char *flags = switch_channel_get_variable(channel, "conference_auto_outcall_flags");
+			const char *profile = switch_channel_get_variable(channel, "conference_auto_outcall_profile");
 			const char *ann = switch_channel_get_variable(channel, "conference_auto_outcall_announce");
 			const char *prefix = switch_channel_get_variable(channel, "conference_auto_outcall_prefix");
 			int to = 60;
@@ -2441,7 +2443,7 @@ static void conference_loop_output(conference_member_t *member)
 					char *dial_str = switch_mprintf("%s%s", switch_str_nil(prefix), argv[x]);
 					switch_assert(dial_str);
 					conference_outcall_bg(member->conference, NULL, NULL, dial_str, to, switch_str_nil(flags), cid_name, cid_num, NULL, 
-										  &member->conference->cancel_cause);
+										  profile, &member->conference->cancel_cause);
 					switch_safe_free(dial_str);
 				}
 				switch_safe_free(cpstr);
@@ -4264,9 +4266,9 @@ static switch_status_t conf_api_sub_dial(conference_obj_t *conference, switch_st
 	}
 
 	if (conference) {
-		conference_outcall(conference, NULL, NULL, argv[2], 60, NULL, argv[4], argv[3], &cause, NULL);
+		conference_outcall(conference, NULL, NULL, argv[2], 60, NULL, argv[4], argv[3], NULL, &cause, NULL);
 	} else {
-		conference_outcall(NULL, argv[0], NULL, argv[2], 60, NULL, argv[4], argv[3], &cause, NULL);
+		conference_outcall(NULL, argv[0], NULL, argv[2], 60, NULL, argv[4], argv[3], NULL, &cause, NULL);
 	}
 	stream->write_function(stream, "Call Requested: result: [%s]\n", switch_channel_cause2str(cause));
 
@@ -4289,9 +4291,9 @@ static switch_status_t conf_api_sub_bgdial(conference_obj_t *conference, switch_
 	switch_uuid_format(uuid_str, &uuid);
 
 	if (conference) {
-		conference_outcall_bg(conference, NULL, NULL, argv[2], 60, NULL, argv[4], argv[3], uuid_str, NULL);
+		conference_outcall_bg(conference, NULL, NULL, argv[2], 60, NULL, argv[4], argv[3], uuid_str, NULL, NULL);
 	} else {
-		conference_outcall_bg(NULL, argv[0], NULL, argv[2], 60, NULL, argv[4], argv[3], uuid_str, NULL);
+		conference_outcall_bg(NULL, argv[0], NULL, argv[2], 60, NULL, argv[4], argv[3], uuid_str, NULL, NULL);
 	}
 
 	stream->write_function(stream, "OK Job-UUID: %s\n", uuid_str);
@@ -4807,7 +4809,8 @@ static switch_status_t conference_outcall(conference_obj_t *conference,
 										  switch_core_session_t *session,
 										  char *bridgeto, uint32_t timeout, 
 										  char *flags, char *cid_name, 
-										  char *cid_num, 
+										  char *cid_num,
+										  char *profile,
 										  switch_call_cause_t *cause,
 										  switch_call_cause_t *cancel_cause)
 {
@@ -4817,6 +4820,7 @@ static switch_status_t conference_outcall(conference_obj_t *conference,
 	switch_channel_t *caller_channel = NULL;
 	char appdata[512];
 	int rdlock = 0;
+	switch_bool_t have_flags = SWITCH_FALSE;
 
 	*cause = SWITCH_CAUSE_NORMAL_CLEARING;
 
@@ -4902,13 +4906,16 @@ static switch_status_t conference_outcall(conference_obj_t *conference,
 			status = SWITCH_STATUS_MEMERR;
 			goto done;
 		}
-		/* add them to the conference */
+
 		if (flags && strcasecmp(flags, "none")) {
-			switch_snprintf(appdata, sizeof(appdata), "%s+flags{%s}", conference_name, flags);
-			switch_caller_extension_add_application(peer_session, extension, (char *) global_app_name, appdata);
-		} else {
-			switch_caller_extension_add_application(peer_session, extension, (char *) global_app_name, conference_name);
+			have_flags = SWITCH_TRUE;
 		}
+		/* add them to the conference */
+
+		switch_snprintf(appdata, sizeof(appdata), "%s%s%s%s%s%s", conference_name,
+				profile?"@":"", profile?profile:"",
+				have_flags?"+flags{":"", have_flags?flags:"", have_flags?"}":"");
+		switch_caller_extension_add_application(peer_session, extension, (char *) global_app_name, appdata);
 
 		switch_channel_set_caller_extension(peer_channel, extension);
 		switch_channel_set_state(peer_channel, CS_EXECUTE);
@@ -4940,6 +4947,7 @@ struct bg_call {
 	char *cid_num;
 	char *conference_name;
 	char *uuid;
+	char *profile;
 	switch_call_cause_t *cancel_cause;
 	switch_memory_pool_t *pool;
 };
@@ -4953,7 +4961,7 @@ static void *SWITCH_THREAD_FUNC conference_outcall_run(switch_thread_t *thread,
 		switch_event_t *event;
 
 		conference_outcall(call->conference, call->conference_name,
-						   call->session, call->bridgeto, call->timeout, call->flags, call->cid_name, call->cid_num, &cause, call->cancel_cause);
+						   call->session, call->bridgeto, call->timeout, call->flags, call->cid_name, call->cid_num, call->profile, &cause, call->cancel_cause);
 
 		if (call->conference && test_eflag(call->conference, EFLAG_BGDIAL_RESULT) &&
 			switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
@@ -4969,6 +4977,7 @@ static void *SWITCH_THREAD_FUNC conference_outcall_run(switch_thread_t *thread,
 		switch_safe_free(call->cid_num);
 		switch_safe_free(call->conference_name);
 		switch_safe_free(call->uuid);
+		switch_safe_free(call->profile);
 		if (call->pool) {
 			switch_core_destroy_memory_pool(&call->pool);
 		}
@@ -4981,7 +4990,7 @@ static void *SWITCH_THREAD_FUNC conference_outcall_run(switch_thread_t *thread,
 static switch_status_t conference_outcall_bg(conference_obj_t *conference,
 											 char *conference_name,
 											 switch_core_session_t *session, char *bridgeto, uint32_t timeout, const char *flags, const char *cid_name,
-											 const char *cid_num, const char *call_uuid, switch_call_cause_t *cancel_cause)
+											 const char *cid_num, const char *call_uuid, const char *profile, switch_call_cause_t *cancel_cause)
 {
 	struct bg_call *call = NULL;
 	switch_thread_t *thread;
@@ -5025,6 +5034,10 @@ static switch_status_t conference_outcall_bg(conference_obj_t *conference,
 		call->uuid = strdup(call_uuid);
 	}
 
+        if (profile) {
+                call->profile = strdup(profile);
+        }
+
 	switch_threadattr_create(&thd_attr, pool);
 	switch_threadattr_detach_set(thd_attr, 1);
 	switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
@@ -5750,7 +5763,7 @@ SWITCH_STANDARD_APP(conference_function)
 	/* if we're using "bridge:" make an outbound call and bridge it in */
 	if (!zstr(bridgeto) && strcasecmp(bridgeto, "none")) {
 		switch_call_cause_t cause;
-		if (conference_outcall(conference, NULL, session, bridgeto, 60, NULL, NULL, NULL, &cause, NULL) != SWITCH_STATUS_SUCCESS) {
+		if (conference_outcall(conference, NULL, session, bridgeto, 60, NULL, NULL, NULL, NULL, &cause, NULL) != SWITCH_STATUS_SUCCESS) {
 			goto done;
 		}
 	} else {
committer: Anthony Minessale
comments: 
take out default it seems to suck on 32 bit

diff --git a/conf/autoload_configs/switch.conf.xml b/conf/autoload_configs/switch.conf.xml
index 32cb76f..44893b9 100644
--- a/conf/autoload_configs/switch.conf.xml
+++ b/conf/autoload_configs/switch.conf.xml
@@ -25,7 +25,7 @@
     <param name="colorize-console" value="true"/>
 
     <!-- minimum idle CPU before refusing calls -->
-    <param name="min-idle-cpu" value="25"/>
+    <!--<param name="min-idle-cpu" value="25"/>-->
 
     <!--
 	Max number of sessions to allow at any given time.
committer: Moises Silva
comments: 
Merge remote branch 'smgfs/master'
committer: Anthony Minessale
comments: 
minor regression from 4ae8282e6c6df0e296113e9b4b4a1383e1af8ad7 (sofia_contact with no args from cli caused seg)

diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c
index c683203..2a2ec63 100644
--- a/src/mod/endpoints/mod_sofia/mod_sofia.c
+++ b/src/mod/endpoints/mod_sofia/mod_sofia.c
@@ -3458,7 +3458,7 @@ SWITCH_STANDARD_API(sofia_contact_function)
 {
 	char *data;
 	char *user = NULL;
-	char *domain = NULL;
+	char *domain = NULL, *dup_domain = NULL;
 	char *concat = NULL;
 	char *profile_name = NULL;
 	char *p;
@@ -3501,7 +3501,8 @@ SWITCH_STANDARD_API(sofia_contact_function)
 	}
 
 	if (zstr(domain)) {
-		domain = switch_core_get_variable_pdup("domain", switch_core_session_get_pool(session));
+		dup_domain = switch_core_get_variable_dup("domain");
+		domain = dup_domain;
 	}
 
 	if (!user) goto end;
@@ -3567,6 +3568,7 @@ SWITCH_STANDARD_API(sofia_contact_function)
 	switch_safe_free(mystream.data);					
 
 	switch_safe_free(data);
+	switch_safe_free(dup_domain);
 
 	return SWITCH_STATUS_SUCCESS;
 }
committer: Anthony Minessale
comments: 
reset signal_bond variable back to its original value on failed dial in att_xfer

diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c
index f7bf86b..9a1258a 100755
--- a/src/mod/applications/mod_dptools/mod_dptools.c
+++ b/src/mod/applications/mod_dptools/mod_dptools.c
@@ -1864,6 +1864,7 @@ SWITCH_STANDARD_APP(att_xfer_function)
 
 	if (switch_ivr_originate(session, &peer_session, &cause, data, 0, NULL, NULL, NULL, NULL, NULL, SOF_NONE, NULL)
 		!= SWITCH_STATUS_SUCCESS || !peer_session) {
+		switch_channel_set_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE, bond);
 		goto end;
 	}
 
@@ -1878,6 +1879,7 @@ SWITCH_STANDARD_APP(att_xfer_function)
 
 	if (zstr(bond) && switch_channel_down(peer_channel)) {
 		switch_core_session_rwunlock(peer_session);
+		switch_channel_set_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE, bond);
 		goto end;
 	}
 
committer: David Yat Sin
comments: 
Fixes to support QSIG over T1

diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c
index bd5b13b..9fe2819 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c
@@ -84,6 +84,8 @@ static ftdm_status_t parse_switchtype(const char* switch_name, ftdm_span_t *span
 				signal_data->switchtype = SNGISDN_SWITCH_4ESS;
 			} else if (!strcasecmp(switch_name, "dms100")) {
 				signal_data->switchtype = SNGISDN_SWITCH_DMS100;
+			} else if (!strcasecmp(switch_name, "qsig")) {
+				signal_data->switchtype = SNGISDN_SWITCH_QSIG;
 			} else {
 				ftdm_log(FTDM_LOG_ERROR, "%s:Unsupported switchtype %s for trunktype:%s\n", span->name, switch_name, ftdm_trunk_type2str(span->trunk_type));
 				return FTDM_FAIL;
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
index a52a624..1bd2753 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
@@ -667,25 +667,33 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span)
 	cfg.t.cfg.s.inDLSAP.maxBSrvCnt = 2;
 	cfg.t.cfg.s.inDLSAP.maxDSrvCnt = 2;
 #endif /* ISDN_SRV */
-	
-	if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
-		cfg.t.cfg.s.inDLSAP.ackOpt = TRUE;
-		cfg.t.cfg.s.inDLSAP.intType = NETWORK;
-		cfg.t.cfg.s.inDLSAP.clrGlr = FALSE;			/* in case of glare, do not clear local call */
-		cfg.t.cfg.s.inDLSAP.statEnqOpt = TRUE;
 
-		if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN ||
-			signal_data->switchtype == SNGISDN_SWITCH_INSNET) {
-			cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
-		} else {
-			cfg.t.cfg.s.inDLSAP.rstOpt = TRUE;
-		}
-	} else {
-		cfg.t.cfg.s.inDLSAP.ackOpt = FALSE;
-		cfg.t.cfg.s.inDLSAP.intType = USER;
+	if (signal_data->switchtype == SNGISDN_SWITCH_QSIG) {
+		cfg.t.cfg.s.inDLSAP.ackOpt = TRUE;
+		cfg.t.cfg.s.inDLSAP.intType = SYM_USER;
 		cfg.t.cfg.s.inDLSAP.clrGlr = TRUE;			/* in case of glare, clear local call */
 		cfg.t.cfg.s.inDLSAP.statEnqOpt = FALSE;
 		cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
+	} else {
+		if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
+			cfg.t.cfg.s.inDLSAP.ackOpt = TRUE;
+			cfg.t.cfg.s.inDLSAP.intType = NETWORK;
+			cfg.t.cfg.s.inDLSAP.clrGlr = FALSE;			/* in case of glare, do not clear local call */
+			cfg.t.cfg.s.inDLSAP.statEnqOpt = TRUE;
+
+			if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN ||
+				signal_data->switchtype == SNGISDN_SWITCH_INSNET) {
+				cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
+			} else {
+				cfg.t.cfg.s.inDLSAP.rstOpt = TRUE;
+			}
+		} else {
+			cfg.t.cfg.s.inDLSAP.ackOpt = FALSE;
+			cfg.t.cfg.s.inDLSAP.intType = USER;
+			cfg.t.cfg.s.inDLSAP.clrGlr = TRUE;			/* in case of glare, clear local call */
+			cfg.t.cfg.s.inDLSAP.statEnqOpt = FALSE;
+			cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
+		}
 	}
 
 	/* Override the restart options if user selected that option */
committer: David Yat Sin
comments: 
Fixes to support QSIG over T1

diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c
index bd5b13b..9fe2819 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c
@@ -84,6 +84,8 @@ static ftdm_status_t parse_switchtype(const char* switch_name, ftdm_span_t *span
 				signal_data->switchtype = SNGISDN_SWITCH_4ESS;
 			} else if (!strcasecmp(switch_name, "dms100")) {
 				signal_data->switchtype = SNGISDN_SWITCH_DMS100;
+			} else if (!strcasecmp(switch_name, "qsig")) {
+				signal_data->switchtype = SNGISDN_SWITCH_QSIG;
 			} else {
 				ftdm_log(FTDM_LOG_ERROR, "%s:Unsupported switchtype %s for trunktype:%s\n", span->name, switch_name, ftdm_trunk_type2str(span->trunk_type));
 				return FTDM_FAIL;
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
index a52a624..1bd2753 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
@@ -667,25 +667,33 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span)
 	cfg.t.cfg.s.inDLSAP.maxBSrvCnt = 2;
 	cfg.t.cfg.s.inDLSAP.maxDSrvCnt = 2;
 #endif /* ISDN_SRV */
-	
-	if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
-		cfg.t.cfg.s.inDLSAP.ackOpt = TRUE;
-		cfg.t.cfg.s.inDLSAP.intType = NETWORK;
-		cfg.t.cfg.s.inDLSAP.clrGlr = FALSE;			/* in case of glare, do not clear local call */
-		cfg.t.cfg.s.inDLSAP.statEnqOpt = TRUE;
 
-		if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN ||
-			signal_data->switchtype == SNGISDN_SWITCH_INSNET) {
-			cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
-		} else {
-			cfg.t.cfg.s.inDLSAP.rstOpt = TRUE;
-		}
-	} else {
-		cfg.t.cfg.s.inDLSAP.ackOpt = FALSE;
-		cfg.t.cfg.s.inDLSAP.intType = USER;
+	if (signal_data->switchtype == SNGISDN_SWITCH_QSIG) {
+		cfg.t.cfg.s.inDLSAP.ackOpt = TRUE;
+		cfg.t.cfg.s.inDLSAP.intType = SYM_USER;
 		cfg.t.cfg.s.inDLSAP.clrGlr = TRUE;			/* in case of glare, clear local call */
 		cfg.t.cfg.s.inDLSAP.statEnqOpt = FALSE;
 		cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
+	} else {
+		if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
+			cfg.t.cfg.s.inDLSAP.ackOpt = TRUE;
+			cfg.t.cfg.s.inDLSAP.intType = NETWORK;
+			cfg.t.cfg.s.inDLSAP.clrGlr = FALSE;			/* in case of glare, do not clear local call */
+			cfg.t.cfg.s.inDLSAP.statEnqOpt = TRUE;
+
+			if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN ||
+				signal_data->switchtype == SNGISDN_SWITCH_INSNET) {
+				cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
+			} else {
+				cfg.t.cfg.s.inDLSAP.rstOpt = TRUE;
+			}
+		} else {
+			cfg.t.cfg.s.inDLSAP.ackOpt = FALSE;
+			cfg.t.cfg.s.inDLSAP.intType = USER;
+			cfg.t.cfg.s.inDLSAP.clrGlr = TRUE;			/* in case of glare, clear local call */
+			cfg.t.cfg.s.inDLSAP.statEnqOpt = FALSE;
+			cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
+		}
 	}
 
 	/* Override the restart options if user selected that option */
committer: Anthony Minessale
comments: 
FS-3040/FS-1742: use 1 sql query for message count in a way that is portable and doesn't segfault

diff --git a/src/mod/applications/mod_voicemail/mod_voicemail.c b/src/mod/applications/mod_voicemail/mod_voicemail.c
index 80b011e..894e49a 100644
--- a/src/mod/applications/mod_voicemail/mod_voicemail.c
+++ b/src/mod/applications/mod_voicemail/mod_voicemail.c
@@ -1011,6 +1011,11 @@ typedef struct msg_cnt_callback msg_cnt_callback_t;
 static int message_count_callback(void *pArg, int argc, char **argv, char **columnNames)
 {
 	msg_cnt_callback_t *cbt = (msg_cnt_callback_t *) pArg;
+
+	if (argc < 3 || zstr(argv[0]) || zstr(argv[1]) || zstr(argv[2])) {
+		return -1;
+	}
+
 	if (atoi(argv[0]) == 1) {	/* UnRead */
 		if (!strcasecmp(argv[1], "A_URGENT")) {	/* Urgent */
 			cbt->total_new_urgent_messages = atoi(argv[2]);
@@ -1263,7 +1268,7 @@ static void message_count(vm_profile_t *profile, const char *id_in, const char *
 {
 	char msg_count[80] = "";
 	msg_cnt_callback_t cbt = { 0 };
-	char sql[256];
+	char *sql;
 	char *myid = NULL;
 
 
@@ -1277,11 +1282,20 @@ static void message_count(vm_profile_t *profile, const char *id_in, const char *
 
 	myid = resolve_id(id_in, domain_name, "message-count");
 
-	switch_snprintf(sql, sizeof(sql),
-					"select read_epoch=0, read_flags, count(read_epoch) from voicemail_msgs where username='%s' and domain='%s' and in_folder='%s' group by read_epoch=0,read_flags;",
-					myid, domain_name, myfolder);
+	sql = switch_mprintf(
+						 "select 1, read_flags, count(read_epoch) from voicemail_msgs where "
+						 "username='%q' and domain='%q' and in_folder='%q' and read_epoch=0 "
+						 "group by read_flags "
+						 "union "
+						 "select 0, read_flags, count(read_epoch) from voicemail_msgs where "
+						 "username='%q' and domain='%q' and in_folder='%q' and read_epoch<>0 "
+						 "group by read_flags;",
+
+						 myid, domain_name, myfolder,
+						 myid, domain_name, myfolder);
 
 	vm_execute_sql_callback(profile, profile->mutex, sql, message_count_callback, &cbt);
+	free(sql);
 
 	*total_new_messages = cbt.total_new_messages + cbt.total_new_urgent_messages;
 	*total_new_urgent_messages = cbt.total_new_urgent_messages;
committer: Anthony Minessale
comments: 
3 regresions from this now, rolling it back

diff --git a/src/mod/applications/mod_voicemail/mod_voicemail.c b/src/mod/applications/mod_voicemail/mod_voicemail.c
index bea8214..80b011e 100644
--- a/src/mod/applications/mod_voicemail/mod_voicemail.c
+++ b/src/mod/applications/mod_voicemail/mod_voicemail.c
@@ -1277,13 +1277,9 @@ static void message_count(vm_profile_t *profile, const char *id_in, const char *
 
 	myid = resolve_id(id_in, domain_name, "message-count");
 
-	switch_snprintf(sql, sizeof(sql), "select 1, read_flags, count(read_epoch) from voicemail_msgs where "
-					"username='%s' and domain='%s' and in_folder='%s' "
-					"and read_epoch=0 group by read_flags union select 0, read_flags, count(read_epoch) from voicemail_msgs where username='%s' "
-					"and domain='%s' and in_folder='%s' and read_epoch<>0 group by read_flags;", 
-					myid, domain_name, myfolder, myid, domain_name, myfolder);
-					
-				   
+	switch_snprintf(sql, sizeof(sql),
+					"select read_epoch=0, read_flags, count(read_epoch) from voicemail_msgs where username='%s' and domain='%s' and in_folder='%s' group by read_epoch=0,read_flags;",
+					myid, domain_name, myfolder);
 
 	vm_execute_sql_callback(profile, profile->mutex, sql, message_count_callback, &cbt);
 
committer: cypromis
comments: 
Merge branch 'master' of ssh://git.freeswitch.org/freeswitch
committer: cypromis
comments: 
Merge remote branch 'origin/master'
committer: cypromis
comments: 
antoher try at c options to make iksemel right on solaris

diff --git a/libs/iksemel/configure.ac b/libs/iksemel/configure.ac
index 49d8621..403725a 100644
--- a/libs/iksemel/configure.ac
+++ b/libs/iksemel/configure.ac
@@ -83,12 +83,12 @@ AC_ARG_ENABLE(64,
 
 if test "x${ax_cv_c_compiler_vendor}"  =  "xsun" ; then
     if test "${enable_64}" = "yes"; then
-        CFLAGS="$CFLAGS -xc99=all -mt -m64 -lgpg-error"
-        CXXFLAGS="$CXXFLAGS -xc99=all -mt -m64 -lgpg-error"
+        CFLAGS="$CFLAGS -mt -m64 -lgpg-error"
+        CXXFLAGS="$CXXFLAGS -mt -m64 -lgpg-error"
 	SUNFLAGS="-xc99=all -mt -m64 -lgpg-error"
     else 
-	CFLAGS="$CFLAGS -xc99=all -mt -lgpg-error"
-	CXXFLAGS="$CXXFLAGS -xc99=all -mt -lgpg-error"
+	CFLAGS="$CFLAGS  -mt -lgpg-error"
+	CXXFLAGS="$CXXFLAGS -mt -lgpg-error"
 	SUNFLAGS="-xc99=all -mt -lgpg-error"
     fi
 fi
========================================================================

Summary of changes:
 conf/autoload_configs/switch.conf.xml              |    2 +-
 libs/freetdm/mod_freetdm/mod_freetdm.c             |   16 +--
 libs/freetdm/src/ftdm_io.c                         |   50 +++++++--
 libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c         |   28 +++--
 .../ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c    |    2 +
 .../ftmod_sangoma_isdn_stack_cfg.c                 |   38 ++++---
 .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c      |   22 +---
 .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c      |    4 +-
 .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c     |   17 +++
 .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h     |    6 +
 .../ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c      |  125 ++++++++++++--------
 libs/freetdm/src/include/private/ftdm_core.h       |    3 -
 libs/iksemel/configure.ac                          |    8 +-
 .../applications/mod_conference/mod_conference.c   |   45 +++++---
 src/mod/applications/mod_dptools/mod_dptools.c     |    2 +
 src/mod/applications/mod_voicemail/mod_voicemail.c |   26 +++--
 src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c          |    2 +-
 src/mod/endpoints/mod_sofia/mod_sofia.c            |    6 +-
 18 files changed, 244 insertions(+), 158 deletions(-)

this email was generated because of /git/your-repo.git/hooks/post-receive by the file /git-core/contrib/hooks/post-receive-email
For more info, see http://blog.chomperstomp.com/?p=630 --
FreeSWITCH Source