[asterisk-bugs] [JIRA] (ASTERISK-28686) chan_sip strictrtp=yes fails when media source is changed: no audio

Walter Doekes (JIRA) noreply at issues.asterisk.org
Mon Jan 13 03:50:25 CST 2020


Walter Doekes created ASTERISK-28686:
----------------------------------------

             Summary: chan_sip strictrtp=yes fails when media source is changed: no audio
                 Key: ASTERISK-28686
                 URL: https://issues.asterisk.org/jira/browse/ASTERISK-28686
             Project: Asterisk
          Issue Type: Bug
      Security Level: None
          Components: Channels/chan_sip/Interoperability
    Affects Versions: 13.30.0
            Reporter: Walter Doekes


Hi!

When the SDP origin changes, the SDP session version from the new media is not necessarily higher than the existing session version.

chan_sip contains this bit:
{code}
        if (ast_test_flag(&p->flags[1], SIP_PAGE2_IGNORESDPVERSION) ||
            (p->sessionversion_remote < 0) ||
            (p->sessionversion_remote != rua_version)) {
                p->sessionversion_remote = rua_version;
        } else {
...
                        ast_debug(2, "Call %s responded to our reinvite without changing SDP version; ignoring SDP.\n", p->callid);
                        return FALSE;
{code}
That means that the updated SDP will be ignored for a change like this:
- Initial o= line (for example in 183):
{noformat}
o=root 1845921041 1845921041 IN IP4 193.x.x.215
{noformat}
- Updated o= line (for example in 200):
{noformat}
o=- 1126144851 1126144853 IN IP4 87.x.x.235
{noformat}

In this example, the new SDP sess_version 1126144851 is lower than 1845921041, causing the SDP to be ignored. And because the SDP is not processed, {{ast_rtp_instance_set_remote_address}} is never called, and the new RTP source is discarded.

The fix: do not only check sess_version, but also check the "unique parts" from the SDP. And if they change, then also update the SDP.

Basically this:
{noformat}
        if (ast_test_flag(&p->flags[1], SIP_PAGE2_IGNORESDPVERSION) ||
-           (p->sessionversion_remote < 0) ||
-           (p->sessionversion_remote < rua_version)) {
-               p->sessionversion_remote = rua_version;
+                       sess_version > p->sessionversion_remote ||
+                       strcmp(unique, S_OR(p->sessionunique_remote, ""))) {
+               p->sessionversion_remote = sess_version;
+               ast_string_field_set(p, sessionunique_remote, unique);
        } else {
{noformat}
Along with a marginally bigger patch (to be put on gerrit), we then get these:
{noformat}
[2020-01-13 10:31:20] VERBOSE[10720][C-00000001] chan_sip.c:
  Got SDP version 203027438 and unique parts [- 203027438 IN IP4 10.x.x.161]
[2020-01-13 10:31:20] VERBOSE[10720][C-00000001] chan_sip.c:
  Got SDP version 1845921041 and unique parts [root 1845921041 IN IP4 193.x.x.215]
[2020-01-13 10:31:31] VERBOSE[10720][C-00000001] chan_sip.c: 
  Comparing SDP version 1845921041 -> 1126144853 and unique parts [root 1845921041 IN IP4 193.x.x.215] -> [- 1126144851 IN IP4 87.x.x.235]
{noformat}
And then everything works as intended.



--
This message was sent by Atlassian JIRA
(v6.2#6252)



More information about the asterisk-bugs mailing list