diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 1be4403a74..a9f0b43c33 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -680,8 +680,11 @@ typedef enum { SWITCH_CAUSE_USER_BUSY = 17, SWITCH_CAUSE_NO_USER_RESPONSE = 18, SWITCH_CAUSE_NO_ANSWER = 19, + SWITCH_CAUSE_SUBSCRIBER_ABSENT = 20, SWITCH_CAUSE_CALL_REJECTED = 21, SWITCH_CAUSE_NUMBER_CHANGED = 22, + SWITCH_CAUSE_REDIRECTION_TO_NEW_DESTINATION = 23, + SWITCH_CAUSE_EXCHANGE_ROUTING_ERROR = 25, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER = 27, SWITCH_CAUSE_INVALID_NUMBER_FORMAT = 28, SWITCH_CAUSE_FACILITY_REJECTED = 29, @@ -699,9 +702,11 @@ typedef enum { SWITCH_CAUSE_INCOMING_CALL_BARRED = 54, SWITCH_CAUSE_BEARERCAPABILITY_NOTAUTH = 57, SWITCH_CAUSE_BEARERCAPABILITY_NOTAVAIL = 58, + SWITCH_CAUSE_SERVICE_UNAVAILABLE = 63, SWITCH_CAUSE_BEARERCAPABILITY_NOTIMPL = 65, SWITCH_CAUSE_CHAN_NOT_IMPLEMENTED = 66, SWITCH_CAUSE_FACILITY_NOT_IMPLEMENTED = 69, + SWITCH_CAUSE_SERVICE_NOT_IMPLEMENTED = 79, SWITCH_CAUSE_INVALID_CALL_REFERENCE = 81, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION = 88, SWITCH_CAUSE_INVALID_MSG_UNSPECIFIED = 95, diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 645c573ac1..93d4f7a8ce 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -1075,7 +1075,7 @@ static switch_status_t sofia_on_execute(switch_core_session_t *session) return SWITCH_STATUS_SUCCESS; } -// map QSIG cause codes to SIP ala RFC4497 +// map QSIG cause codes to SIP from RFC4497 section 8.4.1 static int hangup_cause_to_sip(switch_call_cause_t cause) { switch (cause) { case SWITCH_CAUSE_UNALLOCATED: @@ -1088,9 +1088,12 @@ static int hangup_cause_to_sip(switch_call_cause_t cause) { return 408; case SWITCH_CAUSE_NO_ANSWER: return 480; + case SWITCH_CAUSE_SUBSCRIBER_ABSENT: + return 480; case SWITCH_CAUSE_CALL_REJECTED: return 603; case SWITCH_CAUSE_NUMBER_CHANGED: + case SWITCH_CAUSE_REDIRECTION_TO_NEW_DESTINATION: return 410; case SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER: return 502; @@ -1114,6 +1117,7 @@ static int hangup_cause_to_sip(switch_call_cause_t cause) { case SWITCH_CAUSE_BEARERCAPABILITY_NOTIMPL: return 488; case SWITCH_CAUSE_FACILITY_NOT_IMPLEMENTED: + case SWITCH_CAUSE_SERVICE_NOT_IMPLEMENTED: return 501; case SWITCH_CAUSE_INCOMPATIBLE_DESTINATION: return 503; @@ -2026,7 +2030,7 @@ static uint8_t negotiate_sdp(switch_core_session_t *session, sdp_session_t *sdp) return match; } -// map sip responses to QSIG cause codes ala RFC4497 +// map sip responses to QSIG cause codes ala RFC4497 section 8.4.4 static switch_call_cause_t sip_cause_to_freeswitch(int status) { switch (status) { case 200: @@ -2072,6 +2076,15 @@ static switch_call_cause_t sip_cause_to_freeswitch(int status) { return SWITCH_CAUSE_BEARERCAPABILITY_NOTIMPL; case 502: return SWITCH_CAUSE_NETWORK_OUT_OF_ORDER; + case 405: + return SWITCH_CAUSE_SERVICE_UNAVAILABLE; + case 406: + case 415: + case 501: + return SWITCH_CAUSE_SERVICE_NOT_IMPLEMENTED; + case 482: + case 483: + return SWITCH_CAUSE_EXCHANGE_ROUTING_ERROR; default: return SWITCH_CAUSE_NORMAL_UNSPECIFIED; } diff --git a/src/switch_channel.c b/src/switch_channel.c index 71d07fa7e0..ed9b4fb0e3 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -48,8 +48,11 @@ static struct switch_cause_table CAUSE_CHART[] = { { "USER_BUSY", SWITCH_CAUSE_USER_BUSY }, { "NO_USER_RESPONSE", SWITCH_CAUSE_NO_USER_RESPONSE }, { "NO_ANSWER", SWITCH_CAUSE_NO_ANSWER }, + { "SUBSCRIBER_ABSENT", SWITCH_CAUSE_SUBSCRIBER_ABSENT }, { "CALL_REJECTED", SWITCH_CAUSE_CALL_REJECTED }, { "NUMBER_CHANGED", SWITCH_CAUSE_NUMBER_CHANGED }, + { "REDIRECTION_TO_NEW_DESTINATION", SWITCH_CAUSE_REDIRECTION_TO_NEW_DESTINATION }, + { "EXCHANGE_ROUTING_ERROR", SWITCH_CAUSE_EXCHANGE_ROUTING_ERROR }, { "DESTINATION_OUT_OF_ORDER", SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER }, { "INVALID_NUMBER_FORMAT", SWITCH_CAUSE_INVALID_NUMBER_FORMAT }, { "FACILITY_REJECTED", SWITCH_CAUSE_FACILITY_REJECTED }, @@ -67,9 +70,10 @@ static struct switch_cause_table CAUSE_CHART[] = { { "INCOMING_CALL_BARRED", SWITCH_CAUSE_INCOMING_CALL_BARRED }, { "BEARERCAPABILITY_NOTAUTH", SWITCH_CAUSE_BEARERCAPABILITY_NOTAUTH }, { "BEARERCAPABILITY_NOTAVAIL", SWITCH_CAUSE_BEARERCAPABILITY_NOTAVAIL }, - { "BEARERCAPABILITY_NOTIMPL", SWITCH_CAUSE_BEARERCAPABILITY_NOTIMPL }, + { "SERVICE_UNAVAILABLE", SWITCH_CAUSE_SERVICE_UNAVAILABLE }, { "CHAN_NOT_IMPLEMENTED", SWITCH_CAUSE_CHAN_NOT_IMPLEMENTED }, { "FACILITY_NOT_IMPLEMENTED", SWITCH_CAUSE_FACILITY_NOT_IMPLEMENTED }, + { "SERVICE_NOT_IMPLEMENTED", SWITCH_CAUSE_SERVICE_NOT_IMPLEMENTED }, { "INVALID_CALL_REFERENCE", SWITCH_CAUSE_INVALID_CALL_REFERENCE }, { "INCOMPATIBLE_DESTINATION", SWITCH_CAUSE_INCOMPATIBLE_DESTINATION }, { "INVALID_MSG_UNSPECIFIED", SWITCH_CAUSE_INVALID_MSG_UNSPECIFIED },