[Kamailio-Users] t_relay with result code -6 creates transaction

Juha Heinanen jh at tutpro.com
Tue Mar 10 06:15:23 CET 2009


i was playing with t_relay and tcp and noticed that when forwarding to a
tcp contact fails, transaction is still created although README says:

     * 0x02 - do not internally send a negative reply in case of
       forward failure (due internal error, bad RURI, bad message,
       etc). When a forward failure occurs, no SIP request is
       relayed and therefore no negative reply or timeout will
       show up on the failure_route (if one is set). It applies
       only when the transaction is created. By default one
       negative reply is sent. Useful if you want to implement a
       serial forking in case of failure.

and

   In case of error, the function returns the following codes:
     ...
     * -6 - generic send failed

while testing this i had two contacts with different q values:

Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: DBG:tm:t_load_contacts: loaded contact <sip:test at 192.98.101.10:5074#012#012#012udp:192.98.101.10:5060#0120#012d> with q_flag <0>
Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: DBG:tm:t_load_contacts: loaded contact <sip:jh at 192.98.101.10:5555;transport=tcp#012#012#012#01216#0124> with q_flag <4>

i then called next_contacts() followed by t_relay("0x03") and tested the
result:

   while (1) {
       xlog("L_INFO", "INFO: Routing initial $rm to <$ru> and <$bR>\n");
       t_relay("0x03");
       switch ($retcode) {
       case 1:
           xlog("L_INFO", "INFO: retcode is <1>\n");
           exit;
       case -1:
       case -2:
       case -3:
           sl_reply_error();
       exit;
       case -4:
           xlog("L_INFO", "INFO: retcode is <-4>\n");
       case -5:
           xlog("L_INFO", "INFO: retcode is <-5>\n");
       case -6:
           xlog("L_INFO", "INFO: retcode is <-6>\n");
           if (!t_next_contacts()) {
                send_reply("480", "Temporarily Unavailable");
                exit;
           };
       };
   };

i got to syslog:

Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: DBG:tm:t_next_contacts: entering next_contacts WITHOUT transaction
Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: DBG:tm:t_next_contacts: R-URI contact is <sip:jh at 192.98.101.10:5555;transport=tcp#012#012#012#01216#0124>
Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: INFO: Routing initial INVITE to <sip:jh at 192.98.101.10:5555;transport=tcp> and <<null>>
Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: ERROR:core:tcp_blocking_connect: poll error: flags 18
Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: ERROR:core:tcp_blocking_connect: failed to retrieve SO_ERROR (111) Connection refused
Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: ERROR:core:tcpconn_connect: tcp_blocking_connect failed
Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: ERROR:core:tcp_send: connect failed
Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: ERROR:tm:msg_send: tcp_send failed
Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: ERROR:tm:t_forward_nonack: sending request failed
Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: INFO: retcode is <-6>

the first debug line above is a new one that i added to the beginning of
next_contacts():


    t = get_t();
    if (!t || (t == T_UNDEFINED)) {
	LM_DBG("entering next_contacts WITHOUT transaction\n");
    } else {
	LM_DBG("entering next_contacts WITH transaction\n");
    }	

then the script goes on and calls t_next_contacts()/t_relay("0x03") again
and now i get:

Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: DBG:tm:t_next_contacts: entering next_contacts WITH transaction
Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: DBG:tm:t_next_contacts: next branch contact is <sip:test at 192.98.101.10:5074#012#012#012udp:192.98.101.10:5060#0120#012d>
Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: INFO: Routing initial INVITE to <sip:jh at 192.98.101.10:5555;transport=tcp> and <<sip:test at 192.98.101.10:5074>;q=0>
Mar 10 06:50:07 taimen /usr/sbin/kamailio[18101]: INFO: retcode is <1>

how is it possible that the transaction was created even when the first
t_relay failed with result code -6?

this example should prove that scripting tm like this NOT user friendly
and prone to errors.

-- juha

ps. i think we agreed earlier that failing forward to a tcp contact is
NOT an error and should not be printed to syslog as an error.




More information about the sr-users mailing list