register.cfg 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. ######################################################################
  2. # Route for handling Registrations:
  3. ######################################################################
  4. route[REGISTER] {
  5. # Provide some statistics
  6. if ($sht(a=>$ci::start_time) == $null || $sht(a=>$ci::start_time) == 0) {
  7. $sht(a=>$ci::start_time) = $TV(Sn);
  8. }
  9. # Strip Transport from RURI:
  10. $ru = $(ru{re.subst,/;transport=[A-Za-z]*//g});
  11. if (is_present_hf("Contact")) {
  12. pcscf_save_pending("location");
  13. } else {
  14. send_reply("403", "No contact header");
  15. exit;
  16. }
  17. # Strip additional Tags from RURI:
  18. if ($rU == $null)
  19. $ru = "sip:"+$rd;
  20. else
  21. $ru = "sip:"+$rU+"@"+$rd;
  22. #!ifdef WITH_RX
  23. xlog("L_DBG","Subscribing to signalling bearer status\n");
  24. Rx_AAR_Register("REG_AAR_REPLY", "location");
  25. switch ($retcode) {
  26. case -1:
  27. # There was an error sending the AAR-Request:
  28. xlog("L_ERR", "Diameter: AAR failed on subscription to signalling\n");
  29. send_reply("403", "Can't register to QoS for signalling");
  30. exit;
  31. break;
  32. case 0:
  33. # We are waiting for an async reply, just exit here.
  34. exit;
  35. break;
  36. case 1:
  37. # We did not need to send AAR, so just continue as normal
  38. route(REGISTER_CONTINUE);
  39. break;
  40. }
  41. exit;
  42. }
  43. route[REG_AAR_REPLY] {
  44. switch ($avp(s:aar_return_code)) {
  45. case 1:
  46. xlog("L_DBG", "Diameter: AAR success on subscription to signalling\n");
  47. break;
  48. default:
  49. xlog("L_ERR", "Diameter: AAR failed on subscription to signalling\n");
  50. send_reply("403", "Can't register to QoS for signalling");
  51. exit;
  52. }
  53. # Proceed with Registering:
  54. route(REGISTER_CONTINUE);
  55. }
  56. route[REGISTER_CONTINUE] {
  57. #!endif
  58. append_hf("Path: <sip:term@HOSTNAME;lr>\r\n");
  59. remove_hf("Supported");
  60. append_hf("Supported: path\r\n");
  61. remove_hf("Require");
  62. append_hf("Require: path\r\n");
  63. # Add a visited Network-ID-Header:
  64. if (is_present_hf("P-Visited-Network-ID")) {
  65. $var(new_hdr) = "NETWORKNAME, "+$hdr(P-Visited-Network-ID);
  66. append_hf("P-Visited-Network-ID: $var(new_hdr)\r\n");
  67. } else {
  68. append_hf("P-Visited-Network-ID: NETWORKNAME\r\n");
  69. }
  70. #!ifdef WITH_SBC
  71. #!ifndef WITH_SBC_CALL
  72. t_on_failure("SBC_failure");
  73. # Choose an SBC to send the call to:
  74. if (!ds_select_dst(DISPATCHER_LIST_SBC, "4")) {
  75. send_reply("503", "Service Unavailable (SBC failure)");
  76. exit;
  77. }
  78. #!else
  79. t_on_failure("REGISTER_failure");
  80. #!endif
  81. #!else
  82. t_on_failure("REGISTER_failure");
  83. #!endif
  84. t_on_reply("REGISTER_reply");
  85. # Forward request:
  86. route(RELAY);
  87. exit;
  88. }
  89. # Replies for REGISTER requests:
  90. ######################################################################
  91. onreply_route[REGISTER_reply]
  92. {
  93. #!ifdef WITH_IMS_HDR_CACHE
  94. if (is_present_hf("Service-Route")) {
  95. $sht(serviceroutes=>$ci) = $hdr(Service-Route);
  96. } else {
  97. if ($sht(serviceroutes=>$ci) != $null) {
  98. append_hf("Service-Route: $sht(serviceroutes=>$ci)\r\n");
  99. msg_apply_changes();
  100. }
  101. }
  102. if (is_present_hf("P-Associated-URI")) {
  103. $sht(associateduris=>$ci) = $hdr(P-Associated-URI);
  104. } else {
  105. if ($sht(associateduris=>$ci) != $null) {
  106. append_hf("P-Associated-URI: $sht(associateduris=>$ci)\r\n");
  107. msg_apply_changes();
  108. }
  109. }
  110. #!endif
  111. if (t_check_status("200")) {
  112. #!ifdef WITH_IPBLOCK
  113. $sht(failedauth=>$T_req($si)) = $null;
  114. #!endif
  115. pcscf_save("location");
  116. #!ifdef WITH_NATPING
  117. #!ifdef WITH_PING_UDP
  118. if ($T_req($pr) == "udp") {
  119. $var(ouri) = "sip:"+$T_req($si)+":"+$T_req($sp);
  120. $sht(natping=>$var(ouri)) = $(T_req($ct){nameaddr.uri});
  121. }
  122. #!endif
  123. #!ifdef WITH_PING_TCP
  124. if ($T_req($pr) == "tcp") {
  125. $var(ouri) = "sip:"+$T_req($si)+":"+$T_req($sp)+";transport=tcp";
  126. $sht(natping=>$var(ouri)) = $(T_req($ct){nameaddr.uri});
  127. }
  128. #!endif
  129. #!ifdef WITH_PING_TLS
  130. if ($T_req($pr) == "tls") {
  131. $var(ouri) = "sip:"+$T_req($si)+":"+$T_req($sp)+";transport=tls";
  132. $sht(natping=>$var(ouri)) = $(T_req($ct){nameaddr.uri});
  133. }
  134. #!endif
  135. #!endif
  136. #update stats for register reply on success
  137. $var(start_secs) = $(sht(a=>$ci::start_time){s.select,0,.});
  138. $var(start_usecs) = $(sht(a=>$ci::start_time){s.select,1,.});
  139. $var(diff_secs) = $TV(s) - $var(start_secs);
  140. $var(diff_usecs) = $TV(u) - $var(start_usecs);
  141. $var(diff_ms) = $var(diff_secs)*1000 + ($var(diff_usecs)/1000);
  142. $sht(a=>$ci::start_time)=0;
  143. $var(stat_add) = "+" + $var(diff_ms);
  144. xlog("L_DBG", "REGISTER SUCCESS[$ci] took $var(stat_add)ms\n");
  145. update_stat("register_success", "+1");
  146. update_stat("register_time", "$var(stat_add)");
  147. #!ifdef WITH_IPSEC
  148. ipsec_forward("location");
  149. }
  150. else {
  151. if (t_check_status("401")) {
  152. ipsec_create("location");
  153. }
  154. #!endif
  155. }
  156. exit;
  157. }
  158. # Negative replies to REGISTER requests:
  159. ######################################################################
  160. failure_route[REGISTER_failure]
  161. {
  162. #!ifdef WITH_IPBLOCK
  163. if (t_check_status("403|[5-6][0-9][0-9]")) {
  164. if ($sht(failedauth=>$si) != $null)
  165. $sht(failedauth=>$si) = $sht(failedauth=>$si) + 1;
  166. else
  167. $sht(failedauth=>$si) = 1;
  168. if ($sht(failedauth=>$si) > 10) {
  169. xlog("L_ALERT","ALERT: blocking $rm from $fu (IP:$si:$sp), more than 5 failed auth requests!\n");
  170. xlog("Blocking traffic from $si\n");
  171. $sht(ipban=>$si) = 1;
  172. }
  173. update_stat("register_failed", "+1");
  174. }
  175. #!endif
  176. if (t_check_status("408")) {
  177. send_reply("504","Server Time-Out");
  178. update_stat("register_failed", "+1");
  179. exit;
  180. }
  181. }