Add HFILL to explicitly fill in some additional structure members.
[obnox/wireshark/wip.git] / packet-rsvp.c
index 8dd63cc4980072be3339ab8b2c629fbd65f7ba34..842af9ee94d9bfbae10dc20eb224f92d03f4105a 100644 (file)
@@ -3,10 +3,10 @@
  *
  * (c) Copyright Ashok Narayanan <ashokn@cisco.com>
  *
- * $Id: packet-rsvp.c,v 1.24 2000/06/02 13:24:12 gram Exp $
+ * $Id: packet-rsvp.c,v 1.46 2001/06/26 20:50:30 guy Exp $
  *
  * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@zing.org>
+ * By Gerald Combs <gerald@ethereal.com>
  * Copyright 1998 Gerald Combs
  * 
  * 
 # include <netinet/in.h>
 #endif
 
+#include <glib.h>
+
 #ifdef NEED_SNPRINTF_H
-# ifdef HAVE_STDARG_H
-#  include <stdarg.h>
-# else
-#  include <varargs.h>
-# endif
 # include "snprintf.h"
 #endif
 
-#include <glib.h>
 #include "packet.h"
-#include "packet-ip.h"
-#include "packet-ipv6.h"
+#include "in_cksum.h"
 #include "ieee-float.h"
+#include "etypes.h"
+#include "ipproto.h"
 
 static int proto_rsvp = -1;
 
@@ -99,6 +96,7 @@ static gint ett_rsvp_label = -1;
 static gint ett_rsvp_label_request = -1;
 static gint ett_rsvp_session_attribute = -1;
 static gint ett_rsvp_session_attribute_flags = -1;
+static gint ett_rsvp_hello_obj = -1;
 static gint ett_rsvp_explicit_route = -1;
 static gint ett_rsvp_explicit_route_subobj = -1;
 static gint ett_rsvp_record_route = -1;
