Coverage Report

Created: 2026-08-14 06:45

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
 */