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