@@ -110,9 +108,18 @@ static gint ett_rsvp_unknown_class = -1;
  * RSVP message types
  */
 typedef enum {
-    RSVP_MSG_PATH=1, RSVP_MSG_RESV, RSVP_MSG_PERR, RSVP_MSG_RERR,
-    RSVP_MSG_PTEAR, RSVP_MSG_RTEAR, RSVP_MSG_CONFIRM, 
-    RSVP_MSG_RTEAR_CONFIRM=10
+    RSVP_MSG_PATH=1, 
+    RSVP_MSG_RESV, 
+    RSVP_MSG_PERR, 
+    RSVP_MSG_RERR,
+    RSVP_MSG_PTEAR, 
+    RSVP_MSG_RTEAR, 
+    RSVP_MSG_CONFIRM, 
+    RSVP_MSG_RTEAR_CONFIRM=10,
+    RSVP_MSG_BUNDLE = 12,
+    RSVP_MSG_ACK,
+    RSVP_MSG_SREFRESH = 15,
+    RSVP_MSG_HELLO = 20
 } rsvp_message_types;
 
 static value_string message_type_vals[] = { 
@@ -123,7 +130,12 @@ static value_string message_type_vals[] = {
     {RSVP_MSG_PTEAR, "PATH TEAR Message"},
     {RSVP_MSG_RTEAR, "RESV TEAR Message"},
     {RSVP_MSG_CONFIRM, "CONFIRM Message"},
-    {RSVP_MSG_RTEAR_CONFIRM, "RESV TEAR CONFIRM Message"}
+    {RSVP_MSG_RTEAR_CONFIRM, "RESV TEAR CONFIRM Message"},
+    {RSVP_MSG_BUNDLE, "BUNDLE Message"},
+    {RSVP_MSG_ACK, "ACK Message"},
+    {RSVP_MSG_SREFRESH, "SREFRESH Message"},
+    {RSVP_MSG_HELLO, "HELLO Message"},
+    {0, NULL}
 };
 
 /* 
@@ -154,7 +166,12 @@ enum rsvp_classes {
     RSVP_CLASS_EXPLICIT_ROUTE,
     RSVP_CLASS_RECORD_ROUTE,
 
+    RSVP_CLASS_MESSAGE_ID = 23,
+    RSVP_CLASS_MESSAGE_ID_ACK,
+    RSVP_CLASS_MESSAGE_ID_LIST,
+
     RSVP_CLASS_SESSION_ATTRIBUTE=207,
+    RSVP_CLASS_HELLO = 22
 };
 
 static value_string rsvp_class_vals[] = { 
@@ -178,6 +195,11 @@ static value_string rsvp_class_vals[] = {
     {RSVP_CLASS_EXPLICIT_ROUTE, "EXPLICIT ROUTE object"},
     {RSVP_CLASS_RECORD_ROUTE, "RECORD ROUTE object"},
     {RSVP_CLASS_SESSION_ATTRIBUTE, "SESSION ATTRIBUTE object"},
+    {RSVP_CLASS_MESSAGE_ID, "MESSAGE-ID object"},
+    {RSVP_CLASS_MESSAGE_ID_ACK, "MESSAGE-ID ACK/NACK object"},
+    {RSVP_CLASS_MESSAGE_ID_LIST, "MESSAGE-ID LIST object"},
+    {RSVP_CLASS_HELLO, "HELLO object"},
+    {0, NULL}
 };
 
 /*
@@ -198,7 +220,9 @@ enum rsvp_error_types {
     RSVP_ERROR_UNKNOWN_C_TYPE,
     RSVP_ERROR_TRAFFIC = 21,
     RSVP_ERROR_TRAFFIC_SYSTEM,
-    RSVP_ERROR_SYSTEM
+    RSVP_ERROR_SYSTEM,
+    RSVP_ERROR_ROUTING,
+    RSVP_ERROR_NOTIFY
 };
 
 static value_string rsvp_error_vals[] = {
@@ -215,7 +239,11 @@ static value_string rsvp_error_vals[] = {
     {RSVP_ERROR_UNKNOWN_CLASS, "Unknown object class"},
     {RSVP_ERROR_UNKNOWN_C_TYPE, "Unknown object C-type"},
     {RSVP_ERROR_TRAFFIC, "Traffic Control Error"},
-    {RSVP_ERROR_TRAFFIC_SYSTEM, "Traffic Control System Error"}
+    {RSVP_ERROR_TRAFFIC_SYSTEM, "Traffic Control System Error"},
+    {RSVP_ERROR_SYSTEM, "RSVP System Error"},
+    {RSVP_ERROR_ROUTING, "Routing Error"},
+    {RSVP_ERROR_NOTIFY, "RSVP Notify Error"},
+    {0, NULL}
 };
 
 /*
@@ -237,165 +265,10 @@ static value_string rsvp_error_vals[] = {
 static value_string style_vals[] = {
     { RSVP_WF, "Wildcard Filter" },
     { RSVP_FF, "Fixed Filter" },
-    { RSVP_SE, "Shared-Explicit" }
+    { RSVP_SE, "Shared-Explicit" },
+    { 0,       NULL }
 };
 
-/*------------------------------*
- * Object definitions
- *------------------------------*/
-
-/*
- * Base RSVP object
- */
-typedef struct {
-    guint16 length;
-    guint8 class;      
-    guint8 type;
-    /* Data follows, as a sequence of bytes */
-} rsvp_object;
-
-/*
- * RSVP message header
- */
-
-typedef struct {
-    guint8    ver_flags;               /* RSVP Version & flags */
-    guint8    message_type;            /* type of message */
-    guint16   cksum;                   /* IP Checksum */
-    guint8    sending_ttl;             /* ttl of message */
-    guint8    reserved_byte;           /* reserved */
-    guint16   rsvp_length;             /* length of RSVP data */
-    /* Objects follow, as a sequence of "rsvp_object"s */
-} rsvp_header;
-
-/*
- * NULL object 
-*/
-typedef struct {
-    rsvp_object base;
-} rsvp_null;
-
-/*
- * SESSION object
- */
-typedef struct {
-    rsvp_object base;
-    guint32 destination;
-    guint8 protocol;
-    guint8 flags;
-    guint16 port;
-} rsvp_session_ipv4;
-
-typedef struct {
-    rsvp_object base;
-    struct e_in6_addr destination;
-    guint8 protocol;
-    guint8 flags;
-    guint16 port;
-} rsvp_session_ipv6;
-
-/*
- * HOP object
- * Can be a PHOP or a NHOP
- */
-typedef struct {
-    rsvp_object base;
-    guint32 neighbor;
-    guint32 lif_handle;
-} rsvp_hop_ipv4;
-
-typedef struct {
-    rsvp_object base;
-    struct e_in6_addr neighbor;
-    guint32 lif_handle;
-} rsvp_hop_ipv6;
-
-/*
- * TIME_VALUES object
- */
-typedef struct {
-    rsvp_object base;
-    gint32 refresh_ms;
-} rsvp_time_values;
-
-/*
- * ERROR object
- */
-typedef struct {
-    rsvp_object base;
-    guint32 error_node;
-    guint8 flags;
-    guint8 error_code;
-    guint16 error_value;
-} rsvp_error_ipv4;
-
-typedef struct {
-    rsvp_object base;
-    struct e_in6_addr error_node;
-    guint8 flags;
-    guint8 error_code;
-    guint16 error_value;
-} rsvp_error_ipv6;
-
-/*
- * CONFIRM object
- */
-typedef struct {
-    rsvp_object base;
-    guint32 receiver;
-} rsvp_confirm_ipv4;
-
-typedef struct {
-    rsvp_object base;
-    struct e_in6_addr receiver;
-} rsvp_confirm_ipv6;
-
-/*
- * SCOPE object
- */
-typedef struct {
-    rsvp_object base;
-    /* Source follows, as a sequence of 32-bit integers */
-} rsvp_scope;
-
-/*
- * STYLE object
- */
-typedef struct {
-    rsvp_object base;
-    guint32 reservation_type;
-} rsvp_style;
-
-/*
- * Defines a subset of session data packets that should receive the
- * desired QoS (specified by an FLOWSPEC object), in a RESV message.
- */
-typedef struct {
-    rsvp_object base;
-    guint32 source;                    /* source sending data */
-    guint16 unused;
-    guint16 udp_source_port;           /* port number */
-} rsvp_filter_ipv4;
-
-/*
- * Contains a sender IP address and perhaps some additional
- * demultiplexing information to identify a sender, in a PATH
- * message.
- */
-typedef struct {
-    rsvp_object base;
-    guint32 source;                    /* source sending data */
-    guint16 __reserved;
-    guint16 source_port;               /* port number */
-} rsvp_template_ipv4;
-
-typedef struct {
-    rsvp_object base;
-    struct e_in6_addr source;          /* source sending data */
-    guint16 __reserved;
-    guint16 source_port;               /* port number */
-} rsvp_template_ipv6;
-
 /*
  * Defines a desired QoS, in a RESV message.
  */
@@ -411,12 +284,14 @@ static value_string qos_vals[] = {
     { QOS_CONTROLLED_LOAD, "Controlled-load QoS" },
     { QOS_GUARANTEED, "Guaranteed rate QoS" },
     { QOS_TSPEC, "Traffic specification" },
+    { 0, NULL }
 };
 
 static value_string svc_vals[] = {
     { 127, "Token bucket TSpec" },
     { 128, "Qualitative TSpec" },
-    { 130, "Guaranteed-rate RSpec" }
+    { 130, "Guaranteed-rate RSpec" },
+    { 0, NULL }
 };
 
 enum rsvp_spec_types { INTSRV = 2 };
@@ -433,6 +308,7 @@ static value_string intsrv_services_str[] = {
     {INTSRV_GTD, "Guaranteed"},
     {INTSRV_CLOAD, "Controlled Load"},
     {INTSRV_QUALITATIVE, "Qualitative"},
+    { 0, NULL }
 };
 
 enum intsrv_field_name {
@@ -454,90 +330,6 @@ enum intsrv_field_name {
        INTSRV_SHP_MAX_JITTER   /* Gtd Parameter Dsum */
 };
 
-/*
- * Subobjects for Integrated Services
- */
-
-typedef struct {
-    guint8 service_num;
-    guint8 break_bit;
-    guint16 length;
-} service_hdr;
-
-typedef struct {                                       
-    service_hdr svchdr;
-
-    guint8     param_id;
-    guint8     flags_tspec;
-    guint16    parameter_length;
-
-    guint32    rate;
-    guint32    depth;
-    guint32    peak;
-    guint32    min_unit;
-    guint32    max_unit;
-} IS_tspec; /* RFC2210 */
-
-typedef struct {
-    service_hdr svchdr;
-    
-    guint8     param_id;
-    guint8     flags_tspec;
-    guint16    parameter_length;
-
-    guint32    max_unit;
-} QUAL_tspec; /* Qualitative */
-
-typedef struct {
-    rsvp_object base;
-    guint8     version;        
-    guint8     __reserved_;
-    guint16    length_in_words;
-
-    /* Data follows, as a sequence of bytes */
-} rsvp_tspec;
-
-typedef struct {
-    guint8     param_id;
-    guint8     flags_rspec;
-    guint16    param2_length;
-    guint32    requested_rate;
-    guint32    slack;
-} IS_rspec;
-
-typedef struct {
-    IS_tspec tspec;
-    IS_rspec rspec;
-} IS_flowspec; /* RFC 2210 */
-
-typedef struct {
-    service_hdr svchdr;
-    
-    guint8     param_id;
-    guint8     flags_tspec;
-    guint16    parameter_length;
-
-    guint32    max_unit;
-} QUAL_flowspec; /* Qualitative */
-
-
-typedef struct {
-    rsvp_object base;
-    guint8     version;        
-    guint8     __reserved_;
-    guint16    length_in_words;
-
-    /* Data follows, as a sequence of bytes */
-} rsvp_flowspec;
-                                       
-
-typedef struct {
-    guint8 id;
-    guint8 flags;
-    guint16 length;
-    guint32 dataval;
-} param_hdr;
-    
 static value_string adspec_params[] = { 
     {4, "IS Hop Count"},
     {6, "Path b/w estimate"},
@@ -547,28 +339,11 @@ static value_string adspec_params[] = {
     {134, "End-to-end composed value for D"},
     {135, "Since-last-reshaping point composed C"},
     {136, "Since-last-reshaping point composed D"},
+    { 0, NULL }
 };
 
 /* -------------------- Stuff for MPLS/TE objects -------------------- */
 
-typedef struct {
-    rsvp_object base;
-} label;               /* array of 32-bit labels follows */
-
-typedef struct {
-    rsvp_object base;
-    guint16 _reserved;
-    guint16 l3pid;
-} label_request;
-
-typedef struct {
-    rsvp_object base;
-    guint8 setup_prio;
-    guint8 hold_prio;
-    guint8 flags;
-    guint8 name_len;
-} session_attribute;   /* name follows, as string */
-
 static const value_string proto_vals[] = { {IP_PROTO_ICMP, "ICMP"},
                                            {IP_PROTO_IGMP, "IGMP"},
                                            {IP_PROTO_TCP,  "TCP" },
@@ -592,7 +367,12 @@ enum rsvp_filter_keys {
     RSVPF_JUNK_MSG8,
     RSVPF_JUNK_MSG9,
     RSVPF_RTEARCONFIRM,
-
+    RSVPF_JUNK11,
+    RSVPF_BUNDLE,
+    RSVPF_ACK,
+    RSVPF_JUNK14,
+    RSVPF_SREFRESH,
+    RSVPF_HELLO,
     /* Does the message contain an object of this type? */
     RSVPF_OBJECT,
     /* Object present shorthands */
@@ -617,9 +397,12 @@ enum rsvp_filter_keys {
     RSVPF_LABEL_REQUEST,
     RSVPF_EXPLICIT_ROUTE,
     RSVPF_RECORD_ROUTE,
-
+    RSVPF_DUMMY_4,
+    RSVPF_MESSAGE_ID,
+    RSVPF_MESSAGE_ID_ACK,
+    RSVPF_MESSAGE_ID_LIST,
+    RSVPF_HELLO_OBJ,
     RSVPF_SESSION_ATTRIBUTE,
-
     RSVPF_UNKNOWN_OBJ, 
 
     /* Session object */
@@ -644,161 +427,185 @@ static hf_register_info rsvpf_info[] = {
 
     /* Message type number */
     {&rsvp_filter[RSVPF_MSG], 
-     { "Message Type", "rsvp.msg", FT_UINT8, BASE_NONE, message_type_vals, 0x0,
-       "" }},
+     { "Message Type", "rsvp.msg", FT_UINT8, BASE_DEC, VALS(message_type_vals), 0x0,
+       "", HFILL }},
 
     /* Message type shorthands */
     {&rsvp_filter[RSVPF_PATH], 
      { "Path Message", "rsvp.path", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_HELLO], 
+     { "HELLO Message", "rsvp.hello", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_RESV], 
      { "Resv Message", "rsvp.resv", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_PATHERR], 
      { "Path Error Message", "rsvp.perr", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_RESVERR], 
      { "Resv Error Message", "rsvp.rerr", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_PATHTEAR], 
      { "Path Tear Message", "rsvp.ptear", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_RESVTEAR], 
      { "Resv Tear Message", "rsvp.rtear", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_RCONFIRM], 
      { "Resv Confirm Message", "rsvp.resvconf", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_RTEARCONFIRM], 
      { "Resv Tear Confirm Message", "rsvp.rtearconf", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
-    /* Object present */
+    /* Object class */
     {&rsvp_filter[RSVPF_OBJECT], 
-     { "", "rsvp.object", FT_UINT8, BASE_NONE, rsvp_class_vals, 0x0,
-       "" }},
+     { "Object class", "rsvp.object", FT_UINT8, BASE_DEC, VALS(rsvp_class_vals), 0x0,
+       "", HFILL }},
 
     /* Object present shorthands */
     {&rsvp_filter[RSVPF_SESSION], 
-     { "SESSION", "rsvp.session", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "SESSION", "rsvp.session", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_HOP], 
-     { "HOP", "rsvp.hop", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "HOP", "rsvp.hop", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_HELLO_OBJ], 
+     { "HELLO Request/Ack", "rsvp.hello_obj", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_INTEGRITY], 
-     { "INTEGRITY", "rsvp.integrity", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "INTEGRITY", "rsvp.integrity", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_TIME_VALUES], 
-     { "TIME VALUES", "rsvp.time", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "TIME VALUES", "rsvp.time", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_ERROR], 
-     { "ERROR", "rsvp.error", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "ERROR", "rsvp.error", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_SCOPE], 
-     { "SCOPE", "rsvp.scope", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "SCOPE", "rsvp.scope", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_STYLE], 
-     { "STYLE", "rsvp.style", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "STYLE", "rsvp.style", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_FLOWSPEC], 
-     { "FLOWSPEC", "rsvp.flowspec", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "FLOWSPEC", "rsvp.flowspec", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_FILTER_SPEC], 
-     { "FILTERSPEC", "rsvp.filter", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "FILTERSPEC", "rsvp.filter", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_SENDER], 
-     { "SENDER TEMPLATE", "rsvp.sender", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "SENDER TEMPLATE", "rsvp.sender", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_TSPEC], 
-     { "SENDER TSPEC", "rsvp.tspec", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "SENDER TSPEC", "rsvp.tspec", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_ADSPEC], 
-     { "ADSPEC", "rsvp.adspec", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "ADSPEC", "rsvp.adspec", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_POLICY], 
-     { "POLICY", "rsvp.policy", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "POLICY", "rsvp.policy", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_CONFIRM], 
-     { "CONFIRM", "rsvp.confirm", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "CONFIRM", "rsvp.confirm", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_LABEL], 
-     { "LABEL", "rsvp.label", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "LABEL", "rsvp.label", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_LABEL_REQUEST], 
-     { "LABEL REQUEST", "rsvp.label_request", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "LABEL REQUEST", "rsvp.label_request", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_SESSION_ATTRIBUTE], 
-     { "SESSION ATTRIBUTE", "rsvp.session_attribute", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "SESSION ATTRIBUTE", "rsvp.session_attribute", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_EXPLICIT_ROUTE], 
-     { "EXPLICIT ROUTE", "rsvp.explicit_route", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "EXPLICIT ROUTE", "rsvp.explicit_route", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_RECORD_ROUTE], 
-     { "RECORD ROUTE", "rsvp.record_route", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "RECORD ROUTE", "rsvp.record_route", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_MESSAGE_ID], 
+     { "MESSAGE-ID", "rsvp.msgid", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_MESSAGE_ID_ACK], 
+     { "MESSAGE-ID ACK", "rsvp.ack", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_MESSAGE_ID_LIST], 
+     { "MESSAGE-ID LIST", "rsvp.msgid_list", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_HELLO_OBJ], 
+     { "HELLO Message", "rsvp.hello", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_UNKNOWN_OBJ], 
-     { "Unknown object", "rsvp.obj_unknown", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "Unknown object", "rsvp.obj_unknown", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     /* Session fields */
     {&rsvp_filter[RSVPF_SESSION_IP], 
      { "Destination address", "rsvp.session.ip", FT_IPv4, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_SESSION_PORT], 
-     { "Port number", "rsvp.session.port", FT_UINT16, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "Port number", "rsvp.session.port", FT_UINT16, BASE_DEC, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_SESSION_PROTO], 
-     { "Protocol", "rsvp.session.proto", FT_UINT8, BASE_NONE, VALS(proto_vals), 0x0,
-       "" }},
+     { "Protocol", "rsvp.session.proto", FT_UINT8, BASE_DEC, VALS(proto_vals), 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_SESSION_TUNNEL_ID], 
-     { "Tunnel ID", "rsvp.session.tunnel_id", FT_UINT16, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "Tunnel ID", "rsvp.session.tunnel_id", FT_UINT16, BASE_DEC, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID], 
-     { "Extended tunnel ID", "rsvp.session.ext_tunnel_id", FT_UINT32, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "Extended tunnel ID", "rsvp.session.ext_tunnel_id", FT_UINT32, BASE_DEC, NULL, 0x0,
+       "", HFILL }},
 
     /* Sender template/Filterspec fields */
     {&rsvp_filter[RSVPF_SENDER_IP], 
      { "Sender IPv4 address", "rsvp.sender.ip", FT_IPv4, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_SENDER_PORT], 
-     { "Sender port number", "rsvp.sender.port", FT_UINT16, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "Sender port number", "rsvp.sender.port", FT_UINT16, BASE_DEC, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_SENDER_LSP_ID], 
-     { "Sender LSP ID", "rsvp.sender.lsp_id", FT_UINT16, BASE_NONE, NULL, 0x0,
-       "" }}
+     { "Sender LSP ID", "rsvp.sender.lsp_id", FT_UINT16, BASE_DEC, NULL, 0x0,
+       "", HFILL }}
 };
 
 static inline int rsvp_class_to_filter_num(int classnum)
@@ -822,8 +629,14 @@ static inline int rsvp_class_to_filter_num(int classnum)
     case RSVP_CLASS_LABEL_REQUEST :
     case RSVP_CLASS_EXPLICIT_ROUTE :
     case RSVP_CLASS_RECORD_ROUTE :
+    case RSVP_CLASS_MESSAGE_ID :
+    case RSVP_CLASS_MESSAGE_ID_ACK :
+    case RSVP_CLASS_MESSAGE_ID_LIST :    
        return classnum + RSVPF_OBJECT;
        break;
+    case RSVP_CLASS_HELLO :
+        return RSVPF_HELLO_OBJ;
+        break;
 
     case RSVP_CLASS_SESSION_ATTRIBUTE :
        return RSVPF_SESSION_ATTRIBUTE;
@@ -834,225 +647,263 @@ static inline int rsvp_class_to_filter_num(int classnum)
 }
 
 static void 
-dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) 
+dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) 
 {
+    int offset = 0;
     proto_tree *rsvp_tree = NULL, *ti, *ti2; 
     proto_tree *rsvp_header_tree;
     proto_tree *rsvp_object_tree;
     proto_tree *rsvp_sa_flags_tree;
     proto_tree *rsvp_ero_subtree;
-    char *packet_type, *object_type;
-    rsvp_header *hdr;
-    rsvp_object *obj;
-    int i, j, k, l, len, mylen;
+    guint8 ver_flags;
+    guint8 message_type;
+    guint16 cksum, computed_cksum;
+    vec_t cksum_vec[1];
+    int i, j, k, l, len;
     int msg_length;
     int obj_length;
+    int mylen;
     int offset2;
-    struct e_in6_addr *ip6a;
-    guint32 ip_addr;
-
-    hdr = (rsvp_header *)&pd[offset];
-    packet_type = match_strval(hdr->message_type, message_type_vals);
-    if (check_col(fd, COL_PROTOCOL))
-        col_add_str(fd, COL_PROTOCOL, "RSVP");
-    if (check_col(fd, COL_INFO)) {
-        if (packet_type != NULL)
-            col_add_str(fd, COL_INFO, packet_type); 
-        else
-            col_add_fstr(fd, COL_INFO, "Unknown (%u)", hdr->message_type); 
+    char *objtype;
+
+    if (check_col(pinfo->fd, COL_PROTOCOL))
+        col_set_str(pinfo->fd, COL_PROTOCOL, "RSVP");
+    if (check_col(pinfo->fd, COL_INFO))
+        col_clear(pinfo->fd, COL_INFO);
+
+    ver_flags = tvb_get_guint8(tvb, offset+0);
+    message_type = tvb_get_guint8(tvb, offset+1);
+    if (check_col(pinfo->fd, COL_INFO)) {
+        col_add_str(pinfo->fd, COL_INFO,
+            val_to_str(message_type, message_type_vals, "Unknown (%u)")); 
     }
 
     if (tree) {
-       msg_length = pntohs(pd+offset+6);
-       ti = proto_tree_add_item(tree, proto_rsvp, NullTVB, offset, msg_length, FALSE);
+       msg_length = tvb_get_ntohs(tvb, offset+6);
+       ti = proto_tree_add_item(tree, proto_rsvp, tvb, offset, msg_length,
+           FALSE);
        rsvp_tree = proto_item_add_subtree(ti, ett_rsvp);
 
-       ti = proto_tree_add_text(rsvp_tree, NullTVB, offset, 
-                                sizeof(rsvp_header), "RSVP Header"); 
+       ti = proto_tree_add_text(rsvp_tree, tvb, offset, 8, "RSVP Header"); 
        rsvp_header_tree = proto_item_add_subtree(ti, ett_rsvp_hdr);
 
-        proto_tree_add_text(rsvp_header_tree, NullTVB, offset, 1, "RSVP Version: %u", 
-                           (hdr->ver_flags & 0xf0)>>4);  
-       proto_tree_add_text(rsvp_header_tree, NullTVB, offset, 1, "Flags: %02X",
-                           hdr->ver_flags & 0xf);  
-       proto_tree_add_uint(rsvp_header_tree, rsvp_filter[RSVPF_MSG], NullTVB
-                           offset+1, 1, hdr->message_type);
-       if (hdr->message_type <= RSVPF_RTEARCONFIRM &&
-                       hdr->message_type != RSVPF_JUNK_MSG8 &&
-                       hdr->message_type != RSVPF_JUNK_MSG9 ) {
-              proto_tree_add_boolean_hidden(rsvp_header_tree, rsvp_filter[RSVPF_MSG + hdr->message_type], NullTVB
+        proto_tree_add_text(rsvp_header_tree, tvb, offset, 1, "RSVP Version: %u", 
+                           (ver_flags & 0xf0)>>4);  
+       proto_tree_add_text(rsvp_header_tree, tvb, offset, 1, "Flags: %02x",
+                           ver_flags & 0xf);
+       proto_tree_add_uint(rsvp_header_tree, rsvp_filter[RSVPF_MSG], tvb
+                           offset+1, 1, message_type);
+       if (message_type <= RSVPF_RTEARCONFIRM &&
+                       message_type != RSVPF_JUNK_MSG8 &&
+                       message_type != RSVPF_JUNK_MSG9 ) {
+              proto_tree_add_boolean_hidden(rsvp_header_tree, rsvp_filter[RSVPF_MSG + message_type], tvb
                                   offset+1, 1, 1);
        }
-       proto_tree_add_text(rsvp_header_tree, NullTVB, offset + 2 , 2, "Message Checksum");
-       proto_tree_add_text(rsvp_header_tree, NullTVB, offset + 4 , 1, "Sending TTL: %u",
-                           hdr->sending_ttl);
-       proto_tree_add_text(rsvp_header_tree, NullTVB, offset + 6 , 2, "Message length: %d",
-                           msg_length);
-
-       offset += sizeof(rsvp_header);
-       len = 0;
-       while (len + sizeof(rsvp_header) < msg_length) {
-           obj = (rsvp_object *)&pd[offset];
-           obj_length = pntohs(pd+offset);
-           if (!BYTES_ARE_IN_FRAME(offset, obj_length)) {
-               proto_tree_add_text(rsvp_tree, NullTVB, offset, 1, 
-                                   "Further data not captured");
-               break;
+       cksum = tvb_get_ntohs(tvb, offset+2);
+       if (!pinfo->fragmented && tvb_length(tvb) >= msg_length) {
+           /* The packet isn't part of a fragmented datagram and isn't
+              truncated, so we can checksum it. */
+           cksum_vec[0].ptr = tvb_get_ptr(tvb, 0, msg_length);
+           cksum_vec[0].len = msg_length;
+           computed_cksum = in_cksum(&cksum_vec[0], 1);
+           if (computed_cksum == 0) {
+               proto_tree_add_text(rsvp_header_tree, tvb, offset+2, 2,
+                                   "Message Checksum: 0x%04x (correct)",
+                                   cksum);
+           } else {
+               proto_tree_add_text(rsvp_header_tree, tvb, offset+2, 2,
+                                   "Message Checksum: 0x%04x (incorrect, should be 0x%04x)",
+                                   cksum,
+                                   in_cksum_shouldbe(cksum, computed_cksum));
            }
-           
-           object_type = match_strval(obj->class, rsvp_class_vals);
-           if (!object_type) object_type = "Unknown";
-           ti = proto_tree_add_uint_hidden(rsvp_tree, rsvp_filter[RSVPF_OBJECT], NullTVB, 
-                                           offset, obj_length, obj->class);
-           ti = proto_tree_add_uint(rsvp_tree, rsvp_filter[rsvp_class_to_filter_num(obj->class)], NullTVB, 
-                                    offset, obj_length, obj->class);
-
-           offset2 = offset + sizeof(rsvp_object);
-
-           switch(obj->class) {
+       } else {
+           proto_tree_add_text(rsvp_header_tree, tvb, offset+2, 2,
+                               "Message Checksum: 0x%04x",
+                               cksum);
+       }
+       proto_tree_add_text(rsvp_header_tree, tvb, offset+4, 1,
+                           "Sending TTL: %u",
+                           tvb_get_guint8(tvb, offset+4));
+       proto_tree_add_text(rsvp_header_tree, tvb, offset+6, 2,
+                           "Message length: %u", msg_length);
+
+       offset += 8;
+       len = 8;
+       while (len < msg_length) {
+           guint8 class;       
+           guint8 type;
+           char *object_type;
+
+           obj_length = tvb_get_ntohs(tvb, offset);
+           class = tvb_get_guint8(tvb, offset+2);
+           type = tvb_get_guint8(tvb, offset+3);
+           object_type = val_to_str(class, rsvp_class_vals, "Unknown");
+           proto_tree_add_uint_hidden(rsvp_tree, rsvp_filter[RSVPF_OBJECT], tvb, 
+                                           offset, obj_length, class);
+           ti = proto_tree_add_item(rsvp_tree, rsvp_filter[rsvp_class_to_filter_num(class)],
+                                    tvb, offset, obj_length, FALSE);
+
+           offset2 = offset+4;
+
+           switch(class) {
 
            case RSVP_CLASS_SESSION :           
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_session);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
-                                   obj->class, object_type);
-               switch(obj->type) {
+                                   class, object_type);
+               mylen = obj_length - 4;
+               switch(type) {
                case 1: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
                                        "C-type: 1 - IPv4");
-                   memcpy(&ip_addr, pd+offset2, 4);
-                   proto_tree_add_ipv4(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_IP], NullTVB, 
-                                       offset2, 4, ip_addr);
-
-                   proto_tree_add_uint(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_PROTO], NullTVB, 
-                                       offset2+4, 1, *(pd+offset2+4));
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+5, 1,
-                                       "Flags: %x", pntohs(pd+offset2+5));
-                   proto_tree_add_uint(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_PORT], NullTVB, 
-                                       offset2+6, 2, pntohs(pd+offset2+6));
+                   proto_tree_add_item(rsvp_object_tree,
+                                       rsvp_filter[RSVPF_SESSION_IP],
+                                       tvb, offset2, 4, FALSE);
+
+                   proto_tree_add_item(rsvp_object_tree,
+                                       rsvp_filter[RSVPF_SESSION_PROTO], tvb, 
+                                       offset2+4, 1, FALSE);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+5, 1,
+                                       "Flags: %x",
+                                       tvb_get_guint8(tvb, offset2+5));
+                   proto_tree_add_item(rsvp_object_tree,
+                                       rsvp_filter[RSVPF_SESSION_PORT], tvb, 
+                                       offset2+6, 2, FALSE);
+                    proto_item_set_text(ti, "SESSION: IPv4, %s, %d, %d", 
+                                        ip_to_str(tvb_get_ptr(tvb, offset2, 4)), 
+                                        tvb_get_guint8(tvb, offset2+4),
+                                        tvb_get_ntohs(tvb, offset2+6));
                    break;
                }
 
                case 2: {
-                   rsvp_session_ipv6 *sess = (rsvp_session_ipv6 *)obj;
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 2 - IPv6");
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 4, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
                                        "Destination address: %s", 
-                                       ip6_to_str(&(sess->destination)));
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+16, 1,
-                                       "Protocol: %u", sess->protocol);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+17, 1,
-                                       "Flags: %x", sess->flags);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+18, 2,
+                                       ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 1,
+                                       "Protocol: %u",
+                                       tvb_get_guint8(tvb, offset2+16));
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+17, 1,
+                                       "Flags: %x",
+                                       tvb_get_guint8(tvb, offset2+17));
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+18, 2,
                                        "Destination port: %u", 
-                                       pntohs(pd+offset2+18));
+                                       tvb_get_ntohs(tvb, offset2+18));
                    break;
                }
                
                case 7: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 7 - IPv4 LSP");
