chan_sip: Allow target refresh (Contact update) on re-INVITE.
authorWalter Doekes <walter+github@wjd.nu>
Mon, 12 Sep 2016 08:28:17 +0000 (10:28 +0200)
committerWalter Doekes <walter+asterisk@wjd.nu>
Mon, 12 Sep 2016 08:39:48 +0000 (03:39 -0500)
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

channels/chan_sip.c

index 28ba05f..8d84d55 100644 (file)
@@ -26113,12 +26113,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)) {