]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
MODENDP-60 (reject calls for no remaining forwards in core)
authorMichael Jerris <mike@jerris.com>
Mon, 24 Dec 2007 19:23:36 +0000 (19:23 +0000)
committerMichael Jerris <mike@jerris.com>
Mon, 24 Dec 2007 19:23:36 +0000 (19:23 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@6975 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/endpoints/mod_sofia/mod_sofia.c
src/switch_core_session.c

index 34b8efd54e10a58cf313b02a4adb51007422cc7d..60b362deeaa34c371d7b0084ae3a86b73cb11e27 100644 (file)
@@ -224,6 +224,8 @@ static int hangup_cause_to_sip(switch_call_cause_t cause)
                return 504;
        case SWITCH_CAUSE_ORIGINATOR_CANCEL:
                return 487;
+       case SWITCH_CAUSE_EXCHANGE_ROUTING_ERROR:
+               return 483;
        default:
                return 480;
        }
index 1af01d8032eda63be8088e1b4409235456809e1d..cef104a8d359196f37838e0357557fdd8fbe41b3 100644 (file)
@@ -186,51 +186,61 @@ SWITCH_DECLARE(switch_call_cause_t) switch_core_session_outgoing_channel(switch_
        switch_channel_t *channel = NULL;
        switch_caller_profile_t *outgoing_profile = caller_profile;
        switch_call_cause_t cause = SWITCH_CAUSE_REQUESTED_CHAN_UNAVAIL;
+       const char *forwardvar;
+       int forwardval = 70;
 
        if ((endpoint_interface = switch_loadable_module_get_endpoint_interface(endpoint_name)) == 0) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not locate channel type %s\n", endpoint_name);
                return SWITCH_CAUSE_CHAN_NOT_IMPLEMENTED;
        }
 
-       if (endpoint_interface->io_routines->outgoing_channel) {
-               if (session) {
-                       channel = switch_core_session_get_channel(session);
-                       if (caller_profile) {
-                               const char *ecaller_id_name = NULL, *ecaller_id_number = NULL;
+       if (!endpoint_interface->io_routines->outgoing_channel) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not locate outgoing channel interface for %s\n", endpoint_name);
+               return SWITCH_CAUSE_CHAN_NOT_IMPLEMENTED;
+       }
+
+       forwardvar = switch_channel_get_variable(channel, SWITCH_MAX_FORWARDS_VARIABLE);
+       if (!switch_strlen_zero(forwardvar)) {
+               forwardval =  atoi(forwardvar) - 1;
+       }
+       if (forwardval <= 0) {
+               return SWITCH_CAUSE_EXCHANGE_ROUTING_ERROR;
+       }
 
-                               ecaller_id_name = switch_channel_get_variable(channel, "effective_caller_id_name");
-                               ecaller_id_number = switch_channel_get_variable(channel, "effective_caller_id_number");
+       if (session) {
+               channel = switch_core_session_get_channel(session);
+               if (caller_profile) {
+                       const char *ecaller_id_name = NULL, *ecaller_id_number = NULL;
 
-                               if (ecaller_id_name || ecaller_id_number) {
-                                       outgoing_profile = switch_caller_profile_clone(session, caller_profile);
+                       ecaller_id_name = switch_channel_get_variable(channel, "effective_caller_id_name");
+                       ecaller_id_number = switch_channel_get_variable(channel, "effective_caller_id_number");
 
-                                       if (ecaller_id_name) {
-                                               outgoing_profile->caller_id_name = ecaller_id_name;
-                                       }
-                                       if (ecaller_id_number) {
-                                               outgoing_profile->caller_id_number = ecaller_id_number;
-                                       }
+                       if (ecaller_id_name || ecaller_id_number) {
+                               outgoing_profile = switch_caller_profile_clone(session, caller_profile);
+
+                               if (ecaller_id_name) {
+                                       outgoing_profile->caller_id_name = ecaller_id_name;
+                               }
+                               if (ecaller_id_number) {
+                                       outgoing_profile->caller_id_number = ecaller_id_number;
                                }
-                       }
-                       if (!outgoing_profile) {
-                               outgoing_profile = switch_channel_get_caller_profile(channel);
                        }
                }
-
-               if ((cause = endpoint_interface->io_routines->outgoing_channel(session, outgoing_profile, new_session, pool, flags)) != SWITCH_CAUSE_SUCCESS) {
-                       return cause;
+               if (!outgoing_profile) {
+                       outgoing_profile = switch_channel_get_caller_profile(channel);
                }
+       }
 
-               if (session) {
-                       for (ptr = session->event_hooks.outgoing_channel; ptr; ptr = ptr->next) {
-                               if ((status = ptr->outgoing_channel(session, caller_profile, *new_session, flags)) != SWITCH_STATUS_SUCCESS) {
-                                       break;
-                               }
+       if ((cause = endpoint_interface->io_routines->outgoing_channel(session, outgoing_profile, new_session, pool, flags)) != SWITCH_CAUSE_SUCCESS) {
+               return cause;
+       }
+
+       if (session) {
+               for (ptr = session->event_hooks.outgoing_channel; ptr; ptr = ptr->next) {
+                       if ((status = ptr->outgoing_channel(session, caller_profile, *new_session, flags)) != SWITCH_STATUS_SUCCESS) {
+                               break;
                        }
                }
-       } else {
-               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not locate outgoing channel interface for %s\n", endpoint_name);
-               return SWITCH_CAUSE_CHAN_NOT_IMPLEMENTED;
        }
 
        switch_assert(*new_session != NULL);
@@ -251,6 +261,8 @@ SWITCH_DECLARE(switch_call_cause_t) switch_core_session_outgoing_channel(switch_
                if (channel && peer_channel) {
                        const char *export_vars, *val;
                        switch_codec_t *read_codec = switch_core_session_get_read_codec(session);
+                       const char *max_forwards = switch_core_session_sprintf(session, "%d", forwardval);
+                       switch_channel_set_variable(peer_channel, SWITCH_MAX_FORWARDS_VARIABLE, max_forwards);
 
                        if (read_codec) {
                                char tmp[80];
@@ -288,16 +300,6 @@ SWITCH_DECLARE(switch_call_cause_t) switch_core_session_outgoing_channel(switch_
                                switch_channel_set_variable(peer_channel, SWITCH_B_SDP_VARIABLE, val);
                        }
 
-                       val = switch_channel_get_variable(channel, SWITCH_MAX_FORWARDS_VARIABLE);
-
-                       if (!switch_strlen_zero(val)) {
-                               int forwardval =  atoi(val) - 1;
-                               const char *max_forwards = switch_core_session_sprintf(session, "%d", forwardval);
-                               switch_channel_set_variable(peer_channel, SWITCH_MAX_FORWARDS_VARIABLE, max_forwards);
-                       } else {
-                               switch_channel_set_variable(peer_channel, SWITCH_MAX_FORWARDS_VARIABLE, "70");
-                       }
-
                        if (switch_channel_test_flag(channel, CF_BYPASS_MEDIA)) {
                                switch_channel_set_flag(peer_channel, CF_BYPASS_MEDIA);
                        }