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