diff options
author | Walter Doekes <walter+github@wjd.nu> | 2016-09-12 10:28:17 +0200 |
---|---|---|
committer | Walter Doekes <walter+asterisk@wjd.nu> | 2016-09-12 03:40:47 -0500 |
commit | 52e6d0340119a8d6571a423ebf3a96722b2986cd (patch) | |
tree | 205c3d46e1e20843df681a491a818bfdc19de5b0 /channels/chan_sip.c | |
parent | 236761a5b2efc54a5baa32febdaa869a669c7ce7 (diff) |
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
Diffstat (limited to 'channels/chan_sip.c')
-rw-r--r-- | channels/chan_sip.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index bff3ca176..514f6bfe9 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -26117,12 +26117,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)) { |