911b7d62746b2a57cc08b357f909a85da06ee9da
[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 # ----- speeddial 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                         route(RELAY);
468                 }
469                 exit;
470         }
471
472         # handle requests within SIP dialogs
473         route(WITHINDLG);
474
475         ### only initial requests (no To tag)
476
477         t_check_trans();
478
479         # authentication
480         route(AUTH);
481
482         # record routing for dialog forming requests (in case they are routed)
483         # - remove preloaded route headers
484         remove_hf("Route");
485         if (is_method("INVITE|SUBSCRIBE"))
486                 record_route();
487
488         # account only INVITEs
489         if (is_method("INVITE"))
490         {
491                 setflag(FLT_ACC); # do accounting
492         }
493
494         # dispatch requests to foreign domains
495         route(SIPOUT);
496
497         ### requests for my local domains
498
499         # handle presence related requests
500         route(PRESENCE);
501
502         # handle registrations
503         route(REGISTRAR);
504
505         if ($rU==$null)
506         {
507                 # request with no Username in RURI
508                 sl_send_reply("484","Address Incomplete");
509                 exit;
510         }
511
512         # dispatch destinations to PSTN
513         route(PSTN);
514
515         # user location service
516         route(LOCATION);
517 }
518
519
520 route[RELAY] {
521
522         # enable additional event routes for forwarded requests
523         # - serial forking, RTP relaying handling, a.s.o.
524         if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {
525                 if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");
526         }
527         if (is_method("INVITE|SUBSCRIBE|UPDATE")) {
528                 if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");
529         }
530         if (is_method("INVITE")) {
531                 if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");
532         }
533
534         if (!t_relay()) {
535                 sl_reply_error();
536         }
537         exit;
538 }
539
540 # Per SIP request initial checks
541 route[REQINIT] {
542 #!ifdef WITH_ANTIFLOOD
543         # flood dection from same IP and traffic ban for a while
544         # be sure you exclude checking trusted peers, such as pstn gateways
545         # - local host excluded (e.g., loop to self)
546         if(src_ip!=myself)
547         {
548                 if($sht(ipban=>$si)!=$null)
549                 {
550                         # ip is already blocked
551                         xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
552                         exit;
553                 }
554                 if (!pike_check_req())
555                 {
556                         xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
557                         $sht(ipban=>$si) = 1;
558                         exit;
559                 }
560         }
561 #!endif
562
563         if (!mf_process_maxfwd_header("10")) {
564                 sl_send_reply("483","Too Many Hops");
565                 exit;
566         }
567
568         if(!sanity_check("1511", "7"))
569         {
570                 xlog("Malformed SIP message from $si:$sp\n");
571                 exit;
572         }
573 }
574
575 # Handle requests within SIP dialogs
576 route[WITHINDLG] {
577         if (has_totag()) {
578                 # sequential request withing a dialog should
579                 # take the path determined by record-routing
580                 if (loose_route()) {
581                         route(DLGURI);
582                         if (is_method("BYE")) {
583                                 setflag(FLT_ACC); # do accounting ...
584                                 setflag(FLT_ACCFAILED); # ... even if the transaction fails
585                         }
586                         else if ( is_method("ACK") ) {
587                                 # ACK is forwarded statelessy
588                                 route(NATMANAGE);
589                         }
590                         else if ( is_method("NOTIFY") ) {
591                                 # Add Record-Route for in-dialog NOTIFY as per RFC 6665.
592                                 record_route();
593                         }
594                         route(RELAY);
595                 } else {
596                         if (is_method("SUBSCRIBE") && uri == myself) {
597                                 # in-dialog subscribe requests
598                                 route(PRESENCE);
599                                 exit;
600                         }
601                         if ( is_method("ACK") ) {
602                                 if ( t_check_trans() ) {
603                                         # no loose-route, but stateful ACK;
604                                         # must be an ACK after a 487
605                                         # or e.g. 404 from upstream server
606                                         route(RELAY);
607                                         exit;
608                                 } else {
609                                         # ACK without matching transaction ... ignore and discard
610                                         exit;
611                                 }
612                         }
613                         sl_send_reply("404","Not here");
614                 }
615                 exit;
616         }
617 }
618
619 # Handle SIP registrations
620 route[REGISTRAR] {
621         if (is_method("REGISTER"))
622         {
623                 if(isflagset(FLT_NATS))
624                 {
625                         setbflag(FLB_NATB);
626                         # uncomment next line to do SIP NAT pinging 
627                         ## setbflag(FLB_NATSIPPING);
628                 }
629                 if (!save("location"))
630                         sl_reply_error();
631
632                 exit;
633         }
634 }
635
636 # USER location service
637 route[LOCATION] {
638
639 #!ifdef WITH_SPEEDDIAL
640         # search for short dialing - 2-digit extension
641         if($rU=~"^[0-9][0-9]$")
642                 if(sd_lookup("speed_dial"))
643                         route(SIPOUT);
644 #!endif
645
646 #!ifdef WITH_ALIASDB
647         # search in DB-based aliases
648         if(alias_db_lookup("dbaliases"))
649                 route(SIPOUT);
650 #!endif
651
652         $avp(oexten) = $rU;
653         if (!lookup("location")) {
654                 $var(rc) = $rc;
655                 route(TOVOICEMAIL);
656                 t_newtran();
657                 switch ($var(rc)) {
658                         case -1:
659                         case -3:
660                                 send_reply("404", "Not Found");
661                                 exit;
662                         case -2:
663                                 send_reply("405", "Method Not Allowed");
664                                 exit;
665                 }
666         }
667
668         # when routing via usrloc, log the missed calls also
669         if (is_method("INVITE"))
670         {
671                 setflag(FLT_ACCMISSED);
672         }
673
674         route(RELAY);
675         exit;
676 }
677
678 # Presence server route
679 route[PRESENCE] {
680         if(!is_method("PUBLISH|SUBSCRIBE"))
681                 return;
682
683 #!ifdef WITH_PRESENCE
684         if (!t_newtran())
685         {
686                 sl_reply_error();
687                 exit;
688         };
689
690         if(is_method("PUBLISH"))
691         {
692                 handle_publish();
693                 t_release();
694         }
695         else
696         if( is_method("SUBSCRIBE"))
697         {
698                 handle_subscribe();
699                 t_release();
700         }
701         exit;
702 #!endif
703         
704         # if presence enabled, this part will not be executed
705         if (is_method("PUBLISH") || $rU==$null)
706         {
707                 sl_send_reply("404", "Not here");
708                 exit;
709         }
710         return;
711 }
712
713 # Authentication route
714 route[AUTH] {
715 #!ifdef WITH_AUTH
716
717 #!ifdef WITH_IPAUTH
718         if((!is_method("REGISTER")) && allow_source_address())
719         {
720                 # source IP allowed
721                 return;
722         }
723 #!endif
724
725         if (is_method("REGISTER") || from_uri==myself)
726         {
727                 # authenticate requests
728                 if (!auth_check("$fd", "subscriber", "1")) {
729                         auth_challenge("$fd", "0");
730                         exit;
731                 }
732                 # user authenticated - remove auth header
733                 if(!is_method("REGISTER|PUBLISH"))
734                         consume_credentials();
735         }
736         # if caller is not local subscriber, then check if it calls
737         # a local destination, otherwise deny, not an open relay here
738         if (from_uri!=myself && uri!=myself)
739         {
740                 sl_send_reply("403","Not relaying");
741                 exit;
742         }
743
744 #!endif
745         return;
746 }
747
748 # Caller NAT detection route
749 route[NATDETECT] {
750 #!ifdef WITH_NAT
751         force_rport();
752         if (nat_uac_test("19")) {
753                 if (is_method("REGISTER")) {
754                         fix_nated_register();
755                 } else {
756                         add_contact_alias();
757                 }
758                 setflag(FLT_NATS);
759         }
760 #!endif
761         return;
762 }
763
764 # RTPProxy control
765 route[NATMANAGE] {
766 #!ifdef WITH_NAT
767         if (is_request()) {
768                 if(has_totag()) {
769                         if(check_route_param("nat=yes")) {
770                                 setbflag(FLB_NATB);
771                         }
772                 }
773         }
774         if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB)))
775                 return;
776
777         rtpproxy_manage("co");
778
779         if (is_request()) {
780                 if (!has_totag()) {
781                         if(t_is_branch_route()) {
782                                 add_rr_param(";nat=yes");
783                         }
784                 }
785         }
786         if (is_reply()) {
787                 if(isbflagset(FLB_NATB)) {
788                         add_contact_alias();
789                 }
790         }
791 #!endif
792         return;
793 }
794
795 # URI update for dialog requests
796 route[DLGURI] {
797 #!ifdef WITH_NAT
798         if(!isdsturiset()) {
799                 handle_ruri_alias();
800         }
801 #!endif
802         return;
803 }
804
805 # Routing to foreign domains
806 route[SIPOUT] {
807         if (!uri==myself)
808         {
809                 append_hf("P-hint: outbound\r\n");
810                 route(RELAY);
811         }
812 }
813
814 # PSTN GW routing
815 route[PSTN] {
816 #!ifdef WITH_PSTN
817         # check if PSTN GW IP is defined
818         if (strempty($sel(cfg_get.pstn.gw_ip))) {
819                 xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
820                 return;
821         }
822
823         # route to PSTN dialed numbers starting with '+' or '00'
824         #     (international format)
825         # - update the condition to match your dialing rules for PSTN routing
826         if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))
827                 return;
828
829         # only local users allowed to call
830         if(from_uri!=myself) {
831                 sl_send_reply("403", "Not Allowed");
832                 exit;
833         }
834
835         if (strempty($sel(cfg_get.pstn.gw_port))) {
836                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
837         } else {
838                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip) + ":"
839                                         + $sel(cfg_get.pstn.gw_port);
840         }
841
842         route(RELAY);
843         exit;
844 #!endif
845
846         return;
847 }
848
849 # XMLRPC routing
850 #!ifdef WITH_XMLRPC
851 route[XMLRPC] {
852         # allow XMLRPC from localhost
853         if ((method=="POST" || method=="GET")
854                         && (src_ip==127.0.0.1)) {
855                 # close connection only for xmlrpclib user agents (there is a bug in
856                 # xmlrpclib: it waits for EOF before interpreting the response).
857                 if ($hdr(User-Agent) =~ "xmlrpclib")
858                         set_reply_close();
859                 set_reply_no_connect();
860                 dispatch_rpc();
861                 exit;
862         }
863         send_reply("403", "Forbidden");
864         exit;
865 }
866 #!endif
867
868 # route to voicemail server
869 route[TOVOICEMAIL] {
870 #!ifdef WITH_VOICEMAIL
871         if(!is_method("INVITE"))
872                 return;
873
874         # check if VoiceMail server IP is defined
875         if (strempty($sel(cfg_get.voicemail.srv_ip))) {
876                 xlog("SCRIPT: VoiceMail rotuing enabled but IP not defined\n");
877                 return;
878         }
879         if($avp(oexten)==$null)
880                 return;
881
882         $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
883                                 + ":" + $sel(cfg_get.voicemail.srv_port);
884         route(RELAY);
885         exit;
886 #!endif
887
888         return;
889 }
890
891 # manage outgoing branches
892 branch_route[MANAGE_BRANCH] {
893         xdbg("new branch [$T_branch_idx] to $ru\n");
894         route(NATMANAGE);
895 }
896
897 # manage incoming replies
898 onreply_route[MANAGE_REPLY] {
899         xdbg("incoming reply\n");
900         if(status=~"[12][0-9][0-9]")
901                 route(NATMANAGE);
902 }
903
904 # manage failure routing cases
905 failure_route[MANAGE_FAILURE] {
906         route(NATMANAGE);
907
908         if (t_is_canceled()) {
909                 exit;
910         }
911
912 #!ifdef WITH_BLOCK3XX
913         # block call redirect based on 3xx replies.
914         if (t_check_status("3[0-9][0-9]")) {
915                 t_reply("404","Not found");
916                 exit;
917         }
918 #!endif
919
920 #!ifdef WITH_VOICEMAIL
921         # serial forking
922         # - route to voicemail on busy or no answer (timeout)
923         if (t_check_status("486|408")) {
924                 $du = $null;
925                 route(TOVOICEMAIL);
926                 exit;
927         }
928 #!endif
929 }