msg.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. /*
  2. * net/tipc/msg.c: TIPC message header routines
  3. *
  4. * Copyright (c) 2003-2005, Ericsson Research Canada
  5. * Copyright (c) 2005, Wind River Systems
  6. * Copyright (c) 2005-2006, Ericsson AB
  7. * All rights reserved.
  8. *
  9. * Redistribution and use in source and binary forms, with or without
  10. * modification, are permitted provided that the following conditions are met:
  11. *
  12. * Redistributions of source code must retain the above copyright notice, this
  13. * list of conditions and the following disclaimer.
  14. * Redistributions in binary form must reproduce the above copyright notice,
  15. * this list of conditions and the following disclaimer in the documentation
  16. * and/or other materials provided with the distribution.
  17. * Neither the names of the copyright holders nor the names of its
  18. * contributors may be used to endorse or promote products derived from this
  19. * software without specific prior written permission.
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  22. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  25. * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  26. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  27. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  28. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  29. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  30. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  31. * POSSIBILITY OF SUCH DAMAGE.
  32. */
  33. #include "core.h"
  34. #include "addr.h"
  35. #include "dbg.h"
  36. #include "msg.h"
  37. #include "bearer.h"
  38. void msg_set_media_addr(struct tipc_msg *m, struct tipc_media_addr *a)
  39. {
  40. memcpy(&((int *)m)[5], a, sizeof(*a));
  41. }
  42. void msg_get_media_addr(struct tipc_msg *m, struct tipc_media_addr *a)
  43. {
  44. memcpy(a, &((int*)m)[5], sizeof(*a));
  45. }
  46. void msg_print(struct print_buf *buf, struct tipc_msg *msg, const char *str)
  47. {
  48. u32 usr = msg_user(msg);
  49. tipc_printf(buf, str);
  50. switch (usr) {
  51. case MSG_BUNDLER:
  52. tipc_printf(buf, "BNDL::");
  53. tipc_printf(buf, "MSGS(%u):", msg_msgcnt(msg));
  54. break;
  55. case BCAST_PROTOCOL:
  56. tipc_printf(buf, "BCASTP::");
  57. break;
  58. case MSG_FRAGMENTER:
  59. tipc_printf(buf, "FRAGM::");
  60. switch (msg_type(msg)) {
  61. case FIRST_FRAGMENT:
  62. tipc_printf(buf, "FIRST:");
  63. break;
  64. case FRAGMENT:
  65. tipc_printf(buf, "BODY:");
  66. break;
  67. case LAST_FRAGMENT:
  68. tipc_printf(buf, "LAST:");
  69. break;
  70. default:
  71. tipc_printf(buf, "UNKNOWN:%x",msg_type(msg));
  72. }
  73. tipc_printf(buf, "NO(%u/%u):",msg_long_msgno(msg),
  74. msg_fragm_no(msg));
  75. break;
  76. case DATA_LOW:
  77. case DATA_MEDIUM:
  78. case DATA_HIGH:
  79. case DATA_CRITICAL:
  80. tipc_printf(buf, "DAT%u:", msg_user(msg));
  81. if (msg_short(msg)) {
  82. tipc_printf(buf, "CON:");
  83. break;
  84. }
  85. switch (msg_type(msg)) {
  86. case TIPC_CONN_MSG:
  87. tipc_printf(buf, "CON:");
  88. break;
  89. case TIPC_MCAST_MSG:
  90. tipc_printf(buf, "MCST:");
  91. break;
  92. case TIPC_NAMED_MSG:
  93. tipc_printf(buf, "NAM:");
  94. break;
  95. case TIPC_DIRECT_MSG:
  96. tipc_printf(buf, "DIR:");
  97. break;
  98. default:
  99. tipc_printf(buf, "UNKNOWN TYPE %u",msg_type(msg));
  100. }
  101. if (msg_routed(msg) && !msg_non_seq(msg))
  102. tipc_printf(buf, "ROUT:");
  103. if (msg_reroute_cnt(msg))
  104. tipc_printf(buf, "REROUTED(%u):",
  105. msg_reroute_cnt(msg));
  106. break;
  107. case NAME_DISTRIBUTOR:
  108. tipc_printf(buf, "NMD::");
  109. switch (msg_type(msg)) {
  110. case PUBLICATION:
  111. tipc_printf(buf, "PUBL(%u):", (msg_size(msg) - msg_hdr_sz(msg)) / 20); /* Items */
  112. break;
  113. case WITHDRAWAL:
  114. tipc_printf(buf, "WDRW:");
  115. break;
  116. default:
  117. tipc_printf(buf, "UNKNOWN:%x",msg_type(msg));
  118. }
  119. if (msg_routed(msg))
  120. tipc_printf(buf, "ROUT:");
  121. if (msg_reroute_cnt(msg))
  122. tipc_printf(buf, "REROUTED(%u):",
  123. msg_reroute_cnt(msg));
  124. break;
  125. case CONN_MANAGER:
  126. tipc_printf(buf, "CONN_MNG:");
  127. switch (msg_type(msg)) {
  128. case CONN_PROBE:
  129. tipc_printf(buf, "PROBE:");
  130. break;
  131. case CONN_PROBE_REPLY:
  132. tipc_printf(buf, "PROBE_REPLY:");
  133. break;
  134. case CONN_ACK:
  135. tipc_printf(buf, "CONN_ACK:");
  136. tipc_printf(buf, "ACK(%u):",msg_msgcnt(msg));
  137. break;
  138. default:
  139. tipc_printf(buf, "UNKNOWN TYPE:%x",msg_type(msg));
  140. }
  141. if (msg_routed(msg))
  142. tipc_printf(buf, "ROUT:");
  143. if (msg_reroute_cnt(msg))
  144. tipc_printf(buf, "REROUTED(%u):",msg_reroute_cnt(msg));
  145. break;
  146. case LINK_PROTOCOL:
  147. tipc_printf(buf, "PROT:TIM(%u):",msg_timestamp(msg));
  148. switch (msg_type(msg)) {
  149. case STATE_MSG:
  150. tipc_printf(buf, "STATE:");
  151. tipc_printf(buf, "%s:",msg_probe(msg) ? "PRB" :"");
  152. tipc_printf(buf, "NXS(%u):",msg_next_sent(msg));
  153. tipc_printf(buf, "GAP(%u):",msg_seq_gap(msg));
  154. tipc_printf(buf, "LSTBC(%u):",msg_last_bcast(msg));
  155. break;
  156. case RESET_MSG:
  157. tipc_printf(buf, "RESET:");
  158. if (msg_size(msg) != msg_hdr_sz(msg))
  159. tipc_printf(buf, "BEAR:%s:",msg_data(msg));
  160. break;
  161. case ACTIVATE_MSG:
  162. tipc_printf(buf, "ACTIVATE:");
  163. break;
  164. default:
  165. tipc_printf(buf, "UNKNOWN TYPE:%x",msg_type(msg));
  166. }
  167. tipc_printf(buf, "PLANE(%c):",msg_net_plane(msg));
  168. tipc_printf(buf, "SESS(%u):",msg_session(msg));
  169. break;
  170. case CHANGEOVER_PROTOCOL:
  171. tipc_printf(buf, "TUNL:");
  172. switch (msg_type(msg)) {
  173. case DUPLICATE_MSG:
  174. tipc_printf(buf, "DUPL:");
  175. break;
  176. case ORIGINAL_MSG:
  177. tipc_printf(buf, "ORIG:");
  178. tipc_printf(buf, "EXP(%u)",msg_msgcnt(msg));
  179. break;
  180. default:
  181. tipc_printf(buf, "UNKNOWN TYPE:%x",msg_type(msg));
  182. }
  183. break;
  184. case ROUTE_DISTRIBUTOR:
  185. tipc_printf(buf, "ROUTING_MNG:");
  186. switch (msg_type(msg)) {
  187. case EXT_ROUTING_TABLE:
  188. tipc_printf(buf, "EXT_TBL:");
  189. tipc_printf(buf, "TO:%x:",msg_remote_node(msg));
  190. break;
  191. case LOCAL_ROUTING_TABLE:
  192. tipc_printf(buf, "LOCAL_TBL:");
  193. tipc_printf(buf, "TO:%x:",msg_remote_node(msg));
  194. break;
  195. case SLAVE_ROUTING_TABLE:
  196. tipc_printf(buf, "DP_TBL:");
  197. tipc_printf(buf, "TO:%x:",msg_remote_node(msg));
  198. break;
  199. case ROUTE_ADDITION:
  200. tipc_printf(buf, "ADD:");
  201. tipc_printf(buf, "TO:%x:",msg_remote_node(msg));
  202. break;
  203. case ROUTE_REMOVAL:
  204. tipc_printf(buf, "REMOVE:");
  205. tipc_printf(buf, "TO:%x:",msg_remote_node(msg));
  206. break;
  207. default:
  208. tipc_printf(buf, "UNKNOWN TYPE:%x",msg_type(msg));
  209. }
  210. break;
  211. case LINK_CONFIG:
  212. tipc_printf(buf, "CFG:");
  213. switch (msg_type(msg)) {
  214. case DSC_REQ_MSG:
  215. tipc_printf(buf, "DSC_REQ:");
  216. break;
  217. case DSC_RESP_MSG:
  218. tipc_printf(buf, "DSC_RESP:");
  219. break;
  220. default:
  221. tipc_printf(buf, "UNKNOWN TYPE:%x:",msg_type(msg));
  222. break;
  223. }
  224. break;
  225. default:
  226. tipc_printf(buf, "UNKNOWN USER:");
  227. }
  228. switch (usr) {
  229. case CONN_MANAGER:
  230. case NAME_DISTRIBUTOR:
  231. case DATA_LOW:
  232. case DATA_MEDIUM:
  233. case DATA_HIGH:
  234. case DATA_CRITICAL:
  235. if (msg_short(msg))
  236. break; /* No error */
  237. switch (msg_errcode(msg)) {
  238. case TIPC_OK:
  239. break;
  240. case TIPC_ERR_NO_NAME:
  241. tipc_printf(buf, "NO_NAME:");
  242. break;
  243. case TIPC_ERR_NO_PORT:
  244. tipc_printf(buf, "NO_PORT:");
  245. break;
  246. case TIPC_ERR_NO_NODE:
  247. tipc_printf(buf, "NO_PROC:");
  248. break;
  249. case TIPC_ERR_OVERLOAD:
  250. tipc_printf(buf, "OVERLOAD:");
  251. break;
  252. case TIPC_CONN_SHUTDOWN:
  253. tipc_printf(buf, "SHUTDOWN:");
  254. break;
  255. default:
  256. tipc_printf(buf, "UNKNOWN ERROR(%x):",
  257. msg_errcode(msg));
  258. }
  259. default:{}
  260. }
  261. tipc_printf(buf, "HZ(%u):", msg_hdr_sz(msg));
  262. tipc_printf(buf, "SZ(%u):", msg_size(msg));
  263. tipc_printf(buf, "SQNO(%u):", msg_seqno(msg));
  264. if (msg_non_seq(msg))
  265. tipc_printf(buf, "NOSEQ:");
  266. else {
  267. tipc_printf(buf, "ACK(%u):", msg_ack(msg));
  268. }
  269. tipc_printf(buf, "BACK(%u):", msg_bcast_ack(msg));
  270. tipc_printf(buf, "PRND(%x)", msg_prevnode(msg));
  271. if (msg_isdata(msg)) {
  272. if (msg_named(msg)) {
  273. tipc_printf(buf, "NTYP(%u):", msg_nametype(msg));
  274. tipc_printf(buf, "NINST(%u)", msg_nameinst(msg));
  275. }
  276. }
  277. if ((usr != LINK_PROTOCOL) && (usr != LINK_CONFIG) &&
  278. (usr != MSG_BUNDLER)) {
  279. if (!msg_short(msg)) {
  280. tipc_printf(buf, ":ORIG(%x:%u):",
  281. msg_orignode(msg), msg_origport(msg));
  282. tipc_printf(buf, ":DEST(%x:%u):",
  283. msg_destnode(msg), msg_destport(msg));
  284. } else {
  285. tipc_printf(buf, ":OPRT(%u):", msg_origport(msg));
  286. tipc_printf(buf, ":DPRT(%u):", msg_destport(msg));
  287. }
  288. if (msg_routed(msg) && !msg_non_seq(msg))
  289. tipc_printf(buf, ":TSEQN(%u)", msg_transp_seqno(msg));
  290. }
  291. if (msg_user(msg) == NAME_DISTRIBUTOR) {
  292. tipc_printf(buf, ":ONOD(%x):", msg_orignode(msg));
  293. tipc_printf(buf, ":DNOD(%x):", msg_destnode(msg));
  294. if (msg_routed(msg)) {
  295. tipc_printf(buf, ":CSEQN(%u)", msg_transp_seqno(msg));
  296. }
  297. }
  298. if (msg_user(msg) == LINK_CONFIG) {
  299. u32* raw = (u32*)msg;
  300. struct tipc_media_addr* orig = (struct tipc_media_addr*)&raw[5];
  301. tipc_printf(buf, ":REQL(%u):", msg_req_links(msg));
  302. tipc_printf(buf, ":DDOM(%x):", msg_dest_domain(msg));
  303. tipc_printf(buf, ":NETID(%u):", msg_bc_netid(msg));
  304. media_addr_printf(buf, orig);
  305. }
  306. if (msg_user(msg) == BCAST_PROTOCOL) {
  307. tipc_printf(buf, "BCNACK:AFTER(%u):", msg_bcgap_after(msg));
  308. tipc_printf(buf, "TO(%u):", msg_bcgap_to(msg));
  309. }
  310. tipc_printf(buf, "\n");
  311. if ((usr == CHANGEOVER_PROTOCOL) && (msg_msgcnt(msg))) {
  312. msg_print(buf,msg_get_wrapped(msg)," /");
  313. }
  314. if ((usr == MSG_FRAGMENTER) && (msg_type(msg) == FIRST_FRAGMENT)) {
  315. msg_print(buf,msg_get_wrapped(msg)," /");
  316. }
  317. }