Thank you for the clarification. I have changed the code. Now the phone is resilient to handle out of order Refer an Acknowledgement in the problem scenario.
On Fri, Sep 7, 2018, 8:17 AM Dale R. Worley <wor...@ariadne.com> wrote: > karthik sasupalli <karthiksasupa...@gmail.com> writes: > > I have a scenario, where the REFER to an INVITE is received before the > ACK. > > > > There is a Desk Phone and a Call server. The call is initiated by the > Call > > server. > > > > Desk Phone <-- INVITE <-- Call Server > > Desk Phone --> 180 Ringing --> Call Server > > Desk Phone --> 200 OK/SDP --> Call Server > > *Desk Phone <-- REFER <-- Call Server* > > Desk Phone <-- ACK/SDP <-- Call Server > > > > The dialogue becomes confirmed when ACK is received. But in this case, > the > > REFER is received before ACK and hence it is received even before the > > dialogue is confirmed. > > The first step is to isolate what the RFCs say about the situation. > > Unfortunately REFER is rather under-specified and in practice has a > number of different usages > (https://datatracker.ietf.org/doc/draft-worley-sip-many-refers/). But > RFC 3515 section 2 does say, in regard to REFERs sent within a dialog, > > Unless stated otherwise, the protocol for emitting and responding to > a REFER request are identical to those for a BYE request in [1]. > > RFC 3261 seciton 15 explicitly allows a UAC to send a BYE within an > early dialog, which means that a UAS can receive a BYE within an early > dialog (i.e., before receiving ACK): > > BYE outside of a dialog. The caller's UA MAY send a BYE for either > confirmed or early dialogs, and the callee's UA MAY send a BYE on > confirmed dialogs, but MUST NOT send a BYE on early dialogs. > > Hence, it seems the RFCs envision that a UA may receive a valid REFER > after sending a 1xx response to an INVITE but before receiving the ACK. > > The second step is to assess whether the stated rules need to be > adjusted to work well in practice. Roman Shpount's reply discusses some > of the practical considerations. One of the most important is: > > > It is very often re-ordered by the network or proxies with > > request that starts the next transaction. > > Even if the Server sends the REFER *after* the ACK, and there is no > guarantee that the network will deliver the REFER after the ACK. So > you want to make the Desk Phone's behavior resistant to this network > behavior. I.e., it should accept and act on the REFER if it arrives > before the ACK. > > > According to RFC3515, the server should retry REFER (in case the response > > is any one of the below) > > > > Retry-After 404,413,480,486 o > > > > Retry-After 500,503 o > > > > Retry-After 600,603 o > > I'm not sure of your meaning here. If the Desk Phone does send an error > response with a Retry-After header, the Server might retry the request. > But I would be confident of that; it is not a behavior I've heard of. > > > I have changed the code in Desk Phone, so that, when a REFER is received > > before the ACK is received, the Desk Phone responds with 603 Declined. > > > > The server should understand this 603 response and try to resend REFER > > after some time so that REFER is received after ACK. > > Notice the pattern of what you've written: "I have changed the code in > XXX so that ... . YYY should ... ." > > That is, you have decided that useful operation of your device, XXX, > depends on *somebody else's* device YYY doing what you desire. Of > course, you have to depend on other devices behaving correctly, but as a > general rule, you should depend on that as little as possible. "Be > strict in the behavior of your device, be liberal in the behavior you > tolerate in other devices." > > Dale > _______________________________________________ Sip-implementors mailing list Sip-implementors@lists.cs.columbia.edu https://lists.cs.columbia.edu/mailman/listinfo/sip-implementors