res_pjsip: Add 'suppress_q850_reason_headers' option to endpoint

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
13.23
George Joseph 7 years ago
parent 43dc9c3d5f
commit 3470409dd6

@ -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 ----------
------------------------------------------------------------------------------

@ -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]

@ -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')

@ -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 */

@ -1057,6 +1057,14 @@
</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>

@ -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");

@ -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)

Loading…
Cancel
Save