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