-                   memcpy(&ip_addr, pd+offset2, 4);
-                   proto_tree_add_ipv4(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_IP], NullTVB, 
-                                       offset2, 4, ip_addr);
-
-                   proto_tree_add_uint(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_TUNNEL_ID], NullTVB, 
-                                       offset2+6, 2, pntohs(pd+offset2+6));
-
-                   memcpy(&ip_addr, pd+offset2+8, 4);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+8, 4, 
-                                       "Extended Tunnel ID: %lu (%s)", 
-                                       (unsigned long)ntohl(ip_addr),
-                                       ip_to_str(pd+offset2+8));
-                   proto_tree_add_uint_hidden(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID], NullTVB, 
-                                       offset2+8, 4, ip_addr);
+                   proto_tree_add_item(rsvp_object_tree,
+                                       rsvp_filter[RSVPF_SESSION_IP],
+                                       tvb, offset2, 4, FALSE);
+
+                   proto_tree_add_item(rsvp_object_tree,
+                                       rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
+                                       tvb, offset2+6, 2, FALSE);
+
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 4, 
+                                       "Extended Tunnel ID: %u (%s)",
+                                       tvb_get_ntohl(tvb, offset2+8),
+                                       ip_to_str(tvb_get_ptr(tvb, offset2+8, 4)));
+                   proto_tree_add_item_hidden(rsvp_object_tree,
+                                       rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
+                                       tvb, offset2+8, 4, FALSE);
+                    proto_item_set_text(ti, "SESSION: IPv4-LSP, %s, %d, %0x", 
+                                        ip_to_str(tvb_get_ptr(tvb, offset2, 4)), 
+                                        tvb_get_ntohs(tvb, offset2+6),
+                                        tvb_get_ntohl(tvb, offset2+8));
                    break;
                }
 
                default: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: Unknown (%u)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, i,
