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