ieee1609dot2: fix no previous prototype for function 'proto_register_ieee1609dot2...
[metze/wireshark/wip.git] / epan / dissectors / packet-dlm3.c
index 3ea6e09d69c74c762421d9b2abb71fccf3189b81..c96cbefe05a29acdd472fc04035c50502ca3791f 100644 (file)
@@ -2,25 +2,11 @@
  * Routines for dlm3 dissection
  * Copyright 2007, Masatake YAMATO <jet@gyve.org>
  *
- * $Id$
- *
  * Wireshark - Network traffic analyzer
  * By Gerald Combs <gerald@wireshark.org>
  * Copyright 1998 Gerald Combs
  *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ * SPDX-License-Identifier: GPL-2.0-or-later
  */
 
 /* This dissector supports version 3.0 of the dlm(Distributed Lock Manager)
  */
 
 
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <glib.h>
+#include "config.h"
 
 #include <epan/packet.h>
 #include <epan/prefs.h>
 
 
 
-#define TCP_PORT_DLM3           21064
+#define TCP_PORT_DLM3           21064 /* Not IANA registered */
 #define SCTP_PORT_DLM3          TCP_PORT_DLM3
 
 #define DLM3_MAJOR_VERSION      0x00030000
-#define DLM3_MINOR_VERSION      0x00000000
+#define DLM3_MINOR_VERSION_MAX  0x00000001
 
 #define DLM3_MSG                1
 #define DLM3_RCOM               2
 #define DLM3_RCOM_LOOKUP_REPLY  7
 #define DLM3_RCOM_LOCK_REPLY    8
 
+#define DLM_RSF_NEED_SLOTS      0x00000001
+
 #define DLM3_RS_NODES           0x00000001
 #define DLM3_RS_NODES_ALL       0x00000002
 #define DLM3_RS_DIR             0x00000004
 #define DLM3_RESNAME_MAXLEN     64
 
 /* Forward declaration we need below */
+void proto_register_dlm3(void);
 void proto_reg_handoff_dlm3(void);
 
 
@@ -198,28 +183,27 @@ static int hf_dlm3_m_parent_lkid  = -1;
 static int hf_dlm3_m_parent_remid = -1;
 
 /* bit fields for dlm_message::exflags */
-#define DLM3_DEFINE_HF_EXFLAGS(NAME)            \
-  static int hf_dlm3_##NAME      = -1;          \
-  static int hf_dlm3_##NAME##_noqueue     = -1; \
-  static int hf_dlm3_##NAME##_cancel      = -1; \
-  static int hf_dlm3_##NAME##_convert     = -1; \
-  static int hf_dlm3_##NAME##_valblk      = -1; \
-  static int hf_dlm3_##NAME##_quecvt      = -1; \
-  static int hf_dlm3_##NAME##_ivvalblk    = -1; \
-  static int hf_dlm3_##NAME##_convdeadlk  = -1; \
-  static int hf_dlm3_##NAME##_persistent  = -1; \
-  static int hf_dlm3_##NAME##_nodlckwt    = -1; \
-  static int hf_dlm3_##NAME##_nodlckblk   = -1; \
-  static int hf_dlm3_##NAME##_expedite    = -1; \
-  static int hf_dlm3_##NAME##_noqueuebast = -1; \
-  static int hf_dlm3_##NAME##_headque     = -1; \
-  static int hf_dlm3_##NAME##_noorder     = -1; \
-  static int hf_dlm3_##NAME##_orphan      = -1; \
-  static int hf_dlm3_##NAME##_altpr       = -1; \
-  static int hf_dlm3_##NAME##_altcw       = -1; \
-  static int hf_dlm3_##NAME##_forceunlock = -1; \
-  static int hf_dlm3_##NAME##_timeout     = -1
-DLM3_DEFINE_HF_EXFLAGS(m_exflags);
+
+static int hf_dlm3_m_exflags             = -1;
+static int hf_dlm3_m_exflags_noqueue     = -1;
+static int hf_dlm3_m_exflags_cancel      = -1;
+static int hf_dlm3_m_exflags_convert     = -1;
+static int hf_dlm3_m_exflags_valblk      = -1;
+static int hf_dlm3_m_exflags_quecvt      = -1;
+static int hf_dlm3_m_exflags_ivvalblk    = -1;
+static int hf_dlm3_m_exflags_convdeadlk  = -1;
+static int hf_dlm3_m_exflags_persistent  = -1;
+static int hf_dlm3_m_exflags_nodlckwt    = -1;
+static int hf_dlm3_m_exflags_nodlckblk   = -1;
+static int hf_dlm3_m_exflags_expedite    = -1;
+static int hf_dlm3_m_exflags_noqueuebast = -1;
+static int hf_dlm3_m_exflags_headque     = -1;
+static int hf_dlm3_m_exflags_noorder     = -1;
+static int hf_dlm3_m_exflags_orphan      = -1;
+static int hf_dlm3_m_exflags_altpr       = -1;
+static int hf_dlm3_m_exflags_altcw       = -1;
+static int hf_dlm3_m_exflags_forceunlock = -1;
+static int hf_dlm3_m_exflags_timeout     = -1;
 
 /* bit fields for dlm_message::sbflags */
 static int hf_dlm3_m_sbflags             = -1;
@@ -228,11 +212,10 @@ static int hf_dlm3_m_sbflags_valnotvalid = -1;
 static int hf_dlm3_m_sbflags_altmode     = -1;
 
 /* bit fields for dlm_message::flags */
-#define DLM3_DEFINE_HF_FLAGS(NAME)              \
-  static int hf_dlm3_##NAME          = -1;      \
-  static int hf_dlm3_##NAME##_user   = -1;      \
-  static int hf_dlm3_##NAME##_orphan = -1
-DLM3_DEFINE_HF_FLAGS(m_flags);
+
+static int hf_dlm3_m_flags          = -1;
+static int hf_dlm3_m_flags_user     = -1;
+static int hf_dlm3_m_flags_orphan   = -1;
 
 static int hf_dlm3_m_lvbseq       = -1;
 static int hf_dlm3_m_hash         = -1;
@@ -242,11 +225,9 @@ static int hf_dlm3_m_rqmode       = -1;
 static int hf_dlm3_m_bastmode     = -1;
 
 /* bit fields for dlm_message::asts */
-#define DLM3_DEFINE_HF_ASTS(NAME)                       \
-  static int hf_dlm3_##NAME##_asts         = -1;        \
-  static int hf_dlm3_##NAME##_asts_comp    = -1;        \
-  static int hf_dlm3_##NAME##_asts_bast    = -1
-DLM3_DEFINE_HF_ASTS(m);
+static int hf_dlm3_m_asts         = -1;
+static int hf_dlm3_m_asts_comp    = -1;
+static int hf_dlm3_m_asts_bast    = -1;
 
 static int hf_dlm3_m_result       = -1;
 static int hf_dlm3_m_extra        = -1;
