events.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. /**
  2. * $Id$
  3. *
  4. * Copyright (C) 2009 SIP-Router.org
  5. *
  6. * This file is part of Extensible SIP Router, a free SIP server.
  7. *
  8. * Permission to use, copy, modify, and distribute this software for any
  9. * purpose with or without fee is hereby granted, provided that the above
  10. * copyright notice and this permission notice appear in all copies.
  11. *
  12. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  13. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  14. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  15. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  16. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  17. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  18. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  19. */
  20. /*!
  21. * \file
  22. * \brief SIP-router core ::
  23. * \ingroup core
  24. * Module: \ref core
  25. */
  26. #include "dprint.h"
  27. #include "mem/mem.h"
  28. #include "route.h"
  29. #include "events.h"
  30. static sr_event_cb_t _sr_events_list;
  31. static int _sr_events_inited = 0;
  32. typedef struct _sr_core_ert {
  33. int init_parse_error;
  34. } sr_core_ert_t;
  35. static sr_core_ert_t _sr_core_ert_list;
  36. /**
  37. *
  38. */
  39. void sr_core_ert_init(void)
  40. {
  41. memset(&_sr_core_ert_list, 0, sizeof(sr_core_ert_t));
  42. /* 0 - is not a valid index in event_route blocks list */
  43. _sr_core_ert_list.init_parse_error = route_get(&event_rt,
  44. "core:receive-parse-error");
  45. if(_sr_core_ert_list.init_parse_error<=0
  46. || event_rt.rlist[_sr_core_ert_list.init_parse_error]==NULL) {
  47. _sr_core_ert_list.init_parse_error = -1;
  48. } else {
  49. LM_DBG("event_route[core:receive-parse-error] is defined\n");
  50. }
  51. }
  52. /**
  53. *
  54. */
  55. void sr_core_ert_run(sip_msg_t *msg, int e)
  56. {
  57. struct run_act_ctx ctx;
  58. int rtb;
  59. switch(e) {
  60. case SR_CORE_ERT_RECEIVE_PARSE_ERROR:
  61. if(likely(_sr_core_ert_list.init_parse_error<=0))
  62. return;
  63. rtb = get_route_type();
  64. set_route_type(REQUEST_ROUTE);
  65. init_run_actions_ctx(&ctx);
  66. run_top_route(event_rt.rlist[_sr_core_ert_list.init_parse_error],
  67. msg, &ctx);
  68. set_route_type(rtb);
  69. break;
  70. }
  71. }
  72. /**
  73. *
  74. */
  75. void sr_event_cb_init(void)
  76. {
  77. if(_sr_events_inited == 0)
  78. {
  79. memset(&_sr_events_list, 0, sizeof(sr_event_cb_t));
  80. _sr_events_inited = 1;
  81. }
  82. }
  83. /**
  84. *
  85. */
  86. int sr_event_register_cb(int type, sr_event_cb_f f)
  87. {
  88. int i;
  89. sr_event_cb_init();
  90. switch(type) {
  91. case SREV_NET_DATA_IN:
  92. for(i=0; i<SREV_CB_LIST_SIZE; i++) {
  93. if(_sr_events_list.net_data_in[i]==0) {
  94. _sr_events_list.net_data_in[i] = f;
  95. break;
  96. }
  97. }
  98. if(i==SREV_CB_LIST_SIZE) return -1;
  99. break;
  100. case SREV_NET_DATA_OUT:
  101. for(i=SREV_CB_LIST_SIZE-1; i>=0; i--) {
  102. if(_sr_events_list.net_data_out[i]==0) {
  103. _sr_events_list.net_data_out[i] = f;
  104. break;
  105. }
  106. }
  107. if(i<0) return -1;
  108. break;
  109. case SREV_CORE_STATS:
  110. if(_sr_events_list.core_stats==0)
  111. _sr_events_list.core_stats = f;
  112. else return -1;
  113. break;
  114. case SREV_CFG_RUN_ACTION:
  115. if(_sr_events_list.run_action==0)
  116. _sr_events_list.run_action = f;
  117. else return -1;
  118. break;
  119. case SREV_PKG_UPDATE_STATS:
  120. if(_sr_events_list.pkg_update_stats==0)
  121. _sr_events_list.pkg_update_stats = f;
  122. else return -1;
  123. break;
  124. case SREV_NET_DGRAM_IN:
  125. if(_sr_events_list.net_dgram_in==0)
  126. _sr_events_list.net_dgram_in = f;
  127. else return -1;
  128. break;
  129. case SREV_TCP_HTTP_100C:
  130. if(_sr_events_list.tcp_http_100c==0)
  131. _sr_events_list.tcp_http_100c = f;
  132. else return -1;
  133. break;
  134. case SREV_TCP_MSRP_FRAME:
  135. if(_sr_events_list.tcp_msrp_frame==0)
  136. _sr_events_list.tcp_msrp_frame = f;
  137. else return -1;
  138. break;
  139. case SREV_TCP_WS_FRAME_IN:
  140. if(_sr_events_list.tcp_ws_frame_in==0)
  141. _sr_events_list.tcp_ws_frame_in = f;
  142. else return -1;
  143. break;
  144. case SREV_TCP_WS_FRAME_OUT:
  145. if(_sr_events_list.tcp_ws_frame_out==0)
  146. _sr_events_list.tcp_ws_frame_out = f;
  147. else return -1;
  148. break;
  149. case SREV_STUN_IN:
  150. if(_sr_events_list.stun_in==0)
  151. _sr_events_list.stun_in = f;
  152. else return -1;
  153. break;
  154. case SREV_RCV_NOSIP:
  155. if(_sr_events_list.rcv_nosip==0)
  156. _sr_events_list.rcv_nosip = f;
  157. else return -1;
  158. break;
  159. default:
  160. return -1;
  161. }
  162. return 0;
  163. }
  164. /**
  165. *
  166. */
  167. int sr_event_exec(int type, void *data)
  168. {
  169. int ret;
  170. int i;
  171. #ifdef EXTRA_DEBUG
  172. str *p;
  173. #endif /* EXTRA_DEBUG */
  174. switch(type) {
  175. case SREV_NET_DATA_IN:
  176. if(unlikely(_sr_events_list.net_data_in[0]!=0))
  177. {
  178. #ifdef EXTRA_DEBUG
  179. p = (str*)data;
  180. LM_DBG("PRE-IN ++++++++++++++++++++++++++++++++\n"
  181. "%.*s\n+++++\n", p->len, p->s);
  182. #endif /* EXTRA_DEBUG */
  183. ret = 0;
  184. for(i=0; i<SREV_CB_LIST_SIZE
  185. && _sr_events_list.net_data_in[i]; i++) {
  186. ret |= _sr_events_list.net_data_in[i](data);
  187. }
  188. #ifdef EXTRA_DEBUG
  189. LM_DBG("POST-IN ++++++++++++++++++++++++++++++++\n"
  190. "%.*s\n+++++\n", p->len, p->s);
  191. #endif /* EXTRA_DEBUG */
  192. return ret;
  193. } else return 1;
  194. break;
  195. case SREV_NET_DATA_OUT:
  196. if(unlikely(_sr_events_list.net_data_out[SREV_CB_LIST_SIZE-1]!=0))
  197. {
  198. #ifdef EXTRA_DEBUG
  199. p = (str*)data;
  200. LM_DBG("PRE-OUT ++++++++++++++++++++\n"
  201. "%.*s\n+++++++++++++++++++\n", p->len, p->s);
  202. #endif /* EXTRA_DEBUG */
  203. ret = 0;
  204. for(i=0; i<SREV_CB_LIST_SIZE; i++) {
  205. if(_sr_events_list.net_data_out[i]) {
  206. ret |= _sr_events_list.net_data_out[i](data);
  207. }
  208. }
  209. #ifdef EXTRA_DEBUG
  210. LM_DBG("POST-OUT ++++++++++++++++++++\n"
  211. "%.*s\n+++++++++++++++++++\n", p->len, p->s);
  212. #endif /* EXTRA_DEBUG */
  213. return ret;
  214. } else return 1;
  215. break;
  216. case SREV_CORE_STATS:
  217. if(unlikely(_sr_events_list.core_stats!=0))
  218. {
  219. ret = _sr_events_list.core_stats(data);
  220. return ret;
  221. } else return 1;
  222. break;
  223. case SREV_CFG_RUN_ACTION:
  224. if(unlikely(_sr_events_list.run_action!=0))
  225. {
  226. ret = _sr_events_list.run_action(data);
  227. return ret;
  228. } else return 1;
  229. case SREV_PKG_UPDATE_STATS:
  230. if(unlikely(_sr_events_list.pkg_update_stats!=0))
  231. {
  232. ret = _sr_events_list.pkg_update_stats(data);
  233. return ret;
  234. } else return 1;
  235. case SREV_NET_DGRAM_IN:
  236. if(unlikely(_sr_events_list.net_dgram_in!=0))
  237. {
  238. ret = _sr_events_list.net_dgram_in(data);
  239. return ret;
  240. } else return 1;
  241. case SREV_TCP_HTTP_100C:
  242. if(unlikely(_sr_events_list.tcp_http_100c!=0))
  243. {
  244. ret = _sr_events_list.tcp_http_100c(data);
  245. return ret;
  246. } else return 1;
  247. case SREV_TCP_MSRP_FRAME:
  248. if(unlikely(_sr_events_list.tcp_msrp_frame!=0))
  249. {
  250. ret = _sr_events_list.tcp_msrp_frame(data);
  251. return ret;
  252. } else return 1;
  253. case SREV_TCP_WS_FRAME_IN:
  254. if(unlikely(_sr_events_list.tcp_ws_frame_in!=0))
  255. {
  256. ret = _sr_events_list.tcp_ws_frame_in(data);
  257. return ret;
  258. } else return 1;
  259. case SREV_TCP_WS_FRAME_OUT:
  260. if(unlikely(_sr_events_list.tcp_ws_frame_out!=0))
  261. {
  262. ret = _sr_events_list.tcp_ws_frame_out(data);
  263. return ret;
  264. } else return 1;
  265. case SREV_STUN_IN:
  266. if(unlikely(_sr_events_list.stun_in!=0))
  267. {
  268. ret = _sr_events_list.stun_in(data);
  269. return ret;
  270. } else return 1;
  271. case SREV_RCV_NOSIP:
  272. if(unlikely(_sr_events_list.rcv_nosip!=0))
  273. {
  274. ret = _sr_events_list.rcv_nosip(data);
  275. return ret;
  276. } else return 1;
  277. default:
  278. return -1;
  279. }
  280. }
  281. /**
  282. *
  283. */
  284. int sr_event_enabled(int type)
  285. {
  286. switch(type) {
  287. case SREV_NET_DATA_IN:
  288. return (_sr_events_list.net_data_in[0]!=0)?1:0;
  289. case SREV_NET_DATA_OUT:
  290. return (_sr_events_list.net_data_out[SREV_CB_LIST_SIZE-1]!=0)?1:0;
  291. case SREV_CORE_STATS:
  292. return (_sr_events_list.core_stats!=0)?1:0;
  293. case SREV_CFG_RUN_ACTION:
  294. return (_sr_events_list.run_action!=0)?1:0;
  295. case SREV_PKG_UPDATE_STATS:
  296. return (_sr_events_list.pkg_update_stats!=0)?1:0;
  297. case SREV_NET_DGRAM_IN:
  298. return (_sr_events_list.net_dgram_in!=0)?1:0;
  299. case SREV_TCP_HTTP_100C:
  300. return (_sr_events_list.tcp_http_100c!=0)?1:0;
  301. case SREV_TCP_MSRP_FRAME:
  302. return (_sr_events_list.tcp_msrp_frame!=0)?1:0;
  303. case SREV_TCP_WS_FRAME_IN:
  304. return (_sr_events_list.tcp_ws_frame_in!=0)?1:0;
  305. case SREV_TCP_WS_FRAME_OUT:
  306. return (_sr_events_list.tcp_ws_frame_out!=0)?1:0;
  307. case SREV_STUN_IN:
  308. return (_sr_events_list.stun_in!=0)?1:0;
  309. case SREV_RCV_NOSIP:
  310. return (_sr_events_list.rcv_nosip!=0)?1:0;
  311. }
  312. return 0;
  313. }