]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: hangup the chan call when the core fails to create the session
authorMoises Silva <moises.silva@gmail.com>
Fri, 23 Apr 2010 20:28:01 +0000 (16:28 -0400)
committerMoises Silva <moy@sangoma.com>
Wed, 28 Apr 2010 22:17:50 +0000 (18:17 -0400)
libs/freetdm/mod_freetdm/mod_freetdm.c
libs/freetdm/src/ftdm_io.c
libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c
libs/freetdm/src/ftmod/ftmod_sangoma_boost/sangoma_boost_client.c
libs/freetdm/src/ftmod/ftmod_sangoma_boost/sangoma_boost_client.h
libs/freetdm/src/include/freetdm.h
libs/freetdm/src/include/private/ftdm_core.h

index edb409fe05e89cd7e701728d1955fbf3eb8d4676..24c0bef37ca82ddb22f81cf89f7b39cce86bae4c 100644 (file)
@@ -1324,7 +1324,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
                if (ftdm_channel_add_token(ftdmchan, switch_core_session_get_uuid(*new_session), ftdm_channel_get_token_count(ftdmchan)) != FTDM_SUCCESS) {
                        switch_core_session_destroy(new_session);
                        cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
-            goto fail;
+                       goto fail;
                }
 
 
@@ -1337,8 +1337,8 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
                                switch_core_codec_destroy(&tech_pvt->write_codec);
                        }
                        switch_core_session_destroy(new_session);
-            cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
-            goto fail;
+                       cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
+                       goto fail;
                }
 
                ftdm_channel_init(ftdmchan);
@@ -1346,10 +1346,10 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
                return SWITCH_CAUSE_SUCCESS;
        }
 
- fail:
+fail:
 
        if (ftdmchan) {
-               ftdm_channel_done(ftdmchan);
+               ftdm_channel_call_hangup_with_cause(ftdmchan, FTDM_CAUSE_SWITCH_CONGESTION);
        }
 
        return cause;
index 7d48260d5e968d5d24b3563ce60524d0b1ccdbcc..0c7b141078474b1b65f9ddfb9e408c6caeb862db 100644 (file)
@@ -1428,8 +1428,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open_by_span(uint32_t span_id, ftdm_direc
                ftdm_span_channel_use_count(span, &count);
 
                if (count >= span->chan_count) {
-                       ftdm_log(FTDM_LOG_CRIT, "All circuits are busy: active=%i max=%i.\n",
-                               count, span->chan_count);
+                       ftdm_log(FTDM_LOG_ERROR, "All circuits are busy: active=%i max=%i.\n", count, span->chan_count);
                        *ftdmchan = NULL;
                        return FTDM_FAIL;
                }
@@ -1808,16 +1807,36 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_call_answer(ftdm_channel_t *ftdmchan)
        return FTDM_SUCCESS;
 }
 