@@ -260,30 +241,78 @@ static int hf_dlm3_rc_seq_reply = -1;
 static int hf_dlm3_rc_buf       = -1;
 
 /* fields for struct rcom_config(rf) */
-static int hf_dlm3_rf_lvblen    = -1;
-DLM3_DEFINE_HF_EXFLAGS(rf_lsflags);
-static int hf_dlm3_rf_unused    = -1;
+static int hf_dlm3_rf_lvblen              = -1;
+static int hf_dlm3_rf_lsflags             = -1;
+static int hf_dlm3_rf_lsflags_noqueue     = -1;
+static int hf_dlm3_rf_lsflags_cancel      = -1;
+static int hf_dlm3_rf_lsflags_convert     = -1;
+static int hf_dlm3_rf_lsflags_valblk      = -1;
+static int hf_dlm3_rf_lsflags_quecvt      = -1;
+static int hf_dlm3_rf_lsflags_ivvalblk    = -1;
+static int hf_dlm3_rf_lsflags_convdeadlk  = -1;
+static int hf_dlm3_rf_lsflags_persistent  = -1;
+static int hf_dlm3_rf_lsflags_nodlckwt    = -1;
+static int hf_dlm3_rf_lsflags_nodlckblk   = -1;
+static int hf_dlm3_rf_lsflags_expedite    = -1;
+static int hf_dlm3_rf_lsflags_noqueuebast = -1;
+static int hf_dlm3_rf_lsflags_headque     = -1;
+static int hf_dlm3_rf_lsflags_noorder     = -1;
+static int hf_dlm3_rf_lsflags_orphan      = -1;
+static int hf_dlm3_rf_lsflags_altpr       = -1;
+static int hf_dlm3_rf_lsflags_altcw       = -1;
+static int hf_dlm3_rf_lsflags_forceunlock = -1;
+static int hf_dlm3_rf_lsflags_timeout     = -1;
+static int hf_dlm3_rf_unused              = -1;
+
+/* fields for struct rcom_status(rs) */
+static int hf_dlm3_rs_flags      = -1;
+static int hf_dlm3_rs_flags_need_slots  = -1;
+static int hf_dlm3_rs_unused1    = -1;
+static int hf_dlm3_rs_unused2    = -1;
 
 /* fields for struct rcom_lock(rl) */
-static int hf_dlm3_rl_ownpid        = -1;
-static int hf_dlm3_rl_lkid          = -1;
-static int hf_dlm3_rl_remid         = -1;
-static int hf_dlm3_rl_parent_lkid   = -1;
-static int hf_dlm3_rl_parent_remid  = -1;
-DLM3_DEFINE_HF_EXFLAGS(rl_exflags);
-DLM3_DEFINE_HF_FLAGS(rl_flags);
-static int hf_dlm3_rl_lvbseq        = -1;
-static int hf_dlm3_rl_result        = -1;
-static int hf_dlm3_rl_rqmode        = -1;
-static int hf_dlm3_rl_grmode        = -1;
-static int hf_dlm3_rl_status        = -1;
-DLM3_DEFINE_HF_ASTS(rl);
-static int hf_dlm3_rl_wait_type     = -1;
-static int hf_dlm3_rl_namelen       = -1;
-static int hf_dlm3_rl_name          = -1;
-static int hf_dlm3_rl_name_contents = -1;
-static int hf_dlm3_rl_name_padding  = -1;
-static int hf_dlm3_rl_lvb           = -1;
+static int hf_dlm3_rl_ownpid              = -1;
+static int hf_dlm3_rl_lkid                = -1;
+static int hf_dlm3_rl_remid               = -1;
+static int hf_dlm3_rl_parent_lkid         = -1;
+static int hf_dlm3_rl_parent_remid        = -1;
+static int hf_dlm3_rl_exflags             = -1;
+static int hf_dlm3_rl_exflags_noqueue     = -1;
+static int hf_dlm3_rl_exflags_cancel      = -1;
+static int hf_dlm3_rl_exflags_convert     = -1;
+static int hf_dlm3_rl_exflags_valblk      = -1;
+static int hf_dlm3_rl_exflags_quecvt      = -1;
+static int hf_dlm3_rl_exflags_ivvalblk    = -1;
+static int hf_dlm3_rl_exflags_convdeadlk  = -1;
+static int hf_dlm3_rl_exflags_persistent  = -1;
+static int hf_dlm3_rl_exflags_nodlckwt    = -1;
+static int hf_dlm3_rl_exflags_nodlckblk   = -1;
+static int hf_dlm3_rl_exflags_expedite    = -1;
+static int hf_dlm3_rl_exflags_noqueuebast = -1;
+static int hf_dlm3_rl_exflags_headque     = -1;
+static int hf_dlm3_rl_exflags_noorder     = -1;
+static int hf_dlm3_rl_exflags_orphan      = -1;
+static int hf_dlm3_rl_exflags_altpr       = -1;
+static int hf_dlm3_rl_exflags_altcw       = -1;
+static int hf_dlm3_rl_exflags_forceunlock = -1;
+static int hf_dlm3_rl_exflags_timeout     = -1;
+static int hf_dlm3_rl_flags               = -1;
+static int hf_dlm3_rl_flags_user          = -1;
+static int hf_dlm3_rl_flags_orphan        = -1;
+static int hf_dlm3_rl_lvbseq              = -1;
+static int hf_dlm3_rl_result              = -1;
+static int hf_dlm3_rl_rqmode              = -1;
+static int hf_dlm3_rl_grmode              = -1;
+static int hf_dlm3_rl_status              = -1;
+static int hf_dlm3_rl_asts                = -1;
+static int hf_dlm3_rl_asts_comp           = -1;
+static int hf_dlm3_rl_asts_bast           = -1;
+static int hf_dlm3_rl_wait_type           = -1;
+static int hf_dlm3_rl_namelen             = -1;
+static int hf_dlm3_rl_name                = -1;
+static int hf_dlm3_rl_name_contents       = -1;
+static int hf_dlm3_rl_name_padding        = -1;
+static int hf_dlm3_rl_lvb                 = -1;
 
 /* Initialize the subtree pointers */
 static gint ett_dlm3         = -1;
@@ -296,9 +325,12 @@ static gint ett_dlm3_m_flags   = -1;
 static gint ett_dlm3_m_asts    = -1;
 
 static gint ett_dlm3_rcom        = -1;
+static gint ett_dlm3_rcom_status = -1;
 static gint ett_dlm3_rcom_lock   = -1;
 static gint ett_dlm3_rcom_config = -1;
 
