[sr-dev] tm issues with TCP forwarding failures

Klaus Darilion klaus.mailinglists at pernau.at
Wed Jan 27 12:44:55 CET 2010



Andrei Pelinescu-Onciul schrieb:
> 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();
> }
> 

Is it also possible to t_relay the call a second time? For example 
relaying failed as the destination SIP proxy is not available can I 
redirect the call to an announcement server? e.g.:

if (!t_relay()){
     if (t_lookup_request())
	$du = "sip:announcement01 at 1.2.3.4";
	t_relay();	
         exit;
     else
         sl_reply_error();
}

regards
Klaus



> 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