2333eacacc31dd30b41e2c244037b46b36674115
[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 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 #!define FLT_ACC 1
154 #!define FLT_ACCMISSED 2
155 #!define FLT_ACCFAILED 3
156 #!define FLT_NATS 5
157
158 #       FLB_ - per branch flags
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", "load_backends", 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         return;
572 }
573
574 # Wrapper for relaying requests
575 route[RELAY] {
576
577         # enable additional event routes for forwarded requests
578         # - serial forking, RTP relaying handling, a.s.o.
579         if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {
580                 if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");
581         }
582         if (is_method("INVITE|SUBSCRIBE|UPDATE")) {
583                 if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");
584         }
585         if (is_method("INVITE")) {
586                 if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");
587         }
588
589         if (!t_relay()) {
590                 sl_reply_error();
591         }
592         exit;
593 }
594
595 # Per SIP request initial checks
596 route[REQINIT] {
597         # no connect for sending replies
598         set_reply_no_connect();
599         # enforce symmetric signaling
600         # - send back replies to the source address of request
601         force_rport();
602
603 #!ifdef WITH_ANTIFLOOD
604         # flood detection from same IP and traffic ban for a while
605         # be sure you exclude checking trusted peers, such as pstn gateways
606         # - local host excluded (e.g., loop to self)
607         if(src_ip!=myself) {
608                 if($sht(ipban=>$si)!=$null) {
609                         # ip is already blocked
610                         xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
611                         exit;
612                 }
613                 if (!pike_check_req()) {
614                         xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
615                         $sht(ipban=>$si) = 1;
616                         exit;
617                 }
618         }
619 #!endif
620         if($ua =~ "friendly|scanner|sipcli|sipvicious|VaxSIPUserAgent|pplsip") {
621                 # silent drop for scanners - uncomment next line if want to reply
622                 # sl_send_reply("200", "OK");
623                 exit;
624         }
625
626         if (!mf_process_maxfwd_header("10")) {
627                 sl_send_reply("483","Too Many Hops");
628                 exit;
629         }
630
631         if(is_method("OPTIONS") && uri==myself && $rU==$null) {
632                 sl_send_reply("200","Keepalive");
633                 exit;
634         }
635
636         if(!sanity_check("17895", "7")) {
637                 xlog("Malformed SIP request from $si:$sp\n");
638                 exit;
639         }
640 }
641
642 # Handle requests within SIP dialogs
643 route[WITHINDLG] {
644         if (!has_totag()) return;
645
646         # sequential request withing a dialog should
647         # take the path determined by record-routing
648         if (loose_route()) {
649                 route(DLGURI);
650                 if (is_method("BYE")) {
651                         setflag(FLT_ACC); # do accounting ...
652                         setflag(FLT_ACCFAILED); # ... even if the transaction fails
653                 } else if ( is_method("ACK") ) {
654                         # ACK is forwarded statelessly
655                         route(NATMANAGE);
656                 } else if ( is_method("NOTIFY") ) {
657                         # Add Record-Route for in-dialog NOTIFY as per RFC 6665.
658                         record_route();
659                 }
660                 route(RELAY);
661                 exit;
662         }
663
664         if (is_method("SUBSCRIBE") && uri == myself) {
665                 # in-dialog subscribe requests
666                 route(PRESENCE);
667                 exit;
668         }
669         if ( is_method("ACK") ) {
670                 if ( t_check_trans() ) {
671                         # no loose-route, but stateful ACK;
672                         # must be an ACK after a 487
673                         # or e.g. 404 from upstream server
674                         route(RELAY);
675                         exit;
676                 } else {
677                         # ACK without matching transaction ... ignore and discard
678                         exit;
679                 }
680         }
681         sl_send_reply("404","Not here");
682         exit;
683 }
684
685 # Handle SIP registrations
686 route[REGISTRAR] {
687         if (!is_method("REGISTER")) return;
688
689         if(isflagset(FLT_NATS)) {
690                 setbflag(FLB_NATB);
691 #!ifdef WITH_NATSIPPING
692                 # do SIP NAT pinging
693                 setbflag(FLB_NATSIPPING);
694 #!endif
695         }
696         if (!save("location")) {
697                 sl_reply_error();
698         }
699         exit;
700 }
701
702 # User location service
703 route[LOCATION] {
704
705 #!ifdef WITH_SPEEDDIAL
706         # search for short dialing - 2-digit extension
707         if($rU=~"^[0-9][0-9]$") {
708                 if(sd_lookup("speed_dial")) {
709                         route(SIPOUT);
710                 }
711         }
712 #!endif
713
714 #!ifdef WITH_ALIASDB
715         # search in DB-based aliases
716         if(alias_db_lookup("dbaliases")) {
717                 route(SIPOUT);
718         }
719 #!endif
720
721         $avp(oexten) = $rU;
722         if (!lookup("location")) {
723                 $var(rc) = $rc;
724                 route(TOVOICEMAIL);
725                 t_newtran();
726                 switch ($var(rc)) {
727                         case -1:
728                         case -3:
729                                 send_reply("404", "Not Found");
730                                 exit;
731                         case -2:
732                                 send_reply("405", "Method Not Allowed");
733                                 exit;
734                 }
735         }
736
737         # when routing via usrloc, log the missed calls also
738         if (is_method("INVITE")) {
739                 setflag(FLT_ACCMISSED);
740         }
741
742         route(RELAY);
743         exit;
744 }
745
746 # Presence server processing
747 route[PRESENCE] {
748         if(!is_method("PUBLISH|SUBSCRIBE")) return;
749
750         if(is_method("SUBSCRIBE") && $hdr(Event)=="message-summary") {
751                 route(TOVOICEMAIL);
752                 # returns here if no voicemail server is configured
753                 sl_send_reply("404", "No voicemail service");
754                 exit;
755         }
756
757 #!ifdef WITH_PRESENCE
758 #!ifdef WITH_MSGREBUILD
759         # apply changes in case the request headers or body were modified
760         msg_apply_changes();
761 #!endif
762         if (!t_newtran()) {
763                 sl_reply_error();
764                 exit;
765         }
766
767         if(is_method("PUBLISH")) {
768                 handle_publish();
769                 t_release();
770         } else if(is_method("SUBSCRIBE")) {
771                 handle_subscribe();
772                 t_release();
773         }
774         exit;
775 #!endif
776
777         # if presence enabled, this part will not be executed
778         if (is_method("PUBLISH") || $rU==$null) {
779                 sl_send_reply("404", "Not here");
780                 exit;
781         }
782         return;
783 }
784
785 # IP authorization and user authentication
786 route[AUTH] {
787 #!ifdef WITH_AUTH
788
789 #!ifdef WITH_IPAUTH
790         if((!is_method("REGISTER")) && allow_source_address()) {
791                 # source IP allowed
792                 return;
793         }
794 #!endif
795
796         if (is_method("REGISTER") || from_uri==myself) {
797                 # authenticate requests
798                 if (!auth_check("$fd", "subscriber", "1")) {
799                         auth_challenge("$fd", "0");
800                         exit;
801                 }
802                 # user authenticated - remove auth header
803                 if(!is_method("REGISTER|PUBLISH"))
804                         consume_credentials();
805         }
806         # if caller is not local subscriber, then check if it calls
807         # a local destination, otherwise deny, not an open relay here
808         if (from_uri!=myself && uri!=myself) {
809                 sl_send_reply("403","Not relaying");
810                 exit;
811         }
812
813 #!else
814
815         # authentication not enabled - do not relay at all to foreign networks
816         if(uri!=myself) {
817                 sl_send_reply("403","Not relaying");
818                 exit;
819         }
820
821 #!endif
822         return;
823 }
824
825 # Caller NAT detection
826 route[NATDETECT] {
827 #!ifdef WITH_NAT
828         if (nat_uac_test("19")) {
829                 if (is_method("REGISTER")) {
830                         fix_nated_register();
831                 } else {
832                         if(is_first_hop()) {
833                                 set_contact_alias();
834                         }
835                 }
836                 setflag(FLT_NATS);
837         }
838 #!endif
839         return;
840 }
841
842 # RTPProxy control and signaling updates for NAT traversal
843 route[NATMANAGE] {
844 #!ifdef WITH_NAT
845         if (is_request()) {
846                 if(has_totag()) {
847                         if(check_route_param("nat=yes")) {
848                                 setbflag(FLB_NATB);
849                         }
850                 }
851         }
852         if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB))) return;
853
854 #!ifdef WITH_RTPENGINE
855         if(nat_uac_test("8")) {
856                 rtpengine_manage("SIP-source-address replace-origin replace-session-connection");
857         } else {
858                 rtpengine_manage("replace-origin replace-session-connection");
859         }
860 #!else
861         if(nat_uac_test("8")) {
862                 rtpproxy_manage("co");
863         } else {
864                 rtpproxy_manage("cor");
865         }
866 #!endif
867
868         if (is_request()) {
869                 if (!has_totag()) {
870                         if(t_is_branch_route()) {
871                                 add_rr_param(";nat=yes");
872                         }
873                 }
874         }
875         if (is_reply()) {
876                 if(isbflagset(FLB_NATB)) {
877                         if(is_first_hop())
878                                 set_contact_alias();
879                 }
880         }
881
882         if(isbflagset(FLB_NATB)) {
883                 # no connect message in a dialog involving NAT traversal
884                 if (is_request()) {
885                         if(has_totag()) {
886                                 set_forward_no_connect();
887                         }
888                 }
889         }
890 #!endif
891         return;
892 }
893
894 # URI update for dialog requests
895 route[DLGURI] {
896 #!ifdef WITH_NAT
897         if(!isdsturiset()) {
898                 handle_ruri_alias();
899         }
900 #!endif
901         return;
902 }
903
904 # Routing to foreign domains
905 route[SIPOUT] {
906         if (uri==myself) return;
907
908         append_hf("P-Hint: outbound\r\n");
909         route(RELAY);
910         exit;
911 }
912
913 # PSTN GW routing
914 route[PSTN] {
915 #!ifdef WITH_PSTN
916         # check if PSTN GW IP is defined
917         if (strempty($sel(cfg_get.pstn.gw_ip))) {
918                 xlog("SCRIPT: PSTN routing enabled but pstn.gw_ip not defined\n");
919                 return;
920         }
921
922         # route to PSTN dialed numbers starting with '+' or '00'
923         #     (international format)
924         # - update the condition to match your dialing rules for PSTN routing
925         if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$")) return;
926
927         # only local users allowed to call
928         if(from_uri!=myself) {
929                 sl_send_reply("403", "Not Allowed");
930                 exit;
931         }
932
933         # normalize target number for pstn gateway
934         # - convert leading 00 to +
935         if (starts_with("$rU", "00")) {
936                 strip(2);
937                 prefix("+");
938         }
939
940         if (strempty($sel(cfg_get.pstn.gw_port))) {
941                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
942         } else {
943                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip) + ":"
944                                         + $sel(cfg_get.pstn.gw_port);
945         }
946
947         route(RELAY);
948         exit;
949 #!endif
950
951         return;
952 }
953
954 # JSONRPC over HTTP(S) routing
955 #!ifdef WITH_JSONRPC
956 event_route[xhttp:request] {
957         set_reply_close();
958         set_reply_no_connect();
959         if(src_ip!=127.0.0.1) {
960                 xhttp_reply("403", "Forbidden", "text/html",
961                                 "<html><body>Not allowed from $si</body></html>");
962                 exit;
963         }
964         if ($hu =~ "^/RPC") {
965                 jsonrpc_dispatch();
966                 exit;
967         }
968
969         xhttp_reply("200", "OK", "text/html",
970                                 "<html><body>Wrong URL $hu</body></html>");
971     exit;
972 }
973 #!endif
974
975 # Routing to voicemail server
976 route[TOVOICEMAIL] {
977 #!ifdef WITH_VOICEMAIL
978         if(!is_method("INVITE|SUBSCRIBE")) return;
979
980         # check if VoiceMail server IP is defined
981         if (strempty($sel(cfg_get.voicemail.srv_ip))) {
982                 xlog("SCRIPT: VoiceMail routing enabled but IP not defined\n");
983                 return;
984         }
985         if(is_method("INVITE")) {
986                 if($avp(oexten)==$null) return;
987
988                 $ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
989                                 + ":" + $sel(cfg_get.voicemail.srv_port);
990         } else {
991                 if($rU==$null) return;
992
993                 $ru = "sip:" + $rU + "@" + $sel(cfg_get.voicemail.srv_ip)
994                                 + ":" + $sel(cfg_get.voicemail.srv_port);
995         }
996         route(RELAY);
997         exit;
998 #!endif
999
1000         return;
1001 }
1002
1003 # Manage outgoing branches
1004 branch_route[MANAGE_BRANCH] {
1005         xdbg("new branch [$T_branch_idx] to $ru\n");
1006         route(NATMANAGE);
1007         return;
1008 }
1009
1010 # Manage incoming replies
1011 reply_route {
1012         if(!sanity_check("17604", "6")) {
1013                 xlog("Malformed SIP response from $si:$sp\n");
1014                 drop;
1015         }
1016         return;
1017 }
1018
1019 # Manage incoming replies in transaction context
1020 onreply_route[MANAGE_REPLY] {
1021         xdbg("incoming reply\n");
1022         if(status=~"[12][0-9][0-9]") {
1023                 route(NATMANAGE);
1024         }
1025         return;
1026 }
1027
1028 # Manage failure routing cases
1029 failure_route[MANAGE_FAILURE] {
1030         route(NATMANAGE);
1031
1032         if (t_is_canceled()) exit;
1033
1034 #!ifdef WITH_BLOCK3XX
1035         # block call redirect based on 3xx replies.
1036         if (t_check_status("3[0-9][0-9]")) {
1037                 t_reply("404","Not found");
1038                 exit;
1039         }
1040 #!endif
1041
1042 #!ifdef WITH_BLOCK401407
1043         # block call redirect based on 401, 407 replies.
1044         if (t_check_status("401|407")) {
1045                 t_reply("404","Not found");
1046                 exit;
1047         }
1048 #!endif
1049
1050 #!ifdef WITH_VOICEMAIL
1051         # serial forking
1052         # - route to voicemail on busy or no answer (timeout)
1053         if (t_check_status("486|408")) {
1054                 $du = $null;
1055                 route(TOVOICEMAIL);
1056                 exit;
1057         }
1058 #!endif
1059         return;
1060 }