[OpenSIPS-Users] Load balancer and CANCEL requests

Bogdan-Andrei Iancu bogdan at voice-system.ro
Thu Sep 24 12:15:16 CEST 2009


Hi Peter,

Indeed, this makes more sense  than the version I sent you - I update 
the script in the tutorial too.

Thanks and regards,
Bogdan

Peter P GMX wrote:
> Hello,
>
> I put some additional code to handle the cancel request. Now ist works.
> Here is the code I put :
> # CANCEL processing
> if (is_method("CANCEL")) {
> if (t_check_trans())
> t_relay();
> exit;
> }
>
> Best regards
> Peter
>
>
> Peter P GMX schrieb:
>   
>> Hello Bogdan,
>>
>> we only very slightly modified the openser.cfg:
>> We only added the
>> REGISTER in
>> if (!is_method("INVITE") && !is_method("REGISTER")){
>> in order to balance resgisters to the Freeswitch cluster.
>>
>> and added
>> # Load Balancing only for my.domain
>> if ($td=~"^my.domain") {
>> in order to handle outbound requests to other phones through OpenSIPS.
>> This is needed to produce our test case when making a call between 2 phones.
>>
>> While putting in some debugging lines I found out that
>> # handle cancel and re-transmissions
>> if ( !t_check_trans() ) {
>> if (is_method("CANCEL")) {
>> is not successful during the cancel request. So !t_check_trans() seems
>> to be false in that case as ismethod("CANCEL") is not called.
>> Then is continues the script and sends a 405 message.
>>
>> Howwver the INVITE and CANCEL reequest had the same call-id.
>>
>> Here's my opensips.conf:
>> =========================
>> debug=1
>> memlog=1
>>
>> fork=yes
>> children=2
>> log_stderror=no
>> log_facility=LOG_LOCAL0
>>
>> disable_tcp=yes
>> disable_dns_blacklist = yes
>>
>> auto_aliases=no
>>
>> check_via=no
>> dns=off
>> rev_dns=off
>>
>> listen=udp:xx.xx.xx.xx:5060
>> alias=udp:my.domain:5060
>>
>> mpath="/usr/local/lib64/opensips/modules/"
>>
>> loadmodule "maxfwd.so"
>> loadmodule "sl.so"
>> loadmodule "db_mysql.so"
>> loadmodule "tm.so"
>> loadmodule "xlog.so"
>> loadmodule "uri.so"
>> loadmodule "rr.so"
>> loadmodule "dialog.so"
>> loadmodule "mi_fifo.so"
>> #loadmodule "mi_xmlrpc.so"
>> loadmodule "signaling.so"
>> loadmodule "textops.so"
>> loadmodule "load_balancer.so"
>>
>> modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
>>
>> modparam("dialog", "dlg_flag", 13)
>> modparam("dialog", "db_mode", 1)
>> modparam("dialog", "db_url", "mysql://user:pass@localhost/opensips")
>>
>> modparam("rr","enable_double_rr",1)
>> modparam("rr","append_fromtag",1)
>>
>> modparam("load_balancer", "db_url","mysql://user:pass@localhost/opensips")
>>
>>
>> route{
>> if (!mf_process_maxfwd_header("3")) {
>> sl_send_reply("483","looping");
>> exit;
>> }
>>
>>
>> if (!has_totag()) {
>> # initial request
>> record_route();
>> } else {
>> # sequential request -> obey Route indication
>> loose_route();
>> t_relay();
>> exit;
>> }
>>
>> # handle cancel and re-transmissions
>> if ( !t_check_trans() ) {
>> if (is_method("CANCEL")) {
>> exit;
>> }
>> }
>>
>>
>> # from now on we have only the initial requests
>> if (!is_method("INVITE") && !is_method("REGISTER")){
>> send_reply("405","Method Not Allowed");
>> exit;
>> }
>>
>> # Load Balancing only for my.domain
>> if ($td=~"^my.domain") {
>> # detect resources and do balancing
>> if ($rU=~"^conference") {
>> # looks like a Conference call
>> load_balance("1","conf");
>> } else if ($rU=~"^voicemail") {
>> # looks like a VoiceMail call
>> load_balance("1","vm");
>> } else {
>> # Forward to the freeswitches
>> load_balance("1","freeswitch");
>> }
>>
>> # LB function returns negative if no suitable destination (for requested
>> resources) is found,
>> # or if all destinations are full
>> if ($retcode<0) {
>> sl_send_reply("500","Service full");
>> exit;
>> }
>>
>> xlog("Selected destination is: $du\n");
>> }
>>
>> # send it out for all domains
>> if (!t_relay()) {
>> sl_reply_error();
>> }
>> }
>>
>>
>> Bogdan-Andrei Iancu schrieb:
>>   
>>     
>>> Hello Peter,
>>>
>>> First of all the script from the tutorial does LB only for initial 
>>> requests, requests that are creating a dialog (like INVITE). All other 
>>> sequential requests (in dialog requests) are routed based on Route 
>>> header, directly to the FS where the call was sent.
>>>
>>> The CANCELs are processed in a stateful way. The CANCELs are matched 
>>> against the INVITE transaction and automatically sent to the same 
>>> destination where the INVITE was sent. The relevant script part is:
>>>
>>>         # handle cancel and re-transmissions
>>> 	if ( !t_check_trans() ) {
>>> 		if (is_method("CANCEL"))
>>> 			exit;
>>> 	}
>>>
>>>
>>> So, the script does properly handle the CANCELs and there is nothing 
>>> else required to make it work.
>>>
>>> My question is, using the script as per tutorial (no changes of yours), 
>>> what happens when OpenSIPS does receive a CANCEL?
>>>
>>> Regards,
>>> Bogdan
>>>
>>> Peter P GMX wrote:
>>>   
>>>     
>>>       
>>>> Hello,
>>>>
>>>> I am using the load balancer in front of a Freeswitch cluster.
>>>> Freeswitch is always in the SIP route.
>>>> It handles Registers and Invites quite well.
>>>>
>>>> However CANCEL is not working according to the tutorial in
>>>> http://www.opensips.org/index.php?n=Resources.DocsTutLoadbalancing
>>>>
>>>> CANCEL requests are aborted with 405 Method Not Allowed.
>>>> I understand that CANCELS should not be balanced as it cannot be forseen
>>>> which Freeswitch will receive this CANCEL request, right? Or does the
>>>> load balancer handle this correctly based on a call id?
>>>>
>>>> So I tried to allow CANCEL in
>>>>
>>>>  if (!is_method("INVITE") && !is_method("REGISTER")) &&
>>>> !is_method("CANCEL")) {
>>>> ...
>>>>
>>>> This leads to "500 Service full", means some error occured.
>>>>
>>>> Question: How can I handle the CANCEL request correctly?
>>>>
>>>> Best regards
>>>> Peter
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Users mailing list
>>>> Users at lists.opensips.org
>>>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>>>>
>>>>   
>>>>     
>>>>       
>>>>         
>>> _______________________________________________
>>> Users mailing list
>>> Users at lists.opensips.org
>>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>>>
>>>   
>>>     
>>>       
>> _______________________________________________
>> Users mailing list
>> Users at lists.opensips.org
>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>>
>>   
>>     
>
> _______________________________________________
> Users mailing list
> Users at lists.opensips.org
> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>
>   




More information about the Users mailing list