cadet_common.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. /*
  2. This file is part of GNUnet.
  3. Copyright (C) 2012 Christian Grothoff (and other contributing authors)
  4. GNUnet is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published
  6. by the Free Software Foundation; either version 3, or (at your
  7. option) any later version.
  8. GNUnet is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with GNUnet; see the file COPYING. If not, write to the
  14. Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  15. Boston, MA 02111-1307, USA.
  16. */
  17. /**
  18. * @file cadet/cadet_common.c
  19. * @brief CADET helper functions
  20. * @author Bartlomiej Polot
  21. */
  22. #include "cadet.h"
  23. /**
  24. * @brief Translate a fwd variable into a string representation, for logging.
  25. *
  26. * @param fwd Is FWD? (#GNUNET_YES or #GNUNET_NO)
  27. *
  28. * @return String representing FWD or BCK.
  29. */
  30. char *
  31. GC_f2s (int fwd)
  32. {
  33. if (GNUNET_YES == fwd)
  34. {
  35. return "FWD";
  36. }
  37. else if (GNUNET_NO == fwd)
  38. {
  39. return "BCK";
  40. }
  41. else
  42. {
  43. /* Not an error, can happen with CONNECTION_BROKEN messages. */
  44. return "";
  45. }
  46. }
  47. int
  48. GC_is_pid_bigger (uint32_t bigger, uint32_t smaller)
  49. {
  50. return (GNUNET_YES == PID_OVERFLOW (smaller, bigger) ||
  51. (bigger > smaller && GNUNET_NO == PID_OVERFLOW (bigger, smaller)));
  52. }
  53. uint32_t
  54. GC_max_pid (uint32_t a, uint32_t b)
  55. {
  56. if (GC_is_pid_bigger(a, b))
  57. return a;
  58. return b;
  59. }
  60. uint32_t
  61. GC_min_pid (uint32_t a, uint32_t b)
  62. {
  63. if (GC_is_pid_bigger(a, b))
  64. return b;
  65. return a;
  66. }
  67. const struct GNUNET_HashCode *
  68. GC_h2hc (const struct GNUNET_CADET_Hash *id)
  69. {
  70. static struct GNUNET_HashCode hc;
  71. memcpy (&hc, id, sizeof (*id));
  72. return &hc;
  73. }
  74. const char *
  75. GC_h2s (const struct GNUNET_CADET_Hash *id)
  76. {
  77. static char s[53];
  78. memcpy (s, GNUNET_h2s_full (GC_h2hc (id)), 52);
  79. s[52] = '\0';
  80. return s;
  81. }
  82. #if !defined(GNUNET_CULL_LOGGING)
  83. const char *
  84. GC_m2s (uint16_t m)
  85. {
  86. static char buf[2][32];
  87. static int idx;
  88. const char *t;
  89. idx = (idx + 1) % 2;
  90. switch (m)
  91. {
  92. /**
  93. * Used to mark the "payload" of a non-payload message.
  94. */
  95. case 0:
  96. return "";
  97. /**
  98. * Request the creation of a path
  99. */
  100. case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE:
  101. t = "CONNECTION_CREATE";
  102. break;
  103. /**
  104. * Request the modification of an existing path
  105. */
  106. case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_ACK:
  107. t = "CONNECTION_ACK";
  108. break;
  109. /**
  110. * Notify that a connection of a path is no longer valid
  111. */
  112. case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN:
  113. t = "CONNECTION_BROKEN";
  114. break;
  115. /**
  116. * At some point, the route will spontaneously change
  117. */
  118. case GNUNET_MESSAGE_TYPE_CADET_PATH_CHANGED:
  119. t = "PATH_CHANGED";
  120. break;
  121. /**
  122. * Transport payload data.
  123. */
  124. case GNUNET_MESSAGE_TYPE_CADET_DATA:
  125. t = "DATA";
  126. break;
  127. /**
  128. * Confirm receipt of payload data.
  129. */
  130. case GNUNET_MESSAGE_TYPE_CADET_DATA_ACK:
  131. t = "DATA_ACK";
  132. break;
  133. /**
  134. * Key exchange encapsulation.
  135. */
  136. case GNUNET_MESSAGE_TYPE_CADET_KX:
  137. t = "KX";
  138. break;
  139. /**
  140. * New ephemeral key.
  141. */
  142. case GNUNET_MESSAGE_TYPE_CADET_KX_EPHEMERAL:
  143. t = "KX_EPHEMERAL";
  144. break;
  145. /**
  146. * Answer to session key challenge.
  147. */
  148. case GNUNET_MESSAGE_TYPE_CADET_KX_PONG:
  149. t = "KX_PONG";
  150. break;
  151. /**
  152. * Request the destuction of a path
  153. */
  154. case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY:
  155. t = "CONNECTION_DESTROY";
  156. break;
  157. /**
  158. * ACK for a data packet.
  159. */
  160. case GNUNET_MESSAGE_TYPE_CADET_ACK:
  161. t = "ACK";
  162. break;
  163. /**
  164. * POLL for ACK.
  165. */
  166. case GNUNET_MESSAGE_TYPE_CADET_POLL:
  167. t = "POLL";
  168. break;
  169. /**
  170. * Announce origin is still alive.
  171. */
  172. case GNUNET_MESSAGE_TYPE_CADET_KEEPALIVE:
  173. t = "KEEPALIVE";
  174. break;
  175. /**
  176. * Connect to the cadet service, specifying subscriptions
  177. */
  178. case GNUNET_MESSAGE_TYPE_CADET_LOCAL_CONNECT:
  179. t = "LOCAL_CONNECT";
  180. break;
  181. /**
  182. * Ask the cadet service to create a new tunnel
  183. */
  184. case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE:
  185. t = "CHANNEL_CREATE";
  186. break;
  187. /**
  188. * Ask the cadet service to destroy a tunnel
  189. */
  190. case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY:
  191. t = "CHANNEL_DESTROY";
  192. break;
  193. /**
  194. * Confirm the creation of a channel.
  195. */
  196. case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_ACK:
  197. t = "CHANNEL_ACK";
  198. break;
  199. /**
  200. * Confirm the creation of a channel.
  201. */
  202. case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_NACK:
  203. t = "CHANNEL_NACK";
  204. break;
  205. /**
  206. * Encrypted payload.
  207. */
  208. case GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED:
  209. t = "ENCRYPTED";
  210. break;
  211. /**
  212. * Local payload traffic
  213. */
  214. case GNUNET_MESSAGE_TYPE_CADET_LOCAL_DATA:
  215. t = "LOCAL_DATA";
  216. break;
  217. /**
  218. * Local ACK for data.
  219. */
  220. case GNUNET_MESSAGE_TYPE_CADET_LOCAL_ACK:
  221. t = "LOCAL_ACK";
  222. break;
  223. /**
  224. * Local monitoring of channels.
  225. */
  226. case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_CHANNELS:
  227. t = "LOCAL_INFO_CHANNELS";
  228. break;
  229. /**
  230. * Local monitoring of a channel.
  231. */
  232. case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_CHANNEL:
  233. t = "LOCAL_INFO_CHANNEL";
  234. break;
  235. /**
  236. * Local monitoring of service.
  237. */
  238. case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS:
  239. t = "LOCAL_INFO_TUNNELS";
  240. break;
  241. /**
  242. * Local monitoring of service.
  243. */
  244. case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNEL:
  245. t = "LOCAL_INFO_TUNNEL";
  246. break;
  247. /**
  248. * Local information about all connections of service.
  249. */
  250. case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_CONNECTIONS:
  251. t = "LOCAL_INFO_CONNECTIONS";
  252. break;
  253. /**
  254. * Local information of service about a specific connection.
  255. */
  256. case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_CONNECTION:
  257. t = "LOCAL_INFO_CONNECTION";
  258. break;
  259. /**
  260. * Local information about all peers known to the service.
  261. */
  262. case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PEERS:
  263. t = "LOCAL_INFO_PEERS";
  264. break;
  265. /**
  266. * Local information of service about a specific peer.
  267. */
  268. case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PEER:
  269. t = "LOCAL_INFO_PEER";
  270. break;
  271. /**
  272. * Traffic (net-cat style) used by the Command Line Interface.
  273. */
  274. case GNUNET_MESSAGE_TYPE_CADET_CLI:
  275. t = "CLI";
  276. break;
  277. /**
  278. * Debug request.
  279. */
  280. case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_DUMP:
  281. t = "INFO_DUMP";
  282. break;
  283. default:
  284. SPRINTF(buf[idx], "%u (UNKNOWN TYPE)", m);
  285. return buf[idx];
  286. }
  287. SPRINTF(buf[idx], "{%18s}", t);
  288. return buf[idx];
  289. }
  290. #else
  291. const char *
  292. GC_m2s (uint16_t m)
  293. {
  294. return "";
  295. }
  296. #endif