No subject


Mon Nov 25 18:50:14 CET 2013


messages ( using sip MESSAGE request ) or sending call invites.
Sometimes it works well and fast, sometimes it doesn't, sometimes
messages are delivered very slowly. With two last options ( doesn't
work at all and/or messages are delivered slowly ), I get the
following errors:

ERROR:core:tcp_blocking_connect: timeout 10 s elapsed from 10 s
ERROR:core:tcpconn_connect: tcp_blocking_connect failed
ERROR:core:tcp_send: connect failed
ERROR:tm:msg_send: tcp_send failed
ERROR:tm:t_forward_nonack: sending request failed

My devices are behind NAT ( mobile phones ) and I am using pjsip with
tcp connection.
Moreover I am trying to set up a persistent connection and hope, that
server will reuse it, when it needs to send something. I am sending
keep-alive packets every 600 seconds and I am not using any STUN or
TURN servers.

My opensips and rtpproxy are running on EC2, so are behind NAT as well.
And I don't have any STUN or TURN servers intalled ( should I install
any of it? )

Any help, advice or suggestions would be highly appreciated!
Here is my opensips.cfg, please help:

debug=3
log_stderror=no
log_facility=LOG_LOCAL1

fork=yes
children=4

dns=no
rev_dns=no

disable_tcp=no

listen=udp:private-ip:5060   # CUSTOMIZE ME
listen=tcp:private-ip:5060

advertised_address="public-ip"
alias="public-ip:5060"
alias="domain.com:5060" #// NB!! domain address is not associated with
public-ip ( using A record )

db_default_url="mysql://opensips:opensipsrw@database-url/opensips"

mpath="/usr/lib64/opensips/modules/"

### MYSQL module
loadmodule "db_mysql.so"

### Domain module
loadmodule "domain.so"
modparam("domain", "db_url",
"mysql://opensips:opensipsrw@database-url/opensips")


#### SIGNALING module
loadmodule "signaling.so"

#### StateLess module
loadmodule "sl.so"

#### Transaction Module
loadmodule "tm.so"
modparam("tm", "fr_timer", 5)
modparam("tm", "fr_inv_timer", 30)
modparam("tm", "restart_fr_on_each_reply", 0)
modparam("tm", "onreply_avp_mode", 1)

#### Record Route Module
loadmodule "rr.so"
/* do not append from tag to the RR (no need for this script) */
modparam("rr", "append_fromtag", 0)

#### MAX ForWarD module
loadmodule "maxfwd.so"

#### SIP MSG OPerationS module
loadmodule "sipmsgops.so"

#### FIFO Management Interface
loadmodule "mi_fifo.so"
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
modparam("mi_fifo", "fifo_mode", 0666)

#### URI module
loadmodule "uri.so"
modparam("uri", "use_uri_table", 0)

#### USeR LOCation module
loadmodule "usrloc.so"
modparam("usrloc", "nat_bflag", "NAT")
modparam("usrloc", "db_mode",   0)

#### REGISTRAR module
loadmodule "registrar.so"
modparam("registrar", "tcp_persistent_flag", "TCP_PERSISTENT")
modparam("registrar", "received_avp", "$avp(rcv)")

loadmodule "nathelper.so"
modparam("nathelper", "received_avp", "$avp(rcv)")

loadmodule "rtpproxy.so"
modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:12221")

#### ACCounting module
loadmodule "acc.so"
modparam("acc", "early_media", 0)
modparam("acc", "report_cancels", 0)
modparam("acc", "detect_direction", 0)
modparam("acc", "failed_transaction_flag", "ACC_FAILED")
modparam("acc", "log_flag", "ACC_DO")
modparam("acc", "log_missed_flag", "ACC_MISSED")


route{

        force_rport(); #nathelper
        if (nat_uac_test("23")) { #nathelper
                if (is_method("REGISTER")) {
                        fix_nated_register(); #nathelper
                        setbflag(NAT);
                } else {
                        fix_nated_contact(); #nathelper
                        setflag(NAT);
                }
        }

        if (!mf_process_maxfwd_header("10")) {
                sl_send_reply("483","Too Many Hops");
                exit;
        }
        if (has_totag()) {
                # sequential requests within a dialog should
                # take the path determined by record-routing
                if (loose_route()) {

                        if (is_method("BYE")) {
                                setflag(ACC_DO); # do accounting ...
                                setflag(ACC_FAILED); # ... 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();
                        }

                        if (check_route_param("nat=yes"))
                                setflag(NAT);

                        # route it out to whatever destination was set
by loose_route()
                        # in $du (destination URI).
                        route(relay);
                } else {
                       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(ACC_DO); # do accounting
        }

        if (!uri==myself) {
                append_hf("P-hint: outbound\r\n");
                route(relay);
        }
        # requests for my domain
        if (is_method("PUBLISH|SUBSCRIBE"))
        {
                sl_send_reply("503", "Service Unavailable");
                exit;
        }

        if (is_method("REGISTER"))
        {
                setflag(TCP_PERSISTENT);
                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;
        }

        if (isbflagset(NAT)) setflag(NAT);

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

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

                if (isflagset(NAT)) {
                        rtpproxy_offer("ro");
                }

                t_on_branch("per_branch_ops");
                t_on_reply("handle_nat");
                t_on_failure("missed_call");

        }

        if (isflagset(NAT)) {
                add_rr_param(";nat=yes");
        }

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

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


onreply_route[handle_nat] {
        if (nat_uac_test("1"))
                fix_nated_contact();
        if ( isflagset(NAT) )
                rtpproxy_answer("ro");
        xlog("incoming reply\n");
}

failure_route[missed_call] {
        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;
        ##}

}


Thank you in advance!



More information about the Users mailing list