<h1>Project "FreeSWITCH Source" received a push.</h1>
<h2>branch: master updated</h2>
<pre>
via: 7c99cd9da80ad23cab7e83de31019b2fb2b721db (commit)
via: 6fc0bb088654437771b89e42c90f6196d14acad6 (commit)
via: 6734fe711bbc69dc999f237a1865a3013a1d762b (commit)
via: a020724030c651aed8e427511b8dc79c4ae7a661 (commit)
from: 57613192ccbf2a735d4afacfd63956aba5735457 (commit)
</pre>= COMMIT LOG ===========================================================
<div class="highlight"><pre>committer: Michael S Collins
comments:
Merge branch 'master' of git://git.freeswitch.org/freeswitch
</pre></div>
<div class="highlight"><pre>committer: Moises Silva
comments:
Merge remote branch 'fsorig/master'
</pre></div>
<div class="highlight"><pre>committer: Moises Silva
comments:
freetdm: General fixes for alarm handling and added MFCR2 suspend support - Clean up ftdm_channel_set_sig_status locking and sanity checks - Set FTDM_CHANNEL_SUSPENDED when delivering FTDM_SIGEVENT_SIGSTATUS changed to SUSPENDED - Clear FTDM_CHANNEL_SUSPENDED when delivering FTDM_SIGEVENT_SIGSTATUS changed to UP - Update ftmod_r2 to honor local suspend requests when returning from alarm state
<span style="color: #000080; font-weight: bold">diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c</span>
<span style="color: #000080; font-weight: bold">index 6cd2a22..6bfa375 100644</span>
<span style="color: #A00000">--- a/libs/freetdm/src/ftdm_io.c</span>
<span style="color: #00A000">+++ b/libs/freetdm/src/ftdm_io.c</span>
<span style="color: #800080; font-weight: bold">@@ -2529,26 +2529,34 @@ done:</span>
        return status;
}
<span style="color: #A00000">-FT_DECLARE(ftdm_status_t) ftdm_channel_set_sig_status(ftdm_channel_t *ftdmchan, ftdm_signaling_status_t sigstatus)</span>
<span style="color: #00A000">+FT_DECLARE(ftdm_status_t) ftdm_channel_set_sig_status(ftdm_channel_t *fchan, ftdm_signaling_status_t sigstatus)</span>
{
<span style="color: #A00000">-        ftdm_assert_return(ftdmchan != NULL, FTDM_FAIL, "Null channel\n");</span>
<span style="color: #A00000">-        ftdm_assert_return(ftdmchan->span != NULL, FTDM_FAIL, "Null span\n");</span>
<span style="color: #00A000">+        ftdm_status_t res;</span>
<span style="color: #A00000">-        if (sigstatus == FTDM_SIG_STATE_DOWN) {</span>
<span style="color: #A00000">-                ftdm_log_chan_msg(ftdmchan, FTDM_LOG_WARNING, "The user is not allowed to set the signaling status to DOWN, valid states are UP or SUSPENDED\n");</span>
<span style="color: #A00000">-                return FTDM_FAIL;</span>
<span style="color: #00A000">+        ftdm_assert_return(fchan != NULL, FTDM_FAIL, "Null channel\n");</span>
<span style="color: #00A000">+        ftdm_assert_return(fchan->span != NULL, FTDM_FAIL, "Null span\n");</span>
<span style="color: #00A000">+        ftdm_assert_return(fchan->span->set_channel_sig_status != NULL, FTDM_ENOSYS, "Not implemented\n");</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        ftdm_channel_lock(fchan);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (ftdm_test_flag(fchan, FTDM_CHANNEL_IN_ALARM)) {</span>
<span style="color: #00A000">+                ftdm_log_chan_msg(fchan, FTDM_LOG_WARNING, "You can not set the signaling status of an alarmed channel\n");</span>
<span style="color: #00A000">+                res = FTDM_EINVAL;</span>
<span style="color: #00A000">+                goto done;</span>
        }
<span style="color: #A00000">-        if (ftdmchan->span->set_channel_sig_status) {</span>
<span style="color: #A00000">-                ftdm_status_t res;</span>
<span style="color: #A00000">-                ftdm_channel_lock(ftdmchan);</span>
<span style="color: #A00000">-                res = ftdmchan->span->set_channel_sig_status(ftdmchan, sigstatus);</span>
<span style="color: #A00000">-                ftdm_channel_unlock(ftdmchan);</span>
<span style="color: #A00000">-                return res;</span>
<span style="color: #A00000">-        } else {</span>
<span style="color: #A00000">-                ftdm_log(FTDM_LOG_ERROR, "set_channel_sig_status method not implemented!\n");</span>
<span style="color: #A00000">-                return FTDM_FAIL;</span>
<span style="color: #00A000">+        if (sigstatus == FTDM_SIG_STATE_DOWN) {</span>
<span style="color: #00A000">+                ftdm_log_chan_msg(fchan, FTDM_LOG_WARNING, "You can not set the signaling status to DOWN, valid states are UP or SUSPENDED\n");</span>
<span style="color: #00A000">+                res = FTDM_EINVAL;</span>
<span style="color: #00A000">+                goto done;</span>
        }
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        res = fchan->span->set_channel_sig_status(fchan, sigstatus);</span>
<span style="color: #00A000">+done:</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        ftdm_channel_unlock(fchan);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        return res;</span>
}
FT_DECLARE(ftdm_status_t) ftdm_channel_get_sig_status(ftdm_channel_t *ftdmchan, ftdm_signaling_status_t *sigstatus)
<span style="color: #800080; font-weight: bold">@@ -5505,8 +5513,14 @@ FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t</span>
                {
                        if (sigmsg->ev_data.sigstatus.status == FTDM_SIG_STATE_UP) {
                                ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP);
<span style="color: #00A000">+                                ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_SUSPENDED);</span>
                        } else {
                                ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP);
<span style="color: #00A000">+                                if (sigmsg->ev_data.sigstatus.status == FTDM_SIG_STATE_SUSPENDED) {</span>
<span style="color: #00A000">+                                        ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_SUSPENDED);</span>
<span style="color: #00A000">+                                } else {</span>
<span style="color: #00A000">+                                        ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_SUSPENDED);</span>
<span style="color: #00A000">+                                }</span>
                        }
                }
                break;
