diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index 7cab428731..247e04d2ab 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -1372,8 +1372,7 @@ static int update_connected_line_information(void *data)
int generate_new_sdp;
method = session->endpoint->id.refresh_method;
- if (session->inv_session->invite_tsx
- && (session->inv_session->options & PJSIP_INV_SUPPORT_UPDATE)) {
+ if (session->inv_session->options & PJSIP_INV_SUPPORT_UPDATE) {
method = AST_SIP_SESSION_REFRESH_METHOD_UPDATE;
}
diff --git a/configs/samples/pjsip.conf.sample b/configs/samples/pjsip.conf.sample
index ed5f93e71e..c05938ea5f 100644
--- a/configs/samples/pjsip.conf.sample
+++ b/configs/samples/pjsip.conf.sample
@@ -608,8 +608,15 @@
;direct_media_glare_mitigation=none ; Mitigation of direct media re INVITE
; glare (default: "none")
;direct_media_method=invite ; Direct Media method type (default: "invite")
-;connected_line_method=invite ; Connected line method type (default:
- ; "invite")
+;connected_line_method=invite ; Connected line method type.
+ ; When set to "invite", check the remote's
+ ; Allow header and if UPDATE is allowed, send
+ ; UPDATE instead of INVITE to avoid SDP
+ ; renegotiation. If UPDATE is not Allowed,
+ ; send INVITE.
+ ; If set to "update", send UPDATE regardless
+ ; of what the remote Allows.
+ ; (default: "invite")
;direct_media=yes ; Determines whether media may flow directly between
; endpoints (default: "yes")
;disable_direct_media_on_nat=no ; Disable direct media session refreshes when
diff --git a/res/res_pjsip.c b/res/res_pjsip.c
index e717fdb40f..9581e7cb55 100644
--- a/res/res_pjsip.c
+++ b/res/res_pjsip.c
@@ -193,11 +193,18 @@
Method used when updating connected line information.
-
+
+ When set to invite, check the remote's Allow header and
+ if UPDATE is allowed, send UPDATE instead of INVITE to avoid SDP
+ renegotiation. If UPDATE is not Allowed, send INVITE.
+
Alias for the invite value.
-
+
+ If set to update, send UPDATE regardless of what the remote
+ Allows.
+
diff --git a/third-party/pjproject/patches/0070-Set-PJSIP_INV_SUPPORT_UPDATE-correctly-in-pjsip_inv_.patch b/third-party/pjproject/patches/0070-Set-PJSIP_INV_SUPPORT_UPDATE-correctly-in-pjsip_inv_.patch
new file mode 100644
index 0000000000..9238e3ec9f
--- /dev/null
+++ b/third-party/pjproject/patches/0070-Set-PJSIP_INV_SUPPORT_UPDATE-correctly-in-pjsip_inv_.patch
@@ -0,0 +1,29 @@
+From 1193681959816effa121c4470748d5faa3a59272 Mon Sep 17 00:00:00 2001
+From: George Joseph
+Date: Thu, 29 Jun 2017 13:42:10 -0600
+Subject: [PATCH] Set PJSIP_INV_SUPPORT_UPDATE correctly in
+ pjsip_inv_verify_request3
+
+pjsip_inv_verify_request3 was setting rem_options when UPDATE was
+detected in the Allow header. That's just an internal variable and
+doesn't go anywhere. It's '*options' that needs to be set.
+---
+ pjsip/src/pjsip-ua/sip_inv.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c
+index fbc8ebe..6db7e6b 100644
+--- a/pjsip/src/pjsip-ua/sip_inv.c
++++ b/pjsip/src/pjsip-ua/sip_inv.c
+@@ -1237,7 +1237,7 @@ PJ_DEF(pj_status_t) pjsip_inv_verify_request3(pjsip_rx_data *rdata,
+
+ if (i != allow->count) {
+ /* UPDATE is present in Allow */
+- rem_option |= PJSIP_INV_SUPPORT_UPDATE;
++ *options |= PJSIP_INV_SUPPORT_UPDATE;
+ }
+
+ }
+--
+2.9.4
+