kamailio.cfg: describe log levels
[sip-router] / etc / kamailio.cfg
1 #!KAMAILIO
2 #
3 # Kamailio (OpenSER) SIP Server v4.0 - default configuration script
4 #     - web: http://www.kamailio.org
5 #     - git: http://sip-router.org
6 #
7 # Direct your questions about this file to: <sr-users@lists.sip-router.org>
8 #
9 # Refer to the Core CookBook at http://www.kamailio.org/wiki/
10 # for an explanation of possible statements, functions and parameters.
11 #
12 # Several features can be enabled using '#!define WITH_FEATURE' directives:
13 #
14 # *** To run in debug mode: 
15 #     - define WITH_DEBUG
16 #
17 # *** To enable mysql: 
18 #     - define WITH_MYSQL
19 #
20 # *** To enable authentication execute:
21 #     - enable mysql
22 #     - define WITH_AUTH
23 #     - add users using 'kamctl'
24 #
25 # *** To enable IP authentication execute:
26 #     - enable mysql
27 #     - enable authentication
28 #     - define WITH_IPAUTH
29 #     - add IP addresses with group id '1' to 'address' table
30 #
31 # *** To enable persistent user location execute:
32 #     - enable mysql
33 #     - define WITH_USRLOCDB
34 #
35 # *** To enable presence server execute:
36 #     - enable mysql
37 #     - define WITH_PRESENCE
38 #
39 # *** To enable nat traversal execute:
40 #     - define WITH_NAT
41 #     - install RTPProxy: http://www.rtpproxy.org
42 #     - start RTPProxy:
43 #        rtpproxy -l _your_public_ip_ -s udp:localhost:7722
44 #
45 # *** To enable PSTN gateway routing execute:
46 #     - define WITH_PSTN
47 #     - set the value of pstn.gw_ip
48 #     - check route[PSTN] for regexp routing condition
49 #
50 # *** To enable database aliases lookup execute:
51 #     - enable mysql
52 #     - define WITH_ALIASDB
53 #
54 # *** To enable speed dial lookup execute:
55 #     - enable mysql
56 #     - define WITH_SPEEDDIAL
57 #
58 # *** To enable multi-domain support execute:
59 #     - enable mysql
60 #     - define WITH_MULTIDOMAIN
61 #
62 # *** To enable TLS support execute:
63 #     - adjust CFGDIR/tls.cfg as needed
64 #     - define WITH_TLS
65 #
66 # *** To enable XMLRPC support execute:
67 #     - define WITH_XMLRPC
68 #     - adjust route[XMLRPC] for access policy
69 #
70 # *** To enable anti-flood detection execute:
71 #     - adjust pike and htable=>ipban settings as needed (default is
72 #       block if more than 16 requests in 2 seconds and ban for 300 seconds)
73 #     - define WITH_ANTIFLOOD
74 #
75 # *** To block 3XX redirect replies execute:
76 #     - define WITH_BLOCK3XX
77 #
78 # *** To enable VoiceMail routing execute:
79 #     - define WITH_VOICEMAIL
80 #     - set the value of voicemail.srv_ip
81 #     - adjust the value of voicemail.srv_port
82 #
83 # *** To enhance accounting execute:
84 #     - enable mysql
85 #     - define WITH_ACCDB
86 #     - add following columns to database
87 #!ifdef ACCDB_COMMENT
88   ALTER TABLE acc ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
89   ALTER TABLE acc ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
90   ALTER TABLE acc ADD COLUMN src_ip varchar(64) NOT NULL default '';
91   ALTER TABLE acc ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
92   ALTER TABLE acc ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
93   ALTER TABLE acc ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
94   ALTER TABLE missed_calls ADD COLUMN src_user VARCHAR(64) NOT NULL DEFAULT '';
95   ALTER TABLE missed_calls ADD COLUMN src_domain VARCHAR(128) NOT NULL DEFAULT '';
96   ALTER TABLE missed_calls ADD COLUMN src_ip varchar(64) NOT NULL default '';
97   ALTER TABLE missed_calls ADD COLUMN dst_ouser VARCHAR(64) NOT NULL DEFAULT '';
98   ALTER TABLE missed_calls ADD COLUMN dst_user VARCHAR(64) NOT NULL DEFAULT '';
99   ALTER TABLE missed_calls ADD COLUMN dst_domain VARCHAR(128) NOT NULL DEFAULT '';
100 #!endif
101
102 ####### Include Local Config If Exists #########
103 import_file "kamailio-local.cfg"
104
105 ####### Defined Values #########
106
107 # *** Value defines - IDs used later in config
108 #!ifdef WITH_MYSQL
109 # - database URL - used to connect to database server by modules such
110 #       as: auth_db, acc, usrloc, a.s.o.
111 #!ifndef DBURL
112 #!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio"
113 #!endif
114 #!endif
115 #!ifdef WITH_MULTIDOMAIN
116 # - the value for 'use_domain' parameters
117 #!define MULTIDOMAIN 1
118 #!else
119 #!define MULTIDOMAIN 0
120 #!endif
121
122 # - flags
123 #   FLT_ - per transaction (message) flags
124 #       FLB_ - per branch flags
125 #!define FLT_ACC 1
126 #!define FLT_ACCMISSED 2
127 #!define FLT_ACCFAILED 3
128 #!define FLT_NATS 5
129
130 #!define FLB_NATB 6
131 #!define FLB_NATSIPPING 7
132
133 ####### Global Parameters #########
134
135 ### LOG Levels: 3=DBG, 2=INFO, 1=NOTICE, 0=WARN, -1=ERR
136 #!ifdef WITH_DEBUG
137 debug=4
138 log_stderror=yes
139 #!else
140 debug=2
141 log_stderror=no
142 #!endif
143
144 memdbg=5
145 memlog=5
146
147 log_facility=LOG_LOCAL0
148
149 fork=yes
150 children=4
151
152 /* uncomment the next line to disable TCP (default on) */
153 #disable_tcp=yes
154
155 /* uncomment the next line to disable the auto discovery of local aliases
156    based on reverse DNS on IPs (default on) */
157 #auto_aliases=no
158
159 /* add local domain aliases */
160 #alias="sip.mydomain.com"
161
162 /* uncomment and configure the following line if you want Kamailio to 
163    bind on a specific interface/port/proto (default bind on all available) */
164 #listen=udp:10.0.0.10:5060
165
166 /* port to listen to
167  * - can be specified more than once if needed to listen on many ports */
168 port=5060
169
170 #!ifdef WITH_TLS
171 enable_tls=yes
172 #!endif
173
174 # life time of TCP connection when there is no traffic
175 # - a bit higher than registration expires to cope with UA behind NAT
176 tcp_connection_lifetime=3605
177
178 ####### Custom Parameters #########
179
180 # These parameters can be modified runtime via RPC interface
181 # - see the documentation of 'cfg_rpc' module.
182 #
183 # Format: group.id = value 'desc' description
184 # Access: $sel(cfg_get.group.id) or @cfg_get.group.id
185 #
186
187 #!ifdef WITH_PSTN
188 # PSTN GW Routing
189 #
190 # - pstn.gw_ip: valid IP or hostname as string value, example:
191 # pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"
192 #
193 # - by default is empty to avoid misrouting
194 pstn.gw_ip = "" desc "PSTN GW Address"
195 pstn.gw_port = "" desc "PSTN GW Port"
196 #!endif
197
198 #!ifdef WITH_VOICEMAIL
199 # VoiceMail Routing on offline, busy or no answer
200 #
201 # - by default Voicemail server IP is empty to avoid misrouting
202 voicemail.srv_ip = "" desc "VoiceMail IP Address"
203 voicemail.srv_port = "5060" desc "VoiceMail Port"
204 #!endif
205
206 ####### Modules Section ########
207
208 # set paths to location of modules (to sources or installation folders)
209 #!ifdef WITH_SRCPATH
210 mpath="modules_k:modules"
211 #!else
212 mpath="/usr/local/lib/kamailio/modules_k/:/usr/local/lib/kamailio/modules/"
213 #!endif
214
215 #!ifdef WITH_MYSQL
216 loadmodule "db_mysql.so"
217 #!endif
218
219 loadmodule "mi_fifo.so"
220 loadmodule "kex.so"
221 loadmodule "corex.so"
222 loadmodule "tm.so"
223 loadmodule "tmx.so"
224 loadmodule "sl.so"
225 loadmodule "rr.so"
226 loadmodule "pv.so"
227 loadmodule "maxfwd.so"
228 loadmodule "usrloc.so"
229 loadmodule "registrar.so"
230 loadmodule "textops.so"
231 loadmodule "siputils.so"
232 loadmodule "xlog.so"
233 loadmodule "sanity.so"
234 loadmodule "ctl.so"
235 loadmodule "cfg_rpc.so"
236 loadmodule "mi_rpc.so"
237 loadmodule "acc.so"
238
239 #!ifdef WITH_AUTH
240 loadmodule "auth.so"
241 loadmodule "auth_db.so"
242 #!ifdef WITH_IPAUTH
243 loadmodule "permissions.so"
244 #!endif
245 #!endif
246
247 #!ifdef WITH_ALIASDB
248 loadmodule "alias_db.so"
249 #!endif
250
251 #!ifdef WITH_SPEEDDIAL
252 loadmodule "speeddial.so"
253 #!endif
254
255 #!ifdef WITH_MULTIDOMAIN
256 loadmodule "domain.so"
257 #!endif
258
259 #!ifdef WITH_PRESENCE
260 loadmodule "presence.so"
261 loadmodule "presence_xml.so"
262 #!endif
263
264 #!ifdef WITH_NAT
265 loadmodule "nathelper.so"
266 loadmodule "rtpproxy.so"
267 #!endif
268
269 #!ifdef WITH_TLS
270 loadmodule "tls.so"
271 #!endif
272
273 #!ifdef WITH_ANTIFLOOD
274 loadmodule "htable.so"
275 loadmodule "pike.so"
276 #!endif
277
278 #!ifdef WITH_XMLRPC
279 loadmodule "xmlrpc.so"
280 #!endif
281
282 #!ifdef WITH_DEBUG
283 loadmodule "debugger.so"
284 #!endif
285
286 # ----------------- setting module-specific parameters ---------------
287
288
289 # ----- mi_fifo params -----
290 modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")
291
292
293 # ----- tm params -----
294 # auto-discard branches from previous serial forking leg
295 modparam("tm", "failure_reply_mode", 3)
296 # default retransmission timeout: 30sec
297 modparam("tm", "fr_timer", 30000)
298 # default invite retransmission timeout after 1xx: 120sec
299 modparam("tm", "fr_inv_timer", 120000)
300
301
302 # ----- rr params -----
303 # add value to ;lr param to cope with most of the UAs
304 modparam("rr", "enable_full_lr", 1)
305 # do not append from tag to the RR (no need for this script)
306 modparam("rr", "append_fromtag", 0)
307
308
309 # ----- registrar params -----
310 modparam("registrar", "method_filtering", 1)
311 /* uncomment the next line to disable parallel forking via location */
312 # modparam("registrar", "append_branches", 0)
313 /* uncomment the next line not to allow more than 10 contacts per AOR */
314 #modparam("registrar", "max_contacts", 10)
315 # max value for expires of registrations
316 modparam("registrar", "max_expires", 3600)
317 # set it to 1 to enable GRUU
318 modparam("registrar", "gruu_enabled", 0)
319
320
321 # ----- acc params -----
322 /* what special events should be accounted ? */
323 modparam("acc", "early_media", 0)
324 modparam("acc", "report_ack", 0)
325 modparam("acc", "report_cancels", 0)
326 /* by default ww do not adjust the direct of the sequential requests.
327    if you enable this parameter, be sure the enable "append_fromtag"
328    in "rr" module */
329 modparam("acc", "detect_direction", 0)
330 /* account triggers (flags) */
331 modparam("acc", "log_flag", FLT_ACC)
332 modparam("acc", "log_missed_flag", FLT_ACCMISSED)
333 modparam("acc", "log_extra", 
334         "src_user=$fU;src_domain=$fd;src_ip=$si;"
335         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
336 modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
337 /* enhanced DB accounting */
338 #!ifdef WITH_ACCDB
339 modparam("acc", "db_flag", FLT_ACC)
340 modparam("acc", "db_missed_flag", FLT_ACCMISSED)
341 modparam("acc", "db_url", DBURL)
342 modparam("acc", "db_extra",
343         "src_user=$fU;src_domain=$fd;src_ip=$si;"
344         "dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
345 #!endif
346
347
348 # ----- usrloc params -----
349 /* enable DB persistency for location entries */
350 #!ifdef WITH_USRLOCDB
351 modparam("usrloc", "db_url", DBURL)
352 modparam("usrloc", "db_mode", 2)
353 modparam("usrloc", "use_domain", MULTIDOMAIN)
354 #!endif
355
356
357 # ----- auth_db params -----
358 #!ifdef WITH_AUTH
359 modparam("auth_db", "db_url", DBURL)
360 modparam("auth_db", "calculate_ha1", yes)
361 modparam("auth_db", "password_column", "password")
362 modparam("auth_db", "load_credentials", "")
363 modparam("auth_db", "use_domain", MULTIDOMAIN)
364
365 # ----- permissions params -----
366 #!ifdef WITH_IPAUTH
367 modparam("permissions", "db_url", DBURL)
368 modparam("permissions", "db_mode", 1)
369 #!endif
370
371 #!endif
372
373
374 # ----- alias_db params -----
375 #!ifdef WITH_ALIASDB
376 modparam("alias_db", "db_url", DBURL)
377 modparam("alias_db", "use_domain", MULTIDOMAIN)
378 #!endif
379
380
381 # ----- speedial params -----
382 #!ifdef WITH_SPEEDDIAL
383 modparam("speeddial", "db_url", DBURL)
384 modparam("speeddial", "use_domain", MULTIDOMAIN)
385 #!endif
386
387
388 # ----- domain params -----
389 #!ifdef WITH_MULTIDOMAIN
390 modparam("domain", "db_url", DBURL)
391 # register callback to match myself condition with domains list
392 modparam("domain", "register_myself", 1)
393 #!endif
394
395
396 #!ifdef WITH_PRESENCE
397 # ----- presence params -----
398 modparam("presence", "db_url", DBURL)
399
400 # ----- presence_xml params -----
401 modparam("presence_xml", "db_url", DBURL)
402 modparam("presence_xml", "force_active", 1)
403 #!endif
404
405
406 #!ifdef WITH_NAT
407 # ----- rtpproxy params -----
408 modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
409
410 # ----- nathelper params -----
411 modparam("nathelper", "natping_interval", 30)
412 modparam("nathelper", "ping_nated_only", 1)
413 modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
414 modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
415
416 # params needed for NAT traversal in other modules
417 modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
418 modparam("usrloc", "nat_bflag", FLB_NATB)
419 #!endif
420
421
422 #!ifdef WITH_TLS
423 # ----- tls params -----
424 modparam("tls", "config", "/usr/local/etc/kamailio/tls.cfg")
425 #!endif
426
427 #!ifdef WITH_ANTIFLOOD
428 # ----- pike params -----
429 modparam("pike", "sampling_time_unit", 2)
430 modparam("pike", "reqs_density_per_unit", 16)
431 modparam("pike", "remove_latency", 4)
432
433 # ----- htable params -----
434 # ip ban htable with autoexpire after 5 minutes
435 modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")
436 #!endif
437
438 #!ifdef WITH_XMLRPC
439 # ----- xmlrpc params -----
440 modparam("xmlrpc", "route", "XMLRPC");
441 modparam("xmlrpc", "url_match", "^/RPC")
442 #!endif
443
444 #!ifdef WITH_DEBUG
445 # ----- debugger params -----
446 modparam("debugger", "cfgtrace", 1)
447 #!endif
448
449 ####### Routing Logic ########
450
451
452 # Main SIP request routing logic
453 # - processing of any incoming SIP request starts with this route
454 # - note: this is the same as route { ... }
455 request_route {
456
457         # per request initial checks
458         route(REQINIT);
459
460         # NAT detection
461         route(NATDETECT);
462
463         # CANCEL processing
464         if (is_method("CANCEL"))
465         {
466                 if (t_check_trans())
467                         t_relay();
468                 exit;
469         }
470
471         # handle requests within SIP dialogs
472         route(WITHINDLG);
473
474         ### only initial requests (no To tag)
475
476         t_check_trans();
477
478         # authentication
479         route(AUTH);
480
481         # record routing for dialog forming requests (in case they are routed)
482         # - remove preloaded route headers
483         remove_hf("Route");
484         if (is_method("INVITE|SUBSCRIBE"))
485                 record_route();
486
487         # account only INVITEs
488         if (is_method("INVITE"))
489         {
490                 setflag(FLT_ACC); # do accounting
491         }
492
493         # dispatch requests to foreign domains
494         route(SIPOUT);
495
496         ### requests for my local domains
497
498         # handle presence related requests
499         route(PRESENCE);
500
501         # handle registrations
502         route(REGISTRAR);
503
504         if ($rU==$null)
505         {
506                 # request with no Username in RURI
507                 sl_send_reply("484","Address Incomplete");
508                 exit;
509         }
510
511         # dispatch destinations to PSTN
512         route(PSTN);
513
514         # user location service
515         route(LOCATION);
516
517         route(RELAY);
518 }
519
520
521 route[RELAY] {
522
523         # enable additional event routes for forwarded requests
524         # - serial forking, RTP relaying handling, a.s.o.
525         if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {
526                 if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");
527         }
528         if (is_method("INVITE|SUBSCRIBE|UPDATE")) {
529                 if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");
530         }
531         if (is_method("INVITE")) {
532                 if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");
533         }
534
535         if (!t_relay()) {
536                 sl_reply_error();
537         }
538         exit;
539 }
540
541 # Per SIP request initial checks
542 route[REQINIT] {
543 #!ifdef WITH_ANTIFLOOD
544         # flood dection from same IP and traffic ban for a while
545         # be sure you exclude checking trusted peers, such as pstn gateways
546         # - local host excluded (e.g., loop to self)
547         if(src_ip!=myself)
548         {
549                 if($sht(ipban=>$si)!=$null)
550                 {
551                         # ip is already blocked
552                         xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
553                         exit;
554                 }
555                 if (!pike_check_req())
556                 {
557                         xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
558                         $sht(ipban=>$si) = 1;
559                         exit;
560                 }
561         }
562 #!endif
563
564         if (!mf_process_maxfwd_header("10")) {
565                 sl_send_reply("483","Too Many Hops");
566                 exit;
567         }
568
569         if(!sanity_check("1511", "7"))
570         {
571                 xlog("Malformed SIP message from $si:$sp\n");
572                 exit;
573         }
574 }
575
576 # Handle requests within SIP dialogs
577 route[WITHINDLG] {
578         if (has_totag()) {
579                 # sequential request withing a dialog should
580                 # take the path determined by record-routing
581                 if (loose_route()) {
582                         route(DLGURI);
583                         if (is_method("BYE")) {
584                                 setflag(FLT_ACC); # do accounting ...
585                                 setflag(FLT_ACCFAILED); # ... even if the transaction fails
586                         }
587                         else if ( is_method("ACK") ) {
588                                 # ACK is forwarded statelessy
589                                 route(NATMANAGE);
590                         }
591                         else if ( is_method("NOTIFY") ) {
592                                 # Add Record-Route for in-dialog NOTIFY as per RFC 6665.
593                                 record_route();
594                         }
595                         route(RELAY);
596                 } else {
597                         if (is_method("SUBSCRIBE") && uri == myself) {
598                                 # in-dialog subscribe requests
599                                 route(PRESENCE);
600                                 exit;
601                         }
602                         if ( is_method("ACK") ) {
603                                 if ( t_check_trans() ) {
604                                         # no loose-route, but stateful ACK;
605                                         # must be an ACK after a 487
606                                         # or e.g. 404 from upstream server
607                                         t_relay();
608                                         exit;
609                                 } else {
610                                         # ACK without matching transaction ... ignore and discard
611                                         exit;
612                                 }
613                         }
614                         sl_send_reply("404","Not here");
615                 }
616                 exit;
617         }
618 }
619
620 # Handle SIP registrations
621 route[REGISTRAR] {
622         if (is_method("REGISTER"))
623         {
624                 if(isflagset(FLT_NATS))
625                 {
626                         setbflag(FLB_NATB);
627                         # uncomment next line to do SIP NAT pinging 
628                         ## setbflag(FLB_NATSIPPING);
629                 }
630                 if (!save("location"))
631                         sl_reply_error();
632
633                 exit;
634         }
635 }
636
637 # USER location service
638 route[LOCATION] {
639
640 #!ifdef WITH_SPEEDIAL
641         # search for short dialing - 2-digit extension
642         if($rU=~"^[0-9][0-9]$")
643                 if(sd_lookup("speed_dial"))
644                         route(SIPOUT);
645 #!endif
646
647 #!ifdef WITH_ALIASDB
648         # search in DB-based aliases
649         if(alias_db_lookup("dbaliases"))
650                 route(SIPOUT);
651 #!endif
652
653         $avp(oexten) = $rU;
654         if (!lookup("location")) {
655                 $var(rc) = $rc;
656                 route(TOVOICEMAIL);
657                 t_newtran();
658                 switch ($var(rc)) {
659                         case -1:
660                         case -3:
661                                 send_reply("404", "Not Found");
662                                 exit;
663                         case -2:
664                                 send_reply("405", "Method Not Allowed");
665                                 exit;
666                 }
667         }
668
669         # when routing via usrloc, log the missed calls also
670         if (is_method("INVITE"))
671         {
672                 setflag(FLT_ACCMISSED);
673         }
674 }
675
676 # Presence server route
677 route[PRESENCE] {
678         if(!is_method("PUBLISH|SUBSCRIBE"))
679                 return;
680
681 #!ifdef WITH_PRESENCE
682         if (!t_newtran())
683         {
684                 sl_reply_error();
685                 exit;
686         };
687
688         if(is_method("PUBLISH"))
689         {
690                 handle_publish();
691                 t_release();
692         }
693         else
694         if( is_method("SUBSCRIBE"))
695         {
696                 handle_subscribe();
697                 t_release();
698         }
699         exit;
700 #!endif
701         
702         # if presence enabled, this part will not be executed
703         if (is_method("PUBLISH") || $rU==$null)
704         {
705                 sl_send_reply("404", "Not here");
706                 exit;
707         }
708         return;
709 }
710
711 # Authentication route
712 route[AUTH] {
713 #!ifdef WITH_AUTH
714
715 #!ifdef WITH_IPAUTH
716         if((!is_method("REGISTER")) && allow_source_address())
717         {
718                 # source IP allowed
719                 return;
720         }
721 #!endif
722
723         if (is_method("REGISTER") || from_uri==myself)
724         {
725                 # authenticate requests
726                 if (!auth_check("$fd", "subscriber", "1")) {
727                         auth_challenge("$fd", "0");
728                         exit;
729                 }
730                 # user authenticated - remove auth header
731                 if(!is_method("REGISTER|PUBLISH"))
732                         consume_credentials();
733         }
734         # if caller is not local subscriber, then check if it calls
735         # a local destination, otherwise deny, not an open relay here
736         if (from_uri!=myself && uri!=myself)
737         {
738                 sl_send_reply("403","Not relaying");
739                 exit;
740         }
741
742 #!endif
743         return;
744 }
745
746 # Caller NAT detection route
747 route[NATDETECT] {
748 #!ifdef WITH_NAT
749         force_rport();
750         if (nat_uac_test("19")) {
751                 if (is_method("REGISTER")) {
752                         fix_nated_register();
753                 } else {
754                         add_contact_alias();
755                 }
756                 setflag(FLT_NATS);
757         }
758 #!endif
759         return;
760 }
761
762 # RTPProxy control
763 route[NATMANAGE] {
764 #!ifdef WITH_NAT
765         if (is_request()) {
766                 if(has_totag()) {
767                         if(check_route_param("nat=yes")) {
768                                 setbflag(FLB_NATB);
769                         }
770                 }
771         }
772         if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB)))
773                 return;
774
775         rtpproxy_manage();
776
777         if (is_request()) {
778                 if (!has_totag()) {
779                         add_rr_param(";nat=yes");
780                 }
781         }
782         if (is_reply()) {
783                 if(isbflagset(FLB_NATB)) {
784                         add_contact_alias();
785                 }
786         }
787 #!endif
788         return;
789 }
790
791 # URI update for dialog requests
792 route[DLGURI] {
793 #!ifdef WITH_NAT
794         if(!isdsturiset()) {
795                 handle_ruri_alias();
796         }
797 #!endif
798         return;
799 }
800
801 # Routing to foreign domains
802 route[SIPOUT] {
803         if (!uri==myself)
804         {
805                 append_hf("P-hint: outbound\r\n");
806                 route(RELAY);
807         }
808 }
809
810 # PSTN GW routing
811 route[PSTN] {
812 #!ifdef WITH_PSTN
813         # check if PSTN GW IP is defined
814         if (strempty($sel(cfg_get.pstn.gw_ip))) {
815                 xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
816                 return;
817         }
818
819         # route to PSTN dialed numbers starting with '+' or '00'
820         #     (international format)
821         # - update the condition to match your dialing rules for PSTN routing
822         if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))
823                 return;
824
825         # only local users allowed to call
826         if(from_uri!=myself) {
827                 sl_send_reply("403", "Not Allowed");
828                 exit;
829         }
830
831         if (strempty($sel(cfg_get.pstn.gw_port))) {
832                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
833         } else {
834                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip) + ":"
835                                         + $sel(cfg_get.pstn.gw_port);
836         }
837
838         route(RELAY);
839         exit;
840 #!endif
841
842         return;
843 }
844
845 # XMLRPC routing
846 #!ifdef WITH_XMLRPC
847 route[XMLRPC] {
848         # allow XMLRPC from localhost
849         if ((method=="POST" || method=="GET")
850                         && (src_ip==127.0.0.1)) {
851                 # close connection only for xmlrpclib user agents (there is a bug in
852                 # xmlrpclib: it waits for EOF before interpreting the response).
853                 if ($hdr(User-Agent) =~ "xmlrpclib")
854                         set_reply_close();
855                 set_reply_no_connect();
856                 dispatch_rpc();
857                 exit;
858         }
859         send_reply("403", "Forbidden");
860         exit;
861 }
862 #!endif
863
864 # route to voicemail server
865 route[TOVOICEMAIL] {
866 #!ifdef WITH_VOICEMAIL
867         if(!is_method("INVITE"))
868                 return;
869
870         # check if VoiceMail server IP is defined
871         if (strempty($sel(cfg_get.voicemail.srv_ip))) {
872                 xlog("SCRIPT: VoiceMail rotuing enabled but IP not defined\n");
873                 return;
874         }
875         if($avp(oexten)==$null)
876                 return;
877
878         $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
879                                 + ":" + $sel(cfg_get.voicemail.srv_port);
880         route(RELAY);
881         exit;
882 #!endif
883
884         return;
885 }
886
887 # manage outgoing branches
888 branch_route[MANAGE_BRANCH] {
889         xdbg("new branch [$T_branch_idx] to $ru\n");
890         route(NATMANAGE);
891 }
892
893 # manage incoming replies
894 onreply_route[MANAGE_REPLY] {
895         xdbg("incoming reply\n");
896         if(status=~"[12][0-9][0-9]")
897                 route(NATMANAGE);
898 }
899
900 # manage failure routing cases
901 failure_route[MANAGE_FAILURE] {
902         route(NATMANAGE);
903
904         if (t_is_canceled()) {
905                 exit;
906         }
907
908 #!ifdef WITH_BLOCK3XX
909         # block call redirect based on 3xx replies.
910         if (t_check_status("3[0-9][0-9]")) {
911                 t_reply("404","Not found");
912                 exit;
913         }
914 #!endif
915
916 #!ifdef WITH_VOICEMAIL
917         # serial forking
918         # - route to voicemail on busy or no answer (timeout)
919         if (t_check_status("486|408")) {
920                 route(TOVOICEMAIL);
921                 exit;
922         }
923 #!endif
924 }