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