Subject: [Insipid] Call-transfer INSIPID backwards-compat call flows

From: Hadriel Kaplan <[email-masked]>
Date: Sat, 17 Aug 2013 10:08:45 -0400

Howdy,
This email is about the call-transfer call flows in the draft.

---------------------------------------------------------------------------

9.1. Basic Session ID Construction with 2 UUIDs

      Session ID
         ---     Alice            B2BUA             Bob            Carol
         {A}       |----INVITE----->|                |
         {A}       |                |----INVITE----->|
        {A;B}      |                |<---200 OK------|
        {A;B}      |<---200 OK------|                |
        {A;B}      |------ACK------>|                |
        {A;B}      |                |------ACK------>|
                   |<==============RTP==============>|

             Figure 1 - Session ID Creation when Alice calls Bob

---------------------------------------------------------------------------

9.2. Basic Call Transfer using REFER

   From the example built within Section 9.1 (the basic session ID
   establishment), we proceed to this 'Basic Call Transfer using REFER'
   example.

      Session ID
         ---     Alice            B2BUA             Bob            Carol
                   |                |                |               |
                   |<==============RTP==============>|               |
        {A;B}      |                |<---reINVITE----|               |
        {A;B}      |<---reINVITE----| (puts Alice on Hold)           |
        {A;B}      |-----200 OK---->|                |               |
        {A;B}      |                |-----200 OK---->|               |
        {A;B}      |                |<-----ACK-------|               |
        {A;B}      |<-----ACK-------|                |               |
                   |                |                |               |
   F1   {A;B}      |                |<----REFER------|               |
        {A;B}      |<----REFER------|                |               |
        {A;B}      |-----200 OK---->|                |               |
        {A;B}      |                |-----200 OK---->|               |
        {A;B}      |-----NOTIFY---->|                |               |
        {A;B}      |                |-----NOTIFY---->|               |
        {A;B}      |                |<----200 OK-----|               |
        {A;B}      |<----200 OK-----|                |               |
                   |                |                |               |
   F2    {A}       |-----INVITE---->|                                |
         {A}       |                |-----INVITE-------------------->|
        {A;C}      |                |<----200 OK---------------------|
        {A;C}      |<----200 OK-----|                                |
        {A;C}      |------ACK------>|                                |
        {A;C}      |                |------ACK---------------------->|
                   |                |                |               |
                   |<======================RTP======================>|
                   |                |                |               |
        {A;B}      |-----NOTIFY---->|                |               |
        {A;B}      |                |-----NOTIFY---->|               |
        {A;B}      |                |<----200 OK-----|               |
        {A;B}      |<----200 OK-----|                |               |
        {A;B}      |                |<-----BYE-------|               |
        {A;B}      |<-----BYE-------|                |               |
        {A;B}      |-----200 OK---->|                |               |
        {A;B}      |                |-----200 OK---->|               |
                   |                |                |               |

                    Figure 2 - Call Transfer using REFER

F1 - the REFER request uses a Session-ID header field of {A;B}, but the Refer-To header contains the Session-ID for the new one to be created with INVITE with Replaces.  Per the legacy kaplan-draft, that Refer-To value would be the session to-be-replaced, i.e. the Session-ID Bob already has with Carol.  IF that's followed, then F2 would be {C} instead of {A}.  But nothing "breaks" if instead Bob sends a Refer-To with the same Session-ID value Bob has with Alice - i.e, it's ok for this to be "A" so that F2 becomes {A} instead, as shown above.

F2 - as noted above, the value shown is {A}, but it could be {C} instead - or whatever Bob puts in the F1 REFER's Refer-To header.

---------------------------------------------------------------------------

9.3. Basic Call Transfer using reINVITE

   From the example built within Section 9.1 (the basic session ID
   establishment), we proceed to this 'Basic Call Transfer using
   reINVITE' example.

   Alice is talking to Bob. Bob pushes a button on his phone to transfer
   Alice to Carol via the B2BUA (using reINVITE).

      Session ID
         ---     Alice            B2BUA             Bob            Carol
                   |                |                |               |
                   |<==============RTP==============>|               |
                   |                |                |               |
        {A;B}      |                |<---reINVITE----|               |
        {A;B}      |                |-----200 OK---->|               |
        {A;B}      |                |<-----ACK-------|               |
                   |                |                |               |
         {A}       |                |-----INVITE-------------------->|
        {A;C}      |                |<----200 OK---------------------|
        {A;C}      |                |------ACK---------------------->|
                   |                |                |               |
                   |<======================RTP======================>|
                   |                |                |               |
        {A;B}      |                |<-----BYE-------|               |
        {A;B}      |                |-----200 OK---->|               |
                   |                |                |               |

                   Figure 3 - Call transfer using reINVITE

Note: I don't know why this example in the draft uses a re-INVITE as a transfer action.  The paragraph says Bob pushes a button, but button pushes aren't sent in re-INVITEs.  They're either sent in RTP (RFC2833/4733) or as INFO or as KPML or whatever.  Not re-INVITEs.

---------------------------------------------------------------------------

9.9. Session ID in an out-of-dialog REFER Transaction

   The following call-flow was extracted from Section 6.1 of [RFC5589]
   ("Successful Transfer"), with the only changes being the names of the
   UAs to maintain consistency within this document.

         Alice is the transferee
         Bob is the transferer
         and Carol is the transfer-target

     Session ID     Bob                 Alice                 Carol
                     |                    |                     |
         {A}         |<-----INVITE--------|                     |
        {A;B}        |------200 OK------->|                     |
        {A;B}        |<------ACK----------|                     |
                     |                    |                     |
        {A;B}        |--INVITE {hold}---->|                     |
        {A;B}        |<-200 OK------------|                     |
        {A;B}        |--- ACK ----------->|                     |
                     |                    |                     |
  F1     {A}         |--REFER------------>|(Target-Dialog:Carol)|
        {A;X}        |<-202 Accepted------|                     |
                     |                    |                     |
        {A;X}        |<NOTIFY {100 Trying}|                     |
        {A;X}        |-200 OK------------>|                     |
                     |                    |                     |
  F2     {A}         |                    |--INVITE------------>|
        {A;C}        |                    |<-200 OK-------------|
        {A;C}        |                    |---ACK-------------->|
                     |                    |                     |
        {A;X}        |<--NOTIFY {200 OK}--|                     |
        {A;X}        |---200 OK---------->|                     |
                     |                    |                     |
        {A;B}        |--BYE-------------->|                     |
        {A;B}        |<-200 OK------------|                     |
        {A;C}        |                    |<------------BYE-----|
        {A;C}        |                    |-------------200 OK->|

                    Figure 10: Basic Transfer Call Flow

F1 - exactly like the in-dialog REFER in section 9.2 earlier in this email, this out-of-dialog REFER request uses a Session-ID header value of {A}, but the Refer-To header contains the Session-ID for the new one to be created by Alice with a new INVITE.  Per the legacy kaplan-draft, that Refer-To value would be the session to-be-replaced, i.e. the Session-ID Bob already has with Carol.  If that's followed, then F2 would be {C} instead of {A}.  But nothing "breaks" if instead Bob sends a Refer-To with the same Session-ID value Bob has with Alice - i.e, it's ok for this to be "A" so that F2 becomes {A} instead, as shown above.

F2 - as noted above, the value shown is {A}, but it could be {C} instead - or whatever Bob puts in the F1 REFER's Refer-To header.

-hadriel