[OpenSER-Devel] Possible bug in the tm module in the presence of packet loss/branches
Maxim Sobolev
sobomax at sippysoft.com
Wed Feb 20 00:54:20 CET 2008
Hi,
Disclamer: we discovered this issue with OpenSER 1.3, but it might be
something affecting SER as well, so that I am cross-posting it there.
Basically it looks like there is an issue with transactional CANCEL
processing, potentially related to the presence of packet loss and/or
branching.
In a nutshell the situation looks like the following: the call comes in
to the proxy, and gets forked into three locations using
lookup()/t_relay() functions. Apparently there is some kind of network
blackout, since proxy is not getting 100 Trying and does several INVITE
retransmits on all 3 egress legs. After about 5 seconds it gets CANCEL
from the originating party, it answers 200 to CANCEL and sends 487 for
the ingress leg.
Then it finally gets 180 Ringing from one leg, and 486 Busy Here from
another leg. At that time there has been no provisional response
received from the third leg. What it does next is ACK 486 and properly
relays CANCEL to the leg from which it has received 180 Ringing, BUT
(and that I think is the bug), it does absolutely nothing on third leg
from that point on. It doesn't relay CANCEL there, which is
RFC-compliant, since there has been no provisional response, however it
ceases INVITE retransmits to that leg as well, despite the fact that
only about 5 seconds has been passed since the first INVITE to that leg.
From the user point of view, the phone that is a target of that 3rd leg
continues ringing non-stop (apparently it has received one of INVITEs
but provisional reply has been lost), until INVITE transaction expires
in the UAS, long after the initial call has been disconnected.
My guess is that receiving CANCEL somehow stops re-transmit timer on
appropriate INVITE, which is incorrect in the case when no provisional
response has been received on that transaction.
The correct behavior of the tm module in this case would be to continue
with INVITE re-transmits until we get provisional response and immediate
CANCEL once that response comes in.
Following diagram illustrates the problem.
UAC OPENSER UAS1 UAS2 UAS3
----INVITE->
<-100/INVITE
----INVITE->
-------------INVITE->
----------------------INVITE->
----INVITE->
-------------INVITE->
----------------------INVITE->
----INVITE->
-------------INVITE->
----------------------INVITE->
----INVITE->
-------------INVITE->
----------------------INVITE->
----INVITE->
-------------INVITE->
----------------------INVITE->
----CANCEL->
<-200/CANCEL
<-487/INVITE
<-487/INVITE
<-487/INVITE
----CANCEL->
<-200/CANCEL
<-180/INVITE
----CANCEL->
<-486/INVITE---------
----------------ACK->
----CANCEL->
<-487/INVITE
----CANCEL->
-------ACK->
----CANCEL->
<-200/CANCEL
<-487/INVITE
-------ACK->
<-487/INVITE
-------ACK->
Regards,
--
Maksym Sobolyev
Sippy Software, Inc.
Internet Telephony (VoIP) Experts
T/F: +1-646-651-1110
Web: http://www.sippysoft.com
More information about the Devel
mailing list