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