[commit] r4899 - in freeswitch/branches/mikej/sofiasip-upgrade: . conf libs/apr/include/arch/unix libs/libdingaling/src src src/include src/mod src/mod/applications/mod_commands src/mod/endpoints/mod_dingaling src/mod/endpoints/mod_sofia
Author: mikej Date: Mon Apr 9 12:32:10 2007 New Revision: 4899 Modified: freeswitch/branches/mikej/sofiasip-upgrade/Makefile.am freeswitch/branches/mikej/sofiasip-upgrade/bootstrap.sh freeswitch/branches/mikej/sofiasip-upgrade/conf/dingaling.conf.xml freeswitch/branches/mikej/sofiasip-upgrade/conf/freeswitch_combined.xml freeswitch/branches/mikej/sofiasip-upgrade/conf/sofia.conf.xml freeswitch/branches/mikej/sofiasip-upgrade/conf/switch.conf.xml freeswitch/branches/mikej/sofiasip-upgrade/configure.in freeswitch/branches/mikej/sofiasip-upgrade/libs/apr/include/arch/unix/apr_private.h.in freeswitch/branches/mikej/sofiasip-upgrade/libs/libdingaling/src/libdingaling.c freeswitch/branches/mikej/sofiasip-upgrade/libs/libdingaling/src/libdingaling.h freeswitch/branches/mikej/sofiasip-upgrade/src/include/switch.h freeswitch/branches/mikej/sofiasip-upgrade/src/include/switch_rtp.h freeswitch/branches/mikej/sofiasip-upgrade/src/include/switch_xml.h freeswitch/branches/mikej/sofiasip-upgrade/src/mod/Makefile.am freeswitch/branches/mikej/sofiasip-upgrade/src/mod/applications/mod_commands/mod_commands.c freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_dingaling/Makefile freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_dingaling/mod_dingaling.c freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_sofia/mod_sofia.h freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_sofia/sofia.c freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_sofia/sofia_reg.c freeswitch/branches/mikej/sofiasip-upgrade/src/switch_core.c freeswitch/branches/mikej/sofiasip-upgrade/src/switch_rtp.c freeswitch/branches/mikej/sofiasip-upgrade/src/switch_xml.c Log: merged changes from trunk revisions 4873-4898. Modified: freeswitch/branches/mikej/sofiasip-upgrade/Makefile.am ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/Makefile.am (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/Makefile.am Mon Apr 9 12:32:10 2007 @@ -14,6 +14,9 @@ AM_CFLAGS += -DCRASH_PROT endif +.DEFAULT: + @cd src/mod && $(MAKE) $(AM_MAKEFLAGS) $@ + libfreeswitch_la_SOURCES = \ src/switch_apr.c \ src/switch_buffer.c \ @@ -90,8 +93,6 @@ libs/libteletone/src/libteletone_generate.h\ libs/libteletone/src/libteletone.h - - CORE_CFLAGS = `$(switch_srcdir)/libs/apr/apr-1-config --cflags --cppflags --includes` CORE_CFLAGS += `$(switch_srcdir)/libs/apr-util/apu-1-config --includes` CORE_CFLAGS += -I$(switch_srcdir)/libs/sqlite @@ -118,7 +119,7 @@ MOD_LINK = $(BASE)/libfreeswitch.la CLEANFILES = src/include/switch_version.h -BUILT_SOURCES = src/include/switch_version.h ./$(DEPDIR)/modules.targets +BUILT_SOURCES = src/include/switch_version.h bin_PROGRAMS = freeswitch freeswitch_SOURCES = src/switch.c @@ -244,15 +245,10 @@ megaclean: eclean modclean rm -f `find ./libs -name \*.la` -@am__include@ @am__quote@./$(DEPDIR)/modules.targets@am__quote@ - modules.conf: if test -f $@; then touch $@; else cp build/modules.conf.in $@ ;fi -./$(DEPDIR)/modules.targets: modules.conf - mods=`cat modules.conf | sed -e 's|^.*/||'`; echo MODULE_TARGETS=\"$$mods\" > ./$(DEPDIR)/modules.targets - -$(MODULE_TARGETS): +$(OUR_MODULES): @set fnord $$MAKEFLAGS; amf=$$2; \ (cd src/mod && $(MAKE) $(AM_MAKEFLAGS) $@) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ Modified: freeswitch/branches/mikej/sofiasip-upgrade/bootstrap.sh ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/bootstrap.sh (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/bootstrap.sh Mon Apr 9 12:32:10 2007 @@ -15,7 +15,7 @@ touch ChangeLog # autoconf 2.59 or newer -ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|sed -e 's/^[^0-9]*//;s/[a-z]* *$//;q'` +ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|sed -e 's/^[^0-9]*//;s/[a-z]* *$//;s/[- ].*//g;q'` if test -z "$ac_version"; then echo "bootstrap: autoconf not found." echo " You need autoconf version 2.59 or newer installed" @@ -33,7 +33,7 @@ fi # automake 1.7 or newer -am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|sed -e 's/^[^0-9]*//;s/[a-z]* *$//;q'` +am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|sed -e 's/^[^0-9]*//;s/[a-z]* *$//;s/[- ].*//g;q'` if test -z "$am_version"; then echo "bootstrap: automake not found." echo " You need automake version 1.7 or newer installed" @@ -70,7 +70,7 @@ if test -z "$1"; then a=0 ; else a=$1;fi if test -z "$2"; then b=0 ; else b=$2;fi -if test -z "$3"; then c=0 ; else c=$3;fi +if test -z "$3"; then c=0 ; else c=$3;fi if test "$a" -lt "2"; then if test "$b" -lt "5" -o "$b" = "5" -a "$c" -lt "14" ; then Modified: freeswitch/branches/mikej/sofiasip-upgrade/conf/dingaling.conf.xml ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/conf/dingaling.conf.xml (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/conf/dingaling.conf.xml Mon Apr 9 12:32:10 2007 @@ -15,7 +15,6 @@ <param name="message" value="Jingle all the way"/> <param name="rtp-ip" value="auto"/> <param name="auto-login" value="true"/> - <param name="auto-reply" value="Press *Call* to call FreeSWITCH and be sure to come to ClueCon! http://www.cluecon.com"/> <!-- SASL "plain" or "md5" --> <param name="sasl" value="plain"/> <!-- if the server where the jabber is hosted is not the same as the one in the jid --> Modified: freeswitch/branches/mikej/sofiasip-upgrade/conf/freeswitch_combined.xml ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/conf/freeswitch_combined.xml (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/conf/freeswitch_combined.xml Mon Apr 9 12:32:10 2007 @@ -7,6 +7,9 @@ <settings> <!--Most channels to allow at once --> <param name="max-sessions" value="1000"/> + <!--RTP port range --> + <!--<param name="rtp-start-port" value="16384"/>--> + <!--<param name="rtp-end-port" value="32768"/>--> </settings> <!--Any variables defined here will be available in every channel, in the dialplan etc --> <variables> Modified: freeswitch/branches/mikej/sofiasip-upgrade/conf/sofia.conf.xml ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/conf/sofia.conf.xml (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/conf/sofia.conf.xml Mon Apr 9 12:32:10 2007 @@ -16,6 +16,8 @@ <!--<param name="proxy" value="asterlink.com"/>--> <!--/// expire in seconds: *optional* 3600, if blank ///--> <!--<param name="expire-seconds" value="60"/>--> + <!--/// do not register ///--> + <!--<param name="register" value="false"/>--> <!--</gateway>--> </gateways> <settings> Modified: freeswitch/branches/mikej/sofiasip-upgrade/conf/switch.conf.xml ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/conf/switch.conf.xml (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/conf/switch.conf.xml Mon Apr 9 12:32:10 2007 @@ -2,6 +2,9 @@ <settings> <!--Most channels to allow at once --> <param name="max-sessions" value="1000"/> + <!--RTP port range --> + <!--<param name="rtp-start-port" value="16384"/>--> + <!--<param name="rtp-end-port" value="32768"/>--> </settings> <!--Any variables defined here will be available in every channel, in the dialplan etc --> <variables> Modified: freeswitch/branches/mikej/sofiasip-upgrade/configure.in ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/configure.in (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/configure.in Mon Apr 9 12:32:10 2007 @@ -340,9 +340,20 @@ #LIBS+=> core.log || error="yes";if test -n "$(VERBOSE)" -o "$$error" = "yes";then cat core.log;fi;if test "$$error" = "yes";then exit 1;fi LIBTOOL='`if test -z "$(VERBOSE)" ; then echo $(SHELL) $(switch_builddir)/quiet_libtool ;else echo $(switch_builddir)/libtool; fi;`' TOUCH_TARGET='if test -f "$@";then touch "$@";fi;' -AM_MAKEFLAGS='`test -n "$(VERBOSE)" || echo -s`' +CONF_MODULES='\`grep -v "\#" $(switch_builddir)/modules.conf | sed -e "s|^.*/||" \`' +OUR_MODS='`if test -z "$(MODULES)" ; then tmp_mods="$(CONF_MODULES)"; else tmp_mods="$(MODULES)" ; fi ; mods=\`for i in $$tmp_mods ; do echo $$i-all ; done \`; echo $$mods `' +OUR_CLEAN_MODS='`if test -z "$(MODULES)" ; then tmp_mods="$(CONF_MODULES)"; else tmp_mods="$(MODULES)" ; fi ; mods=\`for i in $$tmp_mods ; do echo $$i-clean ; done \`; echo $$mods `' +OUR_INSTALL_MODS='`if test -z "$(MODULES)" ; then tmp_mods="$(CONF_MODULES)"; else tmp_mods="$(MODULES)" ; fi ; mods=\`for i in $$tmp_mods ; do echo $$i-install ; done\`; echo $$mods `' +OUR_UNINSTALL_MODS='`if test -z "$(MODULES)" ; then tmp_mods="$(CONF_MODULES)"; else tmp_mods="$(MODULES)" ; fi ; mods=\`for i in $$tmp_mods ; do echo $$i-uninstall ; done\`; echo $$mods `' +AM_MAKEFLAGS='"OUR_MODULES=$(OUR_MODS)" "OUR_CLEAN_MODULES=$(OUR_CLEAN_MODS)" "OUR_INSTALL_MODULES=$(OUR_INSTALL_MODS)" "OUR_UNINSTALL_MODULES=$(OUR_UNINSTALL_MODS)" `test -n "$(VERBOSE)" || echo -s`' +#AM_MAKEFLAGS='`test -n "$(VERBOSE)" || echo -s`' AC_SUBST(LIBTOOL) AC_SUBST(TOUCH_TARGET) +AC_SUBST(CONF_MODULES) +AC_SUBST(OUR_MODS) +AC_SUBST(OUR_CLEAN_MODS) +AC_SUBST(OUR_INSTALL_MODS) +AC_SUBST(OUR_UNINSTALL_MODS) AC_SUBST(AM_MAKEFLAGS) # Run configure in all the subdirs Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/apr/include/arch/unix/apr_private.h.in ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/apr/include/arch/unix/apr_private.h.in (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/apr/include/arch/unix/apr_private.h.in Mon Apr 9 12:32:10 2007 @@ -632,16 +632,16 @@ /* */ #undef SIGWAIT_TAKES_ONE_ARG -/* The size of a `char', as computed by sizeof. */ +/* The size of `char', as computed by sizeof. */ #undef SIZEOF_CHAR -/* The size of a `int', as computed by sizeof. */ +/* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT -/* The size of a `long', as computed by sizeof. */ +/* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG -/* The size of a `long long', as computed by sizeof. */ +/* The size of `long long', as computed by sizeof. */ #undef SIZEOF_LONG_LONG /* The size of off_t */ @@ -650,7 +650,7 @@ /* The size of pid_t */ #undef SIZEOF_PID_T -/* The size of a `short', as computed by sizeof. */ +/* The size of `short', as computed by sizeof. */ #undef SIZEOF_SHORT /* The size of size_t */ @@ -659,7 +659,7 @@ /* The size of ssize_t */ #undef SIZEOF_SSIZE_T -/* The size of a `void*', as computed by sizeof. */ +/* The size of `void*', as computed by sizeof. */ #undef SIZEOF_VOIDP /* Define to 1 if you have the ANSI C header files. */ @@ -752,13 +752,13 @@ #undef inline #endif -/* Define to `long' if <sys/types.h> does not define. */ +/* Define to `long int' if <sys/types.h> does not define. */ #undef off_t /* Define to `int' if <sys/types.h> does not define. */ #undef pid_t -/* Define to `unsigned' if <sys/types.h> does not define. */ +/* Define to `unsigned int' if <sys/types.h> does not define. */ #undef size_t /* Define to `int' if <sys/types.h> does not define. */ Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/libdingaling/src/libdingaling.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/libdingaling/src/libdingaling.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/libdingaling/src/libdingaling.c Mon Apr 9 12:32:10 2007 @@ -526,97 +526,6 @@ const char *marker = "TRUE"; -static int on_disco_info(void *user_data, ikspak *pak) -{ - ldl_handle_t *handle = user_data; - - if (pak->subtype == IKS_TYPE_RESULT) { - if (iks_find_with_attrib(pak->query, "feature", "var", "http://www.google.com/xmpp/protocol/voice/v1")) { - char *from = iks_find_attrib(pak->x, "from"); - char id[1024]; - char *resource; - struct ldl_buffer *buffer; - size_t x; - - - apr_cpystrn(id, from, sizeof(id)); - if ((resource = strchr(id, '/'))) { - *resource++ = '\0'; - } - - if (!apr_hash_get(handle->sub_hash, from, APR_HASH_KEY_STRING)) { - iks *msg; - apr_hash_set(handle->sub_hash, apr_pstrdup(handle->pool, from), APR_HASH_KEY_STRING, &marker); - msg = iks_make_s10n (IKS_TYPE_SUBSCRIBED, id, "Ding A Ling...."); - apr_queue_push(handle->queue, msg); - } - - - - if (resource) { - for (x = 0; x < strlen(resource); x++) { - resource[x] = (char)tolower((int)resource[x]); - } - } - - if (resource && strstr(resource, "talk") && (buffer = apr_hash_get(handle->probe_hash, id, APR_HASH_KEY_STRING))) { - apr_cpystrn(buffer->buf, from, buffer->len); - fflush(stderr); - buffer->hit = 1; - } - } - return IKS_FILTER_EAT; - } - - if (pak->subtype == IKS_TYPE_GET) { - iks *iq, *query, *tag; - uint8_t send = 0; - - if ((iq = iks_new("iq"))) { - do { - iks_insert_attrib(iq, "from", handle->login); - iks_insert_attrib(iq, "to", pak->from->full); - iks_insert_attrib(iq, "id", pak->id); - iks_insert_attrib(iq, "type", "result"); - - if (!(query = iks_insert (iq, "query"))) { - break; - } - iks_insert_attrib(query, "xmlns", "http://jabber.org/protocol/disco#info"); - - if (!(tag = iks_insert (query, "identity"))) { - break; - } - iks_insert_attrib(tag, "category", "client"); - iks_insert_attrib(tag, "type", "voice"); - iks_insert_attrib(tag, "name", "LibDingaLing"); - - - if (!(tag = iks_insert (query, "feature"))) { - break; - } - iks_insert_attrib(tag, "var", "http://jabber.org/protocol/disco#info"); - - if (!(tag = iks_insert (query, "feature"))) { - break; - } - iks_insert_attrib(tag, "var", "http://www.google.com/xmpp/protocol/voice/v1"); - - iks_send(handle->parser, iq); - send = 1; - } while (0); - - iks_delete(iq); - } - - if (!send) { - globals.logger(DL_LOG_DEBUG, "Memory Error!\n"); - } - } - - return IKS_FILTER_EAT; -} - static int on_vcard(void *user_data, ikspak *pak) { @@ -635,7 +544,7 @@ static int on_disco_default(void *user_data, ikspak *pak) { char *node = NULL; - char *ns; + char *ns = NULL; ldl_handle_t *handle = user_data; iks *iq, *query, *tag; uint8_t send = 0; @@ -650,6 +559,8 @@ globals.logger(DL_LOG_DEBUG, "FixME!!! node=[%s]\n", node?node:""); } else if (pak->subtype == IKS_TYPE_GET) { if ((iq = iks_new("iq"))) { + int all = 0; + iks_insert_attrib(iq, "from", handle->login); iks_insert_attrib(iq, "to", pak->from->full); iks_insert_attrib(iq, "id", pak->id); @@ -667,13 +578,17 @@ if (!(tag = iks_insert (query, "identity"))) { goto fail; } + + if (!strcasecmp(ns, FEATURE_DISCO) && !node) { + all++; + } iks_insert_attrib(tag, "category", "gateway"); iks_insert_attrib(tag, "type", "voice"); iks_insert_attrib(tag, "name", "LibDingaLing"); for (x = 0; FEATURES[x].name; x++) { - if (!ns || !strcasecmp(ns, FEATURES[x].name)) { + if (all || !ns || !strcasecmp(ns, FEATURES[x].name)) { if (!(tag = iks_insert (query, "feature"))) { goto fail; } @@ -698,26 +613,6 @@ return IKS_FILTER_EAT; } - - -static int on_disco_items(void *user_data, ikspak *pak) -{ - globals.logger(DL_LOG_DEBUG, "FixME!!!\n"); - return IKS_FILTER_EAT; -} - -static int on_disco_reg_in(void *user_data, ikspak *pak) -{ - globals.logger(DL_LOG_DEBUG, "FixME!!!\n"); - return IKS_FILTER_EAT; -} - -static int on_disco_reg_out(void *user_data, ikspak *pak) -{ - globals.logger(DL_LOG_DEBUG, "FixME!!!\n"); - return IKS_FILTER_EAT; -} - static int on_presence(void *user_data, ikspak *pak) { ldl_handle_t *handle = user_data; @@ -731,6 +626,8 @@ struct ldl_buffer *buffer; ldl_signal_t dl_signal = LDL_SIGNAL_PRESENCE_IN; + + if (type && *type) { if (!strcasecmp(type, "unavailable")) { dl_signal = LDL_SIGNAL_PRESENCE_OUT; @@ -754,6 +651,7 @@ *resource++ = '\0'; } + if (!apr_hash_get(handle->sub_hash, from, APR_HASH_KEY_STRING)) { iks *msg; apr_hash_set(handle->sub_hash, apr_pstrdup(handle->pool, from), APR_HASH_KEY_STRING, &marker); @@ -761,12 +659,11 @@ apr_queue_push(handle->queue, msg); } - if (resource && strstr(resource, "talk") && (buffer = apr_hash_get(handle->probe_hash, id, APR_HASH_KEY_STRING))) { apr_cpystrn(buffer->buf, from, buffer->len); fflush(stderr); buffer->hit = 1; - } + } if (handle->session_callback) { handle->session_callback(handle, NULL, dl_signal, to, id, status ? status : "n/a", show ? show : "n/a"); @@ -1500,9 +1397,9 @@ handle, (iksStreamHook *) (ldl_test_flag(handle, LDL_FLAG_COMPONENT) ? on_stream_component : on_stream)); - if (globals.debug) { - iks_set_log_hook(handle->parser, (iksLogHook *) on_log); - } + + iks_set_log_hook(handle->parser, (iksLogHook *) on_log); + strncpy(tmp, jabber_id, sizeof(tmp)-1); sl = strchr(tmp, '/'); @@ -1598,7 +1495,10 @@ handle->state = CS_NEW; } ldl_clear_flag_locked(handle, LDL_FLAG_RUNNING); - + if (!ldl_test_flag(handle, LDL_FLAG_TLS)) { + ldl_flush_queue(handle, 1); + } + while(ldl_test_flag(handle, LDL_FLAG_QUEUE_RUNNING)) { microsleep(100); } @@ -1872,6 +1772,15 @@ } +int ldl_global_debug(int on) +{ + if (on > -1) { + globals.debug = on ? 1 : 0; + } + + return globals.debug ? 1 : 0; +} + void ldl_global_set_logger(ldl_logger_t logger) { globals.logger = logger; @@ -1953,42 +1862,34 @@ iks *pres, *msg; char *lid = NULL, *low_id = NULL; struct ldl_buffer buffer; - apr_time_t started; + time_t started; unsigned int elapsed; char *notice = "Call Me!"; - int again = 0; - + int next = 0; + buffer.buf = buf; buffer.len = len; buffer.hit = 0; - pres = iks_new("presence"); - iks_insert_attrib(pres, "type", "probe"); - iks_insert_attrib(pres, "from", from); - iks_insert_attrib(pres, "to", id); - - apr_hash_set(handle->probe_hash, id, APR_HASH_KEY_STRING, &buffer); - msg = iks_make_s10n (IKS_TYPE_SUBSCRIBE, id, notice); - iks_insert_attrib(msg, "from", from); - apr_queue_push(handle->queue, msg); - msg = iks_make_s10n (IKS_TYPE_SUBSCRIBED, id, notice); - iks_insert_attrib(msg, "from", from); - apr_queue_push(handle->queue, msg); - apr_queue_push(handle->queue, pres); - - //schedule_packet(handle, next_id(), pres, LDL_RETRY); - started = apr_time_now(); + started = time(NULL); for(;;) { - elapsed = (unsigned int)((apr_time_now() - started) / 1000); - if (elapsed > 5000 && ! again) { + elapsed = time(NULL) - started; + if (elapsed == next) { msg = iks_make_s10n (IKS_TYPE_SUBSCRIBE, id, notice); iks_insert_attrib(msg, "from", from); apr_queue_push(handle->queue, msg); - again++; + + pres = iks_new("presence"); + iks_insert_attrib(pres, "xmlns", "jabber:client"); + iks_insert_attrib(pres, "type", "probe"); + iks_insert_attrib(pres, "to", id); + iks_insert_attrib(pres, "from", from); + apr_queue_push(handle->queue, pres); + next += 5; } - if (elapsed > 10000) { + if (elapsed >= 17) { break; } if (buffer.hit) { @@ -2179,10 +2080,10 @@ ldl_status ldl_global_destroy(void) { - if (ldl_test_flag(&globals, LDL_FLAG_INIT)) { + if (!ldl_test_flag(&globals, LDL_FLAG_INIT)) { return LDL_STATUS_FALSE; } - + apr_pool_destroy(globals.memory_pool); ldl_clear_flag(&globals, LDL_FLAG_INIT); apr_terminate(); Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/libdingaling/src/libdingaling.h ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/libdingaling/src/libdingaling.h (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/libdingaling/src/libdingaling.h Mon Apr 9 12:32:10 2007 @@ -376,6 +376,13 @@ void ldl_session_accept_candidate(ldl_session_t *session, ldl_candidate_t *candidate); /*! + \brief turn logging on/off + \param on (TRUE or FALSE) + \return current state +*/ +int ldl_global_debug(int on); + +/*! \brief Set a custom logger \param logger the logger function */ Modified: freeswitch/branches/mikej/sofiasip-upgrade/src/include/switch.h ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/src/include/switch.h (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/src/include/switch.h Mon Apr 9 12:32:10 2007 @@ -59,7 +59,10 @@ #include <setjmp.h> #include <ctype.h> #include <fcntl.h> +#ifndef _MSC_VER #include <strings.h> +#endif +#include <string.h> #include <sys/stat.h> #include <limits.h> #include <sys/types.h> Modified: freeswitch/branches/mikej/sofiasip-upgrade/src/include/switch_rtp.h ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/src/include/switch_rtp.h (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/src/include/switch_rtp.h Mon Apr 9 12:32:10 2007 @@ -27,6 +27,7 @@ * * * switch_channel.h -- Media Channel Interface + * Marcel Barbulescu <marcelbarbulescu@gmail.com> * */ /** @@ -53,6 +54,20 @@ */ SWITCH_DECLARE(void) switch_rtp_init(switch_memory_pool_t *pool); +/*! + \brief Set/Get RTP start port + \param port new value (if > 0) + \return the current RTP start port +*/ +SWITCH_DECLARE(switch_port_t) switch_rtp_set_start_port(switch_port_t port); + +/*! + \brief Set/Get RTP end port + \param port new value (if > 0) + \return the current RTP end port +*/ +SWITCH_DECLARE(switch_port_t) switch_rtp_set_end_port(switch_port_t port); + /*! \brief Request a new port to be used for media \return the new port to use Modified: freeswitch/branches/mikej/sofiasip-upgrade/src/include/switch_xml.h ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/src/include/switch_xml.h (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/src/include/switch_xml.h Mon Apr 9 12:32:10 2007 @@ -222,7 +222,7 @@ ///\param name the name of the tag ///\param off the offset ///\return an xml node or NULL - switch_xml_t switch_xml_add_child(switch_xml_t xml, const char *name, switch_size_t off); + SWITCH_DECLARE(switch_xml_t) switch_xml_add_child(switch_xml_t xml, const char *name, switch_size_t off); ///\brief wrapper for switch_xml_add_child() that strdup()s name ///\param xml the xml node @@ -235,7 +235,7 @@ ///\param xml the xml node ///\param txt the text ///\return an xml node or NULL - switch_xml_t switch_xml_set_txt(switch_xml_t xml, const char *txt); + SWITCH_DECLARE(switch_xml_t) switch_xml_set_txt(switch_xml_t xml, const char *txt); ///\brief wrapper for switch_xml_set_txt() that strdup()s txt ///\ sets the character content for the given tag and returns the tag Modified: freeswitch/branches/mikej/sofiasip-upgrade/src/mod/Makefile.am ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/src/mod/Makefile.am (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/src/mod/Makefile.am Mon Apr 9 12:32:10 2007 @@ -1,90 +1,28 @@ -CONF_MODULES=if test ! -f $(switch_builddir)/modules.conf ; then cp $(switch_builddir)/build/modules.conf.in $(switch_builddir)/modules.conf ; fi ; conf_modules=`grep -v "\#" $(switch_builddir)/modules.conf` ; -FOUND_MODULES=found_modules=`find . -type d -name mod_\* | sed -e 's|^\./||'` ; -OUR_MODULES=if test -z "$(MODULES)" ; then our_modules=$$conf_modules ; else our_modules="$(MODULES)" ; fi ; -OUR_CLEAN_MODULES=if test -z "$(MODULES)" ; then tmp_clean_modules=`echo $$conf_modules $$found_modules`; \ - our_clean_modules=`for i in $$tmp_clean_modules ; do echo $$i ; done | sort | uniq` ; \ - else our_clean_modules="$(MODULES)" ; fi ; -MOD_NAME=`echo $$i | sed -e 's|^.*/||'` -MOD_DIR=`if test -d $(switch_srcdir)/src/mod/$$i ; then echo $(switch_srcdir)/src/mod/$$i ; else echo $$i ; fi;` +all: $(OUR_MODULES) +clean: $(OUR_CLEAN_MODULES) +install: $(OUR_INSTALL_MODULES) +uninstall: $(OUR_UNINSTALL_MODULES) -all: - @$(CONF_MODULES) \ - $(OUR_MODULES) \ - echo ;\ - echo making modules ; \ - for i in $$our_modules ; do \ - echo ;\ - echo making $$i ; \ - moddir=$(MOD_DIR); \ - if test -f $$moddir/Makefile ; then \ - cd $$moddir && MODNAME=$(MOD_NAME) BASE=$(switch_builddir) $(MAKE) $(AM_MAKEFLAGS) || exit 1; else \ - cd $$moddir && MODNAME=$(MOD_NAME) BASE=$(switch_builddir) $(MAKE) $(AM_MAKEFLAGS) -f $(switch_builddir)/build/modmake.rules || exit 1; \ - fi; \ - done - @echo - @echo done making modules - -clean: - @$(CONF_MODULES) \ - $(FOUND_MODULES) \ - $(OUR_CLEAN_MODULES) \ - echo ;\ - echo making clean modules ; \ - for i in $$our_clean_modules ; do \ - echo ;\ - echo making clean $$i ; \ - moddir=$(MOD_DIR); \ - if test -f $$moddir/Makefile ; then \ - cd $$moddir && MODNAME=$(MOD_NAME) BASE=$(switch_builddir) $(MAKE) $(AM_MAKEFLAGS) clean || exit 1; else \ - cd $$moddir && MODNAME=$(MOD_NAME) BASE=$(switch_builddir) $(MAKE) $(AM_MAKEFLAGS) -f $(switch_builddir)/build/modmake.rules clean || exit 1; \ - fi; \ - done - @echo - @echo done making clean modules - -install: - @$(CONF_MODULES) \ - $(OUR_MODULES) \ - echo ;\ - echo Installing Modules ; \ - for i in $$our_modules ; do \ - echo ;\ - echo making install $$i ; \ - moddir=$(MOD_DIR); \ - if test -f $$moddir/Makefile ; then \ - cd $$moddir && MODNAME=$(MOD_NAME) BASE=$(switch_builddir) $(MAKE) $(AM_MAKEFLAGS) install || exit 1; else \ - cd $$moddir && MODNAME=$(MOD_NAME) BASE=$(switch_builddir) $(MAKE) $(AM_MAKEFLAGS) -f $(switch_builddir)/build/modmake.rules install || exit 1; \ - fi; \ - done - @echo - @echo done Installing Modules - -uninstall: - @$(CONF_MODULES) \ - $(OUR_MODULES) \ - echo ;\ - echo Uninstalling Modules ; \ - for i in $$our_modules ; do \ - echo ;\ - echo making uninstall $$i ; \ - moddir=$(MOD_DIR); \ - if test -f $$moddir/Makefile ; then \ - cd $$moddir && MODNAME=$(MOD_NAME) BASE=$(switch_builddir) $(MAKE) $(AM_MAKEFLAGS) uninstall || exit 1; else \ - cd $$moddir && MODNAME=$(MOD_NAME) BASE=$(switch_builddir) $(MAKE) $(AM_MAKEFLAGS) -f $(switch_builddir)/build/modmake.rules uninstall || exit 1; \ - fi; \ - done - @echo - @echo done Uninstalling Modules - - -@am__include@ @am__quote@$(switch_builddir)/$(DEPDIR)/modules.targets@am__quote@ - -$(MODULE_TARGETS): +$(OUR_MODULES) $(OUR_CLEAN_MODULES) $(OUR_INSTALL_MODULES) $(OUR_UNINSTALL_MODULES): @set fnord $$MAKEFLAGS; amf=$$2; \ - moddir=`grep $@ $(switch_builddir)/modules.conf | sed -e 's|#||'` ; \ + target=`echo $@ | sed -e 's|^.*-||'`; \ + modname=`echo $@ | sed -e 's|-.*||'`; \ + confmoddir=`cat $(switch_builddir)/modules.conf | grep $$modname | sed -e 's|#||' `; \ + if test -z "$$confmoddir" ; then moddir=$@ ; else \ + if test -d "$(switch_srcdir)/src/mod/$$confmoddir" ; then \ + moddir="$(switch_srcdir)/src/mod/$$confmoddir" ; else \ + moddir="$$confmoddir" ; \ + fi ; \ + fi ; \ + if test -z "$$target" ; then target="all" ; fi ; \ + echo ;\ + echo making $$target $$modname ;\ (if test -f $$moddir/Makefile ; then \ - cd $$moddir && MODNAME=$(MOD_NAME) BASE=$(switch_builddir) $(MAKE) $(AM_MAKEFLAGS); else\ - cd $$moddir && MODNAME=$(MOD_NAME) BASE=$(switch_builddir) $(MAKE) $(AM_MAKEFLAGS) -f $(switch_builddir)/build/modmake.rules;\ + cd $$moddir && MODNAME=$$modname BASE=$(switch_builddir) $(MAKE) $(AM_MAKEFLAGS) $$target; else\ + cd $$moddir && MODNAME=$$modname BASE=$(switch_builddir) $(MAKE) $(AM_MAKEFLAGS) -f $(switch_builddir)/build/modmake.rules $$target ;\ fi;)\ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ test -z "$$fail" + +.DEFAULT: + @if test -z "`echo $@ | grep all`"; then $(MAKE) $(AM_MAKEFLAGS) $@-all ; else echo Unknown target `echo $@ | sed -e 's|-all||'`; exit 1; fi Modified: freeswitch/branches/mikej/sofiasip-upgrade/src/mod/applications/mod_commands/mod_commands.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/src/mod/applications/mod_commands/mod_commands.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/src/mod/applications/mod_commands/mod_commands.c Mon Apr 9 12:32:10 2007 @@ -27,6 +27,7 @@ * Michael Jerris <mike@jerris.com> * Johny Kadarisman <jkr888@gmail.com> * Paul Tinsley <jackhammer@gmail.com> + * Marcel Barbulescu <marcelbarbulescu@gmail.com> * * * mod_commands.c -- Misc. Command Module @@ -724,6 +725,55 @@ return SWITCH_STATUS_SUCCESS; } +static switch_status_t xml_wrap_api_function(char *cmd, switch_core_session_t *isession, switch_stream_handle_t *stream) +{ + char *dcommand, *edata = NULL, *send = NULL, *command, *arg = NULL; + switch_stream_handle_t mystream = { 0 }; + int encoded = 0, elen = 0; + + if ((dcommand = strdup(cmd))) { + if (!strncasecmp(dcommand, "encoded ", 8)) { + encoded++; + command = dcommand + 8; + } else { + command = dcommand; + } + + if ((arg = strchr(command, ' '))) { + *arg++ = '\0'; + } + SWITCH_STANDARD_STREAM(mystream); + switch_api_execute(command, arg, NULL, &mystream); + + if (mystream.data) { + if (encoded) { + elen = (int) strlen(mystream.data) * 3; + edata = malloc(elen); + assert(edata != NULL); + memset(edata, 0, elen); + switch_url_encode(mystream.data, edata, elen); + send = edata; + } else { + send = mystream.data; + } + } + + stream->write_function(stream, + "<result>\n" + " <row id=\"1\">\n" + " <data>%s</data>\n" + " </row>\n" + "</result>\n", + send ? send : "ERROR" + ); + switch_safe_free(mystream.data); + switch_safe_free(edata); + free(dcommand); + } + + return SWITCH_STATUS_SUCCESS; +} + static switch_status_t sched_api_function(char *cmd, switch_core_session_t *isession, switch_stream_handle_t *stream) { char *tm = NULL, *dcmd, *group; @@ -768,8 +818,43 @@ char *http; uint32_t count; int print_title; + switch_xml_t xml; + int rows; }; +static int show_as_xml_callback(void *pArg, int argc, char **argv, char **columnNames) +{ + struct holder *holder = (struct holder *) pArg; + switch_xml_t row, field; + int x, f_off = 0; + char id[50]; + + if (holder->count == 0) { + if (!(holder->xml = switch_xml_new("result"))) { + return -1; + } + } + + if (!(row = switch_xml_add_child_d(holder->xml, "row", holder->rows++))) { + return -1; + } + + snprintf(id, sizeof(id), "%d", holder->rows); + switch_xml_set_attr_d(row, "id", id); + + for(x = 0; x < argc; x++) { + if ((field = switch_xml_add_child_d(row, columnNames[x], f_off++))) { + switch_xml_set_txt_d(field, argv[x]); + } else { + return -1; + } + } + + holder->count++; + + return 0; +} + static int show_callback(void *pArg, int argc, char **argv, char **columnNames) { struct holder *holder = (struct holder *) pArg; @@ -808,19 +893,33 @@ return 0; } -static switch_status_t show_function(char *cmd, switch_core_session_t *session, switch_stream_handle_t *stream) +static switch_status_t show_function(char *data, switch_core_session_t *session, switch_stream_handle_t *stream) { char sql[1024]; char *errmsg; switch_core_db_t *db = switch_core_db_handle(); struct holder holder = { 0 }; int help = 0; + char *mydata = NULL, *argv[5] = {0}; + int argc; + char *cmd = NULL, *as = NULL; if (session) { return SWITCH_STATUS_FALSE; } - if (stream->event) { + if (data) { + if ((mydata = strdup(data))) { + argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); + } + + cmd = argv[0]; + if (argv[2] && !strcasecmp(argv[1], "as")) { + as = argv[2]; + } + } + + if (!as && stream->event) { holder.http = switch_event_get_header(stream->event, "http-host"); } @@ -864,23 +963,44 @@ holder.stream->write_function(holder.stream, "<table cellpadding=1 cellspacing=4 border=1>\n"); } - switch_core_db_exec(db, sql, show_callback, &holder, &errmsg); - - if (holder.http) { - holder.stream->write_function(holder.stream, "</table>"); + if (!as) { + as = "csv"; } - if (errmsg) { - stream->write_function(stream, "SQL ERR [%s]\n", errmsg); - switch_core_db_free(errmsg); - errmsg = NULL; - } else if (help) { - if (holder.count == 0) - stream->write_function(stream, "No such command.\n"); + if (!strcasecmp(as, "csv")) { + switch_core_db_exec(db, sql, show_callback, &holder, &errmsg); + if (holder.http) { + holder.stream->write_function(holder.stream, "</table>"); + } + + if (errmsg) { + stream->write_function(stream, "SQL ERR [%s]\n", errmsg); + switch_core_db_free(errmsg); + errmsg = NULL; + } else if (help) { + if (holder.count == 0) + stream->write_function(stream, "No such command.\n"); + } else { + stream->write_function(stream, "\n%u total.\n", holder.count); + } + } else if (!strcasecmp(as, "xml")) { + switch_core_db_exec(db, sql, show_as_xml_callback, &holder, &errmsg); + if (holder.xml) { + char *xmlstr = switch_xml_toxml(holder.xml); + if (xmlstr) { + holder.stream->write_function(holder.stream, "%s", xmlstr); + free(xmlstr); + } else { + holder.stream->write_function(holder.stream, "ERROR\n"); + } + } else { + holder.stream->write_function(holder.stream, "ERROR\n"); + } } else { - stream->write_function(stream, "\n%u total.\n", holder.count); + holder.stream->write_function(holder.stream, "Cannot find format %s\n", as); } + switch_safe_free(mydata); switch_core_db_close(db); return SWITCH_STATUS_SUCCESS; } @@ -914,12 +1034,21 @@ return SWITCH_STATUS_SUCCESS; } + +static switch_api_interface_t xml_wrap_api_interface = { + /*.interface_name */ "xml_wrap", + /*.desc */ "Wrap another api command in xml", + /*.function */ xml_wrap_api_function, + /*.syntax */ "<command> <args>", + /*.next */ NULL +}; + static switch_api_interface_t sched_del_api_interface = { /*.interface_name */ "sched_del", /*.desc */ "Delete a Scheduled task", /*.function */ sched_del_function, /*.syntax */ "<task_id>|<group_id>", - /*.next */ NULL + /*.next */ &xml_wrap_api_interface }; static switch_api_interface_t sched_api_api_interface = { Modified: freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_dingaling/Makefile ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_dingaling/Makefile (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_dingaling/Makefile Mon Apr 9 12:32:10 2007 @@ -3,7 +3,7 @@ LOCAL_CFLAGS = `$(BASE)/libs/apr/apr-1-config --cflags --cppflags --includes` LOCAL_CFLAGS += `$(BASE)/libs/apr-util/apu-1-config --includes` LOCAL_CFLAGS += `if test -f $(BASE)/.libs/libfreeswitch_la-switch_odbc.o ; then echo -DSWITCH_HAVE_ODBC; fi ;` -LOCAL_CFLAGS += -w +#LOCAL_CFLAGS += -w IKS_DIR=$(BASE)/libs/iksemel IKS_LA=$(IKS_DIR)/src/libiksemel.la Modified: freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_dingaling/mod_dingaling.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_dingaling/mod_dingaling.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_dingaling/mod_dingaling.c Mon Apr 9 12:32:10 2007 @@ -108,7 +108,9 @@ char *login; char *password; char *message; +#ifdef AUTO_REPLY char *auto_reply; +#endif char *dialplan; char *ip; char *extip; @@ -192,6 +194,7 @@ static switch_status_t dl_login(char *arg, switch_core_session_t *session, switch_stream_handle_t *stream); static switch_status_t dl_logout(char *profile_name, switch_core_session_t *session, switch_stream_handle_t *stream); static switch_status_t dl_pres(char *profile_name, switch_core_session_t *session, switch_stream_handle_t *stream); +static switch_status_t dl_debug(char *profile_name, switch_core_session_t *session, switch_stream_handle_t *stream); static switch_status_t channel_on_init(switch_core_session_t *session); static switch_status_t channel_on_hangup(switch_core_session_t *session); static switch_status_t channel_on_ring(switch_core_session_t *session); @@ -722,13 +725,15 @@ if (ll) { if ((xmltxt = strchr(ll, ':'))) { *xmltxt++ = '\0'; - xml = switch_xml_parse_str(xmltxt, strlen(xmltxt)); - form = switch_xml_toxml(xml); - switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, level, - "%s:\n-------------------------------------------------------------------------------\n" - "%s\n", ll, form); - switch_xml_free(xml); - free(data); + if (strlen(xmltxt) > 2) { + xml = switch_xml_parse_str(xmltxt, strlen(xmltxt)); + form = switch_xml_toxml(xml); + switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, level, + "%s:\n-------------------------------------------------------------------------------\n" + "%s\n", ll, form); + switch_xml_free(xml); + free(data); + } } } } else { @@ -849,9 +854,8 @@ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SETUP RTP %s:%d -> %s:%d\n", tech_pvt->profile->ip, tech_pvt->local_port, tech_pvt->remote_ip, tech_pvt->remote_port); - + flags = SWITCH_RTP_FLAG_GOOGLEHACK | SWITCH_RTP_FLAG_AUTOADJ | SWITCH_RTP_FLAG_RAW_WRITE | SWITCH_RTP_FLAG_AUTO_CNG; - //flags = SWITCH_RTP_FLAG_AUTOADJ; if (switch_test_flag(tech_pvt->profile, TFLAG_TIMER)) { flags |= SWITCH_RTP_FLAG_USE_TIMER; @@ -874,7 +878,11 @@ uint8_t inb = switch_test_flag(tech_pvt, TFLAG_OUTBOUND) ? 0 : 1; switch_rtp_activate_ice(tech_pvt->rtp_session, tech_pvt->remote_user, tech_pvt->local_user); if ((vad_in && inb) || (vad_out && !inb)) { - switch_rtp_enable_vad(tech_pvt->rtp_session, tech_pvt->session, &tech_pvt->read_codec, SWITCH_VAD_FLAG_TALKING); + if (switch_rtp_enable_vad(tech_pvt->rtp_session, tech_pvt->session, &tech_pvt->read_codec, SWITCH_VAD_FLAG_TALKING) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "VAD ERROR %s\n", err); + switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); + return 0; + } switch_set_flag_locked(tech_pvt, TFLAG_VAD); } switch_rtp_set_cng_pt(tech_pvt->rtp_session, 13); @@ -1065,7 +1073,8 @@ while (!(switch_test_flag(tech_pvt, TFLAG_CODEC_READY) && switch_test_flag(tech_pvt, TFLAG_RTP_READY) && - switch_test_flag(tech_pvt, TFLAG_ANSWER) && switch_test_flag(tech_pvt, TFLAG_TRANSPORT_ACCEPT) + switch_test_flag(tech_pvt, TFLAG_ANSWER) && switch_test_flag(tech_pvt, TFLAG_TRANSPORT_ACCEPT) && + tech_pvt->remote_ip && tech_pvt->remote_port && switch_test_flag(tech_pvt, TFLAG_TRANSPORT))) { now = switch_time_now(); elapsed = (unsigned int) ((now - started) / 1000); @@ -1329,89 +1338,101 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch_frame_t **frame, int timeout, switch_io_flag_t flags, int stream_id) { struct private_object *tech_pvt = NULL; - uint32_t bytes = 0; - switch_size_t samples = 0, frames = 0, ms = 0; switch_channel_t *channel = NULL; - switch_payload_t payload = 0; - switch_status_t status; + int payload = 0; channel = switch_core_session_get_channel(session); assert(channel != NULL); - tech_pvt = switch_core_session_get_private(session); + tech_pvt = (struct private_object *) switch_core_session_get_private(session); assert(tech_pvt != NULL); - - if (!tech_pvt->rtp_session) { - return SWITCH_STATUS_FALSE; - } - - if (switch_test_flag(tech_pvt, TFLAG_BYE)) { - //terminate_session(&session, __LINE__, SWITCH_CAUSE_NORMAL_CLEARING); - return SWITCH_STATUS_FALSE; + while (!(tech_pvt->read_codec.implementation && switch_rtp_ready(tech_pvt->rtp_session))) { + if (switch_channel_ready(channel)) { + switch_yield(10000); + } else { + return SWITCH_STATUS_GENERR; + } } tech_pvt->read_frame.datalen = 0; switch_set_flag_locked(tech_pvt, TFLAG_READING); - bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_frame; - samples = tech_pvt->read_codec.implementation->samples_per_frame; - ms = tech_pvt->read_codec.implementation->microseconds_per_frame; - tech_pvt->read_frame.datalen = 0; +#if 0 + if (tech_pvt->last_read) { + elapsed = (unsigned int) ((switch_time_now() - tech_pvt->last_read) / 1000); + if (elapsed > 60000) { + return SWITCH_STATUS_TIMEOUT; + } + } +#endif - while (!switch_test_flag(tech_pvt, TFLAG_BYE) && switch_test_flag(tech_pvt, TFLAG_IO) - && tech_pvt->read_frame.datalen == 0) { - tech_pvt->read_frame.flags = 0; - status = switch_rtp_zerocopy_read_frame(tech_pvt->rtp_session, &tech_pvt->read_frame); + if (switch_test_flag(tech_pvt, TFLAG_IO)) { + switch_status_t status; - if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { - return SWITCH_STATUS_FALSE; - } - payload = tech_pvt->read_frame.payload; + assert(tech_pvt->rtp_session != NULL); + tech_pvt->read_frame.datalen = 0; - if (switch_rtp_has_dtmf(tech_pvt->rtp_session)) { - char dtmf[128]; - switch_rtp_dequeue_dtmf(tech_pvt->rtp_session, dtmf, sizeof(dtmf)); - switch_channel_queue_dtmf(channel, dtmf); - switch_set_flag_locked(tech_pvt, TFLAG_DTMF); - } - if (switch_test_flag(tech_pvt, TFLAG_DTMF)) { - switch_clear_flag_locked(tech_pvt, TFLAG_DTMF); - return SWITCH_STATUS_BREAK; - } + while (switch_test_flag(tech_pvt, TFLAG_IO) && tech_pvt->read_frame.datalen == 0) { + tech_pvt->read_frame.flags = SFF_NONE; - if (switch_test_flag(&tech_pvt->read_frame, SFF_CNG)) { - tech_pvt->read_frame.datalen = tech_pvt->last_read ? tech_pvt->last_read : tech_pvt->read_codec.implementation->encoded_bytes_per_frame; - } + status = switch_rtp_zerocopy_read_frame(tech_pvt->rtp_session, &tech_pvt->read_frame); + if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { + return SWITCH_STATUS_FALSE; + } - if (tech_pvt->read_frame.datalen > 0) { - if (!switch_test_flag((&tech_pvt->read_frame), SFF_CNG)) { - if (tech_pvt->read_codec.implementation->encoded_bytes_per_frame && bytes) { - bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_frame; - frames = (tech_pvt->read_frame.datalen / bytes); - } else { - frames = 1; + + + payload = tech_pvt->read_frame.payload; + +#if 0 + elapsed = (unsigned int) ((switch_time_now() - started) / 1000); + + if (timeout > -1) { + if (elapsed >= (unsigned int) timeout) { + return SWITCH_STATUS_BREAK; } - samples = frames * tech_pvt->read_codec.implementation->samples_per_frame; - ms = frames * tech_pvt->read_codec.implementation->microseconds_per_frame; - tech_pvt->timestamp_recv += (int32_t) samples; - tech_pvt->read_frame.samples = (int) samples; - tech_pvt->last_read = tech_pvt->read_frame.datalen; } - break; - } - switch_yield(1000); - } + elapsed = (unsigned int) ((switch_time_now() - last_act) / 1000); + if (elapsed >= hard_timeout) { + return SWITCH_STATUS_BREAK; + } +#endif + if (switch_rtp_has_dtmf(tech_pvt->rtp_session)) { + char dtmf[128]; + switch_rtp_dequeue_dtmf(tech_pvt->rtp_session, dtmf, sizeof(dtmf)); + switch_channel_queue_dtmf(channel, dtmf); + } + + + if (tech_pvt->read_frame.datalen > 0) { + size_t bytes = 0; + int frames = 1; + if (!switch_test_flag((&tech_pvt->read_frame), SFF_CNG)) { + if ((bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_frame)) { + frames = (tech_pvt->read_frame.datalen / bytes); + } + tech_pvt->read_frame.samples = (int) (frames * tech_pvt->read_codec.implementation->samples_per_frame); + } + break; + } + } + } switch_clear_flag_locked(tech_pvt, TFLAG_READING); + if (tech_pvt->read_frame.datalen == 0) { + *frame = NULL; + return SWITCH_STATUS_GENERR; + } *frame = &tech_pvt->read_frame; + return SWITCH_STATUS_SUCCESS; } @@ -1422,45 +1443,46 @@ switch_status_t status = SWITCH_STATUS_SUCCESS; int bytes = 0, samples = 0, frames = 0; - channel = switch_core_session_get_channel(session); assert(channel != NULL); - tech_pvt = switch_core_session_get_private(session); + tech_pvt = (struct private_object *) switch_core_session_get_private(session); assert(tech_pvt != NULL); - if (!tech_pvt->rtp_session) { - return SWITCH_STATUS_FALSE; + while (!(tech_pvt->read_codec.implementation && switch_rtp_ready(tech_pvt->rtp_session))) { + if (switch_channel_ready(channel)) { + switch_yield(10000); + } else { + return SWITCH_STATUS_GENERR; + } } - if (!switch_test_flag(tech_pvt, TFLAG_RTP_READY)) { + if (!switch_test_flag(tech_pvt, TFLAG_IO)) { return SWITCH_STATUS_SUCCESS; } - - if (switch_test_flag(tech_pvt, TFLAG_BYE)) { - return SWITCH_STATUS_FALSE; - } - switch_set_flag_locked(tech_pvt, TFLAG_WRITING); - if (tech_pvt->read_codec.implementation->encoded_bytes_per_frame) { - bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_frame; - frames = ((int) frame->datalen / bytes); - } else { - frames = 1; - } + if (!switch_test_flag(frame, SFF_CNG)) { + if (tech_pvt->read_codec.implementation->encoded_bytes_per_frame) { + bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_frame; + frames = ((int) frame->datalen / bytes); + } else + frames = 1; - samples = frames * tech_pvt->read_codec.implementation->samples_per_frame; - tech_pvt->timestamp_send += samples; - if (switch_rtp_write_frame(tech_pvt->rtp_session, frame, 0) < 0) { - terminate_session(&session, __LINE__, SWITCH_CAUSE_NORMAL_CLEARING); - return SWITCH_STATUS_FALSE; + samples = frames * tech_pvt->read_codec.implementation->samples_per_frame; } +#if 0 + printf("%s %s->%s send %d bytes %d samples in %d frames ts=%d\n", + switch_channel_get_name(channel), + tech_pvt->local_sdp_audio_ip, tech_pvt->remote_sdp_audio_ip, frame->datalen, samples, frames, tech_pvt->timestamp_send); +#endif + tech_pvt->timestamp_send += samples; + //switch_rtp_write_frame(tech_pvt->rtp_session, frame, tech_pvt->timestamp_send); + switch_rtp_write_frame(tech_pvt->rtp_session, frame, 0); switch_clear_flag_locked(tech_pvt, TFLAG_WRITING); - return status; } @@ -1569,12 +1591,20 @@ }; +static switch_api_interface_t debug_api_interface = { + /*.interface_name */ "dl_debug", + /*.desc */ "DingaLing Presence", + /*.function */ dl_debug, + /*.syntax */ "dl_debug [true|false]", + /*.next */ NULL +}; + static switch_api_interface_t pres_api_interface = { /*.interface_name */ "dl_pres", /*.desc */ "DingaLing Presence", /*.function */ dl_pres, /*.syntax */ "dl_pres <profile_name>", - /*.next */ NULL + /*.next */ &debug_api_interface }; static switch_api_interface_t logout_api_interface = { @@ -1898,6 +1928,7 @@ break; } } + if (globals.init) { ldl_global_destroy(); } @@ -1933,8 +1964,10 @@ switch_set_flag(profile, TFLAG_TIMER); } else if (!strcasecmp(var, "dialplan")) { profile->dialplan = switch_core_strdup(module_pool, val); +#ifdef AUTO_REPLY // gotta fix looping on this } else if (!strcasecmp(var, "auto-reply")) { profile->auto_reply = switch_core_strdup(module_pool, val); +#endif } else if (!strcasecmp(var, "name")) { profile->name = switch_core_strdup(module_pool, val); } else if (!strcasecmp(var, "message")) { @@ -1981,6 +2014,27 @@ } } +static switch_status_t dl_debug(char *tf, switch_core_session_t *session, switch_stream_handle_t *stream) +{ + int on, cur; + + if (session) { + return SWITCH_STATUS_FALSE; + } + + if (tf) { + on = switch_true(tf); + cur = ldl_global_debug(on); + } else { + cur = ldl_global_debug(-1); + } + + + stream->write_function(stream, "DEBUG IS NOW %s\n", cur ? "ON" : "OFF"); + + return SWITCH_STATUS_SUCCESS; +} + static switch_status_t dl_pres(char *profile_name, switch_core_session_t *session, switch_stream_handle_t *stream) { mdl_profile_t *profile; @@ -2349,6 +2403,8 @@ switch_mutex_unlock(profile->mutex); if (is_special(to)) { ldl_handle_send_presence(profile->handle, to, from, NULL, NULL, "Click To Call", profile->avatar); + } else { + ldl_handle_send_presence(profile->handle, to, from, NULL, NULL, "Authenticated.\nCome to ClueCon!\nhttp://www.cluecon.com", profile->avatar); } #if 0 if (is_special(to)) { @@ -2444,12 +2500,13 @@ char *proto = MDL_CHAT_PROTO; char *pproto = NULL, *ffrom = NULL; char *hint; - +#ifdef AUTO_REPLY if (profile->auto_reply) { ldl_handle_send_msg(handle, (profile->user_flags & LDL_FLAG_COMPONENT) ? to : ldl_handle_get_login(profile->handle), from, "", profile->auto_reply); } +#endif if (strchr(to, '+')) { pproto = strdup(to); @@ -2526,7 +2583,7 @@ } } else { - if (dl_signal != LDL_SIGNAL_INITIATE) { + if (dl_signal != LDL_SIGNAL_INITIATE && !msg) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Session is already dead\n"); status = LDL_STATUS_FALSE; goto done; @@ -2534,6 +2591,7 @@ if ((session = switch_core_session_request(&channel_endpoint_interface, NULL)) != 0) { switch_core_session_add_stream(session, NULL); + if ((tech_pvt = (struct private_object *) switch_core_session_alloc(session, sizeof(struct private_object))) != 0) { memset(tech_pvt, 0, sizeof(*tech_pvt)); switch_mutex_init(&tech_pvt->flag_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session)); Modified: freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_sofia/mod_sofia.h ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_sofia/mod_sofia.h (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_sofia/mod_sofia.h Mon Apr 9 12:32:10 2007 @@ -27,6 +27,7 @@ * Ken Rice, Asteria Solutions Group, Inc <ken@asteriasgi.com> * Paul D. Tinsley <pdt at jackhammer.org> * Bret McDanel <trixter AT 0xdecafbad.com> + * Marcel Barbulescu <marcelbarbulescu@gmail.com> * * * mod_sofia.h -- SOFIA SIP Endpoint @@ -159,7 +160,8 @@ REG_STATE_REGISTER, REG_STATE_REGED, REG_STATE_FAILED, - REG_STATE_EXPIRED + REG_STATE_EXPIRED, + REG_STATE_NOREG } reg_state_t; struct outbound_reg { Modified: freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_sofia/sofia.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_sofia/sofia.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_sofia/sofia.c Mon Apr 9 12:32:10 2007 @@ -27,6 +27,7 @@ * Ken Rice, Asteria Solutions Group, Inc <ken@asteriasgi.com> * Paul D. Tinsley <pdt at jackhammer.org> * Bret McDanel <trixter AT 0xdecafbad.com> + * Marcel Barbulescu <marcelbarbulescu@gmail.com> * * * sofia.c -- SOFIA SIP Endpoint (sofia code) @@ -668,7 +669,7 @@ } if ((gateway = switch_core_alloc(profile->pool, sizeof(*gateway)))) { - char *scheme = "Digest", + char *register_str = "true", *scheme = "Digest", *realm = NULL, *username = NULL, *password = NULL, *extension = NULL, *proxy = NULL, *context = "default", *expire_seconds = "3600"; @@ -682,7 +683,9 @@ char *var = (char *) switch_xml_attr_soft(param, "name"); char *val = (char *) switch_xml_attr_soft(param, "value"); - if (!strcmp(var, "scheme")) { + if (!strcmp(var, "register")) { + register_str = val; + } else if (!strcmp(var, "scheme")) { scheme = val; } else if (!strcmp(var, "realm")) { realm = val; @@ -725,6 +728,9 @@ proxy = realm; } + if (!switch_true(register_str)) { + gateway->state = REG_STATE_NOREG; + } gateway->register_scheme = switch_core_strdup(gateway->pool, scheme); gateway->register_context = switch_core_strdup(gateway->pool, context); gateway->register_realm = switch_core_strdup(gateway->pool, realm); Modified: freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_sofia/sofia_reg.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_sofia/sofia_reg.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/src/mod/endpoints/mod_sofia/sofia_reg.c Mon Apr 9 12:32:10 2007 @@ -27,6 +27,7 @@ * Ken Rice, Asteria Solutions Group, Inc <ken@asteriasgi.com> * Paul D. Tinsley <pdt at jackhammer.org> * Bret McDanel <trixter AT 0xdecafbad.com> + * Marcel Barbulescu <marcelbarbulescu@gmail.com> * * * sofia_ref.c -- SOFIA SIP Endpoint (registration code) @@ -56,6 +57,8 @@ reg_state_t ostate = gateway_ptr->state; switch (ostate) { + case REG_STATE_NOREG: + break; case REG_STATE_REGISTER: switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "registered %s\n", gateway_ptr->name); gateway_ptr->expires = now + gateway_ptr->freq; @@ -244,6 +247,7 @@ switch_event_t *event; const char *rpid = "unknown"; const char *display = "\"user\""; + char network_addr[80]; /* all callers must confirm that sip, sip->sip_request and sip->sip_contact are not NULL */ assert(sip != NULL && sip->sip_contact != NULL && sip->sip_request != NULL); @@ -322,7 +326,8 @@ } if (!authorization || stale) { - snprintf(params, sizeof(params), "from_user=%s&from_host=%s&contact=%s", from_user, from_host, contact_str); + get_addr(network_addr, sizeof(network_addr), &((struct sockaddr_in *) msg_addrinfo(nua_current_request(nua))->ai_addr)->sin_addr); + snprintf(params, sizeof(params), "network_addr=%s&from_user=%s&from_host=%s&contact=%s", network_addr, from_user, from_host, contact_str); if (switch_xml_locate("directory", "domain", "name", from_host, &xml, &domain, params) != SWITCH_STATUS_SUCCESS) { @@ -777,3 +782,4 @@ + Modified: freeswitch/branches/mikej/sofiasip-upgrade/src/switch_core.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/src/switch_core.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/src/switch_core.c Mon Apr 9 12:32:10 2007 @@ -26,6 +26,7 @@ * Anthony Minessale II <anthmct@yahoo.com> * Michael Jerris <mike@jerris.com> * Paul D. Tinsley <pdt at jackhammer.org> + * Marcel Barbulescu <marcelbarbulescu@gmail.com> * * * switch_core.c -- Main Core Library @@ -445,6 +446,12 @@ if (!strcasecmp(var, "max-sessions")) { switch_core_session_limit(atoi(val)); } + else if (!strcasecmp(var, "rtp-start-port")) { + switch_rtp_set_start_port((switch_port_t)atoi(val)); + } + else if (!strcasecmp(var, "rtp-end-port")) { + switch_rtp_set_end_port((switch_port_t)atoi(val)); + } } } Modified: freeswitch/branches/mikej/sofiasip-upgrade/src/switch_rtp.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/src/switch_rtp.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/src/switch_rtp.c Mon Apr 9 12:32:10 2007 @@ -24,6 +24,7 @@ * Contributor(s): * * Anthony Minessale II <anthmct@yahoo.com> + * Marcel Barbulescu <marcelbarbulescu@gmail.com> * * * switch_rtp.c -- RTP @@ -50,6 +51,8 @@ #define MASTER_KEY_LEN 30 #define RTP_MAGIC_NUMBER 42 +static switch_port_t START_PORT = RTP_START_PORT; +static switch_port_t END_PORT = RTP_END_PORT; static switch_port_t NEXT_PORT = RTP_START_PORT; static switch_mutex_t *port_lock = NULL; @@ -263,6 +266,43 @@ global_init = 1; } +SWITCH_DECLARE(switch_port_t) switch_rtp_set_start_port(switch_port_t port) +{ + if (port) { + if (port_lock) { + switch_mutex_lock(port_lock); + } + if (NEXT_PORT == START_PORT) { + NEXT_PORT = port; + } + START_PORT = port; + if (NEXT_PORT < START_PORT) { + NEXT_PORT = START_PORT; + } + if (port_lock) { + switch_mutex_unlock(port_lock); + } + } + return START_PORT; +} + +SWITCH_DECLARE(switch_port_t) switch_rtp_set_end_port(switch_port_t port) +{ + if (port) { + if (port_lock) { + switch_mutex_lock(port_lock); + } + END_PORT = port; + if (NEXT_PORT > END_PORT) { + NEXT_PORT = START_PORT; + } + if (port_lock) { + switch_mutex_unlock(port_lock); + } + } + return END_PORT; +} + SWITCH_DECLARE(switch_port_t) switch_rtp_request_port(void) { switch_port_t port; @@ -270,8 +310,8 @@ switch_mutex_lock(port_lock); port = NEXT_PORT; NEXT_PORT += 2; - if (NEXT_PORT > RTP_END_PORT) { - NEXT_PORT = RTP_START_PORT; + if (NEXT_PORT > END_PORT) { + NEXT_PORT = START_PORT; } switch_mutex_unlock(port_lock); return port; @@ -772,7 +812,6 @@ return -1; } - if (!bytes && switch_test_flag(rtp_session, SWITCH_RTP_FLAG_BREAK)) { switch_clear_flag_locked(rtp_session, SWITCH_RTP_FLAG_BREAK); @@ -787,22 +826,6 @@ if (bytes < 0) { return (int) bytes; - } else if (bytes > 0 && switch_test_flag(rtp_session, SWITCH_RTP_FLAG_SECURE)) { - int sbytes = (int) bytes; - err_status_t stat; - - stat = srtp_unprotect(rtp_session->recv_ctx, &rtp_session->recv_msg.header, &sbytes); - if (stat) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, - "error: srtp unprotection failed with code %d%s\n", stat, - stat == err_status_replay_fail ? " (replay check failed)" : stat == err_status_auth_fail ? " (auth check failed)" : ""); - return -1; - } - bytes = sbytes; - } - - if (bytes && rtp_session->cng_pt && rtp_session->recv_msg.header.pt == rtp_session->cng_pt) { - continue; } if (rtp_session->timer.interval) { @@ -818,26 +841,63 @@ } } - - if (check) { do_2833(rtp_session); if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_USE_TIMER)) { + uint8_t *data = (uint8_t *) rtp_session->recv_msg.body; /* We're late! We're Late! */ if (!switch_test_flag(rtp_session, SWITCH_RTP_FLAG_NOBLOCK) && status == SWITCH_STATUS_BREAK) { switch_yield(1000); continue; } - memset(&rtp_session->recv_msg, 0, SWITCH_RTP_CNG_PAYLOAD); - rtp_session->recv_msg.header.pt = SWITCH_RTP_CNG_PAYLOAD; + + memset(data, 0, 2); + data[0] = 65; + + rtp_session->recv_msg.header.pt = (uint32_t) rtp_session->cng_pt ? rtp_session->cng_pt : SWITCH_RTP_CNG_PAYLOAD; *flags |= SFF_CNG; - /* Return a CNG frame */ - *payload_type = SWITCH_RTP_CNG_PAYLOAD; - return SWITCH_RTP_CNG_PAYLOAD + rtp_header_len; + *payload_type = (switch_payload_t)rtp_session->recv_msg.header.pt; + return 2 + rtp_header_len; } } + if (bytes && rtp_session->recv_msg.header.version != 2) { + uint8_t *data = (uint8_t *) rtp_session->recv_msg.body; + if (rtp_session->recv_msg.header.version == 0 && rtp_session->ice_user) { + handle_ice(rtp_session, (void *) &rtp_session->recv_msg, bytes); + } + + if (rtp_session->invalid_handler) { + rtp_session->invalid_handler(rtp_session, rtp_session->sock, (void *) &rtp_session->recv_msg, bytes, rtp_session->from_addr); + } + + memset(data, 0, 2); + data[0] = 65; + + rtp_session->recv_msg.header.pt = (uint32_t) rtp_session->cng_pt ? rtp_session->cng_pt : SWITCH_RTP_CNG_PAYLOAD; + *flags |= SFF_CNG; + *payload_type = (switch_payload_t)rtp_session->recv_msg.header.pt; + return 2 + rtp_header_len; + } + + + + + if (bytes && switch_test_flag(rtp_session, SWITCH_RTP_FLAG_SECURE)) { + int sbytes = (int) bytes; + err_status_t stat; + + stat = srtp_unprotect(rtp_session->recv_ctx, &rtp_session->recv_msg.header, &sbytes); + if (stat) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + "error: srtp unprotection failed with code %d%s\n", stat, + stat == err_status_replay_fail ? " (replay check failed)" : stat == err_status_auth_fail ? " (auth check failed)" : ""); + return -1; + } + bytes = sbytes; + } + if (status == SWITCH_STATUS_BREAK || bytes == 0) { if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_DATAWAIT)) { switch_yield((rtp_session->ms_per_packet / 1000) * 750); @@ -846,49 +906,45 @@ return 0; } - - if (rtp_session->recv_msg.header.version) { - if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_AUTOADJ) - && switch_sockaddr_get_port(rtp_session->from_addr)) { - char *tx_host; - char *old_host; - char bufa[30], bufb[30]; - tx_host = switch_get_addr(bufa, sizeof(bufa), rtp_session->from_addr); - old_host = switch_get_addr(bufb, sizeof(bufb), rtp_session->remote_addr); - - if ((switch_sockaddr_get_port(rtp_session->from_addr) != rtp_session->remote_port) - || strcmp(tx_host, old_host)) { - const char *err; - uint32_t old = rtp_session->remote_port; - - if (!switch_strlen_zero(tx_host) && switch_sockaddr_get_port(rtp_session->from_addr) > 0) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, - "Auto Changing port from %s:%u to %s:%u\n", old_host, old, tx_host, - switch_sockaddr_get_port(rtp_session->from_addr)); - switch_rtp_set_remote_address(rtp_session, tx_host, switch_sockaddr_get_port(rtp_session->from_addr), &err); - } + + + if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_AUTOADJ) && switch_sockaddr_get_port(rtp_session->from_addr)) { + + char *tx_host; + char *old_host; + char bufa[30], bufb[30]; + tx_host = switch_get_addr(bufa, sizeof(bufa), rtp_session->from_addr); + old_host = switch_get_addr(bufb, sizeof(bufb), rtp_session->remote_addr); + + if ((switch_sockaddr_get_port(rtp_session->from_addr) != rtp_session->remote_port) + || strcmp(tx_host, old_host)) { + const char *err; + uint32_t old = rtp_session->remote_port; + + if (!switch_strlen_zero(tx_host) && switch_sockaddr_get_port(rtp_session->from_addr) > 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, + "Auto Changing port from %s:%u to %s:%u\n", old_host, old, tx_host, + switch_sockaddr_get_port(rtp_session->from_addr)); + switch_rtp_set_remote_address(rtp_session, tx_host, switch_sockaddr_get_port(rtp_session->from_addr), &err); } - switch_clear_flag_locked(rtp_session, SWITCH_RTP_FLAG_AUTOADJ); } + switch_clear_flag_locked(rtp_session, SWITCH_RTP_FLAG_AUTOADJ); } - if (rtp_session->recv_msg.header.version == 2) { - if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_GOOGLEHACK) && rtp_session->recv_msg.header.pt == 102) { - rtp_session->recv_msg.header.pt = 97; - } - rtp_session->rseq = ntohs((uint16_t) rtp_session->recv_msg.header.seq); - rtp_session->rpayload = (switch_payload_t) rtp_session->recv_msg.header.pt; - } else { - if (rtp_session->recv_msg.header.version == 0 && rtp_session->ice_user) { - handle_ice(rtp_session, (void *) &rtp_session->recv_msg, bytes); - } + if (bytes && rtp_session->cng_pt && rtp_session->recv_msg.header.pt == rtp_session->cng_pt) { + continue; + } - if (rtp_session->invalid_handler) { - rtp_session->invalid_handler(rtp_session, rtp_session->sock, (void *) &rtp_session->recv_msg, bytes, rtp_session->from_addr); - } - return 0; + + + if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_GOOGLEHACK) && rtp_session->recv_msg.header.pt == 102) { + rtp_session->recv_msg.header.pt = 97; } + rtp_session->rseq = ntohs((uint16_t) rtp_session->recv_msg.header.seq); + rtp_session->rpayload = (switch_payload_t) rtp_session->recv_msg.header.pt; + + /* RFC2833 ... TBD try harder to honor the duration etc. */ if (!switch_test_flag(rtp_session, SWITCH_RTP_FLAG_PASS_RFC2833) && rtp_session->recv_msg.header.pt == rtp_session->te) { @@ -923,9 +979,8 @@ rtp_session->dtmf_data.dc = 0; } } - + continue; - } break; @@ -1182,12 +1237,11 @@ } if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_VAD) && - rtp_session->recv_msg.header.pt == rtp_session->vad_data.read_codec->implementation->ianacode && - ((datalen == rtp_session->vad_data.read_codec->implementation->encoded_bytes_per_frame) || - (datalen > SWITCH_RTP_CNG_PAYLOAD && rtp_session->vad_data.read_codec->implementation->encoded_bytes_per_frame == 0))) { - int16_t decoded[SWITCH_RECOMMENDED_BUFFER_SIZE / sizeof(int16_t)]; - uint32_t rate; - uint32_t flags; + rtp_session->recv_msg.header.pt == rtp_session->vad_data.read_codec->implementation->ianacode) { + + int16_t decoded[SWITCH_RECOMMENDED_BUFFER_SIZE / sizeof(int16_t)] = {0}; + uint32_t rate = 0; + uint32_t flags = 0; uint32_t len = sizeof(decoded); time_t now = time(NULL); send = 0; @@ -1205,6 +1259,7 @@ datalen, rtp_session->vad_data.read_codec->implementation->samples_per_second, decoded, &len, &rate, &flags) == SWITCH_STATUS_SUCCESS) { + uint32_t energy = 0; uint32_t x, y = 0, z = len / sizeof(int16_t); @@ -1215,7 +1270,7 @@ energy += abs(decoded[y]); y += rtp_session->vad_data.read_codec->implementation->number_of_channels; } - + if (++rtp_session->vad_data.start_count < rtp_session->vad_data.start) { send = 1; } else { @@ -1274,35 +1329,23 @@ if (switch_test_flag(&rtp_session->vad_data, SWITCH_VAD_FLAG_TALKING)) { send = 1; - } else { - if (switch_test_flag(&rtp_session->vad_data, SWITCH_VAD_FLAG_CNG) - && ++rtp_session->vad_data.cng_count >= rtp_session->vad_data.cng_freq) { - rtp_session->send_msg.header.pt = SWITCH_RTP_CNG_PAYLOAD; - memset(rtp_session->send_msg.body, 255, SWITCH_RTP_CNG_PAYLOAD); - /* rtp_session->send_msg.header.ts = htonl(rtp_session->vad_data.ts); - * rtp_session->vad_data.ts++; - */ - bytes = SWITCH_RTP_CNG_PAYLOAD; - send = 1; - rtp_session->vad_data.cng_count = 0; - } - } - + } } } else { return SWITCH_STATUS_GENERR; } } - rtp_session->last_write_ts = ntohl(send_msg->header.ts); - rtp_session->last_write_ssrc = ntohl(send_msg->header.ssrc); - rtp_session->last_write_seq = rtp_session->seq; - if (rtp_session->last_write_seq <= rtp_session->dtmf_data.out_digit_seq) { + if (rtp_session->last_write_seq >0 && rtp_session->last_write_seq <= rtp_session->dtmf_data.out_digit_seq) { send = 0; } if (send) { + + rtp_session->last_write_ts = ntohl(send_msg->header.ts); + rtp_session->last_write_ssrc = ntohl(send_msg->header.ssrc); + rtp_session->last_write_seq = rtp_session->seq; if (rtp_session->timer.interval) { switch_core_timer_check(&rtp_session->timer); rtp_session->last_write_samplecount = rtp_session->timer.samplecount; @@ -1360,7 +1403,8 @@ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); return SWITCH_STATUS_FALSE; } - + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Activate VAD codec %s %dms\n", codec->implementation->iananame, + codec->implementation->microseconds_per_frame / 1000); rtp_session->vad_data.diff_level = 400; rtp_session->vad_data.hangunder = 15; rtp_session->vad_data.hangover = 40; Modified: freeswitch/branches/mikej/sofiasip-upgrade/src/switch_xml.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/src/switch_xml.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/src/switch_xml.c Mon Apr 9 12:32:10 2007 @@ -1570,7 +1570,7 @@ // Adds a child tag. off is the offset of the child tag relative to the start // of the parent tag's character content. Returns the child tag -switch_xml_t switch_xml_add_child(switch_xml_t xml, const char *name, switch_size_t off) +SWITCH_DECLARE(switch_xml_t) switch_xml_add_child(switch_xml_t xml, const char *name, switch_size_t off) { switch_xml_t child; @@ -1587,7 +1587,7 @@ } // sets the character content for the given tag and returns the tag -switch_xml_t switch_xml_set_txt(switch_xml_t xml, const char *txt) +SWITCH_DECLARE(switch_xml_t) switch_xml_set_txt(switch_xml_t xml, const char *txt) { if (!xml) return NULL;
participants (1)
-
Freeswitch SVN