]> The Tcpdump Group git mirrors - tcpdump/blob - print-tipc.c
TIPC support.
[tcpdump] / print-tipc.c
1 /*
2 * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that: (1) source code distributions
7 * retain the above copyright notice and this paragraph in its entirety, (2)
8 * distributions including binary code include the above copyright notice and
9 * this paragraph in its entirety in the documentation or other materials
10 * provided with the distribution, and (3) all advertising materials mentioning
11 * features or use of this software display the following acknowledgement:
12 * ``This product includes software developed by the University of California,
13 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14 * the University nor the names of its contributors may be used to endorse
15 * or promote products derived from this software without specific prior
16 * written permission.
17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20 */
21
22 #ifndef lint
23 static const char rcsid[] _U_ =
24 "@(#) $Header: /tcpdump/master/tcpdump/print-arp.c,v 1.66 2006-03-03 22:53:21 hannes Exp $ (LBL)";
25 #endif
26
27 #ifdef HAVE_CONFIG_H
28 #include "config.h"
29 #endif
30
31 #include <tcpdump-stdinc.h>
32
33 #include <stdio.h>
34 #include <string.h>
35
36 #include "netdissect.h"
37 #include "addrtoname.h"
38 #include "ether.h"
39 #include "ethertype.h"
40 #include "extract.h" /* must come after interface.h */
41
42 /*
43 * Transparent Inter-Process Communication (TIPC) protocol.
44 *
45 * http://tipc.sourceforge.net/doc/draft-spec-tipc-07.html
46 * http://tipc.sourceforge.net/doc/tipc_message_formats.html
47 */
48
49 #define TIPC_USER_LOW_IMPORTANCE 0
50 #define TIPC_USER_MEDIUM_IMPORTANCE 1
51 #define TIPC_USER_HIGH_IMPORTANCE 2
52 #define TIPC_USER_CRITICAL_IMPORTANCE 3
53 #define TIPC_USER_BCAST_PROTOCOL 5
54 #define TIPC_USER_MSG_BUNDLER 6
55 #define TIPC_USER_LINK_PROTOCOL 7
56 #define TIPC_USER_CONN_MANAGER 8
57 #define TIPC_USER_CHANGEOVER_PROTOCOL 10
58 #define TIPC_USER_NAME_DISTRIBUTOR 11
59 #define TIPC_USER_MSG_FRAGMENTER 12
60 #define TIPC_USER_LINK_CONFIG 13
61
62 #define TIPC_CONN_MSG 0
63 #define TIPC_DIRECT_MSG 1
64 #define TIPC_NAMED_MSG 2
65 #define TIPC_MCAST_MSG 3
66
67 #define TIPC_ZONE(addr) (((addr) >> 24) & 0xFF)
68 #define TIPC_CLUSTER(addr) (((addr) >> 12) & 0xFFF)
69 #define TIPC_NODE(addr) (((addr) >> 0) & 0xFFF)
70
71 struct tipc_pkthdr {
72 u_int32_t w0;
73 };
74
75 #define TIPC_VER(w0) (((w0) >> 29) & 0x07)
76 #define TIPC_USER(w0) (((w0) >> 25) & 0x0F)
77 #define TIPC_HSIZE(w0) (((w0) >> 21) & 0x0F)
78 #define TIPC_MSIZE(w0) (((w0) >> 0) & 0xFFFF)
79 #define TIPC_MTYPE(w1) (((w1) >> 29) & 0x07)
80 #define TIPC_BROADCAST_ACK(w1) (((w1) >> 0) & 0xFFFF)
81 #define TIPC_LINK_ACK(w2) (((w2) >> 16) & 0xFFFF)
82 #define TIPC_LINK_SEQ(w2) (((w2) >> 0) & 0xFFFF)
83
84 static const struct tok tipcuser_values[] = {
85 { TIPC_USER_LOW_IMPORTANCE, "Low Importance Data payload" },
86 { TIPC_USER_MEDIUM_IMPORTANCE, "Medium Importance Data payload" },
87 { TIPC_USER_HIGH_IMPORTANCE, "High Importance Data payload" },
88 { TIPC_USER_CRITICAL_IMPORTANCE, "Critical Importance Data payload" },
89 { TIPC_USER_BCAST_PROTOCOL, "Broadcast Link Protocol internal" },
90 { TIPC_USER_MSG_BUNDLER, "Message Bundler Protocol internal" },
91 { TIPC_USER_LINK_PROTOCOL, "Link State Protocol internal" },
92 { TIPC_USER_CONN_MANAGER, "Connection Manager internal" },
93 { TIPC_USER_CHANGEOVER_PROTOCOL, "Link Changeover Protocol internal" },
94 { TIPC_USER_NAME_DISTRIBUTOR, "Name Table Update Protocol internal" },
95 { TIPC_USER_MSG_FRAGMENTER, "Message Fragmentation Protocol internal" },
96 { TIPC_USER_LINK_CONFIG, "Neighbor Detection Protocol internal" },
97 { 0, NULL }
98 };
99
100 static const struct tok tipcmtype_values[] = {
101 { TIPC_CONN_MSG, "CONN_MSG" },
102 { TIPC_DIRECT_MSG, "MCAST_MSG" },
103 { TIPC_NAMED_MSG, "NAMED_MSG" },
104 { TIPC_MCAST_MSG, "DIRECT_MSG" },
105 { 0, NULL }
106 };
107
108 struct payload_tipc_pkthdr {
109 u_int32_t w0;
110 u_int32_t w1;
111 u_int32_t w2;
112 u_int32_t prev_node;
113 u_int32_t orig_port;
114 u_int32_t dest_port;
115 u_int32_t orig_node;
116 u_int32_t dest_node;
117 u_int32_t name_type;
118 u_int32_t w9;
119 u_int32_t wA;
120 };
121
122 struct internal_tipc_pkthdr {
123 u_int32_t w0;
124 u_int32_t w1;
125 u_int32_t w2;
126 u_int32_t prev_node;
127 u_int32_t w4;
128 u_int32_t w5;
129 u_int32_t orig_node;
130 u_int32_t dest_node;
131 u_int32_t trans_seq;
132 u_int32_t w9;
133 };
134
135 #define TIPC_SEQ_GAP(w1) (((w1) >> 16) & 0x1FFF)
136 #define TIPC_BC_GAP_AFTER(w2) (((w2) >> 16) & 0xFFFF)
137 #define TIPC_BC_GAP_TO(w2) (((w2) >> 0) & 0xFFFF)
138 #define TIPC_LAST_SENT_FRAG(w4) (((w4) >> 16) & 0xFFFF)
139 #define TIPC_NEXT_SENT_FRAG(w4) (((w4) >> 0) & 0xFFFF)
140 #define TIPC_SESS_NO(w5) (((w5) >> 16) & 0xFFFF)
141 #define TIPC_MSG_CNT(w9) (((w9) >> 16) & 0xFFFF)
142 #define TIPC_LINK_TOL(w9) (((w9) >> 0) & 0xFFFF)
143
144 struct link_conf_tipc_pkthdr {
145 u_int32_t w0;
146 u_int32_t w1;
147 u_int32_t dest_domain;
148 u_int32_t prev_node;
149 u_int32_t ntwrk_id;
150 u_int32_t w5;
151 u_int8_t media_address[16];
152 };
153
154 #define TIPC_NODE_SIG(w1) (((w1) >> 0) & 0xFFFF)
155 #define TIPC_MEDIA_ID(w5) (((w5) >> 0) & 0xFF)
156
157 static void
158 print_payload(netdissect_options *ndo, struct payload_tipc_pkthdr *ap)
159 {
160 u_int32_t w0, w1, w2;
161 u_int user;
162 u_int hsize;
163 u_int msize;
164 u_int mtype;
165 u_int broadcast_ack;
166 u_int link_ack;
167 u_int link_seq;
168 u_int prev_node;
169 u_int orig_port;
170 u_int dest_port;
171 u_int orig_node;
172 u_int dest_node;
173
174 ND_TCHECK(*ap);
175 w0 = EXTRACT_32BITS(&ap->w0);
176 user = TIPC_USER(w0);
177 hsize = TIPC_HSIZE(w0);
178 msize = TIPC_MSIZE(w0);
179 w1 = EXTRACT_32BITS(&ap->w1);
180 mtype = TIPC_MTYPE(w1);
181 broadcast_ack = TIPC_BROADCAST_ACK(w1);
182 w2 = EXTRACT_32BITS(&ap->w2);
183 link_ack = TIPC_LINK_ACK(w2);
184 link_seq = TIPC_LINK_SEQ(w2);
185 orig_node = EXTRACT_32BITS(&ap->orig_node);
186 orig_port = EXTRACT_32BITS(&ap->orig_port);
187 dest_node = EXTRACT_32BITS(&ap->dest_node);
188 dest_port = EXTRACT_32BITS(&ap->dest_port);
189 prev_node = EXTRACT_32BITS(&ap->prev_node);
190
191 ND_PRINT((ndo, "<%u.%u.%u> : %u > <%u.%u.%u> : %u, Previous Node <%u.%u.%u>, Broadcast Ack %u, Link Ack %u, Link Sequence %u, headerlength %u bytes, MessageSize %u bytes, %s messageType %s\n\n",
192 TIPC_ZONE(orig_node), TIPC_CLUSTER(orig_node), TIPC_NODE(orig_node),
193 orig_port,
194 TIPC_ZONE(dest_node), TIPC_CLUSTER(dest_node), TIPC_NODE(dest_node),
195 dest_port,
196 TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
197 broadcast_ack, link_ack, link_seq, hsize*4, msize,
198 tok2str(tipcuser_values, "unknown", user),
199 tok2str(tipcmtype_values, "Unknown", mtype)));
200 return;
201
202 trunc:
203 ND_PRINT((ndo, "[|TIPC]"));
204 }
205
206 static void
207 print_internal(netdissect_options *ndo, struct internal_tipc_pkthdr *ap)
208 {
209 u_int32_t w0, w1, w2, w4, w5, w9;
210 u_int user;
211 u_int hsize;
212 u_int msize;
213 u_int mtype;
214 u_int seq_gap;
215 u_int broadcast_ack;
216 u_int bc_gap_after;
217 u_int bc_gap_to;
218 u_int prev_node;
219 u_int last_sent_frag;
220 u_int next_sent_frag;
221 u_int sess_no;
222 u_int orig_node;
223 u_int dest_node;
224 u_int trans_seq;
225 u_int msg_cnt;
226 u_int link_tol;
227
228 ND_TCHECK(*ap);
229 w0 = EXTRACT_32BITS(&ap->w0);
230 user = TIPC_USER(w0);
231 hsize = TIPC_HSIZE(w0);
232 msize = TIPC_MSIZE(w0);
233 w1 = EXTRACT_32BITS(&ap->w1);
234 mtype = TIPC_MTYPE(w1);
235 seq_gap = TIPC_SEQ_GAP(w1);
236 broadcast_ack = TIPC_BROADCAST_ACK(w1);
237 w2 = EXTRACT_32BITS(&ap->w2);
238 bc_gap_after = TIPC_BC_GAP_AFTER(w2);
239 bc_gap_to = TIPC_BC_GAP_TO(w2);
240 prev_node = EXTRACT_32BITS(&ap->prev_node);
241 w4 = EXTRACT_32BITS(&ap->w4);
242 last_sent_frag = TIPC_LAST_SENT_FRAG(w4);
243 next_sent_frag = TIPC_NEXT_SENT_FRAG(w4);
244 w5 = EXTRACT_32BITS(&ap->w5);
245 sess_no = TIPC_SESS_NO(w5);
246 orig_node = EXTRACT_32BITS(&ap->orig_node);
247 dest_node = EXTRACT_32BITS(&ap->dest_node);
248 trans_seq = EXTRACT_32BITS(&ap->trans_seq);
249 w9 = EXTRACT_32BITS(&ap->w9);
250 msg_cnt = TIPC_MSG_CNT(w9);
251 link_tol = TIPC_LINK_TOL(w9);
252
253 ND_PRINT((ndo, "<%u.%u.%u> > <%u.%u.%u>, Previous Node <%u.%u.%u>, Session No. %u, Broadcast Ack %u, Sequence Gap %u, Broadcast Gap After %u, Broadcast Gap To %u, Last Sent Packet No. %u, Next sent Packet No. %u, Transport Sequence %u, msg_count %u, Link Tolerance %u, headerlength %u bytes, MessageSize %u bytes, %s messageType %s\n\n",
254 TIPC_ZONE(orig_node), TIPC_CLUSTER(orig_node), TIPC_NODE(orig_node),
255 TIPC_ZONE(dest_node), TIPC_CLUSTER(dest_node), TIPC_NODE(dest_node),
256 TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
257 sess_no, broadcast_ack, seq_gap, bc_gap_after, bc_gap_to,
258 last_sent_frag, next_sent_frag, trans_seq, msg_cnt, link_tol,
259 hsize*4, msize,
260 tok2str(tipcuser_values, "unknown", user),
261 tok2str(tipcmtype_values, "Unknown", mtype)));
262 return;
263
264 trunc:
265 ND_PRINT((ndo, "[|TIPC]"));
266 }
267
268 static void
269 print_link_conf(netdissect_options *ndo, struct link_conf_tipc_pkthdr *ap)
270 {
271 u_int32_t w0, w1, w5;
272 u_int user;
273 u_int hsize;
274 u_int msize;
275 u_int mtype;
276 u_int node_sig;
277 u_int prev_node;
278 u_int dest_domain;
279 u_int ntwrk_id;
280 u_int media_id;
281
282 ND_TCHECK(*ap);
283 w0 = EXTRACT_32BITS(&ap->w0);
284 user = TIPC_USER(w0);
285 hsize = TIPC_HSIZE(w0);
286 msize = TIPC_MSIZE(w0);
287 w1 = EXTRACT_32BITS(&ap->w1);
288 mtype = TIPC_MTYPE(w1);
289 node_sig = TIPC_NODE_SIG(w1);
290 prev_node = EXTRACT_32BITS(&ap->prev_node);
291 dest_domain = EXTRACT_32BITS(&ap->dest_domain);
292 prev_node = EXTRACT_32BITS(&ap->prev_node);
293 ntwrk_id = EXTRACT_32BITS(&ap->ntwrk_id);
294 w5 = EXTRACT_32BITS(&ap->w5);
295 media_id = TIPC_MEDIA_ID(w5);
296
297 ND_PRINT((ndo, "<%u.%u.%u> > <%u.%u.%u> NodeSignature %u, network_id %u, %s, headerlength %u bytes, MessageSize %u bytes, messageType %s, media_id %u\n\n",
298 TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
299 TIPC_ZONE(dest_domain), TIPC_CLUSTER(dest_domain), TIPC_NODE(dest_domain),
300 node_sig, ntwrk_id,
301 tok2str(tipcuser_values, "unknown", user),
302 hsize*4, msize,
303 tok2str(tipcmtype_values, "Unknown", mtype),
304 media_id));
305 return;
306
307 trunc:
308 ND_PRINT((ndo, "[|TIPC]"));
309 }
310
311 void
312 tipc_print(netdissect_options *ndo, const u_char *bp, u_int length _U_,
313 u_int caplen _U_)
314 {
315 struct tipc_pkthdr *ap;
316 u_int32_t w0;
317 u_int usr;
318
319 ap = (struct tipc_pkthdr *)bp;
320 ND_TCHECK(ap->w0);
321 w0 = EXTRACT_32BITS(&ap->w0);
322 ND_PRINT((ndo, "TIPC Protocol Packet version %u.0\n", TIPC_VER(w0)));
323
324 usr = TIPC_USER(w0);
325 switch (usr)
326 {
327 case TIPC_USER_LOW_IMPORTANCE:
328 case TIPC_USER_MEDIUM_IMPORTANCE:
329 case TIPC_USER_HIGH_IMPORTANCE:
330 case TIPC_USER_CRITICAL_IMPORTANCE:
331 case TIPC_USER_NAME_DISTRIBUTOR:
332 case TIPC_USER_CONN_MANAGER:
333 print_payload(ndo, (struct payload_tipc_pkthdr *)bp);
334 break;
335
336 case TIPC_USER_LINK_CONFIG:
337 print_link_conf(ndo, (struct link_conf_tipc_pkthdr *)bp);
338 break;
339
340 case TIPC_USER_BCAST_PROTOCOL:
341 case TIPC_USER_MSG_BUNDLER:
342 case TIPC_USER_LINK_PROTOCOL:
343 case TIPC_USER_CHANGEOVER_PROTOCOL:
344 case TIPC_USER_MSG_FRAGMENTER:
345 print_internal(ndo, (struct internal_tipc_pkthdr *)bp);
346 break;
347
348 }
349 return;
350
351 trunc:
352 ND_PRINT((ndo, "[|TIPC]"));
353 }
354
355 /*
356 * Local Variables:
357 * c-style: bsd
358 * End:
359 */
360