[sr-dev] tm issues with TCP forwarding failures

Andrei Pelinescu-Onciul andrei at iptel.org
Wed Jan 27 12:31:02 CET 2010


On Jan 21, 2010 at 17:37, Klaus Darilion <klaus.mailinglists at pernau.at> wrote:
> Hi!
> 
> The sr/ser/kamailio smaple configs contain:
> 
>         if (!t_relay()) {
>                 sl_reply_error();
>         }
> 
> I wonder if this is still the case. I did some TCP tests and when the 
> TCP forwarding fails (e.g. RST received or set_forward_no_connect() 
> activated), then tm module itself replies stateful with 477 and then 
> returning to script with FALSE. Thus, sl_reply_error will send 500 
> response stateless too.

t_relay() will return error if it fails to create a transaction
(unlikely, only on out-of-mem), send failed on all branches (your case),
 cancel failed or stateless ACK forwarding failed.
tm will send an error reply only if no other statefull reply (t_reply()) is
sent in the script.

One way to handle this from the script is first to try t_reply() and
only if t_reply() fails, sl_reply_error(). E.g.:
if (!t_relay()){
    if (!t_reply("500", "Some error"))
        sl_reply_error();
}

Another possible way:
if (!t_relay()){
    if (t_lookup_request())
        exit; # transaction exists -> exit to trigger the auto-reply
    else
        sl_reply_error();
}

You could also use t_newtran(). If t_newtran() fails => sl_reply(). If
it doesn't and t_relay() fails => t_reply() let tm generate the reply.

> 
> IMO if tm module already sent a final response, it should exit without 
> entering script again.

tm sends a final response only at the end of the script and only no
other reply was sent from the script via t_reply. This allows overriding
the final reply from the script.

> 
> Even better would be to reply only if there is no failure route sent.
> 
> Further, if TCP forwarding fails due to set_forward_no_connect() it logs:
> 
>    ERROR: tm [../../forward.h:169]: msg_send: ERROR: tcp_send failed
>    ERROR: tm [t_fwd.c:1235]: ERROR: t_send_branch: sending request on
>    branch 0 failed
> 
> IMO it would be good to log this only with L_INFO, as it is not an 
> error, but intended behavior.

Agreed, but is quite hard to propagate the reason for the send failure
back to tm.

Andrei



More information about the sr-dev mailing list