diff --git a/CHANGES b/CHANGES
index c726a6e26a..8116882386 100644
--- a/CHANGES
+++ b/CHANGES
@@ -8,6 +8,17 @@
===
==============================================================================
+------------------------------------------------------------------------------
+--- Functionality changes from Asterisk 13.22.0 to Asterisk 13.23.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 13.21.0 to Asterisk 13.22.0 ----------
------------------------------------------------------------------------------
diff --git a/configs/samples/pjsip.conf.sample b/configs/samples/pjsip.conf.sample
index a603a3ee43..f0dfdb5bdc 100644
--- a/configs/samples/pjsip.conf.sample
+++ b/configs/samples/pjsip.conf.sample
@@ -810,6 +810,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 e6a50d1a68..1ebf2a6065 100644
--- a/include/asterisk/res_pjsip.h
+++ b/include/asterisk/res_pjsip.h
@@ -795,6 +795,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 99abfb0cc2..c440454b0c 100644
--- a/res/res_pjsip.c
+++ b/res/res_pjsip.c
@@ -1057,6 +1057,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 0107366f80..5a25cb6d28 100644
--- a/res/res_pjsip/pjsip_configuration.c
+++ b/res/res_pjsip/pjsip_configuration.c
@@ -1856,6 +1856,7 @@ int ast_res_pjsip_initialize_configuration(const struct ast_module_info *ast_mod
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 b4438a0045..6760b4b986 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)