-                                       "Data (%d bytes)", i);
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
                }
                }
                break;
                
            case RSVP_CLASS_HOP :               
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_hop);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
-                                   obj->class, object_type);
-               switch(obj->type) {
+                                   class, object_type);
+               mylen = obj_length - 4;
+               switch(type) {
                case 1: {
-                   rsvp_hop_ipv4 *hop = (rsvp_hop_ipv4 *)obj;
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 1 - IPv4");
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 4, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4, 
                                        "Neighbor address: %s", 
-                                       ip_to_str((guint8 *) &(hop->neighbor)));
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+4, 4,
-                                       "Logical interface: %0x", 
-                                       pntohl(pd+offset2+4));
+                                       ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
+                                       "Logical interface: %u", 
+                                       tvb_get_ntohl(tvb, offset2+4));
+                    proto_item_set_text(ti, "HOP: IPv4, %s", 
+                                        ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
                    break;
                }
 
                case 2: {
-                   rsvp_hop_ipv6 *hop = (rsvp_hop_ipv6 *)obj;
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 2 - IPv6");
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 4, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
                                        "Neighbor address: %s", 
-                                       ip6_to_str(&(hop->neighbor)));
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+16, 4,
-                                       "Logical interface: %0x", 
-                                       pntohl(pd+offset2+16));
+                                       ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 4,
+                                       "Logical interface: 0x%08x", 
+                                       tvb_get_ntohl(tvb, offset2+16));
                    break;
                }
                
                default: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: Unknown (%u)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, i,
-                                       "Data (%d bytes)", i);
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
                }
                }
                break;
                
            case RSVP_CLASS_TIME_VALUES : 
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_time_values);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
-                                   obj->class, object_type);
-               switch(obj->type) {
+                                   class, object_type);
+               mylen = obj_length - 4;
+               switch(type) {
                case 1: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 1");
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 4, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4, 
                                        "Refresh interval: %u ms (%u seconds)",
-                                       pntohl(pd+offset2),
-                                       pntohl(pd+offset2)/1000);
+                                       tvb_get_ntohl(tvb, offset2),
+                                       tvb_get_ntohl(tvb, offset2)/1000);
+                    proto_item_set_text(ti, "TIME VALUES: %d ms", 
+                                        tvb_get_ntohl(tvb, offset2));
                    break;
                }
 
                default: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: Unknown (%u)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, i,
-                                       "Data (%d bytes)", i);
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
                    break;
                }
                }
@@ -1060,83 +911,86 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
 
            case RSVP_CLASS_ERROR :
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_error);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
-                                   obj->class, object_type);
-               switch(obj->type) {
+                                   class, object_type);
+               mylen = obj_length - 4;
+               switch(type) {
                case 1: {
-                   rsvp_error_ipv4 *err = (rsvp_error_ipv4 *)obj;
-                   char *err_str = match_strval(err->error_code, rsvp_error_vals);
-                   if (!err_str) err_str = "Unknown";
+                   guint8 error_code;
 
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 1 - IPv4");
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 4, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4, 
                                        "Error node: %s",
-                                       ip_to_str((guint8 *) &(err->error_node)));
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+4, 1,
-                                       "Flags: %02x", err->flags);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+5, 1,
-                                       "Error code: %u - %s", err->error_code,
-                                       err_str);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+6, 2,
-                                       "Error value: %u", pntohs(pd+offset2+6));
-                   
+                                       ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 1,
+                                       "Flags: 0x%02x",
+                                       tvb_get_guint8(tvb, offset2+4));
+                   error_code = tvb_get_guint8(tvb, offset2+5);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+5, 1,
+                                       "Error code: %u - %s", error_code,
+                                       val_to_str(error_code, rsvp_error_vals, "Unknown"));
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+6, 2,
+                                       "Error value: %u",
+                                       tvb_get_ntohs(tvb, offset2+6));
+                    proto_item_set_text(ti, "ERROR: IPv4, %d, %d, %s", 
+                                        tvb_get_guint8(tvb, offset2+5),
+                                        tvb_get_ntohs(tvb, offset2+6),
+                                        ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
                    break;
                }
 
                case 2: {
-                   rsvp_error_ipv6 *err = (rsvp_error_ipv6 *)obj;
-                   char *err_str = match_strval(err->error_code, rsvp_error_vals);
-                   if (!err_str) err_str = "Unknown";
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   guint8 error_code;
+
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 2 - IPv6");
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 4, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
                                        "Error node: %s",
-                                       ip6_to_str(&(err->error_node)));
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+16, 1,
-                                       "Flags: %02x", err->flags);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+17, 1,
-                                       "Error code: %u - %s", err->error_code,
-                                       err_str);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+18, 2,
-                                       "Error value: %u", pntohs(pd+offset2+18));
-                   
+                                       ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 1,
+                                       "Flags: 0x%02x",
+                                       tvb_get_guint8(tvb, offset2+16));
+                   error_code = tvb_get_guint8(tvb, offset2+17);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+17, 1,
+                                       "Error code: %u - %s", error_code,
+                                       val_to_str(error_code, rsvp_error_vals, "Unknown"));
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+18, 2,
+                                       "Error value: %u",
+                                       tvb_get_ntohs(tvb, offset2+18));
                    break;
                }
                
                default: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: Unknown (%u)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, i,
-                                       "Data (%d bytes)", i);
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
                }
                }
                break;
                
 
            case RSVP_CLASS_SCOPE : 
-               mylen = obj_length;
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_scope);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
-                                   obj->class, object_type);
-               switch(obj->type) {
+                                   class, object_type);
+               mylen = obj_length - 4;
+               switch(type) {
                case 1: {
-                   unsigned long ip;
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 1 - IPv4");
-                   while (mylen > sizeof(rsvp_object)) {
-                       ip = pntohl(pd+offset2);
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 4, 
+                   while (mylen > 0) {
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4, 
                                            "IPv4 Address: %s",
-                                           ip_to_str((guint8 *) &ip));
+                                           ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
                        offset2 += 4;
                        mylen -= 4;
                    }
@@ -1144,13 +998,12 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
                }
 
                case 2: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 2 - IPv6");
-                   while (mylen>sizeof(rsvp_object)) {
-                       ip6a = (struct e_in6_addr *)pd+offset2;
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 16, 
+                   while (mylen > 0) {
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16, 
                                            "IPv6 Address: %s",
-                                           ip6_to_str(ip6a));
+                                           ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
                        offset2 += 16;
                        mylen -= 16;
                    }
@@ -1158,42 +1011,48 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
                }
                
                default: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: Unknown (%u)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, i,
-                                       "Data (%d bytes)", i);
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
                }
                }
                break;
                
            case RSVP_CLASS_STYLE : 
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_style);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
-                                   obj->class, object_type);
-               switch(obj->type) {
+                                   class, object_type);
+               mylen = obj_length - 4;
+               switch(type) {
                case 1: {
-                   unsigned long ip = pntohl(pd+offset2);
-                   char *style_str = match_strval(ip, style_vals);
-                   if (!style_str) style_str = "Unknown";
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   guint32 style;
+
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 1");
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+5, 1,
-                                       "Style: %lu - %s", ip, style_str);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
+                                       "Flags: 0x%02x",
+                                       tvb_get_guint8(tvb, offset2));
+                   style = tvb_get_ntoh24(tvb, offset2+1);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+1,
+                                        3, "Style: 0x%06X - %s", style,
+                                        val_to_str(style, style_vals, "Unknown"));
+                    proto_item_set_text(ti, "STYLE: %s (%d)", 
+                                        val_to_str(style, style_vals, "Unknown"),
+                                        style);
                    break;
                }
 
                default: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: Unknown (%u)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, i,
-                                       "Data (%d bytes)", i);
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
                    break;
                }
                }
