[OpenSIPS-Users] get_dialog_info Issues

Ross Beer beer.ross at googlemail.com
Wed Sep 1 15:37:25 CEST 2010


Hi Bogdan,

We only require the value to be used for an ongoing call. We need to
use this feature to pass call transfer requests to the correct server,
be that attended or unatended transfers.

The call flow is:

Asterisk --> OpenSip --> Sip Client --| Hold

Sip Client --> OpenSips --> Asterisk --> OpensSips --> New Sip Client

Once the call is answered, the held call will be transfered to the
'New Sip Client'

Asterisk is in the path of every call for MOH and other PBX features.
The call on hold should still be an 'ongoing' call. However it is not
found with the get_dialog_info.

Kind regards,

Ross


On 1 September 2010 14:14, Bogdan-Andrei Iancu <bogdan at voice-system.ro> wrote:
> 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