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@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@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@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@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@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@192.98.101.10:5555;transport=tcp> and
<<sip:test@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.