@@ -1201,396 +1060,406 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
            
            case RSVP_CLASS_CONFIRM :           
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_confirm);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
-                                   obj->class, object_type);
-               switch(obj->type) {
+                                   class, object_type);
+               mylen = obj_length - 4;
+               switch(type) {
                case 1: {
-                   rsvp_confirm_ipv4 *confirm = (rsvp_confirm_ipv4 *)obj;
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 1 - IPv4");
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 4, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4, 
                                        "Receiver address: %s", 
-                                       ip_to_str((guint8 *) &(confirm->receiver)));
+                                       ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
+                   proto_item_set_text(ti, "CONFIRM: %s", 
+                                       ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
                    break;
                }
 
                case 2: {
-                   rsvp_confirm_ipv6 *confirm = (rsvp_confirm_ipv6 *)obj;
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 2 - IPv6");
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 16, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16, 
                                        "Receiver address: %s", 
-                                       ip6_to_str(&(confirm->receiver)));
+                                       ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
                    break;
                }
 
                default: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: Unknown (%u)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, i,
-                                       "Data (%d bytes)", i);
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
                }
                }
                break;
 
            case RSVP_CLASS_SENDER_TEMPLATE :
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_sender_template);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
-                                   obj->class, object_type);
+                                   class, object_type);
+                objtype = "SENDER TEMPLATE";
                goto common_template;
            case RSVP_CLASS_FILTER_SPEC :
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_filter_spec);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
-                                   obj->class, object_type);
+                                   class, object_type);
+                objtype = "FILTERSPEC";
            common_template:
-               switch(obj->type) {
+               mylen = obj_length - 4;
+               switch(type) {
                case 1: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 1 - IPv4");
-                   memcpy(&ip_addr, pd+offset2, 4);
-                   proto_tree_add_ipv4(rsvp_object_tree, rsvp_filter[RSVPF_SENDER_IP], NullTVB, 
-                                       offset2, 4, ip_addr);
-
-                   proto_tree_add_uint(rsvp_object_tree, rsvp_filter[RSVPF_SENDER_PORT], NullTVB, 
-                                       offset2+6, 2, pntohs(pd+offset2+6));
+                   proto_tree_add_item(rsvp_object_tree,
+                                       rsvp_filter[RSVPF_SENDER_IP],
+                                       tvb, offset2, 4, FALSE);
+                   proto_tree_add_item(rsvp_object_tree,
+                                       rsvp_filter[RSVPF_SENDER_PORT],
+                                       tvb, offset2+6, 2, FALSE);
+                    proto_item_set_text(ti, "%s: IPv4, %s, %d", objtype,
+                                        ip_to_str(tvb_get_ptr(tvb, offset2, 4)), 
+                                        tvb_get_ntohs(tvb, offset2+6));
                    break;
                }
 
                case 2: {
-                   rsvp_template_ipv6 *tem = (rsvp_template_ipv6 *)obj;
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 2 - IPv6");
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 16, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16, 
                                        "Source address: %s", 
-                                       ip6_to_str(&(tem->source)));
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+18, 2,
-                                       "Source port: %u", pntohs(pd+offset2+18));
+                                       ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+18, 2,
+                                       "Source port: %u",
+                                       tvb_get_ntohs(tvb, offset2+18));
                    break;
                }
                
                case 7: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 7 - IPv4 LSP");
-                   memcpy(&ip_addr, pd+offset2, 4);
-                   proto_tree_add_ipv4(rsvp_object_tree, rsvp_filter[RSVPF_SENDER_IP], NullTVB, 
-                                       offset2, 4, ip_addr);
-
-                   proto_tree_add_uint(rsvp_object_tree, rsvp_filter[RSVPF_SENDER_LSP_ID], NullTVB, 
-                                       offset2+6, 2, pntohs(pd+offset2+6));
+                   proto_tree_add_item(rsvp_object_tree,
+                                       rsvp_filter[RSVPF_SENDER_IP],
+                                       tvb, offset2, 4, FALSE);
+                   proto_tree_add_item(rsvp_object_tree,
+                                       rsvp_filter[RSVPF_SENDER_LSP_ID],
+                                       tvb, offset2+6, 2, FALSE);
+                    proto_item_set_text(ti, "%s: IPv4-LSP, %s, %d", objtype,
+                                        ip_to_str(tvb_get_ptr(tvb, offset2, 4)), 
+                                        tvb_get_ntohs(tvb, offset2+6));
                    break;
                }
 
                default: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: Unknown (%u)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, i,
-                                       "Data (%d bytes)", i);
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
                }
                }
                break;
 
            case RSVP_CLASS_SENDER_TSPEC : {
-               rsvp_tspec *tspec = (rsvp_tspec *)obj;
-               IS_tspec *ist;
-               QUAL_tspec *qt;
-               service_hdr  *sh;
-               char *str;
-
-               mylen = obj_length;
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_sender_tspec);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
-                                   obj->class, object_type);
+                                   class, object_type);
+               mylen = obj_length - 4;
 
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, 
                                    "Message format version: %u", 
-                                   tspec->version>>4);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+2, 2, 
+                                   tvb_get_guint8(tvb, offset2)>>4);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2, 
                                    "Data length: %u words, not including header", 
-                                   pntohs(pd+offset2+2));
+                                   tvb_get_ntohs(tvb, offset2+2));
 
-               mylen -=4;
-               offset2 +=4;
-               while (mylen > 4) {
-                   sh = (service_hdr *)(pd+offset2);
-                   str = match_strval(sh->service_num, qos_vals);
-                   if (!str) str = "Unknown";
-
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 1, 
+               mylen -= 4;
+               offset2 += 4;
+               while (mylen > 0) {
+                   guint8 service_num;
+                   guint8 param_id;
+                   guint16 length;
+
+                   service_num = tvb_get_guint8(tvb, offset2);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, 
                                        "Service header: %u - %s", 
-                                       sh->service_num, str);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+2, 2, 
+                                       service_num,
+                                       val_to_str(service_num, qos_vals, "Unknown"));
+                   length = tvb_get_ntohs(tvb, offset2+2);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2, 
                                        "Length of service %u data: %u words, " 
                                        "not including header", 
-                                       sh->service_num,
-                                       ntohs(sh->length));
+                                       service_num, length);
 
-                   offset2+=4; mylen -=4; 
+                   mylen -= 4;
+                   offset2 += 4;
 
-                   switch(sh->service_num) {
+                   switch(service_num) {
                        
                    case QOS_TSPEC :
-                       ist = (IS_tspec *)sh;
-
                        /* Token bucket TSPEC */
-                       str = match_strval(ist->param_id, svc_vals);
-                       if (!str) str = "Unknown";
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 1, 
+                       param_id = tvb_get_guint8(tvb, offset2);
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, 
                                            "Parameter %u - %s", 
-                                           ist->param_id, str);
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+1, 1, 
-                                           "Parameter %u flags: %x", 
-                                           ist->param_id, ist->flags_tspec);
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+2, 2, 
+                                           param_id,
+                                           val_to_str(param_id, svc_vals, "Unknown"));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
+                                           "Parameter %u flags: 0x%02x",
+                                           param_id,
+                                           tvb_get_guint8(tvb, offset2+1));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
                                            "Parameter %u data length: %u words, " 
                                            "not including header",
-                                           ist->param_id,
-                                           /* pntohs(pd+offset2+10)); */
-                                           ntohs(ist->parameter_length));
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+4, 4, 
+                                           param_id,
+                                           tvb_get_ntohs(tvb, offset2+2));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
                                            "Token bucket rate: %ld", 
-                                           pieee_to_long(pd+offset2+4));
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+8, 4, 
+                                           tvb_ieee_to_long(tvb, offset2+4));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 4,
                                            "Token bucket size: %ld", 
-                                           pieee_to_long(pd+offset2+8));
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+12, 4, 
+                                           tvb_ieee_to_long(tvb, offset2+8));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+12, 4,
                                            "Peak data rate: %ld", 
-                                           pieee_to_long(pd+offset2+12));
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+16, 4, 
-                                           "Minimum policed unit: %u", 
-                                           pntohl(pd+offset2+16));
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+20, 4, 
-                                           "Maximum policed unit: %u", 
-                                           pntohl(pd+offset2+20));
-
+                                           tvb_ieee_to_long(tvb, offset2+12));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 4,
+                                           "Minimum policed unit [m]: %u", 
+                                           tvb_get_ntohl(tvb, offset2+16));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+20, 4,
+                                           "Maximum packet size [M]: %u", 
+                                           tvb_get_ntohl(tvb, offset2+20));
+                        proto_item_set_text(ti, "SENDER TSPEC: IntServ, %lu bytes/sec", 
+                                            tvb_ieee_to_long(tvb, offset2+4));
                        break;
 
                    case QOS_QUALITATIVE :
-                       qt = (QUAL_tspec *)sh;
-
                        /* Token bucket TSPEC */
-                       str = match_strval(qt->param_id, svc_vals);
-                       if (!str) str = "Unknown";
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 1, 
+                       param_id = tvb_get_guint8(tvb, offset2);
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, 
                                            "Parameter %u - %s", 
-                                           qt->param_id, str);
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+1, 1, 
+                                           param_id,
+                                           val_to_str(param_id, svc_vals, "Unknown"));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
                                            "Parameter %u flags: %x", 
-                                           qt->param_id, qt->flags_tspec);
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+2, 2, 
+                                           param_id,
+                                           tvb_get_guint8(tvb, offset2+1));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
                                            "Parameter %u data length: %u words, " 
                                            "not including header",
-                                           qt->param_id,
-                                           /* pntohs(pd+offset2+10)); */
-                                           ntohs(qt->parameter_length));
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+4, 4, 
-                                           "Maximum policed unit: %u", 
-                                           pntohl(pd+offset2+4));
-
+                                           param_id,
+                                           tvb_get_ntohs(tvb, offset2+2));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
+                                           "Maximum packet size [M]: %u", 
+                                           tvb_get_ntohl(tvb, offset2+4));
+                        proto_item_set_text(ti, "SENDER TSPEC: Qualitative");
                        break;
 
                    }
-                   offset2 += ntohs(sh->length)*4; 
-                   mylen -= ntohs(sh->length)*4;
+                   offset2 += length*4; 
+                   mylen -= length*4;
                }
-                   
                break;
            }
 
            case RSVP_CLASS_FLOWSPEC : {
-               rsvp_flowspec *flowspec = (rsvp_flowspec *)obj;
-               IS_flowspec *isf;
-               QUAL_flowspec *qf;
-               service_hdr *sh;
-               int mylen;
-
-               char *str;
-
-               mylen = obj_length;
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_flowspec);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
-                                   obj->class, object_type);
+                                   class, object_type);
+               mylen = obj_length - 4;
 
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, 
                                    "Message format version: %u", 
-                                   flowspec->version>>4);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+2, 2, 
+                                   tvb_get_guint8(tvb, offset2)>>4);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2, 
                                    "Data length: %u words, not including header", 
-                                   pntohs(pd+offset2+2));
-
-               mylen -=4;
-               offset2+=4;
-               while (mylen > 4) {
-                   sh = (service_hdr *)(pd+offset2);
-                   str = match_strval(sh->service_num, intsrv_services_str);
-                   if (!str) str = "Unknown";
+                                   tvb_get_ntohs(tvb, offset2+2));
 
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 1, 
+               mylen -= 4;
+               offset2+= 4;
+               while (mylen > 0) {
+                   guint8 service_num;
+                   guint16 length;
+                   guint8 param_id;
+
+                   service_num = tvb_get_guint8(tvb, offset2);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, 
                                        "Service header: %u - %s", 
-                                       sh->service_num, str);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+2, 2, 
+                                       service_num,
+                                       val_to_str(service_num, intsrv_services_str, "Unknown"));
+                   length = tvb_get_ntohs(tvb, offset2+2);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2, 
                                        "Length of service %u data: %u words, " 
                                        "not including header", 
