Hi, Mariana!

Can you check if the variables are properly flushed into the DB after 200OK?
Also, if you only want to check the direction of a sequential request, you could use directly the $DLG_dir [1] pseudovariable from the dialog module.

[1] http://www.opensips.org/html/docs/modules/1.8.x/dialog.html#id295750

Regards,

--
Ra(zvan Crainea
OpenSIPS Developer
http://www.opensips-solutions.com


On 05/15/2012 10:03 PM, Mariana Arduini wrote:
Hello all,

We need to perform some substitutions in the R-URI and Contact header in order to have the following flow working as required:

caller > opensips1 > opensips2 > callee

Currently, opensips1 stores "call_id", "caller_tag" and "caller_contact" Dialog variables using function store_dlg_value() on new INVITES, and "callee_contact" on 200 OK for the INVITES. Later, for sequential requests, it compares the from_tag with the caller_tag, accessed using fetch_dlg_value(), to find out whether it is a request from the caller or from the callee, and it works. Then I started working on failover for opensips1, and that's where I'm facing problems. I'm playing with "db_flush_vals_profiles" new parameter and "dlg_db_sync" new fifo command, both on Dialog module, in order to have a stand by opensips1 taking over the dialogs going on in an active opensips1, in case it fails. This is the test:

1) active opensips is running listening on virtual ip say 10.0.0.1
2) caller sends INVITE to 10.0.0.1, which goes to active opensips
3) active opensips is stopped and it's virtual ip set down; same virtual ip is set up in stand by opensips and it is started; fifo command dlg_db_sync is run on stand by opensips
4) caller sends BYE to 10.0.0.1, which goes to stand by opensips

After loose_route(), stand by opensips cannot fetch_dlg_value for "caller_tag" and the R-URI is set to 0. Then I tried the following, using only one opensips:

1) caller sends INVITE to opensips
2) fifo command dlg_list_ctx is run and shows all of the variables I stored
3) opensips is restarted and fifo command dlg_db_sync is run
4) fifo command dlg_list_ctx is run again and shows only the dialog info, not the variables in context

I also tried get_dialog_info("caller_tag","$var(caller_tag)","call_id","$ci"); and $dlg_val(), but yet the variables are not found:

22232: DBG:dialog:fetch_dlg_value: looking for <caller_tag>
22232: DBG:dialog:fetch_dlg_value: var NOT found!
22232: ERROR:core:do_assign: no value in right expression
22232: ERROR:core:do_assign: error at line: 134
22232: callid(1-5150@192.168.16.154 <mailto:1-5150@192.168.16.154>) trying dlg_val(), caller_tag: 0
22232: DBG:core:comp_scriptvar: str 20 : uac1192.168.16.154
22232: DBG:dialog:fetch_dlg_value: looking for <caller_contact>
22232: DBG:dialog:fetch_dlg_value: var NOT found!
22232: ERROR:core:do_assign: no value in right expression
22232: ERROR:core:do_assign: error at line: 146
22232: callid(1-5150@192.168.16.154 <mailto:1-5150@192.168.16.154>) trying dlg_val(), caller_contact: 0
22232: DBG:tm:t_newtran: transaction on entrance=0xffffffffffffffff
22232: DBG:core:parse_headers: flags=ffffffffffffffff
22232: DBG:core:parse_headers: flags=78
22232: DBG:tm:t_lookup_request: start searching: hash=5130, isACK=0
22232: DBG:tm:matching_3261: RFC3261 transaction matching failed
22232: DBG:tm:t_lookup_request: no transaction found
22232: ERROR:core:parse_uri: uri too short: <0> (1)
22232: ERROR:core:parse_sip_msg_uri: bad uri <0>
22232: DBG:core:set_err_info: ec: 1, el: 3, ei: 'error parsing r-uri'
22232: ERROR:tm:new_t: uri invalid
22232: ERROR:tm:t_newtran: new_t failed

There is no error logs when dlg_db_sync is run. I see in the dialog table a column called from_tag, is there a way to get its content for a certain dialog? It seems the functions get_dialog_info(), fetch_dlg_info() and $dlg_val() only look for variables in the column vars.

Can anyone see other type of solution that does not involve storing/fetching dialog variables? I could take on that.

I'd really appreciate any help on this.

This is my cfg file:

...
modparam("dialog", "db_url", "postgres://opensips:opensips@opensips_db_host:5432/opensips")
modparam("dialog", "db_mode", 1)
modparam("dialog", "db_flush_vals_profiles", 1)
...
route {
...
if(is_method("INVITE")) {
create_dialog();
store_dlg_value("caller_tag", "$ft");
xlog("L_INFO","Storing caller_tag: $ft");
store_dlg_value("caller_contact", "$ct.fields(uri)");
xlog("L_INFO","Storing caller_contact: $ct.fields(uri)");
store_dlg_value("call_id", "$ci");
xlog("L_INFO","Storing call_id: $ci");
                route(1);
        }
...
if (has_totag()) {
# sequential request withing a dialog should
# take the path determined by record-routing
if (loose_route()) {

                    $var(caller_tag) = $dlg_val(caller_tag);
xlog("L_INFO","trying dlg_val(), caller_tag: $var(caller_tag)\n");

                    if ($ft == $var(caller_tag)) {
                        $var(callee_contact) = $dlg_val(callee_contact);
xlog("L_INFO"," trying dlg_val(), callee_contact: $var(callee_contact)\n");
                        $ru = $var(callee_contact);
                    } else {
                        $var(caller_contact) = $dlg_val(caller_contact);
xlog("L_INFO"," trying dlg_val(), caller_contact: $var(caller_contact)\n");
                        $ru = $var(caller_contact);
                    }
}
}
        record_route();
        if (!t_relay()) {
                send_reply("500","Internal Error");
        };
        exit;
}
...
route[1] {
# for INVITEs enable some additional helper routes
if (is_method("INVITE")) {
    $rd="opensips2.domain.com <http://opensips2.domain.com>";
            $rp="5060";

            # Change Contact header
if (subst('/^Contact\s*:\s*("[^"]*")?\s*<?sip:(([^@]*)@)?([^;>]*)((;[^;>]*)*)>?(.*)/Contact: <sip:pl...@my.domain.com <mailto:sip%3apl...@my.domain.com>\5>\7/ig')) {
                xlog("L_DBG","CONTACT was modified");
            }

    t_on_reply("2");
}

}
...
onreply_route[2] {

        if(is_present_hf("Contact")) {
            xlog("L_INFO"," Storing callee_contact: $ct.fields(uri)");
            store_dlg_value("callee_contact", "$ct.fields(uri)");
        }

if (subst('/^Contact\s*:\s*("[^"]*")?\s*<?sip:([^@]*)@[^;>]*((;[^;>]*)*)>?(.*)/Contact: <sip:\2...@my.domain.com <mailto:2...@my.domain.com>\3>\5/ig')) {
            xlog("L_DBG","CONTACT was modified");
        }
}
...



_______________________________________________
Users mailing list
Users@lists.opensips.org
http://lists.opensips.org/cgi-bin/mailman/listinfo/users
_______________________________________________
Users mailing list
Users@lists.opensips.org
http://lists.opensips.org/cgi-bin/mailman/listinfo/users

Reply via email to