Shan Lu wrote:
> 
> Hi,
> 
> Have the following question on forking. The configuration is simple: UA0
> sends INVITE which is forked by proxy server PS to two different UAs:
> UA1 and UA2. The message flow is like this:
> 
> 1. UA0 initiates INVITE
> 2. PS forks INVITE to UA1 and UA2
> 3. Both UA1 and UA2 responds with 180. UA1 has To tag=1 and UA2 has To
> tag=2. These two responses are forwarded by PS back to UA0
> 4. UA1 sends 4xx or 6xx response. PS ACKs the response.
> 5. UA2 sends 200 response. PS forwards 200 to UA0.
> 6. UA0 ACKs the 200 response. The ACK is forwarded by PS to UA2.
> 7. UA0 CANCELs 180 to UA1. Because UA0 doesn't know UA1 has already sent
> final response. And let's further assume that PS does not record-route
> and hence does not see the CANCEL.
> 8. UA1 responds with 481 Transaction Does Not Exist  to the CANCEL from 
>   UA0.
> 
> Question: what is UA0 supposed to do? It still hasn't received final
> response for tag=1. Does it wait for the transaction to time out? What
> should be the right behavior?

Shan Lu:

The crucial distinction here is drawing a line between a transaction and
call legs.  UA0 has one transaction outstanding -- the INVITE.  The fact
that PS forked is limited significance to UA0's processing of its INVITE 
transaction (in fact, UA0 does not even know if the downstream server will
fork or not).  If UA0 gets multiple 1xx responses, each of which has a 
different tag in the To, it should not create a new transaction for each; 
all of these call legs belong to the same INVITE transaction.

As to what is UA0 supposed to do when it gets a 2xx for one call leg and
has another call leg outstanding -- it should do its normal processing,
namely, the 2xx it got balanced out the INVITE transaction, so it will send 
an ACK to the proxy (if PS R-R) or the UAS.

It could very well be that UA0 gets another 2xx (if the CANCEL from the
proxy and the 2xx from UA2 crossed each other on the wire).  In that case,
the 2xx is yet another call leg belonging to the same transaction and MUST
be ACK'ed.  Further processing of that call leg depends on the media
capabilities of the UAC; for instance, if it cannot support simultaneous
calls, it should send out a BYE to the second call leg.

Note that in this particular case, UA0 will never get a non-2xx on the 
second call leg; that is because its downstream proxy will handle a non-2xx 
response with an ACK.  In this particular example, the downstream proxy 
had already send a 2xx upstream, so it will not send another non-2xx up-
stream.

"Ranjit Avasarala" <[EMAIL PROTECTED]> wrote:
> Hi Shan,
> 
>   Since UA0 has not yet received the final response from UA1 , it should
> wait for certain time before timing out. Also when

I believe that this is the proxy's job, since it forked the request to UA1.

> Also since UA1 has sent the final response for UA0 it will no longer store
> that transaction. So it will respond with 481 .
> 
> But I feel PS should record - route and foward the final response of UA1 
> to UA0 . so that UA0 knows about the failure.

I don't quite understand how R-R helps in forwarding responses?  Responses
follow the Via list, not R-R.  

Gratituous R-R on behalf of proxies should be minimized.  R-R, in general, 
should only be used when absolutely needed (a proxy may reserve some 
resources that have to be freed, or a proxy may be providing services 
triggered off getting a BYE, for instance).

Best regards,

- vijay
--
Vijay K. Gurbani  vkg@{lucent.com,research.bell-labs.com,acm.org}
Internet Software and eServices Group 
Lucent Technologies/Bell Labs Innovations 263 Shuman Blvd., Rm 1A-413
Naperville, Illinois 60566     Voice: +1 630 224 0216   Fax: +1 630 713 0184
_______________________________________________
Sip-implementors mailing list
[EMAIL PROTECTED]
http://lists.cs.columbia.edu/mailman/listinfo/sip-implementors

Reply via email to