<span style="color: #000080; font-weight: bold">diff --git a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c</span>
<span style="color: #000080; font-weight: bold">index 2c9c42d..4344177 100644</span>
<span style="color: #A00000">--- a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c</span>
<span style="color: #00A000">+++ b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c</span>
<span style="color: #800080; font-weight: bold">@@ -70,6 +70,7 @@ typedef struct ftdm_r2_call_t {</span>
        int answer_pending:1;
        int disconnect_rcvd:1;
        int protocol_error:1;
<span style="color: #00A000">+        int localsuspend_on_alarm:1;</span>
        ftdm_size_t dnis_index;
        ftdm_size_t ani_index;
        char logname[255];
<span style="color: #800080; font-weight: bold">@@ -499,8 +500,16 @@ static ftdm_status_t ftdm_r2_stop(ftdm_span_t *span)</span>
static FIO_CHANNEL_GET_SIG_STATUS_FUNCTION(ftdm_r2_get_channel_sig_status)
{
<span style="color: #00A000">+        openr2_chan_t *r2chan = R2CALL(ftdmchan)->r2chan;</span>
<span style="color: #00A000">+        openr2_cas_signal_t rxcas, txcas;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        /* get the current rx and tx cas bits */</span>
<span style="color: #00A000">+        openr2_chan_get_cas(r2chan, &rxcas, &txcas);</span>
<span style="color: #00A000">+</span>
        if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_SIG_UP)) {
                *status = FTDM_SIG_STATE_UP;
<span style="color: #00A000">+        } else if (rxcas == OR2_CAS_BLOCK || txcas == OR2_CAS_BLOCK) {</span>
<span style="color: #00A000">+                *status = FTDM_SIG_STATE_SUSPENDED;</span>
        } else {
                *status = FTDM_SIG_STATE_DOWN;
        }
