<div dir="ltr">hi <div>i m using kamailio 5.4 dev Docker image <br> when i try to call form calientA to clientB  i got (<span style="background-color:rgba(255,255,255,0.7);color:rgb(200,0,0);font-family:Ubuntu;font-size:12px">Temporarily Unavailable (code: 480)</span>)<br>i m using freeswitch as media server <br>so the flow and structure should be like this </div><div>ClientA---->Kamailio------>FS---->Kamailio>---->ClientB<br><br>but issue is (what i m getting )<br> ClientA---->Kamailio------>FS---->Kamailio>-------->FS-------->kamailio--------->FS</div><div>IT CREATE THE CALL LOOP b/w  KAMAILIO AND FREESWITCH </div><div><b>MY CONFIG FILE IS ATACHED </b></div><div>in logs i m getting</div><div>--------------------------------------------------------</div>Nov 24 10:25:36 ip-172-20-61-37 local0.err rtpproxy[6]: ERR:GLOBAL:create_twinlistener: can't bind to the IPv4 port 38902: Address not available (99)<br>Nov 24 10:25:36 ip-172-20-61-37 local0.err rtpproxy[6]: ERR:GLOBAL:rtpp_command_ul_handle: can't create listener<br>Nov 24 10:25:36 ip-172-20-61-37 local0.debug rtpproxy[6]: DBUG:GLOBAL:rtpc_doreply: sending reply "E72\n"<br>Nov 24 10:25:36 ip-172-20-61-37 local0.debug rtpproxy[6]: DBUG:GLOBAL:get_command: received command "18_4 Uc0,8,101 9857c00a-8947-1238-c6a7-12590b724429 3.82.96.70 22082 jKrKymKNg480p;1"<br>Nov 24 10:25:36 ip-172-20-61-37 <a href="http://local0.info">local0.info</a> rtpproxy[6]: INFO:GLOBAL:rtpp_command_ul_handle: new IPv4/IPv4 session 9857c00a-8947-1238-c6a7-12590b724429, tag jKrKymKNg480p;1 requested, type strong<br>Nov 24 10:25:36 ip-172-20-61-37 local0.err rtpproxy[6]: ERR:GLOBAL:create_twinlistener: can't bind to the IPv4 port 35888: Address not available (99)<br>Nov 24 10:25:36 ip-172-20-61-37 local0.err rtpproxy[6]: ERR:GLOBAL:rtpp_command_ul_handle: can't create listener<br>Nov 24 10:25:36 ip-172-20-61-37 local0.debug rtpproxy[6]: DBUG:GLOBAL:rtpc_doreply: sending reply "E72\n"<br>Nov 24 10:25:36 ip-172-20-61-37 local0.debug rtpproxy[6]: DBUG:GLOBAL:get_command: received command "20_4 Uc0,8,101 98589959-8947-1238-c6a7-12590b724429 3.82.96.70 29846 m5a51aNvapN6D;1"<br>Nov 24 10:25:36 ip-172-20-61-37 <a href="http://local0.info">local0.info</a> rtpproxy[6]: INFO:GLOBAL:rtpp_command_ul_handle: new IPv4/IPv4 session 98589959-8947-1238-c6a7-12590b724429, tag m5a51aNvapN6D;1 requested, type strong<br>Nov 24 10:25:36 ip-172-20-61-37 local0.err rtpproxy[6]: ERR:GLOBAL:create_twinlistener: can't bind to the IPv4 port 37706: Address not available (99)<br>Nov 24 10:25:36 ip-172-20-61-37 local0.err rtpproxy[6]: ERR:GLOBAL:rtpp_command_ul_handle: can't create listener<br>Nov 24 10:25:36 ip-172-20-61-37 local0.debug rtpproxy[6]: DBUG:GLOBAL:rtpc_doreply: sending reply "E72\n"<br>Nov 24 10:25:36 ip-172-20-61-37 local0.debug rtpproxy[6]: DBUG:GLOBAL:get_command: received command "13_4 Uc0,8,101 985962c1-8947-1238-c6a7-12590b724429 3.82.96.70 29432 pQXp50p3471BN;1"<br>Nov 24 10:25:36 ip-172-20-61-37 <a href="http://local0.info">local0.info</a> rtpproxy[6]: INFO:GLOBAL:rtpp_command_ul_handle: new IPv4/IPv4 session 985962c1-8947-1238-c6a7-12590b724429, tag pQXp50p3471BN;1 requested, type strong<br>Nov 24 10:25:36 ip-172-20-61-37 local0.err rtpproxy[6]: ERR:GLOBAL:create_twinlistener: can't bind to the IPv4 port 45078: Address not available (99)<br>Nov 24 10:25:36 ip-172-20-61-37 local0.err rtpproxy[6]: ERR:GLOBAL:rtpp_command_ul_handle: can't create listener<br>Nov 24 10:25:36 ip-172-20-61-37 local0.debug rtpproxy[6]: DBUG:GLOBAL:rtpc_doreply: sending reply "E72\n"<br>Nov 24 10:25:36 ip-172-20-61-37 local0.debug rtpproxy[6]: DBUG:GLOBAL:get_command: received command "16_5 Uc0,8,101 985a3ce3-8947-1238-c6a7-12590b724429 3.82.96.70 25096 r9F88praZSeHc;1"<br>Nov 24 10:25:36 ip-172-20-61-37 <a href="http://local0.info">local0.info</a> rtpproxy[6]: INFO:GLOBAL:rtpp_command_ul_handle: new IPv4/IPv4 session 985a3ce3-8947-1238-c6a7-12590b724429, tag r9F88praZSeHc;1 requested, type strong<br>Nov 24 10:25:36 ip-172-20-61-37 local0.err rtpproxy[6]: ERR:GLOBAL:create_twinlistener: can't bind to the IPv4 port 58376: Address not available (99)<br>Nov 24 10:25:36 ip-172-20-61-37 local0.err rtpproxy[6]: ERR:GLOBAL:rtpp_command_ul_handle: can't create listener<br><div>Nov 24 10:25:36 ip-172-20-61-37 local0.debug rtpproxy[6]: DBUG:GLOBAL:rtpc_doreply: sending reply "E72\n"</div><div>--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</div><div><br></div><div><br></div><div><b><font size="4">here is my config file </font></b></div><div>#!KAMAILIO<br>#!define WITH_MYSQL<br>#!define WITH_AUTH<br>#!define WITH_USRLOCDB<br>#!define WITH_ACCDB<br>#!define WITH_NAT<br><br>#<br># Kamailio (OpenSER) SIP Server v5.4 - default configuration script<br>#     - web: <a href="https://www.kamailio.org">https://www.kamailio.org</a><br>#     - git: <a href="https://github.com/kamailio/kamailio">https://github.com/kamailio/kamailio</a><br>#<br># Direct your questions about this file to: <<a href="mailto:sr-users@lists.kamailio.org">sr-users@lists.kamailio.org</a>><br>#<br># Refer to the Core CookBook at <a href="https://www.kamailio.org/wiki/">https://www.kamailio.org/wiki/</a><br># for an explanation of possible statements, functions and parameters.<br>#<br># Note: the comments can be:<br>#     - lines starting with #, but not the pre-processor directives,<br>#       which start with #!, like #!define, #!ifdef, #!endif, #!else, #!trydef,<br>#       #!subst, #!substdef, ...<br>#     - lines starting with //<br>#     - blocks enclosed in between /* */<br>#<br># Several features can be enabled using '#!define WITH_FEATURE' directives:<br>#<br># *** To run in debug mode:<br>#     - define WITH_DEBUG<br>#<br># *** To enable mysql:<br>#     - define WITH_MYSQL<br>#<br># *** To enable authentication execute:<br>#     - enable mysql<br>#     - define WITH_AUTH<br>#     - add users using 'kamctl'<br>#<br># *** To enable IP authentication execute:<br>#     - enable mysql<br>#     - enable authentication<br>#     - define WITH_IPAUTH<br>#     - add IP addresses with group id '1' to 'address' table<br>#<br># *** To enable persistent user location execute:<br>#     - enable mysql<br>#     - define WITH_USRLOCDB<br>#<br># *** To enable presence server execute:<br>#     - enable mysql<br>#     - define WITH_PRESENCE<br>#<br># *** To enable nat traversal execute:<br>#     - define WITH_NAT<br>#     - option for NAT SIP OPTIONS keepalives: WITH_NATSIPPING<br>#     - install RTPProxy: <a href="http://www.rtpproxy.org">http://www.rtpproxy.org</a><br>#     - start RTPProxy:<br>#        rtpproxy -l _your_public_ip_ -s udp:localhost:7722<br>#<br># *** To use RTPEngine (instead of RTPProxy) for nat traversal execute:<br>#     - define WITH_RTPENGINE<br>#     - install RTPEngine: <a href="https://github.com/sipwise/rtpengine">https://github.com/sipwise/rtpengine</a><br>#     - start RTPEngine:<br>#        rtpengine --listen-ng=<a href="http://127.0.0.1:2223">127.0.0.1:2223</a> ...<br>#<br># *** To enable PSTN gateway routing execute:<br>#     - define WITH_PSTN<br>#     - set the value of pstn.gw_ip<br>#     - check route[PSTN] for regexp routing condition<br>#<br># *** To enable database aliases lookup execute:<br>#     - enable mysql<br>#     - define WITH_ALIASDB<br>#<br># *** To enable speed dial lookup execute:<br>#     - enable mysql<br>#     - define WITH_SPEEDDIAL<br>#<br># *** To enable multi-domain support execute:<br>#     - enable mysql<br>#     - define WITH_MULTIDOMAIN<br>#<br># *** To enable TLS support execute:<br>#     - adjust CFGDIR/tls.cfg as needed<br>#     - define WITH_TLS<br>#<br># *** To enable XMLRPC support execute:<br>#     - define WITH_XMLRPC<br>#     - adjust route[XMLRPC] for access policy<br>#<br># *** To enable anti-flood detection execute:<br>#     - adjust pike and htable=>ipban settings as needed (default is<br>#       block if more than 16 requests in 2 seconds and ban for 300 seconds)<br>#     - define WITH_ANTIFLOOD<br>#<br># *** To block 3XX redirect replies execute:<br>#     - define WITH_BLOCK3XX<br>#<br># *** To block 401 and 407 authentication replies execute:<br>#     - define WITH_BLOCK401407<br>#<br># *** To enable VoiceMail routing execute:<br>#     - define WITH_VOICEMAIL<br>#     - set the value of voicemail.srv_ip<br>#     - adjust the value of voicemail.srv_port<br>#<br># *** To enhance accounting execute:<br>#     - enable mysql<br>#     - define WITH_ACCDB<br>#     - add following columns to database<br>#!ifdef ACCDB_COMMENT<br>  ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';<br>  ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';<br>  ALTER TABLE acc ADD COLUMN src_ip varchar(64) NOT NULL default '';<br>  ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';<br>  ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';<br>  ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';<br>  ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';<br>  ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';<br>  ALTER TABLE missed_calls ADD COLUMN src_ip varchar(64) NOT NULL default '';<br>  ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';<br>  ALTER TABLE missed_calls ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';<br>  ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';<br>#!endif<br><br>####### Include Local Config If Exists #########<br>import_file "kamailio-local.cfg"<br><br>####### Defined Values #########<br><br># *** Value defines - IDs used later in config<br>#!ifdef WITH_MYSQL<br># - database URL - used to connect to database server by modules such<br>#       as: auth_db, acc, usrloc, a.s.o.<br>#!ifndef DBURL<br>#!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio"<br>#!endif<br>#!endif<br>#!ifdef WITH_MULTIDOMAIN<br># - the value for 'use_domain' parameters<br>#!define MULTIDOMAIN 1<br>#!else<br>#!define MULTIDOMAIN 0<br>#!endif<br><br># - flags<br>#   FLT_ - per transaction (message) flags<br>#   FLB_ - per branch flags<br>#!define FLT_ACC 1<br>#!define FLT_ACCMISSED 2<br>#!define FLT_ACCFAILED 3<br>#!define FLT_NATS 5<br><br>#!define FLB_NATB 6<br>#!define FLB_NATSIPPING 7<br><br>####### Global Parameters #########<br><br>### LOG Levels: 3=DBG, 2=INFO, 1=NOTICE, 0=WARN, -1=ERR<br>#!ifdef WITH_DEBUG<br>debug=4<br>log_stderror=yes<br>#!else<br>debug=2<br>log_stderror=no<br>#!endif<br><br>memdbg=5<br>memlog=5<br><br>log_facility=LOG_LOCAL0<br>log_prefix="{$mt $hdr(CSeq) $ci} "<br><br>/* number of SIP routing processes for each UDP socket<br> * - value inherited by tcp_children and sctp_children when not set explicitely */<br>children=8<br><br>/* uncomment the next line to disable TCP (default on) */<br># disable_tcp=yes<br><br>/* number of SIP routing processes for all TCP/TLS sockets */<br># tcp_children=8<br><br>/* uncomment the next line to disable the auto discovery of local aliases<br> * based on reverse DNS on IPs (default on) */<br># auto_aliases=no<br><br>/* add local domain aliases */<br># alias="<a href="http://sip.mydomain.com">sip.mydomain.com</a>"<br><br>/* uncomment and configure the following line if you want Kamailio to<br> * bind on a specific interface/port/proto (default bind on all available) */<br># listen=udp:<a href="http://10.0.0.10:5060">10.0.0.10:5060</a><br>listen=udp:LOCAL_IP:5091 advertise PUBLIC_IP:5091<br><br>/* life time of TCP connection when there is no traffic<br> * - a bit higher than registration expires to cope with UA behind NAT */<br>tcp_connection_lifetime=3605<br><br>/* upper limit for TCP connections (it includes the TLS connections) */<br>tcp_max_connections=2048<br><br>#!ifdef WITH_TLS<br>enable_tls=yes<br><br>/* upper limit for TLS connections */<br>tls_max_connections=2048<br>#!endif<br><br>####### Custom Parameters #########<br><br>/* These parameters can be modified runtime via RPC interface<br> * - see the documentation of 'cfg_rpc' module.<br> *<br> * Format: <a href="http://group.id">group.id</a> = value 'desc' description<br> * Access: $sel(<a href="http://cfg_get.group.id">cfg_get.group.id</a>) or @<a href="http://cfg_get.group.id">cfg_get.group.id</a> */<br><br>#!ifdef WITH_PSTN<br>/* PSTN GW Routing<br> *<br> * - pstn.gw_ip: valid IP or hostname as string value, example:<br> * pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"<br> *<br> * - by default is empty to avoid misrouting */<br>pstn.gw_ip = "" desc "PSTN GW Address"<br>pstn.gw_port = "" desc "PSTN GW Port"<br>#!endif<br><br>#!ifdef WITH_VOICEMAIL<br>/* VoiceMail Routing on offline, busy or no answer<br> *<br> * - by default Voicemail server IP is empty to avoid misrouting */<br>voicemail.srv_ip = "" desc "VoiceMail IP Address"<br>voicemail.srv_port = "5060" desc "VoiceMail Port"<br>#!endif<br><br>####### Modules Section ########<br><br>/* set paths to location of modules */<br># mpath="/usr/lib/kamailio/modules/"<br><br>#!ifdef WITH_MYSQL<br>loadmodule "db_mysql.so"<br>#!endif<br><br>loadmodule "jsonrpcs.so"<br>loadmodule "kex.so"<br>loadmodule "corex.so"<br>loadmodule "tm.so"<br>loadmodule "tmx.so"<br>loadmodule "sl.so"<br>loadmodule "rr.so"<br>loadmodule "pv.so"<br>loadmodule "maxfwd.so"<br>loadmodule "usrloc.so"<br>loadmodule "registrar.so"<br>loadmodule "textops.so"<br>loadmodule "siputils.so"<br>loadmodule "xlog.so"<br>loadmodule "sanity.so"<br>loadmodule "ctl.so"<br>loadmodule "cfg_rpc.so"<br>loadmodule "acc.so"<br>loadmodule "counters.so"<br>loadmodule "dispatcher.so"<br>#!ifdef WITH_AUTH<br>loadmodule "auth.so"<br>loadmodule "auth_db.so"<br>#!ifdef WITH_IPAUTH<br>loadmodule "permissions.so"<br>#!endif<br>#!endif<br><br>#!ifdef WITH_ALIASDB<br>loadmodule "alias_db.so"<br>#!endif<br><br>#!ifdef WITH_SPEEDDIAL<br>loadmodule "speeddial.so"<br>#!endif<br><br>#!ifdef WITH_MULTIDOMAIN<br>loadmodule "domain.so"<br>#!endif<br><br>#!ifdef WITH_PRESENCE<br>loadmodule "presence.so"<br>loadmodule "presence_xml.so"<br>#!endif<br><br>#!ifdef WITH_NAT<br>loadmodule "nathelper.so"<br>#!ifdef WITH_RTPENGINE<br>loadmodule "rtpengine.so"<br>#!else<br>loadmodule "rtpproxy.so"<br>#!endif<br>#!endif<br><br>#!ifdef WITH_TLS<br>loadmodule "tls.so"<br>#!endif<br><br>#!ifdef WITH_ANTIFLOOD<br>loadmodule "htable.so"<br>loadmodule "pike.so"<br>#!endif<br><br>#!ifdef WITH_XMLRPC<br>loadmodule "xmlrpc.so"<br>#!endif<br><br>#!ifdef WITH_DEBUG<br>loadmodule "debugger.so"<br>#!endif<br><br># ----------------- setting module-specific parameters ---------------<br><br>#-------------------dispatcher params-------------<br>                                                                         <br>modparam("dispatcher", "db_url", DBURL)                  <br>modparam("dispatcher", "table_name", "dispatcher")                 <br>modparam("dispatcher", "flags", 2)   <br>modparam("dispatcher", "xavp_dst", "_dsdst_")    <br>modparam("dispatcher", "xavp_ctx", "_dsctx_")<br><br># ----- jsonrpcs params -----<br>modparam("jsonrpcs", "pretty_format", 1)<br>/* set the path to RPC fifo control file */<br># modparam("jsonrpcs", "fifo_name", "/run/kamailio/kamailio_rpc.fifo")<br>/* set the path to RPC unix socket control file */<br># modparam("jsonrpcs", "dgram_socket", "/run/kamailio/kamailio_rpc.sock")<br><br># ----- ctl params -----<br>/* set the path to RPC unix socket control file */<br># modparam("ctl", "binrpc", "unix:/run/kamailio/kamailio_ctl")<br><br># ----- sanity params -----<br>modparam("sanity", "autodrop", 0)<br><br># ----- tm params -----<br># auto-discard branches from previous serial forking leg<br>modparam("tm", "failure_reply_mode", 3)<br># default retransmission timeout: 30sec<br>modparam("tm", "fr_timer", 30000)<br># default invite retransmission timeout after 1xx: 120sec<br>modparam("tm", "fr_inv_timer", 120000)<br><br># ----- rr params -----<br># set next param to 1 to add value to ;lr param (helps with some UAs)<br>modparam("rr", "enable_full_lr", 0)<br># do not append from tag to the RR (no need for this script)<br>modparam("rr", "append_fromtag", 0)<br><br># ----- registrar params -----<br>modparam("registrar", "method_filtering", 1)<br>/* uncomment the next line to disable parallel forking via location */<br># modparam("registrar", "append_branches", 0)<br>/* uncomment the next line not to allow more than 10 contacts per AOR */<br># modparam("registrar", "max_contacts", 10)<br>/* max value for expires of registrations */<br>modparam("registrar", "max_expires", 3600)<br>/* set it to 1 to enable GRUU */<br>modparam("registrar", "gruu_enabled", 0)<br><br># ----- acc params -----<br>/* what special events should be accounted ? */<br>modparam("acc", "early_media", 0)<br>modparam("acc", "report_ack", 0)<br>modparam("acc", "report_cancels", 0)<br>/* by default ww do not adjust the direct of the sequential requests.<br> * if you enable this parameter, be sure the enable "append_fromtag"<br> * in "rr" module */<br>modparam("acc", "detect_direction", 0)<br>/* account triggers (flags) */<br>modparam("acc", "log_flag", FLT_ACC)<br>modparam("acc", "log_missed_flag", FLT_ACCMISSED)<br>modparam("acc", "log_extra",<br>     "src_user=$fU;src_domain=$fd;src_ip=$si;"<br>   "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")<br>modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)<br>/* enhanced DB accounting */<br>#!ifdef WITH_ACCDB<br>modparam("acc", "db_flag", FLT_ACC)<br>modparam("acc", "db_missed_flag", FLT_ACCMISSED)<br>modparam("acc", "db_url", DBURL)<br>modparam("acc", "db_extra",<br> "src_user=$fU;src_domain=$fd;src_ip=$si;"<br>   "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")<br>#!endif<br><br># ----- usrloc params -----<br>/* enable DB persistency for location entries */<br>#!ifdef WITH_USRLOCDB<br>modparam("usrloc", "db_url", DBURL)<br>modparam("usrloc", "db_mode", 2)<br>modparam("usrloc", "use_domain", MULTIDOMAIN)<br>#!endif<br><br># ----- auth_db params -----<br>#!ifdef WITH_AUTH<br>modparam("auth_db", "db_url", DBURL)<br>modparam("auth_db", "calculate_ha1", yes)<br>modparam("auth_db", "password_column", "password")<br>modparam("auth_db", "load_credentials", "")<br>modparam("auth_db", "use_domain", MULTIDOMAIN)<br><br># ----- permissions params -----<br>#!ifdef WITH_IPAUTH<br>modparam("permissions", "db_url", DBURL)<br>modparam("permissions", "db_mode", 1)<br>#!endif<br><br>#!endif<br><br># ----- alias_db params -----<br>#!ifdef WITH_ALIASDB<br>modparam("alias_db", "db_url", DBURL)<br>modparam("alias_db", "use_domain", MULTIDOMAIN)<br>#!endif<br><br># ----- speeddial params -----<br>#!ifdef WITH_SPEEDDIAL<br>modparam("speeddial", "db_url", DBURL)<br>modparam("speeddial", "use_domain", MULTIDOMAIN)<br>#!endif<br><br># ----- domain params -----<br>#!ifdef WITH_MULTIDOMAIN<br>modparam("domain", "db_url", DBURL)<br>/* register callback to match myself condition with domains list */<br>modparam("domain", "register_myself", 1)<br>#!endif<br><br>#!ifdef WITH_PRESENCE<br># ----- presence params -----<br>modparam("presence", "db_url", DBURL)<br><br># ----- presence_xml params -----<br>modparam("presence_xml", "db_url", DBURL)<br>modparam("presence_xml", "force_active", 1)<br>#!endif<br><br>#!ifdef WITH_NAT<br>#!ifdef WITH_RTPENGINE<br># ----- rtpengine params -----<br>modparam("rtpengine", "rtpengine_sock", "udp:<a href="http://127.0.0.1:2223">127.0.0.1:2223</a>")<br>#!else<br># ----- rtpproxy params -----<br>modparam("rtpproxy", "rtpproxy_sock", "udp:<a href="http://127.0.0.1:7722">127.0.0.1:7722</a>")<br>#!endif<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>#!ifdef WITH_TLS<br># ----- tls params -----<br>modparam("tls", "config", "/etc/kamailio/tls.cfg")<br>#!endif<br><br>#!ifdef WITH_ANTIFLOOD<br># ----- pike params -----<br>modparam("pike", "sampling_time_unit", 2)<br>modparam("pike", "reqs_density_per_unit", 16)<br>modparam("pike", "remove_latency", 4)<br><br># ----- htable params -----<br>/* ip ban htable with autoexpire after 5 minutes */<br>modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")<br>#!endif<br><br>#!ifdef WITH_XMLRPC<br># ----- xmlrpc params -----<br>modparam("xmlrpc", "route", "XMLRPC");<br>modparam("xmlrpc", "url_match", "^/RPC")<br>#!endif<br><br>#!ifdef WITH_DEBUG<br># ----- debugger params -----<br>modparam("debugger", "cfgtrace", 1)<br>modparam("debugger", "log_level_name", "exec")<br>#!endif<br><br>####### Routing Logic ########<br><br><br>/* Main SIP request routing logic<br> * - processing of any incoming SIP request starts with this route<br> * - note: this is the same as route { ... } */<br>request_route {<br><br>      # per request initial checks<br>  route(REQINIT);<br><br>     # NAT detection<br>       route(NATDETECT);<br><br>   # CANCEL processing<br>   if (is_method("CANCEL")) {<br>          if (t_check_trans()) {<br>                        route(RELAY);<br>         }<br>             exit;<br> }<br><br>   # handle retransmissions<br>      if (!is_method("ACK")) {<br>            if(t_precheck_trans()) {<br>                      t_check_trans();<br>                      exit;<br>         }<br>             t_check_trans();<br>      }<br><br>   # handle requests within SIP dialogs<br>  route(WITHINDLG);<br><br>   ### only initial requests (no To tag)<br><br>       # authentication<br>      route(AUTH);<br><br>        # record routing for dialog forming requests (in case they are routed)<br>        # - remove preloaded route headers<br>    remove_hf("Route");<br> if (is_method("INVITE|SUBSCRIBE")) {<br>                record_route();<br>       }<br><br>   # account only INVITEs<br>        if (is_method("INVITE")) {<br>          setflag(FLT_ACC); # do accounting<br>     }<br><br>   # dispatch requests to foreign domains<br>        #route(SIPOUT);<br><br>     ### requests for my local domains<br><br>   # handle presence related requests<br>    route(PRESENCE);<br><br>    # handle registrations<br>        route(REGISTRAR);<br><br>   if ($rU==$null) {<br>             # request with no Username in RURI<br>            sl_send_reply("484","Address Incomplete");<br>                exit;<br> }<br><br>   # dispatch destinations to PSTN<br>       #route(PSTN);<br><br>         route(DISPATCH);<br><br>     # user location service<br>}<br><br># Wrapper for relaying requests<br>route[RELAY] {<br><br>       # enable additional event routes for forwarded requests<br>       # - serial forking, RTP relaying handling, a.s.o.<br>     if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {<br>             if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");<br>       }<br>     if (is_method("INVITE|SUBSCRIBE|UPDATE")) {<br>         if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");<br>        }<br>     if (is_method("INVITE")) {<br>          if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");<br>    }<br><br>   if (!t_relay()) {<br>             sl_reply_error();<br>     }<br>     exit;<br>}<br><br> Dispatch requests                                                           <br>route[DISPATCH] {                                                             <br>        # round robin dispatching on gateways group '1'                       <br>        if(!ds_select_dst("1", "4")) {                                        <br>                send_reply("404", "No destination");                          <br>                exit;                                                         <br>        }                                                                     <br>        xdbg("--- SCRIPT: going to <$ru> via <$du> (attrs: $xavp(_dsdst_=>attrs))\n");<br>      t_on_failure("RTF_DISPATCH"); <br>      $rcv_addr="sip:"+$si+":"+$sp;                                                <br>     if(starts_with("$rcv_addr","$du"))<br>        {<br>             route(LOCATION);<br>      }<br>     else<br>  {<br>             route(RELAY); <br>        }                                                                <br>     exit;                                                                         <br>}                                                                                     <br><br># Try next destionations in failure route                                             <br>failure_route[RTF_DISPATCH] {                                                         <br>      xnotice("RTF_DISPATCH: $rm $rU [$ci]");                                       <br>   if (t_is_canceled()) {                                                        <br>            exit;                                                                 <br>        }                                                                             <br># next DST - only for 500 or local timeout                                    <br>        if (t_check_status("(^5)")                                                    <br>                    or (t_branch_timeout() and !t_branch_replied())) {            <br>          xnotice("RTF_DISPATCH: WARNING $du is broken and marked as inactive");<br># ds_mark_dst("ip");                                                 <br>             if(ds_next_dst()) {                                                   <br>#xdbg("--- SCRIPT: retrying to <$ru> via <$du> (attrs: $xavp(_dsdst_=>attrs))\n");<br>                  t_on_failure("RTF_DISPATCH");                                                     <br>                        route(RELAY);                                                                     <br>                  exit;                                                                             <br>              }                                                                                         <br>        }                                                                                                 <br>}                                                                                                         <br><br><br># Per SIP request initial checks<br>route[REQINIT] {<br># no connect for sending replies<br>  set_reply_no_connect();<br><br>#!ifdef WITH_ANTIFLOOD<br># flood detection from same IP and traffic ban for a while<br># be sure you exclude checking trusted peers, such as pstn gateways<br># - local host excluded (e.g., loop to self)<br>      if(src_ip!=myself) {<br>          if($sht(ipban=>$si)!=$null) {<br># ip is already blocked<br>                     xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");<br>                      exit;<br>         }<br>             if (!pike_check_req()) {<br>                      xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");<br>                       $sht(ipban=>$si) = 1;<br>                      exit;<br>         }<br>     }<br>#!endif<br>    if($ua =~ "friendly-scanner|sipcli|sipvicious|VaxSIPUserAgent") {<br># silent drop for scanners - uncomment next line if want to reply<br># sl_send_reply("200", "OK");<br>             exit;<br> }<br><br>   if (!mf_process_maxfwd_header("10")) {<br>              sl_send_reply("483","Too Many Hops");<br>             exit;<br> }<br><br>   if(is_method("OPTIONS") && uri==myself && $rU==$null) {<br>             sl_send_reply("200","Keepalive");<br>         exit;<br> }<br><br>   if(!sanity_check("17895", "7")) {<br>         xlog("Malformed SIP request from $si:$sp\n");<br>               exit;<br> }<br>}<br><br># Handle requests within SIP dialogs<br>route[WITHINDLG] {<br>      if (!has_totag()) return;<br><br># sequential request withing a dialog should<br># take the path determined by record-routing<br>       if (loose_route()) {<br>          route(DLGURI);<br>                if (is_method("BYE")) {<br>                     setflag(FLT_ACC); # do accounting ...<br>                         setflag(FLT_ACCFAILED); # ... even if the transaction fails<br>           } else if ( is_method("ACK") ) {<br># ACK is forwarded statelessly<br>                    route(NATMANAGE);<br>             } else if ( is_method("NOTIFY") ) {<br># Add Record-Route for in-dialog NOTIFY as per RFC 6665.<br>                       record_route();<br>               }<br>             route(RELAY);<br>         exit;<br> }<br><br>   if (is_method("SUBSCRIBE") && uri == myself) {<br>              # in-dialog subscribe requests<br>                route(PRESENCE);<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>                    route(RELAY);<br>                 exit;<br>         } else {<br>                      # ACK without matching transaction ... ignore and discard<br>                     exit;<br>         }<br>     }<br>     sl_send_reply("404","Not here");<br>  exit;<br>}<br><br># Handle SIP registrations<br>route[REGISTRAR] {<br>    if (!is_method("REGISTER")) return;<br><br>       if(isflagset(FLT_NATS)) {<br>             setbflag(FLB_NATB);<br>#!ifdef WITH_NATSIPPING<br>          # do SIP NAT pinging<br>          setbflag(FLB_NATSIPPING);<br>#!endif<br>    }<br>     if (!save("location")) {<br>            sl_reply_error();<br>     }<br>     exit;<br>}<br><br># User location service<br>route[LOCATION] {<br><br>#!ifdef WITH_SPEEDDIAL<br>      # search for short dialing - 2-digit extension<br>        if($rU=~"^[0-9][0-9]$") {<br>           if(sd_lookup("speed_dial")) {<br>                       route(SIPOUT);<br>                }<br>     }<br>#!endif<br><br>#!ifdef WITH_ALIASDB<br>    # search in DB-based aliases<br>  if(alias_db_lookup("dbaliases")) {<br>          route(SIPOUT);<br>        }<br>#!endif<br><br>  $avp(oexten) = $rU;<br>   if (!lookup("location")) {<br>          $var(rc) = $rc;<br>               route(TOVOICEMAIL);<br>           t_newtran();<br>          switch ($var(rc)) {<br>                   case -1:<br>                      case -3:<br>                              send_reply("404", "Not Found");<br>                           exit;<br>                 case -2:<br>                              send_reply("405", "Method Not Allowed");<br>                          exit;<br>         }<br>     }<br><br>   # when routing via usrloc, log the missed calls also<br>  if (is_method("INVITE")) {<br>          setflag(FLT_ACCMISSED);<br>       }<br><br>   route(RELAY);<br> exit;<br>}<br><br># Presence server processing<br>route[PRESENCE] {<br>   if(!is_method("PUBLISH|SUBSCRIBE")) return;<br><br>       if(is_method("SUBSCRIBE") && $hdr(Event)=="message-summary") {<br>            route(TOVOICEMAIL);<br>           # returns here if no voicemail server is configured<br>           sl_send_reply("404", "No voicemail service");<br>             exit;<br> }<br><br>#!ifdef WITH_PRESENCE<br>    if (!t_newtran()) {<br>           sl_reply_error();<br>             exit;<br> }<br><br>   if(is_method("PUBLISH")) {<br>          handle_publish();<br>             t_release();<br>  } else if(is_method("SUBSCRIBE")) {<br>         handle_subscribe();<br>           t_release();<br>  }<br>     exit;<br>#!endif<br><br>      # if presence enabled, this part will not be executed<br> if (is_method("PUBLISH") || $rU==$null) {<br>           sl_send_reply("404", "Not here");<br>         exit;<br> }<br>     return;<br>}<br><br># IP authorization and user authentication<br>route[AUTH] {<br>#!ifdef WITH_AUTH<br><br>#!ifdef WITH_IPAUTH<br>     if((!is_method("REGISTER")) && allow_source_address()) {<br>            # source IP allowed<br>           return;<br>       }<br>#!endif<br><br>  if (is_method("REGISTER") || from_uri==myself) {<br>            # authenticate requests<br>               if (!auth_check("$fd", "subscriber", "1")) {<br>                    auth_challenge("$fd", "0");<br>                       exit;<br>         }<br>             # user authenticated - remove auth header<br>             if(!is_method("REGISTER|PUBLISH"))<br>                  consume_credentials();<br>        }<br>     # if caller is not local subscriber, then check if it calls<br>   # a local destination, otherwise deny, not an open relay here<br> if (from_uri!=myself && uri!=myself) {<br>                sl_send_reply("403","Not relaying");<br>              exit;<br> }<br><br>#!else<br><br> # authentication not enabled - do not relay at all to foreign networks<br>        if(uri!=myself) {<br>             sl_send_reply("403","Not relaying");<br>              exit;<br> }<br><br>#!endif<br>  return;<br>}<br><br># Caller NAT detection<br>route[NATDETECT] {<br>#!ifdef WITH_NAT<br>    force_rport();<br>        if (nat_uac_test("19")) {<br>           if (is_method("REGISTER")) {<br>                        fix_nated_register();<br>         } else {<br>                      if(is_first_hop()) {<br>                          set_contact_alias();<br>                  }<br>             }<br>             setflag(FLT_NATS);<br>    }<br>#!endif<br>    return;<br>}<br><br># RTPProxy control and signaling updates for NAT traversal<br>route[NATMANAGE] {<br>#!ifdef WITH_NAT<br>        if (is_request()) {<br>           if(has_totag()) {<br>                     if(check_route_param("nat=yes")) {<br>                          setbflag(FLB_NATB);<br>                   }<br>             }<br>     }<br>     if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB))) return;<br><br>#!ifdef WITH_RTPENGINE<br> if(nat_uac_test("8")) {<br>             rtpengine_manage("replace-origin replace-session-connection");<br>      } else {<br>              rtpengine_manage("trust-address replace-origin replace-session-connection");<br>        }<br>#!else<br>     if(nat_uac_test("8")) {<br>             rtpproxy_manage("co");<br>      } else {<br>              rtpproxy_manage("cor");<br>     }<br>#!endif<br><br>  if (is_request()) {<br>           if (!has_totag()) {<br>                   if(t_is_branch_route()) {<br>                             add_rr_param(";nat=yes");<br>                   }<br>             }<br>     }<br>     if (is_reply()) {<br>             if(isbflagset(FLB_NATB)) {<br>                    if(is_first_hop())<br>                            set_contact_alias();<br>          }<br>     }<br><br>   if(isbflagset(FLB_NATB)) {<br>            # no connect message in a dialog involving NAT traversal<br>              if (is_request()) {<br>                   if(has_totag()) {<br>                             set_forward_no_connect();<br>                     }<br>             }<br>     }<br>#!endif<br>    return;<br>}<br><br># URI update for dialog requests<br>route[DLGURI] {<br>#!ifdef WITH_NAT<br>     if(!isdsturiset()) {<br>          handle_ruri_alias();<br>  }<br>#!endif<br>    return;<br>}<br><br># Routing to foreign domains<br>route[SIPOUT] {<br>   if (uri==myself) return;<br><br>    append_hf("P-hint: outbound\r\n");<br>  route(RELAY);<br> exit;<br>}<br><br># PSTN GW routing<br>route[PSTN] {<br>#!ifdef WITH_PSTN<br>       # check if PSTN GW IP is defined<br>      if (strempty($sel(cfg_get.pstn.gw_ip))) {<br>             xlog("SCRIPT: PSTN routing enabled but pstn.gw_ip not defined\n");<br>          return;<br>       }<br><br>   # route to PSTN dialed numbers starting with '+' or '00'<br>      #     (international format)<br>        # - update the condition to match your dialing rules for PSTN routing<br> if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$")) return;<br><br>   # only local users allowed to call<br>    if(from_uri!=myself) {<br>                sl_send_reply("403", "Not Allowed");<br>              exit;<br> }<br><br>   # normalize target number for pstn gateway<br>    # - convert leading 00 to +<br>   if (starts_with("$rU", "00")) {<br>           strip(2);<br>             prefix("+");<br>        }<br><br>   if (strempty($sel(cfg_get.pstn.gw_port))) {<br>           $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);<br>      } else {<br>              $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip) + ":"<br>                                       + $sel(cfg_get.pstn.gw_port);<br> }<br><br>   route(RELAY);<br> exit;<br>#!endif<br><br>      return;<br>}<br><br># XMLRPC routing<br>#!ifdef WITH_XMLRPC<br>route[XMLRPC] {<br>  # allow XMLRPC from localhost<br> if ((method=="POST" || method=="GET")<br>                     && (src_ip==127.0.0.1)) {<br>             # close connection only for xmlrpclib user agents (there is a bug in<br>          # xmlrpclib: it waits for EOF before interpreting the response).<br>              if ($hdr(User-Agent) =~ "xmlrpclib")<br>                        set_reply_close();<br>            set_reply_no_connect();<br>               dispatch_rpc();<br>               exit;<br> }<br>     send_reply("403", "Forbidden");<br>   exit;<br>}<br>#!endif<br><br># Routing to voicemail server<br>route[TOVOICEMAIL] {<br>#!ifdef WITH_VOICEMAIL<br>      if(!is_method("INVITE|SUBSCRIBE")) return;<br><br>        # check if VoiceMail server IP is defined<br>     if (strempty($sel(cfg_get.voicemail.srv_ip))) {<br>               xlog("SCRIPT: VoiceMail routing enabled but IP not defined\n");<br>             return;<br>       }<br>     if(is_method("INVITE")) {<br>           if($avp(oexten)==$null) return;<br><br>             $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)<br>                                + ":" + $sel(cfg_get.voicemail.srv_port);<br>   } else {<br>              if($rU==$null) return;<br><br>              $ru = "sip:" + $rU + "@" + $sel(cfg_get.voicemail.srv_ip)<br>                         + ":" + $sel(cfg_get.voicemail.srv_port);<br>   }<br>     route(RELAY);<br> exit;<br>#!endif<br><br>      return;<br>}<br><br># Manage outgoing branches<br>branch_route[MANAGE_BRANCH] {<br>       xdbg("new branch [$T_branch_idx] to $ru\n");<br>        route(NATMANAGE);<br>}<br><br># Manage incoming replies<br>reply_route {<br>      if(!sanity_check("17604", "6")) {<br>         xlog("Malformed SIP response from $si:$sp\n");<br>              drop;<br> }<br>}<br><br># Manage incoming replies in transaction context<br>onreply_route[MANAGE_REPLY] {<br>       xdbg("incoming reply\n");<br>   if(status=~"[12][0-9][0-9]") {<br>              route(NATMANAGE);<br>     }<br>}<br><br># Manage failure routing cases<br>failure_route[MANAGE_FAILURE] {<br>       route(NATMANAGE);<br><br>   if (t_is_canceled()) exit;<br><br>#!ifdef WITH_BLOCK3XX<br>   # block call redirect based on 3xx replies.<br>   if (t_check_status("3[0-9][0-9]")) {<br>                t_reply("404","Not found");<br>               exit;<br> }<br>#!endif<br><br>#!ifdef WITH_BLOCK401407<br>        # block call redirect based on 401, 407 replies.<br>      if (t_check_status("401|407")) {<br>            t_reply("404","Not found");<br>               exit;<br> }<br>#!endif<br><br>#!ifdef WITH_VOICEMAIL<br>  # serial forking<br>      # - route to voicemail on busy or no answer (timeout)<br> if (t_check_status("486|408")) {<br>            $du = $null;<br>          route(TOVOICEMAIL);<br>           exit;<br> }<br>#!endif<br>}<br></div><div><br></div><div><br></div><div> <br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><div dir="ltr"><br><br><br><br><br><br><br><br><font color="#999999"><b>Regards:</b><br>Gaurav Kumar</font><br></div></div><div><br></div></div></div></div></div></div></div></div></div></div></div>