On 12/28/10 11:28 AM, Daniel-Constantin Mierla wrote:
Hello,

looking in the sources, at least for 3.x, ldap module does not connect to server from timer process, the one that executes failure route for local timeout.

I will fix it.
Seemed to be a feature -- ldap module had it this way from its beginning. I committed the update that should create connection to Ldap server from timer processes, so the functions should work now in failure route in all cases.

The patch was committed on svn branch 1.5 as well, you need to fetch the latest version from there and reinstall in order to try it.

Let me know if all works fine now.

Daniel


Cheers,
Daniel

On 12/27/10 5:03 PM, Pan B. Christensen wrote:
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
_______________________________________________ SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list sr-users@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users

-- 
Daniel-Constantin Mierla
Kamailio (OpenSER) Advanced Training
Jan 24-26, 2011, Irvine, CA, USA
http://www.asipto.com
_______________________________________________ SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list sr-users@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users

-- 
Daniel-Constantin Mierla
Kamailio (OpenSER) Advanced Training
Jan 24-26, 2011, Irvine, CA, USA
http://www.asipto.com