dcerpc-netlogon: maintain netlogon_auth_vars for NetrServerAuthenticateKerberos
[wireshark-sm.git] / epan / dissectors / packet-dlm3.c
blob221987bd404631ec23bc9fbaaf0b8ee2d29125b4
1 /* packet-dlm3.c
2 * Routines for dlm3 dissection
3 * Copyright 2007, Masatake YAMATO <jet@gyve.org>
5 * Wireshark - Network traffic analyzer
6 * By Gerald Combs <gerald@wireshark.org>
7 * Copyright 1998 Gerald Combs
9 * SPDX-License-Identifier: GPL-2.0-or-later
12 /* This dissector supports version 3.0 of the dlm(Distributed Lock Manager)
13 protocol
15 Actual implementation for the protocol is in linux kernel.
16 See files under linux/fs/dlm/ */
19 * #defines are mostly copied from
20 * *.[ch] files in linux/fs/dlm/ and linux/include/linux/dlm.h
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.
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 * -----------------------------------------------------------------------
34 #include "config.h"
36 #include <epan/packet.h>
37 #include <epan/prefs.h>
39 #include "packet-tcp.h"
41 #define TCP_PORT_DLM3 21064 /* Not IANA registered */
42 #define SCTP_PORT_DLM3 TCP_PORT_DLM3
44 #define DLM3_MAJOR_VERSION 0x00030000
45 #define DLM3_MINOR_VERSION_MAX 0x00000002
47 #define DLM_VERSION_3_1 0x00030001
48 #define DLM_VERSION_3_2 0x00030002
50 #define DLM3_MSG 1
51 #define DLM3_RCOM 2
52 #define DLM3_OPTS 3
53 #define DLM3_ACK 4
54 #define DLM3_FIN 5
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
71 #define DLM3_LKF_NOQUEUE 0x00000001
72 #define DLM3_LKF_CANCEL 0x00000002
73 #define DLM3_LKF_CONVERT 0x00000004
74 #define DLM3_LKF_VALBLK 0x00000008
75 #define DLM3_LKF_QUECVT 0x00000010
76 #define DLM3_LKF_IVVALBLK 0x00000020
77 #define DLM3_LKF_CONVDEADLK 0x00000040
78 #define DLM3_LKF_PERSISTENT 0x00000080
79 #define DLM3_LKF_NODLCKWT 0x00000100
80 #define DLM3_LKF_NODLCKBLK 0x00000200
81 #define DLM3_LKF_EXPEDITE 0x00000400
82 #define DLM3_LKF_NOQUEUEBAST 0x00000800
83 #define DLM3_LKF_HEADQUE 0x00001000
84 #define DLM3_LKF_NOORDER 0x00002000
85 #define DLM3_LKF_ORPHAN 0x00004000
86 #define DLM3_LKF_ALTPR 0x00008000
87 #define DLM3_LKF_ALTCW 0x00010000
88 #define DLM3_LKF_FORCEUNLOCK 0x00020000
89 #define DLM3_LKF_TIMEOUT 0x00040000
91 #define DLM3_SBF_DEMOTED 0x00000001
92 #define DLM3_SBF_VALNOTVALID 0x00000002
93 #define DLM3_SBF_ALTMODE 0x00000004
95 #define DLM3_IFL_USER 0x00000001
96 #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 */
109 #define DLM3_LKSTS_WAITING 1
110 #define DLM3_LKSTS_GRANTED 2
111 #define DLM3_LKSTS_CONVERT 3
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
121 #define DLM3_AST_COMP 1
122 #define DLM3_AST_BAST 2
125 /* see asm-generic/errno-base.h about LINUX_* */
126 #define LINUX_EAGAIN 11
127 #define LINUX_ENOMEM 12
128 #define LINUX_INVAL 22
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
138 #define DLM3_ECANCEL 0x10001
139 #define DLM3_EUNLOCK 0x10002
142 #define DLM3_RCOM_STATUS 1
143 #define DLM3_RCOM_NAMES 2
144 #define DLM3_RCOM_LOOKUP 3
145 #define DLM3_RCOM_LOCK 4
146 #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
151 #define DLM_RSF_NEED_SLOTS 0x00000001
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
162 #define DLM3_RESNAME_MAXLEN 64
164 #define DLM_HEADER_LEN (4 + 4 + 4 + 2 + 1 + 1)
165 #define DLM_RCOM_LEN (DLM_HEADER_LEN + 4 + 4 + 8 + 8 + 8)
166 #define DLM_MSG_LEN (DLM_HEADER_LEN + ((4 * 12) + (4 * 6)))
167 #define DLM_OPTS_LEN (DLM_HEADER_LEN + 1 + 1 + 2 + 4)
169 /* Forward declaration we need below */
170 void proto_register_dlm3(void);
171 void proto_reg_handoff_dlm3(void);
173 static dissector_handle_t dlm3_tcp_handle;
174 static dissector_handle_t dlm3_sctp_handle;
177 /* Initialize the protocol and registered fields */
178 static int proto_dlm3;
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;
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;
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;
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;
213 /* bit fields for dlm_message::exflags */
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;
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;
242 /* bit fields for dlm_message::flags */
244 static int hf_dlm3_m_flags;
245 static int hf_dlm3_m_flags_user;
246 static int hf_dlm3_m_flags_orphan;
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;
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;
260 static int hf_dlm3_m_result;
261 static int hf_dlm3_m_extra;
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;
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;
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;
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;
345 /* Initialize the subtree pointers */
346 static int ett_dlm3;
347 static int ett_dlm3_version;
349 static int ett_dlm3_opts;
350 static int ett_dlm3_options;
351 static int ett_dlm3_next_cmd;
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;
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;
364 static int ett_dlm3_rs_flags;
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;
374 * Value strings
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 }
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 }
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 }
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 }
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 }
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 }
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 }
463 * Fields
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
489 static int * const rs_flags_fields[] = {
490 &hf_dlm3_rs_flags_need_slots,
491 NULL
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
501 static int * const m_flags_fields[] = {
502 &hf_dlm3_m_flags_orphan,
503 &hf_dlm3_m_flags_user,
504 NULL
507 static int * const m_asts_fields[] = {
508 &hf_dlm3_m_asts_bast,
509 &hf_dlm3_m_asts_comp,
510 NULL
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
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
559 static int * const rl_flags_fields[] = {
560 &hf_dlm3_rl_flags_orphan,
561 &hf_dlm3_rl_flags_user,
562 NULL
565 static int * const rl_asts_fields[] = {
566 &hf_dlm3_rl_asts_bast,
567 &hf_dlm3_rl_asts_comp,
568 NULL
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)
576 uint32_t m_type;
578 m_type = tvb_get_letohl(tvb, offset);
579 proto_tree_add_uint(tree,
580 hf_dlm3_m_type, tvb, offset, 4, m_type);
581 col_append_fstr(pinfo->cinfo, COL_INFO,
582 ": %s",
583 val_to_str_const(m_type,
584 dlm3_msg,
585 "Unknown"));
587 offset += 4;
588 proto_tree_add_item(tree,
589 hf_dlm3_m_nodeid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
591 offset += 4;
592 proto_tree_add_item(tree,
593 hf_dlm3_m_pid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
595 offset += 4;
596 proto_tree_add_item(tree,
597 hf_dlm3_m_lkid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
598 /* TODO: See `create_lkb'
599 lkid has some structure. We dissect more. */
601 offset += 4;
602 proto_tree_add_item(tree,
603 hf_dlm3_m_remid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
605 offset += 4;
606 proto_tree_add_item(tree,
607 hf_dlm3_m_parent_lkid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
609 offset += 4;
610 proto_tree_add_item(tree,
611 hf_dlm3_m_parent_remid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
613 offset += 4;
614 proto_tree_add_bitmask(tree, tvb, offset,
615 hf_dlm3_m_exflags, ett_dlm3_m_exflags,
616 m_exflags_fields, ENC_LITTLE_ENDIAN);
618 offset += 4;
619 proto_tree_add_bitmask(tree, tvb, offset,
620 hf_dlm3_m_sbflags, ett_dlm3_sbflags,
621 m_sbflags_fields, ENC_LITTLE_ENDIAN);
623 offset += 4;
624 proto_tree_add_bitmask(tree, tvb, offset,
625 hf_dlm3_m_flags, ett_dlm3_m_flags,
626 m_flags_fields, ENC_LITTLE_ENDIAN);
628 offset += 4;
629 proto_tree_add_item(tree,
630 hf_dlm3_m_lvbseq, tvb, offset, 4, ENC_LITTLE_ENDIAN);
632 offset += 4;
633 proto_tree_add_item(tree,
634 hf_dlm3_m_hash, tvb, offset, 4, ENC_LITTLE_ENDIAN);
636 offset += 4;
637 proto_tree_add_item(tree,
638 hf_dlm3_m_status, tvb, offset, 4, ENC_LITTLE_ENDIAN);
640 offset += 4;
641 proto_tree_add_item(tree,
642 hf_dlm3_m_grmode, tvb, offset, 4, ENC_LITTLE_ENDIAN);
644 offset += 4;
645 proto_tree_add_item(tree,
646 hf_dlm3_m_rqmode, tvb, offset, 4, ENC_LITTLE_ENDIAN);
648 offset += 4;
649 proto_tree_add_item(tree,
650 hf_dlm3_m_bastmode, tvb, offset, 4, ENC_LITTLE_ENDIAN);
653 offset += 4;
654 proto_tree_add_bitmask(tree, tvb, offset,
655 hf_dlm3_m_asts, ett_dlm3_m_asts,
656 m_asts_fields, ENC_LITTLE_ENDIAN);
657 offset += 4;
658 proto_tree_add_item(tree,
659 hf_dlm3_m_result, tvb, offset, 4, ENC_LITTLE_ENDIAN);
661 offset += 4;
662 if ((length - offset) > 0) {
663 proto_tree_add_item(tree,
664 hf_dlm3_m_extra,
665 tvb,
666 offset,
668 ENC_NA);
673 static void
674 dissect_dlm3_rcom_status(tvbuff_t *tvb, proto_tree *tree,
675 unsigned length, int offset)
677 if ((length - offset) < ( 4 * 2 + 8 ))
678 return;
681 proto_tree_add_bitmask(tree, tvb, offset,
682 hf_dlm3_rs_flags, ett_dlm3_rs_flags,
683 rs_flags_fields, ENC_LITTLE_ENDIAN);
685 offset += 4;
686 proto_tree_add_item(tree,
687 hf_dlm3_rs_unused1, tvb, offset, 4, ENC_LITTLE_ENDIAN);
689 offset += 4;
690 proto_tree_add_item(tree,
691 hf_dlm3_rs_unused2, tvb, offset, 8, ENC_LITTLE_ENDIAN);
695 static void
696 dissect_dlm3_rcom_lock(tvbuff_t *tvb, proto_tree *tree,
697 unsigned length, int offset)
699 proto_item *sub_item;
700 proto_tree *sub_tree;
701 int sub_offset;
702 uint16_t namelen;
703 uint32_t exflags;
706 if ((length - offset) < ( 4 * 8 + 4 + 1 * 4 + 2 * 2
707 + DLM3_RESNAME_MAXLEN ))
708 return;
711 proto_tree_add_item(tree,
712 hf_dlm3_rl_ownpid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
714 offset += 4;
715 proto_tree_add_item(tree,
716 hf_dlm3_rl_lkid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
718 offset += 4;
719 proto_tree_add_item(tree,
720 hf_dlm3_rl_remid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
722 offset += 4;
723 proto_tree_add_item(tree,
724 hf_dlm3_rl_parent_lkid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
726 offset += 4;
727 proto_tree_add_item(tree,
728 hf_dlm3_rl_parent_remid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
730 offset += 4;
731 proto_tree_add_bitmask(tree, tvb, offset,
732 hf_dlm3_rl_exflags, ett_dlm3_rl_exflags,
733 rl_exflags_fields, ENC_LITTLE_ENDIAN);
734 exflags = tvb_get_letohl(tvb, offset);
737 offset += 4;
738 proto_tree_add_bitmask(tree, tvb, offset,
739 hf_dlm3_rl_flags, ett_dlm3_rl_flags,
740 rl_flags_fields, ENC_LITTLE_ENDIAN);
742 offset += 4;
743 proto_tree_add_item(tree,
744 hf_dlm3_rl_lvbseq, tvb, offset, 4, ENC_LITTLE_ENDIAN);
746 offset += 4;
747 proto_tree_add_item(tree,
748 hf_dlm3_rl_result, tvb, offset, 4, ENC_LITTLE_ENDIAN);
750 offset += 4;
751 proto_tree_add_item(tree,
752 hf_dlm3_rl_rqmode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
754 offset += 1;
755 proto_tree_add_item(tree,
756 hf_dlm3_rl_grmode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
758 offset += 1;
759 proto_tree_add_item(tree,
760 hf_dlm3_rl_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
762 offset += 1;
763 proto_tree_add_bitmask(tree, tvb, offset,
764 hf_dlm3_rl_asts, ett_dlm3_rl_asts,
765 rl_asts_fields, ENC_LITTLE_ENDIAN);
767 offset += 1;
768 proto_tree_add_item(tree,
769 hf_dlm3_rl_wait_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
771 offset += 2;
772 namelen = tvb_get_letohs(tvb, offset);
773 proto_tree_add_uint(tree,
774 hf_dlm3_rl_namelen, tvb, offset, 2,
775 namelen);
777 offset += 2;
778 if (namelen <= DLM3_RESNAME_MAXLEN) {
779 sub_item = proto_tree_add_item(tree,
780 hf_dlm3_rl_name, tvb, offset,
781 DLM3_RESNAME_MAXLEN, ENC_NA);
783 sub_tree = proto_item_add_subtree(sub_item,
784 ett_dlm3_rl_name);
785 sub_offset = offset;
786 proto_tree_add_item(sub_tree,
787 hf_dlm3_rl_name_contents, tvb, sub_offset,
788 namelen, ENC_ASCII);
790 sub_offset += namelen;
791 proto_tree_add_item(sub_tree,
792 hf_dlm3_rl_name_padding, tvb, sub_offset,
793 DLM3_RESNAME_MAXLEN - namelen, ENC_NA);
794 } else {
795 /* XXX - report an error */
798 offset += DLM3_RESNAME_MAXLEN;
799 if (((length - offset) > 0) && (exflags & DLM3_LKF_VALBLK))
800 proto_tree_add_item(tree,
801 hf_dlm3_rl_lvb, tvb, offset,
803 ENC_NA);
807 static void
808 dissect_dlm3_rcom_config(tvbuff_t *tvb, proto_tree *tree,
809 unsigned length, int offset)
811 if ((length - offset) < ( 4 + 4 + 8 ))
812 return;
814 proto_tree_add_item(tree,
815 hf_dlm3_rf_lvblen, tvb, offset, 4, ENC_LITTLE_ENDIAN);
817 offset += 4;
818 proto_tree_add_bitmask(tree, tvb, offset,
819 hf_dlm3_rf_lsflags, ett_dlm3_rf_lsflags,
820 rf_lsflags_fields, ENC_LITTLE_ENDIAN);
822 offset += 4;
823 proto_tree_add_item(tree,
824 hf_dlm3_rf_unused, tvb, offset, 8, ENC_LITTLE_ENDIAN);
827 /*offset += 8;*/
828 /* END */
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)
835 uint32_t rc_type;
837 proto_item *sub_item;
838 proto_tree *sub_tree;
841 rc_type = tvb_get_letohl(tvb, offset);
842 proto_tree_add_uint(tree,
843 hf_dlm3_rc_type, tvb, offset, 4, rc_type);
844 col_append_fstr(pinfo->cinfo, COL_INFO,
845 ": %s",
846 val_to_str_const(rc_type,
847 dlm3_rcom,
848 "Unknown"));
850 offset += 4;
851 proto_tree_add_item(tree,
852 hf_dlm3_rc_result, tvb, offset, 4, ENC_LITTLE_ENDIAN);
854 offset += 4;
855 proto_tree_add_item(tree,
856 hf_dlm3_rc_id, tvb, offset, 8, ENC_LITTLE_ENDIAN);
858 offset += 8;
859 proto_tree_add_item(tree,
860 hf_dlm3_rc_seq, tvb, offset, 8, ENC_LITTLE_ENDIAN);
862 offset += 8;
863 proto_tree_add_item(tree,
864 hf_dlm3_rc_seq_reply, tvb, offset, 8, ENC_LITTLE_ENDIAN);
866 offset += 8;
867 if ((length - offset) == 0) {
868 /* No rc_buf: Just return */
869 return;
872 /* Decode rc_buf */
873 sub_item = proto_tree_add_item(tree,
874 hf_dlm3_rc_buf,
875 tvb,
876 offset,
878 ENC_NA);
880 offset += 0;
881 if (rc_type == DLM3_RCOM_STATUS && (h_version & 0xffff) > 0) {
882 sub_tree = proto_item_add_subtree(sub_item,
883 ett_dlm3_rcom_status);
884 dissect_dlm3_rcom_status(tvb, sub_tree, length, offset);
885 } else if (rc_type == DLM3_RCOM_LOCK) {
886 sub_tree = proto_item_add_subtree(sub_item,
887 ett_dlm3_rcom_lock);
888 dissect_dlm3_rcom_lock(tvb, sub_tree, length, offset);
889 } else if (rc_type == DLM3_RCOM_STATUS_REPLY) {
890 sub_tree = proto_item_add_subtree(sub_item,
891 ett_dlm3_rcom_config);
892 dissect_dlm3_rcom_config(tvb, sub_tree, length, offset);
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)
901 proto_item *sub_item;
902 proto_tree *sub_tree;
904 switch (h_cmd) {
905 case DLM3_MSG:
906 case DLM3_RCOM:
907 break;
908 default:
909 return 0;
912 sub_item = proto_tree_add_uint(tree,
913 hf_dlm3_h_version, tvb, offset, 4,
914 h_version);
915 sub_tree = proto_item_add_subtree(sub_item, ett_dlm3_version);
916 proto_tree_add_uint(sub_tree,
917 hf_dlm3_h_major_version, tvb, offset + 0, 2,
918 (h_version & 0xFFFF0000) >> 16);
919 proto_tree_add_uint(sub_tree,
920 hf_dlm3_h_minor_version, tvb, offset + 2, 2,
921 (h_version & 0x0000FFFF));
922 offset += 4;
924 proto_tree_add_item(tree,
925 hf_dlm3_h_lockspace, tvb, offset, 4, ENC_LITTLE_ENDIAN);
926 offset += 4;
928 proto_tree_add_item(tree,
929 hf_dlm3_h_nodeid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
930 offset += 4;
932 proto_tree_add_item(tree,
933 hf_dlm3_h_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
934 offset += 2;
936 sub_item = proto_tree_add_uint(tree,
937 hf_dlm3_h_cmd, tvb, offset, 1, h_cmd);
938 offset += 1;
940 proto_tree_add_item(tree,
941 hf_dlm3_h_pad, tvb, offset, 1, ENC_LITTLE_ENDIAN);
942 offset += 1;
944 switch (h_cmd) {
945 case DLM3_MSG:
946 if (length < DLM_MSG_LEN)
947 return 0;
949 sub_tree = proto_item_add_subtree(sub_item, ett_dlm3_msg);
950 dissect_dlm3_msg(tvb, pinfo, sub_tree, length, offset);
951 break;
952 case DLM3_RCOM:
953 if (length < DLM_RCOM_LEN)
954 return 0;
956 sub_tree = proto_item_add_subtree(sub_item, ett_dlm3_rcom);
957 dissect_dlm3_rcom(tvb, pinfo, sub_tree, length, offset, h_version);
958 break;
959 default:
960 break;
963 return tvb_captured_length(tvb);
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)
970 proto_item *sub_item, *opts_item;
971 proto_tree *sub_tree, *opts_tree;
972 int offset, tlv_offset;
973 unsigned o_nextcmd;
974 uint16_t o_optlen, tmp, t_len;
976 switch (h_cmd) {
977 case DLM3_MSG:
978 case DLM3_RCOM:
979 case DLM3_OPTS:
980 case DLM3_ACK:
981 case DLM3_FIN:
982 break;
983 default:
984 return 0;
987 offset = 0;
989 sub_item = proto_tree_add_uint(tree,
990 hf_dlm3_h_version, tvb, offset, 4,
991 h_version);
992 sub_tree = proto_item_add_subtree(sub_item, ett_dlm3_version);
993 proto_tree_add_uint(sub_tree,
994 hf_dlm3_h_major_version, tvb, offset + 0, 2,
995 (h_version & 0xFFFF0000) >> 16);
996 proto_tree_add_uint(sub_tree,
997 hf_dlm3_h_minor_version, tvb, offset + 2, 2,
998 (h_version & 0x0000FFFF));
999 offset += 4;
1001 proto_tree_add_item(tree,
1002 hf_dlm3_h_seq, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1003 offset += 4;
1005 proto_tree_add_item(tree,
1006 hf_dlm3_h_nodeid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1007 offset += 4;
1009 proto_tree_add_item(tree,
1010 hf_dlm3_h_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1011 offset += 2;
1013 sub_item = proto_tree_add_uint(tree,
1014 hf_dlm3_h_cmd, tvb, offset, 1, h_cmd);
1015 offset += 1;
1017 proto_tree_add_item(tree,
1018 hf_dlm3_h_pad, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1019 offset += 1;
1021 switch (h_cmd) {
1022 case DLM3_OPTS:
1023 if (length < DLM_OPTS_LEN)
1024 return 0;
1026 sub_tree = proto_item_add_subtree(sub_item, ett_dlm3_opts);
1027 o_nextcmd = tvb_get_uint8(tvb, offset);
1028 col_append_fstr(pinfo->cinfo, COL_INFO,
1029 ": %s", val_to_str_const(o_nextcmd,
1030 dlm3_cmd,
1031 "Unknown"));
1032 sub_item = proto_tree_add_uint(sub_tree, hf_dlm3_o_nextcmd, tvb, offset, 1, o_nextcmd);
1033 offset += 1;
1035 proto_tree_add_item(sub_tree, hf_dlm3_o_pad, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1036 offset += 1;
1038 o_optlen = tvb_get_letohs(tvb, offset);
1039 tmp = DLM_OPTS_LEN + o_optlen;
1040 if (length < tmp)
1041 return 0;
1043 proto_tree_add_uint(sub_tree, hf_dlm3_o_optlen, tvb, offset, 2, o_optlen);
1044 offset += 2;
1046 proto_tree_add_item(sub_tree, hf_dlm3_o_pad2, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1047 offset += 4;
1049 tmp = o_optlen;
1050 if (tmp) {
1051 opts_item = proto_tree_add_item(sub_tree, hf_dlm3_o_opts, tvb, offset, tmp, ENC_NA);
1052 opts_tree = proto_item_add_subtree(opts_item, ett_dlm3_options);
1054 tlv_offset = 0;
1055 while (tmp > 0) {
1056 proto_tree_add_item(opts_tree, hf_dlm3_t_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1057 tlv_offset += 2;
1059 t_len = tvb_get_letohs(tvb, offset);
1060 if (t_len > o_optlen - tlv_offset)
1061 return 0;
1062 proto_tree_add_uint(opts_tree, hf_dlm3_t_length, tvb, offset, 2, t_len);
1063 tlv_offset += 2;
1065 proto_tree_add_item(opts_tree, hf_dlm3_t_pad, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1066 tlv_offset += 4;
1068 proto_tree_add_item(opts_tree, hf_dlm3_t_value, tvb, offset, t_len, ENC_NA);
1069 tlv_offset += t_len;
1070 tmp -= t_len;
1072 offset += tlv_offset;
1075 switch (o_nextcmd) {
1076 case DLM3_MSG:
1077 tmp = DLM_OPTS_LEN + o_optlen + DLM_RCOM_LEN;
1078 if (length < tmp)
1079 return 0;
1081 sub_tree = proto_item_add_subtree(sub_item, ett_dlm3_next_cmd);
1082 dissect_dlm3_1(tvb, pinfo, sub_tree, data, o_nextcmd, h_version, length, offset);
1083 break;
1084 case DLM3_RCOM:
1085 tmp = DLM_OPTS_LEN + o_optlen + DLM_RCOM_LEN;
1086 if (length < tmp)
1087 return 0;
1089 sub_tree = proto_item_add_subtree(sub_item, ett_dlm3_next_cmd);
1090 dissect_dlm3_1(tvb, pinfo, sub_tree, data, o_nextcmd, h_version, length, offset);
1091 break;
1092 default:
1093 return 0;
1095 break;
1096 case DLM3_MSG:
1097 if (length < DLM_MSG_LEN)
1098 return 0;
1100 dissect_dlm3_1(tvb, pinfo, sub_tree, data, h_cmd, h_version, length, offset);
1101 break;
1102 case DLM3_RCOM:
1103 if (length < DLM_RCOM_LEN)
1104 return 0;
1106 dissect_dlm3_1(tvb, pinfo, sub_tree, data, h_cmd, h_version, length, offset);
1107 break;
1108 default:
1109 break;
1112 return tvb_captured_length(tvb);
1115 static int
1116 dissect_dlm3(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void *data _U_)
1118 proto_item *item;
1119 proto_tree *tree;
1120 unsigned length;
1121 uint32_t h_version;
1122 uint8_t h_cmd;
1123 int ret = 0;
1126 /* Check that there's enough data */
1127 length = tvb_captured_length(tvb);
1128 if (length < DLM_HEADER_LEN)
1129 return 0;
1131 /* Check the protocol version */
1132 h_version = tvb_get_letohl(tvb, 0);
1133 if ((h_version & 0xffff0000) != DLM3_MAJOR_VERSION ||
1134 (h_version & 0xffff) > DLM3_MINOR_VERSION_MAX)
1135 return 0;
1137 col_set_str(pinfo->cinfo, COL_PROTOCOL, "DLM3");
1140 col_set_str(pinfo->cinfo, COL_INFO, "DLM3");
1142 h_cmd = tvb_get_uint8(tvb, DLM_HEADER_LEN - 1 - 1);
1143 col_set_str(pinfo->cinfo, COL_INFO,
1144 val_to_str_const(h_cmd,
1145 dlm3_cmd,
1146 "packet-dlm3.c internal bug"));
1148 item = proto_tree_add_item(parent_tree, proto_dlm3, tvb, 0,
1149 -1, ENC_NA);
1150 tree = proto_item_add_subtree(item, ett_dlm3);
1152 switch (h_version) {
1153 case DLM_VERSION_3_1:
1154 ret = dissect_dlm3_1(tvb, pinfo, tree, data, h_cmd, h_version, length, 0);
1155 break;
1156 case DLM_VERSION_3_2:
1157 ret = dissect_dlm3_2(tvb, pinfo, tree, data, h_cmd, h_version, length);
1158 break;
1159 default:
1160 break;
1163 return ret;
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_)
1170 dissect_dlm3(tvb, pinfo, tree, data);
1171 return tvb_captured_length(tvb);
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_)
1178 return tvb_get_letohs(tvb, offset + DLM_HEADER_LEN - 2 - 1 - 1);
1181 static int
1182 dissect_tcp_dlm3(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
1184 tcp_dissect_pdus(tvb, pinfo, tree, true, DLM_HEADER_LEN - 1 - 1,
1185 get_dlm3_message_len, dissect_dlm3_message, data);
1186 return tvb_captured_length(tvb);
1189 /* Register the protocol with Wireshark */
1191 void
1192 proto_register_dlm3(void)
1195 static hf_register_info hf[] = {
1196 /* dlm_header */
1197 { &hf_dlm3_h_version,
1198 { "Version", "dlm3.h.version",
1199 FT_UINT32, BASE_HEX, NULL, 0x0,
1200 NULL, HFILL }},
1201 { &hf_dlm3_h_major_version,
1202 { "Major Version", "dlm3.h.major_version",
1203 FT_UINT16, BASE_HEX, NULL, 0x0,
1204 NULL, HFILL }},
1205 { &hf_dlm3_h_minor_version,
1206 { "Minor Version", "dlm3.h.minor_version",
1207 FT_UINT16, BASE_HEX, NULL, 0x0,
1208 NULL, HFILL }},
1209 { &hf_dlm3_h_lockspace,
1210 { "Lockspace Global ID", "dlm3.h.lockspac",
1211 FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
1212 NULL, HFILL }},
1213 { &hf_dlm3_h_seq,
1214 { "Sequence Number", "dlm3.h.seq",
1215 FT_UINT32, BASE_DEC, NULL, 0x0,
1216 NULL, HFILL }},
1217 { &hf_dlm3_h_nodeid,
1218 { "Sender Node ID", "dlm3.h.nodeid",
1219 FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
1220 NULL, HFILL }},
1221 { &hf_dlm3_h_length,
1222 { "Length", "dlm3.h.length",
1223 FT_UINT16, BASE_DEC, NULL, 0x0,
1224 NULL, HFILL }},
1225 { &hf_dlm3_h_cmd,
1226 { "Command", "dlm3.h.cmd",
1227 FT_UINT8, BASE_DEC, VALS(dlm3_cmd), 0x0,
1228 NULL, HFILL }},
1229 { &hf_dlm3_h_pad,
1230 { "Padding", "dlm3.h.pad",
1231 FT_UINT8, BASE_DEC, NULL, 0x0,
1232 NULL, HFILL }},
1234 /* dlm_opts */
1235 { &hf_dlm3_o_nextcmd,
1236 { "Next Command", "dlm3.o.nextcmd",
1237 FT_UINT8, BASE_DEC, VALS(dlm3_cmd), 0x0,
1238 NULL, HFILL }},
1239 { &hf_dlm3_o_pad,
1240 { "Padding", "dlm3.o.pad",
1241 FT_UINT8, BASE_DEC, NULL, 0x0,
1242 NULL, HFILL }},
1243 { &hf_dlm3_o_optlen,
1244 { "Options Length", "dlm3.o.optlen",
1245 FT_UINT16, BASE_DEC, NULL, 0x0,
1246 NULL, HFILL }},
1247 { &hf_dlm3_o_pad2,
1248 { "Padding", "dlm3.o.pad2",
1249 FT_UINT32, BASE_DEC, NULL, 0x0,
1250 NULL, HFILL }},
1251 { &hf_dlm3_o_opts,
1252 { "Options", "dlm3.o.opts",
1253 FT_BYTES, BASE_NONE, NULL, 0x0,
1254 NULL, HFILL }},
1256 /* dlm_opt_header */
1257 { &hf_dlm3_t_type,
1258 { "Type", "dlm3.t.type",
1259 FT_UINT16, BASE_DEC, NULL, 0x0,
1260 NULL, HFILL }},
1261 { &hf_dlm3_t_length,
1262 { "Length", "dlm3.t.length",
1263 FT_UINT16, BASE_DEC, NULL, 0x0,
1264 NULL, HFILL }},
1265 { &hf_dlm3_t_pad,
1266 { "Padding", "dlm3.t.pad",
1267 FT_UINT32, BASE_DEC, NULL, 0x0,
1268 NULL, HFILL }},
1269 { &hf_dlm3_t_value,
1270 { "Value", "dlm3.t.value",
1271 FT_BYTES, BASE_NONE, NULL, 0x0,
1272 NULL, HFILL }},
1274 /* dlm_message */
1275 { &hf_dlm3_m_type,
1276 { "Message Type", "dlm3.m.type",
1277 FT_UINT32, BASE_DEC, VALS(dlm3_msg), 0x0,
1278 NULL, HFILL }},
1279 { &hf_dlm3_m_nodeid,
1280 { "Receiver Node ID", "dlm3.m.nodeid",
1281 FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
1282 NULL, HFILL }},
1283 { &hf_dlm3_m_pid,
1284 { "Process ID of Lock Owner", "dlm3.m.pid",
1285 FT_UINT32, BASE_DEC, NULL, 0x0,
1286 NULL, HFILL }},
1287 { &hf_dlm3_m_lkid,
1288 { "Lock ID on Sender", "dlm3.m.lkid",
1289 FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
1290 NULL, HFILL}},
1291 { &hf_dlm3_m_remid,
1292 { "Lock ID on Receiver", "dlm3.m.remid",
1293 FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
1294 NULL, HFILL}},
1295 { &hf_dlm3_m_parent_lkid,
1296 { "Parent Lock ID on Sender", "dlm3.m.parent_lkid",
1297 FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
1298 NULL, HFILL}},
1299 { &hf_dlm3_m_parent_remid,
1300 { "Parent Lock ID on Receiver", "dlm3.m.parent_remid",
1301 FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
1302 NULL, HFILL}},
1303 /* dlm_message::exflags */
1304 { &hf_dlm3_m_exflags,
1305 { "External Flags", "dlm3.m.exflags",
1306 FT_UINT32, BASE_HEX, NULL, 0x0,
1307 NULL, HFILL}},
1308 { &hf_dlm3_m_exflags_noqueue,
1309 { "Don't queue", "dlm3.m.exflags.noqueue",
1310 FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUE,
1311 NULL, HFILL}},
1312 { &hf_dlm3_m_exflags_cancel,
1313 { "Cancel", "dlm3.m.exflags.cancel",
1314 FT_BOOLEAN, 32, NULL, DLM3_LKF_CANCEL,
1315 NULL, HFILL}},
1316 { &hf_dlm3_m_exflags_convert,
1317 { "Convert", "dlm3.m.exflags.convert",
1318 FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVERT,
1319 NULL, HFILL}},
1320 { &hf_dlm3_m_exflags_valblk,
1321 { "Return the contents of the lock value block", "dlm3.m.exflags.valblk",
1322 FT_BOOLEAN, 32, NULL, DLM3_LKF_VALBLK,
1323 NULL, HFILL}},
1324 { &hf_dlm3_m_exflags_quecvt,
1325 { "Force a conversion request to be queued", "dlm3.m.exflags.quecvt",
1326 FT_BOOLEAN, 32, NULL, DLM3_LKF_QUECVT,
1327 NULL, HFILL}},
1328 { &hf_dlm3_m_exflags_ivvalblk,
1329 { "Invalidate the lock value block", "dlm3.m.exflags.ivvalblk",
1330 FT_BOOLEAN, 32, NULL, DLM3_LKF_IVVALBLK,
1331 NULL, HFILL}},
1332 { &hf_dlm3_m_exflags_convdeadlk,
1333 { "Forced down to NL to resolve a conversion deadlock", "dlm3.m.exflags.convdeadlk",
1334 FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVDEADLK,
1335 NULL, HFILL}},
1336 { &hf_dlm3_m_exflags_persistent,
1337 { "Persistent", "dlm3.m.exflags.persistent",
1338 FT_BOOLEAN, 32, NULL, DLM3_LKF_PERSISTENT,
1339 NULL, HFILL}},
1340 { &hf_dlm3_m_exflags_nodlckwt,
1341 { "Don't cancel the lock if it gets into conversion deadlock", "dlm3.m.exflags.nodlckwt",
1342 FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKWT,
1343 NULL, HFILL}},
1344 { &hf_dlm3_m_exflags_nodlckblk,
1345 { "Nodlckblk", "dlm3.m.exflags.nodlckblk",
1346 FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKBLK,
1347 NULL, HFILL}},
1348 { &hf_dlm3_m_exflags_expedite,
1349 { "Grant a NL lock immediately", "dlm3.m.exflags.expedite",
1350 FT_BOOLEAN, 32, NULL, DLM3_LKF_EXPEDITE,
1351 NULL, HFILL}},
1352 { &hf_dlm3_m_exflags_noqueuebast,
1353 { "Send blocking ASTs even for NOQUEUE operations", "dlm3.m.exflags.noqueuebast",
1354 FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUEBAST,
1355 NULL, HFILL}},
1356 { &hf_dlm3_m_exflags_headque,
1357 { "Add a lock to the head of the queue", "dlm3.m.exflags.headque",
1358 FT_BOOLEAN, 32, NULL, DLM3_LKF_HEADQUE,
1359 NULL, HFILL}},
1360 { &hf_dlm3_m_exflags_noorder,
1361 { "Disregard the standard grant order rules", "dlm3.m.exflags.noorder",
1362 FT_BOOLEAN, 32, NULL, DLM3_LKF_NOORDER,
1363 NULL, HFILL}},
1364 { &hf_dlm3_m_exflags_orphan,
1365 { "Orphan", "dlm3.m.exflags.orphan",
1366 FT_BOOLEAN, 32, NULL, DLM3_LKF_ORPHAN,
1367 NULL, HFILL}},
1368 { &hf_dlm3_m_exflags_altpr,
1369 { "Try to grant the lock in `protected read' mode", "dlm3.m.exflags.altpr",
1370 FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTPR,
1371 NULL, HFILL}},
1372 { &hf_dlm3_m_exflags_altcw,
1373 { "Try to grant the lock in `concurrent read' mode", "dlm3.m.exflags.altcw",
1374 FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTCW,
1375 NULL, HFILL}},
1376 { &hf_dlm3_m_exflags_forceunlock,
1377 { "Force unlock", "dlm3.m.exflags.forceunlock",
1378 FT_BOOLEAN, 32, NULL, DLM3_LKF_FORCEUNLOCK,
1379 NULL, HFILL}},
1380 { &hf_dlm3_m_exflags_timeout,
1381 { "Timeout", "dlm3.m.exflags.timeout",
1382 FT_BOOLEAN, 32, NULL, DLM3_LKF_TIMEOUT,
1383 NULL, HFILL}},
1384 /* dlm_message::sbflags */
1385 { &hf_dlm3_m_sbflags,
1386 { "Status Block Flags", "dlm3.m.sbflags",
1387 FT_UINT32, BASE_HEX, NULL, 0x0,
1388 NULL, HFILL}},
1389 { &hf_dlm3_m_sbflags_demoted,
1390 { "Demoted for deadlock resolution", "dlm3.m.sbflags.demoted",
1391 FT_BOOLEAN, 32, NULL, DLM3_SBF_DEMOTED,
1392 NULL, HFILL}},
1393 { &hf_dlm3_m_sbflags_valnotvalid,
1394 { "Lock Value Block Is Invalid", "dlm3.m.sbflags.valnotvalid",
1395 FT_BOOLEAN, 32, NULL, DLM3_SBF_VALNOTVALID,
1396 NULL, HFILL}},
1397 { &hf_dlm3_m_sbflags_altmode,
1398 { "Try to Grant in Alternative Mode", "dlm3.m.sbflags.altmode",
1399 FT_BOOLEAN, 32, NULL, DLM3_SBF_ALTMODE,
1400 NULL, HFILL}},
1402 /* dlm_message::flags */
1403 { &hf_dlm3_m_flags,
1404 { "Internal Flags", "dlm3.m.flags",
1405 FT_UINT32, BASE_HEX, NULL, 0x0,
1406 NULL, HFILL}},
1407 { &hf_dlm3_m_flags_user,
1408 { "User space lock related", "dlm3.m.flags.user",
1409 FT_BOOLEAN, 32, NULL, DLM3_IFL_USER,
1410 NULL, HFILL}},
1411 { &hf_dlm3_m_flags_orphan,
1412 { "Orphaned lock", "dlm3.m.flags.orphan",
1413 FT_BOOLEAN, 32, NULL, DLM3_IFL_ORPHAN,
1414 NULL, HFILL}},
1416 { &hf_dlm3_m_lvbseq,
1417 { "Lock Value Block Sequence Number", "dlm3.m.lvbseq",
1418 FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
1419 NULL, HFILL}},
1421 { &hf_dlm3_m_hash,
1422 { "Hash value", "dlm3.m.hash",
1423 FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
1424 NULL, HFILL}},
1426 { &hf_dlm3_m_status,
1427 { "Status", "dlm3.m.status",
1428 FT_INT32, BASE_DEC, VALS(dlm3_status), 0x0,
1429 NULL, HFILL}},
1431 { &hf_dlm3_m_grmode,
1432 { "Granted Mode", "dlm3.m.grmode",
1433 FT_INT32, BASE_DEC, VALS(dlm3_mode), 0x0,
1434 NULL, HFILL}},
1435 { &hf_dlm3_m_rqmode,
1436 { "Request Mode", "dlm3.m.rqmode",
1437 FT_INT32, BASE_DEC, VALS(dlm3_mode), 0x0,
1438 NULL, HFILL}},
1439 { &hf_dlm3_m_bastmode,
1440 { "Mode requested by another node", "dlm3.m.bastmode",
1441 FT_INT32, BASE_DEC, VALS(dlm3_mode), 0x0,
1442 NULL, HFILL}},
1444 /* dlm_message::asts */
1445 { &hf_dlm3_m_asts,
1446 { "Asynchronous Traps", "dlm3.m.asts",
1447 FT_UINT32, BASE_HEX, NULL, 0x0,
1448 NULL, HFILL}},
1449 { &hf_dlm3_m_asts_comp,
1450 { "Completion", "dlm3.m.asts.comp",
1451 FT_BOOLEAN, 32, NULL, DLM3_AST_COMP,
1452 NULL, HFILL }},
1453 { &hf_dlm3_m_asts_bast,
1454 { "Blocking", "dlm3.m.asts.bast",
1455 FT_BOOLEAN, 32, NULL, DLM3_AST_BAST,
1456 NULL, HFILL }},
1458 { &hf_dlm3_m_result,
1459 { "Message Result(errno)", "dlm3.m.result",
1460 FT_INT32, BASE_DEC, VALS(dlm3_result), 0x0,
1461 NULL, HFILL}},
1462 { &hf_dlm3_m_extra,
1463 { "Extra Message", "dlm3.m.extra",
1464 FT_BYTES, BASE_NONE, NULL, 0x0,
1465 NULL, HFILL}},
1467 /* dlm_rcom */
1468 { &hf_dlm3_rc_type,
1469 { "Recovery Command Type", "dlm3.rc.type",
1470 FT_UINT32, BASE_DEC, VALS(dlm3_rcom), 0x0,
1471 NULL, HFILL}},
1472 { &hf_dlm3_rc_result,
1473 { "Recovery Command Result", "dlm3.rc.result",
1474 FT_INT32, BASE_DEC, NULL, 0x0,
1475 NULL, HFILL}},
1476 { &hf_dlm3_rc_id,
1477 { "Recovery Command ID", "dlm3.rc.id",
1478 FT_UINT64, BASE_DEC, NULL, 0x0,
1479 NULL, HFILL}},
1480 { &hf_dlm3_rc_seq,
1481 { "Recovery Command Sequence Number of Sender", "dlm3.rc.seq",
1482 FT_UINT64, BASE_DEC, NULL, 0x0,
1483 NULL, HFILL}},
1484 { &hf_dlm3_rc_seq_reply,
1485 { "Recovery Command Sequence Number of Receiver", "dlm3.rc.seq_reply",
1486 FT_UINT64, BASE_DEC, NULL, 0x0,
1487 NULL, HFILL}},
1488 { &hf_dlm3_rc_buf,
1489 { "Recovery Buffer", "dlm3.rc.buf",
1490 FT_BYTES, BASE_NONE, NULL, 0x0,
1491 NULL, HFILL}},
1493 /* rcom_config */
1494 { &hf_dlm3_rf_lvblen,
1495 { "Lock Value Block Length", "dlm3.rf.lvblen",
1496 FT_UINT32, BASE_DEC, NULL, 0x0,
1497 NULL, HFILL}},
1499 /* rcom_config::rf_lsflags */
1500 { &hf_dlm3_rf_lsflags,
1501 { "External Flags", "dlm3.rf.lsflags",
1502 FT_UINT32, BASE_HEX, NULL, 0x0,
1503 NULL, HFILL}},
1504 { &hf_dlm3_rf_lsflags_noqueue,
1505 { "Don't queue", "dlm3.rf.lsflags.noqueue",
1506 FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUE,
1507 NULL, HFILL}},
1508 { &hf_dlm3_rf_lsflags_cancel,
1509 { "Cancel", "dlm3.rf.lsflags.cancel",
1510 FT_BOOLEAN, 32, NULL, DLM3_LKF_CANCEL,
1511 NULL, HFILL}},
1512 { &hf_dlm3_rf_lsflags_convert,
1513 { "Convert", "dlm3.rf.lsflags.convert",
1514 FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVERT,
1515 NULL, HFILL}},
1516 { &hf_dlm3_rf_lsflags_valblk,
1517 { "Return the contents of the lock value block", "dlm3.rf.lsflags.valblk",
1518 FT_BOOLEAN, 32, NULL, DLM3_LKF_VALBLK,
1519 NULL, HFILL}},
1520 { &hf_dlm3_rf_lsflags_quecvt,
1521 { "Force a conversion request to be queued", "dlm3.rf.lsflags.quecvt",
1522 FT_BOOLEAN, 32, NULL, DLM3_LKF_QUECVT,
1523 NULL, HFILL}},
1524 { &hf_dlm3_rf_lsflags_ivvalblk,
1525 { "Invalidate the lock value block", "dlm3.rf.lsflags.ivvalblk",
1526 FT_BOOLEAN, 32, NULL, DLM3_LKF_IVVALBLK,
1527 NULL, HFILL}},
1528 { &hf_dlm3_rf_lsflags_convdeadlk,
1529 { "Forced down to NL to resolve a conversion deadlock", "dlm3.rf.lsflags.convdeadlk",
1530 FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVDEADLK,
1531 NULL, HFILL}},
1532 { &hf_dlm3_rf_lsflags_persistent,
1533 { "Persistent", "dlm3.rf.lsflags.persistent",
1534 FT_BOOLEAN, 32, NULL, DLM3_LKF_PERSISTENT,
1535 NULL, HFILL}},
1536 { &hf_dlm3_rf_lsflags_nodlckwt,
1537 { "Don't cancel the lock if it gets into conversion deadlock", "dlm3.rf.lsflags.nodlckwt",
1538 FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKWT,
1539 NULL, HFILL}},
1540 { &hf_dlm3_rf_lsflags_nodlckblk,
1541 { "Nodlckblk", "dlm3.rf.lsflags.nodlckblk",
1542 FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKBLK,
1543 NULL, HFILL}},
1544 { &hf_dlm3_rf_lsflags_expedite,
1545 { "Grant a NL lock immediately", "dlm3.rf.lsflags.expedite",
1546 FT_BOOLEAN, 32, NULL, DLM3_LKF_EXPEDITE,
1547 NULL, HFILL}},
1548 { &hf_dlm3_rf_lsflags_noqueuebast,
1549 { "Send blocking ASTs even for NOQUEUE operations", "dlm3.rf.lsflags.noqueuebast",
1550 FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUEBAST,
1551 NULL, HFILL}},
1552 { &hf_dlm3_rf_lsflags_headque,
1553 { "Add a lock to the head of the queue", "dlm3.rf.lsflags.headque",
1554 FT_BOOLEAN, 32, NULL, DLM3_LKF_HEADQUE,
1555 NULL, HFILL}},
1556 { &hf_dlm3_rf_lsflags_noorder,
1557 { "Disregard the standard grant order rules", "dlm3.rf.lsflags.noorder",
1558 FT_BOOLEAN, 32, NULL, DLM3_LKF_NOORDER,
1559 NULL, HFILL}},
1560 { &hf_dlm3_rf_lsflags_orphan,
1561 { "Orphan", "dlm3.rf.lsflags.orphan",
1562 FT_BOOLEAN, 32, NULL, DLM3_LKF_ORPHAN,
1563 NULL, HFILL}},
1564 { &hf_dlm3_rf_lsflags_altpr,
1565 { "Try to grant the lock in `protected read' mode", "dlm3.rf.lsflags.altpr",
1566 FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTPR,
1567 NULL, HFILL}},
1568 { &hf_dlm3_rf_lsflags_altcw,
1569 { "Try to grant the lock in `concurrent read' mode", "dlm3.rf.lsflags.altcw",
1570 FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTCW,
1571 NULL, HFILL}},
1572 { &hf_dlm3_rf_lsflags_forceunlock,
1573 { "Force unlock", "dlm3.rf.lsflags.forceunlock",
1574 FT_BOOLEAN, 32, NULL, DLM3_LKF_FORCEUNLOCK,
1575 NULL, HFILL}},
1576 { &hf_dlm3_rf_lsflags_timeout,
1577 { "Timeout", "dlm3.rf.lsflags.timeout",
1578 FT_BOOLEAN, 32, NULL, DLM3_LKF_TIMEOUT,
1579 NULL, HFILL}},
1581 { &hf_dlm3_rf_unused,
1582 { "Unused area", "dlm3.rf.lsflags.unused",
1583 FT_UINT64, BASE_HEX, NULL, 0x0,
1584 NULL, HFILL}},
1586 /* rcom_status */
1587 { &hf_dlm3_rs_flags,
1588 { "Recovery Command Status Flags", "dlm3.rs.flags",
1589 FT_UINT32, BASE_HEX, NULL, 0x0,
1590 NULL, HFILL}},
1591 { &hf_dlm3_rs_flags_need_slots,
1592 { "Need slots", "dlm3.rs.flags.need_slots",
1593 FT_UINT32, BASE_HEX, NULL, DLM_RSF_NEED_SLOTS,
1594 NULL, HFILL}},
1595 { &hf_dlm3_rs_unused1,
1596 { "Unused area", "dlm3.rs.unused1",
1597 FT_UINT32, BASE_HEX, NULL, 0x0,
1598 NULL, HFILL}},
1599 { &hf_dlm3_rs_unused2,
1600 { "Unused area", "dlm3.rs.unused2",
1601 FT_UINT64, BASE_HEX, NULL, 0x0,
1602 NULL, HFILL}},
1604 /* rcom_lock */
1605 { &hf_dlm3_rl_ownpid,
1606 { "Process ID of Lock Owner", "dlm3.rl.ownpid",
1607 FT_UINT32, BASE_DEC, NULL, 0x0,
1608 NULL, HFILL}},
1609 { &hf_dlm3_rl_lkid,
1610 { "Lock ID on Sender", "dlm3.rl.lkid",
1611 FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
1612 NULL, HFILL}},
1613 { &hf_dlm3_rl_remid,
1614 { "Lock ID on Receiver", "dlm3.rl.remid",
1615 FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
1616 NULL, HFILL}},
1617 { &hf_dlm3_rl_parent_lkid,
1618 { "Parent Lock ID on Sender", "dlm3.rl.parent_lkid",
1619 FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
1620 NULL, HFILL}},
1621 { &hf_dlm3_rl_parent_remid,
1622 { "Parent Lock ID on Receiver", "dlm3.rl.parent_remid",
1623 FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
1624 NULL, HFILL}},
1626 { &hf_dlm3_rl_exflags,
1627 { "External Flags", "dlm3.rl.exflags",
1628 FT_UINT32, BASE_HEX, NULL, 0x0,
1629 NULL, HFILL}},
1630 { &hf_dlm3_rl_exflags_noqueue,
1631 { "Don't queue", "dlm3.rl.exflags.noqueue",
1632 FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUE,
1633 NULL, HFILL}},
1634 { &hf_dlm3_rl_exflags_cancel,
1635 { "Cancel", "dlm3.rl.exflags.cancel",
1636 FT_BOOLEAN, 32, NULL, DLM3_LKF_CANCEL,
1637 NULL, HFILL}},
1638 { &hf_dlm3_rl_exflags_convert,
1639 { "Convert", "dlm3.rl.exflags.convert",
1640 FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVERT,
1641 NULL, HFILL}},
1642 { &hf_dlm3_rl_exflags_valblk,
1643 { "Return the contents of the lock value block", "dlm3.rl.exflags.valblk",
1644 FT_BOOLEAN, 32, NULL, DLM3_LKF_VALBLK,
1645 NULL, HFILL}},
1646 { &hf_dlm3_rl_exflags_quecvt,
1647 { "Force a conversion request to be queued", "dlm3.rl.exflags.quecvt",
1648 FT_BOOLEAN, 32, NULL, DLM3_LKF_QUECVT,
1649 NULL, HFILL}},
1650 { &hf_dlm3_rl_exflags_ivvalblk,
1651 { "Invalidate the lock value block", "dlm3.rl.exflags.ivvalblk",
1652 FT_BOOLEAN, 32, NULL, DLM3_LKF_IVVALBLK,
1653 NULL, HFILL}},
1654 { &hf_dlm3_rl_exflags_convdeadlk,
1655 { "Forced down to NL to resolve a conversion deadlock", "dlm3.rl.exflags.convdeadlk",
1656 FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVDEADLK,
1657 NULL, HFILL}},
1658 { &hf_dlm3_rl_exflags_persistent,
1659 { "Persistent", "dlm3.rl.exflags.persistent",
1660 FT_BOOLEAN, 32, NULL, DLM3_LKF_PERSISTENT,
1661 NULL, HFILL}},
1662 { &hf_dlm3_rl_exflags_nodlckwt,
1663 { "Don't cancel the lock if it gets into conversion deadlock", "dlm3.rl.exflags.nodlckwt",
1664 FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKWT,
1665 NULL, HFILL}},
1666 { &hf_dlm3_rl_exflags_nodlckblk,
1667 { "Nodlckblk", "dlm3.rl.exflags.nodlckblk",
1668 FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKBLK,
1669 NULL, HFILL}},
1670 { &hf_dlm3_rl_exflags_expedite,
1671 { "Grant a NL lock immediately", "dlm3.rl.exflags.expedite",
1672 FT_BOOLEAN, 32, NULL, DLM3_LKF_EXPEDITE,
1673 NULL, HFILL}},
1674 { &hf_dlm3_rl_exflags_noqueuebast,
1675 { "Send blocking ASTs even for NOQUEUE operations", "dlm3.rl.exflags.noqueuebast",
1676 FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUEBAST,
1677 NULL, HFILL}},
1678 { &hf_dlm3_rl_exflags_headque,
1679 { "Add a lock to the head of the queue", "dlm3.rl.exflags.headque",
1680 FT_BOOLEAN, 32, NULL, DLM3_LKF_HEADQUE,
1681 NULL, HFILL}},
1682 { &hf_dlm3_rl_exflags_noorder,
1683 { "Disregard the standard grant order rules", "dlm3.rl.exflags.noorder",
1684 FT_BOOLEAN, 32, NULL, DLM3_LKF_NOORDER,
1685 NULL, HFILL}},
1686 { &hf_dlm3_rl_exflags_orphan,
1687 { "Orphan", "dlm3.rl.exflags.orphan",
1688 FT_BOOLEAN, 32, NULL, DLM3_LKF_ORPHAN,
1689 NULL, HFILL}},
1690 { &hf_dlm3_rl_exflags_altpr,
1691 { "Try to grant the lock in `protected read' mode", "dlm3.rl.exflags.altpr",
1692 FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTPR,
1693 NULL, HFILL}},
1694 { &hf_dlm3_rl_exflags_altcw,
1695 { "Try to grant the lock in `concurrent read' mode", "dlm3.rl.exflags.altcw",
1696 FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTCW,
1697 NULL, HFILL}},
1698 { &hf_dlm3_rl_exflags_forceunlock,
1699 { "Force unlock", "dlm3.rl.exflags.forceunlock",
1700 FT_BOOLEAN, 32, NULL, DLM3_LKF_FORCEUNLOCK,
1701 NULL, HFILL}},
1702 { &hf_dlm3_rl_exflags_timeout,
1703 { "Timeout", "dlm3.rl.exflags.timeout",
1704 FT_BOOLEAN, 32, NULL, DLM3_LKF_TIMEOUT,
1705 NULL, HFILL}},
1706 { &hf_dlm3_rl_flags,
1707 { "Internal Flags", "dlm3.rl.flags",
1708 FT_UINT32, BASE_HEX, NULL, 0x0,
1709 NULL, HFILL}},
1710 { &hf_dlm3_rl_flags_user,
1711 { "User space lock related", "dlm3.rl.flags.user",
1712 FT_BOOLEAN, 32, NULL, DLM3_IFL_USER,
1713 NULL, HFILL}},
1714 { &hf_dlm3_rl_flags_orphan,
1715 { "Orphaned lock", "dlm3.rl.flags.orphan",
1716 FT_BOOLEAN, 32, NULL, DLM3_IFL_ORPHAN,
1717 NULL, HFILL}},
1719 { &hf_dlm3_rl_lvbseq,
1720 { "Lock Value Block Sequence Number", "dlm3.rl.lvbseq",
1721 FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
1722 NULL, HFILL}},
1723 { &hf_dlm3_rl_result,
1724 { "Result of Recovering master copy", "dlm3.rl.result",
1725 FT_INT32, BASE_DEC, VALS(dlm3_result), 0x0,
1726 NULL, HFILL}},
1727 { &hf_dlm3_rl_rqmode,
1728 { "Request Mode", "dlm3.rl.rqmode",
1729 FT_INT8, BASE_DEC, VALS(dlm3_mode), 0x0,
1730 NULL, HFILL}},
1731 { &hf_dlm3_rl_grmode,
1732 { "Granted Mode", "dlm3.rl.grmode",
1733 FT_INT8, BASE_DEC, VALS(dlm3_mode), 0x0,
1734 NULL, HFILL}},
1735 { &hf_dlm3_rl_status,
1736 { "Status", "dlm3.rl.status",
1737 FT_INT8, BASE_DEC, VALS(dlm3_rs), 0x0,
1738 NULL, HFILL}},
1739 { &hf_dlm3_rl_asts,
1740 { "Asynchronous Traps", "dlm3.rl.asts",
1741 FT_UINT8, BASE_HEX, NULL, 0x0,
1742 NULL, HFILL}},
1743 { &hf_dlm3_rl_asts_comp,
1744 { "Completion", "dlm3.rl.asts.comp",
1745 FT_BOOLEAN, 8, NULL, DLM3_AST_COMP,
1746 NULL, HFILL }},
1747 { &hf_dlm3_rl_asts_bast,
1748 { "Blocking", "dlm3.rl.asts.bast",
1749 FT_BOOLEAN, 8, NULL, DLM3_AST_BAST,
1750 NULL, HFILL }},
1752 { &hf_dlm3_rl_wait_type,
1753 { "Message Type the waiter is waiting for", "dlm3.rl.wait_type",
1754 FT_UINT16, BASE_DEC, VALS(dlm3_msg), 0x0,
1755 NULL, HFILL }},
1757 { &hf_dlm3_rl_namelen,
1758 { "Length of `name' field", "dlm3.rl.namelen",
1759 FT_UINT16, BASE_DEC, NULL, 0x0,
1760 NULL, HFILL }},
1761 { &hf_dlm3_rl_name,
1762 { "Name of Resource", "dlm3.rl.name",
1763 FT_BYTES, BASE_NONE, NULL, 0x0,
1764 NULL, HFILL }},
1765 { &hf_dlm3_rl_name_contents,
1766 { "Contents actually occupying `name' field", "dlm3.rl.name_contents",
1767 FT_STRING, BASE_NONE, NULL, 0x0,
1768 NULL, HFILL }},
1769 { &hf_dlm3_rl_name_padding,
1770 { "Padding", "dlm3.rl.name_padding",
1771 FT_BYTES, BASE_NONE, NULL, 0x0,
1772 NULL, HFILL }},
1773 { &hf_dlm3_rl_lvb,
1774 { "Lock Value Block", "dlm3.rl.lvb",
1775 FT_BYTES, BASE_NONE, NULL, 0x0,
1776 NULL, HFILL }}
1779 static int *ett[] = {
1780 &ett_dlm3,
1781 &ett_dlm3_version,
1783 &ett_dlm3_opts,
1784 &ett_dlm3_options,
1785 &ett_dlm3_next_cmd,
1787 &ett_dlm3_msg,
1788 &ett_dlm3_m_exflags,
1789 &ett_dlm3_sbflags,
1790 &ett_dlm3_m_flags,
1791 &ett_dlm3_m_asts,
1793 &ett_dlm3_rcom,
1794 &ett_dlm3_rcom_status,
1795 &ett_dlm3_rcom_lock,
1796 &ett_dlm3_rcom_config,
1798 &ett_dlm3_rs_flags,
1800 &ett_dlm3_rf_lsflags,
1801 &ett_dlm3_rl_exflags,
1802 &ett_dlm3_rl_flags,
1803 &ett_dlm3_rl_asts,
1804 &ett_dlm3_rl_name
1807 proto_dlm3 = proto_register_protocol("Distributed Lock Manager",
1808 "DLM3", "dlm3");
1809 proto_register_field_array(proto_dlm3, hf, array_length(hf));
1810 proto_register_subtree_array(ett, array_length(ett));
1812 /* dlm3_module = prefs_register_protocol(proto_dlm3, NULL); */
1814 dlm3_sctp_handle = register_dissector("dlm3", dissect_dlm3, proto_dlm3);
1815 dlm3_tcp_handle = register_dissector("dlm3.tcp", dissect_tcp_dlm3, proto_dlm3);
1820 void
1821 proto_reg_handoff_dlm3(void)
1823 dissector_add_uint_with_preference("tcp.port", TCP_PORT_DLM3, dlm3_tcp_handle);
1824 dissector_add_uint_with_preference("sctp.port", SCTP_PORT_DLM3, dlm3_sctp_handle);
1827 /* packet-dlm3.c ends here. */
1830 * Editor modelines - https://www.wireshark.org/tools/modelines.html
1832 * Local Variables:
1833 * c-basic-offset: 2
1834 * tab-width: 8
1835 * indent-tabs-mode: nil
1836 * End:
1838 * ex: set shiftwidth=2 tabstop=8 expandtab:
1839 * :indentSize=2:tabSize=8:noTabs=true: