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