+static gint ett_dlm3_rs_flags  = -1;
+
 static gint ett_dlm3_rf_lsflags  = -1;
 static gint ett_dlm3_rl_exflags  = -1;
 static gint ett_dlm3_rl_flags    = -1;
@@ -307,7 +339,6 @@ static gint ett_dlm3_rl_name     = -1;
 
 
 /* configurable parameters */
-static guint dlm3_tcp_port  = TCP_PORT_DLM3;
 static guint dlm3_sctp_port = SCTP_PORT_DLM3;
 
 /*
@@ -399,59 +430,111 @@ static const value_string dlm3_rs[] = {
 /*
  * Fields
  */
-#define DLM3_DEFINE_EXFLAGS_FIELDS(NAME)        \
-  static const int* NAME##_fields[] = {         \
-    &hf_dlm3_##NAME##_timeout ,                 \
-    &hf_dlm3_##NAME##_forceunlock ,             \
-    &hf_dlm3_##NAME##_altcw       ,             \
-    &hf_dlm3_##NAME##_altpr       ,             \
-    &hf_dlm3_##NAME##_orphan      ,             \
-    &hf_dlm3_##NAME##_noorder     ,             \
-    &hf_dlm3_##NAME##_headque     ,             \
-    &hf_dlm3_##NAME##_noqueuebast ,             \
-    &hf_dlm3_##NAME##_expedite    ,             \
-    &hf_dlm3_##NAME##_nodlckblk   ,             \
-    &hf_dlm3_##NAME##_nodlckwt    ,             \
-    &hf_dlm3_##NAME##_persistent  ,             \
-    &hf_dlm3_##NAME##_convdeadlk  ,             \
-    &hf_dlm3_##NAME##_ivvalblk    ,             \
-    &hf_dlm3_##NAME##_quecvt      ,             \
-    &hf_dlm3_##NAME##_valblk      ,             \
-    &hf_dlm3_##NAME##_convert     ,             \
-    &hf_dlm3_##NAME##_cancel      ,             \
-    &hf_dlm3_##NAME##_noqueue     ,             \
-    NULL                                        \
-  }
-DLM3_DEFINE_EXFLAGS_FIELDS(m_exflags);
+
+static const int *m_exflags_fields[] = {
+  &hf_dlm3_m_exflags_timeout,
+  &hf_dlm3_m_exflags_forceunlock,
+  &hf_dlm3_m_exflags_altcw,
+  &hf_dlm3_m_exflags_altpr,
+  &hf_dlm3_m_exflags_orphan,
+  &hf_dlm3_m_exflags_noorder,
+  &hf_dlm3_m_exflags_headque,
+  &hf_dlm3_m_exflags_noqueuebast,
+  &hf_dlm3_m_exflags_expedite,
+  &hf_dlm3_m_exflags_nodlckblk,
+  &hf_dlm3_m_exflags_nodlckwt,
+  &hf_dlm3_m_exflags_persistent,
+  &hf_dlm3_m_exflags_convdeadlk,
+  &hf_dlm3_m_exflags_ivvalblk,
+  &hf_dlm3_m_exflags_quecvt,
+  &hf_dlm3_m_exflags_valblk,
+  &hf_dlm3_m_exflags_convert,
+  &hf_dlm3_m_exflags_cancel,
+  &hf_dlm3_m_exflags_noqueue,
+  NULL
+};
+
+static const int *rs_flags_fields[] = {
+  &hf_dlm3_rs_flags_need_slots,
+  NULL
+};
 
 static const int *m_sbflags_fields[] = {
-  &hf_dlm3_m_sbflags_altmode     ,
-  &hf_dlm3_m_sbflags_valnotvalid ,
-  &hf_dlm3_m_sbflags_demoted     ,
+  &hf_dlm3_m_sbflags_altmode,
+  &hf_dlm3_m_sbflags_valnotvalid,
+  &hf_dlm3_m_sbflags_demoted,
   NULL
 };
 
-#define DLM3_DEFINE_FLAGS_FIELDS(NAME)          \
-  static const int* NAME##_fields[] = {         \
-    &hf_dlm3_##NAME##_orphan        ,           \
-    &hf_dlm3_##NAME##_user          ,           \
-    NULL                                        \
-  }
-DLM3_DEFINE_FLAGS_FIELDS(m_flags);
+static const int *m_flags_fields[] = {
+  &hf_dlm3_m_flags_orphan,
+  &hf_dlm3_m_flags_user,
+  NULL
+};
 
-#define DLM3_DEFINE_ASTS_FIELDS(NAME)           \
-  static const int* NAME##_asts_fields[] = {    \
-    &hf_dlm3_##NAME##_asts_bast           ,     \
-    &hf_dlm3_##NAME##_asts_comp           ,     \
-    NULL                                        \
-  }
-DLM3_DEFINE_ASTS_FIELDS(m);
+static const int *m_asts_fields[] = {
+  &hf_dlm3_m_asts_bast,
+  &hf_dlm3_m_asts_comp,
+  NULL
+};
 
-DLM3_DEFINE_EXFLAGS_FIELDS(rf_lsflags);
+static const int *rf_lsflags_fields[] = {
+  &hf_dlm3_rf_lsflags_timeout,
+  &hf_dlm3_rf_lsflags_forceunlock,
+  &hf_dlm3_rf_lsflags_altcw,
+  &hf_dlm3_rf_lsflags_altpr,
+  &hf_dlm3_rf_lsflags_orphan,
+  &hf_dlm3_rf_lsflags_noorder,
+  &hf_dlm3_rf_lsflags_headque,
+  &hf_dlm3_rf_lsflags_noqueuebast,
+  &hf_dlm3_rf_lsflags_expedite,
+  &hf_dlm3_rf_lsflags_nodlckblk,
+  &hf_dlm3_rf_lsflags_nodlckwt,
+  &hf_dlm3_rf_lsflags_persistent,
+  &hf_dlm3_rf_lsflags_convdeadlk,
+  &hf_dlm3_rf_lsflags_ivvalblk,
+  &hf_dlm3_rf_lsflags_quecvt,
+  &hf_dlm3_rf_lsflags_valblk,
+  &hf_dlm3_rf_lsflags_convert,
+  &hf_dlm3_rf_lsflags_cancel,
+  &hf_dlm3_rf_lsflags_noqueue,
+  NULL
+};
 
