You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

request.c 8.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. /* This file is part of Netsukuku
  2. * (c) Copyright 2005 Andrea Lo Pumo aka AlpT <alpt@freaknet.org>
  3. *
  4. * This source code is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License as published
  6. * by the Free Software Foundation; either version 2 of the License,
  7. * or (at your option) any later version.
  8. *
  9. * This source code is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. * Please refer to the GNU Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Public License along with
  15. * this source code; if not, write to:
  16. * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. */
  18. #include "includes.h"
  19. #include "request.h"
  20. #include "xmalloc.h"
  21. #include "log.h"
  22. const static u_char request_str[][30] = {
  23. {"ECHO_ME"},
  24. {"ECHO_REPLY"},
  25. {"GET_FREE_NODES"},
  26. {"GET_QSPN_ROUND"},
  27. {"GET_INTERNET_GWS"},
  28. {"SET_FOREIGN_ROUTE"},
  29. {"DEL_FOREIGN_ROUTE"},
  30. {"NEW_BACKROUTE"},
  31. {"DELAYED_BROADCAST"},
  32. {"SPLIT_ROUTE"},
  33. {"SET_NO_IDENTITY"},
  34. {"QSPN_CLOSE"},
  35. {"QSPN_OPEN"},
  36. {"QSPN_RFR"},
  37. {"GET_DNODE_BLOCK"},
  38. {"GET_DNODE_IP"},
  39. {"TRACER_PKT"},
  40. {"TRACER_PKT_CONNECT"},
  41. {"DEL_SNODE"},
  42. {"DEL_GNODE"},
  43. {"GET_INT_MAP"},
  44. {"GET_EXT_MAP"},
  45. {"GET_BNODE_MAP"},
  46. {"ANDNA_REGISTER_HNAME"},
  47. {"ANDNA_CHECK_COUNTER"},
  48. {"ANDNA_RESOLVE_HNAME"},
  49. {"ANDNA_RESOLVE_IP"},
  50. {"ANDNA_RESOLVE_MX"},
  51. {"ANDNA_GET_ANDNA_CACHE"},
  52. {"ANDNA_GET_SINGLE_ACACHE"},
  53. {"ANDNA_SPREAD_SACACHE"},
  54. {"ANDNA_GET_COUNT_CACHE"}
  55. };
  56. const static char unknown_reply[] = "Unknow reply";
  57. const static u_char reply_str[][30] = {
  58. {"PUT_FREE_NODES"},
  59. {"PUT_QSPN_ROUND"},
  60. {"PUT_INTERNET_GWS"},
  61. {"PUT_DNODEIP"},
  62. {"EMPTY_REPLY_SLOT"},
  63. {"EMPTY_REPLY_SLOT1"},
  64. {"PUT_INT_MAP"},
  65. {"PUT_EXT_MAP"},
  66. {"PUT_BNODE_MAP"},
  67. {"ANDNA_RESOLVE_REPLY"},
  68. {"ANDNA_REV_RESOLVE_REPLY"},
  69. {"ANDNA_MX_RESOLVE_REPLY"},
  70. {"ANDNA_PUT_COUNT_CACHE"},
  71. {"ANDNA_PUT_ANDNA_CACHE"},
  72. {"ACK_AFFERMATIVE"},
  73. {"ACK_NEGATIVE"}
  74. };
  75. const static u_char unknown_error[] = "Unknow error";
  76. const static u_char error_str[][40] = {
  77. {"Invalid request"},
  78. {"Accept table full"},
  79. {"Request table full"},
  80. {"Quadro Group full"},
  81. {"Netsukuku is full"},
  82. {"Invalid signature"},
  83. {"Cannot forward the pkt"},
  84. {"Invalid hash_gnode"},
  85. {"ANDNA cache queue full"},
  86. {"Hostname update too early"},
  87. {"Too many hostname registered"},
  88. {"Hname updates counter mismatch"},
  89. {"Inexistent host name"},
  90. {"Counter check failed"},
  91. {"Too many connection"},
  92. };
  93. /*Wait time*/
  94. #define ECHO_ME_WAIT 5 /*(in seconds) */
  95. #define ECHO_REPLY_WAIT 5
  96. #define GET_FREE_NODES_WAIT 10
  97. #define GET_QSPN_ROUND_WAIT 10
  98. #define GET_INTERNET_GWS_WAIT 5
  99. #define SET_FOREIGN_ROUTE_WAIT 5
  100. #define DEL_FOREIGN_ROUTE_WAIT 5
  101. #define NEW_BACKROUTE_WAIT 10
  102. #define DELAYED_BROADCAST_WAIT 5
  103. #define SPLIT_ROUTE_WAIT 20
  104. #define SET_NO_IDENTITY_WAIT 20
  105. #define QSPN_CLOSE_WAIT 0
  106. #define QSPN_OPEN_WAIT 0
  107. #define QSPN_RFR_WAIT 5
  108. #define GET_DNODEBLOCK_WAIT 20
  109. #define GET_DNODEIP_WAIT 5
  110. #define TRACER_PKT_WAIT 10
  111. #define TRACER_PKT_CONNECT_WAIT 10
  112. #define DEL_SNODE_WAIT 10
  113. #define DEL_GNODE_WAIT 10
  114. #define GET_INT_MAP_WAIT 10
  115. #define GET_EXT_MAP_WAIT 10
  116. #define GET_BNODE_MAP_WAIT 10
  117. #define ANDNA_REGISTER_HNAME_WAIT 5
  118. #define ANDNA_CHECK_COUNTER_WAIT 5
  119. #define ANDNA_RESOLVE_HNAME_WAIT 2
  120. #define ANDNA_RESOLVE_IP_WAIT 5
  121. #define ANDNA_RESOLVE_MX_WAIT 5
  122. #define ANDNA_GET_ANDNA_CACHE_WAIT 10
  123. #define ANDNA_GET_SINGLE_ACACHE_WAIT 10
  124. #define ANDNA_SPREAD_SACACHE_WAIT 10
  125. #define ANDNA_GET_COUNT_CACHE_WAIT 10
  126. /*Max simultaneous requests*/
  127. #define ECHO_ME_MAXRQ 0 /*NO LIMITS */
  128. #define ECHO_REPLY_MAXRQ 20
  129. #define GET_FREE_NODES_MAXRQ 5
  130. #define GET_QSPN_ROUND_MAXRQ 5
  131. #define GET_INTERNET_GWS_MAXRQ 5
  132. #define SET_FOREIGN_ROUTE_MAXRQ 30
  133. #define DEL_FOREIGN_ROUTE_MAXRQ 30
  134. #define NEW_BACKROUTE_MAXRQ 10
  135. #define DELAYED_BROADCAST_MAXRQ 5
  136. #define SPLIT_ROUTE_MAXRQ 1
  137. #define SET_NO_IDENTITY_MAXRQ 1
  138. #define QSPN_CLOSE_MAXRQ 0 /*NO LIMITS */
  139. #define QSPN_OPEN_MAXRQ 0 /*NO LIMITS */
  140. #define QSPN_RFR_MAXRQ 10
  141. #define GET_DNODEBLOCK_MAXRQ 1
  142. #define GET_DNODEIP_MAXRQ 10
  143. #define TRACER_PKT_MAXRQ 20
  144. #define TRACER_PKT_CONNECT_MAXRQ 10
  145. #define DEL_SNODE_MAXRQ 20
  146. #define DEL_GNODE_MAXRQ 5
  147. #define GET_INT_MAP_MAXRQ 2
  148. #define GET_EXT_MAP_MAXRQ 2
  149. #define GET_BNODE_MAP_MAXRQ 2
  150. #define ANDNA_REGISTER_HNAME_MAXRQ 30
  151. #define ANDNA_CHECK_COUNTER_MAXRQ 0 /*NO LIMITS */
  152. #define ANDNA_RESOLVE_HNAME_MAXRQ 80
  153. #define ANDNA_RESOLVE_IP_MAXRQ 40
  154. #define ANDNA_RESOLVE_MX_MAXRQ 40
  155. #define ANDNA_GET_ANDNA_CACHE_MAXRQ 5
  156. #define ANDNA_GET_SINGLE_ACACHE_MAXRQ 10
  157. #define ANDNA_SPREAD_SACACHE_MAXRQ 10
  158. #define ANDNA_GET_COUNT_CACHE_MAXRQ 5
  159. const static u_char unknown_request[] = "Unknow request";
  160. const static u_char request_array[][2] = {
  161. {ECHO_ME_WAIT, ECHO_ME_MAXRQ},
  162. {ECHO_REPLY_WAIT, ECHO_REPLY_MAXRQ},
  163. {GET_FREE_NODES_WAIT, GET_FREE_NODES_MAXRQ},
  164. {GET_QSPN_ROUND_WAIT, GET_QSPN_ROUND_MAXRQ},
  165. {GET_INTERNET_GWS_WAIT, GET_INTERNET_GWS_MAXRQ},
  166. {SET_FOREIGN_ROUTE_WAIT, SET_FOREIGN_ROUTE_MAXRQ},
  167. {DEL_FOREIGN_ROUTE_WAIT, DEL_FOREIGN_ROUTE_MAXRQ},
  168. {NEW_BACKROUTE_WAIT, NEW_BACKROUTE_MAXRQ},
  169. {DELAYED_BROADCAST_WAIT, DELAYED_BROADCAST_MAXRQ},
  170. {SPLIT_ROUTE_WAIT, SPLIT_ROUTE_MAXRQ},
  171. {SET_NO_IDENTITY_WAIT, SET_NO_IDENTITY_MAXRQ},
  172. {QSPN_CLOSE_WAIT, QSPN_CLOSE_MAXRQ},
  173. {QSPN_OPEN_WAIT, QSPN_OPEN_MAXRQ},
  174. {QSPN_RFR_WAIT, QSPN_RFR_MAXRQ},
  175. {GET_DNODEBLOCK_WAIT, GET_DNODEBLOCK_MAXRQ},
  176. {GET_DNODEIP_WAIT, GET_DNODEIP_MAXRQ},
  177. {TRACER_PKT_WAIT, TRACER_PKT_MAXRQ},
  178. {TRACER_PKT_CONNECT_WAIT, TRACER_PKT_CONNECT_MAXRQ},
  179. {DEL_SNODE_WAIT, DEL_SNODE_MAXRQ},
  180. {DEL_GNODE_WAIT, DEL_GNODE_MAXRQ},
  181. {GET_INT_MAP_WAIT, GET_INT_MAP_MAXRQ},
  182. {GET_EXT_MAP_WAIT, GET_EXT_MAP_MAXRQ},
  183. {GET_BNODE_MAP_WAIT, GET_BNODE_MAP_MAXRQ},
  184. {ANDNA_REGISTER_HNAME_WAIT, ANDNA_REGISTER_HNAME_MAXRQ},
  185. {ANDNA_CHECK_COUNTER_WAIT, ANDNA_CHECK_COUNTER_MAXRQ},
  186. {ANDNA_RESOLVE_HNAME_WAIT, ANDNA_RESOLVE_HNAME_MAXRQ},
  187. {ANDNA_RESOLVE_IP_WAIT, ANDNA_RESOLVE_IP_MAXRQ},
  188. {ANDNA_RESOLVE_MX_WAIT, ANDNA_RESOLVE_MX_MAXRQ},
  189. {ANDNA_GET_ANDNA_CACHE_WAIT, ANDNA_GET_ANDNA_CACHE_MAXRQ},
  190. {ANDNA_GET_SINGLE_ACACHE_WAIT, ANDNA_GET_SINGLE_ACACHE_MAXRQ},
  191. {ANDNA_SPREAD_SACACHE_WAIT, ANDNA_SPREAD_SACACHE_MAXRQ},
  192. {ANDNA_GET_COUNT_CACHE_WAIT, ANDNA_GET_COUNT_CACHE_MAXRQ}
  193. };
  194. /*
  195. * Request_array indexes defines:
  196. * ex: request_array[SET_FOREIGN_ROUTE][RQ_WAIT]
  197. */
  198. #define RQ_WAIT 0
  199. #define RQ_MAXRQ 1
  200. void
  201. rq_wait_idx_init(int *rq_wait_idx)
  202. {
  203. int e, idx;
  204. for (e = 0, idx = 0; e < TOTAL_REQUESTS; e++) {
  205. rq_wait_idx[e] = idx;
  206. idx += request_array[e][RQ_MAXRQ];
  207. }
  208. }
  209. int
  210. op_verify(u_char op)
  211. {
  212. return op >= TOTAL_OPS;
  213. }
  214. int
  215. rq_verify(u_char rq)
  216. {
  217. return rq >= TOTAL_REQUESTS;
  218. }
  219. int
  220. re_verify(u_char re)
  221. {
  222. return ((op_verify(re)) || (re < TOTAL_REQUESTS));
  223. }
  224. int
  225. err_verify(u_char err)
  226. {
  227. return err >= TOTAL_ERRORS;
  228. }
  229. const u_char *
  230. rq_strerror(int err)
  231. {
  232. if (err_verify(err))
  233. return unknown_error;
  234. return error_str[err];
  235. }
  236. const u_char *
  237. rq_to_str(u_char rq)
  238. {
  239. if (rq_verify(rq))
  240. return unknown_request;
  241. return request_str[rq];
  242. }
  243. const u_char *
  244. re_to_str(u_char re)
  245. {
  246. if (re_verify(re))
  247. return (const u_char *) unknown_reply;
  248. return reply_str[re - TOTAL_REQUESTS];
  249. }
  250. void
  251. update_rq_tbl(rq_tbl * tbl)
  252. {
  253. u_char i = 0, e = 0, idx = 0;
  254. time_t cur_t;
  255. if (update_rq_tbl_mutex)
  256. return;
  257. else
  258. update_rq_tbl_mutex = 1;
  259. time(&cur_t);
  260. for (; i < TOTAL_REQUESTS; i++) {
  261. for (e = 0; e < request_array[i][RQ_MAXRQ]; e++) {
  262. if (tbl->rq_wait[idx]
  263. && (tbl->rq_wait[idx] + request_array[i][RQ_WAIT]) <=
  264. cur_t) {
  265. tbl->rq_wait[idx] = 0;
  266. tbl->rq[i]--;
  267. }
  268. idx++;
  269. }
  270. }
  271. update_rq_tbl_mutex = 0;
  272. }
  273. int
  274. is_rq_full(u_char rq, rq_tbl * tbl)
  275. {
  276. if (rq_verify(rq))
  277. return E_INVALID_REQUEST;
  278. update_rq_tbl(tbl);
  279. if (tbl->rq[rq] >= request_array[rq][RQ_MAXRQ]
  280. && request_array[rq][RQ_MAXRQ])
  281. return E_REQUEST_TBL_FULL;
  282. else if (!request_array[rq][RQ_MAXRQ])
  283. return -1; /* No limits */
  284. else
  285. return 0;
  286. }
  287. int
  288. find_free_rq_wait(u_char rq, rq_tbl * tbl)
  289. {
  290. int e, idx;
  291. for (e = 0; e < request_array[rq][RQ_MAXRQ]; e++) {
  292. idx = rq_wait_idx[rq] + e;
  293. if (!tbl->rq_wait[idx])
  294. return idx;
  295. }
  296. return -1; /*This happens if the rq_tbl is full for the "rq" request */
  297. }
  298. int
  299. add_rq(u_char rq, rq_tbl * tbl)
  300. {
  301. int err;
  302. time_t cur_t;
  303. /* TODO: XXX: Activate it and test it!!! */
  304. return 0;
  305. /* TODO: XXX: Activate it and test it!!! */
  306. if ((err = is_rq_full(rq, tbl)) > 0)
  307. return err;
  308. else if (err < 0)
  309. return 0; /* no limits */
  310. time(&cur_t);
  311. tbl->rq[rq]++;
  312. tbl->rq_wait[find_free_rq_wait(rq, tbl)] = cur_t;
  313. return 0;
  314. }
  315. /*
  316. * op_filter_reset_re: resets all the replies
  317. */
  318. void
  319. op_filter_reset_re(int bit)
  320. {
  321. int i;
  322. for (i = TOTAL_REQUESTS; i < TOTAL_OPS; i++)
  323. if (bit)
  324. op_filter_set(i);
  325. else
  326. op_filter_clr(i);
  327. }
  328. /*
  329. * op_filter_reset_rq: resets all the requests
  330. */
  331. void
  332. op_filter_reset_rq(int bit)
  333. {
  334. int i;
  335. for (i = 0; i < TOTAL_REQUESTS; i++)
  336. if (bit)
  337. op_filter_set(i);
  338. else
  339. op_filter_clr(i);
  340. }