]> 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:03:45 +0000 (07:03 -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 f7e118765f750b1882d78832db923b124b92f6b5..f79cd846956d2c86bc9a3210a8b2dc4dfc42b118 100644 (file)
--- 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 ------------
 ------------------------------------------------------------------------------
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 b94269a32673e24194c5880922eba4882fd7fd0c..849f08735319d94cd31f5d9ae79de88cc9ea95e4 100644 (file)
@@ -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 */
index 300c0deb73b78f2ff7b3acbe75b78322cab58ebf..507267a1f7c6b545db08e20119da247b3ecfc971 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 f44ceb0c325b86adee4afd8670b3058c5bde1949..f4a9ecbe0c0e97a6849cb60887d4ba8011821f1f 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, 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");
index 76b0d08b0ef32d4de10dfe8b51e675c76558f9f7..293c3dbe84db37c7bb5a12789e8a76a6c1ea93b7 100644 (file)
@@ -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)