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