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