I am working to get LCR (Least Cost Routing) working with Freeswitch. Using mod_lcr in Freeswitch 1.4.9. I have set it up and it is working. My install is actually a FusionPBX instance, but this should not matter for the following discussion.

The problem is - I want to set the caller-ID for specific routes (i.e. digits) and I am using regexes in the cid column of the LCR table, as per the documentation.

It is working inasmuch I can see in the output and logs that this sets the "origination_caller_id_number" variable. However, the destination phone does not show that caller-ID.

Also if I set this variable "origination_caller_id_number" in the dial plan without LCR it does not get used seemingly and the callee never sees it.

If I set "effective_caller_id_name" then the callee sees it.

Next I tried: use LCR in the dial plan as application, then set effective_caller_id_name = ${origination_caller_id_number}, which should have been set by the LCR app, then call BRIDGE with the "auto_lcr_route" variable.

See the XML here:

<extension name="LCR.Route.1" >
   <condition field="destination_number" expression="^300(\d{9,17})$" >
       <action application="set" data="sip_h_X-accountcode=${accountcode}" />
       <action application="set" data="sip_h_X-Tag=" />
       <action application="set" data="call_direction=outbound" />
       <action application="set" data="hangup_after_bridge=true" />
       <action application="set" data="inherit_codec=true" />
       <action application="set" data="continue_on_fail=true" />
       <action application="lcr" data="$1" />
       <action application="set" data="effective_caller_id_name=${origination_caller_id_number}" />
       <action application="bridge" data="${lcr_auto_route}" />

The call completes successfully but it does not set the "effective_caller_id_name" at all.

The FusionPBX CDR data "Application log section" shows

Application Log     
Name    Data
set     call_direction=outbound 
set     call_direction=outbound 
set     hangup_after_bridge=true 
set     inherit_codec=true 
set     continue_on_fail=true 
lcr     xxxxxxxx
set     effective_caller_id_name=                           <--------- nothing set here. Phone shows SIP "FROM" user.
bridge      [lcr_carrier=carrier1,lcr_rate=0.15552,origination_caller_id_number=

As you can see from this log, the "origination_caller_id_number" SHOULD have been set after the LCR application has been run.

It seems that when LCR sets "origination_caller_id_number", it is in another scope and cannot be retrieved from the dialplan?

So there are two questions:

  1. Why does the caller ID not show when the bridge application uses the variable "origination_caller_id_number"?

Chances are that the receiving phone provider may not understand what's being sent, or maybe only uses "..._name" instead of "..._number" - but mod_lcr only sets that one variable - which brings me to the 2nd question:

  1. Is the variable actually being set by running the LCR application, or does this happen only upon executing BRIDGE?


  1. Why can I not set "effective_caller_id_name" by retrieving the value of "origination_caller_id_number"? the value is apparently being set by the LCR application but I cannot retrieve it from the dialplan. The Freeswitch documentation is very hazy about scoping issues - so is this normal? Can I do something to get to that value?

I worked it out myself.

To answer the questions:

  1. Whether the number shows as caller-ID on the remote phone depends on the service provider / carrier (mainly the one of the originating end).

  2. No, the LCR application does not set the channel variables. It does set a few variables of its own, the most notable being "auto_lcr_route". This contains the result value of the LCR call. Only when calling "BRIDGE" will channel variables get set.

  3. That is answered in (2) - no variables were set at this stage, except "lcr_auto_route". So after all, it isn't a scoping issue.

The way I solved it was to extract the "origination_caller_id_number" value from the lcr_auto_route variable value with a regex, like so:

<action application="lcr" data="$1" />
<action application="set" data="effective_caller_id_name=${regex(m:~${lcr_auto_route}~^(.*)origination_caller_id_number=(.*?)](.*)$~%2)}" />
<action application="bridge" data="${lcr_auto_route}" />

Note that you need to use the ~ character and prefix the regex with "m:" (and not the usual "|") because auto_lcr_route may contain multiple calling routes separated by a "|" character.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.