-                                       sh->service_num,
-                                       ntohs(sh->length));
+                                       service_num,
+                                       length);
 
-                   offset2+=4; mylen -=4; 
+                   mylen -= 4;
+                   offset2 += 4;
 
-                   switch(sh->service_num) {
+                   switch(service_num) {
 
                    case QOS_CONTROLLED_LOAD :
                    case QOS_GUARANTEED :
                        /* Treat both these the same for now */
-                       isf = (IS_flowspec *)sh;
-
-                       str = match_strval(isf->tspec.param_id, svc_vals);
-                       if (!str) str = "Unknown";
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 1, 
+                       param_id = tvb_get_guint8(tvb, offset2);
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, 
                                            "Parameter %u - %s", 
-                                           isf->tspec.param_id, str);
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+1, 1, 
+                                           param_id,
+                                           val_to_str(param_id, svc_vals, "Unknown"));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
                                            "Parameter %u flags: %x", 
-                                           isf->tspec.param_id, isf->tspec.flags_tspec);
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+2, 2, 
+                                           param_id,
+                                           tvb_get_guint8(tvb, offset2+1));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
                                            "Parameter %u data length: %u words, " 
                                            "not including header",
-                                           isf->tspec.param_id,
-                                           ntohs(isf->tspec.parameter_length));
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+4, 4, 
+                                           param_id,
+                                           tvb_get_ntohs(tvb, offset2+2));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
                                            "Token bucket rate: %ld", 
-                                           pieee_to_long(pd+offset2+4));
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+8, 4, 
+                                           tvb_ieee_to_long(tvb, offset2+4));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 4,
                                            "Token bucket size: %ld", 
-                                           pieee_to_long(pd+offset2+8));
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+12, 4, 
+                                           tvb_ieee_to_long(tvb, offset2+8));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+12, 4,
                                            "Peak data rate: %ld", 
-                                           pieee_to_long(pd+offset2+12));
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+16, 4, 
-                                           "Minimum policed unit: %u", 
-                                           pntohl(pd+offset2+16));
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+20, 4, 
-                                           "Maximum policed unit: %u", 
-                                           pntohl(pd+offset2+20));
-                       if (sh->service_num!=QOS_GUARANTEED)
+                                           tvb_ieee_to_long(tvb, offset2+12));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 4,
+                                           "Minimum policed unit [m]: %u", 
+                                           tvb_get_ntohl(tvb, offset2+16));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+20, 4,
+                                           "Maximum packet size [M]: %u", 
+                                           tvb_get_ntohl(tvb, offset2+20));
+
+                       if (service_num != QOS_GUARANTEED) {
+                            proto_item_set_text(ti, "FLOWSPEC: Controlled-Load, %lu bytes/sec", 
+                                                tvb_ieee_to_long(tvb, offset2+4));
                            break;
+                        }
                        
                        /* Guaranteed-rate RSpec */
-                       str = match_strval(isf->rspec.param_id, svc_vals);
-                       if (!str) str="Unknown";
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+24, 1, 
+                       param_id = tvb_get_guint8(tvb, offset2+24);
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+24, 1,
                                            "Parameter %u - %s", 
-                                           isf->rspec.param_id, str);
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+25, 1, 
+                                           param_id,
+                                           val_to_str(param_id, svc_vals, "Unknown"));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+25, 1, 
                                            "Parameter %u flags: %x", 
-                                           isf->rspec.param_id, isf->rspec.flags_rspec);
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+26, 2, 
+                                           param_id,
+                                           tvb_get_guint8(tvb, offset2+25));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+26, 2,
                                            "Parameter %u data length: %u words, " 
                                            "not including header",
-                                           isf->rspec.param_id,
-                                           ntohs(isf->rspec.param2_length));
+                                           param_id,
+                                           tvb_get_ntohs(tvb, offset2+26));
 
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+28, 4, 
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+28, 4,
                                            "Rate: %ld", 
-                                           pieee_to_long(pd+offset2+28));
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+32, 4, 
+                                           tvb_ieee_to_long(tvb, offset2+28));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+32, 4,
                                            "Slack term: %u", 
-                                           pntohl(pd+offset2+32));
+                                           tvb_get_ntohl(tvb, offset2+32));
+                        proto_item_set_text(ti, "FLOWSPEC: Guaranteed-Rate, %lu bytes/sec", 
+                                            tvb_ieee_to_long(tvb, offset2+4));
                        break;
 
                    case QOS_QUALITATIVE :
-                       qf = (QUAL_flowspec *)sh;
-
-                       str = match_strval(qf->param_id, svc_vals);
-                       if (!str) str = "Unknown";
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 1, 
+                       param_id = tvb_get_guint8(tvb, offset2);
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, 
                                            "Parameter %u - %s", 
-                                           qf->param_id, str);
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+1, 1, 
+                                           param_id,
+                                           val_to_str(param_id, svc_vals, "Unknown"));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
                                            "Parameter %u flags: %x", 
-                                           qf->param_id, qf->flags_tspec);
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+2, 2, 
+                                           param_id,
+                                           tvb_get_guint8(tvb, offset2+1));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
                                            "Parameter %u data length: %u words, " 
                                            "not including header",
-                                           qf->param_id,
-                                           ntohs(qf->parameter_length));
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+4, 4, 
-                                           "Maximum policed unit: %u", 
-                                           pntohl(pd+offset2+4));
+                                           param_id,
+                                           tvb_get_ntohs(tvb, offset2+2));
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
+                                           "Maximum packet size [M]: %u", 
+                                           tvb_get_ntohl(tvb, offset2+4));
                        
+                        proto_item_set_text(ti, "FLOWSPEC: Qualitative");
                        break;
                    }
-                   offset2 += ntohs(sh->length)*4;
-                   mylen -= ntohs(sh->length)*4;
+                   offset2 += length*4;
+                   mylen -= length*4;
                }
-
                break;
            }
 
            case RSVP_CLASS_ADSPEC : {
                proto_tree *adspec_tree;
-               service_hdr *shdr;
-               param_hdr *phdr; 
 
-               char *str;
-
-               mylen = obj_length;
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_adspec);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
-                                   obj->class, object_type);
-               
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 1, 
+                                   class, object_type);
+               mylen = obj_length - 4;
+
+               proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
                                    "Message format version: %u", 
-                                   (*((unsigned char *)pd+offset2))>>4);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+2, 2, 
+                                   tvb_get_guint8(tvb, offset2)>>4);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
                                    "Data length: %u words, not including header", 
-                                   pntohs(pd+offset2+2));
-               offset2+=4;
+                                   tvb_get_ntohs(tvb, offset2+2));
                mylen -= 4;
-               while (mylen > 4) {
-                   shdr = (service_hdr *)(pd + offset2);
-                   str = match_strval(shdr->service_num, intsrv_services_str);
-
-                   ti = proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 
-                                            (pntohs(&shdr->length)+1)<<2,
-                                            str?str:"Unknown");
+               offset2 += 4;
+               while (mylen > 0) {
+                   guint8 service_num;
+                   guint8 break_bit;
+                   guint16 length;
+                   char *str;
+
+                   service_num = tvb_get_guint8(tvb, offset2);
+                   str = val_to_str(service_num, intsrv_services_str, "Unknown");
+                   break_bit = tvb_get_guint8(tvb, offset2+1);
+                   length = tvb_get_ntohs(tvb, offset2+2);
+                   ti = proto_tree_add_text(rsvp_object_tree, tvb, offset2, 
+                                            (length+1)*4,
+                                            str);
                    adspec_tree = proto_item_add_subtree(ti,
                                                         ett_rsvp_adspec_subtree);
-                   proto_tree_add_text(adspec_tree, NullTVB, offset2, 1,
+                   proto_tree_add_text(adspec_tree, tvb, offset2, 1,
                                        "Service header %u - %s",
-                                       shdr->service_num, str);
-                   proto_tree_add_text(adspec_tree, NullTVB, offset2+1, 1,
-                                       (shdr->break_bit&0x80)?
+                                       service_num, str);
+                   proto_tree_add_text(adspec_tree, tvb, offset2+1, 1,
+                                       (break_bit&0x80)?
                                        "Break bit set":"Break bit not set");
-                   proto_tree_add_text(adspec_tree, NullTVB, offset2+2, 2, 
+                   proto_tree_add_text(adspec_tree, tvb, offset2+2, 2, 
                                        "Data length: %u words, not including header", 
-                                       pntohs(&shdr->length));
-                   offset2+=4; i=(pntohs(&shdr->length)+1)<<2; mylen-=4;
-                   while (i>4) {
-                       phdr = (param_hdr *)(pd + offset2);
-                       str = match_strval(phdr->id, adspec_params);
+                                       length);
+                   mylen -= 4;
+                   offset2 += 4;
+                   i = length*4;
+                   while (i > 0) {
+                       guint8 id;
+                       guint16 phdr_length;
+
+                       id = tvb_get_guint8(tvb, offset2);
+                       phdr_length = tvb_get_ntohs(tvb, offset2+2);
+                       str = match_strval(id, adspec_params);
                        if (str) {
-                           switch(phdr->id) {
+                           switch(id) {
                            case 4:
                            case 8:
                            case 10:
@@ -1599,39 +1468,39 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
                            case 135:
                            case 136:
                                /* 32-bit unsigned integer */
-                               proto_tree_add_text(adspec_tree, NullTVB, offset2, 
-                                                   (pntohs(&phdr->length)+1)<<2,
-                                                   "%s - %lu (type %u, length %u)",
-                                                   str, 
-                                                   (unsigned long)pntohl(&phdr->dataval), 
-                                                   phdr->id, pntohs(&phdr->length));
+                               proto_tree_add_text(adspec_tree, tvb, offset2,
+                                                   (phdr_length+1)<<2,
+                                                   "%s - %u (type %u, length %u)",
+                                                   str,
+                                                   tvb_get_ntohl(tvb, offset2+4),
+                                                   id, phdr_length);
                                break;
                                
                            case 6:
                                /* IEEE float */
-                               proto_tree_add_text(adspec_tree, NullTVB, offset2, 
-                                                   (pntohs(&phdr->length)+1)<<2,
+                               proto_tree_add_text(adspec_tree, tvb, offset2,
+                                                   (phdr_length+1)<<2,
                                                    "%s - %lu (type %u, length %u)",
-                                                   str, 
-                                                   pieee_to_long(&phdr->dataval), 
-                                                   phdr->id, pntohs(&phdr->length));
+                                                   str,
+                                                   tvb_ieee_to_long(tvb, offset2+4),
+                                                   id, phdr_length);
                                break;
                            default: 
-                               proto_tree_add_text(adspec_tree, NullTVB, offset2, 
-                                                   (pntohs(&phdr->length)+1)<<2,
+                               proto_tree_add_text(adspec_tree, tvb, offset2, 
+                                                   (phdr_length+1)<<2,
                                                    "%s (type %u, length %u)",
-                                                   str, 
-                                                   phdr->id, pntohs(&phdr->length));
+                                                   str,
+                                                   id, phdr_length);
                            }
                        } else {
-                           proto_tree_add_text(adspec_tree, NullTVB, offset2, 
-                                               (pntohs(&phdr->length)+1)<<2,
+                           proto_tree_add_text(adspec_tree, tvb, offset2, 
+                                               (phdr_length+1)<<2,
                                                "Unknown (type %u, length %u)",
-                                               phdr->id, pntohs(&phdr->length));
+                                               id, phdr_length);
                        }
-                       offset2+=(pntohs(&phdr->length)+1)<<2;
-                       i-=(pntohs(&phdr->length)+1)<<2;
-                       mylen-=(pntohs(&phdr->length)+1)<<2;
+                       offset2 += (phdr_length+1)<<2;
+                       i -= (phdr_length+1)<<2;
+                       mylen -= (phdr_length+1)<<2;
                    }
                }
                break;
@@ -1639,46 +1508,51 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
 
            case RSVP_CLASS_INTEGRITY :
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_integrity);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
-                                   obj->class, object_type);
+                                   class, object_type);
                goto default_class;
 
            case RSVP_CLASS_POLICY :
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
-                                   obj->class, object_type);
+                                   class, object_type);
                goto default_class;
 
            case RSVP_CLASS_LABEL_REQUEST : 
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_label_request);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
-                                   "Class number: %d - %s", 
-                                   obj->class, object_type);
-               switch(obj->type) {
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
+                                   "Class number: %u - %s", 
+                                   class, object_type);
+               mylen = obj_length - 4;
+               switch(type) {
                case 1: {
-                   unsigned short l3pid = pntohs(pd+offset2+2);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   unsigned short l3pid = tvb_get_ntohs(tvb, offset2+2);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 1");
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+2, 2,
-                                       "L3PID: 0x%04x", l3pid);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
+                                       "L3PID: %s (0x%04x)",
+                                       val_to_str(l3pid, etype_vals, "Unknown"),
+                                       l3pid);
+                    proto_item_set_text(ti, "LABEL REQUEST: %s (0x%04x)",
+                                       val_to_str(l3pid, etype_vals, "Unknown"),
+                                       l3pid);
                    break;
                }
 
                default: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