-DLM3_DEFINE_EXFLAGS_FIELDS(rl_exflags);
-DLM3_DEFINE_FLAGS_FIELDS(rl_flags);
-DLM3_DEFINE_ASTS_FIELDS(rl);
+static const int *rl_exflags_fields[] = {
+  &hf_dlm3_rl_exflags_timeout,
+  &hf_dlm3_rl_exflags_forceunlock,
+  &hf_dlm3_rl_exflags_altcw,
+  &hf_dlm3_rl_exflags_altpr,
+  &hf_dlm3_rl_exflags_orphan,
+  &hf_dlm3_rl_exflags_noorder,
+  &hf_dlm3_rl_exflags_headque,
+  &hf_dlm3_rl_exflags_noqueuebast,
+  &hf_dlm3_rl_exflags_expedite,
+  &hf_dlm3_rl_exflags_nodlckblk,
+  &hf_dlm3_rl_exflags_nodlckwt,
+  &hf_dlm3_rl_exflags_persistent,
+  &hf_dlm3_rl_exflags_convdeadlk,
+  &hf_dlm3_rl_exflags_ivvalblk,
+  &hf_dlm3_rl_exflags_quecvt,
+  &hf_dlm3_rl_exflags_valblk,
+  &hf_dlm3_rl_exflags_convert,
+  &hf_dlm3_rl_exflags_cancel,
+  &hf_dlm3_rl_exflags_noqueue,
+  NULL
+};
+
+static const int *rl_flags_fields[] = {
+  &hf_dlm3_rl_flags_orphan,
+  &hf_dlm3_rl_flags_user,
+  NULL
+};
+
+static const int *rl_asts_fields[] = {
+  &hf_dlm3_rl_asts_bast,
+  &hf_dlm3_rl_asts_comp,
+  NULL
+};
 
 /* Code to actually dissect the packets */
 static void
@@ -465,9 +548,9 @@ dissect_dlm3_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
                       hf_dlm3_m_type, tvb, offset, 4, m_type);
   col_append_fstr(pinfo->cinfo, COL_INFO,
                 ": %s",
-                val_to_str(m_type,
-                           dlm3_msg,
-                           "Unknown"));
+                val_to_str_const(m_type,
+                                 dlm3_msg,
+                                 "Unknown"));
 
   offset += 4;
   proto_tree_add_item(tree,
@@ -550,11 +633,32 @@ dissect_dlm3_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
                         tvb,
                         offset,
                         -1,
-                        ENC_LITTLE_ENDIAN);
+                        ENC_NA);
   }
 }
 
 
+static void
+dissect_dlm3_rcom_status(tvbuff_t *tvb, proto_tree *tree,
+                         guint length, int offset)
+{
+  if ((length - offset) < ( 4 * 2 + 8 ))
+    return;
+
+
+  proto_tree_add_bitmask(tree, tvb, offset,
+                         hf_dlm3_rs_flags, ett_dlm3_rs_flags,
+                         rs_flags_fields, ENC_LITTLE_ENDIAN);
+
+  offset += 4;
+  proto_tree_add_item(tree,
+                      hf_dlm3_rs_unused1, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+
+  offset += 4;
+  proto_tree_add_item(tree,
+                      hf_dlm3_rs_unused2, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+}
+
 
 static void
 dissect_dlm3_rcom_lock(tvbuff_t *tvb, proto_tree *tree,
@@ -639,28 +743,32 @@ dissect_dlm3_rcom_lock(tvbuff_t *tvb, proto_tree *tree,
                       namelen);
 
   offset += 2;
-  sub_item = proto_tree_add_item(tree,
-                                 hf_dlm3_rl_name, tvb, offset,
-                                 DLM3_RESNAME_MAXLEN, ENC_LITTLE_ENDIAN);
-
-  sub_tree = proto_item_add_subtree(sub_item,
-                                    ett_dlm3_rl_name);
-  sub_offset = offset;
-  proto_tree_add_item(sub_tree,
-                      hf_dlm3_rl_name_contents, tvb, sub_offset,
-                      namelen, ENC_LITTLE_ENDIAN);
+  if (namelen <= DLM3_RESNAME_MAXLEN) {
+    sub_item = proto_tree_add_item(tree,
+                                   hf_dlm3_rl_name, tvb, offset,
+                                   DLM3_RESNAME_MAXLEN, ENC_NA);
 
-  sub_offset += namelen;
-  proto_tree_add_item(sub_tree,
-                      hf_dlm3_rl_name_padding, tvb, sub_offset,
-                      DLM3_RESNAME_MAXLEN - namelen, ENC_LITTLE_ENDIAN);
+    sub_tree = proto_item_add_subtree(sub_item,
+                                      ett_dlm3_rl_name);
+    sub_offset = offset;
+    proto_tree_add_item(sub_tree,
+                        hf_dlm3_rl_name_contents, tvb, sub_offset,
+                        namelen, ENC_ASCII|ENC_NA);
+
+    sub_offset += namelen;
+    proto_tree_add_item(sub_tree,
+                        hf_dlm3_rl_name_padding, tvb, sub_offset,
+                        DLM3_RESNAME_MAXLEN - namelen, ENC_NA);
+  } else {
+    /* XXX - report an error */
+  }
 
   offset += DLM3_RESNAME_MAXLEN;
   if (((length - offset) > 0) && (exflags & DLM3_LKF_VALBLK))
     proto_tree_add_item(tree,
                         hf_dlm3_rl_lvb, tvb, offset,
                         -1,
-                        ENC_LITTLE_ENDIAN);
+                        ENC_NA);
 }
 
 
@@ -684,13 +792,13 @@ dissect_dlm3_rcom_config(tvbuff_t *tvb, proto_tree *tree,
                       hf_dlm3_rf_unused, tvb, offset, 8, ENC_LITTLE_ENDIAN);
 
 
-  offset += 8;
+  /*offset += 8;*/
   /* END */
 }
 
 static void
 dissect_dlm3_rcom(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
-                  guint length, int offset)
+                  guint length, int offset, guint32 h_version)
 {
   guint32     rc_type;
 
@@ -703,9 +811,9 @@ dissect_dlm3_rcom(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
                       hf_dlm3_rc_type, tvb, offset, 4, rc_type);
   col_append_fstr(pinfo->cinfo, COL_INFO,
                   ": %s",
-                  val_to_str(rc_type,
-                             dlm3_rcom,
-                             "Unknown"));
+                  val_to_str_const(rc_type,
+                                   dlm3_rcom,
+                                   "Unknown"));
 
   offset += 4;
   proto_tree_add_item(tree,
@@ -735,10 +843,14 @@ dissect_dlm3_rcom(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
                                  tvb,
                                  offset,
                                  -1,
-                                 ENC_LITTLE_ENDIAN);
+                                 ENC_NA);
 
   offset += 0;
