[Asterisk-code-review] chan_pjsip: add a flag to ignore 183 responses if no SDP present (...asterisk[master])
Torrey Searle
asteriskteam at digium.com
Thu Mar 7 01:21:09 CST 2019
Torrey Searle has uploaded this change for review. ( https://gerrit.asterisk.org/c/asterisk/+/11102
Change subject: chan_pjsip: add a flag to ignore 183 responses if no SDP present
......................................................................
chan_pjsip: add a flag to ignore 183 responses if no SDP present
chan_sip will always ignore 183 responses that do not contain SDP
however, chan_pjsip will currently always translate it into a
183 with SDP. This new flag allows chan_pjsip to have the same
behavior as chan_sip.
ASTERISK-28322 #close
Change-Id: If81cfaa17c11b6ac703e3d71696f259d86c6be4a
---
M CHANGES
M channels/chan_pjsip.c
M configs/samples/pjsip.conf.sample
A contrib/ast-db-manage/config/versions/80473bad3c16_ignore_183_without_sdp.py
M include/asterisk/res_pjsip.h
M res/res_pjsip.c
M res/res_pjsip/pjsip_configuration.c
7 files changed, 79 insertions(+), 1 deletion(-)
git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/02/11102/1
diff --git a/CHANGES b/CHANGES
index d347507..3f0c84e 100644
--- a/CHANGES
+++ b/CHANGES
@@ -92,6 +92,13 @@
RECOMMENDED), keep the current behavior, or trigger only on pjsip
taskprocessor overloads.
+chan_pjsip
+------------------
+ * A new configuration parameter 'ignore_183_without_sdp' has been added
+ to the pjsip.conf "endpoints" section. If enabled, will make chan_pjsip
+ not discard 183 that do not contain an SDP body, which can resolve no
+ ringback tone issues as well as making the behavior match chan_sip.
+
MWI
------------------
* A new module "res_mwi_devstate" has been added that allows subscriptions
diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index e44f328..55cd9ed 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -3014,7 +3014,14 @@
ast_channel_unlock(session->channel);
break;
case 183:
- ast_queue_control(session->channel, AST_CONTROL_PROGRESS);
+ if (session->endpoint->ignore_183_without_sdp) {
+ pjsip_rdata_sdp_info *sdp = pjsip_rdata_get_sdp_info(rdata);
+ if (sdp && sdp->body.ptr) {
+ ast_queue_control(session->channel, AST_CONTROL_PROGRESS);
+ }
+ } else {
+ ast_queue_control(session->channel, AST_CONTROL_PROGRESS);
+ }
break;
case 200:
ast_queue_control(session->channel, AST_CONTROL_ANSWER);
diff --git a/configs/samples/pjsip.conf.sample b/configs/samples/pjsip.conf.sample
index 29f53a5..fcc8c4a 100644
--- a/configs/samples/pjsip.conf.sample
+++ b/configs/samples/pjsip.conf.sample
@@ -858,6 +858,15 @@
; headers are received. This option allows the
; 'Q.850' Reason header to be suppressed.
; (default: no)
+;ignore_183_without_sdp =
+ ; Do not forward 183 when it doesn't contain SDP
+ ; Certian SS7 internetworking scenarios can result in
+ ; a 183 to be generated for reasons other than early
+ ; media. Forwarding this 183 can cause loss of
+ ; ringback tone. This flag emulates the behavior of
+ ; chan_sip and prevents these 183 responses from
+ ; being forwarded.
+ ; (default: no)
;==========================AUTH SECTION OPTIONS=========================
;[auth]
diff --git a/contrib/ast-db-manage/config/versions/80473bad3c16_ignore_183_without_sdp.py b/contrib/ast-db-manage/config/versions/80473bad3c16_ignore_183_without_sdp.py
new file mode 100644
index 0000000..d05e2d5
--- /dev/null
+++ b/contrib/ast-db-manage/config/versions/80473bad3c16_ignore_183_without_sdp.py
@@ -0,0 +1,38 @@
+"""ignore 183 without sdp
+
+Revision ID: 80473bad3c16
+Revises: f3c0b8695b66
+Create Date: 2019-03-04 08:30:51.592907
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '80473bad3c16'
+down_revision = 'f3c0b8695b66'
+
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects.postgresql import ENUM
+
+AST_BOOL_NAME = 'ast_bool_values'
+# We'll just ignore the n/y and f/t abbreviations as Asterisk does not write
+# those aliases.
+AST_BOOL_VALUES = [ '0', '1',
+ 'off', 'on',
+ 'false', 'true',
+ 'no', 'yes' ]
+
+def upgrade():
+ ############################# Enums ##############################
+
+ # ast_bool_values has already been created, so use postgres enum object
+ # type to get around "already created" issue - works okay with mysql
+ ast_bool_values = ENUM(*AST_BOOL_VALUES, name=AST_BOOL_NAME, create_type=False)
+
+ op.add_column('ps_endpoints', sa.Column('ignore_183_without_sdp', ast_bool_values))
+
+def downgrade():
+ if op.get_context().bind.dialect.name == 'mssql':
+ op.drop_constraint('ck_ps_endpoints_ignore_183_without_sdp_ast_bool_values', 'ps_endpoints')
+ op.drop_column('ps_endpoints', 'ignore_183_without_sdp')
+ pass
diff --git a/include/asterisk/res_pjsip.h b/include/asterisk/res_pjsip.h
index fd053b3..3ef0ae9 100644
--- a/include/asterisk/res_pjsip.h
+++ b/include/asterisk/res_pjsip.h
@@ -845,6 +845,12 @@
unsigned int notify_early_inuse_ringing;
/*! Suppress Q.850 Reason headers on this endpoint */
unsigned int suppress_q850_reason_headers;
+ /*! Do we accept connected line updates from this endpoint? */
+ unsigned int trust_connected_line;
+ /*! Do we send connected line updates to this endpoint? */
+ unsigned int send_connected_line;
+ /*! Ignore 183 if no SDP is present */
+ unsigned int ignore_183_without_sdp;
};
/*! URI parameter for symmetric transport */
diff --git a/res/res_pjsip.c b/res/res_pjsip.c
index 24796fc..ab90a42 100644
--- a/res/res_pjsip.c
+++ b/res/res_pjsip.c
@@ -1127,6 +1127,16 @@
option allows the 'Q.850' Reason header to be suppressed.</para>
</description>
</configOption>
+ <configOption name="ignore_183_without_sdp" default="no">
+ <synopsis>Do not forward 183 when it doesn't contain SDP</synopsis>
+ <description><para>
+ Certian SS7 internetworking scenarios can result in a 183
+ to be generated for reasons other than early media. Forwarding
+ this 183 can cause loss of ringback tone. This flag emulates
+ the behavior of chan_sip and prevents these 183 responses from
+ being forwarded.</para>
+ </description>
+ </configOption>
</configObject>
<configObject name="auth">
<synopsis>Authentication type</synopsis>
diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c
index e6ac8ec..050073b 100644
--- a/res/res_pjsip/pjsip_configuration.c
+++ b/res/res_pjsip/pjsip_configuration.c
@@ -1949,6 +1949,7 @@
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));
+ ast_sorcery_object_field_register(sip_sorcery, "endpoint", "ignore_183_without_sdp", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, ignore_183_without_sdp));
if (ast_sip_initialize_sorcery_transport()) {
ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");
--
To view, visit https://gerrit.asterisk.org/c/asterisk/+/11102
To unsubscribe, or for help writing mail filters, visit https://gerrit.asterisk.org/settings
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Change-Id: If81cfaa17c11b6ac703e3d71696f259d86c6be4a
Gerrit-Change-Number: 11102
Gerrit-PatchSet: 1
Gerrit-Owner: Torrey Searle <tsearle at gmail.com>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20190307/db06c2b8/attachment-0001.html>
More information about the asterisk-code-review
mailing list