]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: made ftmod_r2 use FTDM_SPAN_USE_SIGNALS_QUEUE and properly send FTDM_SIGEVEN...
authorArnaldo Pereira <arnaldo@sangoma.com>
Tue, 23 Nov 2010 16:55:59 +0000 (14:55 -0200)
committerArnaldo Pereira <arnaldo@sangoma.com>
Tue, 23 Nov 2010 17:15:03 +0000 (15:15 -0200)
libs/freetdm/mod_freetdm/mod_freetdm.c
libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c

index a410e4eac6daf0725cc55bda477b0455ff112584..73f5660a7a99dfaff8925abf1eb269e2e18da1fd 100755 (executable)
@@ -2028,6 +2028,14 @@ static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
                }
                break;
 
+               case FTDM_SIGEVENT_SIGSTATUS_CHANGED:
+               {
+                       ftdm_signaling_status_t sigstatus = sigmsg->raw_data ? *((ftdm_signaling_status_t*)(sigmsg->raw_data)) : sigmsg->sigstatus;
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%d:%d signalling changed to: %s\n",
+                                       spanid, chanid, ftdm_signaling_status2str(sigstatus));
+               }
+               break;
+
                default:
                {
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Unhandled event %d from R2 for channel %d:%d\n",
index d5344814f0cc36eefc5d4c2828eff6a9996ee384..30de78857a1d27ad9787b1a76a90476b0e1dd284 100644 (file)
@@ -220,6 +220,23 @@ static char *strsep(char **stringp, const char *delim)
 }
 #endif /* WIN32 */
 
+static void ftdm_r2_set_chan_sig_status(ftdm_channel_t *ftdmchan, ftdm_signaling_status_t status)
+{
+       ftdm_sigmsg_t sig;
+       ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Signalling link status changed to %s\n", ftdm_signaling_status2str(status));
+
+       memset(&sig, 0, sizeof(sig));
+       sig.chan_id = ftdmchan->chan_id;
+       sig.span_id = ftdmchan->span_id;
+       sig.channel = ftdmchan;
+       sig.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
+       sig.sigstatus = status;
+       if (ftdm_span_send_signal(ftdmchan->span, &sig) != FTDM_SUCCESS) {
+               ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Failed to change channel status to %s\n", ftdm_signaling_status2str(status));
+       }
+       return;
+}
+
 static ftdm_call_cause_t ftdm_r2_cause_to_ftdm_cause(ftdm_channel_t *fchan, openr2_call_disconnect_cause_t cause)
 {
        switch (cause) {
@@ -593,17 +610,14 @@ static void ftdm_r2_on_line_blocked(openr2_chan_t *r2chan)
 {
        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));
-       ftdm_set_flag(ftdmchan, FTDM_CHANNEL_SUSPENDED);
+       ftdm_r2_set_chan_sig_status(ftdmchan, FTDM_SIG_STATE_SUSPENDED);
 }
 
 static void ftdm_r2_on_line_idle(openr2_chan_t *r2chan)
 {
        ftdm_channel_t *ftdmchan = openr2_chan_get_client_data(r2chan);
        ftdm_log_chan(ftdmchan, FTDM_LOG_NOTICE, "Far end unblocked in state %s\n", ftdm_channel_state2str(ftdmchan->state));
-       ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_SUSPENDED);
-
-        /* XXX when should we set/unset this flag? XXX */
-       ftdm_set_flag(ftdmchan, FTDM_CHANNEL_SIG_UP);
+       ftdm_r2_set_chan_sig_status(ftdmchan, FTDM_SIG_STATE_UP);
 }
 
 static void ftdm_r2_write_log(openr2_log_level_t level, const char *file, const char *function, int line, const char *message)
@@ -1130,6 +1144,9 @@ static FIO_SIG_CONFIGURE_FUNCTION(ftdm_r2_configure_span)
        span->signal_data = r2data;
        span->outgoing_call = r2_outgoing_call;
 
+       /* use signals queue */
+       ftdm_set_flag(span, FTDM_SPAN_USE_SIGNALS_QUEUE);
+
        return FTDM_SUCCESS;
 
 fail:
@@ -1439,6 +1456,7 @@ static void *ftdm_r2_run(ftdm_thread_t *me, void *obj)
                } else if (status != FTDM_TIMEOUT) {
                        ftdm_log(FTDM_LOG_ERROR, "ftdm_span_poll_event returned %d.\n", status);
                }
+               ftdm_span_trigger_signals(span);
                ftdm_sleep(20);
        }