From: Walter Doekes Date: Mon, 12 Sep 2016 08:28:17 +0000 (+0200) Subject: chan_sip: Allow target refresh (Contact update) on re-INVITE. X-Git-Tag: 11.24.0-rc1~13^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=53cb0f9e84835d4a650262498ef14d4a550b2a12;p=thirdparty%2Fasterisk.git chan_sip: Allow target refresh (Contact update) on re-INVITE. Previously, the Contact was stored only on initial INVITE and on any 18X and 200. That meant that after re-INVITEs from *us* the Contact could get updated, but after re-INVITEs from the *peer*, it did not. This changeset fixes this inconsistency, properly allowing target refreshes through re-INVITES (RFC3261, 12.2). If your strictrtp setting allows it, this change allows you to switch the source IP of a connected/calling device mid-call with a simple re-INVITE from the new IP. ASTERISK-26358 #close Change-Id: Ibb8512054ab27c8c3d2514022568fde943bf2435 --- diff --git a/channels/chan_sip.c b/channels/chan_sip.c index b65f612751..b2709a5e99 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -25717,12 +25717,15 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, str copy_request(&p->initreq, req); /* Save this INVITE as the transaction basis */ if (sipdebug) ast_debug(1, "Initializing initreq for method %s - callid %s\n", sip_methods[req->method].text, p->callid); + + /* Parse new contact both for existing (re-invite) and new calls. */ + parse_ok_contact(p, req); + if (!p->owner) { /* Not a re-invite */ if (req->debug) ast_verbose("Using INVITE request as basis request - %s\n", p->callid); if (newcall) append_history(p, "Invite", "New call: %s", p->callid); - parse_ok_contact(p, req); } else { /* Re-invite on existing call */ ast_clear_flag(&p->flags[0], SIP_OUTGOING); /* This is now an inbound dialog */ if (get_rpid(p, req)) {