-  if (rc_type == DLM3_RCOM_LOCK) {
+  if (rc_type == DLM3_RCOM_STATUS && (h_version & 0xffff) > 0) {
+    sub_tree = proto_item_add_subtree(sub_item,
+                                      ett_dlm3_rcom_status);
+    dissect_dlm3_rcom_status(tvb, sub_tree, length, offset);
+  } else if (rc_type == DLM3_RCOM_LOCK) {
     sub_tree = proto_item_add_subtree(sub_item,
                                       ett_dlm3_rcom_lock);
     dissect_dlm3_rcom_lock(tvb, sub_tree, length, offset);
@@ -751,7 +863,7 @@ dissect_dlm3_rcom(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
 }
 
 static int
-dissect_dlm3(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
+dissect_dlm3(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void *data _U_)
 {
   proto_item *item, *sub_item;
   proto_tree *tree, *sub_tree;
@@ -763,13 +875,14 @@ dissect_dlm3(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
 
 
   /* Check that there's enough data */
-  length = tvb_length(tvb);
+  length = tvb_captured_length(tvb);
   if (length < 4 + 4 + 4 + 2 + 1 + 1)
     return 0;
 
   /* Check the protocol version  */
   h_version = tvb_get_letohl(tvb, 0);
-  if (h_version != (DLM3_MAJOR_VERSION|DLM3_MINOR_VERSION))
+  if ((h_version & 0xffff0000) != DLM3_MAJOR_VERSION ||
+      (h_version & 0xffff) > DLM3_MINOR_VERSION_MAX)
     return 0;
 
   /* Check the command */
@@ -794,11 +907,11 @@ dissect_dlm3(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
                            dlm3_cmd,
                            "packet-dlm3.c internal bug"));
 
-  if (parent_tree) {
+  /* if (parent_tree) */ {
     offset = 0;
 
     item = proto_tree_add_item(parent_tree, proto_dlm3, tvb, offset,
-                               -1, ENC_LITTLE_ENDIAN);
+                               -1, ENC_NA);
     tree = proto_item_add_subtree(item, ett_dlm3);
 
     sub_item = proto_tree_add_uint(tree,
@@ -839,144 +952,15 @@ dissect_dlm3(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
       dissect_dlm3_msg(tvb, pinfo, sub_tree, length, offset);
     } else if (h_cmd== DLM3_RCOM) {
       sub_tree = proto_item_add_subtree(sub_item, ett_dlm3_rcom);
-      dissect_dlm3_rcom(tvb, pinfo, sub_tree, length, offset);
+      dissect_dlm3_rcom(tvb, pinfo, sub_tree, length, offset, h_version);
     }
   }
-  return tvb_length(tvb);
+  return tvb_captured_length(tvb);
 }
 
 
 /* Register the protocol with Wireshark */
 
-#define DLM3_REGISTER_HF_LOCKID(NAME)                                   \
-  { &hf_dlm3_##NAME##_lkid,                                             \
-      { "Lock ID on Sender", "dlm3." #NAME ".lkid",                     \
-          FT_UINT32, BASE_DEC_HEX, NULL, 0x0,                           \
-          NULL, HFILL}},                                                \
-{ &hf_dlm3_##NAME##_remid,                                              \
-    { "Lock ID on Receiver", "dlm3." #NAME ".remid",                    \
-        FT_UINT32, BASE_DEC_HEX, NULL, 0x0,                             \
-        NULL, HFILL}},                                                  \
-{ &hf_dlm3_##NAME##_parent_lkid,                                        \
-    { "Parent Lock ID on Sender", "dlm3." #NAME ".parent_lkid",         \
-        FT_UINT32, BASE_DEC_HEX, NULL, 0x0,                             \
-        NULL, HFILL}},                                                  \
-{ &hf_dlm3_##NAME##_parent_remid,                                       \
-    { "Parent Lock ID on Receiver", "dlm3." #NAME ".parent_remid",      \
-        FT_UINT32, BASE_DEC_HEX, NULL, 0x0,                             \
-        NULL, HFILL}}
-
-#define DLM3_REGISTER_HF_EXFLAGS(SYMNAME,STRNAME)                       \
-{ &hf_dlm3_##SYMNAME,                                                   \
-  { "External Flags", "dlm3." STRNAME "",                               \
-    FT_UINT32, BASE_HEX, NULL, 0x0,                                     \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_noqueue,                                         \
-  { "Don't queue", "dlm3." STRNAME ".noqueue",                          \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUE,                             \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_cancel,                                          \
-  { "Cancel", "dlm3." STRNAME ".cancel",                                \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_CANCEL,                              \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_convert,                                         \
-  { "Convert", "dlm3." STRNAME ".convert",                              \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVERT,                             \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_valblk,                                          \
-  { "Return the contents of the lock value block", "dlm3." STRNAME ".valblk", \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_VALBLK,                              \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_quecvt,                                          \
-  { "Force a conversion request to be queued", "dlm3." STRNAME ".quecvt", \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_QUECVT,                              \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_ivvalblk,                                        \
-  { "Invalidate the lock value block", "dlm3." STRNAME ".ivvalblk",     \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_IVVALBLK,                            \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_convdeadlk,                                      \
-  { "Forced down to NL to resolve a conversion deadlock", "dlm3." STRNAME ".convdeadlk", \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVDEADLK,                          \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_persistent,                                      \
-  { "Persistent", "dlm3." STRNAME ".persistent",                        \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_PERSISTENT,                          \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_nodlckwt,                                        \
-  { "Don't cancel the lock if it gets into conversion deadlock", "dlm3." STRNAME ".nodlckwt", \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKWT,                            \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_nodlckblk,                                       \
-  { "Nodlckblk", "dlm3." STRNAME ".nodlckblk",                          \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKBLK,                           \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_expedite,                                        \
-  { "Grant a NL lock immediately", "dlm3." STRNAME ".expedite",         \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_EXPEDITE,                            \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_noqueuebast,                                     \
-  { "Send blocking ASTs even for NOQUEUE operations", "dlm3." STRNAME ".noqueuebast", \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUEBAST,                         \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_headque,                                         \
-  { "Add a lock to the head of the queue", "dlm3." STRNAME ".headque",  \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_HEADQUE,                             \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_noorder,                                         \
-  { "Disregard the standard grant order rules", "dlm3." STRNAME ".noorder", \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_NOORDER,                             \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_orphan,                                          \
-  { "Orphan", "dlm3." STRNAME ".orphan",                                \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_ORPHAN,                              \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_altpr,                                           \
-  { "Try to grant the lock in `protected read' mode", "dlm3." STRNAME ".altpr", \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTPR,                               \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_altcw,                                           \
-  { "Try to grant the lock in `concurrent read' mode", "dlm3." STRNAME ".altcw", \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTCW,                               \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_forceunlock,                                     \
-  { "Force unlock", "dlm3." STRNAME ".forceunlock",                     \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_FORCEUNLOCK,                         \
-    NULL, HFILL}},                                                      \
-{ &hf_dlm3_##SYMNAME##_timeout,                                         \
-  { "Timeout", "dlm3." STRNAME ".timeout",                              \
-    FT_BOOLEAN, 32, NULL, DLM3_LKF_TIMEOUT,                             \
-    NULL, HFILL}}
-
-
-#define DLM3_REGISTER_HF_FLAGS(SYMNAME,STRNAME)         \
-{ &hf_dlm3_##SYMNAME,                                   \
-  { "Internal Flags", "dlm3." STRNAME,                  \
-    FT_UINT32, BASE_HEX, NULL, 0x0,                     \
-    NULL, HFILL}},                                      \
-{ &hf_dlm3_##SYMNAME##_user,                            \
-  { "User space lock realted", "dlm3." STRNAME ".user", \
-    FT_BOOLEAN, 32, NULL, DLM3_IFL_USER,                \
-    NULL, HFILL}},                                      \
-{ &hf_dlm3_##SYMNAME##_orphan,                          \
-  { "Orphaned lock", "dlm3." STRNAME ".orphan",         \
-    FT_BOOLEAN, 32, NULL, DLM3_IFL_ORPHAN,              \
-    NULL, HFILL}}
-
-#define DLM3_REGISTER_HF_ASTS(NAME,SIZE)         \
-{ &hf_dlm3_##NAME##_asts,                        \
-  { "Asynchronous Traps", "dlm3." #NAME ".asts", \
-    FT_UINT##SIZE, BASE_HEX, NULL, 0x0,           \
-    NULL, HFILL}},                               \
-{ &hf_dlm3_##NAME##_asts_comp,                   \
-  { "Completion", "dlm3." #NAME ".asts.comp",    \
-    FT_BOOLEAN, SIZE, NULL, DLM3_AST_COMP,       \
-    NULL, HFILL }},                              \
-{ &hf_dlm3_##NAME##_asts_bast,                   \
-  { "Blocking", "dlm3." #NAME ".asts.bast",      \
-    FT_BOOLEAN, SIZE, NULL, DLM3_AST_BAST,       \
-    NULL, HFILL }}
-
 void
 proto_register_dlm3(void)
 {
@@ -1031,11 +1015,103 @@ proto_register_dlm3(void)
       { "Process ID of Lock Owner", "dlm3.m.pid",
         FT_UINT32, BASE_DEC, NULL, 0x0,
         NULL, HFILL }},
-    DLM3_REGISTER_HF_LOCKID(m),
-
+    { &hf_dlm3_m_lkid,
+      { "Lock ID on Sender", "dlm3.m.lkid",
+        FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
+        NULL, HFILL}},
+    { &hf_dlm3_m_remid,
+      { "Lock ID on Receiver", "dlm3.m.remid",
+        FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
+        NULL, HFILL}},
+    { &hf_dlm3_m_parent_lkid,
+      { "Parent Lock ID on Sender", "dlm3.m.parent_lkid",
+        FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
+        NULL, HFILL}},
+    { &hf_dlm3_m_parent_remid,
+      { "Parent Lock ID on Receiver", "dlm3.m.parent_remid",
+        FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
+        NULL, HFILL}},
     /* dlm_message::exflags */
-    DLM3_REGISTER_HF_EXFLAGS(m_exflags, "m.exflags"),
-
+    { &hf_dlm3_m_exflags,
+      { "External Flags", "dlm3.m.exflags",
+        FT_UINT32, BASE_HEX, NULL, 0x0,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_noqueue,
+      { "Don't queue", "dlm3.m.exflags.noqueue",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUE,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_cancel,
+      { "Cancel", "dlm3.m.exflags.cancel",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_CANCEL,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_convert,
+      { "Convert", "dlm3.m.exflags.convert",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVERT,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_valblk,
+      { "Return the contents of the lock value block", "dlm3.m.exflags.valblk",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_VALBLK,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_quecvt,
+      { "Force a conversion request to be queued", "dlm3.m.exflags.quecvt",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_QUECVT,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_ivvalblk,
+      { "Invalidate the lock value block", "dlm3.m.exflags.ivvalblk",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_IVVALBLK,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_convdeadlk,
+      { "Forced down to NL to resolve a conversion deadlock", "dlm3.m.exflags.convdeadlk",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVDEADLK,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_persistent,
+      { "Persistent", "dlm3.m.exflags.persistent",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_PERSISTENT,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_nodlckwt,
+      { "Don't cancel the lock if it gets into conversion deadlock", "dlm3.m.exflags.nodlckwt",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKWT,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_nodlckblk,
+      { "Nodlckblk", "dlm3.m.exflags.nodlckblk",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKBLK,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_expedite,
+      { "Grant a NL lock immediately", "dlm3.m.exflags.expedite",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_EXPEDITE,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_noqueuebast,
+      { "Send blocking ASTs even for NOQUEUE operations", "dlm3.m.exflags.noqueuebast",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUEBAST,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_headque,
+      { "Add a lock to the head of the queue", "dlm3.m.exflags.headque",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_HEADQUE,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_noorder,
+      { "Disregard the standard grant order rules", "dlm3.m.exflags.noorder",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_NOORDER,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_orphan,
+      { "Orphan", "dlm3.m.exflags.orphan",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_ORPHAN,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_altpr,
+      { "Try to grant the lock in `protected read' mode", "dlm3.m.exflags.altpr",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTPR,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_altcw,
+      { "Try to grant the lock in `concurrent read' mode", "dlm3.m.exflags.altcw",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTCW,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_forceunlock,
+      { "Force unlock", "dlm3.m.exflags.forceunlock",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_FORCEUNLOCK,
+        NULL, HFILL}},
+    { &hf_dlm3_m_exflags_timeout,
+      { "Timeout", "dlm3.m.exflags.timeout",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_TIMEOUT,
+        NULL, HFILL}},
     /* dlm_message::sbflags */
     { &hf_dlm3_m_sbflags,
       { "Status Block Flags", "dlm3.m.sbflags",
@@ -1055,7 +1131,18 @@ proto_register_dlm3(void)
         NULL, HFILL}},
 
     /* dlm_message::flags */
-    DLM3_REGISTER_HF_FLAGS(m_flags, "m.flags"),
+    { &hf_dlm3_m_flags,
+      { "Internal Flags", "dlm3.m.flags",
+        FT_UINT32, BASE_HEX, NULL, 0x0,
+        NULL, HFILL}},
+    { &hf_dlm3_m_flags_user,
+      { "User space lock realted", "dlm3.m.flags.user",
+        FT_BOOLEAN, 32, NULL, DLM3_IFL_USER,
+        NULL, HFILL}},
+    { &hf_dlm3_m_flags_orphan,
+      { "Orphaned lock", "dlm3.m.flags.orphan",
+        FT_BOOLEAN, 32, NULL, DLM3_IFL_ORPHAN,
+        NULL, HFILL}},
 
     { &hf_dlm3_m_lvbseq,
       { "Lock Value Block Sequence Number", "dlm3.m.lvbseq",
@@ -1086,7 +1173,18 @@ proto_register_dlm3(void)
         NULL, HFILL}},
 
     /* dlm_message::asts */
-    DLM3_REGISTER_HF_ASTS(m, 32),
+    { &hf_dlm3_m_asts,
+      { "Asynchronous Traps", "dlm3.m.asts",
+        FT_UINT32, BASE_HEX, NULL, 0x0,
+        NULL, HFILL}},
+    { &hf_dlm3_m_asts_comp,
+      { "Completion", "dlm3.m.asts.comp",
+        FT_BOOLEAN, 32, NULL, DLM3_AST_COMP,
+        NULL, HFILL }},
+    { &hf_dlm3_m_asts_bast,
+      { "Blocking", "dlm3.m.asts.bast",
+        FT_BOOLEAN, 32, NULL, DLM3_AST_BAST,
+        NULL, HFILL }},
 
     { &hf_dlm3_m_result,
       { "Message Result(errno)", "dlm3.m.result",
@@ -1130,10 +1228,107 @@ proto_register_dlm3(void)
         NULL, HFILL}},
 
     /* rcom_config::rf_lsflags */
-    DLM3_REGISTER_HF_EXFLAGS(rf_lsflags, "rf.lsflags"),
+    { &hf_dlm3_rf_lsflags,
+      { "External Flags", "dlm3.rf.lsflags",
+        FT_UINT32, BASE_HEX, NULL, 0x0,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_noqueue,
+      { "Don't queue", "dlm3.rf.lsflags.noqueue",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUE,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_cancel,
+      { "Cancel", "dlm3.rf.lsflags.cancel",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_CANCEL,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_convert,
+      { "Convert", "dlm3.rf.lsflags.convert",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVERT,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_valblk,
+      { "Return the contents of the lock value block", "dlm3.rf.lsflags.valblk",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_VALBLK,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_quecvt,
+      { "Force a conversion request to be queued", "dlm3.rf.lsflags.quecvt",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_QUECVT,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_ivvalblk,
+      { "Invalidate the lock value block", "dlm3.rf.lsflags.ivvalblk",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_IVVALBLK,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_convdeadlk,
+      { "Forced down to NL to resolve a conversion deadlock", "dlm3.rf.lsflags.convdeadlk",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVDEADLK,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_persistent,
+      { "Persistent", "dlm3.rf.lsflags.persistent",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_PERSISTENT,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_nodlckwt,
+      { "Don't cancel the lock if it gets into conversion deadlock", "dlm3.rf.lsflags.nodlckwt",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKWT,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_nodlckblk,
+      { "Nodlckblk", "dlm3.rf.lsflags.nodlckblk",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKBLK,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_expedite,
+      { "Grant a NL lock immediately", "dlm3.rf.lsflags.expedite",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_EXPEDITE,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_noqueuebast,
+      { "Send blocking ASTs even for NOQUEUE operations", "dlm3.rf.lsflags.noqueuebast",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUEBAST,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_headque,
+      { "Add a lock to the head of the queue", "dlm3.rf.lsflags.headque",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_HEADQUE,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_noorder,
+      { "Disregard the standard grant order rules", "dlm3.rf.lsflags.noorder",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_NOORDER,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_orphan,
+      { "Orphan", "dlm3.rf.lsflags.orphan",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_ORPHAN,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_altpr,
+      { "Try to grant the lock in `protected read' mode", "dlm3.rf.lsflags.altpr",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTPR,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_altcw,
+      { "Try to grant the lock in `concurrent read' mode", "dlm3.rf.lsflags.altcw",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTCW,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_forceunlock,
+      { "Force unlock", "dlm3.rf.lsflags.forceunlock",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_FORCEUNLOCK,
+        NULL, HFILL}},
+    { &hf_dlm3_rf_lsflags_timeout,
+      { "Timeout", "dlm3.rf.lsflags.timeout",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_TIMEOUT,
+        NULL, HFILL}},
 
     { &hf_dlm3_rf_unused,
-      { "Unsed area", "dlm3.rf.lsflags.unused",
+      { "Unused area", "dlm3.rf.lsflags.unused",
+        FT_UINT64, BASE_HEX, NULL, 0x0,
+        NULL, HFILL}},
+
+    /* rcom_status */
+    { &hf_dlm3_rs_flags,
+      { "Recovery Command Status Flags", "dlm3.rs.flags",
+        FT_UINT32, BASE_HEX, NULL, 0x0,
+        NULL, HFILL}},
+    { &hf_dlm3_rs_flags_need_slots,
+      { "Need slots", "dlm3.rs.flags.need_slots",
+        FT_UINT32, BASE_HEX, NULL, DLM_RSF_NEED_SLOTS,
+        NULL, HFILL}},
+    { &hf_dlm3_rs_unused1,
+      { "Unused area", "dlm3.rs.unused1",
+        FT_UINT32, BASE_HEX, NULL, 0x0,
+        NULL, HFILL}},
+    { &hf_dlm3_rs_unused2,
+      { "Unused area", "dlm3.rs.unused2",
         FT_UINT64, BASE_HEX, NULL, 0x0,
         NULL, HFILL}},
 
@@ -1142,10 +1337,115 @@ proto_register_dlm3(void)
       { "Process ID of Lock Owner", "dlm3.rl.ownpid",
         FT_UINT32, BASE_DEC, NULL, 0x0,
         NULL, HFILL}},
+    { &hf_dlm3_rl_lkid,
+      { "Lock ID on Sender", "dlm3.rl.lkid",
+        FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_remid,
+      { "Lock ID on Receiver", "dlm3.rl.remid",
+        FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_parent_lkid,
+      { "Parent Lock ID on Sender", "dlm3.rl.parent_lkid",
+        FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_parent_remid,
+      { "Parent Lock ID on Receiver", "dlm3.rl.parent_remid",
+        FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
+        NULL, HFILL}},
 
-    DLM3_REGISTER_HF_LOCKID(rl),
-    DLM3_REGISTER_HF_EXFLAGS(rl_exflags, "rl.exflags"),
-    DLM3_REGISTER_HF_FLAGS(rl_flags, "rl.flags"),
+    { &hf_dlm3_rl_exflags,
+      { "External Flags", "dlm3.rl.exflags",
+        FT_UINT32, BASE_HEX, NULL, 0x0,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_noqueue,
+      { "Don't queue", "dlm3.rl.exflags.noqueue",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUE,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_cancel,
+      { "Cancel", "dlm3.rl.exflags.cancel",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_CANCEL,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_convert,
+      { "Convert", "dlm3.rl.exflags.convert",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVERT,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_valblk,
+      { "Return the contents of the lock value block", "dlm3.rl.exflags.valblk",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_VALBLK,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_quecvt,
+      { "Force a conversion request to be queued", "dlm3.rl.exflags.quecvt",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_QUECVT,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_ivvalblk,
+      { "Invalidate the lock value block", "dlm3.rl.exflags.ivvalblk",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_IVVALBLK,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_convdeadlk,
+      { "Forced down to NL to resolve a conversion deadlock", "dlm3.rl.exflags.convdeadlk",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_CONVDEADLK,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_persistent,
+      { "Persistent", "dlm3.rl.exflags.persistent",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_PERSISTENT,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_nodlckwt,
+      { "Don't cancel the lock if it gets into conversion deadlock", "dlm3.rl.exflags.nodlckwt",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKWT,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_nodlckblk,
+      { "Nodlckblk", "dlm3.rl.exflags.nodlckblk",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_NODLCKBLK,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_expedite,
+      { "Grant a NL lock immediately", "dlm3.rl.exflags.expedite",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_EXPEDITE,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_noqueuebast,
+      { "Send blocking ASTs even for NOQUEUE operations", "dlm3.rl.exflags.noqueuebast",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_NOQUEUEBAST,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_headque,
+      { "Add a lock to the head of the queue", "dlm3.rl.exflags.headque",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_HEADQUE,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_noorder,
+      { "Disregard the standard grant order rules", "dlm3.rl.exflags.noorder",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_NOORDER,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_orphan,
+      { "Orphan", "dlm3.rl.exflags.orphan",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_ORPHAN,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_altpr,
+      { "Try to grant the lock in `protected read' mode", "dlm3.rl.exflags.altpr",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTPR,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_altcw,
+      { "Try to grant the lock in `concurrent read' mode", "dlm3.rl.exflags.altcw",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_ALTCW,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_forceunlock,
+      { "Force unlock", "dlm3.rl.exflags.forceunlock",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_FORCEUNLOCK,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_exflags_timeout,
+      { "Timeout", "dlm3.rl.exflags.timeout",
+        FT_BOOLEAN, 32, NULL, DLM3_LKF_TIMEOUT,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_flags,
+      { "Internal Flags", "dlm3.rl.flags",
+        FT_UINT32, BASE_HEX, NULL, 0x0,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_flags_user,
+      { "User space lock realted", "dlm3.rl.flags.user",
+        FT_BOOLEAN, 32, NULL, DLM3_IFL_USER,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_flags_orphan,
+      { "Orphaned lock", "dlm3.rl.flags.orphan",
+        FT_BOOLEAN, 32, NULL, DLM3_IFL_ORPHAN,
+        NULL, HFILL}},
 
     { &hf_dlm3_rl_lvbseq,
       { "Lock Value Block Sequence Number", "dlm3.rl.lvbseq",
@@ -1167,7 +1467,18 @@ proto_register_dlm3(void)
       { "Status", "dlm3.rl.status",
         FT_INT8, BASE_DEC, VALS(dlm3_rs), 0x0,
         NULL, HFILL}},
-    DLM3_REGISTER_HF_ASTS(rl, 8),
+    { &hf_dlm3_rl_asts,
+      { "Asynchronous Traps", "dlm3.rl.asts",
+        FT_UINT8, BASE_HEX, NULL, 0x0,
+        NULL, HFILL}},
+    { &hf_dlm3_rl_asts_comp,
+      { "Completion", "dlm3.rl.asts.comp",
+        FT_BOOLEAN, 8, NULL, DLM3_AST_COMP,
+        NULL, HFILL }},
+    { &hf_dlm3_rl_asts_bast,
+      { "Blocking", "dlm3.rl.asts.bast",
+        FT_BOOLEAN, 8, NULL, DLM3_AST_BAST,
+        NULL, HFILL }},
 
     { &hf_dlm3_rl_wait_type,
       { "Message Type the waiter is waiting for", "dlm3.rl.wait_type",
@@ -1207,9 +1518,12 @@ proto_register_dlm3(void)
     &ett_dlm3_m_asts,
 
     &ett_dlm3_rcom,
+    &ett_dlm3_rcom_status,
     &ett_dlm3_rcom_lock,
     &ett_dlm3_rcom_config,
 
+    &ett_dlm3_rs_flags,
+
     &ett_dlm3_rf_lsflags,
     &ett_dlm3_rl_exflags,
     &ett_dlm3_rl_flags,
@@ -1225,11 +1539,6 @@ proto_register_dlm3(void)
   dlm3_module = prefs_register_protocol(proto_dlm3,
                                         proto_reg_handoff_dlm3);
 
-  prefs_register_uint_preference(dlm3_module, "tcp.port",
-                                 "DLM3 TCP Port",
-                                 "Set the TCP port for Distributed Lock Manager",
-                                 10,
-                                 &dlm3_tcp_port);
   prefs_register_uint_preference(dlm3_module, "sctp.port",
                                  "DLM3 SCTP Port",
                                  "Set the SCTP port for Distributed Lock Manager",
@@ -1243,25 +1552,35 @@ proto_reg_handoff_dlm3(void)
 {
   static gboolean dissector_registered = FALSE;
 
-  static guint tcp_port;
   static guint sctp_port;
 
   static dissector_handle_t dlm3_tcp_handle;
   static dissector_handle_t dlm3_sctp_handle;
 
   if (!dissector_registered) {
-    dlm3_sctp_handle = new_create_dissector_handle(dissect_dlm3, proto_dlm3);
-    dlm3_tcp_handle = new_create_dissector_handle(dissect_dlm3, proto_dlm3);
+    dlm3_sctp_handle = create_dissector_handle(dissect_dlm3, proto_dlm3);
+    dlm3_tcp_handle = create_dissector_handle(dissect_dlm3, proto_dlm3);
+    dissector_add_uint_with_preference("tcp.port", TCP_PORT_DLM3, dlm3_tcp_handle);
     dissector_registered = TRUE;
   } else {
-    dissector_delete_uint("tcp.port",  tcp_port,  dlm3_tcp_handle);
     dissector_delete_uint("sctp.port", sctp_port, dlm3_sctp_handle);
   }
 
-  tcp_port  = dlm3_tcp_port;
   sctp_port = dlm3_sctp_port;
-  dissector_add_uint("tcp.port",  tcp_port,  dlm3_tcp_handle);
   dissector_add_uint("sctp.port", sctp_port, dlm3_sctp_handle);
 }
 
 /* packet-dlm3.c ends here. */
+
+/*
+ * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
+ *
+ * Local Variables:
+ * c-basic-offset: 2
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * ex: set shiftwidth=2 tabstop=8 expandtab:
+ * :indentSize=2:tabSize=8:noTabs=true:
+ */