diff --git a/CHANGES b/CHANGES index f7e118765f..f79cd84695 100644 --- a/CHANGES +++ b/CHANGES @@ -113,6 +113,17 @@ Core: * libedit is no longer available as an embedded library and must be provided by the system. +------------------------------------------------------------------------------ +--- 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 b94269a326..849f087353 100644 --- a/include/asterisk/res_pjsip.h +++ b/include/asterisk/res_pjsip.h @@ -813,6 +813,8 @@ struct ast_sip_endpoint { unsigned int refer_blind_progress; /*! Whether to notifies dialog-info 'early' on INUSE && RINGING state */ unsigned int notify_early_inuse_ringing; + /*! 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 300c0deb73..507267a1f7 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 f44ceb0c32..f4a9ecbe0c 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, media.rtp.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, media.rtp.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 76b0d08b0e..293c3dbe84 100644 --- a/res/res_pjsip_rfc3326.c +++ b/res/res_pjsip_rfc3326.c @@ -98,8 +98,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)