[OpenSIPS-Users] get_dialog_info Issues
Bogdan-Andrei Iancu
bogdan at voice-system.ro
Wed Sep 1 15:14:09 CEST 2010
Hi Ross,
Just to be sure, the get_dialog_info () looks only for ongoing call.
Could you briefly describe your call flow, just to understand better
when it works and when it doesn't.
Regards,
Bogdan
Ross Beer wrote:
> Hi Bogdan,
>
> Thank you for the advice, however I do call setflag(4) &
> create_dialog(). Flag 4 is dialog flag.
>
> I have included the routing script below which shows the same method
> but using the dispatcher. The issue here is that the get_dialog_info
> does not find the previous call. Only for the dialogue its already in,
> for example in an invite that requires auth.
>
> It's a strange one and I can't pin point where I have gone wrong :-(
>
>
> # initial sanity checks -- messages with
> # max_forwards==0, or excessively long requests
> if (!mf_process_maxfwd_header("10"))
> {
> sl_send_reply("483","Too Many Hops");
> exit;
> };
>
> if (msg:len >= 3072)
> {
> sl_send_reply("513", "Message too big");
> exit;
> };
>
>
> #---- NAT Detection ----#
> force_rport();
> if (nat_uac_test("19"))
> {
> #force_rport();
> if (method=="REGISTER")
> {
> fix_nated_register();
> }
> else
> {
> fix_nated_contact();
> }
> setflag(5);
> }
>
> if(has_body("application/sdp"))
> {
> if(nat_uac_test("8"))
> {
> fix_nated_sdp("3");
> }
> }
>
>
> # we record-route all messages -- to make sure that
> # subsequent messages will go through our proxy; that's
> # particularly good if upstream and downstream entities
> # use different transport protocol
> if (!method=="REGISTER")
> {
> record_route();
> }
> #
> # # subsequent messages withing a dialog should take the
> # # path determined by record-routing
> if (loose_route())
> {
> # mark routing logic in request
> xlog("Loose Route\n");
> append_hf("P-hint: rr-enforced\r\n");
> route(1);
> };
>
> # handle cancel and re-transmissions
> if ( is_method("CANCEL") ) {
> if ( t_check_trans() )
> t_relay();
> exit;
> }
>
> if(is_method("INVITE"))
> {
> setflag(4);
> create_dialog();
> }
>
>
> # Do Not Allow Publish Or Subscribe
> if( is_method("PUBLISH|SUBSCRIBE"))
> {
> sl_send_reply("508", "Method Not Supported");
> exit;
> }
>
>
>
> # if the request is for other domain use UsrLoc
> # (in case, it does not work, use the following command
> # with proper names and addresses in it)
> if (uri==myself)
> {
> if(method=="REGISTER")
> {
> # Uncomment this if you want to use digest authentication
> if (!www_authorize("", "subscriber")) {
> www_challenge("", "0");
> exit;
> };
>
> #---- Request is behind NAT(flag5) save with bflag 6 ----#
> #---- Use bflag 7 to start SIP pinging (Options) ----#
> if (isflagset(5))
> {
> setbflag(6);
> #setbflag(7);
> };
>
> save("location", "c1f");
> exit;
> };
>
> ##############################
> # HANDLE OPTIONS REPLY #
> ##############################
> if(is_method("OPTIONS"))
> {
> xlog("OPTIONS REPLY - FROM $fU\r\n");
> # send reply for each options request
> sl_send_reply("200", "ok");
> exit();
> }
>
> ##############################
> # HANDLE NOTIFY #
> ##############################
> if(is_method("NOTIFY"))
> {
> # FOR LOCAL USER
> if (!lookup("location"))
> {
> if (get_dialog_info("server","$var(x)","user","$fU"))
> {
> xlog("Log: Belonds to Server:
> $var(x)\n");
> $du=$var(x);
>
> ## ADD VARIABLE TO ROUTE GATEWAY
> $dlg_val(server) = $var(x);
> $dlg_val(user) = $fU;
> route(1);
> exit;
> }
> else
> {
> if(!load_balance("1","pstn"))
> {
> sl_send_reply("500","Service full");
> exit;
> }
> #t_on_failure("1");
> }
> xlog("NOTIFY - Non SIP Client Call
> Sent To $du FROM $fU\r\n");
> }
> xlog("NOTIFY - SIP Client Call Sent To $rU FROM $fU\r\n");
> route(1);
> exit;
>
> }
>
> ##############################
> # HANDLE MESSAGES #
> ##############################
> if (is_method("MESSAGE"))
> {
> if (!proxy_authorize("", "subscriber"))
> {
> proxy_challenge("", "1"); # Realm will be autogenerated
> };
>
> if (!lookup("location"))
> {
> sl_send_reply("404", "Not Found");
> exit;
> };
>
> #xlog("Log: MESSAGE: looked up user\n");
> route(1);
> exit;
> }
>
> ##############################
> # ROUTE CALLS TO DESTINATION #
> ##############################
> if (is_method("INVITE"))
> {
> ######################
> # CALL PICKUP #
> ######################
> if($rU=~"^\*%23[2-9][0-9]{2}")
> {
> route(2);
> exit;
> }
>
> ######################
> # GROUP CALL PICKUP #
> ######################
> if($rU=~"^\*0%23[2-9][0-9]{2}")
> {
> route(2);
> exit;
> }
>
> ######################
> # LOCAL DESTINATIONS #
> ######################
> xlog("Method: $rm rU: $rU\r\n");
> if($rU=~"^[1-9][0-9]{4}\*[2-9][0-9]{2}")
> {
> # FROM LOCAL GATEWAY
> # MARK GATEWAY FOR DIALOGUE
>
> # native SIP destinations are handled using our USRLOC DB
> if (!lookup("location"))
> {
> sl_send_reply("404", "Not Found");
> exit;
> }
>
> $dlg_val(server) = "sip:" + $si + ":5060";
> $dlg_val(user) = $rU;
>
> xlog("Log: looked up user for $dlg_val(server) rU: $rU\n");
> append_hf("P-hint: usrloc applied\r\n");
> route(1);
> exit;
> }
> ############################
> # LOAD BALANCE TO GATEWAYS #
> ############################
> else
> {
>
> if($fU=~"^[1-9][0-9]{4}\*[2-9][0-9]{2}")
> {
> xlog("fu Match: $fU\n");
>
> # IS PART OF EXISTING CALL
> if
> (get_dialog_info("server","$var(x)","user","$fU"))
> {
> xlog("************
> Log: Seen Before Call *************\n");
> xlog("Log: Belonds to
> Server: $var(x)\n");
> $du=$var(x);
>
> ## ADD VARIABLE TO ROUTE GATEWAY
> $dlg_val(server) = $var(x);
> $dlg_val(user) = $fU;
> route(1);
> exit;
> }
> else
> {
> xlog("************ Log: New INVITE *************\n");
> ## LOAD BALANCE
> ds_select_dst("1", "4");
> t_on_failure("1");
>
> xlog("LB Sent To $avp(i:271)\n");
>
> $dlg_val(server) = $avp(i:271);
> $dlg_val(user) = $fU;
> route(1);
> exit;
> }
> }
> }
> # END OF PART OF AN EXISTING CALL ROUTE TO GATEWAY
>
> ## IF NOT A SIP CLIENT JUST LOAD BALANCE
> ## WITHOUT LOGGING WHICH GATEWAY
> ds_select_dst("1", "4");
> t_on_failure("1");
> xlog("Not SIP Client Call Sent To $du FROM $fU\r\n");
> route(1);
> exit;
> }
> # }
> };
>
> route(1);
> }
>
>
> Any further advice would be appreciated.
>
> Kind regards,
>
> Ross
>
> On 1 September 2010 10:50, Bogdan-Andrei Iancu <bogdan at voice-system.ro> wrote:
>
>> Hi Ross,
>>
>> To use get_dialog_info() and dlg_val's you must create the dialog before
>> (see create_dialog() function in dialog module) - otherwise all dialog
>> ops are invalid.
>>
>> Regards,
>> Bogdan
>>
>> Ross Beer wrote:
>>
>>> Hi,
>>>
>>> I am using the following piece of code to set dlg_val and then using
>>> get_dialog_info to check to see if a user already has a call and if so
>>> pass the new call to the same gateway for attended transfer.
>>>
>>> The code works perfectly if in the same dialog, i.e. when an invite is
>>> sent and then requires authentication however it does not appear to
>>> match any results across different dialogs. Also I can not see any
>>> values in the 'vars' column in the dialog database.
>>>
>>> Am I using the feature correctly?
>>>
>>> # IS PART OF EXISTING CALL
>>> if (get_dialog_info("server","$var(x)","user","$fU"))
>>> {
>>> xlog("************Log: Seen Before Call *************\n");
>>> xlog("Log: Belonds to server: $var(x)\n");
>>> $du=$var(x);
>>> ## ADD VARIABLE TO ROUTE GATEWAY
>>> $dlg_val("server") = $var(x);
>>> $dlg_val("user") = $fU;
>>> route(1);
>>> exit;
>>> }
>>> else
>>> {
>>> xlog("************Log: New INVITE *************\n");
>>> ds_select_dst("1", "4");
>>> xlog("LB Sent To $avp(i:271)\n");
>>>
>>> store_dlg_value("server","$avp(i:271)");
>>> store_dlg_value("user","$fU");
>>> #$dlg_val(server) = $avp(i:271);
>>> #$dlg_val(user) = $fU;
>>> route(1);
>>> exit;
>>> }
>>>
>>> Kind regards,
>>>
>>> Ross
>>>
>>> PS - Sorry this is a duplicate but my gmail account doesn't seam to
>>> post messages to the mailing list
>>> ------------------------------------------------------------------------
>>>
>>> _______________________________________________
>>> Users mailing list
>>> Users at lists.opensips.org
>>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>>>
>>>
>> --
>> Bogdan-Andrei Iancu
>> OpenSIPS Bootcamp
>> 20 - 24 September 2010, Frankfurt, Germany
>> www.voice-system.ro
>>
>>
>> _______________________________________________
>> Users mailing list
>> Users at lists.opensips.org
>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>>
>>
>
>
--
Bogdan-Andrei Iancu
OpenSIPS Bootcamp
20 - 24 September 2010, Frankfurt, Germany
www.voice-system.ro
More information about the Users
mailing list