2

Is it possible to send media rtp packets from one rtpproxy server to another rtpproxy server?

In my scenario , i am registering voip account via opensips proxy server. We have rtpproxy and opensips server hosted on same place. opensips changes c= and m= lines of SDP accordingly but when packet goes to voip switch , its rtpproxy server also changes SDP. So Peer1 is sending packets to hout hosted rtpproxy server and peer2 sending rtp packets to voip switch's rtpproxy server.

SIP packets : Peer <--> opensips <--> asterisk

RTP packets peer1 <--> rtpproxy1 =X= rtpproxy2 <-->peer2

here no connection between rtpproxy1 and rtpproxy 2 so no media transfer between peer1 and peer2. Please help to solve this problem.

my opensips.cfg file is as below.

#
# $Id: opensips.cfg 9742 2013-02-05 10:24:48Z vladut-paiu $
#
# OpenSIPS residential configuration script
#     by OpenSIPS Solutions <team@opensips-solutions.com>
#
# This script was generated via "make menuconfig", from
#   the "Residential" scenario.
# You can enable / disable more features / functionalities by
#   re-generating the scenario with different options.#
#
# Please refer to the Core CookBook at:
#      http://www.opensips.org/Resources/DocsCookbooks
# for a explanation of possible statements, functions and parameters.
#


####### Global Parameters #########

debug=4
log_stderror=no
log_facility=LOG_LOCAL0

fork=yes
children=4

sip_warning=yes


mhomed=1
/* uncomment the following lines to enable debugging */
#debug=6
#fork=no
#log_stderror=yes

/* uncomment the next line to enable the auto temporary blacklisting of 
   not available destinations (default disabled) */
#disable_dns_blacklist=no

/* uncomment the next line to enable IPv6 lookup after IPv4 dns 
   lookup failures (default disabled) */
#dns_try_ipv6=yes

/* comment the next line to enable the auto discovery of local aliases
   based on revers DNS on IPs */
auto_aliases=yes


#listen=udp:127.0.0.1:5060   # CUSTOMIZE ME

listen=udp:192.168.1.28:5080

disable_tcp=yes
listen=tcp:192.168.1.28:5080

disable_tls = yes
listen = tls:192.168.1.28:5081
tls_verify_server = 1
tls_verify_client = 1
tls_require_client_certificate = 0
tls_method = TLSv1
tls_certificate = "/usr/local/etc/opensips/tls/server/server-cert.pem"
tls_private_key = "/usr/local/etc/opensips/tls/server/server-privkey.pem"
tls_ca_list = "/usr/local/etc/opensips/tls/server/server-calist.pem"


####### Modules Section ########


#set module path
mpath="/usr/local/lib64/opensips/modules/"

#### Auth db module


loadmodule "db_mysql.so"



loadmodule "auth_db.so"

loadmodule "auth.so"

modparam("auth_db", "db_url", "mysql://root:admin@localhost/opensips")
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "use_domain", 1)

modparam("auth", "nonce_expire", 300) 
modparam("auth", "rpid_suffix", ";party=calling;id-type=subscriber;screen=yes") 
modparam("auth", "rpid_avp", "$avp(rpid)") 

# !! Nathelper 
loadmodule "nathelper.so" 
#loadmodule "nat_traversal.so" 
loadmodule "rtpproxy.so" 
loadmodule "textops.so"
# ----------------- setting module-specific parameters --------------- 

modparam("rtpproxy", "rtpproxy_sock", "udp:192.168.1.28:7890") 

# !! Nathelper 

modparam("nathelper","sipping_bflag",7) 
modparam("nathelper", "ping_nated_only", 1)   # Ping only clients behind NAT 
modparam("nathelper", "force_socket", "udp:192.168.1.28:7890")
modparam("nathelper", "nortpproxy_str", "a=sdpmangled:yes\r\n")
#### 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)
modparam("uri", "use_domain", 0)   
modparam("uri", "db_url", "mysql://root:admin@localhost/opensips") 
#### USeR LOCation module
loadmodule "usrloc.so"
modparam("usrloc","nat_bflag",6) 
modparam("usrloc", "db_mode",   0)

#### REGISTRAR module
loadmodule "registrar.so"
modparam("registrar", "tcp_persistent_flag", "TCP_PERSISTENT")

modparam("registrar", "default_expires", 3600) 
modparam("registrar", "min_expires", 60) 
modparam("registrar", "max_expires", 0) 
modparam("registrar", "default_q", 0) 
modparam("registrar", "case_sensitive", 0) 
modparam("registrar", "received_param", "received") 
modparam("registrar", "max_contacts", 0) 
modparam("registrar", "retry_after", 0) 
modparam("registrar", "received_avp", "$avp(i:801)") 