+
+static ftdm_status_t call_hangup(ftdm_channel_t *chan)
+{
+       if (chan->state != FTDM_CHANNEL_STATE_DOWN) {
+               ftdm_set_state_wait(chan, FTDM_CHANNEL_STATE_HANGUP);
+       } else {
+               /* the signaling stack did not touch the state, 
+                * core is responsible from clearing flags and stuff */
+               ftdm_channel_done(chan);
+       }
+       return FTDM_SUCCESS;
+}
+
 FT_DECLARE(ftdm_status_t) ftdm_channel_call_hangup_with_cause(ftdm_channel_t *ftdmchan, ftdm_call_cause_t cause)
 {
+       ftdm_channel_lock(ftdmchan);
+
        ftdmchan->caller_data.hangup_cause = cause;
-       ftdm_set_state_locked_wait(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
+       
+       call_hangup(ftdmchan);
+
+       ftdm_channel_unlock(ftdmchan);
        return FTDM_SUCCESS;
 }
 
 FT_DECLARE(ftdm_status_t) ftdm_channel_call_hangup(ftdm_channel_t *ftdmchan)
 {
-       ftdm_set_state_locked_wait(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
+       ftdm_channel_lock(ftdmchan);
+       call_hangup(ftdmchan);
+       ftdm_channel_unlock(ftdmchan);
        return FTDM_SUCCESS;
 }
 
index c0f0e041cf1c32d3f3da13c838c4abda243bcd7f..856541dbe3c1a8bc5d2047337ee135e0b1dba9d8 100644 (file)
@@ -69,9 +69,6 @@ static ftdm_status_t ftdm_sangoma_boost_list_sigmods(ftdm_stream_handle_t *strea
 #define BOOST_SPAN(ftdmchan) ((ftdm_sangoma_boost_data_t*)(ftdmchan)->span->signal_data)->sigmod ? ftdmchan->physical_span_id : ftdmchan->physical_span_id-1
 #define BOOST_CHAN(ftdmchan) ((ftdm_sangoma_boost_data_t*)(ftdmchan)->span->signal_data)->sigmod ? ftdmchan->physical_chan_id : ftdmchan->physical_chan_id-1
 
-#define BOOST_EVENT_SPAN(sigmod, event) ((sigmod)? event->span:event->span+1)
-#define BOOST_EVENT_CHAN(sigmod, event) ((sigmod)? event->chan:event->chan+1)
-
 /**
  * \brief SANGOMA boost notification flag
  */
@@ -957,7 +954,8 @@ static void handle_call_answer(ftdm_span_t *span, sangomabc_connection_t *mcon,
 
                        /* NC: Do nothing here because we are in process
                                of stopping the call. So ignore the ANSWER. */
-                       ftdm_log(FTDM_LOG_CRIT, "ANSWER BUT CALL IS HANGUP %d:%d\n", event->span+1,event->chan+1);
+                       ftdm_log(FTDM_LOG_DEBUG, "ANSWER BUT CALL IS HANGUP %d:%d\n", BOOST_EVENT_SPAN(mcon->sigmod, event), 
+                                       BOOST_EVENT_CHAN(mcon->sigmod, event));
 
                } else if (ftdmchan->state == FTDM_CHANNEL_STATE_HOLD) {
                        ftdmchan->init_state = FTDM_CHANNEL_STATE_UP;
@@ -968,7 +966,7 @@ static void handle_call_answer(ftdm_span_t *span, sangomabc_connection_t *mcon,
                }
                ftdm_mutex_unlock(ftdmchan->mutex);
        } else {
-               ftdm_log(FTDM_LOG_CRIT, "ANSWER CANT FIND A CHAN %d:%d\n", BOOST_EVENT_SPAN(mcon, event), BOOST_EVENT_CHAN(mcon, event));
+               ftdm_log(FTDM_LOG_CRIT, "ANSWER CANT FIND A CHAN %d:%d\n", BOOST_EVENT_SPAN(mcon->sigmod, event), BOOST_EVENT_CHAN(mcon->sigmod, event));
                sangomabc_exec_command(mcon,
                                                           event->span,
                                                           event->chan,
@@ -1234,7 +1232,7 @@ static ftdm_channel_t* event_process_states(ftdm_span_t *span, sangomabc_short_e
         case SIGBOOST_EVENT_CALL_RELEASED:
             if (!(ftdmchan = find_ftdmchan(span, (sangomabc_short_event_t*)event, 1))) {
                 ftdm_log(FTDM_LOG_DEBUG, "PROCESS STATES  CANT FIND CHAN %d:%d\n",
-                                                                                                                                                                                       BOOST_EVENT_SPAN(((ftdm_sangoma_boost_data_t*)(span->signal_data))->sigmod, event),
+                       BOOST_EVENT_SPAN(((ftdm_sangoma_boost_data_t*)(span->signal_data))->sigmod, event),
                                                                                                                                                                                        BOOST_EVENT_CHAN(((ftdm_sangoma_boost_data_t*)(span->signal_data))->sigmod, event));
                 return NULL;
             }
@@ -1733,7 +1731,7 @@ static ftdm_status_t ftdm_boost_connection_open(ftdm_span_t *span)
                                                          ++sangoma_boost_data->pcon.cfg.remote_port) < 0) {
                ftdm_log(FTDM_LOG_ERROR, "Error: Opening PCON Socket [%d] %s\n", sangoma_boost_data->pcon.socket, strerror(errno));
                return FTDM_FAIL;
-    }
+       }
 
        /* try to create the boost sockets interrupt objects */
        if (ftdm_interrupt_create(&sangoma_boost_data->pcon.sock_interrupt, sangoma_boost_data->pcon.socket) != FTDM_SUCCESS) {
@@ -1924,7 +1922,7 @@ static void ftdm_cli_span_state_cmd(ftdm_span_t *span, char *state)
        int cnt=0;
        ftdm_channel_state_t state_e = ftdm_str2ftdm_channel_state(state);
        if (state_e == FTDM_CHANNEL_STATE_INVALID) {
-               ftdm_log(FTDM_LOG_CRIT, "Checking for channels not in the INVALID state is probably not waht you want\n");
+               ftdm_log(FTDM_LOG_CRIT, "Checking for channels not in the INVALID state is probably not what you want\n");
        }
        for(j = 1; j <= span->chan_count; j++) {
                if (span->channels[j]->state != state_e) {
@@ -2187,7 +2185,7 @@ static ftdm_state_map_t boost_state_map = {
                        ZSM_UNACCEPTABLE,
                        {FTDM_CHANNEL_STATE_HOLD, FTDM_END},
                        {FTDM_CHANNEL_STATE_PROGRESS_MEDIA, FTDM_CHANNEL_STATE_PROGRESS, 
-                        FTDM_CHANNEL_STATE_IDLE, FTDM_CHANNEL_STATE_TERMINATING, FTDM_CHANNEL_STATE_UP, FTDM_END}
+                        FTDM_CHANNEL_STATE_IDLE, FTDM_CHANNEL_STATE_TERMINATING, FTDM_CHANNEL_STATE_UP, FTDM_CHANNEL_STATE_HANGUP, FTDM_END}
                },
                {
                        ZSD_OUTBOUND,
index b2a38b198dfbbf9aeb308ec4c935f755a3b4c336..4ba009907e84eb57121636553caaa68ded3c2577 100644 (file)
@@ -82,8 +82,8 @@ static void sangomabc_print_event_call(sangomabc_connection_t *mcon, sangomabc_e
                        priority ? "P":"N",
                        sangomabc_event_id_name(event->event_id),
                        event->event_id,
-                       event->span,
-                       event->chan,
+                       BOOST_EVENT_SPAN(mcon->sigmod, event),
+                       BOOST_EVENT_CHAN(mcon->sigmod, event),
                        event->call_setup_id,
                        event->fseqno,
                        strlen(event->calling_name)?event->calling_name:"N/A",
@@ -101,8 +101,8 @@ static void sangomabc_print_event_short(sangomabc_connection_t *mcon, sangomabc_
                           priority ? "P":"N",
                            sangomabc_event_id_name(event->event_id), 
                            event->event_id, 
-                           event->span, 
-                           event->chan, 
+                          BOOST_EVENT_SPAN(mcon->sigmod, event),
+                          BOOST_EVENT_CHAN(mcon->sigmod, event),
                            event->release_cause, 
                            event->call_setup_id, 
                            event->fseqno);
@@ -247,7 +247,7 @@ int sangomabc_exec_command(sangomabc_connection_t *mcon, int span, int chan, int
             return -1;
         } else {
             ftdm_log(FTDM_LOG_WARNING, "Failed to tx on boost socket: %s :retry %i\n", strerror(errno), retry);
-                       ftdm_sleep(1);
+           ftdm_sleep(1);
         }
     }
 
index 12c3f12b8c5f907d5ac8cc8a4157d49d72fe994e..4f5f21c6e6c8cd267688f77709771b1b666aaf5b 100644 (file)
@@ -144,6 +144,10 @@ const char *sangomabc_event_id_name(uint32_t event_id);
 int sangomabc_exec_command(sangomabc_connection_t *mcon, int span, int chan, int id, int cmd, int cause, int flags);
 int sangomabc_exec_commandp(sangomabc_connection_t *pcon, int span, int chan, int id, int cmd, int cause);
 
+#define BOOST_EVENT_SPAN(sigmod, event) ((sigmod)? event->span:event->span+1)
+#define BOOST_EVENT_CHAN(sigmod, event) ((sigmod)? event->chan:event->chan+1)
+
+
 #endif
 
 
index b0c2f1f65d1ff2c25b5ca2ec45b98def7b3c4e06..5d233d3c93edac6491b3764d2e6cdd92184cbd7f 100644 (file)
@@ -634,7 +634,6 @@ FT_DECLARE(ftdm_status_t) ftdm_conf_node_create(const char *name, ftdm_conf_node
 FT_DECLARE(ftdm_status_t) ftdm_conf_node_add_param(ftdm_conf_node_t *node, const char *param, const char *val);
 FT_DECLARE(ftdm_status_t) ftdm_conf_node_destroy(ftdm_conf_node_t *node);
 FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const char *str, ftdm_channel_config_t *chan_config, unsigned *configured);
-FT_DECLARE(ftdm_status_t) ftdm_channel_done(ftdm_channel_t *ftdmchan);
 
 FT_DECLARE(ftdm_channel_t *) ftdm_span_get_channel(const ftdm_span_t *span, uint32_t chanid);
 FT_DECLARE(uint32_t) ftdm_span_get_chan_count(const ftdm_span_t *span);
index 3ab807620ccd02615b24b5a7d86d65a01d2b8e26..ebaddec43edd9c7cdcac683ec32cf93313dba83b 100644 (file)
@@ -559,6 +559,7 @@ FT_DECLARE(char *) ftdm_build_dso_path(const char *name, char *path, ftdm_size_t
 FT_DECLARE(int) ftdm_load_module(const char *name);
 FT_DECLARE(int) ftdm_load_module_assume(const char *name);
 FT_DECLARE(int) ftdm_vasprintf(char **ret, const char *fmt, va_list ap);
+FT_DECLARE(ftdm_status_t) ftdm_channel_done(ftdm_channel_t *ftdmchan);
 
 FIO_CODEC_FUNCTION(fio_slin2ulaw);
 FIO_CODEC_FUNCTION(fio_ulaw2slin);