<span style="color: #800080; font-weight: bold">@@ -561,6 +570,11 @@ static FIO_SPAN_GET_SIG_STATUS_FUNCTION(ftdm_r2_get_span_sig_status)</span>
        for (citer = chaniter; citer; citer = ftdm_iterator_next(citer)) {
                ftdm_channel_t *fchan = ftdm_iterator_current(citer);
                ftdm_channel_lock(fchan);
<span style="color: #00A000">+                if (ftdm_test_flag(fchan, FTDM_CHANNEL_IN_ALARM)) {</span>
<span style="color: #00A000">+                        *status = FTDM_SIG_STATE_DOWN;</span>
<span style="color: #00A000">+                        ftdm_channel_unlock(fchan);</span>
<span style="color: #00A000">+                        break;</span>
<span style="color: #00A000">+                }</span>
                if (ftdm_test_flag(fchan, FTDM_CHANNEL_SIG_UP)) {
                        *status = FTDM_SIG_STATE_UP;
                        ftdm_channel_unlock(fchan);
<span style="color: #800080; font-weight: bold">@@ -825,8 +839,11 @@ static void ftdm_r2_on_hardware_alarm(openr2_chan_t *r2chan, int alarm)</span>
        ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Alarm notification %d when in state %s (sigstatus = %d)\n",
                        alarm, ftdm_channel_state2str(fchan->state), ftdm_test_flag(fchan, FTDM_CHANNEL_SIG_UP) ? 1 : 0);
<span style="color: #A00000">-        if (alarm && ftdm_test_flag(fchan, FTDM_CHANNEL_SIG_UP)) {</span>
<span style="color: #A00000">-                ftdm_r2_set_chan_sig_status(fchan, FTDM_SIG_STATE_DOWN);</span>
<span style="color: #00A000">+        if (alarm) {</span>
<span style="color: #00A000">+                R2CALL(fchan)->localsuspend_on_alarm = ftdm_test_flag(fchan, FTDM_CHANNEL_SUSPENDED) ? 1 : 0;</span>
<span style="color: #00A000">+                if (ftdm_test_flag(fchan, FTDM_CHANNEL_SIG_UP) || ftdm_test_flag(fchan, FTDM_CHANNEL_SUSPENDED)) {</span>
<span style="color: #00A000">+                        ftdm_r2_set_chan_sig_status(fchan, FTDM_SIG_STATE_DOWN);</span>
<span style="color: #00A000">+                }</span>
        }
}
<span style="color: #800080; font-weight: bold">@@ -881,18 +898,31 @@ static void ftdm_r2_on_line_blocked(openr2_chan_t *r2chan)</span>
{
        ftdm_channel_t *ftdmchan = openr2_chan_get_client_data(r2chan);
        ftdm_log_chan(ftdmchan, FTDM_LOG_NOTICE, "Far end blocked in state %s\n", ftdm_channel_state2str(ftdmchan->state));
<span style="color: #A00000">-        if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_SIG_UP)) {</span>
<span style="color: #00A000">+        if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_SIG_UP)</span>
<span style="color: #00A000">+         || !ftdm_test_flag(ftdmchan, FTDM_CHANNEL_SUSPENDED)) {</span>
                ftdm_r2_set_chan_sig_status(ftdmchan, FTDM_SIG_STATE_SUSPENDED);
        }
}
static void ftdm_r2_on_line_idle(openr2_chan_t *r2chan)
{
<span style="color: #00A000">+        openr2_cas_signal_t rxcas, txcas;</span>
        ftdm_channel_t *ftdmchan = openr2_chan_get_client_data(r2chan);
<span style="color: #00A000">+        </span>
<span style="color: #00A000">+        /* get the current rx and tx cas bits */</span>
<span style="color: #00A000">+        openr2_chan_get_cas(r2chan, &rxcas, &txcas);</span>
        ftdm_log_chan(ftdmchan, FTDM_LOG_NOTICE, "Far end unblocked in state %s\n", ftdm_channel_state2str(ftdmchan->state));
<span style="color: #A00000">-        if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_SIG_UP)) {</span>
<span style="color: #00A000">+        if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_SIG_UP) </span>
<span style="color: #00A000">+         && txcas == OR2_CAS_IDLE) {</span>
<span style="color: #00A000">+                /* if txcas is not idle, it means we're still blocked as far as the user is concerned, do not send SIGEVENT UP,</span>
<span style="color: #00A000">+                 * it will be done when the user set the line to IDLE (if the remote is still also IDLE) */</span>
                ftdm_r2_set_chan_sig_status(ftdmchan, FTDM_SIG_STATE_UP);
<span style="color: #00A000">+        } else if (txcas == OR2_CAS_BLOCK && R2CALL(ftdmchan)->localsuspend_on_alarm) {</span>
<span style="color: #00A000">+                /* the user requested to block, we do not notify about state up until the user set the bits to IDLE, however</span>
<span style="color: #00A000">+                 * if we're just getting back from alarmed condition, we notify about suspended again */</span>
<span style="color: #00A000">+                ftdm_r2_set_chan_sig_status(ftdmchan, FTDM_SIG_STATE_SUSPENDED);</span>
        }
