]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
chan_sip: Do not change IP address in SDP origin line (o=) in SIP reINVITE
authorVitezslav Novy <a1@vnovy.net>
Wed, 6 Sep 2017 10:23:25 +0000 (12:23 +0200)
committerVitezslav Novy <a1@vnovy.net>
Wed, 6 Sep 2017 15:07:29 +0000 (10:07 -0500)
If directmedia=yes is configured, when call is answered, Asterisk sends reINVITE
to both parties to set up media path directly between the endpoints.
In this reINVITE msg SDP origin line (o=) contains IP address of endpoint
instead of IP of asterisk. This behavior violates RFC3264, sec 8:
"When issuing an offer that modifies the session,
the "o=" line of the new SDP MUST be identical to that in the
previous SDP, except that the version in the origin field MUST
increment by one from the previous SDP."
This patch assures IP address of Asterisk is always sent in
SDP origin line.

ASTERISK-17540
Reported by:  saghul

Change-Id: I533a047490c43dcff32eeca8378b2ba02345b64e

channels/chan_sip.c

index cd5cc0c770b49704bb56c0d3bb5640dbb6ec5123..d8a1d3ef8c97f9ae915db587456e14f5f0fcd713 100644 (file)
@@ -13526,12 +13526,13 @@ static enum sip_result add_sdp(struct sip_request *resp, struct sip_pvt *p, int
 
        get_our_media_address(p, needvideo, needtext, &addr, &vaddr, &taddr, &dest, &vdest, &tdest);
 
+       /* We don't use dest here but p->ourip because address in o= field must not change in reINVITE */
        snprintf(owner, sizeof(owner), "o=%s %d %d IN %s %s\r\n",
                 ast_strlen_zero(global_sdpowner) ? "-" : global_sdpowner,
                 p->sessionid, p->sessionversion,
-                (ast_sockaddr_is_ipv6(&dest) && !ast_sockaddr_is_ipv4_mapped(&dest)) ?
+                (ast_sockaddr_is_ipv6(&p->ourip) && !ast_sockaddr_is_ipv4_mapped(&p->ourip)) ?
                        "IP6" : "IP4",
-                ast_sockaddr_stringify_addr_remote(&dest));
+                ast_sockaddr_stringify_addr_remote(&p->ourip));
 
        snprintf(connection, sizeof(connection), "c=IN %s %s\r\n",
                 (ast_sockaddr_is_ipv6(&dest) && !ast_sockaddr_is_ipv4_mapped(&dest)) ?