[SR-Users] How to forward REGISTERs to Asterisk in kamailio with dispatcher module with several Asterisk PBXs?

Tickling Contest tickling.contest at gmail.com
Sun Jul 24 02:07:18 CEST 2016


I corrected an error with my dispatcher configuration and now, I do hit the
code where

ds_select_dst ("1", "4")

is no longer null.

However, while the xlog I added says uac_req_send () is called, nothing is
sent. The xlog prints out the value of $uac_req(hdrs) as

 Contact: <sip:101 at 192.168.1.101:5060>#015#012Expires: 600#015

after which the uac_req_send () is called.

I am not sure if this is the correct way? What am I missing?

Oh, nothing shows up in the tcpdump trace (only the OPTIONS message for the
asterisk<->kamailio peering shows up).

On Sat, Jul 23, 2016 at 3:48 PM, Tickling Contest <
tickling.contest at gmail.com> wrote:

> Thanks, guys!
>
> Sammy, I tried your code in REGFWD, but unfortunately, it does not forward
> anything to Asterisk. I can confirm this because it keeps going into the
> else clause in the REGFWD (which I added to confirm). My current REGFWD
> looks like this:
>
> route[REGFWD] {
>         if(!is_method("REGISTER"))
>         {
>                 return;
>         }
>         xlog ("L_DEBUG", "MYDEBUG: In REGFWD");
>         if(!ds_select_dst("1", "4"))    {
>                $var(rip) = $(du{s.select,1,:});
>                $var(rport) = $(du{s.select,2,:});
>                $uac_req(method)="REGISTER";
>                $uac_req(ruri)="sip:" + $var(rip) + ":" + $var(rport) +
> ";transport=tcp";
>                $uac_req(furi)="sip:" + $au + "@" + $var(rip);
>                $uac_req(turi)="sip:" + $au + "@" + $var(rip);
>                $uac_req(hdrs)="Contact: <sip:" + $au + "@
> 192.168.1.101:5060" + ">\r\n";
>                 xlog ("L_DEBUG", "MYDEBUG: In REGFWD, sending registration
> info to Asterisk at $uac_req(ruri)");
>                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();
>         }
>         else
>         {
>                 xlog ("L_DEBUG", "In REGFWD, not forwarding!");
>         }
>
> }
>
>
>
> My entire kamailio.cfg file is here:
> https://gist.github.com/ticklingcontest/f96aa4d08b08dc4643056d73da24f0a5
>
> Any insight is appreciated. Thanks again.
>
> My dispatcher at the moment has only one Asterisk server. My endpoint
> registers (auth with realtime DB in Mysql), but the registration
> information does not reach Asterisk.
>
> My kamailio box is peering with the asterisk box like so:
>
> root at asterisk:~# more /etc/asterisk/pjsip_wizard.conf
> [kamailio]
> type = wizard
> sends_auth = no
> sends_registrations = no
> remote_hosts = 192.168.1.101
> server_uri_pattern = sip:${REMOTE_HOST}\;transport=tcp
> client_uri_pattern = sip:${REMOTE_HOST}\;transport=tcp
> contact_pattern = sip:${REMOTE_HOST}\;transport=tcp
> outbound_auth/username = dispatcher
> aor/qualify_frequency = 0
> endpoint/context = from-external ;;; change later
> endpoint/disallow = all ;;; change later
> endpoint/allow = ulaw ;;; change later
> endpoint/dtmf_mode=rfc4733
> endpoint/media_address=192.168.1.101 ;;
> aor/qualify_frequency = 15
>
> BTW, my intention is to store the registrations on the Asterisk servers as
> well as my ARI code depends on it. As soon I get the single Asterisk
> situation working, I intend adding more servers to check the load balancing
> and REGISTER forwarding, and to Colin's point, the business of just using
> Kamailio as an outbound proxy.
>
> Again, any insight wrt why no REGISTERs are forwarding to Asterisk is
> appreciated. Why is ds_select_dst("1", "4") evaluating to false for me?
>
> My dispatcher info:
>
> root at kamailio:/etc/kamailio# kamctl dispatcher show
> dispatcher gateways
> +----+-------+-------------------+-------+----------+-------+-------------+
> | id | setid | destination       | flags | priority | attrs | description |
> +----+-------+-------------------+-------+----------+-------+-------------+
> |  1 |     1 | sip:192.168.1.102 |     1 |        0 |       | AsteriskA   |
> |  2 |     1 | sip:192.168.1.102 |     1 |        0 |       | AsteriskA   |
> +----+-------+-------------------+-------+----------+-------+-------------+
>
>
> Thanks!
>
> On Fri, Jul 22, 2016 at 11:01 AM, Colin Morelli <colin.morelli at gmail.com>
> wrote:
>
>> If you're using Kamailio as a registrar, then it would make the most
>> sense to also use it as your outbound proxy for Asterisk.
>>
>> This would mean whenever Asterisk needs to dial an extension, it would
>> instead make a SIP call to your Kamailio instance which would then perform
>> the lookup, forking, and forwarding.
>>
>> Is there a reason this wouldn't work in your infrastructure? If for some
>> reason it can't - though I can't imagine how - then I don't see the purpose
>> in using Kamailio as a registrar at all. You should just forward everything
>> to Asterisk since it needs to be there anyway.
>>
>> Best,
>> Colin
>>
>> On Fri, Jul 22, 2016 at 9:58 AM SamyGo <govoiper at gmail.com> wrote:
>>
>>> Hi Tickles,
>>>
>>> a) Have you tried doing this on Asterisk realtime ? for any regular
>>> direct registering extension w/o kamailio(even before kamailio) ? If an
>>> extension registers to one asterisk the rest of the boxes would know where
>>> to contact this extension via realtime-db ? I'd say give that a try and it
>>> may solve your problem, else using this REGFWD block you can parallel fork
>>> this register request to ALL of your boxes and everybox would think it is
>>> registered locally ! (not a recommended option I must say)
>>>
>>> b) If you ignore my previous comment of parallel forking registers,
>>> using this  REGFWD block you can use dispatcher module to replace the
>>> $var(rip) and $sel(cfg_get.asterisk.bindport) by changing your REGFWD
>>> block like this:
>>>
>>> route[REGFWD] {
>>>         if(!is_method("REGISTER"))
>>>         {
>>>                 return;
>>>         }
>>>         if(!ds_select_dst("1", "4"))    {
>>>                $var(rip) = $(du{s.select,1,:});
>>>                $var(rport) = $(du{s.select,2,:});
>>>                $uac_req(method)="REGISTER";
>>>                $uac_req(ruri)="sip:" + $var(rip) + ":" + $var(rport) +
>>> ";transport=tcp";
>>>                $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();
>>>         }
>>>
>>> }
>>>
>>>
>>> In summary, depending upon your business logic/use case there could be
>>> other ways to make this work as well.
>>>
>>> Regards,
>>> Sammy
>>>
>>>
>>> On Fri, Jul 22, 2016 at 8:53 AM, Tickling Contest <
>>> tickling.contest at gmail.com> wrote:
>>>
>>>> Hello,
>>>>
>>>> When using Kamailio with the dispatcher module for Asterisk load
>>>> balancing, I am offloading REGISTERs to Kamailio (works fine), but would
>>>> like to forward the REGISTERs to Asterisk so that outgoing calls from
>>>> Asterisk will be possible. I know this is not strictly necessary (e.g.,
>>>> just use Kamailio to forward everything), but I have a lot of application
>>>> logic behind my Asterisk boxes (using ARI) and so I don't want that to
>>>> break. Thereby, I do need this information in Asterisk as soon as possible
>>>> from Kamailio.
>>>>
>>>> Let's say I have three boxes Asterisk_1, Asterisk_2 and Asterisk_3 in
>>>> the dispatcher module like so:
>>>>
>>>> 1 sip:192.168.1.201:5060;transport=tcp
>>>> 1 sip:192.168.1.202:5060;transport=tcp
>>>> 1 sip:192.168.1.203:5060;transport=tcp
>>>>
>>>> My system has endpoints as numerical extensions, from 101 to 110. When
>>>> a new endpoint registers with kamailio (and authenticates), I would like to
>>>> send the REGISTER to Asterisk. But I have the following questions:
>>>>
>>>> (a) Which Asterisk? I could send it to a round-robinned Asterisk (say,
>>>> Asterisk_2), but that Asterisk may not be the one responsible for handling
>>>> calls outbound for the endpoint that just registered. Even if I use "hash
>>>> over auth username" instead of round-robin (In
>>>> http://www.kamailio.org/docs/modules/4.0.x/modules/dispatcher.html#idp16940048,
>>>> choose 5 for "alg", for example) that wont solve this problem as an
>>>> outbound request may come from another Asterisk box which won't have the
>>>> requisite registration information. Should I forward REGISTERs to all
>>>> Asterisk boxes? Maybe I won't have to deal with this issue as I use
>>>> realtime and so the REGISTER information, sent to one Asterisk box, is
>>>> available to all Asterisk boxes after the write to the realtime DB. Is my
>>>> understanding correct?
>>>>
>>>> (b) How do I do this in kamailio.cfg? With some examples on the
>>>> Internet for WITH_ASTERISK directive, I see that you do
>>>>
>>>> route[REGFWD] {
>>>>         if(!is_method("REGISTER"))
>>>>         {
>>>>                 return;
>>>>         }
>>>>         $var(rip) = $sel(cfg_get.asterisk.bindip);
>>>>         $uac_req(method)="REGISTER";
>>>>         $uac_req(ruri)="sip:" + $var(rip) + ":" +
>>>> $sel(cfg_get.asterisk.bindport) + ";transport=tcp";
>>>>         $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();
>>>> }
>>>>
>>>> What is the equivalent for when you are using the dispatcher module and
>>>> the kamailio.bindip and asterisk.bindip etc. are not set in the
>>>> configuration, but instead should be procured from elsewhere?
>>>>
>>>> Any help is appreciated.
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
>>>> sr-users at lists.sip-router.org
>>>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>>>
>>>>
>>> _______________________________________________
>>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
>>> sr-users at lists.sip-router.org
>>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>>
>>
>> _______________________________________________
>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
>> sr-users at lists.sip-router.org
>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20160723/736a9d3e/attachment.html>


More information about the sr-users mailing list