summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2015-03-24 19:26:11 +0000
committerRichard Mudgett <rmudgett@digium.com>2015-03-24 19:26:11 +0000
commitb1e9552b087c68d412d6233034a1ad6e4eda02bd (patch)
treeab61915028cc122d160f4b6e6161104c0b8017d7
parenta3fe43fbdc89aa51e266360dc93ed4a4445bebdb (diff)
chan_pjsip: Add "rpid_immediate" option to prevent unnecessary "180 Ringing" messages.
Incoming PJSIP call legs that have not been answered yet send unnecessary "180 Ringing" or "183 Progress" messages every time a connected line update happens. If the outgoing channel is also PJSIP then the incoming channel will always send a "180 Ringing" or "183 Progress" message when the outgoing channel sends the INVITE. Consequences of these unnecessary messages: * The caller can start hearing ringback before the far end even gets the call. * Many phones tend to grab the first connected line information and refuse to update the display if it changes. The first information is not likely to be correct if the call goes to an endpoint not under the control of the first Asterisk box. When connected line first went into Asterisk in v1.8, chan_sip received an undocumented option "rpid_immediate" that defaults to disabled. When enabled, the option immediately passes connected line update information to the caller in "180 Ringing" or "183 Progress" messages as described above. * Added "rpid_immediate" option to prevent unnecessary "180 Ringing" or "183 Progress" messages. The default is "no" to disable sending the unnecessary messages. ASTERISK-24781 #close Reported by: Richard Mudgett Review: https://reviewboard.asterisk.org/r/4473/ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/13@433338 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--CHANGES12
-rw-r--r--channels/chan_pjsip.c3
-rw-r--r--configs/samples/pjsip.conf.sample1
-rwxr-xr-xcontrib/ast-db-manage/config/versions/23530d604b96_add_rpid_immediate.py48
-rw-r--r--include/asterisk/res_pjsip.h2
-rw-r--r--res/res_pjsip.c23
-rw-r--r--res/res_pjsip/pjsip_configuration.c1
7 files changed, 88 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index 6d2e9c730..6158f544c 100644
--- a/CHANGES
+++ b/CHANGES
@@ -9,6 +9,18 @@
==============================================================================
------------------------------------------------------------------------------
+--- Functionality changes from Asterisk 13.3.0 to Asterisk 13.4.0 ------------
+------------------------------------------------------------------------------
+
+chan_pjsip
+------------------
+ * New 'rpid_immediate' option to control if connected line update information
+ goes to the caller immediately or waits for another reason to send the
+ connected line information update. See the online option documentation for
+ more information. Defaults to 'no' as setting it to 'yes' can result in
+ many unnecessary messages being sent to the caller.
+
+------------------------------------------------------------------------------
--- Functionality changes from Asterisk 13.2.0 to Asterisk 13.3.0 ------------
------------------------------------------------------------------------------
diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index 675a9f9c4..c4cdca83a 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -1117,7 +1117,8 @@ static int update_connected_line_information(void *data)
ast_sip_session_refresh(session, NULL, NULL, NULL, method, generate_new_sdp);
}
- } else if (session->inv_session->state != PJSIP_INV_STATE_DISCONNECTED
+ } else if (session->endpoint->rpid_immediate
+ && session->inv_session->state != PJSIP_INV_STATE_DISCONNECTED
&& is_colp_update_allowed(session)) {
int response_code = 0;
diff --git a/configs/samples/pjsip.conf.sample b/configs/samples/pjsip.conf.sample
index af417cd1b..3def59331 100644
--- a/configs/samples/pjsip.conf.sample
+++ b/configs/samples/pjsip.conf.sample
@@ -628,6 +628,7 @@
; information to the called user agent (default: "yes")
;send_pai=no ; Send the P Asserted Identity header (default: "no")
;send_rpid=no ; Send the Remote Party ID header (default: "no")
+;rpid_immediate=no ; Send connected line updates on unanswered incoming calls immediately. (default: "no")
;timers_min_se=90 ; Minimum session timers expiration period (default:
; "90")
;timers=yes ; Session timers for SIP packets (default: "yes")
diff --git a/contrib/ast-db-manage/config/versions/23530d604b96_add_rpid_immediate.py b/contrib/ast-db-manage/config/versions/23530d604b96_add_rpid_immediate.py
new file mode 100755
index 000000000..dc0c01c24
--- /dev/null
+++ b/contrib/ast-db-manage/config/versions/23530d604b96_add_rpid_immediate.py
@@ -0,0 +1,48 @@
+#
+# Asterisk -- An open source telephony toolkit.
+#
+# Copyright (C) 2015, Richard Mudgett
+#
+# Richard Mudgett <rmudgett@digium.com>
+#
+# See http://www.asterisk.org for more information about
+# the Asterisk project. Please do not directly contact
+# any of the maintainers of this project for assistance;
+# the project provides a web site, mailing lists and IRC
+# channels for your use.
+#
+# This program is free software, distributed under the terms of
+# the GNU General Public License Version 2. See the LICENSE file
+# at the top of the source tree.
+#
+
+"""add rpid_immediate
+
+Revision ID: 23530d604b96
+Revises: 45e3f47c6c44
+Create Date: 2015-03-18 17:41:58.055412
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '23530d604b96'
+down_revision = '45e3f47c6c44'
+
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects.postgresql import ENUM
+
+YESNO_NAME = 'yesno_values'
+YESNO_VALUES = ['yes', 'no']
+
+def upgrade():
+ ############################# Enums ##############################
+
+ # yesno_values have already been created, so use postgres enum object
+ # type to get around "already created" issue - works okay with mysql
+ yesno_values = ENUM(*YESNO_VALUES, name=YESNO_NAME, create_type=False)
+
+ op.add_column('ps_endpoints', sa.Column('rpid_immediate', yesno_values))
+
+def downgrade():
+ op.drop_column('ps_endpoints', 'rpid_immediate')
diff --git a/include/asterisk/res_pjsip.h b/include/asterisk/res_pjsip.h
index 70e9c3064..523b1b4ce 100644
--- a/include/asterisk/res_pjsip.h
+++ b/include/asterisk/res_pjsip.h
@@ -613,6 +613,8 @@ struct ast_sip_endpoint {
struct ast_variable *channel_vars;
/*! Whether to place a 'user=phone' parameter into the request URI if user is a number */
unsigned int usereqphone;
+ /*! Do we send messages for connected line updates for unanswered incoming calls immediately to this endpoint? */
+ unsigned int rpid_immediate;
};
/*!
diff --git a/res/res_pjsip.c b/res/res_pjsip.c
index 1d57a072b..316a9472e 100644
--- a/res/res_pjsip.c
+++ b/res/res_pjsip.c
@@ -199,7 +199,7 @@
<para>This setting allows to choose the DTMF mode for endpoint communication.</para>
<enumlist>
<enum name="rfc4733">
- <para>DTMF is sent out of band of the main audio stream.This
+ <para>DTMF is sent out of band of the main audio stream. This
supercedes the older <emphasis>RFC-2833</emphasis> used within
the older <literal>chan_sip</literal>.</para>
</enum>
@@ -316,6 +316,27 @@
<configOption name="send_rpid" default="no">
<synopsis>Send the Remote-Party-ID header</synopsis>
</configOption>
+ <configOption name="rpid_immediate" default="no">
+ <synopsis>Immediately send connected line updates on unanswered incoming calls.</synopsis>
+ <description>
+ <para>When enabled, immediately send <emphasis>180 Ringing</emphasis>
+ or <emphasis>183 Progress</emphasis> response messages to the
+ caller if the connected line information is updated before
+ the call is answered. This can send a <emphasis>180 Ringing</emphasis>
+ response before the call has even reached the far end. The
+ caller can start hearing ringback before the far end even gets
+ the call. Many phones tend to grab the first connected line
+ information and refuse to update the display if it changes. The
+ first information is not likely to be correct if the call
+ goes to an endpoint not under the control of this Asterisk
+ box.</para>
+ <para>When disabled, a connected line update must wait for
+ another reason to send a message with the connected line
+ information to the caller before the call is answered. You can
+ trigger the sending of the information by using an appropriate
+ dialplan application such as <emphasis>Ringing</emphasis>.</para>
+ </description>
+ </configOption>
<configOption name="timers_min_se" default="90">
<synopsis>Minimum session timers expiration period</synopsis>
<description><para>
diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c
index e4ec03c11..4d8fd0a24 100644
--- a/res/res_pjsip/pjsip_configuration.c
+++ b/res/res_pjsip/pjsip_configuration.c
@@ -1710,6 +1710,7 @@ int ast_res_pjsip_initialize_configuration(const struct ast_module_info *ast_mod
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "trust_id_outbound", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.trust_outbound));
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "send_pai", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.send_pai));
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "send_rpid", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.send_rpid));
+ ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rpid_immediate", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, rpid_immediate));
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "send_diversion", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, id.send_diversion));
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "mailboxes", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, subscription.mwi.mailboxes));
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "aggregate_mwi", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, subscription.mwi.aggregate));