<div dir="ltr"><div>Im very new to kamailio,</div><div><br></div><div>we have some ptime issues which causes one way audio due to varies PBX vendors connecting to our class 5 softswitches</div><div><br></div><div>I would like to use Kamailio as the SIP/RTP proxy in front of our class 5 soft switches<br></div><div><br></div><div>I followed the example of freeswitch and kamailio. However the config is still hard for me</div><div><br></div><div>below setup works, however RTP not being proxied, Looks like its its not, because im not using NAT, so RTP goes direct<br></div><div><br></div><div><a href="https://freeswitch.org/confluence/display/FREESWITCH/Kamailio+basic+setup+as+proxy+for+FreeSWITCH">https://freeswitch.org/confluence/display/FREESWITCH/Kamailio+basic+setup+as+proxy+for+FreeSWITCH</a><br></div><div><br></div><div>I would like to to ensure RTP proxy is always used(possible re-framing ptime) and we have  multiple soft switches</div><div><br></div><div>Is it possible to setup kamailio.cfg so my customers can point the endpoint to kamailio and domain names contains the server we want to use to register with?</div><div><br></div><div><br></div><div><br></div><div>eg, softswitch 1 = 1.1.1.2</div><div>     softswitch 2 = 1.1.1.3</div><div>     softswitch 3 = 1.1.1.4</div><div><br></div><div>etc etc<br></div><div><br></div><div>my current config</div><div><br></div><div>#!KAMAILIO <br><br>#!define IPADDRESS "1.1.1.1" <br><br>#!define SWITCH_IPADDRESS "1.1.1.2" <br><br><br>#!define FLAG_FROM_SWITCH 1 <br>#!define FLAG_FROM_USER 2 <br><br># ------------------ module loading ---------------------------------- <br>loadmodule "tm.so" <br>loadmodule "rr.so" <br>loadmodule "pv.so" <br>loadmodule "sl.so" <br>loadmodule "maxfwd.so" <br>loadmodule "nathelper.so" <br>loadmodule "textops.so" <br>loadmodule "siputils.so" <br>loadmodule "xlog.so" <br>loadmodule "sanity.so" <br>loadmodule "path.so" <br><br>loadmodule "rtpproxy.so" <br><br><br># ----------------- setting module-specific parameters --------------- <br>modparam("nathelper|registrar", "received_avp", "$avp(s:rcv)") <br># -------------------------  request routing logic ------------------- <br><br>#!ifdef WITH_NAT <br># ----- rtpproxy params ----- <br>modparam("rtpproxy", "rtpproxy_sock", "udp:<a href="http://127.0.0.1:7722">127.0.0.1:7722</a>") <br><br># ----- nathelper params ----- <br>modparam("nathelper", "natping_interval", 30) <br>modparam("nathelper", "ping_nated_only", 1) <br>modparam("nathelper", "sipping_bflag", FLB_NATSIPPING) <br>modparam("nathelper", "sipping_from", "<a href="mailto:sip%3Apinger@kamailio.org">sip:pinger@kamailio.org</a>") <br><br># params needed for NAT traversal in other modules <br>modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)") <br>modparam("usrloc", "nat_bflag", FLB_NATB) <br>#!endif <br><br><br><br># main routing logic <br><br>route { <br><br>       # per request initial checks <br>       route(SANITY_CHECK); <br><br>       # CANCEL processing <br>       if (is_method("CANCEL")) { <br>               if (t_check_trans()) { <br>                       t_relay(); <br>               } <br>               exit; <br>       } <br><br>       route(CHECK_SOURCE_IP); <br><br>       ################################## <br>       ### HANDLE SEQUENTIAL REQUESTS ### <br>       route(WITHINDLG); <br><br>       ############################### <br>       ### HANDLE INITIAL REQUESTS ### <br>       t_check_trans(); <br><br>       if (is_method("INVITE|REFER")) { <br>               record_route(); <br>       } <br>       <br>       if (is_method("REGISTER")) { <br>           add_path(); <br>       } <br><br>       if (isflagset(FLAG_FROM_SWITCH)) { <br>               # don't send INVITE from SWITCH back to SWITCH, set reply route to handle NAT and forward them along <br>               t_on_reply("EXTERNAL_REPLY"); <br>       } else { <br>               # set destination to your SWITCH <br>               $du = "sip:<a href="http://1.1.1.2:5060">1.1.1.2:5060</a>"; <br>       } <br><br>       route(RELAY); <br><br><br>} <br><br><br>route[SANITY_CHECK] <br>{ <br>       if (!sanity_check()) { <br>               #xlog("L_WARN", "$ci|end|message is insane"); <br>               exit; <br>       } <br><br>       if (!mf_process_maxfwd_header("10")) { <br>               #xlog("L_WARN", "$ci|end|too much hops, not enough barley"); <br>               send_reply("483", "Too Many Hops"); <br>               exit; <br>       } <br><br>       if ($ua == "friendly-scanner" || <br>               $ua == "sundayddr" || <br>               $ua =~ "sipcli" ) { <br>               #xlog("L_WARN", "$ci|end|dropping message with user-agent $ua"); <br>               exit; <br>       } <br><br>       if ($si == IPADDRESS) { <br>               #xlog("L_WARN", "$ci|end|dropping message"); <br>               exit; <br>       } <br><br>} <br><br><br>route[CHECK_SOURCE_IP] <br>{ <br>       if ($si == SWITCH_IPADDRESS) { <br>               setflag(FLAG_FROM_SWITCH); <br>       } else { <br>               setflag(FLAG_FROM_USER); <br>       } <br>} <br><br># Handle requests within SIP dialogs <br>route[WITHINDLG] <br>{ <br>       if (has_totag()) { <br>               # sequential request withing a dialog should <br>               # take the path determined by record-routing <br>               if (loose_route()) { <br>                       route(RELAY); <br>               } else { <br>                       if (is_method("NOTIFY")) { <br>                               route(RELAY); <br>                       } <br>                       if (is_method("SUBSCRIBE") && uri == myself) { <br>                               # in-dialog subscribe requests <br>                               exit; <br>                       } <br>                       if (is_method("ACK")) { <br>                               if (t_check_trans()) { <br>                                       # no loose-route, but stateful ACK; <br>                                       # must be an ACK after a 487 <br>                                       # or e.g. 404 from upstream server <br>                                       t_relay(); <br>                                       exit; <br>                               } else { <br>                                       # ACK without matching transaction ... ignore and discard <br>                                       #xlog("ACK without matching transaction ... ignore and discard"); <br>                                       exit; <br>                               } <br>                       } <br>                       sl_send_reply("404","Not here"); <br>               } <br>               exit; <br>       } <br>} <br><br>onreply_route[EXTERNAL_REPLY] <br>{ <br>       route(NAT_TEST_AND_CORRECT); <br>} <br><br><br>route[NAT_TEST_AND_CORRECT] <br>{ <br>       if (nat_uac_test("3")) { <br>               if (is_method("REGISTER")) { <br>                       fix_nated_register(); <br>               } else { <br>                       fix_nated_contact(); <br>               } <br>               force_rport(); <br>       } <br>       if (has_body("application/sdp") && nat_uac_test("8")) { <br>               fix_nated_sdp("10"); <br>       } <br>} <br><br>route[RELAY] <br>{ <br><br><br>#!ifdef WITH_NAT <br>       if (check_route_param("nat=yes")) { <br>               #setbflag(FLB_NATB); <br>               route(RTPPROXY); <br>       } <br>       if (isflagset(FLT_NATS) || isbflagset(FLB_NATB)) { <br>               route(RTPPROXY); <br>       } <br>#!endif <br><br>               route(RTPPROXY); <br><br>       /* example how to enable some additional event routes */ <br>       if (is_method("INVITE")) { <br>               #t_on_branch("BRANCH_ONE"); <br>               t_on_reply("REPLY_ONE"); <br>               t_on_failure("FAIL_ONE"); <br>       } <br><br>       if (!t_relay()) { <br>               sl_reply_error(); <br>       } <br>       exit; <br><br><br>#        if (!t_relay()) { <br>#                sl_reply_error(); <br>#        } <br>#        exit; <br>} <br><br><br># RTPProxy control <br>route[RTPPROXY] { <br>#!ifdef WITH_NAT <br>       if (is_method("BYE")) { <br>               #unforce_rtp_proxy(); <br>               force_rtp_proxy(); <br>       } else if (is_method("INVITE")){ <br>               force_rtp_proxy(); <br>       } <br>       if (!has_totag()) add_rr_param(";nat=yes"); <br>#!endif <br>       return; <br>} <br><br></div><div><br></div></div>