/* uncomment the next line not to allow more than 10 contacts per AOR */
#modparam("registrar", "max_contacts", 10)
modparam("registrar","received_avp", "$avp(42)")
modparam("nathelper","received_avp", "$avp(42)")

#### ACCounting module
loadmodule "acc.so"
/* what special events should be accounted ? */
modparam("acc", "early_media", 0)
modparam("acc", "report_cancels", 0)
/* by default we do not adjust the direct of the sequential requests.
   if you enable this parameter, be sure the enable "append_fromtag"
   in "rr" module */
modparam("acc", "detect_direction", 0)
modparam("acc", "failed_transaction_flag", "ACC_FAILED")
/* account triggers (flags) */
modparam("acc", "log_flag", "ACC_DO")
modparam("acc", "log_missed_flag", "ACC_MISSED")

loadmodule "dialog.so"
#loadmodule "load_balancer.so"
loadmodule "domain.so"

modparam("domain", "db_url","mysql://root:admin@localhost/opensips") # CUSTOMIZE ME
modparam("domain", "db_mode", 1)   # Use caching
modparam("auth_db|usrloc|uri", "use_domain", 1)

loadmodule "drouting.so"

modparam("drouting", "db_url","mysql://root:admin@localhost/opensips") # CUSTOMIZE ME

loadmodule "event_route.so"
#loadmodule "mediaproxy.so"
loadmodule "alias_db.so" 

modparam("alias_db", "db_url","mysql://root:admin@localhost/opensips") # CUSTOMIZE ME

loadmodule "dialplan.so" 

modparam("dialplan", "db_url","mysql://root:admin@localhost/opensips") # CUSTOMIZE ME

#loadmodule "presence_xcapdiff.so"
#loadmodule "permissions.so"
####### Routing Logic ########

# main routing logic
# main request routing logic


route 
{

    #xlog("L_INFO","CVAPP: route($rm/$du/$fu/$tu)"); 

    #script_trace( 1, "$rm from $si, ruri=$ru", "me");

    #xlog("L_INFO", "route[0] New request - M=$rm RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n"); 
    # -----------------------------------------------------------------
    # Sanity Check Section
    # -----------------------------------------------------------------
    if (!mf_process_maxfwd_header("10"))
    {   
        xlog("mf_process_maxfwd_header....... \n");
        sl_send_reply("483", "Too Many Hops");
        exit;
    };
    if (msg:len > 4096) 
    {
        xlog(" method msg:len > 2048 \n");
        sl_send_reply("513", "Message Overflow");   
        exit;
    };

    # -----------------------------------------------------------------
    # Record Route Section
    # -----------------------------------------------------------------
    if (method!="REGISTER") 
    {
        record_route();
    }
    else
    {
        if(nat_uac_test("19")) 
                { 
                        record_route(";nat=yes"); 
                } 
                else 
                { 
                        record_route(); 
                } 
    }
    if (method=="BYE" || method=="CANCEL") 
    {
        unforce_rtp_proxy();
    }

    # -----------------------------------------------------------------
    # Loose Route Section nat_uac_test("3")
    # -----------------------------------------------------------------
    if (loose_route()) 
    {
        xlog(" method loose_route() \n");
        if ((method=="INVITE" || method=="REFER") && !has_totag()) 
        {
            sl_send_reply("403", "Forbidden");
            exit;
        };
        if (method=="INVITE") 
        {
            fix_nated_sdp("1");
            if (nat_uac_test("19")) 
            {
                xlog(" method fix_nated_contact() \n");
                #setflag(6);
                setbflag(6);
                setbflag(7);
                setbflag(8);
                force_rport();
                fix_nated_contact("2");
            };

               rtpproxy_answer();
        };

        route(1);
        exit;
    };


            #xlog("L_INFO","CVAPP:  has_totag initial request"); 

            /* if(loose_route()) 
                { 
                        if(!has_totag()) 
                        { 
                                xlog("L_INFO", "route[0] Initial loose-routing rejected - M=$rm RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n"); 
                                sl_send_reply("403", "Initial Loose-Routing Rejected"); 
                                exit; 
                        } 
                        if(nat_uac_test("19") || search("^Route:.*;nat=yes")) 
                        { 
                                xlog("L_INFO", "route[0] Initial loose-routing 19 - M=$rm RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n"); 
                                fix_nated_contact(); 
                                setbflag(6); 
                        } 
                        xlog("loose_route route5....... \n");
                        route(5); 
                } */

                /* else { 
                                 xlog("L_INFO","CVAPP:   loose_route was false"); 
                                 if ( is_method("ACK") ) { 
                                         xlog("L_INFO","CVAPP:   is ACK"); 
                                         if ( t_check_trans() ) { 
                                                 xlog("L_INFO","CVAPP:   found matching transaction"); 
                                                 # non loose-route, but stateful ACK; must be an ACK after 
                                                 # a 487 or e.g. 404 from upstream server 
                                                 t_relay(); 
                                                 exit; 
                                         } else { 
                                                 xlog("L_INFO","CVAPP:   no matching transaction"); 
                                                 # ACK without matching   transaction -> 
                                                 # ignore and discard 
                                                 exit; 
                                         } 
                                 } 
                                 xlog("L_INFO","CVAPP:   sending 404 Not here"); 
                                 sl_send_reply("404","Not here"); 
                         }  
                */

    # -----------------------------------------------------------------
    # Call Type Processing Section
    # -----------------------------------------------------------------
    if (uri!=myself) 
    {
        #xlog("L_INFO", "uri!=myself1...........\n"); 
        route(4);
        route(1);
        exit;
    };

    if (method=="ACK") 
    {
        xlog(" method==ACK \n");
        route(1);
        exit;
    } 
    if (method=="CANCEL") 
    {
        xlog(" method==CANCEL \n");
        route(1);
        exit;
    } 
    else if (method=="INVITE") 
    {
        xlog(" method==INVITE \n");
        route(3);
        exit;
    } 
    else if (method=="REGISTER") 
    {
        xlog(" method==REGISTER \n");
        route(2);
        exit;
    };
    lookup("aliases");
    if (uri!=myself) 
    {
        xlog(" uri!=myself2... \n");
        route(4);
        route(1);
        exit;
    };
    if (!lookup("location")) 
    {
        xlog(" !lookup(location) \n");
        sl_send_reply("404", "User Not Found");
        exit;
    };

    route(1);
}