-                                       "C-type: Unknown (%d)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, i,
-                                       "Data (%d bytes)", i);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: Unknown (%u)",
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
                    break;
                }
                }
@@ -1686,31 +1560,30 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
            
            case RSVP_CLASS_LABEL : 
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_label);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
-                                   "Class number: %d - %s", 
-                                   obj->class, object_type);
-               switch(obj->type) {
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
+                                   "Class number: %u - %s", 
+                                   class, object_type);
+               mylen = obj_length - 4;
+               switch(type) {
                case 1: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 1");
-                   for (i=1, l = 0; l < obj_length - 4; l+=4, i++)
-                       proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+l, 4, 
-                                           "Label %d: %d %s", 
-                                           i, pntohl(pd+offset2+l), 
-                                           l == obj_length - 8 ? 
-                                           "(Top label)" : "");
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
+                                        "Label: %u", 
+                                        tvb_get_ntohl(tvb, offset2));
+                    proto_item_set_text(ti, "LABEL: %d", 
+                                        tvb_get_ntohl(tvb, offset2));
                    break;
                }
 
                default: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
-                                       "C-type: Unknown (%d)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, i,
-                                       "Data (%d bytes)", i);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: Unknown (%u)",
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
                    break;
                }
                }
@@ -1718,55 +1591,59 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
            
            case RSVP_CLASS_SESSION_ATTRIBUTE : 
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_session_attribute);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
-                                   "Class number: %d - %s", 
-                                   obj->class, object_type);
-               switch(obj->type) {
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
+                                   "Class number: %u - %s", 
+                                   class, object_type);
+               mylen = obj_length - 4;
+               switch(type) {
                case 7: {
-                   char s_name[64];
-                   session_attribute *s_attr = (session_attribute *)&pd[offset];
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   guint8 flags;
+                   guint8 name_len;
+
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 7 - IPv4 LSP");
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, 1,
-                                       "Setup priority: %d", s_attr->setup_prio);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+1, 1,
-                                       "Hold priority: %d", s_attr->hold_prio);
-                   ti2 = proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+2, 1,
-                                             "Flags: %0x", s_attr->flags);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
+                                       "Setup priority: %u",
+                                       tvb_get_guint8(tvb, offset2));
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
+                                       "Hold priority: %u",
+                                       tvb_get_guint8(tvb, offset2+1));
+                   flags = tvb_get_guint8(tvb, offset2+2);
+                   ti2 = proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 1,
+                                             "Flags: 0x%02x", flags);
                    rsvp_sa_flags_tree = proto_item_add_subtree(ti2, 
                                                                ett_rsvp_session_attribute_flags);
-                   proto_tree_add_text(rsvp_sa_flags_tree, NullTVB, offset2+2, 1, 
-                                       ".......%d: Local protection: %s", 
-                                       s_attr->flags & 0x1 ? 1 : 0,
-                                       s_attr->flags & 0x1 ? "Set" : "Not set");
-                   proto_tree_add_text(rsvp_sa_flags_tree, NullTVB, offset2+2, 1, 
-                                       "......%d.: Merging permitted: %s", 
-                                       s_attr->flags & 0x2 ? 1 : 0,
-                                       s_attr->flags & 0x2 ? "Set" : "Not set");
-                   proto_tree_add_text(rsvp_sa_flags_tree, NullTVB, offset2+2, 1, 
-                                       ".....%d..: Ingress note may reroute: %s", 
-                                       s_attr->flags & 0x4 ? 1 : 0,
-                                       s_attr->flags & 0x4 ? "Set" : "Not set");
+                   proto_tree_add_text(rsvp_sa_flags_tree, tvb, offset2+2, 1,
+                                       decode_boolean_bitfield(flags, 0x01, 8,
+                                           "Local protection desired",
+                                           "Local protection not desired"));
+                   proto_tree_add_text(rsvp_sa_flags_tree, tvb, offset2+2, 1,
+                                       decode_boolean_bitfield(flags, 0x02, 8,
+                                           "Merging permitted",
+                                           "Merging not permitted"));
+                   proto_tree_add_text(rsvp_sa_flags_tree, tvb, offset2+2, 1,
+                                       decode_boolean_bitfield(flags, 0x04, 8,
+                                           "Ingress node may reroute",
+                                           "Ingress node may not reroute"));
                    
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+3, 1,
-                                       "Name length: %d", s_attr->name_len);
-                   memset(s_name, 0, 64);
-                   strncpy(s_name, &pd[offset2+4], 60);
-                   if (s_attr->name_len>60) sprintf(&(s_name[60]), "...");
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2+4, s_attr->name_len,
-                                       "Name: %s", s_name);
+                   name_len = tvb_get_guint8(tvb, offset2+3);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+3, 1,
+                                       "Name length: %u", name_len);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, name_len,
+                                       "Name: %.*s",
+                                       name_len,
+                                       tvb_get_ptr(tvb, offset2+4, name_len));
                    break;
                }
 
                default: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
-                                       "C-type: Unknown (%d)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, i,
-                                       "Data (%d bytes)", i);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: Unknown (%u)",
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
                    break;
                }
                }
@@ -1774,118 +1651,128 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
 
            case RSVP_CLASS_EXPLICIT_ROUTE : 
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_explicit_route);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
-                                   "Class number: %d - %s", 
-                                   obj->class, object_type);
-               switch(obj->type) {
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
+                                   "Class number: %u - %s", 
+                                   class, object_type);
+               mylen = obj_length - 4;
+               switch(type) {
                case 1: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 1");
-                   for (i=1, l = 0; l < obj_length - 4; i++) {
-                       j = ((unsigned char)pd[offset2+l]) & 0x7f;
+                   for (i=1, l = 0; l < mylen; i++) {
+                       j = tvb_get_guint8(tvb, offset2+l) & 0x7f;
                        switch(j) {
                        case 1: /* IPv4 */
-                           k = ((unsigned char)pd[offset2+l]) & 0x80;
-                           ti2 = proto_tree_add_text(rsvp_object_tree, NullTVB
+                           k = tvb_get_guint8(tvb, offset2+l) & 0x80;
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb
                                                      offset2+l, 8,
                                                      "IPv4 Subobject - %s, %s",
-                                                     ip_to_str(&pd[offset2+l+2]), 
+                                                     ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)),
                                                      k ? "Loose" : "Strict");
                            rsvp_ero_subtree = 
                                proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj); 
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l, 1, 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                k ? "Loose Hop " : "Strict Hop");
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l, 1, 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                "Type: 1 (IPv4)");
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+1, 1, 
-                                               "Length: %d", pd[offset2+l+1]);
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+2, 4, 
-                                               "IPv4 hop: %s", ip_to_str(&pd[offset2+l+2]));
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+6, 1, 
-                                               "Prefix length: %d", pd[offset2+l+6]);
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
+                                               "Length: %u",
+                                               tvb_get_guint8(tvb, offset2+l+1));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 4,
+                                               "IPv4 hop: %s",
+                                               ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+6, 1, 
+                                               "Prefix length: %u",
+                                               tvb_get_guint8(tvb, offset2+l+6));
                            break;
 
                        case 2: /* IPv6 */
-                           ti2 = proto_tree_add_text(rsvp_object_tree, NullTVB
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb
                                                      offset2+l, 20,
                                                      "IPv6 Subobject");
                            rsvp_ero_subtree = 
                                proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj); 
-                           k = ((unsigned char)pd[offset2+l]) & 0x80;
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l, 1, 
+                           k = tvb_get_guint8(tvb, offset2+l) & 0x80;
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                k ? "Loose Hop " : "Strict Hop");
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l, 1, 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                "Type: 2 (IPv6)");
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+1, 1, 
-                                               "Length: %d", pd[offset2+l+1]);
-                           ip6a = (struct e_in6_addr *)pd+offset2+l+2;
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+2, 16, 
-                                               "IPv6 hop: %s", ip6_to_str(ip6a));
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+18, 1, 
-                                               "Prefix length: %d", pd[offset2+l+6]);
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
+                                               "Length: %u",
+                                               tvb_get_guint8(tvb, offset2+l+1));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 16,
+                                               "IPv6 hop: %s",
+                                               ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l+2, 16)));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+18, 1,
+                                               "Prefix length: %u",
+                                               tvb_get_guint8(tvb, offset2+l+6));
                            break;
 
                        case 32: /* AS */
-                           k = pntohs(offset2+l+2);
-                           ti2 = proto_tree_add_text(rsvp_object_tree, NullTVB
+                           k = tvb_get_ntohs(tvb, offset2+l+2);
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb
                                                      offset2+l, 4,
-                                                     "Autonomous System %d", k);
+                                                     "Autonomous System %u",
+                                                     k);
                            rsvp_ero_subtree = 
                                proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj); 
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l, 1, 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                k ? "Loose Hop " : "Strict Hop");
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l, 1, 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                "Type: 32 (Autonomous System Number)");
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+1, 1, 
-                                               "Length: %d", pd[offset2+l+1]);
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+2, 2, 
-                                               "Autonomous System %d", k);
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
+                                               "Length: %u",
+                                               tvb_get_guint8(tvb, offset2+l+1));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 2,
+                                               "Autonomous System %u", k);
                            break;
 
                        case 64: /* Path Term */