<span style="color: #00A000">+        R2CALL(ftdmchan)->localsuspend_on_alarm = 0;</span>
}
static void ftdm_r2_write_log(openr2_log_level_t level, const char *file, const char *function, int line, const char *message)
<span style="color: #800080; font-weight: bold">@@ -2018,9 +2048,6 @@ static void __inline__ block_channel(ftdm_channel_t *fchan, ftdm_stream_handle_t</span>
        if (fchan->state != FTDM_CHANNEL_STATE_DOWN) {
                stream->write_function(stream, "cannot block channel %d:%d because has a call in progress\n",
                                fchan->span_id, fchan->chan_id);
<span style="color: #A00000">-        } else if (ftdm_test_flag(fchan, FTDM_CHANNEL_SUSPENDED)) {</span>
<span style="color: #A00000">-                stream->write_function(stream, "cannot block channel %d:%d because is already blocked\n", </span>
<span style="color: #A00000">-                                fchan->span_id, fchan->chan_id);</span>
        } else {
                if (!openr2_chan_set_blocked(r2chan)) {
                        ftdm_set_flag(fchan, FTDM_CHANNEL_SUSPENDED);
<span style="color: #800080; font-weight: bold">@@ -2038,17 +2065,12 @@ static void __inline__ unblock_channel(ftdm_channel_t *fchan, ftdm_stream_handle</span>
{
        openr2_chan_t *r2chan = R2CALL(fchan)->r2chan;
        ftdm_mutex_lock(fchan->mutex);
<span style="color: #A00000">-        if (ftdm_test_flag(fchan, FTDM_CHANNEL_SUSPENDED)) {</span>
<span style="color: #A00000">-                if (!openr2_chan_set_idle(r2chan)) {</span>
<span style="color: #A00000">-                        ftdm_clear_flag(fchan, FTDM_CHANNEL_SUSPENDED);</span>
<span style="color: #A00000">-                        stream->write_function(stream, "unblocked channel %d:%d\n", </span>
<span style="color: #A00000">-                                        fchan->span_id, fchan->chan_id);</span>
<span style="color: #A00000">-                } else {</span>
<span style="color: #A00000">-                        stream->write_function(stream, "failed to unblock channel %d:%d\n", </span>
<span style="color: #A00000">-                                        fchan->span_id, fchan->chan_id);</span>
<span style="color: #A00000">-                }</span>
<span style="color: #00A000">+        if (!openr2_chan_set_idle(r2chan)) {</span>
<span style="color: #00A000">+                ftdm_clear_flag(fchan, FTDM_CHANNEL_SUSPENDED);</span>
<span style="color: #00A000">+                stream->write_function(stream, "unblocked channel %d:%d\n", </span>
<span style="color: #00A000">+                                fchan->span_id, fchan->chan_id);</span>
        } else {
<span style="color: #A00000">-                stream->write_function(stream, "cannot unblock channel %d:%d because is not blocked\n", </span>
<span style="color: #00A000">+                stream->write_function(stream, "failed to unblock channel %d:%d\n", </span>
                                fchan->span_id, fchan->chan_id);
        }
        ftdm_mutex_unlock(fchan->mutex);
<span style="color: #000080; font-weight: bold">diff --git a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c</span>
<span style="color: #000080; font-weight: bold">index c73f0c7..1f2ad84 100644</span>
<span style="color: #A00000">--- a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c</span>
<span style="color: #00A000">+++ b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c</span>
<span style="color: #800080; font-weight: bold">@@ -1257,6 +1257,7 @@ static __inline__ ftdm_status_t wanpipe_channel_process_event(ftdm_channel_t *fc</span>
        switch(tdm_api->wp_tdm_cmd.event.wp_tdm_api_event_type) {
        case WP_API_EVENT_LINK_STATUS:
                {
<span style="color: #00A000">+#if 0</span>
                        switch(tdm_api->wp_tdm_cmd.event.wp_tdm_api_event_link_status) {
                        case WP_TDMAPI_EVENT_LINK_STATUS_CONNECTED:
                                *event_id = FTDM_OOB_ALARM_CLEAR;
<span style="color: #800080; font-weight: bold">@@ -1265,6 +1266,11 @@ static __inline__ ftdm_status_t wanpipe_channel_process_event(ftdm_channel_t *fc</span>
                                *event_id = FTDM_OOB_ALARM_TRAP;
                                break;
                        };
<span style="color: #00A000">+#else</span>
<span style="color: #00A000">+                        /* The WP_API_EVENT_ALARM event should be used to clear alarms */</span>
<span style="color: #00A000">+                        ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Ignoring wanpipe link status event\n", ftdm_oob_event2str(*event_id));</span>
<span style="color: #00A000">+                        *event_id = FTDM_OOB_NOOP;</span>
<span style="color: #00A000">+#endif</span>
                }
                break;
<span style="color: #800080; font-weight: bold">@@ -1353,8 +1359,13 @@ static __inline__ ftdm_status_t wanpipe_channel_process_event(ftdm_channel_t *fc</span>
                break;
        case WP_API_EVENT_ALARM:
                {
<span style="color: #A00000">-                        ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Got wanpipe alarms %d\n", tdm_api->wp_tdm_cmd.event.wp_api_event_alarm);</span>
<span style="color: #A00000">-                        *event_id = FTDM_OOB_ALARM_TRAP;</span>
<span style="color: #00A000">+                        if (tdm_api->wp_tdm_cmd.event.wp_api_event_alarm) {</span>
<span style="color: #00A000">+                                ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Got Wanpipe alarms %d\n", tdm_api->wp_tdm_cmd.event.wp_api_event_alarm);</span>
<span style="color: #00A000">+                                *event_id = FTDM_OOB_ALARM_TRAP;</span>
<span style="color: #00A000">+                        } else {</span>
<span style="color: #00A000">+                                ftdm_log_chan_msg(fchan, FTDM_LOG_DEBUG, "Wanpipe alarms cleared\n");</span>
<span style="color: #00A000">+                                *event_id = FTDM_OOB_ALARM_CLEAR;</span>
<span style="color: #00A000">+                        }</span>
                }
                break;
        case WP_API_EVENT_POLARITY_REVERSE:
</pre></div>
<div class="highlight"><pre>committer: Moises Silva
comments:
freetdm: add deprecate warning to get last error stuff that nobody sets anyways
<span style="color: #000080; font-weight: bold">diff --git a/libs/freetdm/TODO b/libs/freetdm/TODO</span>
<span style="color: #000080; font-weight: bold">index 45b134b..6b8ef8f 100644</span>
<span style="color: #A00000">--- a/libs/freetdm/TODO</span>
<span style="color: #00A000">+++ b/libs/freetdm/TODO</span>
<span style="color: #800080; font-weight: bold">@@ -5,5 +5,9 @@</span>
then ftdm_event_t would be renamed to ftdm_oob_event_t and the enum_id renamed to type, then ftdm_span_next_event()
will only return OOB events
<span style="color: #A00000">-- query span hw status (connected/disconnected) on startup </span>
<span style="color: #00A000">+- Deprecate last_error members. </span>
<span style="color: #00A000">+ It requires a lot of discipline to set the last_error string for every failure.</span>
<span style="color: #00A000">+ It does not add much value to the user either, most of the errors are criptic and</span>
<span style="color: #00A000">+ cannot be shown to end users, we already provide extensive logging for problem</span>
<span style="color: #00A000">+ troubleshooting.</span>
<span style="color: #000080; font-weight: bold">diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h</span>
<span style="color: #000080; font-weight: bold">index 0b9c619..2666a26 100644</span>
<span style="color: #A00000">--- a/libs/freetdm/src/include/freetdm.h</span>
<span style="color: #00A000">+++ b/libs/freetdm/src/include/freetdm.h</span>
<span style="color: #800080; font-weight: bold">@@ -1064,6 +1064,9 @@ FT_DECLARE(ftdm_codec_t) ftdm_channel_get_codec(const ftdm_channel_t *ftdmchan);</span>
/*!
* \brief Get the last error string for the channel
*
<span style="color: #00A000">+ * \deprecated This API will disappear in the future and not every </span>
<span style="color: #00A000">+ * FreeTDM API set the last error value</span>
<span style="color: #00A000">+ *</span>
* \param ftdmchan The channel to get the error from
*
* \retval The error string (not thread-safe, the string is per channel, not per thread)
<span style="color: #800080; font-weight: bold">@@ -1136,6 +1139,9 @@ FT_DECLARE(ftdm_status_t) ftdm_span_find(uint32_t id, ftdm_span_t **span);</span>
/*!
* \brief Get the last error string for the given span
*
<span style="color: #00A000">+ * \deprecated This API will disappear in the future and not every </span>
<span style="color: #00A000">+ * FreeTDM API set the last error value</span>
<span style="color: #00A000">+ *</span>
* \param span The span to get the last error from
*
* \retval character string for the last error
</pre></div>
========================================================================<pre>
Summary of changes:
libs/freetdm/TODO | 6 ++-
libs/freetdm/src/ftdm_io.c | 44 ++++++++++-----
libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c | 56 ++++++++++++++------
.../src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c | 15 +++++-
libs/freetdm/src/include/freetdm.h | 6 ++
5 files changed, 92 insertions(+), 35 deletions(-)
</pre>
<p>this email was generated because of /git/your-repo.git/hooks/post-receive by the file /git-core/contrib/hooks/post-receive-email<br />
For more info, see <a href="http://blog.chomperstomp.com/?p=630">http://blog.chomperstomp.com/?p=630</a>
-- <br />
FreeSWITCH Source</p>