/src/wireshark/epan/dissectors/packet-dlm3.c
Line | Count | Source |
1 | | /* packet-dlm3.c |
2 | | * Routines for dlm3 dissection |
3 | | * Copyright 2007, Masatake YAMATO <jet@gyve.org> |
4 | | * |
5 | | * Wireshark - Network traffic analyzer |
6 | | * By Gerald Combs <gerald@wireshark.org> |
7 | | * Copyright 1998 Gerald Combs |
8 | | * |
9 | | * SPDX-License-Identifier: GPL-2.0-or-later |
10 | | */ |
11 | | |
12 | | /* This dissector supports version 3.0 of the dlm(Distributed Lock Manager) |
13 | | protocol |
14 | | |
15 | | Actual implementation for the protocol is in linux kernel. |
16 | | See files under linux/fs/dlm/ */ |
17 | | |
18 | | /* |
19 | | * #defines are mostly copied from |
20 | | * *.[ch] files in linux/fs/dlm/ and linux/include/linux/dlm.h |
21 | | * |
22 | | * dlm_internal.h: |
23 | | * ----------------------------------------------------------------------- |
24 | | ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. |
25 | | ** Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved. |
26 | | ** |
27 | | ** This copyrighted material is made available to anyone wishing to use, |
28 | | ** modify, copy, or redistribute it subject to the terms and conditions |
29 | | ** of the GNU General Public License v.2. |
30 | | * ----------------------------------------------------------------------- |
31 | | */ |
32 | | |
33 | | |
34 | | #include "config.h" |
35 | | |
36 | | #include <epan/packet.h> |
37 | | #include <epan/prefs.h> |
38 | | |
39 | | #include "packet-tcp.h" |
40 | | |
41 | 32 | #define TCP_PORT_DLM3 21064 /* Not IANA registered */ |
42 | 16 | #define SCTP_PORT_DLM3 TCP_PORT_DLM3 |
43 | | |
44 | 10 | #define DLM3_MAJOR_VERSION 0x00030000 |
45 | 0 | #define DLM3_MINOR_VERSION_MAX 0x00000002 |
46 | | |
47 | 0 | #define DLM_VERSION_3_1 0x00030001 |
48 | 0 | #define DLM_VERSION_3_2 0x00030002 |
49 | | |
50 | 0 | #define DLM3_MSG 1 |
51 | 0 | #define DLM3_RCOM 2 |
52 | 0 | #define DLM3_OPTS 3 |
53 | 0 | #define DLM3_ACK 4 |
54 | 0 | #define DLM3_FIN 5 |
55 | | |
56 | | #define DLM3_MSG_REQUEST 1 |
57 | | #define DLM3_MSG_CONVERT 2 |
58 | | #define DLM3_MSG_UNLOCK 3 |
59 | | #define DLM3_MSG_CANCEL 4 |
60 | | #define DLM3_MSG_REQUEST_REPLY 5 |
61 | | #define DLM3_MSG_CONVERT_REPLY 6 |
62 | | #define DLM3_MSG_UNLOCK_REPLY 7 |
63 | | #define DLM3_MSG_CANCEL_REPLY 8 |
64 | | #define DLM3_MSG_GRANT 9 |
65 | | #define DLM3_MSG_BAST 10 |
66 | | #define DLM3_MSG_LOOKUP 11 |
67 | | #define DLM3_MSG_REMOVE 12 |
68 | | #define DLM3_MSG_LOOKUP_REPLY 13 |
69 | | #define DLM3_MSG_PURGE 14 |
70 | | |
71 | 48 | #define DLM3_LKF_NOQUEUE 0x00000001 |
72 | 48 | #define DLM3_LKF_CANCEL 0x00000002 |
73 | 48 | #define DLM3_LKF_CONVERT 0x00000004 |
74 | 48 | #define DLM3_LKF_VALBLK 0x00000008 |
75 | 48 | #define DLM3_LKF_QUECVT 0x00000010 |
76 | 48 | #define DLM3_LKF_IVVALBLK 0x00000020 |
77 | 48 | #define DLM3_LKF_CONVDEADLK 0x00000040 |
78 | 48 | #define DLM3_LKF_PERSISTENT 0x00000080 |
79 | 48 | #define DLM3_LKF_NODLCKWT 0x00000100 |
80 | 48 | #define DLM3_LKF_NODLCKBLK 0x00000200 |
81 | 48 | #define DLM3_LKF_EXPEDITE 0x00000400 |
82 | 48 | #define DLM3_LKF_NOQUEUEBAST 0x00000800 |
83 | 48 | #define DLM3_LKF_HEADQUE 0x00001000 |
84 | 48 | #define DLM3_LKF_NOORDER 0x00002000 |
85 | 48 | #define DLM3_LKF_ORPHAN 0x00004000 |
86 | 48 | #define DLM3_LKF_ALTPR 0x00008000 |
87 | 48 | #define DLM3_LKF_ALTCW 0x00010000 |
88 | 48 | #define DLM3_LKF_FORCEUNLOCK 0x00020000 |
89 | 48 | #define DLM3_LKF_TIMEOUT 0x00040000 |
90 | | |
91 | 16 | #define DLM3_SBF_DEMOTED 0x00000001 |
92 | 16 | #define DLM3_SBF_VALNOTVALID 0x00000002 |
93 | 16 | #define DLM3_SBF_ALTMODE 0x00000004 |
94 | | |
95 | 32 | #define DLM3_IFL_USER 0x00000001 |
96 | 32 | #define DLM3_IFL_ORPHAN 0x00000002 |
97 | | /* They may not be used in receiver side. |
98 | | -------------------------------------- |
99 | | #define DLM3_IFL_MSTCPY 0x00010000 |
100 | | #define DLM3_IFL_RESEND 0x00020000 |
101 | | #define DLM3_IFL_DEAD 0x00040000 |
102 | | #define DLM3_IFL_OVERLAP_UNLOCK 0x00080000 |
103 | | #define DLM3_IFL_OVERLAP_CANCEL 0x00100000 |
104 | | #define DLM3_IFL_ENDOFLIFE 0x00200000 |
105 | | #define DLM3_IFL_WATCH_TIMEWARN 0x00400000 |
106 | | #define DLM3_IFL_TIMEOUT_CANCEL 0x00800000 |
107 | | #define DLM3_IFL_DEADLOCK_CANCEL 0x01000000 */ |
108 | | |
109 | | #define DLM3_LKSTS_WAITING 1 |
110 | | #define DLM3_LKSTS_GRANTED 2 |
111 | | #define DLM3_LKSTS_CONVERT 3 |
112 | | |
113 | | #define DLM3_LOCK_IV -1 |
114 | | #define DLM3_LOCK_NL 0 |
115 | | #define DLM3_LOCK_CR 1 |
116 | | #define DLM3_LOCK_CW 2 |
117 | | #define DLM3_LOCK_PR 3 |
118 | | #define DLM3_LOCK_PW 4 |
119 | | #define DLM3_LOCK_EX 5 |
120 | | |
121 | 32 | #define DLM3_AST_COMP 1 |
122 | 32 | #define DLM3_AST_BAST 2 |
123 | | |
124 | | |
125 | | /* see asm-generic/errno-base.h about LINUX_* */ |
126 | | #define LINUX_EAGAIN 11 |
127 | | #define LINUX_ENOMEM 12 |
128 | | #define LINUX_INVAL 22 |
129 | | |
130 | | #define DLM3_ERRNO_EDEADLK 35 |
131 | | #define DLM3_ERRNO_EBADR 53 |
132 | | #define DLM3_ERRNO_EBADSLT 57 |
133 | | #define DLM3_ERRNO_EPROTO 71 |
134 | | #define DLM3_ERRNO_EOPNOTSUPP 95 |
135 | | #define DLM3_ERRNO_ETIMEDOUT 110 |
136 | | #define DLM3_ERRNO_EINPROGRESS 115 |
137 | | |
138 | | #define DLM3_ECANCEL 0x10001 |
139 | | #define DLM3_EUNLOCK 0x10002 |
140 | | |
141 | | |
142 | 0 | #define DLM3_RCOM_STATUS 1 |
143 | | #define DLM3_RCOM_NAMES 2 |
144 | | #define DLM3_RCOM_LOOKUP 3 |
145 | 0 | #define DLM3_RCOM_LOCK 4 |
146 | 0 | #define DLM3_RCOM_STATUS_REPLY 5 |
147 | | #define DLM3_RCOM_NAMES_REPLY 6 |
148 | | #define DLM3_RCOM_LOOKUP_REPLY 7 |
149 | | #define DLM3_RCOM_LOCK_REPLY 8 |
150 | | |
151 | 16 | #define DLM_RSF_NEED_SLOTS 0x00000001 |
152 | | |
153 | | #define DLM3_RS_NODES 0x00000001 |
154 | | #define DLM3_RS_NODES_ALL 0x00000002 |
155 | | #define DLM3_RS_DIR 0x00000004 |
156 | | #define DLM3_RS_DIR_ALL 0x00000008 |
157 | | #define DLM3_RS_LOCKS 0x00000010 |
158 | | #define DLM3_RS_LOCKS_ALL 0x00000020 |
159 | | #define DLM3_RS_DONE 0x00000040 |
160 | | #define DLM3_RS_DONE_ALL 0x00000080 |
161 | | |
162 | 0 | #define DLM3_RESNAME_MAXLEN 64 |
163 | | |
164 | 15 | #define DLM_HEADER_LEN (4 + 4 + 4 + 2 + 1 + 1) |
165 | 0 | #define DLM_RCOM_LEN (DLM_HEADER_LEN + 4 + 4 + 8 + 8 + 8) |
166 | 0 | #define DLM_MSG_LEN (DLM_HEADER_LEN + ((4 * 12) + (4 * 6))) |
167 | 0 | #define DLM_OPTS_LEN (DLM_HEADER_LEN + 1 + 1 + 2 + 4) |
168 | | |
169 | | /* Forward declaration we need below */ |
170 | | void proto_register_dlm3(void); |
171 | | void proto_reg_handoff_dlm3(void); |
172 | | |
173 | | static dissector_handle_t dlm3_tcp_handle; |
174 | | static dissector_handle_t dlm3_sctp_handle; |
175 | | |
176 | | |
177 | | /* Initialize the protocol and registered fields */ |
178 | | static int proto_dlm3; |
179 | | |
180 | | /* fields for struct dlm_header(h) */ |
181 | | static int hf_dlm3_h_version; |
182 | | static int hf_dlm3_h_major_version; |
183 | | static int hf_dlm3_h_minor_version; |
184 | | static int hf_dlm3_h_lockspace; |
185 | | static int hf_dlm3_h_seq; |
186 | | static int hf_dlm3_h_nodeid; |
187 | | static int hf_dlm3_h_length; |
188 | | static int hf_dlm3_h_cmd; |
189 | | static int hf_dlm3_h_pad; |
190 | | |
191 | | /* fields for struct dlm_opts(o) */ |
192 | | static int hf_dlm3_o_nextcmd; |
193 | | static int hf_dlm3_o_pad; |
194 | | static int hf_dlm3_o_optlen; |
195 | | static int hf_dlm3_o_pad2; |
196 | | static int hf_dlm3_o_opts; |
197 | | |
198 | | /* fields for struct dlm_opt_header(t) */ |
199 | | static int hf_dlm3_t_type; |
200 | | static int hf_dlm3_t_length; |
201 | | static int hf_dlm3_t_pad; |
202 | | static int hf_dlm3_t_value; |
203 | | |
204 | | /* fields for struct dlm_message(m) */ |
205 | | static int hf_dlm3_m_type; |
206 | | static int hf_dlm3_m_nodeid; |
207 | | static int hf_dlm3_m_pid; |
208 | | static int hf_dlm3_m_lkid; |
209 | | static int hf_dlm3_m_remid; |
210 | | static int hf_dlm3_m_parent_lkid; |
211 | | static int hf_dlm3_m_parent_remid; |
212 | | |
213 | | /* bit fields for dlm_message::exflags */ |
214 | | |
215 | | static int hf_dlm3_m_exflags; |
216 | | static int hf_dlm3_m_exflags_noqueue; |
217 | | static int hf_dlm3_m_exflags_cancel; |
218 | | static int hf_dlm3_m_exflags_convert; |
219 | | static int hf_dlm3_m_exflags_valblk; |
220 | | static int hf_dlm3_m_exflags_quecvt; |
221 | | static int hf_dlm3_m_exflags_ivvalblk; |
222 | | static int hf_dlm3_m_exflags_convdeadlk; |
223 | | static int hf_dlm3_m_exflags_persistent; |
224 | | static int hf_dlm3_m_exflags_nodlckwt; |
225 | | static int hf_dlm3_m_exflags_nodlckblk; |
226 | | static int hf_dlm3_m_exflags_expedite; |
227 | | static int hf_dlm3_m_exflags_noqueuebast; |
228 | | static int hf_dlm3_m_exflags_headque; |
229 | | static int hf_dlm3_m_exflags_noorder; |
230 | | static int hf_dlm3_m_exflags_orphan; |
231 | | static int hf_dlm3_m_exflags_altpr; |
232 | | static int hf_dlm3_m_exflags_altcw; |
233 | | static int hf_dlm3_m_exflags_forceunlock; |
234 | | static int hf_dlm3_m_exflags_timeout; |
235 | | |
236 | | /* bit fields for dlm_message::sbflags */ |
237 | | static int hf_dlm3_m_sbflags; |
238 | | static int hf_dlm3_m_sbflags_demoted; |
239 | | static int hf_dlm3_m_sbflags_valnotvalid; |
240 | | static int hf_dlm3_m_sbflags_altmode; |
241 | | |
242 | | /* bit fields for dlm_message::flags */ |
243 | | |
244 | | static int hf_dlm3_m_flags; |
245 | | static int hf_dlm3_m_flags_user; |
246 | | static int hf_dlm3_m_flags_orphan; |
247 | | |
248 | | static int hf_dlm3_m_lvbseq; |
249 | | static int hf_dlm3_m_hash; |
250 | | static int hf_dlm3_m_status; |
251 | | static int hf_dlm3_m_grmode; |
252 | | static int hf_dlm3_m_rqmode; |
253 | | static int hf_dlm3_m_bastmode; |
254 | | |
255 | | /* bit fields for dlm_message::asts */ |
256 | | static int hf_dlm3_m_asts; |
257 | | static int hf_dlm3_m_asts_comp; |
258 | | static int hf_dlm3_m_asts_bast; |
259 | | |
260 | | static int hf_dlm3_m_result; |
261 | | static int hf_dlm3_m_extra; |
262 | | |
263 | | /* fields for struct dlm_rcom(rc) */ |
264 | | static int hf_dlm3_rc_type; |
265 | | static int hf_dlm3_rc_result; |
266 | | static int hf_dlm3_rc_id; |
267 | | static int hf_dlm3_rc_seq; |
268 | | static int hf_dlm3_rc_seq_reply; |
269 | | static int hf_dlm3_rc_buf; |
270 | | |
271 | | /* fields for struct rcom_config(rf) */ |
272 | | static int hf_dlm3_rf_lvblen; |
273 | | static int hf_dlm3_rf_lsflags; |
274 | | static int hf_dlm3_rf_lsflags_noqueue; |
275 | | static int hf_dlm3_rf_lsflags_cancel; |
276 | | static int hf_dlm3_rf_lsflags_convert; |
277 | | static int hf_dlm3_rf_lsflags_valblk; |
278 | | static int hf_dlm3_rf_lsflags_quecvt; |
279 | | static int hf_dlm3_rf_lsflags_ivvalblk; |
280 | | static int hf_dlm3_rf_lsflags_convdeadlk; |
281 | | static int hf_dlm3_rf_lsflags_persistent; |
282 | | static int hf_dlm3_rf_lsflags_nodlckwt; |
283 | | static int hf_dlm3_rf_lsflags_nodlckblk; |
284 | | static int hf_dlm3_rf_lsflags_expedite; |
285 | | static int hf_dlm3_rf_lsflags_noqueuebast; |
286 | | static int hf_dlm3_rf_lsflags_headque; |
287 | | static int hf_dlm3_rf_lsflags_noorder; |
288 | | static int hf_dlm3_rf_lsflags_orphan; |
289 | | static int hf_dlm3_rf_lsflags_altpr; |
290 | | static int hf_dlm3_rf_lsflags_altcw; |
291 | | static int hf_dlm3_rf_lsflags_forceunlock; |
292 | | static int hf_dlm3_rf_lsflags_timeout; |
293 | | static int hf_dlm3_rf_unused; |
294 | | |
295 | | /* fields for struct rcom_status(rs) */ |
296 | | static int hf_dlm3_rs_flags; |
297 | | static int hf_dlm3_rs_flags_need_slots; |
298 | | static int hf_dlm3_rs_unused1; |
299 | | static int hf_dlm3_rs_unused2; |
300 | | |
301 | | /* fields for struct rcom_lock(rl) */ |
302 | | static int hf_dlm3_rl_ownpid; |
303 | | static int hf_dlm3_rl_lkid; |
304 | | static int hf_dlm3_rl_remid; |
305 | | static int hf_dlm3_rl_parent_lkid; |
306 | | static int hf_dlm3_rl_parent_remid; |
307 | | static int hf_dlm3_rl_exflags; |
308 | | static int hf_dlm3_rl_exflags_noqueue; |
309 | | static int hf_dlm3_rl_exflags_cancel; |
310 | | static int hf_dlm3_rl_exflags_convert; |
311 | | static int hf_dlm3_rl_exflags_valblk; |
312 | | static int hf_dlm3_rl_exflags_quecvt; |
313 | | static int hf_dlm3_rl_exflags_ivvalblk; |
314 | | static int hf_dlm3_rl_exflags_convdeadlk; |
315 | | static int hf_dlm3_rl_exflags_persistent; |
316 | | static int hf_dlm3_rl_exflags_nodlckwt; |
317 | | static int hf_dlm3_rl_exflags_nodlckblk; |
318 | | static int hf_dlm3_rl_exflags_expedite; |
319 | | static int hf_dlm3_rl_exflags_noqueuebast; |
320 | | static int hf_dlm3_rl_exflags_headque; |
321 | | static int hf_dlm3_rl_exflags_noorder; |
322 | | static int hf_dlm3_rl_exflags_orphan; |
323 | | static int hf_dlm3_rl_exflags_altpr; |
324 | | static int hf_dlm3_rl_exflags_altcw; |
325 | | static int hf_dlm3_rl_exflags_forceunlock; |
326 | | static int hf_dlm3_rl_exflags_timeout; |
327 | | static int hf_dlm3_rl_flags; |
328 | | static int hf_dlm3_rl_flags_user; |
329 | | static int hf_dlm3_rl_flags_orphan; |
330 | | static int hf_dlm3_rl_lvbseq; |
331 | | static int hf_dlm3_rl_result; |
332 | | static int hf_dlm3_rl_rqmode; |
333 | | static int hf_dlm3_rl_grmode; |
334 | | static int hf_dlm3_rl_status; |
335 | | static int hf_dlm3_rl_asts; |
336 | | static int hf_dlm3_rl_asts_comp; |
337 | | static int hf_dlm3_rl_asts_bast; |
338 | | static int hf_dlm3_rl_wait_type; |
339 | | static int hf_dlm3_rl_namelen; |
340 | | static int hf_dlm3_rl_name; |
341 | | static int hf_dlm3_rl_name_contents; |
342 | | static int hf_dlm3_rl_name_padding; |
343 | | static int hf_dlm3_rl_lvb; |
344 | | |
345 | | /* Initialize the subtree pointers */ |
346 | | static int ett_dlm3; |
347 | | static int ett_dlm3_version; |
348 | | |
349 | | static int ett_dlm3_opts; |
350 | | static int ett_dlm3_options; |
351 | | static int ett_dlm3_next_cmd; |
352 | | |
353 | | static int ett_dlm3_msg; |
354 | | static int ett_dlm3_m_exflags; |
355 | | static int ett_dlm3_sbflags; |
356 | | static int ett_dlm3_m_flags; |
357 | | static int ett_dlm3_m_asts; |
358 | | |
359 | | static int ett_dlm3_rcom; |
360 | | static int ett_dlm3_rcom_status; |
361 | | static int ett_dlm3_rcom_lock; |
362 | | static int ett_dlm3_rcom_config; |
363 | | |
364 | | static int ett_dlm3_rs_flags; |
365 | | |
366 | | static int ett_dlm3_rf_lsflags; |
367 | | static int ett_dlm3_rl_exflags; |
368 | | static int ett_dlm3_rl_flags; |
369 | | static int ett_dlm3_rl_asts; |
370 | | static int ett_dlm3_rl_name; |
371 | | |
372 | | |
373 | | /* |
374 | | * Value strings |
375 | | */ |
376 | | static const value_string dlm3_cmd[] = { |
377 | | { DLM3_MSG, "message" }, |
378 | | { DLM3_RCOM, "recovery command" }, |
379 | | { DLM3_OPTS, "options" }, |
380 | | { DLM3_ACK, "acknowledge" }, |
381 | | { DLM3_FIN, "fin" }, |
382 | | { 0, NULL } |
383 | | }; |
384 | | |
385 | | static const value_string dlm3_msg[] = { |
386 | | { DLM3_MSG_REQUEST, "request message" }, |
387 | | { DLM3_MSG_CONVERT, "conversion message" }, |
388 | | { DLM3_MSG_UNLOCK, "unlock message" }, |
389 | | { DLM3_MSG_CANCEL, "cancel message" }, |
390 | | { DLM3_MSG_REQUEST_REPLY, "request reply" }, |
391 | | { DLM3_MSG_CONVERT_REPLY, "conversion reply" }, |
392 | | { DLM3_MSG_UNLOCK_REPLY, "unlock reply" }, |
393 | | { DLM3_MSG_CANCEL_REPLY, "cancel reply" }, |
394 | | { DLM3_MSG_GRANT, "grant message" }, |
395 | | { DLM3_MSG_BAST, "bast message" }, |
396 | | { DLM3_MSG_LOOKUP, "lookup message" }, |
397 | | { DLM3_MSG_REMOVE, "remove message" }, |
398 | | { DLM3_MSG_LOOKUP_REPLY, "lookup reply" }, |
399 | | { DLM3_MSG_PURGE, "purge orphans" }, |
400 | | { 0, NULL } |
401 | | }; |
402 | | |
403 | | static const value_string dlm3_status[] = { |
404 | | { DLM3_LKSTS_WAITING, "waiting" }, |
405 | | { DLM3_LKSTS_GRANTED, "granted" }, |
406 | | { DLM3_LKSTS_CONVERT, "convert" }, |
407 | | { 0, NULL } |
408 | | }; |
409 | | |
410 | | static const value_string dlm3_mode[] = { |
411 | | { DLM3_LOCK_IV, "invalid" }, |
412 | | { DLM3_LOCK_NL, "null" }, |
413 | | { DLM3_LOCK_CR, "concurrent read" }, |
414 | | { DLM3_LOCK_CW, "concurrent write" }, |
415 | | { DLM3_LOCK_PR, "protected read" }, |
416 | | { DLM3_LOCK_PW, "protected write" }, |
417 | | { DLM3_LOCK_EX, "exclusive" }, |
418 | | { 0, NULL } |
419 | | }; |
420 | | |
421 | | static const value_string dlm3_result[] = { |
422 | | { -LINUX_EAGAIN, "blocked" }, |
423 | | { -LINUX_ENOMEM, "no memory" }, |
424 | | { -LINUX_INVAL, "invalid parameters" }, |
425 | | { -DLM3_ERRNO_EDEADLK, "Resource deadlock avoided" }, |
426 | | { -DLM3_ERRNO_EBADR, "Invalid request descriptor" }, |
427 | | { -DLM3_ERRNO_EBADSLT, "Invalid slot" }, |
428 | | { -DLM3_ERRNO_EPROTO, "Protocol error" }, |
429 | | { -DLM3_ERRNO_EOPNOTSUPP, "Operation not supported" }, |
430 | | { -DLM3_ERRNO_ETIMEDOUT, "Connection timed out" }, |
431 | | { -DLM3_ERRNO_EINPROGRESS, "Operation now in progress" }, |
432 | | { -DLM3_ECANCEL, "cancel completed successfully" }, |
433 | | { -DLM3_EUNLOCK, "unlock request was successful" }, |
434 | | { 0, "successful" }, |
435 | | { 0, NULL } |
436 | | }; |
437 | | |
438 | | static const value_string dlm3_rcom[] = { |
439 | | { DLM3_RCOM_STATUS, "status command" }, |
440 | | { DLM3_RCOM_NAMES, "names command" }, |
441 | | { DLM3_RCOM_LOOKUP, "lookup command" }, |
442 | | { DLM3_RCOM_LOCK, "lock command" }, |
443 | | { DLM3_RCOM_STATUS_REPLY, "status reply" }, |
444 | | { DLM3_RCOM_NAMES_REPLY, "names reply" }, |
445 | | { DLM3_RCOM_LOOKUP_REPLY, "lookup reply" }, |
446 | | { DLM3_RCOM_LOCK_REPLY, "lock reply" }, |
447 | | { 0, NULL } |
448 | | }; |
449 | | |
450 | | static const value_string dlm3_rs[] = { |
451 | | { DLM3_RS_NODES, "recovering nodes" }, |
452 | | { DLM3_RS_NODES_ALL, "recovering all nodes" }, |
453 | | { DLM3_RS_DIR, "recovering resource directory" }, |
454 | | { DLM3_RS_DIR_ALL, "recovering all resource directories" }, |
455 | | { DLM3_RS_LOCKS, "recovering lock" }, |
456 | | { DLM3_RS_LOCKS_ALL, "recovering all locks" }, |
457 | | { DLM3_RS_DONE, "recovering is done" }, |
458 | | { DLM3_RS_DONE_ALL, "all recovering is done" }, |
459 | | { 0, NULL } |
460 | | }; |
461 | | |
462 | | /* |
463 | | * Fields |
464 | | */ |
465 | | |
466 | | static int * const m_exflags_fields[] = { |
467 | | &hf_dlm3_m_exflags_timeout, |
468 | | &hf_dlm3_m_exflags_forceunlock, |
469 | | &hf_dlm3_m_exflags_altcw, |
470 | | &hf_dlm3_m_exflags_altpr, |
471 | | &hf_dlm3_m_exflags_orphan, |
472 | | &hf_dlm3_m_exflags_noorder, |
473 | | &hf_dlm3_m_exflags_headque, |
474 | | &hf_dlm3_m_exflags_noqueuebast, |
475 | | &hf_dlm3_m_exflags_expedite, |
476 | | &hf_dlm3_m_exflags_nodlckblk, |
477 | | &hf_dlm3_m_exflags_nodlckwt, |
478 | | &hf_dlm3_m_exflags_persistent, |
479 | | &hf_dlm3_m_exflags_convdeadlk, |
480 | | &hf_dlm3_m_exflags_ivvalblk, |
481 | | &hf_dlm3_m_exflags_quecvt, |
482 | | &hf_dlm3_m_exflags_valblk, |
483 | | &hf_dlm3_m_exflags_convert, |
484 | | &hf_dlm3_m_exflags_cancel, |
485 | | &hf_dlm3_m_exflags_noqueue, |
486 | | NULL |
487 | | }; |
488 | | |
489 | | static int * const rs_flags_fields[] = { |
490 | | &hf_dlm3_rs_flags_need_slots, |
491 | | NULL |
492 | | }; |
493 | | |
494 | | static int * const m_sbflags_fields[] = { |
495 | | &hf_dlm3_m_sbflags_altmode, |
496 | | &hf_dlm3_m_sbflags_valnotvalid, |
497 | | &hf_dlm3_m_sbflags_demoted, |
498 | | NULL |
499 | | }; |
500 | | |
501 | | static int * const m_flags_fields[] = { |
502 | | &hf_dlm3_m_flags_orphan, |
503 | | &hf_dlm3_m_flags_user, |
504 | | NULL |
505 | | }; |
506 | | |
507 | | static int * const m_asts_fields[] = { |
508 | | &hf_dlm3_m_asts_bast, |
509 | | &hf_dlm3_m_asts_comp, |
510 | | NULL |
511 | | }; |
512 | | |
513 | | static int * const rf_lsflags_fields[] = { |
514 | | &hf_dlm3_rf_lsflags_timeout, |
515 | | &hf_dlm3_rf_lsflags_forceunlock, |
516 | | &hf_dlm3_rf_lsflags_altcw, |
517 | | &hf_dlm3_rf_lsflags_altpr, |
518 | | &hf_dlm3_rf_lsflags_orphan, |
519 | | &hf_dlm3_rf_lsflags_noorder, |
520 | | &hf_dlm3_rf_lsflags_headque, |
521 | | &hf_dlm3_rf_lsflags_noqueuebast, |
522 | | &hf_dlm3_rf_lsflags_expedite, |
523 | | &hf_dlm3_rf_lsflags_nodlckblk, |
524 | | &hf_dlm3_rf_lsflags_nodlckwt, |
525 | | &hf_dlm3_rf_lsflags_persistent, |
526 | | &hf_dlm3_rf_lsflags_convdeadlk, |
527 | | &hf_dlm3_rf_lsflags_ivvalblk, |
528 | | &hf_dlm3_rf_lsflags_quecvt, |
529 | | &hf_dlm3_rf_lsflags_valblk, |
530 | | &hf_dlm3_rf_lsflags_convert, |
531 | | &hf_dlm3_rf_lsflags_cancel, |
532 | | &hf_dlm3_rf_lsflags_noqueue, |
533 | | NULL |
534 | | }; |
535 | | |
536 | | static int * const rl_exflags_fields[] = { |
537 | | &hf_dlm3_rl_exflags_timeout, |
538 | | &hf_dlm3_rl_exflags_forceunlock, |
539 | | &hf_dlm3_rl_exflags_altcw, |
540 | | &hf_dlm3_rl_exflags_altpr, |
541 | | &hf_dlm3_rl_exflags_orphan, |
542 | | &hf_dlm3_rl_exflags_noorder, |
543 | | &hf_dlm3_rl_exflags_headque, |
544 | | &hf_dlm3_rl_exflags_noqueuebast, |
545 | | &hf_dlm3_rl_exflags_expedite, |
546 | | &hf_dlm3_rl_exflags_nodlckblk, |
547 | | &hf_dlm3_rl_exflags_nodlckwt, |
548 | | &hf_dlm3_rl_exflags_persistent, |
549 | | &hf_dlm3_rl_exflags_convdeadlk, |
550 | | &hf_dlm3_rl_exflags_ivvalblk, |
551 | | &hf_dlm3_rl_exflags_quecvt, |
552 | | &hf_dlm3_rl_exflags_valblk, |
553 | | &hf_dlm3_rl_exflags_convert, |
554 | | &hf_dlm3_rl_exflags_cancel, |
555 | | &hf_dlm3_rl_exflags_noqueue, |
556 | | NULL |
557 | | }; |
558 | | |
559 | | static int * const rl_flags_fields[] = { |
560 | | &hf_dlm3_rl_flags_orphan, |
561 | | &hf_dlm3_rl_flags_user, |
562 | | NULL |
563 | | }; |
564 | | |
565 | | static int * const rl_asts_fields[] = { |
566 | | &hf_dlm3_rl_asts_bast, |
567 | | &hf_dlm3_rl_asts_comp, |
568 | | NULL |
569 | | }; |
570 | | |
571 | | /* Code to actually dissect the packets */ |
572 | | static void |
573 | | dissect_dlm3_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, |
574 | | unsigned length, int offset) |
575 | 0 | { |
576 | 0 | uint32_t m_type; |
577 | |
|
578 | 0 | m_type = tvb_get_letohl(tvb, offset); |
579 | 0 | proto_tree_add_uint(tree, |
580 | 0 | hf_dlm3_m_type, tvb, offset, 4, m_type); |
581 | 0 | col_append_fstr(pinfo->cinfo, COL_INFO, |
582 | 0 | ": %s", |
583 | 0 | val_to_str_const(m_type, |
584 | 0 | dlm3_msg, |
585 | 0 | "Unknown")); |
586 | |
|
587 | 0 | offset += 4; |
588 | 0 | proto_tree_add_item(tree, |
589 | 0 | hf_dlm3_m_nodeid, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
590 | |
|
591 | 0 | offset += 4; |
592 | 0 | proto_tree_add_item(tree, |
593 | 0 | hf_dlm3_m_pid, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
594 | |
|
595 | 0 | offset += 4; |
596 | 0 | proto_tree_add_item(tree, |
597 | 0 | hf_dlm3_m_lkid, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
598 | | /* TODO: See `create_lkb' |
599 | | lkid has some structure. We dissect more. */ |
600 | |
|
601 | 0 | offset += 4; |
602 | 0 | proto_tree_add_item(tree, |
603 | 0 | hf_dlm3_m_remid, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
604 | |
|
605 | 0 | offset += 4; |
606 | 0 | proto_tree_add_item(tree, |
607 | 0 | hf_dlm3_m_parent_lkid, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
608 | |
|
609 | 0 | offset += 4; |
610 | 0 | proto_tree_add_item(tree, |
611 | 0 | hf_dlm3_m_parent_remid, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
612 | |
|
613 | 0 | offset += 4; |
614 | 0 | proto_tree_add_bitmask(tree, tvb, offset, |
615 | 0 | hf_dlm3_m_exflags, ett_dlm3_m_exflags, |
616 | 0 | m_exflags_fields, ENC_LITTLE_ENDIAN); |
617 | |
|
618 | 0 | offset += 4; |
619 | 0 | proto_tree_add_bitmask(tree, tvb, offset, |
620 | 0 | hf_dlm3_m_sbflags, ett_dlm3_sbflags, |
621 | 0 | m_sbflags_fields, ENC_LITTLE_ENDIAN); |
622 | |
|
623 | 0 | offset += 4; |
624 | 0 | proto_tree_add_bitmask(tree, tvb, offset, |
625 | 0 | hf_dlm3_m_flags, ett_dlm3_m_flags, |
626 | 0 | m_flags_fields, ENC_LITTLE_ENDIAN); |
627 | |
|
628 | 0 | offset += 4; |
629 | 0 | proto_tree_add_item(tree, |
630 | 0 | hf_dlm3_m_lvbseq, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
631 | |
|
632 | 0 | offset += 4; |
633 | 0 | proto_tree_add_item(tree, |
634 | 0 | hf_dlm3_m_hash, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
635 | |
|
636 | 0 | offset += 4; |
637 | 0 | proto_tree_add_item(tree, |
638 | 0 | hf_dlm3_m_status, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
639 | |
|
640 | 0 | offset += 4; |
641 | 0 | proto_tree_add_item(tree, |
642 | 0 | hf_dlm3_m_grmode, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
643 | |
|
644 | 0 | offset += 4; |
645 | 0 | proto_tree_add_item(tree, |
646 | 0 | hf_dlm3_m_rqmode, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
647 | |
|
648 | 0 | offset += 4; |
649 | 0 | proto_tree_add_item(tree, |
650 | 0 | hf_dlm3_m_bastmode, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
651 | | |
652 | |
|
653 | 0 | offset += 4; |
654 | 0 | proto_tree_add_bitmask(tree, tvb, offset, |
655 | 0 | hf_dlm3_m_asts, ett_dlm3_m_asts, |
656 | 0 | m_asts_fields, ENC_LITTLE_ENDIAN); |
657 | 0 | offset += 4; |
658 | 0 | proto_tree_add_item(tree, |
659 | 0 | hf_dlm3_m_result, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
660 | |
|
661 | 0 | offset += 4; |
662 | 0 | if ((length - offset) > 0) { |
663 | 0 | proto_tree_add_item(tree, |
664 | 0 | hf_dlm3_m_extra, |
665 | 0 | tvb, |
666 | 0 | offset, |
667 | 0 | -1, |
668 | 0 | ENC_NA); |
669 | 0 | } |
670 | 0 | } |
671 | | |
672 | | |
673 | | static void |
674 | | dissect_dlm3_rcom_status(tvbuff_t *tvb, proto_tree *tree, |
675 | | unsigned length, int offset) |
676 | 0 | { |
677 | 0 | if ((length - offset) < ( 4 * 2 + 8 )) |
678 | 0 | return; |
679 | | |
680 | | |
681 | 0 | proto_tree_add_bitmask(tree, tvb, offset, |
682 | 0 | hf_dlm3_rs_flags, ett_dlm3_rs_flags, |
683 | 0 | rs_flags_fields, ENC_LITTLE_ENDIAN); |
684 | |
|
685 | 0 | offset += 4; |
686 | 0 | proto_tree_add_item(tree, |
687 | 0 | hf_dlm3_rs_unused1, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
688 | |
|
689 | 0 | offset += 4; |
690 | 0 | proto_tree_add_item(tree, |
691 | 0 | hf_dlm3_rs_unused2, tvb, offset, 8, ENC_LITTLE_ENDIAN); |
692 | 0 | } |
693 | | |
694 | | |
695 | | static void |
696 | | dissect_dlm3_rcom_lock(tvbuff_t *tvb, proto_tree *tree, |
697 | | unsigned length, int offset) |
698 | 0 | { |
699 | 0 | proto_item *sub_item; |
700 | 0 | proto_tree *sub_tree; |
701 | 0 | int sub_offset; |
702 | 0 | uint16_t namelen; |
703 | 0 | uint32_t exflags; |
704 | | |
705 | |
|
706 | 0 | if ((length - offset) < ( 4 * 8 + 4 + 1 * 4 + 2 * 2 |
707 | 0 | + DLM3_RESNAME_MAXLEN )) |
708 | 0 | return; |
709 | | |
710 | | |
711 | 0 | proto_tree_add_item(tree, |
712 | 0 | hf_dlm3_rl_ownpid, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
713 | |
|
714 | 0 | offset += 4; |
715 | 0 | proto_tree_add_item(tree, |
716 | 0 | hf_dlm3_rl_lkid, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
717 | |
|
718 | 0 | offset += 4; |
719 | 0 | proto_tree_add_item(tree, |
720 | 0 | hf_dlm3_rl_remid, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
721 | |
|
722 | 0 | offset += 4; |
723 | 0 | proto_tree_add_item(tree, |
724 | 0 | hf_dlm3_rl_parent_lkid, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
725 | |
|
726 | 0 | offset += 4; |
727 | 0 | proto_tree_add_item(tree, |
728 | 0 | hf_dlm3_rl_parent_remid, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
729 | |
|
730 | 0 | offset += 4; |
731 | 0 | proto_tree_add_bitmask(tree, tvb, offset, |
732 | 0 | hf_dlm3_rl_exflags, ett_dlm3_rl_exflags, |
733 | 0 | rl_exflags_fields, ENC_LITTLE_ENDIAN); |
734 | 0 | exflags = tvb_get_letohl(tvb, offset); |
735 | | |
736 | |
|
737 | 0 | offset += 4; |
738 | 0 | proto_tree_add_bitmask(tree, tvb, offset, |
739 | 0 | hf_dlm3_rl_flags, ett_dlm3_rl_flags, |
740 | 0 | rl_flags_fields, ENC_LITTLE_ENDIAN); |
741 | |
|
742 | 0 | offset += 4; |
743 | 0 | proto_tree_add_item(tree, |
744 | 0 | hf_dlm3_rl_lvbseq, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
745 | |
|
746 | 0 | offset += 4; |
747 | 0 | proto_tree_add_item(tree, |
748 | 0 | hf_dlm3_rl_result, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
749 | |
|
750 | 0 | offset += 4; |
751 | 0 | proto_tree_add_item(tree, |
752 | 0 | hf_dlm3_rl_rqmode, tvb, offset, 1, ENC_LITTLE_ENDIAN); |
753 | |
|
754 | 0 | offset += 1; |
755 | 0 | proto_tree_add_item(tree, |
756 | 0 | hf_dlm3_rl_grmode, tvb, offset, 1, ENC_LITTLE_ENDIAN); |
757 | |
|
758 | 0 | offset += 1; |
759 | 0 | proto_tree_add_item(tree, |
760 | 0 | hf_dlm3_rl_status, tvb, offset, 1, ENC_LITTLE_ENDIAN); |
761 | |
|
762 | 0 | offset += 1; |
763 | 0 | proto_tree_add_bitmask(tree, tvb, offset, |
764 | 0 | hf_dlm3_rl_asts, ett_dlm3_rl_asts, |
765 | 0 | rl_asts_fields, ENC_LITTLE_ENDIAN); |
766 | |
|
767 | 0 | offset += 1; |
768 | 0 | proto_tree_add_item(tree, |
769 | 0 | hf_dlm3_rl_wait_type, tvb, offset, 2, ENC_LITTLE_ENDIAN); |
770 | |
|
771 | 0 | offset += 2; |
772 | 0 | namelen = tvb_get_letohs(tvb, offset); |
773 | 0 | proto_tree_add_uint(tree, |
774 | 0 | hf_dlm3_rl_namelen, tvb, offset, 2, |
775 | 0 | namelen); |
776 | |
|
777 | 0 | offset += 2; |
778 | 0 | if (namelen <= DLM3_RESNAME_MAXLEN) { |
779 | 0 | sub_item = proto_tree_add_item(tree, |
780 | 0 | hf_dlm3_rl_name, tvb, offset, |
781 | 0 | DLM3_RESNAME_MAXLEN, ENC_NA); |
782 | |
|
783 | 0 | sub_tree = proto_item_add_subtree(sub_item, |
784 | 0 | ett_dlm3_rl_name); |
785 | 0 | sub_offset = offset; |
786 | 0 | proto_tree_add_item(sub_tree, |
787 | 0 | hf_dlm3_rl_name_contents, tvb, sub_offset, |
788 | 0 | namelen, ENC_ASCII); |
789 | |
|
790 | 0 | sub_offset += namelen; |
791 | 0 | proto_tree_add_item(sub_tree, |
792 | 0 | hf_dlm3_rl_name_padding, tvb, sub_offset, |
793 | 0 | DLM3_RESNAME_MAXLEN - namelen, ENC_NA); |
794 | 0 | } else { |
795 | | /* XXX - report an error */ |
796 | 0 | } |
797 | |
|
798 | 0 | offset += DLM3_RESNAME_MAXLEN; |
799 | 0 | if (((length - offset) > 0) && (exflags & DLM3_LKF_VALBLK)) |
800 | 0 | proto_tree_add_item(tree, |
801 | 0 | hf_dlm3_rl_lvb, tvb, offset, |
802 | 0 | -1, |
803 | 0 | ENC_NA); |
804 | 0 | } |
805 | | |
806 | | |
807 | | static void |
808 | | dissect_dlm3_rcom_config(tvbuff_t *tvb, proto_tree *tree, |
809 | | unsigned length, int offset) |
810 | 0 | { |
811 | 0 | if ((length - offset) < ( 4 + 4 + 8 )) |
812 | 0 | return; |
813 | | |
814 | 0 | proto_tree_add_item(tree, |
815 | 0 | hf_dlm3_rf_lvblen, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
816 | |
|
817 | 0 | offset += 4; |
818 | 0 | proto_tree_add_bitmask(tree, tvb, offset, |
819 | 0 | hf_dlm3_rf_lsflags, ett_dlm3_rf_lsflags, |
820 | 0 | rf_lsflags_fields, ENC_LITTLE_ENDIAN); |
821 | |
|
822 | 0 | offset += 4; |
823 | 0 | proto_tree_add_item(tree, |
824 | 0 | hf_dlm3_rf_unused, tvb, offset, 8, ENC_LITTLE_ENDIAN); |
825 | | |
826 | | |
827 | | /*offset += 8;*/ |
828 | | /* END */ |
829 | 0 | } |
830 | | |
831 | | static void |
832 | | dissect_dlm3_rcom(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, |
833 | | unsigned length, int offset, uint32_t h_version) |
834 | 0 | { |
835 | 0 | uint32_t rc_type; |
836 | |
|
837 | 0 | proto_item *sub_item; |
838 | 0 | proto_tree *sub_tree; |
839 | | |
840 | |
|
841 | 0 | rc_type = tvb_get_letohl(tvb, offset); |
842 | 0 | proto_tree_add_uint(tree, |
843 | 0 | hf_dlm3_rc_type, tvb, offset, 4, rc_type); |
844 | 0 | col_append_fstr(pinfo->cinfo, COL_INFO, |
845 | 0 | ": %s", |
846 | 0 | val_to_str_const(rc_type, |
847 | 0 | dlm3_rcom, |
848 | 0 | "Unknown")); |
849 | |
|
850 | 0 | offset += 4; |
851 | 0 | proto_tree_add_item(tree, |
852 | 0 | hf_dlm3_rc_result, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
853 | |
|
854 | 0 | offset += 4; |
855 | 0 | proto_tree_add_item(tree, |
856 | 0 | hf_dlm3_rc_id, tvb, offset, 8, ENC_LITTLE_ENDIAN); |
857 | |
|
858 | 0 | offset += 8; |
859 | 0 | proto_tree_add_item(tree, |
860 | 0 | hf_dlm3_rc_seq, tvb, offset, 8, ENC_LITTLE_ENDIAN); |
861 | |
|
862 | 0 | offset += 8; |
863 | 0 | proto_tree_add_item(tree, |
864 | 0 | hf_dlm3_rc_seq_reply, tvb, offset, 8, ENC_LITTLE_ENDIAN); |
865 | |
|
866 | 0 | offset += 8; |
867 | 0 | if ((length - offset) == 0) { |
868 | | /* No rc_buf: Just return */ |
869 | 0 | return; |
870 | 0 | } |
871 | | |
872 | | /* Decode rc_buf */ |
873 | 0 | sub_item = proto_tree_add_item(tree, |
874 | 0 | hf_dlm3_rc_buf, |
875 | 0 | tvb, |
876 | 0 | offset, |
877 | 0 | -1, |
878 | 0 | ENC_NA); |
879 | |
|
880 | 0 | offset += 0; |
881 | 0 | if (rc_type == DLM3_RCOM_STATUS && (h_version & 0xffff) > 0) { |
882 | 0 | sub_tree = proto_item_add_subtree(sub_item, |
883 | 0 | ett_dlm3_rcom_status); |
884 | 0 | dissect_dlm3_rcom_status(tvb, sub_tree, length, offset); |
885 | 0 | } else if (rc_type == DLM3_RCOM_LOCK) { |
886 | 0 | sub_tree = proto_item_add_subtree(sub_item, |
887 | 0 | ett_dlm3_rcom_lock); |
888 | 0 | dissect_dlm3_rcom_lock(tvb, sub_tree, length, offset); |
889 | 0 | } else if (rc_type == DLM3_RCOM_STATUS_REPLY) { |
890 | 0 | sub_tree = proto_item_add_subtree(sub_item, |
891 | 0 | ett_dlm3_rcom_config); |
892 | 0 | dissect_dlm3_rcom_config(tvb, sub_tree, length, offset); |
893 | 0 | } |
894 | |
|
895 | 0 | } |
896 | | |
897 | | static int |
898 | | dissect_dlm3_1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_, |
899 | | uint8_t h_cmd, uint32_t h_version, unsigned length, int offset) |
900 | 0 | { |
901 | 0 | proto_item *sub_item; |
902 | 0 | proto_tree *sub_tree; |
903 | |
|
904 | 0 | switch (h_cmd) { |
905 | 0 | case DLM3_MSG: |
906 | 0 | case DLM3_RCOM: |
907 | 0 | break; |
908 | 0 | default: |
909 | 0 | return 0; |
910 | 0 | } |
911 | | |
912 | 0 | sub_item = proto_tree_add_uint(tree, |
913 | 0 | hf_dlm3_h_version, tvb, offset, 4, |
914 | 0 | h_version); |
915 | 0 | sub_tree = proto_item_add_subtree(sub_item, ett_dlm3_version); |
916 | 0 | proto_tree_add_uint(sub_tree, |
917 | 0 | hf_dlm3_h_major_version, tvb, offset + 0, 2, |
918 | 0 | (h_version & 0xFFFF0000) >> 16); |
919 | 0 | proto_tree_add_uint(sub_tree, |
920 | 0 | hf_dlm3_h_minor_version, tvb, offset + 2, 2, |
921 | 0 | (h_version & 0x0000FFFF)); |
922 | 0 | offset += 4; |
923 | |
|
924 | 0 | proto_tree_add_item(tree, |
925 | 0 | hf_dlm3_h_lockspace, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
926 | 0 | offset += 4; |
927 | |
|
928 | 0 | proto_tree_add_item(tree, |
929 | 0 | hf_dlm3_h_nodeid, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
930 | 0 | offset += 4; |
931 | |
|
932 | 0 | proto_tree_add_item(tree, |
933 | 0 | hf_dlm3_h_length, tvb, offset, 2, ENC_LITTLE_ENDIAN); |
934 | 0 | offset += 2; |
935 | |
|
936 | 0 | sub_item = proto_tree_add_uint(tree, |
937 | 0 | hf_dlm3_h_cmd, tvb, offset, 1, h_cmd); |
938 | 0 | offset += 1; |
939 | |
|
940 | 0 | proto_tree_add_item(tree, |
941 | 0 | hf_dlm3_h_pad, tvb, offset, 1, ENC_LITTLE_ENDIAN); |
942 | 0 | offset += 1; |
943 | |
|
944 | 0 | switch (h_cmd) { |
945 | 0 | case DLM3_MSG: |
946 | 0 | if (length < DLM_MSG_LEN) |
947 | 0 | return 0; |
948 | | |
949 | 0 | sub_tree = proto_item_add_subtree(sub_item, ett_dlm3_msg); |
950 | 0 | dissect_dlm3_msg(tvb, pinfo, sub_tree, length, offset); |
951 | 0 | break; |
952 | 0 | case DLM3_RCOM: |
953 | 0 | if (length < DLM_RCOM_LEN) |
954 | 0 | return 0; |
955 | | |
956 | 0 | sub_tree = proto_item_add_subtree(sub_item, ett_dlm3_rcom); |
957 | 0 | dissect_dlm3_rcom(tvb, pinfo, sub_tree, length, offset, h_version); |
958 | 0 | break; |
959 | 0 | default: |
960 | 0 | break; |
961 | 0 | } |
962 | | |
963 | 0 | return tvb_captured_length(tvb); |
964 | 0 | } |
965 | | |
966 | | static int |
967 | | dissect_dlm3_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_, |
968 | | uint8_t h_cmd, uint32_t h_version, unsigned length) |
969 | 0 | { |
970 | 0 | proto_item *sub_item, *opts_item; |
971 | 0 | proto_tree *sub_tree, *opts_tree; |
972 | 0 | int offset, tlv_offset; |
973 | 0 | unsigned o_nextcmd; |
974 | 0 | uint16_t o_optlen, tmp, t_len; |
975 | |
|
976 | 0 | switch (h_cmd) { |
977 | 0 | case DLM3_MSG: |
978 | 0 | case DLM3_RCOM: |
979 | 0 | case DLM3_OPTS: |
980 | 0 | case DLM3_ACK: |
981 | 0 | case DLM3_FIN: |
982 | 0 | break; |
983 | 0 | default: |
984 | 0 | return 0; |
985 | 0 | } |
986 | | |
987 | 0 | offset = 0; |
988 | |
|
989 | 0 | sub_item = proto_tree_add_uint(tree, |
990 | 0 | hf_dlm3_h_version, tvb, offset, 4, |
991 | 0 | h_version); |
992 | 0 | sub_tree = proto_item_add_subtree(sub_item, ett_dlm3_version); |
993 | 0 | proto_tree_add_uint(sub_tree, |
994 | 0 | hf_dlm3_h_major_version, tvb, offset + 0, 2, |
995 | 0 | (h_version & 0xFFFF0000) >> 16); |
996 | 0 | proto_tree_add_uint(sub_tree, |
997 | 0 | hf_dlm3_h_minor_version, tvb, offset + 2, 2, |
998 | 0 | (h_version & 0x0000FFFF)); |
999 | 0 | offset += 4; |
1000 | |
|
1001 | 0 | proto_tree_add_item(tree, |
1002 | 0 | hf_dlm3_h_seq, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
1003 | 0 | offset += 4; |
1004 | |
|
1005 | 0 | proto_tree_add_item(tree, |
1006 | 0 | hf_dlm3_h_nodeid, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
1007 | 0 | offset += 4; |
1008 | |
|
1009 | 0 | proto_tree_add_item(tree, |
1010 | 0 | hf_dlm3_h_length, tvb, offset, 2, ENC_LITTLE_ENDIAN); |
1011 | 0 | offset += 2; |
1012 | |
|
1013 | 0 | sub_item = proto_tree_add_uint(tree, |
1014 | 0 | hf_dlm3_h_cmd, tvb, offset, 1, h_cmd); |
1015 | 0 | offset += 1; |
1016 | |
|
1017 | 0 | proto_tree_add_item(tree, |
1018 | 0 | hf_dlm3_h_pad, tvb, offset, 1, ENC_LITTLE_ENDIAN); |
1019 | 0 | offset += 1; |
1020 | |
|
1021 | 0 | switch (h_cmd) { |
1022 | 0 | case DLM3_OPTS: |
1023 | 0 | if (length < DLM_OPTS_LEN) |
1024 | 0 | return 0; |
1025 | | |
1026 | 0 | sub_tree = proto_item_add_subtree(sub_item, ett_dlm3_opts); |
1027 | 0 | o_nextcmd = tvb_get_uint8(tvb, offset); |
1028 | 0 | col_append_fstr(pinfo->cinfo, COL_INFO, |
1029 | 0 | ": %s", val_to_str_const(o_nextcmd, |
1030 | 0 | dlm3_cmd, |
1031 | 0 | "Unknown")); |
1032 | 0 | sub_item = proto_tree_add_uint(sub_tree, hf_dlm3_o_nextcmd, tvb, offset, 1, o_nextcmd); |
1033 | 0 | offset += 1; |
1034 | |
|
1035 | 0 | proto_tree_add_item(sub_tree, hf_dlm3_o_pad, tvb, offset, 1, ENC_LITTLE_ENDIAN); |
1036 | 0 | offset += 1; |
1037 | |
|
1038 | 0 | o_optlen = tvb_get_letohs(tvb, offset); |
1039 | 0 | tmp = DLM_OPTS_LEN + o_optlen; |
1040 | 0 | if (length < tmp) |
1041 | 0 | return 0; |
1042 | | |
1043 | 0 | proto_tree_add_uint(sub_tree, hf_dlm3_o_optlen, tvb, offset, 2, o_optlen); |
1044 | 0 | offset += 2; |
1045 | |
|
1046 | 0 | proto_tree_add_item(sub_tree, hf_dlm3_o_pad2, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
1047 | 0 | offset += 4; |
1048 | |
|
1049 | 0 | tmp = o_optlen; |
1050 | 0 | if (tmp) { |
1051 | 0 | opts_item = proto_tree_add_item(sub_tree, hf_dlm3_o_opts, tvb, offset, tmp, ENC_NA); |
1052 | 0 | opts_tree = proto_item_add_subtree(opts_item, ett_dlm3_options); |
1053 | |
|
1054 | 0 | tlv_offset = 0; |
1055 | 0 | while (tmp > 0) { |
1056 | 0 | proto_tree_add_item(opts_tree, hf_dlm3_t_type, tvb, offset, 2, ENC_LITTLE_ENDIAN); |
1057 | 0 | tlv_offset += 2; |
1058 | |
|
1059 | 0 | t_len = tvb_get_letohs(tvb, offset); |
1060 | 0 | if (t_len > o_optlen - tlv_offset) |
1061 | 0 | return 0; |
1062 | 0 | proto_tree_add_uint(opts_tree, hf_dlm3_t_length, tvb, offset, 2, t_len); |
1063 | 0 | tlv_offset += 2; |
1064 | |
|
1065 | 0 | proto_tree_add_item(opts_tree, hf_dlm3_t_pad, tvb, offset, 4, ENC_LITTLE_ENDIAN); |
1066 | 0 | tlv_offset += 4; |
1067 | |
|
1068 | 0 | proto_tree_add_item(opts_tree, hf_dlm3_t_value, tvb, offset, t_len, ENC_NA); |
1069 | 0 | tlv_offset += t_len; |
1070 | 0 | tmp -= t_len; |
1071 | 0 | } |
1072 | 0 | offset += tlv_offset; |
1073 | 0 | } |
1074 | | |
1075 | 0 | switch (o_nextcmd) { |
1076 | 0 | case DLM3_MSG: |
1077 | 0 | tmp = DLM_OPTS_LEN + o_optlen + DLM_RCOM_LEN; |
1078 | 0 | if (length < tmp) |
1079 | 0 | return 0; |
1080 | | |
1081 | 0 | sub_tree = proto_item_add_subtree(sub_item, ett_dlm3_next_cmd); |
1082 | 0 | dissect_dlm3_1(tvb, pinfo, sub_tree, data, o_nextcmd, h_version, length, offset); |
1083 | 0 | break; |
1084 | 0 | case DLM3_RCOM: |
1085 | 0 | tmp = DLM_OPTS_LEN + o_optlen + DLM_RCOM_LEN; |
1086 | 0 | if (length < tmp) |
1087 | 0 | return 0; |
1088 | | |
1089 | 0 | sub_tree = proto_item_add_subtree(sub_item, ett_dlm3_next_cmd); |
1090 | 0 | dissect_dlm3_1(tvb, pinfo, sub_tree, data, o_nextcmd, h_version, length, offset); |
1091 | 0 | break; |
1092 | 0 | default: |
1093 | 0 | return 0; |
1094 | 0 | } |
1095 | 0 | break; |
1096 | 0 | case DLM3_MSG: |
1097 | 0 | if (length < DLM_MSG_LEN) |
1098 | 0 | return 0; |
1099 | | |
1100 | 0 | dissect_dlm3_1(tvb, pinfo, sub_tree, data, h_cmd, h_version, length, offset); |
1101 | 0 | break; |
1102 | 0 | case DLM3_RCOM: |
1103 | 0 | if (length < DLM_RCOM_LEN) |
1104 | 0 | return 0; |
1105 | | |
1106 | 0 | dissect_dlm3_1(tvb, pinfo, sub_tree, data, h_cmd, h_version, length, offset); |
1107 | 0 | break; |
1108 | 0 | default: |
1109 | 0 | break; |
1110 | 0 | } |
1111 | | |
1112 | 0 | return tvb_captured_length(tvb); |
1113 | 0 | } |
1114 | | |
1115 | | static int |
1116 | | dissect_dlm3(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void *data _U_) |
1117 | 6 | { |
1118 | 6 | proto_item *item; |
1119 | 6 | proto_tree *tree; |
1120 | 6 | unsigned length; |
1121 | 6 | uint32_t h_version; |
1122 | 6 | uint8_t h_cmd; |
1123 | 6 | int ret = 0; |
1124 | | |
1125 | | |
1126 | | /* Check that there's enough data */ |
1127 | 6 | length = tvb_captured_length(tvb); |
1128 | 6 | if (length < DLM_HEADER_LEN) |
1129 | 1 | return 0; |
1130 | | |
1131 | | /* Check the protocol version */ |
1132 | 5 | h_version = tvb_get_letohl(tvb, 0); |
1133 | 5 | if ((h_version & 0xffff0000) != DLM3_MAJOR_VERSION || |
1134 | 0 | (h_version & 0xffff) > DLM3_MINOR_VERSION_MAX) |
1135 | 5 | return 0; |
1136 | | |
1137 | 0 | col_set_str(pinfo->cinfo, COL_PROTOCOL, "DLM3"); |
1138 | | |
1139 | |
|
1140 | 0 | col_set_str(pinfo->cinfo, COL_INFO, "DLM3"); |
1141 | |
|
1142 | 0 | h_cmd = tvb_get_uint8(tvb, DLM_HEADER_LEN - 1 - 1); |
1143 | 0 | col_set_str(pinfo->cinfo, COL_INFO, |
1144 | 0 | val_to_str_const(h_cmd, |
1145 | 0 | dlm3_cmd, |
1146 | 0 | "packet-dlm3.c internal bug")); |
1147 | |
|
1148 | 0 | item = proto_tree_add_item(parent_tree, proto_dlm3, tvb, 0, |
1149 | 0 | -1, ENC_NA); |
1150 | 0 | tree = proto_item_add_subtree(item, ett_dlm3); |
1151 | |
|
1152 | 0 | switch (h_version) { |
1153 | 0 | case DLM_VERSION_3_1: |
1154 | 0 | ret = dissect_dlm3_1(tvb, pinfo, tree, data, h_cmd, h_version, length, 0); |
1155 | 0 | break; |
1156 | 0 | case DLM_VERSION_3_2: |
1157 | 0 | ret = dissect_dlm3_2(tvb, pinfo, tree, data, h_cmd, h_version, length); |
1158 | 0 | break; |
1159 | 0 | default: |
1160 | 0 | break; |
1161 | 0 | } |
1162 | | |
1163 | 0 | return ret; |
1164 | 0 | } |
1165 | | |
1166 | | /* This method dissects fully reassembled messages */ |
1167 | | static int |
1168 | | dissect_dlm3_message(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) |
1169 | 6 | { |
1170 | 6 | dissect_dlm3(tvb, pinfo, tree, data); |
1171 | 6 | return tvb_captured_length(tvb); |
1172 | 6 | } |
1173 | | |
1174 | | /* determine PDU length of protocol foo */ |
1175 | | static unsigned |
1176 | | get_dlm3_message_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset, void *data _U_) |
1177 | 6 | { |
1178 | 6 | return tvb_get_letohs(tvb, offset + DLM_HEADER_LEN - 2 - 1 - 1); |
1179 | 6 | } |
1180 | | |
1181 | | static int |
1182 | | dissect_tcp_dlm3(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) |
1183 | 3 | { |
1184 | 3 | tcp_dissect_pdus(tvb, pinfo, tree, true, DLM_HEADER_LEN - 1 - 1, |
1185 | 3 | get_dlm3_message_len, dissect_dlm3_message, data); |
1186 | 3 | return tvb_captured_length(tvb); |
1187 | 3 | } |
1188 | | |
1189 | | /* Register the protocol with Wireshark */ |
1190 | | |
1191 | | void |
1192 | | proto_register_dlm3(void) |
1193 | 16 | { |
1194 | | |
1195 | 16 | static hf_register_info hf[] = { |
1196 | | /* dlm_header */ |
1197 | 16 | { &hf_dlm3_h_version, |
1198 | 16 | { "Version", "dlm3.h.version", |
1199 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, |
1200 | 16 | NULL, HFILL }}, |
1201 | 16 | { &hf_dlm3_h_major_version, |
1202 | 16 | { "Major Version", "dlm3.h.major_version", |
1203 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, |
1204 | 16 | NULL, HFILL }}, |
1205 | 16 | { &hf_dlm3_h_minor_version, |
1206 | 16 | { "Minor Version", "dlm3.h.minor_version", |
1207 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, |
1208 | 16 | NULL, HFILL }}, |
1209 | 16 | { &hf_dlm3_h_lockspace, |
1210 | 16 | { "Lockspace Global ID", "dlm3.h.lockspac", |
1211 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, |
1212 | 16 | NULL, HFILL }}, |
1213 | 16 | { &hf_dlm3_h_seq, |
1214 | 16 | { "Sequence Number", "dlm3.h.seq", |
1215 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, |
1216 | 16 | NULL, HFILL }}, |
1217 | 16 | { &hf_dlm3_h_nodeid, |
1218 | 16 | { "Sender Node ID", "dlm3.h.nodeid", |
1219 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, |
1220 | 16 | NULL, HFILL }}, |
1221 | 16 | { &hf_dlm3_h_length, |
1222 | 16 | { "Length", "dlm3.h.length", |
1223 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, |
1224 | 16 | NULL, HFILL }}, |
1225 | 16 | { &hf_dlm3_h_cmd, |
1226 | 16 | { "Command", "dlm3.h.cmd", |
1227 | 16 | FT_UINT8, BASE_DEC, VALS(dlm3_cmd), 0x0, |
1228 | 16 | NULL, HFILL }}, |
1229 | 16 | { &hf_dlm3_h_pad, |
1230 | 16 | { "Padding", "dlm3.h.pad", |
1231 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1232 | 16 | NULL, HFILL }}, |
1233 | | |
1234 | | /* dlm_opts */ |
1235 | 16 | { &hf_dlm3_o_nextcmd, |
1236 | 16 | { "Next Command", "dlm3.o.nextcmd", |
1237 | 16 | FT_UINT8, BASE_DEC, VALS(dlm3_cmd), 0x0, |
1238 | 16 | NULL, HFILL }}, |
1239 | 16 | { &hf_dlm3_o_pad, |
1240 | 16 | { "Padding", "dlm3.o.pad", |
1241 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, |
1242 | 16 | NULL, HFILL }}, |
1243 | 16 | { &hf_dlm3_o_optlen, |
1244 | 16 | { "Options Length", "dlm3.o.optlen", |
1245 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, |
1246 | 16 | NULL, HFILL }}, |
1247 | 16 | { &hf_dlm3_o_pad2, |
1248 | 16 | { "Padding", "dlm3.o.pad2", |
1249 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, |
1250 | 16 | NULL, HFILL }}, |
1251 | 16 | { &hf_dlm3_o_opts, |
1252 | 16 | { "Options", "dlm3.o.opts", |
1253 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1254 | 16 | NULL, HFILL }}, |
1255 | | |
1256 | | /* dlm_opt_header */ |
1257 | 16 | { &hf_dlm3_t_type, |
1258 | 16 | { "Type", "dlm3.t.type", |
1259 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, |
1260 | 16 | NULL, HFILL }}, |
1261 | 16 | { &hf_dlm3_t_length, |
1262 | 16 | { "Length", "dlm3.t.length", |
1263 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, |
1264 | 16 | NULL, HFILL }}, |
1265 | 16 | { &hf_dlm3_t_pad, |
1266 | 16 | { "Padding", "dlm3.t.pad", |
1267 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, |
1268 | 16 | NULL, HFILL }}, |
1269 | 16 | { &hf_dlm3_t_value, |
1270 | 16 | { "Value", "dlm3.t.value", |
1271 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1272 | 16 | NULL, HFILL }}, |
1273 | | |
1274 | | /* dlm_message */ |
1275 | 16 | { &hf_dlm3_m_type, |
1276 | 16 | { "Message Type", "dlm3.m.type", |
1277 | 16 | FT_UINT32, BASE_DEC, VALS(dlm3_msg), 0x0, |
1278 | 16 | NULL, HFILL }}, |
1279 | 16 | { &hf_dlm3_m_nodeid, |
1280 | 16 | { "Receiver Node ID", "dlm3.m.nodeid", |
1281 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, |
1282 | 16 | NULL, HFILL }}, |
1283 | 16 | { &hf_dlm3_m_pid, |
1284 | 16 | { "Process ID of Lock Owner", "dlm3.m.pid", |
1285 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, |
1286 | 16 | NULL, HFILL }}, |
1287 | 16 | { &hf_dlm3_m_lkid, |
1288 | 16 | { "Lock ID on Sender", "dlm3.m.lkid", |
1289 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, |
1290 | 16 | NULL, HFILL}}, |
1291 | 16 | { &hf_dlm3_m_remid, |
1292 | 16 | { "Lock ID on Receiver", "dlm3.m.remid", |
1293 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, |
1294 | 16 | NULL, HFILL}}, |
1295 | 16 | { &hf_dlm3_m_parent_lkid, |
1296 | 16 | { "Parent Lock ID on Sender", "dlm3.m.parent_lkid", |
1297 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, |
1298 | 16 | NULL, HFILL}}, |
1299 | 16 | { &hf_dlm3_m_parent_remid, |
1300 | 16 | { "Parent Lock ID on Receiver", "dlm3.m.parent_remid", |
1301 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, |
1302 | 16 | NULL, HFILL}}, |
1303 | | /* dlm_message::exflags */ |
1304 | 16 | { &hf_dlm3_m_exflags, |
1305 | 16 | { "External Flags", "dlm3.m.exflags", |
1306 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, |
1307 | 16 | NULL, HFILL}}, |
1308 | 16 | { &hf_dlm3_m_exflags_noqueue, |
1309 | 16 | { "Don't queue", "dlm3.m.exflags.noqueue", |
1310 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUE, |
1311 | 16 | NULL, HFILL}}, |
1312 | 16 | { &hf_dlm3_m_exflags_cancel, |
1313 | 16 | { "Cancel", "dlm3.m.exflags.cancel", |
1314 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_CANCEL, |
1315 | 16 | NULL, HFILL}}, |
1316 | 16 | { &hf_dlm3_m_exflags_convert, |
1317 | 16 | { "Convert", "dlm3.m.exflags.convert", |
1318 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVERT, |
1319 | 16 | NULL, HFILL}}, |
1320 | 16 | { &hf_dlm3_m_exflags_valblk, |
1321 | 16 | { "Return the contents of the lock value block", "dlm3.m.exflags.valblk", |
1322 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_VALBLK, |
1323 | 16 | NULL, HFILL}}, |
1324 | 16 | { &hf_dlm3_m_exflags_quecvt, |
1325 | 16 | { "Force a conversion request to be queued", "dlm3.m.exflags.quecvt", |
1326 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_QUECVT, |
1327 | 16 | NULL, HFILL}}, |
1328 | 16 | { &hf_dlm3_m_exflags_ivvalblk, |
1329 | 16 | { "Invalidate the lock value block", "dlm3.m.exflags.ivvalblk", |
1330 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_IVVALBLK, |
1331 | 16 | NULL, HFILL}}, |
1332 | 16 | { &hf_dlm3_m_exflags_convdeadlk, |
1333 | 16 | { "Forced down to NL to resolve a conversion deadlock", "dlm3.m.exflags.convdeadlk", |
1334 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVDEADLK, |
1335 | 16 | NULL, HFILL}}, |
1336 | 16 | { &hf_dlm3_m_exflags_persistent, |
1337 | 16 | { "Persistent", "dlm3.m.exflags.persistent", |
1338 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_PERSISTENT, |
1339 | 16 | NULL, HFILL}}, |
1340 | 16 | { &hf_dlm3_m_exflags_nodlckwt, |
1341 | 16 | { "Don't cancel the lock if it gets into conversion deadlock", "dlm3.m.exflags.nodlckwt", |
1342 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKWT, |
1343 | 16 | NULL, HFILL}}, |
1344 | 16 | { &hf_dlm3_m_exflags_nodlckblk, |
1345 | 16 | { "Nodlckblk", "dlm3.m.exflags.nodlckblk", |
1346 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKBLK, |
1347 | 16 | NULL, HFILL}}, |
1348 | 16 | { &hf_dlm3_m_exflags_expedite, |
1349 | 16 | { "Grant a NL lock immediately", "dlm3.m.exflags.expedite", |
1350 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_EXPEDITE, |
1351 | 16 | NULL, HFILL}}, |
1352 | 16 | { &hf_dlm3_m_exflags_noqueuebast, |
1353 | 16 | { "Send blocking ASTs even for NOQUEUE operations", "dlm3.m.exflags.noqueuebast", |
1354 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUEBAST, |
1355 | 16 | NULL, HFILL}}, |
1356 | 16 | { &hf_dlm3_m_exflags_headque, |
1357 | 16 | { "Add a lock to the head of the queue", "dlm3.m.exflags.headque", |
1358 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_HEADQUE, |
1359 | 16 | NULL, HFILL}}, |
1360 | 16 | { &hf_dlm3_m_exflags_noorder, |
1361 | 16 | { "Disregard the standard grant order rules", "dlm3.m.exflags.noorder", |
1362 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_NOORDER, |
1363 | 16 | NULL, HFILL}}, |
1364 | 16 | { &hf_dlm3_m_exflags_orphan, |
1365 | 16 | { "Orphan", "dlm3.m.exflags.orphan", |
1366 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_ORPHAN, |
1367 | 16 | NULL, HFILL}}, |
1368 | 16 | { &hf_dlm3_m_exflags_altpr, |
1369 | 16 | { "Try to grant the lock in `protected read' mode", "dlm3.m.exflags.altpr", |
1370 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTPR, |
1371 | 16 | NULL, HFILL}}, |
1372 | 16 | { &hf_dlm3_m_exflags_altcw, |
1373 | 16 | { "Try to grant the lock in `concurrent read' mode", "dlm3.m.exflags.altcw", |
1374 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTCW, |
1375 | 16 | NULL, HFILL}}, |
1376 | 16 | { &hf_dlm3_m_exflags_forceunlock, |
1377 | 16 | { "Force unlock", "dlm3.m.exflags.forceunlock", |
1378 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_FORCEUNLOCK, |
1379 | 16 | NULL, HFILL}}, |
1380 | 16 | { &hf_dlm3_m_exflags_timeout, |
1381 | 16 | { "Timeout", "dlm3.m.exflags.timeout", |
1382 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_TIMEOUT, |
1383 | 16 | NULL, HFILL}}, |
1384 | | /* dlm_message::sbflags */ |
1385 | 16 | { &hf_dlm3_m_sbflags, |
1386 | 16 | { "Status Block Flags", "dlm3.m.sbflags", |
1387 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, |
1388 | 16 | NULL, HFILL}}, |
1389 | 16 | { &hf_dlm3_m_sbflags_demoted, |
1390 | 16 | { "Demoted for deadlock resolution", "dlm3.m.sbflags.demoted", |
1391 | 16 | FT_BOOLEAN, 32, NULL, DLM3_SBF_DEMOTED, |
1392 | 16 | NULL, HFILL}}, |
1393 | 16 | { &hf_dlm3_m_sbflags_valnotvalid, |
1394 | 16 | { "Lock Value Block Is Invalid", "dlm3.m.sbflags.valnotvalid", |
1395 | 16 | FT_BOOLEAN, 32, NULL, DLM3_SBF_VALNOTVALID, |
1396 | 16 | NULL, HFILL}}, |
1397 | 16 | { &hf_dlm3_m_sbflags_altmode, |
1398 | 16 | { "Try to Grant in Alternative Mode", "dlm3.m.sbflags.altmode", |
1399 | 16 | FT_BOOLEAN, 32, NULL, DLM3_SBF_ALTMODE, |
1400 | 16 | NULL, HFILL}}, |
1401 | | |
1402 | | /* dlm_message::flags */ |
1403 | 16 | { &hf_dlm3_m_flags, |
1404 | 16 | { "Internal Flags", "dlm3.m.flags", |
1405 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, |
1406 | 16 | NULL, HFILL}}, |
1407 | 16 | { &hf_dlm3_m_flags_user, |
1408 | 16 | { "User space lock related", "dlm3.m.flags.user", |
1409 | 16 | FT_BOOLEAN, 32, NULL, DLM3_IFL_USER, |
1410 | 16 | NULL, HFILL}}, |
1411 | 16 | { &hf_dlm3_m_flags_orphan, |
1412 | 16 | { "Orphaned lock", "dlm3.m.flags.orphan", |
1413 | 16 | FT_BOOLEAN, 32, NULL, DLM3_IFL_ORPHAN, |
1414 | 16 | NULL, HFILL}}, |
1415 | | |
1416 | 16 | { &hf_dlm3_m_lvbseq, |
1417 | 16 | { "Lock Value Block Sequence Number", "dlm3.m.lvbseq", |
1418 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, |
1419 | 16 | NULL, HFILL}}, |
1420 | | |
1421 | 16 | { &hf_dlm3_m_hash, |
1422 | 16 | { "Hash value", "dlm3.m.hash", |
1423 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, |
1424 | 16 | NULL, HFILL}}, |
1425 | | |
1426 | 16 | { &hf_dlm3_m_status, |
1427 | 16 | { "Status", "dlm3.m.status", |
1428 | 16 | FT_INT32, BASE_DEC, VALS(dlm3_status), 0x0, |
1429 | 16 | NULL, HFILL}}, |
1430 | | |
1431 | 16 | { &hf_dlm3_m_grmode, |
1432 | 16 | { "Granted Mode", "dlm3.m.grmode", |
1433 | 16 | FT_INT32, BASE_DEC, VALS(dlm3_mode), 0x0, |
1434 | 16 | NULL, HFILL}}, |
1435 | 16 | { &hf_dlm3_m_rqmode, |
1436 | 16 | { "Request Mode", "dlm3.m.rqmode", |
1437 | 16 | FT_INT32, BASE_DEC, VALS(dlm3_mode), 0x0, |
1438 | 16 | NULL, HFILL}}, |
1439 | 16 | { &hf_dlm3_m_bastmode, |
1440 | 16 | { "Mode requested by another node", "dlm3.m.bastmode", |
1441 | 16 | FT_INT32, BASE_DEC, VALS(dlm3_mode), 0x0, |
1442 | 16 | NULL, HFILL}}, |
1443 | | |
1444 | | /* dlm_message::asts */ |
1445 | 16 | { &hf_dlm3_m_asts, |
1446 | 16 | { "Asynchronous Traps", "dlm3.m.asts", |
1447 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, |
1448 | 16 | NULL, HFILL}}, |
1449 | 16 | { &hf_dlm3_m_asts_comp, |
1450 | 16 | { "Completion", "dlm3.m.asts.comp", |
1451 | 16 | FT_BOOLEAN, 32, NULL, DLM3_AST_COMP, |
1452 | 16 | NULL, HFILL }}, |
1453 | 16 | { &hf_dlm3_m_asts_bast, |
1454 | 16 | { "Blocking", "dlm3.m.asts.bast", |
1455 | 16 | FT_BOOLEAN, 32, NULL, DLM3_AST_BAST, |
1456 | 16 | NULL, HFILL }}, |
1457 | | |
1458 | 16 | { &hf_dlm3_m_result, |
1459 | 16 | { "Message Result(errno)", "dlm3.m.result", |
1460 | 16 | FT_INT32, BASE_DEC, VALS(dlm3_result), 0x0, |
1461 | 16 | NULL, HFILL}}, |
1462 | 16 | { &hf_dlm3_m_extra, |
1463 | 16 | { "Extra Message", "dlm3.m.extra", |
1464 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1465 | 16 | NULL, HFILL}}, |
1466 | | |
1467 | | /* dlm_rcom */ |
1468 | 16 | { &hf_dlm3_rc_type, |
1469 | 16 | { "Recovery Command Type", "dlm3.rc.type", |
1470 | 16 | FT_UINT32, BASE_DEC, VALS(dlm3_rcom), 0x0, |
1471 | 16 | NULL, HFILL}}, |
1472 | 16 | { &hf_dlm3_rc_result, |
1473 | 16 | { "Recovery Command Result", "dlm3.rc.result", |
1474 | 16 | FT_INT32, BASE_DEC, NULL, 0x0, |
1475 | 16 | NULL, HFILL}}, |
1476 | 16 | { &hf_dlm3_rc_id, |
1477 | 16 | { "Recovery Command ID", "dlm3.rc.id", |
1478 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, |
1479 | 16 | NULL, HFILL}}, |
1480 | 16 | { &hf_dlm3_rc_seq, |
1481 | 16 | { "Recovery Command Sequence Number of Sender", "dlm3.rc.seq", |
1482 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, |
1483 | 16 | NULL, HFILL}}, |
1484 | 16 | { &hf_dlm3_rc_seq_reply, |
1485 | 16 | { "Recovery Command Sequence Number of Receiver", "dlm3.rc.seq_reply", |
1486 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, |
1487 | 16 | NULL, HFILL}}, |
1488 | 16 | { &hf_dlm3_rc_buf, |
1489 | 16 | { "Recovery Buffer", "dlm3.rc.buf", |
1490 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1491 | 16 | NULL, HFILL}}, |
1492 | | |
1493 | | /* rcom_config */ |
1494 | 16 | { &hf_dlm3_rf_lvblen, |
1495 | 16 | { "Lock Value Block Length", "dlm3.rf.lvblen", |
1496 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, |
1497 | 16 | NULL, HFILL}}, |
1498 | | |
1499 | | /* rcom_config::rf_lsflags */ |
1500 | 16 | { &hf_dlm3_rf_lsflags, |
1501 | 16 | { "External Flags", "dlm3.rf.lsflags", |
1502 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, |
1503 | 16 | NULL, HFILL}}, |
1504 | 16 | { &hf_dlm3_rf_lsflags_noqueue, |
1505 | 16 | { "Don't queue", "dlm3.rf.lsflags.noqueue", |
1506 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUE, |
1507 | 16 | NULL, HFILL}}, |
1508 | 16 | { &hf_dlm3_rf_lsflags_cancel, |
1509 | 16 | { "Cancel", "dlm3.rf.lsflags.cancel", |
1510 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_CANCEL, |
1511 | 16 | NULL, HFILL}}, |
1512 | 16 | { &hf_dlm3_rf_lsflags_convert, |
1513 | 16 | { "Convert", "dlm3.rf.lsflags.convert", |
1514 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVERT, |
1515 | 16 | NULL, HFILL}}, |
1516 | 16 | { &hf_dlm3_rf_lsflags_valblk, |
1517 | 16 | { "Return the contents of the lock value block", "dlm3.rf.lsflags.valblk", |
1518 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_VALBLK, |
1519 | 16 | NULL, HFILL}}, |
1520 | 16 | { &hf_dlm3_rf_lsflags_quecvt, |
1521 | 16 | { "Force a conversion request to be queued", "dlm3.rf.lsflags.quecvt", |
1522 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_QUECVT, |
1523 | 16 | NULL, HFILL}}, |
1524 | 16 | { &hf_dlm3_rf_lsflags_ivvalblk, |
1525 | 16 | { "Invalidate the lock value block", "dlm3.rf.lsflags.ivvalblk", |
1526 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_IVVALBLK, |
1527 | 16 | NULL, HFILL}}, |
1528 | 16 | { &hf_dlm3_rf_lsflags_convdeadlk, |
1529 | 16 | { "Forced down to NL to resolve a conversion deadlock", "dlm3.rf.lsflags.convdeadlk", |
1530 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVDEADLK, |
1531 | 16 | NULL, HFILL}}, |
1532 | 16 | { &hf_dlm3_rf_lsflags_persistent, |
1533 | 16 | { "Persistent", "dlm3.rf.lsflags.persistent", |
1534 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_PERSISTENT, |
1535 | 16 | NULL, HFILL}}, |
1536 | 16 | { &hf_dlm3_rf_lsflags_nodlckwt, |
1537 | 16 | { "Don't cancel the lock if it gets into conversion deadlock", "dlm3.rf.lsflags.nodlckwt", |
1538 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKWT, |
1539 | 16 | NULL, HFILL}}, |
1540 | 16 | { &hf_dlm3_rf_lsflags_nodlckblk, |
1541 | 16 | { "Nodlckblk", "dlm3.rf.lsflags.nodlckblk", |
1542 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKBLK, |
1543 | 16 | NULL, HFILL}}, |
1544 | 16 | { &hf_dlm3_rf_lsflags_expedite, |
1545 | 16 | { "Grant a NL lock immediately", "dlm3.rf.lsflags.expedite", |
1546 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_EXPEDITE, |
1547 | 16 | NULL, HFILL}}, |
1548 | 16 | { &hf_dlm3_rf_lsflags_noqueuebast, |
1549 | 16 | { "Send blocking ASTs even for NOQUEUE operations", "dlm3.rf.lsflags.noqueuebast", |
1550 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUEBAST, |
1551 | 16 | NULL, HFILL}}, |
1552 | 16 | { &hf_dlm3_rf_lsflags_headque, |
1553 | 16 | { "Add a lock to the head of the queue", "dlm3.rf.lsflags.headque", |
1554 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_HEADQUE, |
1555 | 16 | NULL, HFILL}}, |
1556 | 16 | { &hf_dlm3_rf_lsflags_noorder, |
1557 | 16 | { "Disregard the standard grant order rules", "dlm3.rf.lsflags.noorder", |
1558 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_NOORDER, |
1559 | 16 | NULL, HFILL}}, |
1560 | 16 | { &hf_dlm3_rf_lsflags_orphan, |
1561 | 16 | { "Orphan", "dlm3.rf.lsflags.orphan", |
1562 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_ORPHAN, |
1563 | 16 | NULL, HFILL}}, |
1564 | 16 | { &hf_dlm3_rf_lsflags_altpr, |
1565 | 16 | { "Try to grant the lock in `protected read' mode", "dlm3.rf.lsflags.altpr", |
1566 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTPR, |
1567 | 16 | NULL, HFILL}}, |
1568 | 16 | { &hf_dlm3_rf_lsflags_altcw, |
1569 | 16 | { "Try to grant the lock in `concurrent read' mode", "dlm3.rf.lsflags.altcw", |
1570 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTCW, |
1571 | 16 | NULL, HFILL}}, |
1572 | 16 | { &hf_dlm3_rf_lsflags_forceunlock, |
1573 | 16 | { "Force unlock", "dlm3.rf.lsflags.forceunlock", |
1574 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_FORCEUNLOCK, |
1575 | 16 | NULL, HFILL}}, |
1576 | 16 | { &hf_dlm3_rf_lsflags_timeout, |
1577 | 16 | { "Timeout", "dlm3.rf.lsflags.timeout", |
1578 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_TIMEOUT, |
1579 | 16 | NULL, HFILL}}, |
1580 | | |
1581 | 16 | { &hf_dlm3_rf_unused, |
1582 | 16 | { "Unused area", "dlm3.rf.lsflags.unused", |
1583 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, |
1584 | 16 | NULL, HFILL}}, |
1585 | | |
1586 | | /* rcom_status */ |
1587 | 16 | { &hf_dlm3_rs_flags, |
1588 | 16 | { "Recovery Command Status Flags", "dlm3.rs.flags", |
1589 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, |
1590 | 16 | NULL, HFILL}}, |
1591 | 16 | { &hf_dlm3_rs_flags_need_slots, |
1592 | 16 | { "Need slots", "dlm3.rs.flags.need_slots", |
1593 | 16 | FT_UINT32, BASE_HEX, NULL, DLM_RSF_NEED_SLOTS, |
1594 | 16 | NULL, HFILL}}, |
1595 | 16 | { &hf_dlm3_rs_unused1, |
1596 | 16 | { "Unused area", "dlm3.rs.unused1", |
1597 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, |
1598 | 16 | NULL, HFILL}}, |
1599 | 16 | { &hf_dlm3_rs_unused2, |
1600 | 16 | { "Unused area", "dlm3.rs.unused2", |
1601 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, |
1602 | 16 | NULL, HFILL}}, |
1603 | | |
1604 | | /* rcom_lock */ |
1605 | 16 | { &hf_dlm3_rl_ownpid, |
1606 | 16 | { "Process ID of Lock Owner", "dlm3.rl.ownpid", |
1607 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, |
1608 | 16 | NULL, HFILL}}, |
1609 | 16 | { &hf_dlm3_rl_lkid, |
1610 | 16 | { "Lock ID on Sender", "dlm3.rl.lkid", |
1611 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, |
1612 | 16 | NULL, HFILL}}, |
1613 | 16 | { &hf_dlm3_rl_remid, |
1614 | 16 | { "Lock ID on Receiver", "dlm3.rl.remid", |
1615 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, |
1616 | 16 | NULL, HFILL}}, |
1617 | 16 | { &hf_dlm3_rl_parent_lkid, |
1618 | 16 | { "Parent Lock ID on Sender", "dlm3.rl.parent_lkid", |
1619 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, |
1620 | 16 | NULL, HFILL}}, |
1621 | 16 | { &hf_dlm3_rl_parent_remid, |
1622 | 16 | { "Parent Lock ID on Receiver", "dlm3.rl.parent_remid", |
1623 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, |
1624 | 16 | NULL, HFILL}}, |
1625 | | |
1626 | 16 | { &hf_dlm3_rl_exflags, |
1627 | 16 | { "External Flags", "dlm3.rl.exflags", |
1628 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, |
1629 | 16 | NULL, HFILL}}, |
1630 | 16 | { &hf_dlm3_rl_exflags_noqueue, |
1631 | 16 | { "Don't queue", "dlm3.rl.exflags.noqueue", |
1632 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUE, |
1633 | 16 | NULL, HFILL}}, |
1634 | 16 | { &hf_dlm3_rl_exflags_cancel, |
1635 | 16 | { "Cancel", "dlm3.rl.exflags.cancel", |
1636 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_CANCEL, |
1637 | 16 | NULL, HFILL}}, |
1638 | 16 | { &hf_dlm3_rl_exflags_convert, |
1639 | 16 | { "Convert", "dlm3.rl.exflags.convert", |
1640 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVERT, |
1641 | 16 | NULL, HFILL}}, |
1642 | 16 | { &hf_dlm3_rl_exflags_valblk, |
1643 | 16 | { "Return the contents of the lock value block", "dlm3.rl.exflags.valblk", |
1644 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_VALBLK, |
1645 | 16 | NULL, HFILL}}, |
1646 | 16 | { &hf_dlm3_rl_exflags_quecvt, |
1647 | 16 | { "Force a conversion request to be queued", "dlm3.rl.exflags.quecvt", |
1648 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_QUECVT, |
1649 | 16 | NULL, HFILL}}, |
1650 | 16 | { &hf_dlm3_rl_exflags_ivvalblk, |
1651 | 16 | { "Invalidate the lock value block", "dlm3.rl.exflags.ivvalblk", |
1652 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_IVVALBLK, |
1653 | 16 | NULL, HFILL}}, |
1654 | 16 | { &hf_dlm3_rl_exflags_convdeadlk, |
1655 | 16 | { "Forced down to NL to resolve a conversion deadlock", "dlm3.rl.exflags.convdeadlk", |
1656 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVDEADLK, |
1657 | 16 | NULL, HFILL}}, |
1658 | 16 | { &hf_dlm3_rl_exflags_persistent, |
1659 | 16 | { "Persistent", "dlm3.rl.exflags.persistent", |
1660 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_PERSISTENT, |
1661 | 16 | NULL, HFILL}}, |
1662 | 16 | { &hf_dlm3_rl_exflags_nodlckwt, |
1663 | 16 | { "Don't cancel the lock if it gets into conversion deadlock", "dlm3.rl.exflags.nodlckwt", |
1664 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKWT, |
1665 | 16 | NULL, HFILL}}, |
1666 | 16 | { &hf_dlm3_rl_exflags_nodlckblk, |
1667 | 16 | { "Nodlckblk", "dlm3.rl.exflags.nodlckblk", |
1668 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKBLK, |
1669 | 16 | NULL, HFILL}}, |
1670 | 16 | { &hf_dlm3_rl_exflags_expedite, |
1671 | 16 | { "Grant a NL lock immediately", "dlm3.rl.exflags.expedite", |
1672 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_EXPEDITE, |
1673 | 16 | NULL, HFILL}}, |
1674 | 16 | { &hf_dlm3_rl_exflags_noqueuebast, |
1675 | 16 | { "Send blocking ASTs even for NOQUEUE operations", "dlm3.rl.exflags.noqueuebast", |
1676 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUEBAST, |
1677 | 16 | NULL, HFILL}}, |
1678 | 16 | { &hf_dlm3_rl_exflags_headque, |
1679 | 16 | { "Add a lock to the head of the queue", "dlm3.rl.exflags.headque", |
1680 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_HEADQUE, |
1681 | 16 | NULL, HFILL}}, |
1682 | 16 | { &hf_dlm3_rl_exflags_noorder, |
1683 | 16 | { "Disregard the standard grant order rules", "dlm3.rl.exflags.noorder", |
1684 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_NOORDER, |
1685 | 16 | NULL, HFILL}}, |
1686 | 16 | { &hf_dlm3_rl_exflags_orphan, |
1687 | 16 | { "Orphan", "dlm3.rl.exflags.orphan", |
1688 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_ORPHAN, |
1689 | 16 | NULL, HFILL}}, |
1690 | 16 | { &hf_dlm3_rl_exflags_altpr, |
1691 | 16 | { "Try to grant the lock in `protected read' mode", "dlm3.rl.exflags.altpr", |
1692 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTPR, |
1693 | 16 | NULL, HFILL}}, |
1694 | 16 | { &hf_dlm3_rl_exflags_altcw, |
1695 | 16 | { "Try to grant the lock in `concurrent read' mode", "dlm3.rl.exflags.altcw", |
1696 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTCW, |
1697 | 16 | NULL, HFILL}}, |
1698 | 16 | { &hf_dlm3_rl_exflags_forceunlock, |
1699 | 16 | { "Force unlock", "dlm3.rl.exflags.forceunlock", |
1700 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_FORCEUNLOCK, |
1701 | 16 | NULL, HFILL}}, |
1702 | 16 | { &hf_dlm3_rl_exflags_timeout, |
1703 | 16 | { "Timeout", "dlm3.rl.exflags.timeout", |
1704 | 16 | FT_BOOLEAN, 32, NULL, DLM3_LKF_TIMEOUT, |
1705 | 16 | NULL, HFILL}}, |
1706 | 16 | { &hf_dlm3_rl_flags, |
1707 | 16 | { "Internal Flags", "dlm3.rl.flags", |
1708 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, |
1709 | 16 | NULL, HFILL}}, |
1710 | 16 | { &hf_dlm3_rl_flags_user, |
1711 | 16 | { "User space lock related", "dlm3.rl.flags.user", |
1712 | 16 | FT_BOOLEAN, 32, NULL, DLM3_IFL_USER, |
1713 | 16 | NULL, HFILL}}, |
1714 | 16 | { &hf_dlm3_rl_flags_orphan, |
1715 | 16 | { "Orphaned lock", "dlm3.rl.flags.orphan", |
1716 | 16 | FT_BOOLEAN, 32, NULL, DLM3_IFL_ORPHAN, |
1717 | 16 | NULL, HFILL}}, |
1718 | | |
1719 | 16 | { &hf_dlm3_rl_lvbseq, |
1720 | 16 | { "Lock Value Block Sequence Number", "dlm3.rl.lvbseq", |
1721 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, |
1722 | 16 | NULL, HFILL}}, |
1723 | 16 | { &hf_dlm3_rl_result, |
1724 | 16 | { "Result of Recovering master copy", "dlm3.rl.result", |
1725 | 16 | FT_INT32, BASE_DEC, VALS(dlm3_result), 0x0, |
1726 | 16 | NULL, HFILL}}, |
1727 | 16 | { &hf_dlm3_rl_rqmode, |
1728 | 16 | { "Request Mode", "dlm3.rl.rqmode", |
1729 | 16 | FT_INT8, BASE_DEC, VALS(dlm3_mode), 0x0, |
1730 | 16 | NULL, HFILL}}, |
1731 | 16 | { &hf_dlm3_rl_grmode, |
1732 | 16 | { "Granted Mode", "dlm3.rl.grmode", |
1733 | 16 | FT_INT8, BASE_DEC, VALS(dlm3_mode), 0x0, |
1734 | 16 | NULL, HFILL}}, |
1735 | 16 | { &hf_dlm3_rl_status, |
1736 | 16 | { "Status", "dlm3.rl.status", |
1737 | 16 | FT_INT8, BASE_DEC, VALS(dlm3_rs), 0x0, |
1738 | 16 | NULL, HFILL}}, |
1739 | 16 | { &hf_dlm3_rl_asts, |
1740 | 16 | { "Asynchronous Traps", "dlm3.rl.asts", |
1741 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, |
1742 | 16 | NULL, HFILL}}, |
1743 | 16 | { &hf_dlm3_rl_asts_comp, |
1744 | 16 | { "Completion", "dlm3.rl.asts.comp", |
1745 | 16 | FT_BOOLEAN, 8, NULL, DLM3_AST_COMP, |
1746 | 16 | NULL, HFILL }}, |
1747 | 16 | { &hf_dlm3_rl_asts_bast, |
1748 | 16 | { "Blocking", "dlm3.rl.asts.bast", |
1749 | 16 | FT_BOOLEAN, 8, NULL, DLM3_AST_BAST, |
1750 | 16 | NULL, HFILL }}, |
1751 | | |
1752 | 16 | { &hf_dlm3_rl_wait_type, |
1753 | 16 | { "Message Type the waiter is waiting for", "dlm3.rl.wait_type", |
1754 | 16 | FT_UINT16, BASE_DEC, VALS(dlm3_msg), 0x0, |
1755 | 16 | NULL, HFILL }}, |
1756 | | |
1757 | 16 | { &hf_dlm3_rl_namelen, |
1758 | 16 | { "Length of `name' field", "dlm3.rl.namelen", |
1759 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, |
1760 | 16 | NULL, HFILL }}, |
1761 | 16 | { &hf_dlm3_rl_name, |
1762 | 16 | { "Name of Resource", "dlm3.rl.name", |
1763 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1764 | 16 | NULL, HFILL }}, |
1765 | 16 | { &hf_dlm3_rl_name_contents, |
1766 | 16 | { "Contents actually occupying `name' field", "dlm3.rl.name_contents", |
1767 | 16 | FT_STRING, BASE_NONE, NULL, 0x0, |
1768 | 16 | NULL, HFILL }}, |
1769 | 16 | { &hf_dlm3_rl_name_padding, |
1770 | 16 | { "Padding", "dlm3.rl.name_padding", |
1771 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1772 | 16 | NULL, HFILL }}, |
1773 | 16 | { &hf_dlm3_rl_lvb, |
1774 | 16 | { "Lock Value Block", "dlm3.rl.lvb", |
1775 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, |
1776 | 16 | NULL, HFILL }} |
1777 | 16 | }; |
1778 | | |
1779 | 16 | static int *ett[] = { |
1780 | 16 | &ett_dlm3, |
1781 | 16 | &ett_dlm3_version, |
1782 | | |
1783 | 16 | &ett_dlm3_opts, |
1784 | 16 | &ett_dlm3_options, |
1785 | 16 | &ett_dlm3_next_cmd, |
1786 | | |
1787 | 16 | &ett_dlm3_msg, |
1788 | 16 | &ett_dlm3_m_exflags, |
1789 | 16 | &ett_dlm3_sbflags, |
1790 | 16 | &ett_dlm3_m_flags, |
1791 | 16 | &ett_dlm3_m_asts, |
1792 | | |
1793 | 16 | &ett_dlm3_rcom, |
1794 | 16 | &ett_dlm3_rcom_status, |
1795 | 16 | &ett_dlm3_rcom_lock, |
1796 | 16 | &ett_dlm3_rcom_config, |
1797 | | |
1798 | 16 | &ett_dlm3_rs_flags, |
1799 | | |
1800 | 16 | &ett_dlm3_rf_lsflags, |
1801 | 16 | &ett_dlm3_rl_exflags, |
1802 | 16 | &ett_dlm3_rl_flags, |
1803 | 16 | &ett_dlm3_rl_asts, |
1804 | 16 | &ett_dlm3_rl_name |
1805 | 16 | }; |
1806 | | |
1807 | 16 | proto_dlm3 = proto_register_protocol("Distributed Lock Manager", |
1808 | 16 | "DLM3", "dlm3"); |
1809 | 16 | proto_register_field_array(proto_dlm3, hf, array_length(hf)); |
1810 | 16 | proto_register_subtree_array(ett, array_length(ett)); |
1811 | | |
1812 | | /* dlm3_module = prefs_register_protocol(proto_dlm3, NULL); */ |
1813 | | |
1814 | 16 | dlm3_sctp_handle = register_dissector("dlm3", dissect_dlm3, proto_dlm3); |
1815 | 16 | dlm3_tcp_handle = register_dissector("dlm3.tcp", dissect_tcp_dlm3, proto_dlm3); |
1816 | | |
1817 | 16 | } |
1818 | | |
1819 | | |
1820 | | void |
1821 | | proto_reg_handoff_dlm3(void) |
1822 | 16 | { |
1823 | 16 | dissector_add_uint_with_preference("tcp.port", TCP_PORT_DLM3, dlm3_tcp_handle); |
1824 | 16 | dissector_add_uint_with_preference("sctp.port", SCTP_PORT_DLM3, dlm3_sctp_handle); |
1825 | 16 | } |
1826 | | |
1827 | | /* packet-dlm3.c ends here. */ |
1828 | | |
1829 | | /* |
1830 | | * Editor modelines - https://www.wireshark.org/tools/modelines.html |
1831 | | * |
1832 | | * Local Variables: |
1833 | | * c-basic-offset: 2 |
1834 | | * tab-width: 8 |
1835 | | * indent-tabs-mode: nil |
1836 | | * End: |
1837 | | * |
1838 | | * ex: set shiftwidth=2 tabstop=8 expandtab: |
1839 | | * :indentSize=2:tabSize=8:noTabs=true: |
1840 | | */ |