xref: /freebsd/contrib/tcpdump/print-tipc.c (revision 3340d77368116708ab5b5b95acf6c9c710528300)
1d09a7e67SXin LI /*
2d09a7e67SXin LI  * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
3d09a7e67SXin LI  *	The Regents of the University of California.  All rights reserved.
4d09a7e67SXin LI  *
5d09a7e67SXin LI  * Redistribution and use in source and binary forms, with or without
6d09a7e67SXin LI  * modification, are permitted provided that: (1) source code distributions
7d09a7e67SXin LI  * retain the above copyright notice and this paragraph in its entirety, (2)
8d09a7e67SXin LI  * distributions including binary code include the above copyright notice and
9d09a7e67SXin LI  * this paragraph in its entirety in the documentation or other materials
10d09a7e67SXin LI  * provided with the distribution, and (3) all advertising materials mentioning
11d09a7e67SXin LI  * features or use of this software display the following acknowledgement:
12d09a7e67SXin LI  * ``This product includes software developed by the University of California,
13d09a7e67SXin LI  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14d09a7e67SXin LI  * the University nor the names of its contributors may be used to endorse
15d09a7e67SXin LI  * or promote products derived from this software without specific prior
16d09a7e67SXin LI  * written permission.
17d09a7e67SXin LI  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18d09a7e67SXin LI  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19d09a7e67SXin LI  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20d09a7e67SXin LI  */
21d09a7e67SXin LI 
22*3340d773SGleb Smirnoff /* \summary: Transparent Inter-Process Communication (TIPC) protocol printer */
23*3340d773SGleb Smirnoff 
24*3340d773SGleb Smirnoff /*
25*3340d773SGleb Smirnoff  * specification:
26*3340d773SGleb Smirnoff  *	http://tipc.sourceforge.net/doc/draft-spec-tipc-07.html
27*3340d773SGleb Smirnoff  *	http://tipc.sourceforge.net/doc/tipc_message_formats.html
28*3340d773SGleb Smirnoff  */
29*3340d773SGleb Smirnoff 
30d09a7e67SXin LI #ifdef HAVE_CONFIG_H
31d09a7e67SXin LI #include "config.h"
32d09a7e67SXin LI #endif
33d09a7e67SXin LI 
34*3340d773SGleb Smirnoff #include <netdissect-stdinc.h>
35d09a7e67SXin LI 
36*3340d773SGleb Smirnoff #include "netdissect.h"
37d09a7e67SXin LI #include "ether.h"
38d09a7e67SXin LI #include "ethertype.h"
39*3340d773SGleb Smirnoff #include "extract.h"
40d09a7e67SXin LI 
413c602fabSXin LI static const char tstr[] = "[|TIPC]";
423c602fabSXin LI 
43d09a7e67SXin LI #define TIPC_USER_LOW_IMPORTANCE	0
44d09a7e67SXin LI #define TIPC_USER_MEDIUM_IMPORTANCE	1
45d09a7e67SXin LI #define TIPC_USER_HIGH_IMPORTANCE	2
46d09a7e67SXin LI #define TIPC_USER_CRITICAL_IMPORTANCE	3
47d09a7e67SXin LI #define TIPC_USER_BCAST_PROTOCOL	5
48d09a7e67SXin LI #define TIPC_USER_MSG_BUNDLER		6
49d09a7e67SXin LI #define TIPC_USER_LINK_PROTOCOL		7
50d09a7e67SXin LI #define TIPC_USER_CONN_MANAGER		8
51d09a7e67SXin LI #define TIPC_USER_CHANGEOVER_PROTOCOL	10
52d09a7e67SXin LI #define TIPC_USER_NAME_DISTRIBUTOR	11
53d09a7e67SXin LI #define TIPC_USER_MSG_FRAGMENTER	12
54d09a7e67SXin LI #define TIPC_USER_LINK_CONFIG		13
55d09a7e67SXin LI 
56d09a7e67SXin LI #define TIPC_CONN_MSG			0
57d09a7e67SXin LI #define TIPC_DIRECT_MSG			1
58d09a7e67SXin LI #define TIPC_NAMED_MSG			2
59d09a7e67SXin LI #define TIPC_MCAST_MSG			3
60d09a7e67SXin LI 
61d09a7e67SXin LI #define TIPC_ZONE(addr)		(((addr) >> 24) & 0xFF)
62d09a7e67SXin LI #define TIPC_CLUSTER(addr)	(((addr) >> 12) & 0xFFF)
63d09a7e67SXin LI #define TIPC_NODE(addr)		(((addr) >> 0) & 0xFFF)
64d09a7e67SXin LI 
65d09a7e67SXin LI struct tipc_pkthdr {
663c602fabSXin LI 	uint32_t w0;
673c602fabSXin LI 	uint32_t w1;
68d09a7e67SXin LI };
69d09a7e67SXin LI 
70d09a7e67SXin LI #define TIPC_VER(w0)		(((w0) >> 29) & 0x07)
71d09a7e67SXin LI #define TIPC_USER(w0)		(((w0) >> 25) & 0x0F)
72d09a7e67SXin LI #define TIPC_HSIZE(w0)		(((w0) >> 21) & 0x0F)
73d09a7e67SXin LI #define TIPC_MSIZE(w0)		(((w0) >> 0) & 0xFFFF)
74d09a7e67SXin LI #define TIPC_MTYPE(w1)		(((w1) >> 29) & 0x07)
75d09a7e67SXin LI #define TIPC_BROADCAST_ACK(w1)	(((w1) >> 0) & 0xFFFF)
76d09a7e67SXin LI #define TIPC_LINK_ACK(w2)	(((w2) >> 16) & 0xFFFF)
77d09a7e67SXin LI #define TIPC_LINK_SEQ(w2)	(((w2) >> 0) & 0xFFFF)
78d09a7e67SXin LI 
79d09a7e67SXin LI static const struct tok tipcuser_values[] = {
80d09a7e67SXin LI     { TIPC_USER_LOW_IMPORTANCE,      "Low Importance Data payload" },
81d09a7e67SXin LI     { TIPC_USER_MEDIUM_IMPORTANCE,   "Medium Importance Data payload" },
82d09a7e67SXin LI     { TIPC_USER_HIGH_IMPORTANCE,     "High Importance Data payload" },
83d09a7e67SXin LI     { TIPC_USER_CRITICAL_IMPORTANCE, "Critical Importance Data payload" },
84d09a7e67SXin LI     { TIPC_USER_BCAST_PROTOCOL,      "Broadcast Link Protocol internal" },
85d09a7e67SXin LI     { TIPC_USER_MSG_BUNDLER,         "Message Bundler Protocol internal" },
86d09a7e67SXin LI     { TIPC_USER_LINK_PROTOCOL,       "Link State Protocol internal" },
87d09a7e67SXin LI     { TIPC_USER_CONN_MANAGER,        "Connection Manager internal" },
88d09a7e67SXin LI     { TIPC_USER_CHANGEOVER_PROTOCOL, "Link Changeover Protocol internal" },
89d09a7e67SXin LI     { TIPC_USER_NAME_DISTRIBUTOR,    "Name Table Update Protocol internal" },
90d09a7e67SXin LI     { TIPC_USER_MSG_FRAGMENTER,      "Message Fragmentation Protocol internal" },
91d09a7e67SXin LI     { TIPC_USER_LINK_CONFIG,         "Neighbor Detection Protocol internal" },
92d09a7e67SXin LI     { 0, NULL }
93d09a7e67SXin LI };
94d09a7e67SXin LI 
95d09a7e67SXin LI static const struct tok tipcmtype_values[] = {
96d09a7e67SXin LI     { TIPC_CONN_MSG,   "CONN_MSG" },
97d09a7e67SXin LI     { TIPC_DIRECT_MSG, "MCAST_MSG" },
98d09a7e67SXin LI     { TIPC_NAMED_MSG,  "NAMED_MSG" },
99d09a7e67SXin LI     { TIPC_MCAST_MSG,  "DIRECT_MSG" },
100d09a7e67SXin LI     { 0, NULL }
101d09a7e67SXin LI };
102d09a7e67SXin LI 
103d09a7e67SXin LI static const struct tok tipc_linkconf_mtype_values[] = {
104d09a7e67SXin LI     { 0,   "Link request" },
105d09a7e67SXin LI     { 1,   "Link response" },
106d09a7e67SXin LI     { 0, NULL }
107d09a7e67SXin LI };
108d09a7e67SXin LI 
109d09a7e67SXin LI struct payload_tipc_pkthdr {
1103c602fabSXin LI 	uint32_t w0;
1113c602fabSXin LI 	uint32_t w1;
1123c602fabSXin LI 	uint32_t w2;
1133c602fabSXin LI 	uint32_t prev_node;
1143c602fabSXin LI 	uint32_t orig_port;
1153c602fabSXin LI 	uint32_t dest_port;
1163c602fabSXin LI 	uint32_t orig_node;
1173c602fabSXin LI 	uint32_t dest_node;
1183c602fabSXin LI 	uint32_t name_type;
1193c602fabSXin LI 	uint32_t w9;
1203c602fabSXin LI 	uint32_t wA;
121d09a7e67SXin LI };
122d09a7e67SXin LI 
123d09a7e67SXin LI struct  internal_tipc_pkthdr {
1243c602fabSXin LI 	uint32_t w0;
1253c602fabSXin LI 	uint32_t w1;
1263c602fabSXin LI 	uint32_t w2;
1273c602fabSXin LI 	uint32_t prev_node;
1283c602fabSXin LI 	uint32_t w4;
1293c602fabSXin LI 	uint32_t w5;
1303c602fabSXin LI 	uint32_t orig_node;
1313c602fabSXin LI 	uint32_t dest_node;
1323c602fabSXin LI 	uint32_t trans_seq;
1333c602fabSXin LI 	uint32_t w9;
134d09a7e67SXin LI };
135d09a7e67SXin LI 
136d09a7e67SXin LI #define TIPC_SEQ_GAP(w1)	(((w1) >> 16) & 0x1FFF)
137d09a7e67SXin LI #define TIPC_BC_GAP_AFTER(w2)	(((w2) >> 16) & 0xFFFF)
138d09a7e67SXin LI #define TIPC_BC_GAP_TO(w2)	(((w2) >> 0) & 0xFFFF)
139d09a7e67SXin LI #define TIPC_LAST_SENT_FRAG(w4)	(((w4) >> 16) & 0xFFFF)
140d09a7e67SXin LI #define TIPC_NEXT_SENT_FRAG(w4)	(((w4) >> 0) & 0xFFFF)
141d09a7e67SXin LI #define TIPC_SESS_NO(w5)	(((w5) >> 16) & 0xFFFF)
142d09a7e67SXin LI #define TIPC_MSG_CNT(w9)	(((w9) >> 16) & 0xFFFF)
143d09a7e67SXin LI #define TIPC_LINK_TOL(w9)	(((w9) >> 0) & 0xFFFF)
144d09a7e67SXin LI 
145d09a7e67SXin LI struct link_conf_tipc_pkthdr {
1463c602fabSXin LI 	uint32_t w0;
1473c602fabSXin LI 	uint32_t w1;
1483c602fabSXin LI 	uint32_t dest_domain;
1493c602fabSXin LI 	uint32_t prev_node;
1503c602fabSXin LI 	uint32_t ntwrk_id;
1513c602fabSXin LI 	uint32_t w5;
1523c602fabSXin LI 	uint8_t media_address[16];
153d09a7e67SXin LI };
154d09a7e67SXin LI 
155d09a7e67SXin LI #define TIPC_NODE_SIG(w1)	(((w1) >> 0) & 0xFFFF)
156d09a7e67SXin LI #define TIPC_MEDIA_ID(w5)	(((w5) >> 0) & 0xFF)
157d09a7e67SXin LI 
158d09a7e67SXin LI static void
159d09a7e67SXin LI print_payload(netdissect_options *ndo, const struct payload_tipc_pkthdr *ap)
160d09a7e67SXin LI {
1613c602fabSXin LI 	uint32_t w0, w1, w2;
162d09a7e67SXin LI 	u_int user;
163d09a7e67SXin LI 	u_int hsize;
164d09a7e67SXin LI 	u_int msize;
165d09a7e67SXin LI 	u_int mtype;
166d09a7e67SXin LI 	u_int broadcast_ack;
167d09a7e67SXin LI 	u_int link_ack;
168d09a7e67SXin LI 	u_int link_seq;
169d09a7e67SXin LI 	u_int prev_node;
170d09a7e67SXin LI 	u_int orig_port;
171d09a7e67SXin LI 	u_int dest_port;
172d09a7e67SXin LI 	u_int orig_node;
173d09a7e67SXin LI 	u_int dest_node;
174d09a7e67SXin LI 
175d09a7e67SXin LI 	ND_TCHECK(ap->dest_port);
176d09a7e67SXin LI 	w0 = EXTRACT_32BITS(&ap->w0);
177d09a7e67SXin LI 	user = TIPC_USER(w0);
178d09a7e67SXin LI 	hsize = TIPC_HSIZE(w0);
179d09a7e67SXin LI 	msize = TIPC_MSIZE(w0);
180d09a7e67SXin LI 	w1 = EXTRACT_32BITS(&ap->w1);
181d09a7e67SXin LI 	mtype = TIPC_MTYPE(w1);
182d09a7e67SXin LI 	prev_node = EXTRACT_32BITS(&ap->prev_node);
183d09a7e67SXin LI 	orig_port = EXTRACT_32BITS(&ap->orig_port);
184d09a7e67SXin LI 	dest_port = EXTRACT_32BITS(&ap->dest_port);
185d09a7e67SXin LI 	if (hsize <= 6) {
186d09a7e67SXin LI 		ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u:%u > %u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s",
187d09a7e67SXin LI 		    TIPC_VER(w0),
188d09a7e67SXin LI 		    TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
189d09a7e67SXin LI 		    orig_port, dest_port,
190d09a7e67SXin LI 		    hsize*4, msize,
191d09a7e67SXin LI 		    tok2str(tipcuser_values, "unknown", user),
192d09a7e67SXin LI 		    tok2str(tipcmtype_values, "Unknown", mtype)));
193d09a7e67SXin LI 	} else {
194d09a7e67SXin LI 		ND_TCHECK(ap->dest_node);
195d09a7e67SXin LI 		orig_node = EXTRACT_32BITS(&ap->orig_node);
196d09a7e67SXin LI 		dest_node = EXTRACT_32BITS(&ap->dest_node);
197d09a7e67SXin LI 		ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u:%u > %u.%u.%u:%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s",
198d09a7e67SXin LI 		    TIPC_VER(w0),
199d09a7e67SXin LI 		    TIPC_ZONE(orig_node), TIPC_CLUSTER(orig_node), TIPC_NODE(orig_node),
200d09a7e67SXin LI 		    orig_port,
201d09a7e67SXin LI 		    TIPC_ZONE(dest_node), TIPC_CLUSTER(dest_node), TIPC_NODE(dest_node),
202d09a7e67SXin LI 		    dest_port,
203d09a7e67SXin LI 		    hsize*4, msize,
204d09a7e67SXin LI 		    tok2str(tipcuser_values, "unknown", user),
205d09a7e67SXin LI 		    tok2str(tipcmtype_values, "Unknown", mtype)));
206d09a7e67SXin LI 
207d09a7e67SXin LI 		if (ndo->ndo_vflag) {
208d09a7e67SXin LI 			broadcast_ack = TIPC_BROADCAST_ACK(w1);
209d09a7e67SXin LI 			w2 = EXTRACT_32BITS(&ap->w2);
210d09a7e67SXin LI 			link_ack = TIPC_LINK_ACK(w2);
211d09a7e67SXin LI 			link_seq = TIPC_LINK_SEQ(w2);
212d09a7e67SXin LI 			ND_PRINT((ndo, "\n\tPrevious Node %u.%u.%u, Broadcast Ack %u, Link Ack %u, Link Sequence %u",
213d09a7e67SXin LI 			    TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
214d09a7e67SXin LI 			    broadcast_ack, link_ack, link_seq));
215d09a7e67SXin LI 		}
216d09a7e67SXin LI 	}
217d09a7e67SXin LI 	return;
218d09a7e67SXin LI 
219d09a7e67SXin LI trunc:
2203c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
221d09a7e67SXin LI }
222d09a7e67SXin LI 
223d09a7e67SXin LI static void
224d09a7e67SXin LI print_internal(netdissect_options *ndo, const struct internal_tipc_pkthdr *ap)
225d09a7e67SXin LI {
2263c602fabSXin LI 	uint32_t w0, w1, w2, w4, w5, w9;
227d09a7e67SXin LI 	u_int user;
228d09a7e67SXin LI 	u_int hsize;
229d09a7e67SXin LI 	u_int msize;
230d09a7e67SXin LI 	u_int mtype;
231d09a7e67SXin LI 	u_int seq_gap;
232d09a7e67SXin LI 	u_int broadcast_ack;
233d09a7e67SXin LI 	u_int bc_gap_after;
234d09a7e67SXin LI 	u_int bc_gap_to;
235d09a7e67SXin LI 	u_int prev_node;
236d09a7e67SXin LI 	u_int last_sent_frag;
237d09a7e67SXin LI 	u_int next_sent_frag;
238d09a7e67SXin LI 	u_int sess_no;
239d09a7e67SXin LI 	u_int orig_node;
240d09a7e67SXin LI 	u_int dest_node;
241d09a7e67SXin LI 	u_int trans_seq;
242d09a7e67SXin LI 	u_int msg_cnt;
243d09a7e67SXin LI 	u_int link_tol;
244d09a7e67SXin LI 
245d09a7e67SXin LI 	ND_TCHECK(ap->dest_node);
246d09a7e67SXin LI 	w0 = EXTRACT_32BITS(&ap->w0);
247d09a7e67SXin LI 	user = TIPC_USER(w0);
248d09a7e67SXin LI 	hsize = TIPC_HSIZE(w0);
249d09a7e67SXin LI 	msize = TIPC_MSIZE(w0);
250d09a7e67SXin LI 	w1 = EXTRACT_32BITS(&ap->w1);
251d09a7e67SXin LI 	mtype = TIPC_MTYPE(w1);
252d09a7e67SXin LI 	orig_node = EXTRACT_32BITS(&ap->orig_node);
253d09a7e67SXin LI 	dest_node = EXTRACT_32BITS(&ap->dest_node);
254d09a7e67SXin LI 	ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u > %u.%u.%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s (0x%08x)",
255d09a7e67SXin LI 	    TIPC_VER(w0),
256d09a7e67SXin LI 	    TIPC_ZONE(orig_node), TIPC_CLUSTER(orig_node), TIPC_NODE(orig_node),
257d09a7e67SXin LI 	    TIPC_ZONE(dest_node), TIPC_CLUSTER(dest_node), TIPC_NODE(dest_node),
258d09a7e67SXin LI 	    hsize*4, msize,
259d09a7e67SXin LI 	    tok2str(tipcuser_values, "unknown", user),
260d09a7e67SXin LI 	    tok2str(tipcmtype_values, "Unknown", mtype), w1));
261d09a7e67SXin LI 
262d09a7e67SXin LI 	if (ndo->ndo_vflag) {
263d09a7e67SXin LI 		ND_TCHECK(*ap);
264d09a7e67SXin LI 		seq_gap = TIPC_SEQ_GAP(w1);
265d09a7e67SXin LI 		broadcast_ack = TIPC_BROADCAST_ACK(w1);
266d09a7e67SXin LI 		w2 = EXTRACT_32BITS(&ap->w2);
267d09a7e67SXin LI 		bc_gap_after = TIPC_BC_GAP_AFTER(w2);
268d09a7e67SXin LI 		bc_gap_to = TIPC_BC_GAP_TO(w2);
269d09a7e67SXin LI 		prev_node = EXTRACT_32BITS(&ap->prev_node);
270d09a7e67SXin LI 		w4 = EXTRACT_32BITS(&ap->w4);
271d09a7e67SXin LI 		last_sent_frag = TIPC_LAST_SENT_FRAG(w4);
272d09a7e67SXin LI 		next_sent_frag = TIPC_NEXT_SENT_FRAG(w4);
273d09a7e67SXin LI 		w5 = EXTRACT_32BITS(&ap->w5);
274d09a7e67SXin LI 		sess_no = TIPC_SESS_NO(w5);
275d09a7e67SXin LI 		trans_seq = EXTRACT_32BITS(&ap->trans_seq);
276d09a7e67SXin LI 		w9 = EXTRACT_32BITS(&ap->w9);
277d09a7e67SXin LI 		msg_cnt = TIPC_MSG_CNT(w9);
278d09a7e67SXin LI 		link_tol = TIPC_LINK_TOL(w9);
279d09a7e67SXin LI 		ND_PRINT((ndo, "\n\tPrevious 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",
280d09a7e67SXin LI 		    TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
281d09a7e67SXin LI 		    sess_no, broadcast_ack, seq_gap, bc_gap_after, bc_gap_to,
282d09a7e67SXin LI 		    last_sent_frag, next_sent_frag, trans_seq, msg_cnt,
283d09a7e67SXin LI 		    link_tol));
284d09a7e67SXin LI 	}
285d09a7e67SXin LI 	return;
286d09a7e67SXin LI 
287d09a7e67SXin LI trunc:
2883c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
289d09a7e67SXin LI }
290d09a7e67SXin LI 
291d09a7e67SXin LI static void
292d09a7e67SXin LI print_link_conf(netdissect_options *ndo, const struct link_conf_tipc_pkthdr *ap)
293d09a7e67SXin LI {
2943c602fabSXin LI 	uint32_t w0, w1, w5;
295d09a7e67SXin LI 	u_int user;
296d09a7e67SXin LI 	u_int hsize;
297d09a7e67SXin LI 	u_int msize;
298d09a7e67SXin LI 	u_int mtype;
299d09a7e67SXin LI 	u_int node_sig;
300d09a7e67SXin LI 	u_int prev_node;
301d09a7e67SXin LI 	u_int dest_domain;
302d09a7e67SXin LI 	u_int ntwrk_id;
303d09a7e67SXin LI 	u_int media_id;
304d09a7e67SXin LI 
305d09a7e67SXin LI 	ND_TCHECK(ap->prev_node);
306d09a7e67SXin LI 	w0 = EXTRACT_32BITS(&ap->w0);
307d09a7e67SXin LI 	user = TIPC_USER(w0);
308d09a7e67SXin LI 	hsize = TIPC_HSIZE(w0);
309d09a7e67SXin LI 	msize = TIPC_MSIZE(w0);
310d09a7e67SXin LI 	w1 = EXTRACT_32BITS(&ap->w1);
311d09a7e67SXin LI 	mtype = TIPC_MTYPE(w1);
312d09a7e67SXin LI 	dest_domain = EXTRACT_32BITS(&ap->dest_domain);
313d09a7e67SXin LI 	prev_node = EXTRACT_32BITS(&ap->prev_node);
314d09a7e67SXin LI 
315d09a7e67SXin LI 	ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u > %u.%u.%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s",
316d09a7e67SXin LI 	    TIPC_VER(w0),
317d09a7e67SXin LI 	    TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
318d09a7e67SXin LI 	    TIPC_ZONE(dest_domain), TIPC_CLUSTER(dest_domain), TIPC_NODE(dest_domain),
319d09a7e67SXin LI 	    hsize*4, msize,
320d09a7e67SXin LI 	    tok2str(tipcuser_values, "unknown", user),
321d09a7e67SXin LI 	    tok2str(tipc_linkconf_mtype_values, "Unknown", mtype)));
322d09a7e67SXin LI 	if (ndo->ndo_vflag) {
323d09a7e67SXin LI 		ND_TCHECK(ap->w5);
324d09a7e67SXin LI 		node_sig = TIPC_NODE_SIG(w1);
325d09a7e67SXin LI 		ntwrk_id = EXTRACT_32BITS(&ap->ntwrk_id);
326d09a7e67SXin LI 		w5 = EXTRACT_32BITS(&ap->w5);
327d09a7e67SXin LI 		media_id = TIPC_MEDIA_ID(w5);
328d09a7e67SXin LI 		ND_PRINT((ndo, "\n\tNodeSignature %u, network_id %u, media_id %u",
329d09a7e67SXin LI 		    node_sig, ntwrk_id, media_id));
330d09a7e67SXin LI 	}
331d09a7e67SXin LI 	return;
332d09a7e67SXin LI 
333d09a7e67SXin LI trunc:
3343c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
335d09a7e67SXin LI }
336d09a7e67SXin LI 
337d09a7e67SXin LI void
338d09a7e67SXin LI tipc_print(netdissect_options *ndo, const u_char *bp, u_int length _U_,
339d09a7e67SXin LI     u_int caplen _U_)
340d09a7e67SXin LI {
341d09a7e67SXin LI 	const struct tipc_pkthdr *ap;
3423c602fabSXin LI 	uint32_t w0;
343d09a7e67SXin LI 	u_int user;
344d09a7e67SXin LI 
345*3340d773SGleb Smirnoff 	ap = (const struct tipc_pkthdr *)bp;
346d09a7e67SXin LI 	ND_TCHECK(ap->w0);
347d09a7e67SXin LI 	w0 = EXTRACT_32BITS(&ap->w0);
348d09a7e67SXin LI 	user = TIPC_USER(w0);
349d09a7e67SXin LI 
350d09a7e67SXin LI 	switch (user)
351d09a7e67SXin LI 	{
352d09a7e67SXin LI 		case TIPC_USER_LOW_IMPORTANCE:
353d09a7e67SXin LI 		case TIPC_USER_MEDIUM_IMPORTANCE:
354d09a7e67SXin LI 		case TIPC_USER_HIGH_IMPORTANCE:
355d09a7e67SXin LI 		case TIPC_USER_CRITICAL_IMPORTANCE:
356d09a7e67SXin LI 		case TIPC_USER_NAME_DISTRIBUTOR:
357d09a7e67SXin LI 		case TIPC_USER_CONN_MANAGER:
358*3340d773SGleb Smirnoff 			print_payload(ndo, (const struct payload_tipc_pkthdr *)bp);
359d09a7e67SXin LI 			break;
360d09a7e67SXin LI 
361d09a7e67SXin LI 		case TIPC_USER_LINK_CONFIG:
362*3340d773SGleb Smirnoff 			print_link_conf(ndo, (const struct link_conf_tipc_pkthdr *)bp);
363d09a7e67SXin LI 			break;
364d09a7e67SXin LI 
365d09a7e67SXin LI 		case TIPC_USER_BCAST_PROTOCOL:
366d09a7e67SXin LI 		case TIPC_USER_MSG_BUNDLER:
367d09a7e67SXin LI 		case TIPC_USER_LINK_PROTOCOL:
368d09a7e67SXin LI 		case TIPC_USER_CHANGEOVER_PROTOCOL:
369d09a7e67SXin LI 		case TIPC_USER_MSG_FRAGMENTER:
370*3340d773SGleb Smirnoff 			print_internal(ndo, (const struct internal_tipc_pkthdr *)bp);
371d09a7e67SXin LI 			break;
372d09a7e67SXin LI 
373d09a7e67SXin LI 	}
374d09a7e67SXin LI 	return;
375d09a7e67SXin LI 
376d09a7e67SXin LI trunc:
3773c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
378d09a7e67SXin LI }
379d09a7e67SXin LI 
380d09a7e67SXin LI /*
381d09a7e67SXin LI  * Local Variables:
382d09a7e67SXin LI  * c-style: bsd
383d09a7e67SXin LI  * End:
384d09a7e67SXin LI  */
385d09a7e67SXin LI 
386