Hi, I'm testing SEMS and Sippy B2BUA as transparent B2BUA. I've discovereed 
the same bug in both so I copy&paste the same report I've already done in the 
other project (and replace Sippy B2BUA with SEMS).


-----------------------
I've realized that SEMS as B2BUA has an issue when handling parallel 
responses. Basically, SEMS receives different provisional responses in leg_B 
(different To_tag) but convert all of them to the same To_tag in leg_A.

This is an error in case the responses are 183 containing an SDP because if a 
UAC (the caller) receives a provisional 183 response (To_tag=AAA) with an 
SDP=AAA, and later receives a 200 OK with same To_tag=AAA but different 
SPD=BBB, then it should use SDP=AAA and ignore SDP=BBB.
This is: the SDP cannot be changed during a dialog (note that there is just 
*one* dialog between the caller and SEMS since SEMS already sent one 
To_tag).

So I describe the current behaviour and the problem it originates:

- X-Lite calls SEMS.

- SEMS calls to [EMAIL PROTECTED]

- A PROXY receives the INVITE and does parallel forking (to alice and bob).

- Both alice and bob replies 183 to the PROXY:
  - alice 183:
    - To_tag = alice_to_tag
    - SDP = alice_sdp
  - bob 183:
    - To_tag = bob_to_tag
    - SDP = bob_sdp

- PROXY forwards the replies to SEMS.

- SEMS generates two 183 to X-Lite:
  - alice_leg_A 183:
    - To_tag = leg_A_to_tag
    - SDP = alice_sdp           <--- The original of course
  - bob_leg_A 183:
    - To_tag = leg_A_to_tag     <--- The same !!!!!
    - SDP = bob_sdp           <--- The original of course

  (note that both 183 has same To_tag but different SDP).

- alice_leg_A 183 arrives before so X-Lite starts receiving (and rendering to 
the human) the SDP of alice (alice_sdp).

- Later X-Lite receives bob_leg_B 183, with same To_tag but **different SDP= 
bob_sdp**. This is wrong, the SDP cannot change during an dialog. Note that 
there is just **one** dialog (early-dialog in fact) between X-Lite and SEMS 
since SEMS has replied just **one** To_tag.
So X-Lite just ignores this new 183 with "wrong" SDP.

- In leg B world, bob finally answers the calls so sends a 200 OK. The PROXY 
sends this 200 OK to SEMS, so SEMS receives:
  - bob 200:
    - To_tag = bob_to_tag
    - SDP = bob_sdp

- Now SEMS generates the following 200 to X-Lite:
  - bob_leg_A 200:
    - To_tag = leg_A_to_tag
    - SDP = bob_sdp

- When X-Lite receives this 200 it must ignore the SDP (bob_sdp) since X-Lite 
already received an SDP in this *same* early-dialog (alice_sdp in the first 
183 from SEMS). This new SDP in the same early-dialog must, even if 
different, be ignored, so X-Lite sends RTP to alice instead of bob, and also 
expects receiving RTP from alice instead of bob.

This is obviously wrong and I can sure that my report is valid (it is 
something I've already dealed with in other cases).



I paste a simple SIP flow that shows the problem (they are 180 instead of 183, 
but it doesn't matter).
The issue occurs when SEMS unifies different To_tags from leg_B in an unique 
To_tag in leg_A. This problem would dissapear if SEMS uses a different 
To_tag in leg_A for each different To_tag received in leg_B.
For example, the To_tag in leg_A could be generated based on To_tag in leg_B:

  leg_a_to_tag = create_tag(received_leg_b_to_tag)


SIP flow (I've deleted somw headers):

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

*** 180 from alice (leg_B):

# PROXY_IP -> SEMS_IP
SIP/2.0 180 Ringing
To: <sip:[EMAIL PROTECTED]>;tag=vgbom
From: "X-Lite" <sip:[EMAIL PROTECTED]>;tag=91aad98427871b752a72c9aa39824831
Call-ID: YWNhNzJkZWEwNzFmMjIxZjJlNmZjNjAxY2MxNTM3Y2U.-b2b_1
CSeq: 200 INVITE
Contact: <sip:[EMAIL PROTECTED];transport=tcp>
Server: Twinkle/1.3

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

*** 180 from bob (leg_B):

# PROXY_IP -> SEMS_IP
SIP/2.0 180 Ringing
To: <sip:[EMAIL PROTECTED]>;tag=kpsse
From: "X-Lite" <sip:[EMAIL PROTECTED]>;tag=91aad98427871b752a72c9aa39824831
Call-ID: YWNhNzJkZWEwNzFmMjIxZjJlNmZjNjAxY2MxNTM3Y2U.-b2b_1
CSeq: 200 INVITE
Contact: <sip:[EMAIL PROTECTED];transport=udp>
Server: Twinkle/1.3

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

*** 180 from SEMS (bob) to X-Lite (Leg_A):

# SEMS_IP -> X-Lite
SIP/2.0 180 Ringing
From: X-Lite <sip:[EMAIL PROTECTED]>;tag=34243d29
To: fork <sip:[EMAIL PROTECTED]>;tag=126d983702f40667910c0d06d9a0301c
Call-ID: YWNhNzJkZWEwNzFmMjIxZjJlNmZjNjAxY2MxNTM3Y2U.
CSeq: 1 INVITE
Server: SEMS

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

*** 180 from SEMS (alice) to X-Lite (Leg_A):

# SEMS_IP -> X-Lite
SIP/2.0 180 Ringing
From: X-Lite <sip:[EMAIL PROTECTED]>;tag=34243d29
To: fork <sip:[EMAIL PROTECTED]>;tag=126d983702f40667910c0d06d9a0301c
Call-ID: YWNhNzJkZWEwNzFmMjIxZjJlNmZjNjAxY2MxNTM3Y2U.
CSeq: 1 INVITE
Server: SEMS




Hope it's useful. Best regards.




-- 
Iñaki Baz Castillo
_______________________________________________
Semsdev mailing list
Semsdev@lists.iptel.org
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to