]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip: Add 'suppress_q850_reason_headers' option to endpoint
authorGeorge Joseph <gjoseph@digium.com>
Fri, 6 Jul 2018 12:57:37 +0000 (06:57 -0600)
committerGeorge Joseph <gjoseph@digium.com>
Fri, 6 Jul 2018 12:57:37 +0000 (06:57 -0600)
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
configs/samples/pjsip.conf.sample
contrib/ast-db-manage/config/versions/19b00bc19b7b_add_suppress_q850_reason_headers_to_.py [new file with mode: 0644]
include/asterisk/res_pjsip.h
res/res_pjsip.c
res/res_pjsip/pjsip_configuration.c
res/res_pjsip_rfc3326.c

diff --git a/CHANGES b/CHANGES
index c726a6e26a387de37c20eb1dc132b0c561f8309c..8116882386198d693ee1efd60b2595d84a563502 100644 (file)
--- 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 ----------
 ------------------------------------------------------------------------------
index a603a3ee43c497156aedaca8c9b56224c0f068d9..f0dfdb5bdc7d1e2fe307c127a351c180a9e1a6b8 100644 (file)
                            ; 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 (file)
index 0000000..bf58ad3
--- /dev/null
@@ -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')
index e6a50d1a68e2451719f239d04c635833e9d24d57..1ebf2a60656e01db542655f7b4b8286b661e9181 100644 (file)
@@ -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 */
index 99abfb0cc23391743b3c55c15e6f16d7fda34f65..c440454b0c0ab3eec1d5b8433f167f85afb747ac 100644 (file)
                                                </para></note>
                                        </description>
                                </configOption>
+                               <configOption name="suppress_q850_reason_headers" default="no">
+                                       <synopsis>Suppress Q.850 Reason headers for this endpoint</synopsis>
+                                       <description><para>
+                                               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.</para>
+                                       </description>
+                               </configOption>
                        </configObject>
                        <configObject name="auth">
                                <synopsis>Authentication type</synopsis>
index 0107366f8002a60f4622c33716f4883174febe08..5a25cb6d287291e90b941271579c25125d05ed26 100644 (file)
@@ -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");
index b4438a004552bb048031abc75ffaa2c8588410f7..6760b4b986cd9f6456a57ba9731d83befe9b0e8b 100644 (file)
@@ -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)