]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: ftmod_r2 - updated ftdm_r2_set_channel_sig_status() to notify the user of...
authorArnaldo Pereira <arnaldo@sangoma.com>
Fri, 17 Dec 2010 17:50:11 +0000 (15:50 -0200)
committerArnaldo Pereira <arnaldo@sangoma.com>
Fri, 17 Dec 2010 17:50:11 +0000 (15:50 -0200)
                    just when specified on docs/sigstatus.txt.
also updated ftdm_r2_set_span_sig_status(), so that it uses the former to set channels
                    status, instead of doing it directly.

libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c

index 14eca429e838d59b40306d075bbf61fb8252dd32..53772505884e9002a5bfe2a87f962cc226f69be1 100644 (file)
@@ -456,19 +456,43 @@ static FIO_CHANNEL_GET_SIG_STATUS_FUNCTION(ftdm_r2_get_channel_sig_status)
 static FIO_CHANNEL_SET_SIG_STATUS_FUNCTION(ftdm_r2_set_channel_sig_status)
 {
        openr2_chan_t *r2chan = R2CALL(ftdmchan)->r2chan;
+       openr2_cas_signal_t rxcas, txcas;
+
+       /* get the current rx and tx cas bits */
+       openr2_chan_get_cas(r2chan, &rxcas, &txcas);
+
+       /* if we're already in the state the user asks us to be, we have nothing to do */
+       if (status == FTDM_SIG_STATE_SUSPENDED && txcas == OR2_CAS_BLOCK) {
+               ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Channel signaling status already in BLOCK state\n");
+               return FTDM_SUCCESS;
+       }
+       if (status == FTDM_SIG_STATE_UP && txcas == OR2_CAS_IDLE) {
+               ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Channel signaling status already in IDLE state\n");
+               return FTDM_SUCCESS;
+       }
+
+       /* set the signaling as requested and send SIGEVENT_SIGSTATUS_CHANGED, if applicable.
+        * see docs/sigstatus.txt for details */
        switch(status) {
-               case FTDM_SIG_STATE_DOWN:
                case FTDM_SIG_STATE_SUSPENDED:
                        openr2_chan_set_blocked(r2chan);
+                       if (rxcas == OR2_CAS_IDLE) {
+                               ftdm_r2_set_chan_sig_status(ftdmchan, status);
+                       }
                        break;
                case FTDM_SIG_STATE_UP:
                        openr2_chan_set_idle(r2chan);
+                       if (rxcas == OR2_CAS_IDLE) {
+                               ftdm_r2_set_chan_sig_status(ftdmchan, status);
+                       }
                        break;
+               case FTDM_SIG_STATE_DOWN:
+                       ftdm_log_chan_msg(ftdmchan, FTDM_LOG_WARNING, "The user is not allowed to set signaling status to DOWN\n");
+                       return FTDM_FAIL;
                default:
                        ftdm_log_chan(ftdmchan, FTDM_LOG_WARNING, "Cannot set signaling status to unknown value '%d'\n", status);
                        return FTDM_FAIL;
        }
-       ftdm_r2_set_chan_sig_status(ftdmchan, status);
        return FTDM_SUCCESS;
 }
 
@@ -497,20 +521,10 @@ static FIO_SPAN_SET_SIG_STATUS_FUNCTION(ftdm_r2_set_span_sig_status)
 {
        ftdm_iterator_t *chaniter = NULL;
        ftdm_iterator_t *citer = NULL;
-       uint32_t span_opr = -1;
 
-       /* we either set the channels to BLOCK or IDLE */
-       switch(status) {
-               case FTDM_SIG_STATE_DOWN:
-               case FTDM_SIG_STATE_SUSPENDED:
-                       span_opr = 0;
-                       break;
-               case FTDM_SIG_STATE_UP:
-                       span_opr = 1;
-                       break;
-               default:
-                       ftdm_log(FTDM_LOG_WARNING, "Cannot set signaling status to unknown value '%d'\n", status);
-                       return FTDM_FAIL;
+       if (status == FTDM_SIG_STATE_DOWN) {
+               ftdm_log(FTDM_LOG_WARNING, "The user is not allowed to set the span signaling status to DOWN\n");
+               return FTDM_FAIL;
        }
 
        chaniter = ftdm_span_get_chan_iterator(span, NULL);
@@ -521,15 +535,11 @@ static FIO_SPAN_SET_SIG_STATUS_FUNCTION(ftdm_r2_set_span_sig_status)
        /* iterate over all channels, setting them to the requested state */
        for (citer = chaniter; citer; citer = ftdm_iterator_next(citer)) {
                ftdm_channel_t *fchan = ftdm_iterator_current(citer);
-               openr2_chan_t *r2chan = R2CALL(fchan)->r2chan;
-               if (span_opr == 0) {
-                       openr2_chan_set_blocked(r2chan);
-                       ftdm_log_chan_msg(fchan, FTDM_LOG_NOTICE, "Channel blocked\n");
-               } else {
-                       openr2_chan_set_idle(r2chan);
-                       ftdm_log_chan_msg(fchan, FTDM_LOG_NOTICE, "Channel idle\n");
+               /* we set channel's state through ftdm_r2_set_channel_sig_status(), since it already takes
+                * care of notifying the user when appropriate */
+               if ((ftdm_r2_set_channel_sig_status(fchan, status)) != FTDM_SUCCESS) {
+                       ftdm_log_chan(fchan, FTDM_LOG_ERROR, "Failed to set signaling status to %s\n", ftdm_signaling_status2str(status));
                }
-               ftdm_r2_set_chan_sig_status(fchan, status);
        }
        ftdm_iterator_free(chaniter);
        return FTDM_SUCCESS;