From 4a23f39e3abc6f70b7345572c0a438a5ff10aa63 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Fri, 6 Jul 2018 06:57:37 -0600 Subject: [PATCH] res_pjsip: Add 'suppress_q850_reason_headers' option to endpoint A new option 'suppress_q850_reason_headers' has been added to the endpoint object. Some devices can't accept multiple Reason headers and get confused when both 'SIP' and 'Q.850' Reason headers are received. This option allows the 'Q.850' Reason header to be suppressed. The default value is 'no'. ASTERISK-27949 Reported-by: Ross Beer Change-Id: I54cf37a827d77de2079256bb3de7e90fa5e1deb1 --- CHANGES | 11 ++++++++ configs/samples/pjsip.conf.sample | 7 +++++ ...7b_add_suppress_q850_reason_headers_to_.py | 27 +++++++++++++++++++ include/asterisk/res_pjsip.h | 2 ++ res/res_pjsip.c | 8 ++++++ res/res_pjsip/pjsip_configuration.c | 1 + res/res_pjsip_rfc3326.c | 11 ++++++-- 7 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 contrib/ast-db-manage/config/versions/19b00bc19b7b_add_suppress_q850_reason_headers_to_.py diff --git a/CHANGES b/CHANGES index a99fd379b8..58f4204ea5 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,17 @@ === ============================================================================== +------------------------------------------------------------------------------ +--- Functionality changes from Asterisk 15.5.0 to Asterisk 15.6.0 ------------ +------------------------------------------------------------------------------ + +res_pjsip +------------------ + * A new option 'suppress_q850_reason_headers' has been added to the endpoint + object. Some devices can't accept multiple Reason headers and get confused + when both 'SIP' and 'Q.850' Reason headers are received. This option allows + the 'Q.850' Reason header to be suppressed. The default value is 'no'. + ------------------------------------------------------------------------------ --- Functionality changes from Asterisk 15.4.0 to Asterisk 15.5.0 ------------ ------------------------------------------------------------------------------ diff --git a/configs/samples/pjsip.conf.sample b/configs/samples/pjsip.conf.sample index 5ec7a63270..c2e2918ae6 100644 --- a/configs/samples/pjsip.conf.sample +++ b/configs/samples/pjsip.conf.sample @@ -830,6 +830,13 @@ ; This option must also be enabled in the system ; section. ; (default: no) +suppress_q850_reason_headers = + ; Suppress Q.850 Reason headers for this endpoint. + ; Some devices can't accept multiple Reason headers + ; and get confused when both 'SIP' and 'Q.850' Reason + ; headers are received. This option allows the + ; 'Q.850' Reason header to be suppressed. + ; (default: no) ;==========================AUTH SECTION OPTIONS========================= ;[auth] diff --git a/contrib/ast-db-manage/config/versions/19b00bc19b7b_add_suppress_q850_reason_headers_to_.py b/contrib/ast-db-manage/config/versions/19b00bc19b7b_add_suppress_q850_reason_headers_to_.py new file mode 100644 index 0000000000..bf58ad3d6b --- /dev/null +++ b/contrib/ast-db-manage/config/versions/19b00bc19b7b_add_suppress_q850_reason_headers_to_.py @@ -0,0 +1,27 @@ +"""add suppress_q850_reason_headers to endpoint + +Revision ID: 19b00bc19b7b +Revises: 0be05c3a8225 +Create Date: 2018-07-06 06:30:32.196669 + +""" + +# revision identifiers, used by Alembic. +revision = '19b00bc19b7b' +down_revision = '0be05c3a8225' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects.postgresql import ENUM + +YESNO_NAME = 'yesno_values' +YESNO_VALUES = ['yes', 'no'] + +def upgrade(): + yesno_values = ENUM(*YESNO_VALUES, name=YESNO_NAME, create_type=False) + op.add_column('ps_endpoints', sa.Column('suppress_q850_reason_header', yesno_values)) + +def downgrade(): + if op.get_context().bind.dialect.name == 'mssql': + op.drop_constraint('ck_ps_endpoints_suppress_q850_reason_header_yesno_values','ps_endpoints') + op.drop_column('ps_endpoints', 'suppress_q850_reason_header') diff --git a/include/asterisk/res_pjsip.h b/include/asterisk/res_pjsip.h index a678cd8188..68fda03417 100644 --- a/include/asterisk/res_pjsip.h +++ b/include/asterisk/res_pjsip.h @@ -809,6 +809,8 @@ struct ast_sip_endpoint { unsigned int follow_early_media_fork; /*! Accept updated SDPs on non-100rel 18X and 2XX responses with the same To tag */ unsigned int accept_multiple_sdp_answers; + /*! Suppress Q.850 Reason headers on this endpoint */ + unsigned int suppress_q850_reason_headers; }; /*! URI parameter for symmetric transport */ diff --git a/res/res_pjsip.c b/res/res_pjsip.c index 14d1252cac..e98d765d7f 100644 --- a/res/res_pjsip.c +++ b/res/res_pjsip.c @@ -1110,6 +1110,14 @@ + + Suppress Q.850 Reason headers for this endpoint + + Some devices can't accept multiple Reason headers and get confused + when both 'SIP' and 'Q.850' Reason headers are received. This + option allows the 'Q.850' Reason header to be suppressed. + + Authentication type diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c index c214508fe2..aad4cfca54 100644 --- a/res/res_pjsip/pjsip_configuration.c +++ b/res/res_pjsip/pjsip_configuration.c @@ -1904,6 +1904,7 @@ int ast_res_pjsip_initialize_configuration(void) ast_sorcery_object_field_register(sip_sorcery, "endpoint", "incoming_mwi_mailbox", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, incoming_mwi_mailbox)); ast_sorcery_object_field_register(sip_sorcery, "endpoint", "follow_early_media_fork", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, follow_early_media_fork)); ast_sorcery_object_field_register(sip_sorcery, "endpoint", "accept_multiple_sdp_answers", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, accept_multiple_sdp_answers)); + ast_sorcery_object_field_register(sip_sorcery, "endpoint", "suppress_q850_reason_headers", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, suppress_q850_reason_headers)); if (ast_sip_initialize_sorcery_transport()) { ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n"); diff --git a/res/res_pjsip_rfc3326.c b/res/res_pjsip_rfc3326.c index 3c7fedcc6c..e3e6709982 100644 --- a/res/res_pjsip_rfc3326.c +++ b/res/res_pjsip_rfc3326.c @@ -99,8 +99,15 @@ static void rfc3326_add_reason_header(struct ast_sip_session *session, struct pj ast_sip_add_header(tdata, "Reason", "SIP;cause=200;text=\"Call completed elsewhere\""); } - snprintf(buf, sizeof(buf), "Q.850;cause=%i", ast_channel_hangupcause(session->channel) & 0x7f); - ast_sip_add_header(tdata, "Reason", buf); + if (session->endpoint && session->endpoint->suppress_q850_reason_headers) { + ast_debug(1, "A Q.850 '%s'(%i) Reason header was suppresed for endpoint '%s'\n", + ast_cause2str((ast_channel_hangupcause(session->channel) & 0x7f)), + (ast_channel_hangupcause(session->channel) & 0x7f), + ast_sorcery_object_get_id(session->endpoint)); + } else { + snprintf(buf, sizeof(buf), "Q.850;cause=%i", ast_channel_hangupcause(session->channel) & 0x7f); + ast_sip_add_header(tdata, "Reason", buf); + } } static void rfc3326_outgoing_request(struct ast_sip_session *session, struct pjsip_tx_data *tdata) -- 2.47.2