]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: core - changed behavior of ftdm_channel_close(). instead of returning if...
authorArnaldo Pereira <arnaldo@sangoma.com>
Thu, 23 Dec 2010 20:15:37 +0000 (18:15 -0200)
committerArnaldo Pereira <arnaldo@sangoma.com>
Thu, 23 Dec 2010 20:15:37 +0000 (18:15 -0200)
                opened, not it prints a warning and proceeds to close it.
         ftmod_r2 - added handler for FTDM_CHANNEL_STATE_RESET state

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

index 451441ec97086754dfc0c56e625dffb1af7ffe41..9ec92e95b31ac49b4a12380db6cfbc75ae1c3528 100644 (file)
@@ -2726,14 +2726,13 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_close(ftdm_channel_t **ftdmchan)
 
        if (ftdm_test_flag(check, FTDM_CHANNEL_CONFIGURED)) {
                ftdm_mutex_lock(check->mutex);
-               if (ftdm_test_flag(check, FTDM_CHANNEL_OPEN)) {
-                       status = check->fio->close(check);
-                       if (status == FTDM_SUCCESS) {
-                               ftdm_channel_done(check);
-                               *ftdmchan = NULL;
-                       }
-               } else {
-                       ftdm_log_chan_msg(check, FTDM_LOG_WARNING, "Called ftdm_channel_close but never ftdm_channel_open??\n");
+               if (!ftdm_test_flag(check, FTDM_CHANNEL_OPEN)) {
+                       ftdm_log_chan_msg(check, FTDM_LOG_WARNING, "Channel not opened, proceeding anyway\n");
+               }
+               status = check->fio->close(check);
+               if (status == FTDM_SUCCESS) {
+                       ftdm_channel_done(check);
+                       *ftdmchan = NULL;
                }
                check->ring_count = 0;
                ftdm_mutex_unlock(check->mutex);
index 097ffcac02d7ac1109edc1f692da714a835f1da6..8792b519d070c86c539762aac6a0620050f0a6d1 100644 (file)
@@ -1234,6 +1234,18 @@ static openr2_log_level_t ftdm_r2_loglevel_from_string(const char *level)
 
 static ftdm_state_map_t r2_state_map = {
        {
+               {
+                       ZSD_INBOUND,
+                       ZSM_UNACCEPTABLE,
+                       {FTDM_ANY_STATE, FTDM_END},
+                       {FTDM_CHANNEL_STATE_RESET, FTDM_END}
+               },
+               {
+                       ZSD_INBOUND,
+                       ZSM_UNACCEPTABLE,
+                       {FTDM_CHANNEL_STATE_RESET, FTDM_END},
+                       {FTDM_CHANNEL_STATE_DOWN, FTDM_END}
+               },
                {
                        ZSD_INBOUND,
                        ZSM_UNACCEPTABLE,
@@ -1285,6 +1297,20 @@ static ftdm_state_map_t r2_state_map = {
                
                /* Outbound states */
                
+               {
+                       ZSD_OUTBOUND,
+                       ZSM_UNACCEPTABLE,
+                       {FTDM_ANY_STATE, FTDM_END},
+                       {FTDM_CHANNEL_STATE_RESET, FTDM_END}
+               },
+
+               {
+                       ZSD_OUTBOUND,
+                       ZSM_UNACCEPTABLE,
+                       {FTDM_CHANNEL_STATE_RESET, FTDM_END},
+                       {FTDM_CHANNEL_STATE_DOWN, FTDM_END}
+               },
+
                {
                        ZSD_OUTBOUND,
                        ZSM_UNACCEPTABLE,
@@ -1774,7 +1800,9 @@ static int ftdm_r2_state_advance(ftdm_channel_t *ftdmchan)
                                /* finished call for good */
                        case FTDM_CHANNEL_STATE_DOWN: 
                                {
-                                       ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "R2 Call is down\n");
+                                       if (ftdmchan->last_state != FTDM_CHANNEL_STATE_RESET) {
+                                               ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "R2 Call is down\n");
+                                       }
                                        ret = 1;
                                }
                                break;
@@ -1786,6 +1814,15 @@ static int ftdm_r2_state_advance(ftdm_channel_t *ftdmchan)
                                }
                                break;
 
+                               /* put the r2 channel back to IDLE, close ftdmchan and set it's state as DOWN */
+                       case FTDM_CHANNEL_STATE_RESET:
+                               {
+                                       ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "RESET indicated, putting the R2 channel back to IDLE\n");
+                                       openr2_chan_set_idle(r2chan);
+                                       ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
+                               }
+                               break;
+
                        default:
                                {
                                        ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Unhandled channel state change: %s\n", ftdm_channel_state2str(ftdmchan->state));