FYI: This is the pragmatic approach how openser users handle the problem:
1. drop the CANCEL if there is no corresponding INVITE transaction. The UAC must retransmit the CANCEL and meanwhile there should be the INVITE transaction. (since 1.0)
if ( is_method("CANCEL") && !t_check_trans() ) { # CANCEL without matching INVITE transaction, ignore! # May happen if the INVITE is slower than the CANCEL. # Ignore the CANCEL, as the client will retransmit it, and maybe # the INVITE transaction is already created for the next CANCEL xlog("L_WARN","$ci CANCEL without matching transaction ... ignore\n"); exit; }
2. delayed CANCEL. If openser hasn't forward a CANCEL because of missing provisional response, it remembers this branch and sends a CANCEL of there is a delayed provisional response from the caller (at least in CVS=1.2)
regards klaus
Martin Hoffmann wrote:
Greger V. Teigre wrote:
I forward this from the serusers list:
A CANCEL is being sent from a UAC before having established a route set, thus the CANCEL has no Route header and is not caught by loose routing. The below thread shows that this case is difficult to understand. Jiri and Bogdan had a discussion on serusers regarding the race condition where the provisional reply from UAS and the CANCEL cross each other.
I seem to have missed this discussion, but shouldn't the race be between the final reply and the CANCEL?
In SER, there is a race between the INVITE and the CANCEL: If the INVITE processing hasn't been finished and the transaction for it has not yet been established through t_relay() before the CANCEL arrives, things go wonky.
Q1: This situation can be handled in 0.9.x by sending CANCEL through handling the CANCEL as an INVITE. Has this changed in SER 2.0?
If you already have a transaction for the INVITE, you should be fine by simply passing the CANCEL to tm by calling t_relay(). Don't remember what tm does with a CANCEL it doesn't have a transaction for. IMHO it should do nothing and give an error back.
Q2: At what point will t_reply be able to match the CANCEL against the state in tm? I assume only when the provisional reply has been received from UAS.
The state is there the moment a transaction is established. The problem here is that SER doesn't CANCEL branches that have not yet received a 100 Trying since The Standard doesn't allow you to.
Q3: Jiri and Bogdans' discussion seems to conclude that the proxy should not do anything, but is the responsibility of the UAC. This seems strange to me as a missing CANCEL (that in fact could have been routed correctly) is likely to result in an OK, then a BYE, and (as the thread below suggest) is often not handled properly by UACs. So: What is the best way to practically handle this? (i.e. sysop's perspective)
As usual: Ignore. It's a borderline case, anyways. Most likely, it will fix itself anyways because the person that receives the false call will hang up and thus their UA will generate a BYE.
Q4: From a user's perspective, sending all CANCELs to t_relay() would be very appealing. It is natural to assume that tm could match the dialog and appropriate routing. Is this possible for 2.0? If not, is this feasible?
This depends on what tm is doing with a CANCEL it can't find a transaction for. If I understand the code right, it currently treats such a CANCEL as if it were nothing special. This would actually be in violation of 3261 which states that you MUST forward the CANCEL statelessly. However, the reasoning is that this is because the proxy may have forwarded the INVITE statelessly earlier. Since I never do that, I would happily violate that MUST.
Regards, Martin _______________________________________________ Serdev mailing list Serdev@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serdev