xref: /freebsd/contrib/tcpdump/print-tipc.c (revision 0a7e5f1f02aad2ff5fff1c60f44c6975fd07e1d9)
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 
223340d773SGleb Smirnoff /* \summary: Transparent Inter-Process Communication (TIPC) protocol printer */
233340d773SGleb Smirnoff 
243340d773SGleb Smirnoff /*
253340d773SGleb Smirnoff  * specification:
26ee67461eSJoseph Mingrone  *     https://web.archive.org/web/20150302152944/http://tipc.sourceforge.net/doc/draft-spec-tipc-07.html
27ee67461eSJoseph Mingrone  *     https://web.archive.org/web/20161025110514/http://tipc.sourceforge.net/doc/tipc_message_formats.html
283340d773SGleb Smirnoff  */
293340d773SGleb Smirnoff 
30ee67461eSJoseph Mingrone #include <config.h>
31d09a7e67SXin LI 
32ee67461eSJoseph Mingrone #include "netdissect-stdinc.h"
33d09a7e67SXin LI 
343340d773SGleb Smirnoff #include "netdissect.h"
353340d773SGleb Smirnoff #include "extract.h"
36d09a7e67SXin LI 
373c602fabSXin LI 
38d09a7e67SXin LI #define TIPC_USER_LOW_IMPORTANCE	0
39d09a7e67SXin LI #define TIPC_USER_MEDIUM_IMPORTANCE	1
40d09a7e67SXin LI #define TIPC_USER_HIGH_IMPORTANCE	2
41d09a7e67SXin LI #define TIPC_USER_CRITICAL_IMPORTANCE	3
42d09a7e67SXin LI #define TIPC_USER_BCAST_PROTOCOL	5
43d09a7e67SXin LI #define TIPC_USER_MSG_BUNDLER		6
44d09a7e67SXin LI #define TIPC_USER_LINK_PROTOCOL		7
45d09a7e67SXin LI #define TIPC_USER_CONN_MANAGER		8
46d09a7e67SXin LI #define TIPC_USER_CHANGEOVER_PROTOCOL	10
47d09a7e67SXin LI #define TIPC_USER_NAME_DISTRIBUTOR	11
48d09a7e67SXin LI #define TIPC_USER_MSG_FRAGMENTER	12
49d09a7e67SXin LI #define TIPC_USER_LINK_CONFIG		13
50d09a7e67SXin LI 
51d09a7e67SXin LI #define TIPC_CONN_MSG			0
52d09a7e67SXin LI #define TIPC_DIRECT_MSG			1
53d09a7e67SXin LI #define TIPC_NAMED_MSG			2
54d09a7e67SXin LI #define TIPC_MCAST_MSG			3
55d09a7e67SXin LI 
56d09a7e67SXin LI #define TIPC_ZONE(addr)		(((addr) >> 24) & 0xFF)
57d09a7e67SXin LI #define TIPC_CLUSTER(addr)	(((addr) >> 12) & 0xFFF)
58d09a7e67SXin LI #define TIPC_NODE(addr)		(((addr) >> 0) & 0xFFF)
59d09a7e67SXin LI 
60d09a7e67SXin LI struct tipc_pkthdr {
61ee67461eSJoseph Mingrone 	nd_uint32_t w0;
62ee67461eSJoseph Mingrone 	nd_uint32_t w1;
63d09a7e67SXin LI };
64d09a7e67SXin LI 
65d09a7e67SXin LI #define TIPC_VER(w0)		(((w0) >> 29) & 0x07)
66d09a7e67SXin LI #define TIPC_USER(w0)		(((w0) >> 25) & 0x0F)
67d09a7e67SXin LI #define TIPC_HSIZE(w0)		(((w0) >> 21) & 0x0F)
68ee67461eSJoseph Mingrone #define TIPC_MSIZE(w0)		(((w0) >> 0) & 0x1FFFF)
69d09a7e67SXin LI #define TIPC_MTYPE(w1)		(((w1) >> 29) & 0x07)
70d09a7e67SXin LI #define TIPC_BROADCAST_ACK(w1)	(((w1) >> 0) & 0xFFFF)
71d09a7e67SXin LI #define TIPC_LINK_ACK(w2)	(((w2) >> 16) & 0xFFFF)
72d09a7e67SXin LI #define TIPC_LINK_SEQ(w2)	(((w2) >> 0) & 0xFFFF)
73d09a7e67SXin LI 
74d09a7e67SXin LI static const struct tok tipcuser_values[] = {
75d09a7e67SXin LI     { TIPC_USER_LOW_IMPORTANCE,      "Low Importance Data payload" },
76d09a7e67SXin LI     { TIPC_USER_MEDIUM_IMPORTANCE,   "Medium Importance Data payload" },
77d09a7e67SXin LI     { TIPC_USER_HIGH_IMPORTANCE,     "High Importance Data payload" },
78d09a7e67SXin LI     { TIPC_USER_CRITICAL_IMPORTANCE, "Critical Importance Data payload" },
79d09a7e67SXin LI     { TIPC_USER_BCAST_PROTOCOL,      "Broadcast Link Protocol internal" },
80d09a7e67SXin LI     { TIPC_USER_MSG_BUNDLER,         "Message Bundler Protocol internal" },
81d09a7e67SXin LI     { TIPC_USER_LINK_PROTOCOL,       "Link State Protocol internal" },
82d09a7e67SXin LI     { TIPC_USER_CONN_MANAGER,        "Connection Manager internal" },
83d09a7e67SXin LI     { TIPC_USER_CHANGEOVER_PROTOCOL, "Link Changeover Protocol internal" },
84d09a7e67SXin LI     { TIPC_USER_NAME_DISTRIBUTOR,    "Name Table Update Protocol internal" },
85d09a7e67SXin LI     { TIPC_USER_MSG_FRAGMENTER,      "Message Fragmentation Protocol internal" },
86d09a7e67SXin LI     { TIPC_USER_LINK_CONFIG,         "Neighbor Detection Protocol internal" },
87d09a7e67SXin LI     { 0, NULL }
88d09a7e67SXin LI };
89d09a7e67SXin LI 
90d09a7e67SXin LI static const struct tok tipcmtype_values[] = {
91d09a7e67SXin LI     { TIPC_CONN_MSG,   "CONN_MSG" },
92d09a7e67SXin LI     { TIPC_DIRECT_MSG, "MCAST_MSG" },
93d09a7e67SXin LI     { TIPC_NAMED_MSG,  "NAMED_MSG" },
94d09a7e67SXin LI     { TIPC_MCAST_MSG,  "DIRECT_MSG" },
95d09a7e67SXin LI     { 0, NULL }
96d09a7e67SXin LI };
97d09a7e67SXin LI 
98d09a7e67SXin LI static const struct tok tipc_linkconf_mtype_values[] = {
99d09a7e67SXin LI     { 0,   "Link request" },
100d09a7e67SXin LI     { 1,   "Link response" },
101d09a7e67SXin LI     { 0, NULL }
102d09a7e67SXin LI };
103d09a7e67SXin LI 
104d09a7e67SXin LI struct payload_tipc_pkthdr {
105ee67461eSJoseph Mingrone 	nd_uint32_t w0;
106ee67461eSJoseph Mingrone 	nd_uint32_t w1;
107ee67461eSJoseph Mingrone 	nd_uint32_t w2;
108ee67461eSJoseph Mingrone 	nd_uint32_t prev_node;
109ee67461eSJoseph Mingrone 	nd_uint32_t orig_port;
110ee67461eSJoseph Mingrone 	nd_uint32_t dest_port;
111ee67461eSJoseph Mingrone 	nd_uint32_t orig_node;
112ee67461eSJoseph Mingrone 	nd_uint32_t dest_node;
113ee67461eSJoseph Mingrone 	nd_uint32_t name_type;
114ee67461eSJoseph Mingrone 	nd_uint32_t w9;
115ee67461eSJoseph Mingrone 	nd_uint32_t wA;
116d09a7e67SXin LI };
117d09a7e67SXin LI 
118d09a7e67SXin LI struct  internal_tipc_pkthdr {
119ee67461eSJoseph Mingrone 	nd_uint32_t w0;
120ee67461eSJoseph Mingrone 	nd_uint32_t w1;
121ee67461eSJoseph Mingrone 	nd_uint32_t w2;
122ee67461eSJoseph Mingrone 	nd_uint32_t prev_node;
123ee67461eSJoseph Mingrone 	nd_uint32_t w4;
124ee67461eSJoseph Mingrone 	nd_uint32_t w5;
125ee67461eSJoseph Mingrone 	nd_uint32_t orig_node;
126ee67461eSJoseph Mingrone 	nd_uint32_t dest_node;
127ee67461eSJoseph Mingrone 	nd_uint32_t trans_seq;
128ee67461eSJoseph Mingrone 	nd_uint32_t w9;
129d09a7e67SXin LI };
130d09a7e67SXin LI 
131d09a7e67SXin LI #define TIPC_SEQ_GAP(w1)	(((w1) >> 16) & 0x1FFF)
132d09a7e67SXin LI #define TIPC_BC_GAP_AFTER(w2)	(((w2) >> 16) & 0xFFFF)
133d09a7e67SXin LI #define TIPC_BC_GAP_TO(w2)	(((w2) >> 0) & 0xFFFF)
134d09a7e67SXin LI #define TIPC_LAST_SENT_FRAG(w4)	(((w4) >> 16) & 0xFFFF)
135d09a7e67SXin LI #define TIPC_NEXT_SENT_FRAG(w4)	(((w4) >> 0) & 0xFFFF)
136d09a7e67SXin LI #define TIPC_SESS_NO(w5)	(((w5) >> 16) & 0xFFFF)
137d09a7e67SXin LI #define TIPC_MSG_CNT(w9)	(((w9) >> 16) & 0xFFFF)
138d09a7e67SXin LI #define TIPC_LINK_TOL(w9)	(((w9) >> 0) & 0xFFFF)
139d09a7e67SXin LI 
140d09a7e67SXin LI struct link_conf_tipc_pkthdr {
141ee67461eSJoseph Mingrone 	nd_uint32_t w0;
142ee67461eSJoseph Mingrone 	nd_uint32_t w1;
143ee67461eSJoseph Mingrone 	nd_uint32_t dest_domain;
144ee67461eSJoseph Mingrone 	nd_uint32_t prev_node;
145ee67461eSJoseph Mingrone 	nd_uint32_t ntwrk_id;
146ee67461eSJoseph Mingrone 	nd_uint32_t w5;
147ee67461eSJoseph Mingrone 	nd_byte     media_address[16];
148d09a7e67SXin LI };
149d09a7e67SXin LI 
150d09a7e67SXin LI #define TIPC_NODE_SIG(w1)	(((w1) >> 0) & 0xFFFF)
151d09a7e67SXin LI #define TIPC_MEDIA_ID(w5)	(((w5) >> 0) & 0xFF)
152d09a7e67SXin LI 
153d09a7e67SXin LI static void
print_payload(netdissect_options * ndo,const struct payload_tipc_pkthdr * ap)154d09a7e67SXin LI print_payload(netdissect_options *ndo, const struct payload_tipc_pkthdr *ap)
155d09a7e67SXin LI {
1563c602fabSXin LI 	uint32_t w0, w1, w2;
157d09a7e67SXin LI 	u_int user;
158d09a7e67SXin LI 	u_int hsize;
159d09a7e67SXin LI 	u_int msize;
160d09a7e67SXin LI 	u_int mtype;
161d09a7e67SXin LI 	u_int broadcast_ack;
162d09a7e67SXin LI 	u_int link_ack;
163d09a7e67SXin LI 	u_int link_seq;
164d09a7e67SXin LI 	u_int prev_node;
165d09a7e67SXin LI 	u_int orig_port;
166d09a7e67SXin LI 	u_int dest_port;
167d09a7e67SXin LI 	u_int orig_node;
168d09a7e67SXin LI 	u_int dest_node;
169d09a7e67SXin LI 
170ee67461eSJoseph Mingrone 	w0 = GET_BE_U_4(ap->w0);
171d09a7e67SXin LI 	user = TIPC_USER(w0);
172d09a7e67SXin LI 	hsize = TIPC_HSIZE(w0);
173d09a7e67SXin LI 	msize = TIPC_MSIZE(w0);
174ee67461eSJoseph Mingrone 	w1 = GET_BE_U_4(ap->w1);
175d09a7e67SXin LI 	mtype = TIPC_MTYPE(w1);
176ee67461eSJoseph Mingrone 	prev_node = GET_BE_U_4(ap->prev_node);
177ee67461eSJoseph Mingrone 	orig_port = GET_BE_U_4(ap->orig_port);
178ee67461eSJoseph Mingrone 	dest_port = GET_BE_U_4(ap->dest_port);
179d09a7e67SXin LI 	if (hsize <= 6) {
180ee67461eSJoseph Mingrone 		ND_PRINT("TIPC v%u.0 %u.%u.%u:%u > %u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s",
181d09a7e67SXin LI 		    TIPC_VER(w0),
182d09a7e67SXin LI 		    TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
183d09a7e67SXin LI 		    orig_port, dest_port,
184d09a7e67SXin LI 		    hsize*4, msize,
185d09a7e67SXin LI 		    tok2str(tipcuser_values, "unknown", user),
186ee67461eSJoseph Mingrone 		    tok2str(tipcmtype_values, "Unknown", mtype));
187d09a7e67SXin LI 	} else {
188ee67461eSJoseph Mingrone 		orig_node = GET_BE_U_4(ap->orig_node);
189ee67461eSJoseph Mingrone 		dest_node = GET_BE_U_4(ap->dest_node);
190ee67461eSJoseph Mingrone 		ND_PRINT("TIPC v%u.0 %u.%u.%u:%u > %u.%u.%u:%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s",
191d09a7e67SXin LI 		    TIPC_VER(w0),
192d09a7e67SXin LI 		    TIPC_ZONE(orig_node), TIPC_CLUSTER(orig_node), TIPC_NODE(orig_node),
193d09a7e67SXin LI 		    orig_port,
194d09a7e67SXin LI 		    TIPC_ZONE(dest_node), TIPC_CLUSTER(dest_node), TIPC_NODE(dest_node),
195d09a7e67SXin LI 		    dest_port,
196d09a7e67SXin LI 		    hsize*4, msize,
197d09a7e67SXin LI 		    tok2str(tipcuser_values, "unknown", user),
198ee67461eSJoseph Mingrone 		    tok2str(tipcmtype_values, "Unknown", mtype));
199d09a7e67SXin LI 
200d09a7e67SXin LI 		if (ndo->ndo_vflag) {
201d09a7e67SXin LI 			broadcast_ack = TIPC_BROADCAST_ACK(w1);
202ee67461eSJoseph Mingrone 			w2 = GET_BE_U_4(ap->w2);
203d09a7e67SXin LI 			link_ack = TIPC_LINK_ACK(w2);
204d09a7e67SXin LI 			link_seq = TIPC_LINK_SEQ(w2);
205ee67461eSJoseph Mingrone 			ND_PRINT("\n\tPrevious Node %u.%u.%u, Broadcast Ack %u, Link Ack %u, Link Sequence %u",
206d09a7e67SXin LI 			    TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
207ee67461eSJoseph Mingrone 			    broadcast_ack, link_ack, link_seq);
208d09a7e67SXin LI 		}
209d09a7e67SXin LI 	}
210d09a7e67SXin LI }
211d09a7e67SXin LI 
212d09a7e67SXin LI static void
print_internal(netdissect_options * ndo,const struct internal_tipc_pkthdr * ap)213d09a7e67SXin LI print_internal(netdissect_options *ndo, const struct internal_tipc_pkthdr *ap)
214d09a7e67SXin LI {
2153c602fabSXin LI 	uint32_t w0, w1, w2, w4, w5, w9;
216d09a7e67SXin LI 	u_int user;
217d09a7e67SXin LI 	u_int hsize;
218d09a7e67SXin LI 	u_int msize;
219d09a7e67SXin LI 	u_int mtype;
220d09a7e67SXin LI 	u_int seq_gap;
221d09a7e67SXin LI 	u_int broadcast_ack;
222d09a7e67SXin LI 	u_int bc_gap_after;
223d09a7e67SXin LI 	u_int bc_gap_to;
224d09a7e67SXin LI 	u_int prev_node;
225d09a7e67SXin LI 	u_int last_sent_frag;
226d09a7e67SXin LI 	u_int next_sent_frag;
227d09a7e67SXin LI 	u_int sess_no;
228d09a7e67SXin LI 	u_int orig_node;
229d09a7e67SXin LI 	u_int dest_node;
230d09a7e67SXin LI 	u_int trans_seq;
231d09a7e67SXin LI 	u_int msg_cnt;
232d09a7e67SXin LI 	u_int link_tol;
233d09a7e67SXin LI 
234ee67461eSJoseph Mingrone 	w0 = GET_BE_U_4(ap->w0);
235d09a7e67SXin LI 	user = TIPC_USER(w0);
236d09a7e67SXin LI 	hsize = TIPC_HSIZE(w0);
237d09a7e67SXin LI 	msize = TIPC_MSIZE(w0);
238ee67461eSJoseph Mingrone 	w1 = GET_BE_U_4(ap->w1);
239d09a7e67SXin LI 	mtype = TIPC_MTYPE(w1);
240ee67461eSJoseph Mingrone 	orig_node = GET_BE_U_4(ap->orig_node);
241ee67461eSJoseph Mingrone 	dest_node = GET_BE_U_4(ap->dest_node);
242ee67461eSJoseph Mingrone 	ND_PRINT("TIPC v%u.0 %u.%u.%u > %u.%u.%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s (0x%08x)",
243d09a7e67SXin LI 	    TIPC_VER(w0),
244d09a7e67SXin LI 	    TIPC_ZONE(orig_node), TIPC_CLUSTER(orig_node), TIPC_NODE(orig_node),
245d09a7e67SXin LI 	    TIPC_ZONE(dest_node), TIPC_CLUSTER(dest_node), TIPC_NODE(dest_node),
246d09a7e67SXin LI 	    hsize*4, msize,
247d09a7e67SXin LI 	    tok2str(tipcuser_values, "unknown", user),
248ee67461eSJoseph Mingrone 	    tok2str(tipcmtype_values, "Unknown", mtype), w1);
249d09a7e67SXin LI 
250d09a7e67SXin LI 	if (ndo->ndo_vflag) {
251d09a7e67SXin LI 		seq_gap = TIPC_SEQ_GAP(w1);
252d09a7e67SXin LI 		broadcast_ack = TIPC_BROADCAST_ACK(w1);
253ee67461eSJoseph Mingrone 		w2 = GET_BE_U_4(ap->w2);
254d09a7e67SXin LI 		bc_gap_after = TIPC_BC_GAP_AFTER(w2);
255d09a7e67SXin LI 		bc_gap_to = TIPC_BC_GAP_TO(w2);
256ee67461eSJoseph Mingrone 		prev_node = GET_BE_U_4(ap->prev_node);
257ee67461eSJoseph Mingrone 		w4 = GET_BE_U_4(ap->w4);
258d09a7e67SXin LI 		last_sent_frag = TIPC_LAST_SENT_FRAG(w4);
259d09a7e67SXin LI 		next_sent_frag = TIPC_NEXT_SENT_FRAG(w4);
260ee67461eSJoseph Mingrone 		w5 = GET_BE_U_4(ap->w5);
261d09a7e67SXin LI 		sess_no = TIPC_SESS_NO(w5);
262ee67461eSJoseph Mingrone 		trans_seq = GET_BE_U_4(ap->trans_seq);
263ee67461eSJoseph Mingrone 		w9 = GET_BE_U_4(ap->w9);
264d09a7e67SXin LI 		msg_cnt = TIPC_MSG_CNT(w9);
265d09a7e67SXin LI 		link_tol = TIPC_LINK_TOL(w9);
266ee67461eSJoseph Mingrone 		ND_PRINT("\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",
267d09a7e67SXin LI 		    TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
268d09a7e67SXin LI 		    sess_no, broadcast_ack, seq_gap, bc_gap_after, bc_gap_to,
269d09a7e67SXin LI 		    last_sent_frag, next_sent_frag, trans_seq, msg_cnt,
270ee67461eSJoseph Mingrone 		    link_tol);
271d09a7e67SXin LI 	}
272d09a7e67SXin LI }
273d09a7e67SXin LI 
274d09a7e67SXin LI static void
print_link_conf(netdissect_options * ndo,const struct link_conf_tipc_pkthdr * ap)275d09a7e67SXin LI print_link_conf(netdissect_options *ndo, const struct link_conf_tipc_pkthdr *ap)
276d09a7e67SXin LI {
2773c602fabSXin LI 	uint32_t w0, w1, w5;
278d09a7e67SXin LI 	u_int user;
279d09a7e67SXin LI 	u_int hsize;
280d09a7e67SXin LI 	u_int msize;
281d09a7e67SXin LI 	u_int mtype;
282d09a7e67SXin LI 	u_int node_sig;
283d09a7e67SXin LI 	u_int prev_node;
284d09a7e67SXin LI 	u_int dest_domain;
285d09a7e67SXin LI 	u_int ntwrk_id;
286d09a7e67SXin LI 	u_int media_id;
287d09a7e67SXin LI 
288ee67461eSJoseph Mingrone 	w0 = GET_BE_U_4(ap->w0);
289d09a7e67SXin LI 	user = TIPC_USER(w0);
290d09a7e67SXin LI 	hsize = TIPC_HSIZE(w0);
291d09a7e67SXin LI 	msize = TIPC_MSIZE(w0);
292ee67461eSJoseph Mingrone 	w1 = GET_BE_U_4(ap->w1);
293d09a7e67SXin LI 	mtype = TIPC_MTYPE(w1);
294ee67461eSJoseph Mingrone 	dest_domain = GET_BE_U_4(ap->dest_domain);
295ee67461eSJoseph Mingrone 	prev_node = GET_BE_U_4(ap->prev_node);
296d09a7e67SXin LI 
297ee67461eSJoseph Mingrone 	ND_PRINT("TIPC v%u.0 %u.%u.%u > %u.%u.%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s",
298d09a7e67SXin LI 	    TIPC_VER(w0),
299d09a7e67SXin LI 	    TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
300d09a7e67SXin LI 	    TIPC_ZONE(dest_domain), TIPC_CLUSTER(dest_domain), TIPC_NODE(dest_domain),
301d09a7e67SXin LI 	    hsize*4, msize,
302d09a7e67SXin LI 	    tok2str(tipcuser_values, "unknown", user),
303ee67461eSJoseph Mingrone 	    tok2str(tipc_linkconf_mtype_values, "Unknown", mtype));
304d09a7e67SXin LI 	if (ndo->ndo_vflag) {
305d09a7e67SXin LI 		node_sig = TIPC_NODE_SIG(w1);
306ee67461eSJoseph Mingrone 		ntwrk_id = GET_BE_U_4(ap->ntwrk_id);
307ee67461eSJoseph Mingrone 		w5 = GET_BE_U_4(ap->w5);
308d09a7e67SXin LI 		media_id = TIPC_MEDIA_ID(w5);
309ee67461eSJoseph Mingrone 		ND_PRINT("\n\tNodeSignature %u, network_id %u, media_id %u",
310ee67461eSJoseph Mingrone 		    node_sig, ntwrk_id, media_id);
311d09a7e67SXin LI 	}
312d09a7e67SXin LI }
313d09a7e67SXin LI 
314d09a7e67SXin LI void
tipc_print(netdissect_options * ndo,const u_char * bp,u_int length _U_,u_int caplen _U_)315d09a7e67SXin LI tipc_print(netdissect_options *ndo, const u_char *bp, u_int length _U_,
316d09a7e67SXin LI     u_int caplen _U_)
317d09a7e67SXin LI {
318d09a7e67SXin LI 	const struct tipc_pkthdr *ap;
3193c602fabSXin LI 	uint32_t w0;
320d09a7e67SXin LI 	u_int user;
321d09a7e67SXin LI 
322ee67461eSJoseph Mingrone 	ndo->ndo_protocol = "tipc";
3233340d773SGleb Smirnoff 	ap = (const struct tipc_pkthdr *)bp;
324ee67461eSJoseph Mingrone 	w0 = GET_BE_U_4(ap->w0);
325d09a7e67SXin LI 	user = TIPC_USER(w0);
326d09a7e67SXin LI 
327*0a7e5f1fSJoseph Mingrone 	switch (user) {
328d09a7e67SXin LI 		case TIPC_USER_LOW_IMPORTANCE:
329d09a7e67SXin LI 		case TIPC_USER_MEDIUM_IMPORTANCE:
330d09a7e67SXin LI 		case TIPC_USER_HIGH_IMPORTANCE:
331d09a7e67SXin LI 		case TIPC_USER_CRITICAL_IMPORTANCE:
332d09a7e67SXin LI 		case TIPC_USER_NAME_DISTRIBUTOR:
333d09a7e67SXin LI 		case TIPC_USER_CONN_MANAGER:
3343340d773SGleb Smirnoff 			print_payload(ndo, (const struct payload_tipc_pkthdr *)bp);
335d09a7e67SXin LI 			break;
336d09a7e67SXin LI 
337d09a7e67SXin LI 		case TIPC_USER_LINK_CONFIG:
3383340d773SGleb Smirnoff 			print_link_conf(ndo, (const struct link_conf_tipc_pkthdr *)bp);
339d09a7e67SXin LI 			break;
340d09a7e67SXin LI 
341d09a7e67SXin LI 		case TIPC_USER_BCAST_PROTOCOL:
342d09a7e67SXin LI 		case TIPC_USER_MSG_BUNDLER:
343d09a7e67SXin LI 		case TIPC_USER_LINK_PROTOCOL:
344d09a7e67SXin LI 		case TIPC_USER_CHANGEOVER_PROTOCOL:
345d09a7e67SXin LI 		case TIPC_USER_MSG_FRAGMENTER:
3463340d773SGleb Smirnoff 			print_internal(ndo, (const struct internal_tipc_pkthdr *)bp);
347d09a7e67SXin LI 			break;
348d09a7e67SXin LI 
349d09a7e67SXin LI 	}
350d09a7e67SXin LI }
351