Hello,
We are using kamailio 1.5 and we have the following problem with ldap_search:
A call comes in. If it is to a VOIP user, it will be routed to kamailio, and eventually go to the ldap lookup route: route[10] to look up the user. This is always successful (LDAP can connect). It will then look up user preferences (call forwarding etc.) from SQL in route[12] and route based on this result in route[13]. If the result is "CFU (call forward unconditional) = on", the URI is changed and route[10] (LDAP lookup) is called again. This is always successful (LDAP can connect). If the result is "CFB (call forward busy) = on" and the user is busy, the URI is changed and route[10] (LDAP lookup) is called again. This is also always successful (LDAP can connect). If the result is "CFNR (call forward no reply) = on", the timeout is changed and the call is delivered to the phone through route[14] (location) and route[15] (relay). If the user does not answer, the URI is changed in failure_route[1] and route[10] is called. For some unknown reason, ldap_search always fails in this scenario with the messages: "ldap_session not found", "couldn't get ldap session" and then "no LDAP entry found". Why? And why does this result in the -1 return code and not the -2 return code for ldap_search?
The only differences I can think of is that the unsuccessful scenario comes from FAILURE_ROUTE instead of REQUEST_ROUTE, and that longer time has passed since the original invite.
Here's a sample log: NOTE the three ERROR lines, the INFO line and the ROUTE 10 line.
Dec 27 13:31:55 [3373]: INVITE received from sip:<CALLER>@<SBC_IP> <source IP: <SBC_IP>> to sip:<CALLEE>@<KAM_IP>: Dec 27 13:31:55 [3373]: ERROR:ldap:ldap_reconnect: [ldapprod]: LDAP reconnect successful Dec 27 13:31:55 [3373]: ROUTE 10: LDAP returned: UID = <UID>, voipSipPrimaryUri = <PRIMARY_URI>, voipExtensionUri = sip:<CALLEE>@<DOMAIN> Dec 27 13:31:55 [3373]: ROUTE 12: Effective user properties for UID <UID>: CFU: off <FORWARDTO>, CFB: off <FORWARDTO>, CFNR: on:25 <FORWARDTO>, CFNC: off <FORWARDTO>, VM: <CALLEE>, busy_level: 1, DBrows: 1 Dec 27 13:31:55 [3373]: -------------------- Calling sip:<CALLEE>@<DOMAIN> for 25 seconds. -------------------- Dec 27 13:31:55 [3373]: ROUTE 15: Sending 105 INVITE from sip:<CALLER>@<SBC_IP> to sip:<CALLEE>@<CALLEE_IP> (via <<null>>) Dec 27 13:31:55 [3383]: Response 100 Trying to Cseq 102 INVITE received from <PROTO>:<CALLEE_IP>:<PORT> Dec 27 13:31:55 [3385]: Response 180 Ringing to Cseq 102 INVITE received from <PROTO>:<CALLEE_IP>:<PORT>
Dec 27 13:32:20 [3388]: FAILURE_ROUTE 1: Timeout for: 104 INVITE from <CALLER> -> <CALLEE> Dec 27 13:32:20 [3388]: -------------------- Forwarding on no reply to <FORWARDTO> -------------------- Dec 27 13:32:20 [3388]: ERROR:ldap:get_connected_ldap_session: [ldapprod]: ldap_session not found Dec 27 13:32:20 [3388]: ERROR:ldap:lds_search: [ldapprod]: couldn't get ldap session Dec 27 13:32:20 [3388]: INFO:ldap:ldap_search_impl: no LDAP entry found Dec 27 13:32:20 [3388]: ROUTE 11: Number lookup results for <FORWARDTO>: Node: VOIP. Dec 27 13:32:20 [3388]: CONFIG ERROR: VOIP number not found in LDAP. Hanging up. Dec 27 13:32:20 [3373]: Response 487 Request Cancelled to Cseq 102 INVITE received from <PROTO>:<CALLEE_IP>:<PORT>
Here's the ldap config file:
[ldapprod] ldap_server_url = "ldap://ldap.<DOMAIN>" ldap_network_timeout = 500 ldap_client_bind_timeout = 500
kamailio config snippets (in case you need them):
# LDAP lookup for UID and primary URI route[10] { ... ldap_search("ldap://ldapprod/<DN>?uid,voipSipPrimaryUri,voipExtensionUri?one?(&(objectClass=voipAddress)(|(voipSipUri=sip:$rU@uio.no)(|(voipSipUri=$var(uri))(voipSipUri=$var(e164uri)))))"); if ($retcode < 1) { switch ($retcode) { case -1: # no LDAP entry found route(11); return(1); case -2: # internal error sl_send_reply("500", "Internal server error"); exit; } } ldap_result("uid/$avp(s:uid)"); $avp(s:exten) = null; if (!ldap_result("voipExtensionUri/$avp(s:exten)")) { xlog("L_INFO", "voipExtensionUri not found.\n"); } if (!ldap_result("voipSipPrimaryUri/$avp(s:p-uri)")) { xlog("L_WARN", "voipSipPrimaryUri not found.\n"); #exit here? } if (isflagset(1)) { xlog("L_INFO", "ROUTE 10: LDAP returned: UID = $avp(s:uid), voipSipPrimaryUri = $avp(s:p-uri), voipExtensionUri = $avp(s:exten)\n"); } if $avp(s:exten) != null { $ru=$avp(s:exten); } else { $ru=$avp(s:p-uri); } route(12); } }
# Number lookup. Non-VoIP URI's go here. route[11] { ... }
# Database lookup for call forwarding. route[12] { ... }
# Call forwarding logic route[13] { if (is_method("INVITE")) { $avp(s:uio_timer_avp) = "300"; if ($avp(s:cfu_status) == "on") { # Forward immediately xlog("L_INFO", "-------------------- $rU forwarded unconditionally to $avp(s:cfu_number). --------------------\n"); $rU = $avp(s:cfu_number); route(10); } ... if ( $var(dlg_busy) >= $avp(s:busy_level) ) { if ($avp(s:cfb_status) == "on") { xlog("L_INFO", "-------------------- $rU has $var(dlg_busy) active calls. Treshold $avp(s:busy_level). Forwarding on busy to $avp(s:cfb_number) --------------------\n"); $rU = $avp(s:cfb_number); route(10); } ... else if ($avp(s:cfnr_status) == "on") { # Forward to phone with timeout then to $avp(s:cfnr_number). # t_set_fr($avp(s:cfnr_timeout) + "000"); # Recommended method in 3.1. Function does not exist in 1.5. Using old method (avp). $avp(s:uio_timer_avp) = $avp(s:cfnr_timeout); xlog("L_INFO", "-------------------- Calling $ru for $avp(s:uio_timer_avp) seconds. --------------------\n"); route(14); } ... }
failure_route[1] { ... if $avp(s:cfnr_status) == "on" { if (isflagset(1)) { xlog("L_INFO", "FAILURE_ROUTE 1: Timeout for: $mi $rm from $fU -> $rU\n"); } revert_uri(); $rU = $avp(s:cfnr_number); xlog("L_INFO", "-------------------- Forwarding on no reply to $rU --------------------\n"); route(10); } ... }
With kind regards, Pan