[OpenSIPS-Users] Public IP dispatcher and private ip presence servers

surya chauhan.suryaveer at gmail.com
Thu Oct 20 06:39:36 CEST 2016


Hi Bogdan,

Thanks for the answer. I tried the record-route but that created loop
between dispatcher and the presence server, I started getting too many hops
in both. Sample this:

/Oct 19 23:07:40 [73] DBG:core:build_res_buf_from_sip_res: copied size:
orig:90, new: 26, rest: 362 msg=
SIP/2.0 483 To Many HopsVia: SIP/2.0/UDP
172.17.0.5:5060;branch=z9hG4bK79ea.2ab64515.0
Via: SIP/2.0/UDP 172.17.0.2:5060;branch=z9hG4bK79ea.1ab64515.0
Via: SIP/2.0/UDP 172.17.0.5:5060;branch=z9hG4bK79ea.1ab64515.0
Via: SIP/2.0/UDP 172.17.0.2:5060;branch=z9hG4bK79ea.0ab64515.0
Via: SIP/2.0/UDP 172.17.0.5:5060;branch=z9hG4bK79ea.0ab64515.0
To: <sip:service at opensipstest.org>;tag=1
From:
<sip:service-1 at opensipstest.org>;tag=80675298202cdedfab05883cddeed060-0467
CSeq: 1 NOTIFY
Call-ID: 1-20 at 172.17.0.4
Server: OpenSIPS (1.8.4-notls (x86_64/linux))
Content-Length: 0/

here 0.2 is dispatcher, 0.5 is presence server and request comes from 0.4.

The config for dispatcher:
---------------------------------------------------------------------------
route{
        if ( !mf_process_maxfwd_header("10") )
        {
                send_reply("483","To Many Hops");
                exit;
        };
#I added this. Need some condition checks??
      *   if(method=="SUBSCRIBE")
        {
             record_route();
        }*
        if ( !ds_select_dst("1", "4") ) {
                send_reply("500","Unable to route");
                exit;
        }
forward();
#       t_relay();
}
---------------------------------------------------------------------------

Config for presence
---------------------------------------------------------------------------
# main request routing logic

route{


        if (!mf_process_maxfwd_header("10")) {
                sl_send_reply("483","Too Many Hops");
                exit;
        }

        if (has_totag()) {
                # sequential request withing a dialog should
                # take the path determined by record-routing
                if (loose_route()) {

                        if (is_method("BYE")) {
                                setflag(1); # do accounting ...
                                setflag(3); # ... even if the transaction
fails
                        } else if (is_method("INVITE")) {
                                # even if in most of the cases is useless,
do RR for
                                # re-INVITEs alos, as some buggy clients do
change route set
                                # during the dialog.
                                record_route();
                        }



                        # route it out to whatever destination was set by
loose_route()
                        # in $du (destination URI).
                        route(1);
                } else {
                        if (is_method("SUBSCRIBE") && $rd ==
"172.17.0.5:5060") { # CUSTOMIZE ME
                                # in-dialog subscribe requests
                                route(2);
                                exit;
                        }
                        if ( is_method("ACK") ) {
                                if ( t_check_trans() ) {
                                        # non loose-route, but stateful ACK;
must be an ACK after
                                        # a 487 or e.g. 404 from upstream
server
                                        t_relay();
                                        exit;
                                } else {
                                        # ACK without matching transaction
->
                                        # ignore and discard
                                        exit;
                                }
                        }
                        sl_send_reply("404","Not here");
                }
                exit;
        }

        # CANCEL processing
        if (is_method("CANCEL"))
        {
                if (t_check_trans())
                        t_relay();
                exit;
        }

        t_check_trans();

        if ( !(is_method("REGISTER")  ) ) {

                if (from_uri==myself)

                {

                } else {
                        # if caller is not local, then called number must be
local

                        if (!uri==myself) {
                                send_reply("403","Rely forbidden");
                                exit;
                        }
                }

        }

        # preloaded route checking
        if (loose_route()) {
                xlog("L_ERR",
                "Attempt to route with preloaded Route's
[$fu/$tu/$ru/$ci]");
                if (!is_method("ACK"))
                        sl_send_reply("403","Preload Route denied");
                exit;
        }

        # record routing
        if (!is_method("REGISTER|MESSAGE"))
                record_route();

        # account only INVITEs
        if (is_method("INVITE")) {

                setflag(1); # do accounting
        }


        if (!uri==myself) {
                append_hf("P-hint: outbound\r\n");

                route(1);
        }

        # requests for my domain

        if( is_method("PUBLISH|SUBSCRIBE"))
                        route(2);

        if (is_method("REGISTER"))
        {


                if ( proto==TCP ||  0 ) setflag(7);

                if (!save("location"))
                        sl_reply_error();

                exit;
        }

        if ($rU==NULL) {
                # request with no Username in RURI
                sl_send_reply("484","Address Incomplete");
                exit;
        }







        # do lookup with method filtering
        if (!lookup("location","m")) {


                t_newtran();
                t_reply("404", "Not Found");
                exit;
        }



        # when routing via usrloc, log the missed calls also
        setflag(2);
        route(1);
}


route[1] {
        # for INVITEs enable some additional helper routes
        if (is_method("INVITE")) {



                t_on_branch("2");
                t_on_reply("2");
                t_on_failure("1");
        }



        if (!t_relay()) {
                send_reply("500","Internal Error");
        };
        exit;
}


# Presence route
route[2]
{
        if (!t_newtran())
        {
                sl_reply_error();
                exit;
        }

        if(is_method("PUBLISH"))
        {
                force_rport();
                handle_publish();
        }
        else
        if( is_method("SUBSCRIBE"))
        {
                force_rport();
                handle_subscribe();
        }

        exit;
}


branch_route[2] {
        xlog("new branch at $ru\n");
}


onreply_route[2] {

        xlog("incoming reply\n");
}


failure_route[1] {
        if (t_was_cancelled()) {
                exit;
        }

        # uncomment the following lines if you want to block client
        # redirect based on 3xx replies.
        ##if (t_check_status("3[0-9][0-9]")) {
        ##t_reply("404","Not found");
        ##      exit;
        ##}


}
---------------------------------------------------------------------------

The config of presence is as generated from the tool, I just added
force_rport().

I do not have any idea why this is happening.

Appreciate your help again.

Thanks,
Surya



--
View this message in context: http://opensips-open-sip-server.1449251.n2.nabble.com/Public-IP-dispatcher-and-private-ip-presence-servers-tp7604684p7604701.html
Sent from the OpenSIPS - Users mailing list archive at Nabble.com.



More information about the Users mailing list