From e081e8045e852a64e7a85cc3860d39074cbff047 Mon Sep 17 00:00:00 2001 From: Marc Olivier Chouinard Date: Thu, 15 Dec 2011 12:16:41 -0500 Subject: [PATCH] FS-3321 --resolve --- src/include/switch_types.h | 6 ++++- .../mod_khomp/src/khomp_pvt_kxe1.cpp | 16 ++++++++++++ src/mod/endpoints/mod_sofia/mod_sofia.c | 26 +++++++++++-------- src/switch_channel.c | 4 +++ src/switch_ivr_originate.c | 1 + 5 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 62af4f9aaf..ea65319924 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -1691,7 +1691,11 @@ typedef enum { SWITCH_CAUSE_MEDIA_TIMEOUT = 604, SWITCH_CAUSE_PICKED_OFF = 605, SWITCH_CAUSE_USER_NOT_REGISTERED = 606, - SWITCH_CAUSE_PROGRESS_TIMEOUT = 607 + SWITCH_CAUSE_PROGRESS_TIMEOUT = 607, + SWITCH_CAUSE_INVALID_GATEWAY = 608, + SWITCH_CAUSE_GATEWAY_DOWN = 609, + SWITCH_CAUSE_INVALID_URL = 610, + SWITCH_CAUSE_INVALID_PROFILE = 611 } switch_call_cause_t; typedef enum { diff --git a/src/mod/endpoints/mod_khomp/src/khomp_pvt_kxe1.cpp b/src/mod/endpoints/mod_khomp/src/khomp_pvt_kxe1.cpp index aaacd4ecba..b5f68132e6 100644 --- a/src/mod/endpoints/mod_khomp/src/khomp_pvt_kxe1.cpp +++ b/src/mod/endpoints/mod_khomp/src/khomp_pvt_kxe1.cpp @@ -1399,6 +1399,8 @@ int BoardE1::KhompPvtR2::callFailFromCause(int cause) case SWITCH_CAUSE_NO_ROUTE_TRANSIT_NET: case SWITCH_CAUSE_NO_ROUTE_DESTINATION: case SWITCH_CAUSE_INVALID_NUMBER_FORMAT: + case SWITCH_CAUSE_INVALID_GATEWAY: + case SWITCH_CAUSE_INVALID_URL: case SWITCH_CAUSE_FACILITY_NOT_SUBSCRIBED: case SWITCH_CAUSE_INCOMPATIBLE_DESTINATION: @@ -1430,7 +1432,9 @@ int BoardE1::KhompPvtR2::callFailFromCause(int cause) case SWITCH_CAUSE_REQUESTED_CHAN_UNAVAIL: case SWITCH_CAUSE_CHANNEL_UNACCEPTABLE: case SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER: + case SWITCH_CAUSE_INVALID_PROFILE: case SWITCH_CAUSE_NETWORK_OUT_OF_ORDER: + case SWITCH_CAUSE_GATEWAY_DOWN: case SWITCH_CAUSE_FACILITY_REJECTED: case SWITCH_CAUSE_FACILITY_NOT_IMPLEMENTED: case SWITCH_CAUSE_CHAN_NOT_IMPLEMENTED: @@ -1448,6 +1452,8 @@ int BoardE1::KhompPvtR2::callFailFromCause(int cause) case SWITCH_CAUSE_NO_ROUTE_TRANSIT_NET: case SWITCH_CAUSE_NO_ROUTE_DESTINATION: case SWITCH_CAUSE_INVALID_NUMBER_FORMAT: + case SWITCH_CAUSE_INVALID_GATEWAY: + case SWITCH_CAUSE_INVALID_URL: case SWITCH_CAUSE_FACILITY_NOT_SUBSCRIBED: case SWITCH_CAUSE_INCOMPATIBLE_DESTINATION: @@ -1480,6 +1486,7 @@ int BoardE1::KhompPvtR2::callFailFromCause(int cause) case SWITCH_CAUSE_CHANNEL_UNACCEPTABLE: case SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER: case SWITCH_CAUSE_NETWORK_OUT_OF_ORDER: + case SWITCH_CAUSE_GATEWAY_DOWN: case SWITCH_CAUSE_FACILITY_REJECTED: case SWITCH_CAUSE_FACILITY_NOT_IMPLEMENTED: case SWITCH_CAUSE_CHAN_NOT_IMPLEMENTED: @@ -1497,6 +1504,8 @@ int BoardE1::KhompPvtR2::callFailFromCause(int cause) case SWITCH_CAUSE_NO_ROUTE_TRANSIT_NET: case SWITCH_CAUSE_NO_ROUTE_DESTINATION: case SWITCH_CAUSE_INVALID_NUMBER_FORMAT: + case SWITCH_CAUSE_INVALID_GATEWAY: + case SWITCH_CAUSE_INVALID_URL: case SWITCH_CAUSE_FACILITY_NOT_SUBSCRIBED: case SWITCH_CAUSE_INCOMPATIBLE_DESTINATION: @@ -1529,6 +1538,7 @@ int BoardE1::KhompPvtR2::callFailFromCause(int cause) case SWITCH_CAUSE_CHANNEL_UNACCEPTABLE: case SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER: case SWITCH_CAUSE_NETWORK_OUT_OF_ORDER: + case SWITCH_CAUSE_GATEWAY_DOWN: case SWITCH_CAUSE_FACILITY_REJECTED: case SWITCH_CAUSE_FACILITY_NOT_IMPLEMENTED: case SWITCH_CAUSE_CHAN_NOT_IMPLEMENTED: @@ -1553,6 +1563,8 @@ int BoardE1::KhompPvtR2::callFailFromCause(int cause) case SWITCH_CAUSE_NO_ROUTE_TRANSIT_NET: case SWITCH_CAUSE_NO_ROUTE_DESTINATION: case SWITCH_CAUSE_INVALID_NUMBER_FORMAT: + case SWITCH_CAUSE_INVALID_GATEWAY: + case SWITCH_CAUSE_INVALID_URL: case SWITCH_CAUSE_FACILITY_NOT_SUBSCRIBED: case SWITCH_CAUSE_INCOMPATIBLE_DESTINATION: @@ -1585,6 +1597,7 @@ int BoardE1::KhompPvtR2::callFailFromCause(int cause) case SWITCH_CAUSE_CHANNEL_UNACCEPTABLE: case SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER: case SWITCH_CAUSE_NETWORK_OUT_OF_ORDER: + case SWITCH_CAUSE_GATEWAY_DOWN: case SWITCH_CAUSE_FACILITY_REJECTED: case SWITCH_CAUSE_FACILITY_NOT_IMPLEMENTED: case SWITCH_CAUSE_CHAN_NOT_IMPLEMENTED: @@ -1622,6 +1635,8 @@ int BoardE1::KhompPvtR2::callFailFromCause(int cause) case SWITCH_CAUSE_NO_ROUTE_TRANSIT_NET: case SWITCH_CAUSE_NO_ROUTE_DESTINATION: case SWITCH_CAUSE_INVALID_NUMBER_FORMAT: + case SWITCH_CAUSE_INVALID_GATEWAY: + case SWITCH_CAUSE_INVALID_URL: case SWITCH_CAUSE_FACILITY_NOT_SUBSCRIBED: case SWITCH_CAUSE_INCOMPATIBLE_DESTINATION: @@ -1629,6 +1644,7 @@ int BoardE1::KhompPvtR2::callFailFromCause(int cause) case SWITCH_CAUSE_CHANNEL_UNACCEPTABLE: case SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER: case SWITCH_CAUSE_NETWORK_OUT_OF_ORDER: + case SWITCH_CAUSE_GATEWAY_DOWN: case SWITCH_CAUSE_FACILITY_REJECTED: case SWITCH_CAUSE_FACILITY_NOT_IMPLEMENTED: case SWITCH_CAUSE_CHAN_NOT_IMPLEMENTED: diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 7e102047f3..b747bea6dd 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -326,8 +326,11 @@ static int hangup_cause_to_sip(switch_call_cause_t cause) case SWITCH_CAUSE_REDIRECTION_TO_NEW_DESTINATION: return 410; case SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER: + case SWITCH_CAUSE_INVALID_PROFILE: return 502; case SWITCH_CAUSE_INVALID_NUMBER_FORMAT: + case SWITCH_CAUSE_INVALID_URL: + case SWITCH_CAUSE_INVALID_GATEWAY: return 484; case SWITCH_CAUSE_FACILITY_REJECTED: return 501; @@ -338,6 +341,7 @@ static int hangup_cause_to_sip(switch_call_cause_t cause) case SWITCH_CAUSE_NETWORK_OUT_OF_ORDER: case SWITCH_CAUSE_NORMAL_TEMPORARY_FAILURE: case SWITCH_CAUSE_SWITCH_CONGESTION: + case SWITCH_CAUSE_GATEWAY_DOWN: return 503; case SWITCH_CAUSE_OUTGOING_CALL_BARRED: case SWITCH_CAUSE_INCOMING_CALL_BARRED: @@ -4266,7 +4270,7 @@ static switch_call_cause_t sofia_outgoing_channel(switch_core_session_t *session *new_session = NULL; if (!outbound_profile || zstr(outbound_profile->destination_number)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Invalid Destination\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Invalid Empty Destination\n"); goto error; } @@ -4303,30 +4307,30 @@ static switch_call_cause_t sofia_outgoing_channel(switch_core_session_t *session char *gw, *params; if (!(gw = strchr(profile_name, '/'))) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Invalid URL\n"); - cause = SWITCH_CAUSE_INVALID_NUMBER_FORMAT; + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Invalid URL \'%s\'\n", gw); + cause = SWITCH_CAUSE_INVALID_URL; goto error; } *gw++ = '\0'; if (!(dest = strchr(gw, '/'))) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Invalid URL\n"); - cause = SWITCH_CAUSE_INVALID_NUMBER_FORMAT; + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Invalid URL \'%s\'\n", gw); + cause = SWITCH_CAUSE_INVALID_URL; goto error; } *dest++ = '\0'; if (!(gateway_ptr = sofia_reg_find_gateway(gw))) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Invalid Gateway\n"); - cause = SWITCH_CAUSE_INVALID_NUMBER_FORMAT; + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Invalid Gateway \'%s\'\n", gw); + cause = SWITCH_CAUSE_INVALID_GATEWAY; goto error; } if (gateway_ptr->status != SOFIA_GATEWAY_UP) { - switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Gateway is down!\n"); - cause = SWITCH_CAUSE_NETWORK_OUT_OF_ORDER; + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Gateway \'%s\' is down!\n", gw); + cause = SWITCH_CAUSE_GATEWAY_DOWN; gateway_ptr->ob_failed_calls++; goto error; } @@ -4433,14 +4437,14 @@ static switch_call_cause_t sofia_outgoing_channel(switch_core_session_t *session } else { if (!(dest = strchr(profile_name, '/'))) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Invalid URL\n"); - cause = SWITCH_CAUSE_INVALID_NUMBER_FORMAT; + cause = SWITCH_CAUSE_INVALID_URL; goto error; } *dest++ = '\0'; if (!(profile = sofia_glue_find_profile(profile_name))) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Invalid Profile\n"); - cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; + cause = SWITCH_CAUSE_INVALID_PROFILE; goto error; } diff --git a/src/switch_channel.c b/src/switch_channel.c index 3a7ce93023..a0b5b9c018 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -103,6 +103,10 @@ static struct switch_cause_table CAUSE_CHART[] = { {"PICKED_OFF", SWITCH_CAUSE_PICKED_OFF}, {"USER_NOT_REGISTERED", SWITCH_CAUSE_USER_NOT_REGISTERED}, {"PROGRESS_TIMEOUT", SWITCH_CAUSE_PROGRESS_TIMEOUT}, + {"INVALID_GATEWAY", SWITCH_CAUSE_INVALID_GATEWAY}, + {"GATEWAY_DOWN", SWITCH_CAUSE_GATEWAY_DOWN}, + {"INVALID_URL", SWITCH_CAUSE_INVALID_URL}, + {"INVALID_PROFILE", SWITCH_CAUSE_INVALID_PROFILE}, {NULL, 0} }; diff --git a/src/switch_ivr_originate.c b/src/switch_ivr_originate.c index 71cdfacde5..582ca2ea23 100644 --- a/src/switch_ivr_originate.c +++ b/src/switch_ivr_originate.c @@ -3383,6 +3383,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess switch_channel_set_variable(caller_channel, "DIALSTATUS", "NOANSWER"); break; case SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER: + case SWITCH_CAUSE_INVALID_PROFILE: switch_channel_set_variable(caller_channel, "DIALSTATUS", "INVALIDARGS"); break; case SWITCH_CAUSE_CALL_REJECTED: