]> 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 13:00:48 +0000 (07:00 -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 a99fd379b8e119c6f3618e33f20bcccc8a0d5df3..58f4204ea551ba9edce605ac035f49fbc2ebaac5 100644 (file)
--- 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 ------------
 ------------------------------------------------------------------------------
index 5ec7a632707136e3cdec4debd6ba211ab7089daa..c2e2918ae61a753f5e52d5e6bea7574b0e78216d 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 a678cd8188176d768febca641caebfe71f8fe5c0..68fda03417049b04ce1d26420a06caf836252558 100644 (file)
@@ -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 */
index 14d1252cac892110a7c65bf5e294f0cae988d764..e98d765d7fed43737d79d0977036dbca398972c3 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 c214508fe28cf73b6f82a59361116ccd57c19e84..aad4cfca54a8a35af32afc6a9962b332cc3aae65 100644 (file)
@@ -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");
index 3c7fedcc6cad0fd11e67e4e0758cbf07e26b7662..e3e67099825b7a6680b5b8a85146357e51c28bd5 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)