-                           k = ((unsigned char)pd[offset2+l]) & 0x80;
-                           ti2 = proto_tree_add_text(rsvp_object_tree, NullTVB, 
+                           k = tvb_get_guint8(tvb, offset2+l) & 0x80;
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
                                                      offset2+l, 4,
                                                      "LSP Path Termination");
                            rsvp_ero_subtree = 
                                proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj); 
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l, 1, 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                k ? "Loose Hop " : "Strict Hop");
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l, 1, 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                "Type: 64 (MPLS LSP Path Termination)");
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+1, 1, 
-                                               "Length: %d", pd[offset2+l+1]);
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
+                                               "Length: %u",
+                                               tvb_get_guint8(tvb, offset2+l+1));
                            break;
 
                        default: /* Unknown subobject */
-                           k = ((unsigned char)pd[offset2+l]) & 0x80;
-                           ti2 = proto_tree_add_text(rsvp_object_tree, NullTVB, 
-                                                     offset2+l, pd[offset2+l+1],
+                           k = tvb_get_guint8(tvb, offset2+l) & 0x80;
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb, 
+                                                     offset2+l,
+                                                     tvb_get_guint8(tvb, offset2+l+1),
                                                      "Unknown subobject: %d", j);
                            rsvp_ero_subtree = 
                                proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj); 
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l, 1, 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                k ? "Loose Hop " : "Strict Hop");
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l, 1, 
-                                               "Type: %d (Unknown)", j);
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+1, 1, 
-                                               "Length: %d", pd[offset2+l+1]);
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
+                                               "Type: %u (Unknown)", j);
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
+                                               "Length: %u",
+                                               tvb_get_guint8(tvb, offset2+l+1));
 
                        }
 
-                       l += ((unsigned char)pd[offset2+l+1]);
+                       l += tvb_get_guint8(tvb, offset2+l+1);
                    }
                    break;
                }
                default: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
-                                       "C-type: Unknown (%d)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, i,
-                                       "Data (%d bytes)", i);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: Unknown (%u)",
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
                    break;
                }
                }
@@ -1894,96 +1781,239 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
 
            case RSVP_CLASS_RECORD_ROUTE : 
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_record_route);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
-                                   "Class number: %d - %s", 
-                                   obj->class, object_type);
-               switch(obj->type) {
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
+                                   "Class number: %u - %s", 
+                                   class, object_type);
+               mylen = obj_length - 4;
+               switch(type) {
                case 1: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 1");
-                   for (i=1, l = 0; l < obj_length - 4; i++) {
-                       j = (unsigned char)pd[offset2+l];
+                   for (i=1, l = 0; l < mylen; i++) {
+                       j = tvb_get_guint8(tvb, offset2+l);
                        switch(j) {
                        case 1: /* IPv4 */
-                           ti2 = proto_tree_add_text(rsvp_object_tree, NullTVB
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb
                                                      offset2+l, 8,
                                                      "IPv4 Subobject - %s",
-                                                     ip_to_str(&pd[offset2+l+2]));
+                                                     ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)));
                            rsvp_ero_subtree = 
                                proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj); 
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l, 1, 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                "Type: 1 (IPv4)");
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+1, 1, 
-                                               "Length: %d", pd[offset2+l+1]);
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+2, 4, 
-                                               "IPv4 hop: %s", ip_to_str(&pd[offset2+l+2]));
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+6, 1, 
-                                               "Prefix length: %d", pd[offset2+l+6]);
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
+                                               "Length: %u",
+                                               tvb_get_guint8(tvb, offset2+l+1));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 4,
+                                               "IPv4 hop: %s",
+                                               ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+6, 1,
+                                               "Prefix length: %u",
+                                               tvb_get_guint8(tvb, offset2+l+6));
                            break;
 
                        case 2: /* IPv6 */
-                           ti2 = proto_tree_add_text(rsvp_object_tree, NullTVB
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb
                                                      offset2+l, 20,
                                                      "IPv6 Subobject");
                            rsvp_ero_subtree = 
                                proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj); 
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l, 1, 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                "Type: 2 (IPv6)");
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+1, 1, 
-                                               "Length: %d", pd[offset2+l+1]);
-                           ip6a = (struct e_in6_addr *)pd+offset2+l+2;
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+2, 16, 
-                                               "IPv6 hop: %s", ip6_to_str(ip6a));
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+18, 1, 
-                                               "Prefix length: %d", pd[offset2+l+6]);
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
+                                               "Length: %u",
+                                               tvb_get_guint8(tvb, offset2+l+1));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 16,
+                                               "IPv6 hop: %s",
+                                               ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l+2, 16)));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+18, 1,
+                                               "Prefix length: %u",
+                                               tvb_get_guint8(tvb, offset2+l+6));
                            break;
 
                        default: /* Unknown subobject */
-                           k = ((unsigned char)pd[offset2+l]) & 0x80;
-                           ti2 = proto_tree_add_text(rsvp_object_tree, NullTVB, 
-                                                     offset2+l, pd[offset2+l+1],
-                                                     "Unknown subobject: %d", j);
+                           k = tvb_get_guint8(tvb, offset2+l) & 0x80;
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb, 
+                                                     offset2+l,
+                                                     tvb_get_guint8(tvb, offset2+l+1),
+                                                     "Unknown subobject: %u",
+                                                     j);
                            rsvp_ero_subtree = 
                                proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj); 
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l, 1, 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                k ? "Loose Hop " : "Strict Hop");
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l, 1, 
-                                               "Type: %d (Unknown)", j);
-                           proto_tree_add_text(rsvp_ero_subtree, NullTVB, offset2+l+1, 1, 
-                                               "Length: %d", pd[offset2+l+1]);
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
+                                               "Type: %u (Unknown)", j);
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
+                                               "Length: %u",
+                                               tvb_get_guint8(tvb, offset2+l+1));
 
                        }
 
-                       l += ((unsigned char)pd[offset2+l+1]);
+                       l += tvb_get_guint8(tvb, offset2+l+1);
                    }
                    break;
                }
                
                default: {
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset+3, 1, 
-                                       "C-type: Unknown (%d)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, i,
-                                       "Data (%d bytes)", i);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: Unknown (%u)",
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
                    break;
                }
                }
                break;
            
+           case RSVP_CLASS_MESSAGE_ID :
+               rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
+                                   "Class number: %u - %s", 
+                                   class, object_type);
+                switch(type) {
+                case 1: 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: 1");
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
+                                        "Flags: %d", tvb_get_guint8(tvb, offset+4));
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
+                                        "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
+                                        "Message-ID: %d", tvb_get_ntohl(tvb, offset+8));
+                    proto_item_set_text(ti, "MESSAGE-ID: %d %s", 
+                                        tvb_get_ntohl(tvb, offset+8), 
+                                        tvb_get_guint8(tvb, offset+4) & 1 ? "(Ack Desired)" : "");
+                    break;
+
+                default:
+                    mylen = obj_length - 4;
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: Unknown (%u)",
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
+                   break;
+                }
+                break;
+
+           case RSVP_CLASS_MESSAGE_ID_ACK :
+               rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
+                                   "Class number: %u - %s", 
+                                   class, object_type);
+                switch(type) {
+                case 1: 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: 1");
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
+                                        "Flags: %d", tvb_get_guint8(tvb, offset+4));
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
+                                        "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
+                                        "Message-ID: %d", tvb_get_ntohl(tvb, offset+8));
+                    proto_item_set_text(ti, "MESSAGE-ID ACK: %d", tvb_get_ntohl(tvb, offset+8));
+                    break;
+
+                case 2: 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: 2");
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
+                                        "Flags: %d", tvb_get_guint8(tvb, offset+4));
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
+                                        "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
+                                        "Message-ID: %d", tvb_get_ntohl(tvb, offset+8));
+                    proto_item_set_text(ti, "MESSAGE-ID NACK: %d", tvb_get_ntohl(tvb, offset+8));
+                    break;
+
+                default:
+                    mylen = obj_length - 4;
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: Unknown (%u)",
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
+                   break;
+                }
+                break;
+
+           case RSVP_CLASS_MESSAGE_ID_LIST :
+               rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
+                                   "Class number: %u - %s", 
+                                   class, object_type);
+                switch(type) {
+                case 1: 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: 1");
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
+                                        "Flags: %d", tvb_get_guint8(tvb, offset+4));
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
+                                        "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
+                    for (mylen = 8; mylen < obj_length; mylen += 4)
+                        proto_tree_add_text(rsvp_object_tree, tvb, offset+mylen, 4,
+                                            "Message-ID: %d", tvb_get_ntohl(tvb, offset+mylen));
+                    proto_item_set_text(ti, "MESSAGE-ID LIST: %d IDs", 
+                                        (obj_length - 8)/4);
+                    break;
+
+                default:
+                    mylen = obj_length - 4;
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: Unknown (%u)",
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
+                   break;
+                }
+                break;
+
+           case RSVP_CLASS_HELLO:
+               rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_hello_obj);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
+                                   "Class number: %u - %s", 
+                                   class, object_type);        
+               switch(type) {
+                   case 1:
+                     proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-Type: 1 - HELLO REQUEST object");
+                     break;
+                   case 2:
+                     proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-Type: 2 - HELLO ACK object");
+                     break;
+               };
+
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 4,
+                                   "Source Instance: 0x%x",tvb_get_ntohl(tvb, offset+4));
+   
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
+                                   "Destination Instance: 0x%x",tvb_get_ntohl(tvb, offset+8));
+   
+               break;
+
            default :
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_unknown_class);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset+2, 1, 
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
-                                   obj->class, object_type);
+                                   class, object_type);
            default_class:
-               i = obj_length - sizeof(rsvp_object);
-               proto_tree_add_text(rsvp_object_tree, NullTVB, offset2, i,
-                                   "Data (%d bytes)", i);
+               mylen = obj_length - 4;
+               proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                   "Data (%d bytes)", mylen);
                break;
 
            case RSVP_CLASS_NULL :
@@ -2026,10 +2056,12 @@ proto_register_rsvp(void)
                &ett_rsvp_explicit_route_subobj,
                &ett_rsvp_record_route,
                &ett_rsvp_record_route_subobj,
+               &ett_rsvp_hello_obj,
                &ett_rsvp_unknown_class,
        };
 
-        proto_rsvp = proto_register_protocol("Resource ReserVation Protocol (RSVP)", "rsvp");
+        proto_rsvp = proto_register_protocol("Resource ReserVation Protocol (RSVP)",
+           "RSVP", "rsvp");
         proto_register_field_array(proto_rsvp, rsvpf_info, array_length(rsvpf_info));
        proto_register_subtree_array(ett, array_length(ett));
 }
@@ -2037,5 +2069,5 @@ proto_register_rsvp(void)
 void
 proto_reg_handoff_rsvp(void)
 {
-       dissector_add("ip.proto", IP_PROTO_RSVP, dissect_rsvp);
+       dissector_add("ip.proto", IP_PROTO_RSVP, dissect_rsvp, proto_rsvp);
 }