[SR-Users] Kamailio 3.x and Asterisk Realtime Integration plus Dispatcher module

Barry Flanagan barry at flanagan.ie
Tue Apr 30 13:52:29 CEST 2013


On 29 April 2013 14:51, Aldo Antignano <aldo at antignano.it> wrote:

> I have read and applied the excellent guide found on:
> http://kb.asipto.com/asterisk:realtime:kamailio-3.3.x-asterisk-10.7.0-astdb
>
> Now I have added to Kamailio the HA/Load Balancer support, with the
> "dispatcher" module.
> This way I have 1 Kamailio and 2 Asterisk machines.
>
> How can I change the routing logic of the sections route[REGFWD] |
> route[FROMASTERISK] route[TOASTERISK] to use the dispatcher module? (in the
> guide above the asterisk binded ip address is cabled in the kamailio config
> code)
>

I have done that. Relevant route entries below.

# Forward REGISTER to Asterisk
route[REGFWD] {
if(!is_method("REGISTER"))
 {
return;
}

# for each Asterisk server in setid=2 (External) we send a registration on
behalf of the user.
 sql_xquery("ca", "SELECT SUBSTRING_INDEX(destination,':',-1) AS port,
SUBSTRING_INDEX(SUBSTRING(destination,5),':',1) AS address
 FROM dispatcher WHERE setid = 2", "ra");
$var(i) = 0;
    while($xavp(ra[$var(i)]) != $null)
    {
$var(rip) = $xavp(ra[$var(i)]=>address);
$uac_req(method)="REGISTER";
$uac_req(ruri)="sip:" + $var(rip) + ":" + $xavp(ra[$var(i)]=>port);
 $uac_req(furi)="sip:" + $au + "@" + $var(rip);
$uac_req(turi)="sip:" + $au + "@" + $var(rip);
 $uac_req(hdrs)="Contact: <sip:" + $au +  "@"
+ $sel(cfg_get.kamailio.bindip)
 + ":" + $sel(cfg_get.kamailio.bindport) + ">\r\n";
if($sel(contact.expires) != $null)
 $uac_req(hdrs)= $uac_req(hdrs) + "Expires: " + $sel(contact.expires) +
"\r\n";
else
 $uac_req(hdrs)= $uac_req(hdrs) + "Expires: " + $hdr(Expires) + "\r\n";
uac_req_send();
        $var(i) = $var(i) + 1;
    }
 sql_result_free("ra");

}

# Test if coming from Asterisk. We check the dispatcher "ds_is_from_list()"
function to see if this is one of our Asterisk IPs
route[FROMASTERISK] {
if(ds_is_from_list())
{
return 1;
 } else {
return -1;
}
}

# Send to Asterisk
route[TOASTERISK] {

# If call comes in to the .75 iface, we need to send it to the .75 iface of
Asterisk as well.
 # otherwise we send to the .76 iface. We do this by calling different
dispatcher sets. This is
# because Asterisk needs to use NAT on the .76. (public) interface but not
on the .75.
 if($td=~"10.5.75.")
{
$var(setid) = 4;
 xlog("SCRIPT: Call to 10.5.75. ip - using set $var(setid) \n");
} else {
$var(setid) = 2;
 xlog("SCRIPT: Call from $fn to 10.5.76. ip - using set $var(setid) \n");
}
    # round robin dispatching on set determined above
    if(!ds_select_dst($var(setid), "4"))
    {
        send_reply("404", "No destination");
        exit;
    }
    t_on_failure("RTF_DISPATCH");
    route(RELAY);
  exit;
}




Hope this helps.

-Barry Flanagan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20130430/6ad78e40/attachment.html>


More information about the sr-users mailing list