route[1] 
{
    # -----------------------------------------------------------------
    # Default Message Handler
    # -----------------------------------------------------------------



         # if client or server know to be behind a NAT, enable relay
        if (isflagset(6) || isflagset(7)) {

                xlog("route[1]  Default Message Handler \n");

                force_rport();
                fix_nated_contact();
                rtpproxy_answer();
        };

    t_on_reply("1");

    if (subst_uri('/(sip:.*);nat=yes/\1/')){
        xlog("subst_uri ..............\n");
        setbflag(6);
    };


    if (!t_relay()) 
    {
        if (method=="INVITE" && isbflagset(6)) 
        {
            unforce_rtp_proxy();
        };
        sl_reply_error();
    };
}

route[2] 
{
    # -----------------------------------------------------------------
    # REGISTER Message Handler
    # ----------------------------------------------------------------

    xlog("route[2]  REGISTER Message Handler \n");

    if (!search("^Contact:[ ]*\*") && nat_uac_test("19")) 
    {   

        xlog(" !search()...... \n");
        #setflag(6);
        setbflag(6);
        setbflag(8);
        #fix_nated_register();
        fix_nated_contact();
        force_rport();
    };

    sl_send_reply("100", "Trying");

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

route[3] 
{
    # -----------------------------------------------------------------
    # INVITE Message Handler
    # -----------------------------------------------------------------
    #if (nat_uac_test("19")) 
    #{
    #   setflag(6);
    #}
    xlog("route[3]  INVITE Message Handler \n");
    #linha incluida por mim para fazer com que todo INVITE utilize o rtpproxy
        #setflag(6);
    setbflag(6);
    setbflag(8);

    lookup("aliases");

    if (uri!=myself) 
    {
        route(4);
        route(1);
        exit;
    };

    if (!lookup("location")) 
    {
        sl_send_reply("404", "User Not Found");
        exit;
    };
    route(4);
    route(1);
}

route[4]
{
    # -----------------------------------------------------------------
    # NAT Traversal Section
    # -----------------------------------------------------------------
    if (isbflagset(6)) 
    {
        force_rport();
        fix_nated_contact();
        rtpproxy_answer(); 
    }
}

route[5] 
{ 
        if(isbflagset(6)) 
        { 

            xlog("L_INFO", "route[5] ..............."); 

                if(!isflagset(22) && !search("^Content-Length:[ ]*0")) 
                { 

                        setflag(22); 
#    force_rtp_proxy(); 
#    fix_nated_sdp("9");


                    if(has_body("application/sdp"))
                    {
                                xlog("L_INFO", "has_body rtpproxy_answer IP..............."); 
                                #rtpproxy_offer(); 
                                fix_nated_sdp("10","192.168.1.28");
                                rtpproxy_answer("r","192.168.1.28");
                    }
                } 

#    if (rtpproxy_offer()) 
#    { 
#    t_on_reply("2"); 
#    } 
                t_on_reply("2"); 

        } 
        else 
        { 
                t_on_reply("1"); 
        } 
        if(!isflagset(21)) 
        { 
                t_on_failure("1"); 
        } 
        if(isflagset(29)) 
        { 
                append_branch(); 
        } 
       /* if(is_present_hf("Proxy-Authorization")) 
        { 
                consume_credentials(); 
        } 
        */
        xlog("L_INFO", "route[3] Request leaving server, D-URI='$du' - M=$rm RURI=$ru F=$fu T=$tu IP=$si ID=$ci\n"); 
        # no 100 (we already sent it) and no DNS blacklisting 
#   if(!t_relay("0x05")) 
        if(!t_relay()) 
        { 
                sl_reply_error(); 
                if(is_method("INVITE") && isbflagset(6)) 
                { 
                        xlog("L_INFO", "route[3] unforce rtp proxy\n"); 
                        unforce_rtp_proxy(); 
                } 
        } 
        exit; 

} 

onreply_route[1] 
{

    #rtpproxy_answer(); 
    #force_rport();
    #fix_nated_contact();
    #rtpproxy_answer(); 
    #rtpproxy_offer("i");
    #rtpproxy_answer("cowf","192.168.1.28");

    if (is_method("INVITE") || is_method("ACK") )
    {
        if(has_body("application/sdp"))
        {
                $var(mline) = $(rb{sdp.line,m});
            xlog("The first m line in the SDP body is $var(mline)\n");
            force_rport();
            #fix_nated_contact();
            fix_nated_sdp("3");
            rtpproxy_offer("i");
        }

    }   
    #rtpproxy_answer("cowf","192.168.1.28");


    if (isbflagset(6) && status=~"2[0-9][0-9]") 
    {

        if (!search("^Content-Length:[ ]*0")) 
        {
             xlog("onreply_route[1]  if1 \n");
             rtpproxy_answer(); 
        };
    };
    if (nat_uac_test("1")) 
    {
            xlog("onreply_route[1]  if2 \n");
        fix_nated_contact();
    };
}

onreply_route[2] 
{ 
        xlog("L_INFO", "onreply_route[2] NAT-Reply - S=$rs D=$rr F=$fu T=$tu IP=$si ID=$ci\n"); 
        if(nat_uac_test("1")) 
        { 
                fix_nated_contact(); 
        } 
        if(isbflagset(6) && status=~"2[0-9][0-9]") 
        { 
                if(!search("^Content-Length:[ ]*0")) 
                { 
                        #force_rtp_proxy(); 
                        xlog("L_INFO", "onreply_route[2] - calling rtpproxy_answer()\n");   
                        #fix_nated_sdp("3"); 
                        rtpproxy_answer(); 
                } 
        } 

        exit; 
} 

failure_route[1]{

    xlog("failure_route[1]  if2 \n");

}
kaushik parmar
  • 805
  • 6
  • 19

2 Answers2

2

Change rtpproxy_offer(i) to rtpproxy_offer("corw") in your onreply_route[2] function.

rtpproxy_offer("corw");
Eiko
  • 25,601
  • 15
  • 56
  • 71
tesy
  • 100
  • 1
  • 7
1

When the first SIP proxy receives the initial INVITE, it will allocate ports on the first rtpproxy and modify the SDP body so that traffic destinated to the UAC is sent to this rtpproxy. When the INVITE reaches the second SIP proxy (or B2BUA if it is Asterisk), it will allocate ports on the second rtpproxy and modify the SDP body so that traffic destinated to the UAC is sent to this rtpproxy. The opposite will also happen when replies with SDP body are received by the proxies.

Therefore, the traffic will flow as follows:

UAC <-> rtpproxy1 <-> rtpproxy2 <-> UAS

And, there is no special configuration for the two rtpproxy to send each other traffic. Each rtpproxy is simply seen by the other as the UA (UAS or UAC).

manash
  • 6,985
  • 12
  • 65
  • 125