[OpenSIPS-Users] OpenSIPS TCP error INVITE/MESSAGE

Maksim Solovjov maxim.solovjov at gmail.com
Thu May 8 14:17:43 CEST 2014


As far as I understand, you mesn that async reactor should be implemented in the sip server, and using this approach it will act much better under load. 

But at the moment I am testing with just 3 users. So server should perfom perfectly under this kind of load. 

Maybe it's vonfiguration problem?

> On 08 May 2014, at 13:46, ag at ag-projects.com wrote:
> 
> The problem is that originally only UDP transport was considered which was enough to run VoIP calls. Sending  UDP is not blocking while using TCP is. TCP connections don’t work well without using an asynchronous reactor, especially under load the problem becomes visible. Ideally, the core should be based on such concept but we are not there yet.
> 
> Adrian
> 
>> On 08 May 2014, at 06:32, Maksim Solovjov <maxim.solovjov at gmail.com> wrote:
>> 
>> Thank you for your answer. Can you elaborate on "voice switch and voice calls only"?
>> 
>> So there is nothing I can do about it? To make a connection working fast and reliable?
>> 
>>> On 08 May 2014, at 04:07, ag at ag-projects.com wrote:
>>> 
>>> You are confronted with the classic problem “this voice switch was designed to handle UDP and voice calls only” problem.
>>> 
>>> This is a VoIP industry level problem, which is yet to be properly addressed by anyone in the field.
>>> 
>>> Adrian
>>> 
>>>> On 07 May 2014, at 21:16, Maksim Solovjov <maxim.solovjov at gmail.com> wrote:
>>>> 
>>>> Hello,
>>>> 
>>>> From time to time I am encountering a problem while sending instant
>>>> 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!
>>>> 
>>>> _______________________________________________
>>>> Users mailing list
>>>> Users at lists.opensips.org
>>>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>>> 
>>> 
>>> _______________________________________________
>>> Users mailing list
>>> Users at lists.opensips.org
>>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>> 
>> _______________________________________________
>> Users mailing list
>> Users at lists.opensips.org
>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
> 
> 
> _______________________________________________
> Users mailing list
> Users at lists.opensips.org
> http://lists.opensips.org/cgi-bin/mailman/listinfo/users



More information about the Users mailing list