Make the AODV dissector a new-style dissector, so it can just reject a
[obnox/wireshark/wip.git] / packet-rsvp.c
index 698666938d181797bf96517098266505ebd85282..c06c42ef5cf1fe6506e574aab97d26e2a4fccb16 100644 (file)
@@ -3,13 +3,12 @@
  *
  * (c) Copyright Ashok Narayanan <ashokn@cisco.com>
  *
- * $Id: packet-rsvp.c,v 1.18 2000/03/14 06:03:24 guy Exp $
+ * $Id: packet-rsvp.c,v 1.62 2002/04/25 06:34:42 guy Exp $
  *
  * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@zing.org>
+ * By Gerald Combs <gerald@ethereal.com>
  * Copyright 1998 Gerald Combs
  * 
- * 
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
@@ -29,7 +28,7 @@
  * NOTES
  *
  * This module defines routines to disassemble RSVP packets, as defined in
- * RFC 2205. All objects from RC2205 are supported, in IPv4 and IPv6 mode.
+ * RFC 2205. All objects from RFC2205 are supported, in IPv4 and IPv6 mode.
  * In addition, the Integrated Services traffic specification objects
  * defined in RFC2210 are also supported. 
  *
 # 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 <epan/tvbuff.h>
+#include <epan/packet.h>
+#include "in_cksum.h"
+#include "etypes.h"
+#include "ipproto.h"
+
 #include "packet-rsvp.h"
-#include "ieee-float.h"
+#include "packet-ip.h"
 
 static int proto_rsvp = -1;
 
@@ -91,19 +89,27 @@ static gint ett_rsvp_confirm = -1;
 static gint ett_rsvp_sender_template = -1;
 static gint ett_rsvp_filter_spec = -1;
 static gint ett_rsvp_sender_tspec = -1;
+static gint ett_rsvp_sender_tspec_subtree = -1;
 static gint ett_rsvp_flowspec = -1;
+static gint ett_rsvp_flowspec_subtree = -1;
 static gint ett_rsvp_adspec = -1;
 static gint ett_rsvp_adspec_subtree = -1;
 static gint ett_rsvp_integrity = -1;
+static gint ett_rsvp_dclass = -1;
+static gint ett_rsvp_lsp_tunnel_if_id = -1;
 static gint ett_rsvp_policy = -1;
 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;
 static gint ett_rsvp_record_route_subobj = -1;
+static gint ett_rsvp_hop_subobj = -1;
+static gint ett_rsvp_admin_status = -1;
+static gint ett_rsvp_admin_status_flags = -1;
 static gint ett_rsvp_unknown_class = -1;
 
 
@@ -111,20 +117,34 @@ 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[] = { 
-    {RSVP_MSG_PATH, "PATH Message"},
-    {RSVP_MSG_RESV, "RESV Message"},
-    {RSVP_MSG_PERR, "PATH ERROR Message"},
-    {RSVP_MSG_RERR, "RESV ERROR Message"},
-    {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_PATH, "PATH Message. "},
+    {RSVP_MSG_RESV, "RESV Message. "},
+    {RSVP_MSG_PERR, "PATH ERROR Message. "},
+    {RSVP_MSG_RERR, "RESV ERROR Message. "},
+    {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_BUNDLE, "BUNDLE Message. "},
+    {RSVP_MSG_ACK, "ACK Message. "},
+    {RSVP_MSG_SREFRESH, "SREFRESH Message. "},
+    {RSVP_MSG_HELLO, "HELLO Message. "},
+    {0, NULL}
 };
 
 /* 
@@ -155,7 +175,27 @@ enum rsvp_classes {
     RSVP_CLASS_EXPLICIT_ROUTE,
     RSVP_CLASS_RECORD_ROUTE,
 
-    RSVP_CLASS_SESSION_ATTRIBUTE=207,
+    RSVP_CLASS_HELLO,
+
+    RSVP_CLASS_MESSAGE_ID,
+    RSVP_CLASS_MESSAGE_ID_ACK,
+    RSVP_CLASS_MESSAGE_ID_LIST,
+
+    RSVP_CLASS_RECOVERY_LABEL = 34,
+    RSVP_CLASS_UPSTREAM_LABEL,
+    RSVP_CLASS_LABEL_SET,
+    RSVP_CLASS_PROTECTION,
+
+    RSVP_CLASS_SUGGESTED_LABEL = 129,
+    RSVP_CLASS_ACCEPTABLE_LABEL_SET,
+    RSVP_CLASS_RESTART_CAP,
+
+    RSVP_CLASS_NOTIFY_REQUEST = 195,
+    RSVP_CLASS_ADMIN_STATUS,
+
+    RSVP_CLASS_SESSION_ATTRIBUTE = 207,
+    RSVP_CLASS_DCLASS = 225,
+    RSVP_CLASS_LSP_TUNNEL_IF_ID = 227,
 };
 
 static value_string rsvp_class_vals[] = { 
@@ -179,6 +219,22 @@ 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"},
+    {RSVP_CLASS_RECOVERY_LABEL, "RECOVERY-LABEL object"},
+    {RSVP_CLASS_UPSTREAM_LABEL, "UPSTREAM-LABEL object"},
+    {RSVP_CLASS_LABEL_SET, "LABEL-SET object"},
+    {RSVP_CLASS_PROTECTION, "PROTECTION object"},
+    {RSVP_CLASS_SUGGESTED_LABEL, "SUGGESTED-LABEL object"},
+    {RSVP_CLASS_ACCEPTABLE_LABEL_SET, "ACCEPTABLE-LABEL-SET object"},
+    {RSVP_CLASS_RESTART_CAP, "RESTART-CAPABILITY object"},
+    {RSVP_CLASS_DCLASS, "DCLASS object"},
+    {RSVP_CLASS_LSP_TUNNEL_IF_ID, "LSP-TUNNEL INTERFACE-ID object"},
+    {RSVP_CLASS_NOTIFY_REQUEST, "NOTIFY-REQUEST object"},
+    {RSVP_CLASS_ADMIN_STATUS, "ADMIN-STATUS object"},
+    {0, NULL}
 };
 
 /*
@@ -199,7 +255,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[] = {
@@ -216,7 +274,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}
 };
 
 /*
@@ -238,170 +300,16 @@ 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.
  */
 enum    qos_service_type {
     QOS_QUALITATIVE =     128,          /* Qualitative service */
+    QOS_NULL =              6,          /* Null service (RFC2997) */
     QOS_CONTROLLED_LOAD=    5,         /* Controlled Load Service */
     QOS_GUARANTEED =        2,         /* Guaranteed service */
     QOS_TSPEC =             1          /* Traffic specification */
@@ -409,15 +317,19 @@ enum    qos_service_type {
 
 static value_string qos_vals[] = {
     { QOS_QUALITATIVE, "Qualitative QoS" },
+    { QOS_NULL, "Null-Service QoS" },
     { 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" }
+    { 126, "Compression Hint" },
+    { 127, "Token bucket" },
+    { 128, "Null Service" },
+    { 130, "Guaranteed-rate RSpec" },
+    { 0, NULL }
 };
 
 enum rsvp_spec_types { INTSRV = 2 };
@@ -426,16 +338,20 @@ enum intsrv_services {
        INTSRV_GENERAL = 1,
        INTSRV_GTD = 2,
        INTSRV_CLOAD = 5,
+       INTSRV_NULL = 6,
        INTSRV_QUALITATIVE = 128
 };
 
 static value_string intsrv_services_str[] = { 
     {INTSRV_GENERAL, "Default General Parameters"},
-    {INTSRV_GTD, "Guaranteed"},
+    {INTSRV_GTD, "Guaranteed Rate"},
     {INTSRV_CLOAD, "Controlled Load"},
-    {INTSRV_QUALITATIVE, "Qualitative"},
+    {INTSRV_NULL, "Null Service"},
+    {INTSRV_QUALITATIVE, "Null Service"},
+    { 0, NULL }
 };
 
+#if 0
 enum intsrv_field_name {
        INTSRV_NON_IS_HOPS = 1, INTSRV_COMPOSED_NON_IS_HOPS,
        INTSRV_IS_HOPS, INTSRV_COMPOSED_IS_HOPS,
@@ -454,91 +370,8 @@ enum intsrv_field_name {
        INTSRV_SHP_DELAY,       /* Gtd Parameter Csum */
        INTSRV_SHP_MAX_JITTER   /* Gtd Parameter Dsum */
 };
+#endif
 
-/*
- * 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"},
@@ -548,29 +381,75 @@ 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 -------------------- */
+const value_string gmpls_lsp_enc_str[] = {
+    { 1, "Packet"},
+    { 2, "Ethernet v2/DIX"},
+    { 3, "ANSI PDH"},
+    { 4, "ETSI PDH"},
+    { 5, "SDH ITU-T G.707"},
+    { 6, "SONET ANSI T1.105"},
+    { 7, "Digital Wrapper"},
+    { 8, "Lambda (photonic)"},
+    { 9, "Fiber"},
+    {10, "Ethernet 802.3"},
+    {11, "FiberChannel"},
+    { 0, NULL }
+};
 
-typedef struct {
-    rsvp_object base;
-    guint32 labels[0];
-} label;
-
-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;
-    guint8 name[0];
-} session_attribute;
+const value_string gmpls_switching_type_str[] = {
+    {  1, "Packet-Switch Capable-1 (PSC-1)"},
+    {  2, "Packet-Switch Capable-2 (PSC-2)"},
+    {  3, "Packet-Switch Capable-3 (PSC-3)"},
+    {  4, "Packet-Switch Capable-4 (PSC-4)"},
+    { 51, "Layer-2 Switch Capable (L2SC)"},
+    {100, "Time-Division-Multiplex Capable (TDM)"},
+    {150, "Lambda-Switch Capable (LSC)"},
+    {200, "Fiber-Switch Capable (FSC)"},
+    { 0, NULL }
+};
+
+static const value_string gmpls_gpid_str[] = {
+    { 5, "Asynchronous mapping of E3 (SONET, SDH)"},
+    { 8, "Bit synchronous mapping of E3 (SDH)"},
+    { 9, "Byte synchronous mapping of E3 (SDH)"},
+    {10, "Asynchronous mapping of DS2/T2 (SONET, SDH)"},
+    {11, "Bit synchronous mapping of DS2/T2 (SONET, SDH)"},
+    {13, "Asynchronous mapping of E1 (SONET, SDH)"},
+    {14, "Byte synchronous mapping of E1 (SONET, SDH)"},
+    {15, "Byte synchronous mapping of 31 * DS0 (SONET, SDH)"},
+    {16, "Asynchronous mapping of DS1/T1 (SONET, SDH)"},
+    {17, "Bit synchronous mapping of DS1/T1 (SONET, SDH)"},
+    {18, "Byte synchronous mapping of DS1/T1 (SONET, SDH)"},
+    {19, "VC-11 in VC-12 (SDH)"},
+    {22, "DS1 SF Asynchronous (SONET)"},
+    {23, "DS1 ESF Asynchronous (SONET)"},
+    {24, "DS3 M23 Asynchronous (SONET)"},
+    {25, "DS3 C-Bit Parity Asynchronous (SONET)"},
+    {26, "VT/LOVC (SONET, SDH)"},
+    {27, "STS SPE/HOVC (SONET, SDH)"},
+    {28, "POS - No Scrambling, 16 bit CRC (SONET, SDH)"},
+    {29, "POS - No Scrambling, 32 bit CRC (SONET, SDH)"},
+    {30, "POS - Scrambling, 16 bit CRC (SONET, SDH)"},
+    {31, "POS - Scrambling, 32 bit CRC (SONET, SDH)"},
+    {32, "ATM Mapping (SONET, SDH)"},
+    {33, "Ethernet (SDH, Lambda, Fiber)"},
+    {34, "SDH (Lambda, Fiber)"},
+    {35, "SONET (Lambda, Fiber)"},
+    {36, "Digital Wrapper (Lambda, Fiber)"},
+    {37, "Lambda (Fiber)"},
+    {38, "ETSI PDH (SDH)"},
+    {39, "ANSI PDH (SONET, SDH)"},
+    {40, "Link Access Protocol SDH: LAPS - X.85 and X.86 (SONET, SDH)"},
+    {41, "FDDI (SONET, SDH, Lambda, Fiber)"},
+    {42, "DQDB: ETSI ETS 300 216 (SONET, SDH)"},
+    {43, "FiberChannel-3 Services (FiberChannel)"},
+    { 0, NULL },
+};
+
+/* -------------------- Stuff for MPLS/TE objects -------------------- */
 
 static const value_string proto_vals[] = { {IP_PROTO_ICMP, "ICMP"},
                                            {IP_PROTO_IGMP, "IGMP"},
@@ -592,7 +471,15 @@ enum rsvp_filter_keys {
     RSVPF_PATHTEAR,
     RSVPF_RESVTEAR,
     RSVPF_RCONFIRM,
-
+    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 +504,24 @@ enum rsvp_filter_keys {
     RSVPF_LABEL_REQUEST,
     RSVPF_EXPLICIT_ROUTE,
     RSVPF_RECORD_ROUTE,
+    RSVPF_HELLO_OBJ,
+    RSVPF_MESSAGE_ID,
+    RSVPF_MESSAGE_ID_ACK,
+    RSVPF_MESSAGE_ID_LIST,
+    RSVPF_RECOVERY_LABEL,
+    RSVPF_UPSTREAM_LABEL,
+    RSVPF_LABEL_SET,
+    RSVPF_PROTECTION,
+
+    RSVPF_SUGGESTED_LABEL,
+    RSVPF_ACCEPTABLE_LABEL_SET,
+    RSVPF_RESTART_CAP,
 
     RSVPF_SESSION_ATTRIBUTE,
-
+    RSVPF_DCLASS,
+    RSVPF_LSP_TUNNEL_IF_ID,
+    RSVPF_NOTIFY_REQUEST,
+    RSVPF_ADMIN_STATUS,
     RSVPF_UNKNOWN_OBJ, 
 
     /* Session object */
@@ -644,157 +546,229 @@ 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_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "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_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "Resv Message", "rsvp.resv", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_PATHERR], 
-     { "Path Error Message", "rsvp.perr", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "Path Error Message", "rsvp.perr", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_RESVERR], 
-     { "Resv Error Message", "rsvp.rerr", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "Resv Error Message", "rsvp.rerr", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_PATHTEAR], 
-     { "Path Tear Message", "rsvp.ptear", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "Path Tear Message", "rsvp.ptear", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_RESVTEAR], 
-     { "Resv Tear Message", "rsvp.rtear", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "Resv Tear Message", "rsvp.rtear", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_RCONFIRM], 
-     { "Resv Confirm Message", "rsvp.resvconf", FT_UINT8, BASE_NONE, NULL, 0x0,
-       "" }},
+     { "Resv Confirm Message", "rsvp.resvconf", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
-    /* Object present */
+    {&rsvp_filter[RSVPF_RTEARCONFIRM], 
+     { "Resv Tear Confirm Message", "rsvp.rtearconf", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    /* 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_RECOVERY_LABEL], 
+     { "RECOVERY LABEL", "rsvp.recovery_label", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_UPSTREAM_LABEL], 
+     { "UPSTREAM LABEL", "rsvp.upstream_label", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_SUGGESTED_LABEL], 
+     { "SUGGESTED LABEL", "rsvp.suggested_label", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_LABEL_SET], 
+     { "RESTRICTED LABEL SET", "rsvp.label_set", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_ACCEPTABLE_LABEL_SET], 
+     { "ACCEPTABLE LABEL SET", "rsvp.acceptable_label_set", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_PROTECTION], 
+     { "PROTECTION", "rsvp.protection", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_RESTART_CAP], 
+     { "RESTART CAPABILITY", "rsvp.restart", 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", "rsvp.hello", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_DCLASS], 
+     { "DCLASS", "rsvp.dclass", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_LSP_TUNNEL_IF_ID], 
+     { "LSP INTERFACE-ID", "rsvp.lsp_tunnel_if_id", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_ADMIN_STATUS], 
+     { "ADMIN STATUS", "rsvp.admin_status", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_NOTIFY_REQUEST], 
+     { "NOTIFY REQUEST", "rsvp.notify_request", 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)
@@ -816,240 +790,457 @@ static inline int rsvp_class_to_filter_num(int classnum)
     case RSVP_CLASS_CONFIRM :
     case RSVP_CLASS_LABEL :
     case RSVP_CLASS_LABEL_REQUEST :
+    case RSVP_CLASS_HELLO :
     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_RECOVERY_LABEL :
+    case RSVP_CLASS_UPSTREAM_LABEL :
+    case RSVP_CLASS_LABEL_SET :
+    case RSVP_CLASS_PROTECTION :
+       return RSVPF_RECOVERY_LABEL + (classnum - RSVP_CLASS_RECOVERY_LABEL);
+
+    case RSVP_CLASS_SUGGESTED_LABEL :
+    case RSVP_CLASS_ACCEPTABLE_LABEL_SET :
+    case RSVP_CLASS_RESTART_CAP :
+       return RSVPF_SUGGESTED_LABEL + (classnum - RSVP_CLASS_SUGGESTED_LABEL);
+
+    case RSVP_CLASS_NOTIFY_REQUEST :
+    case RSVP_CLASS_ADMIN_STATUS :
+       return RSVPF_NOTIFY_REQUEST + (classnum - RSVP_CLASS_NOTIFY_REQUEST);
+
     case RSVP_CLASS_SESSION_ATTRIBUTE :
        return RSVPF_SESSION_ATTRIBUTE;
+    case RSVP_CLASS_DCLASS :
+       return RSVPF_DCLASS;
+    case RSVP_CLASS_LSP_TUNNEL_IF_ID :
+       return RSVPF_LSP_TUNNEL_IF_ID;
        
     default:
        return RSVPF_UNKNOWN_OBJ;
     }
 }
 
-void 
-dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) 
+static void
+find_rsvp_session_tempfilt(tvbuff_t *tvb, int hdr_offset, int *session_offp, int *tempfilt_offp)
+{
+    int s_off = 0, t_off = 0;
+    int len, off;
+
+    if (!tvb)
+       goto done;
+
+    len = tvb_get_ntohs(tvb, hdr_offset+6) + hdr_offset;
+    off = hdr_offset + 8;
+    for (off = hdr_offset + 8; off < len; off += tvb_get_ntohs(tvb, off)) {
+       switch(tvb_get_guint8(tvb, off+2)) {
+       case RSVP_CLASS_SESSION:
+           s_off = off;
+           break;
+       case RSVP_CLASS_SENDER_TEMPLATE:
+       case RSVP_CLASS_FILTER_SPEC:
+           t_off = off;
+           break;
+       default:
+           break;
+       }
+    }
+
+ done:
+    if (session_offp) *session_offp = s_off;
+    if (tempfilt_offp) *tempfilt_offp = t_off;
+}
+
+static char *summary_session (tvbuff_t *tvb, int offset)
+{
+    static char buf[80];
+
+    switch(tvb_get_guint8(tvb, offset+3)) {
+    case 1:
+       snprintf(buf, 80, "SESSION: IPv4, Destination %s, Protocol %d, Port %d. ", 
+                ip_to_str(tvb_get_ptr(tvb, offset+4, 4)), 
+                tvb_get_guint8(tvb, offset+8),
+                tvb_get_ntohs(tvb, offset+10));
+       break;
+    case 7:
+       snprintf(buf, 80, "SESSION: IPv4-LSP, Destination %s, Tunnel ID %d, Ext ID %0x. ", 
+                ip_to_str(tvb_get_ptr(tvb, offset+4, 4)), 
+                tvb_get_ntohs(tvb, offset+10),
+                tvb_get_ntohl(tvb, offset+12));
+       break;
+    default:
+       snprintf(buf, 80, "SESSION: Type %d. ", tvb_get_guint8(tvb, offset+3));
+    }
+
+    return buf;
+}
+
+static char *summary_template (tvbuff_t *tvb, int offset)
+{
+    static char buf[80];
+    char *objtype;
+
+    if (tvb_get_guint8(tvb, offset+2) == RSVP_CLASS_FILTER_SPEC)
+       objtype = "FILTERSPEC";
+    else
+       objtype = "SENDER TEMPLATE";
+
+    switch(tvb_get_guint8(tvb, offset+3)) {
+    case 1:
+       snprintf(buf, 80, "%s: IPv4, Sender %s, Port %d. ", objtype,
+                ip_to_str(tvb_get_ptr(tvb, offset+4, 4)), 
+                tvb_get_ntohs(tvb, offset+10));
+       break;
+    case 7:
+       snprintf(buf, 80, "%s: IPv4-LSP, Tunnel Source: %s, LSP ID: %d. ", objtype,
+                ip_to_str(tvb_get_ptr(tvb, offset+4, 4)), 
+                tvb_get_ntohs(tvb, offset+10));
+       break;
+    default:
+       snprintf(buf, 80, "%s: Type %d. ", objtype, tvb_get_guint8(tvb, offset+3));
+    }
+
+    return buf;
+}
+
+static void 
+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;
+    proto_tree *rsvp_admin_subtree;
+    proto_tree *rsvp_hop_subtree;
+    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); 
+    int session_off, tempfilt_off;
+
+    if (check_col(pinfo->cinfo, COL_PROTOCOL))
+        col_set_str(pinfo->cinfo, COL_PROTOCOL, "RSVP");
+    if (check_col(pinfo->cinfo, COL_INFO))
+        col_clear(pinfo->cinfo, COL_INFO);
+
+    ver_flags = tvb_get_guint8(tvb, offset+0);
+    message_type = tvb_get_guint8(tvb, offset+1);
+    if (check_col(pinfo->cinfo, COL_INFO)) {
+        col_add_str(pinfo->cinfo, COL_INFO,
+            val_to_str(message_type, message_type_vals, "Unknown (%u). ")); 
+       find_rsvp_session_tempfilt(tvb, offset, &session_off, &tempfilt_off);
+       if (session_off) 
+           col_append_str(pinfo->cinfo, COL_INFO, summary_session(tvb, session_off));
+       if (tempfilt_off) 
+           col_append_str(pinfo->cinfo, COL_INFO, summary_template(tvb, tempfilt_off));
     }
 
     if (tree) {
-       msg_length = pntohs(pd+offset+6);
-       ti = proto_tree_add_item(tree, proto_rsvp, offset, msg_length, NULL);
+       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, offset, 
-                                sizeof(rsvp_header), "RSVP Header"); 
+       ti = proto_tree_add_text(rsvp_tree, tvb, offset, 8, "RSVP Header. %s", 
+                                val_to_str(message_type, message_type_vals, 
+                                           "Unknown Message (%u). ")); 
        rsvp_header_tree = proto_item_add_subtree(ti, ett_rsvp_hdr);
 
-        proto_tree_add_text(rsvp_header_tree, offset, 1, "RSVP Version: %u", 
-                           (hdr->ver_flags & 0xf0)>>4);  
-       proto_tree_add_text(rsvp_header_tree, offset, 1, "Flags: %02X",
-                           hdr->ver_flags & 0xf);  
-       proto_tree_add_item(rsvp_header_tree, rsvp_filter[RSVPF_MSG], 
-                           offset+1, 1, hdr->message_type);
-       if (hdr->message_type >= RSVPF_MAX) {
-           proto_tree_add_text(rsvp_header_tree, offset+1, 1, "Message Type: %u - Unknown",
-                               hdr->message_type);
-           return;
-       }
-       proto_tree_add_item_hidden(rsvp_header_tree, rsvp_filter[RSVPF_MSG + hdr->message_type], 
+        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, offset + 2 , 2, "Message Checksum");
-       proto_tree_add_text(rsvp_header_tree, offset + 4 , 1, "Sending TTL: %u",
-                           hdr->sending_ttl);
-       proto_tree_add_text(rsvp_header_tree, 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, offset, 1, 
-                                   "Further data not captured");
-               break;
+       }
+       cksum = tvb_get_ntohs(tvb, offset+2);
+       if (!pinfo->fragmented && (int) 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_item_hidden(rsvp_tree, rsvp_filter[RSVPF_OBJECT], 
-                                           offset, obj_length, obj->class);
-           ti = proto_tree_add_item(rsvp_tree, rsvp_filter[rsvp_class_to_filter_num(obj->class)], 
-                                    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, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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;
+               proto_item_set_text(ti, summary_session(tvb, offset));
+
+               switch(type) {
                case 1: {
-                   proto_tree_add_text(rsvp_object_tree, 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_item(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_IP], 
-                                       offset2, 4, ip_addr);
-
-                   proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_PROTO], 
-                                       offset2+4, 1, *(pd+offset2+4));
-                   proto_tree_add_text(rsvp_object_tree, offset2+5, 1,
-                                       "Flags: %x", pntohs(pd+offset2+5));
-                   proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_PORT], 
-                                       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);
                    break;
                }
 
                case 2: {
-                   rsvp_session_ipv6 *sess = (rsvp_session_ipv6 *)obj;
-                   proto_tree_add_text(rsvp_object_tree, 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, 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, offset2+16, 1,
-                                       "Protocol: %u", sess->protocol);
-                   proto_tree_add_text(rsvp_object_tree, offset2+17, 1,
-                                       "Flags: %x", sess->flags);
-                   proto_tree_add_text(rsvp_object_tree, 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, 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_item(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_IP], 
-                                       offset2, 4, ip_addr);
-
-                   proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_TUNNEL_ID], 
-                                       offset2+6, 2, pntohs(pd+offset2+6));
-
-                   memcpy(&ip_addr, pd+offset2+8, 4);
-                   proto_tree_add_text(rsvp_object_tree, offset2+8, 4, 
-                                       "Extended Tunnel ID: %lu (%s)", 
-                                       (unsigned long)ntohl(ip_addr),
-                                       ip_to_str(pd+offset2+8));
-                   proto_tree_add_item_hidden(rsvp_object_tree, rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID], 
-                                       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);
                    break;
                }
 
                default: {
-                   proto_tree_add_text(rsvp_object_tree, 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, 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, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, 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, 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, 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, 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, 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, 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;
                }
                
+               case 3: {
+                   guint16   tlv_off;
+                   guint16   tlv_type;
+                   guint16   tlv_len;
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: 3 - IPv4 Out-Of-Band");
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4, 
+                                       "Neighbor address: %s", 
+                                       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));
+
+                   for (tlv_off = 0; tlv_off < mylen - 8; ) {
+                       tlv_type = tvb_get_ntohs(tvb, offset2+8+tlv_off);
+                       tlv_len = tvb_get_ntohs(tvb, offset2+8+tlv_off+2);
+                       switch(tlv_type) {
+                       case 1: 
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb, 
+                                                     offset2+8+tlv_off, 8,
+                                                     "IPv4 TLV - %s",
+                                                     ip_to_str(tvb_get_ptr(tvb, offset2+8+tlv_off+4, 4)));
+                           rsvp_hop_subtree = 
+                               proto_item_add_subtree(ti2, ett_rsvp_hop_subobj); 
+                           proto_tree_add_text(rsvp_hop_subtree, tvb, offset2+8+tlv_off, 2,
+                                               "Type: 1 (IPv4)");
+                           proto_tree_add_text(rsvp_hop_subtree, tvb, offset2+8+tlv_off+2, 2,
+                                               "Length: %u",
+                                               tvb_get_ntohs(tvb, offset2+8+tlv_off+2));
+                           proto_tree_add_text(rsvp_hop_subtree, tvb, offset2+8+tlv_off+4, 4, 
+                                               "IPv4 address: %s", 
+                                               ip_to_str(tvb_get_ptr(tvb, offset2+8+tlv_off+4, 4)));
+                           proto_item_set_text(ti, "HOP: Out-of-band. Control IPv4: %s. Data IPv4: %s", 
+                                               ip_to_str(tvb_get_ptr(tvb, offset2, 4)), 
+                                               ip_to_str(tvb_get_ptr(tvb, offset2+8+tlv_off+4, 4)));
+                           break;
+
+                       case 3: 
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb, 
+                                                     offset2+8+tlv_off, 12,
+                                                     "Interface-Index TLV - %s, %d",
+                                                     ip_to_str(tvb_get_ptr(tvb, offset2+8+tlv_off+4, 4)),
+                                                     tvb_get_ntohl(tvb, offset2+8+tlv_off+8));
+                           rsvp_hop_subtree = 
+                               proto_item_add_subtree(ti2, ett_rsvp_hop_subobj); 
+                           proto_tree_add_text(rsvp_hop_subtree, tvb, offset2+8+tlv_off, 2,
+                                               "Type: 3 (Interface Index)");
+                           proto_tree_add_text(rsvp_hop_subtree, tvb, offset2+8+tlv_off+2, 2,
+                                               "Length: %u",
+                                               tvb_get_ntohs(tvb, offset2+8+tlv_off+2));
+                           proto_tree_add_text(rsvp_hop_subtree, tvb, offset2+8+tlv_off+4, 4, 
+                                               "IPv4 address: %s", 
+                                               ip_to_str(tvb_get_ptr(tvb, offset2+8+tlv_off+4, 4)));
+                           proto_tree_add_text(rsvp_hop_subtree, tvb, offset2+8+tlv_off+8, 4, 
+                                               "Interface-ID: %d", 
+                                               tvb_get_ntohl(tvb, offset2+8+tlv_off+8));
+                           proto_item_set_text(ti, "HOP: Out-of-band. Control IPv4: %s. Data If-Index: %s, %d", 
+                                               ip_to_str(tvb_get_ptr(tvb, offset2, 4)), 
+                                               ip_to_str(tvb_get_ptr(tvb, offset2+8+tlv_off+4, 4)), 
+                                               tvb_get_ntohl(tvb, offset2+8+tlv_off+8));
+                           break;
+
+                       default:
+                           proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
+                                               "Logical interface: %u", 
+                                               tvb_get_ntohl(tvb, offset2+4));
+                       }
+                       tlv_off += tlv_len;
+                   }
+                   break;
+               }
+
                default: {
-                   proto_tree_add_text(rsvp_object_tree, 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, 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, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, offset+3, 1, 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 1");
-                   proto_tree_add_text(rsvp_object_tree, 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, 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, offset2, i,
-                                       "Data (%d bytes)", i);
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
                    break;
                }
                }
@@ -1057,83 +1248,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, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, 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, 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, offset2+4, 1,
-                                       "Flags: %02x", err->flags);
-                   proto_tree_add_text(rsvp_object_tree, offset2+5, 1,
-                                       "Error code: %u - %s", err->error_code,
-                                       err_str);
-                   proto_tree_add_text(rsvp_object_tree, 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 (%d)"));
+                   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, Error code: %s, Value: %d, Error Node: %s", 
+                                        val_to_str(error_code, rsvp_error_vals, "Unknown (%d)"),
+                                        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, 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, 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, offset2+16, 1,
-                                       "Flags: %02x", err->flags);
-                   proto_tree_add_text(rsvp_object_tree, offset2+17, 1,
-                                       "Error code: %u - %s", err->error_code,
-                                       err_str);
-                   proto_tree_add_text(rsvp_object_tree, 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, 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, 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, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, 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, 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;
                    }
@@ -1141,13 +1335,12 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
                }
 
                case 2: {
-                   proto_tree_add_text(rsvp_object_tree, 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, 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;
                    }
@@ -1155,42 +1348,48 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
                }
                
                default: {
-                   proto_tree_add_text(rsvp_object_tree, 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, 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, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, 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, 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, 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, offset2, i,
-                                       "Data (%d bytes)", i);
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
                    break;
                }
                }
@@ -1198,396 +1397,513 @@ 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, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, 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, 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: Receiver %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, 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, 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, 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, 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, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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 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, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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);
            common_template:
-               switch(obj->type) {
+               mylen = obj_length - 4;
+               proto_item_set_text(ti, summary_template(tvb, offset));
+               switch(type) {
                case 1: {
-                   proto_tree_add_text(rsvp_object_tree, 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_item(rsvp_object_tree, rsvp_filter[RSVPF_SENDER_IP], 
-                                       offset2, 4, ip_addr);
-
-                   proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_SENDER_PORT], 
-                                       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);
                    break;
                }
 
                case 2: {
-                   rsvp_template_ipv6 *tem = (rsvp_template_ipv6 *)obj;
-                   proto_tree_add_text(rsvp_object_tree, 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, 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, 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, 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_item(rsvp_object_tree, rsvp_filter[RSVPF_SENDER_IP], 
-                                       offset2, 4, ip_addr);
-
-                   proto_tree_add_item(rsvp_object_tree, rsvp_filter[RSVPF_SENDER_LSP_ID], 
-                                       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);
                    break;
                }
 
                default: {
-                   proto_tree_add_text(rsvp_object_tree, 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, 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;
+               proto_tree *tspec_tree;
 
-               mylen = obj_length;
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_sender_tspec);
-               proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, 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, 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;
+
+               proto_item_set_text(ti, "SENDER TSPEC: ");
 
-               mylen -=4;
-               offset2 +=4;
-               while (mylen > 4) {
-                   sh = (service_hdr *)(pd+offset2);
-                   str = match_strval(sh->service_num, qos_vals);
-                   if (!str) str = "Unknown";
+               while (mylen > 0) {
+                   guint8 service_num;
+                   guint8 param_id;
+                   guint16 param_len;
+                   guint16 param_len_processed;
+                   guint16 length;
 
-                   proto_tree_add_text(rsvp_object_tree, offset2, 1, 
+                   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, 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));
-
-                   offset2+=4; mylen -=4; 
-
-                   switch(sh->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, offset2, 1, 
-                                           "Parameter %u - %s", 
-                                           ist->param_id, str);
-                       proto_tree_add_text(rsvp_object_tree, offset2+1, 1, 
-                                           "Parameter %u flags: %x", 
-                                           ist->param_id, ist->flags_tspec);
-                       proto_tree_add_text(rsvp_object_tree, 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, offset2+4, 4, 
-                                           "Token bucket rate: %ld", 
-                                           pieee_to_long(pd+offset2+4));
-                       proto_tree_add_text(rsvp_object_tree, offset2+8, 4, 
-                                           "Token bucket size: %ld", 
-                                           pieee_to_long(pd+offset2+8));
-                       proto_tree_add_text(rsvp_object_tree, offset2+12, 4, 
-                                           "Peak data rate: %ld", 
-                                           pieee_to_long(pd+offset2+12));
-                       proto_tree_add_text(rsvp_object_tree, offset2+16, 4, 
-                                           "Minimum policed unit: %u", 
-                                           pntohl(pd+offset2+16));
-                       proto_tree_add_text(rsvp_object_tree, offset2+20, 4, 
-                                           "Maximum policed unit: %u", 
-                                           pntohl(pd+offset2+20));
-
-                       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, offset2, 1, 
-                                           "Parameter %u - %s", 
-                                           qt->param_id, str);
-                       proto_tree_add_text(rsvp_object_tree, offset2+1, 1, 
-                                           "Parameter %u flags: %x", 
-                                           qt->param_id, qt->flags_tspec);
-                       proto_tree_add_text(rsvp_object_tree, 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, offset2+4, 4, 
-                                           "Maximum policed unit: %u", 
-                                           pntohl(pd+offset2+4));
-
-                       break;
+                                       service_num, length);
+
+                   mylen -= 4;
+                   offset2 += 4;
+
+                   /* Process all known service headers as a set of parameters */
+                   param_len_processed = 0;
+                   while (param_len_processed < length) {
+                       param_id = tvb_get_guint8(tvb, offset2);
+                       param_len = tvb_get_ntohs(tvb, offset2+2) + 1;
+                       switch(param_id) {
+                       case 127: 
+                           /* Token Bucket */
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
+                                                     offset2, param_len*4, 
+                                                     "Token Bucket TSpec: ");
+                           tspec_tree = proto_item_add_subtree(ti2, ett_rsvp_sender_tspec_subtree);
+
+                           proto_tree_add_text(tspec_tree, tvb, offset2, 1, 
+                                               "Parameter %u - %s", 
+                                               param_id,
+                                               val_to_str(param_id, svc_vals, "Unknown"));
+                           proto_tree_add_text(tspec_tree, tvb, offset2+1, 1,
+                                               "Parameter %u flags: 0x%02x",
+                                               param_id,
+                                               tvb_get_guint8(tvb, offset2+1));
+                           proto_tree_add_text(tspec_tree, tvb, offset2+2, 2,
+                                               "Parameter %u data length: %u words, " 
+                                               "not including header",
+                                               param_id,
+                                               tvb_get_ntohs(tvb, offset2+2));
+                           proto_tree_add_text(tspec_tree, tvb, offset2+4, 4,
+                                               "Token bucket rate: %.10g", 
+                                               tvb_get_ntohieee_float(tvb, offset2+4));
+                           proto_tree_add_text(tspec_tree, tvb, offset2+8, 4,
+                                               "Token bucket size: %.10g", 
+                                               tvb_get_ntohieee_float(tvb, offset2+8));
+                           proto_tree_add_text(tspec_tree, tvb, offset2+12, 4,
+                                               "Peak data rate: %.10g", 
+                                               tvb_get_ntohieee_float(tvb, offset2+12));
+                           proto_tree_add_text(tspec_tree, tvb, offset2+16, 4,
+                                               "Minimum policed unit [m]: %u", 
+                                               tvb_get_ntohl(tvb, offset2+16));
+                           proto_tree_add_text(tspec_tree, tvb, offset2+20, 4,
+                                               "Maximum packet size [M]: %u", 
+                                               tvb_get_ntohl(tvb, offset2+20));
+                           proto_item_append_text(ti, "Token Bucket, %.10g bytes/sec. ", 
+                                                  tvb_get_ntohieee_float(tvb, offset2+4));
+                           proto_item_append_text(ti2, "Rate=%.10g Burst=%.10g Peak=%.10g m=%u M=%u", 
+                                                  tvb_get_ntohieee_float(tvb, offset2+4),
+                                                  tvb_get_ntohieee_float(tvb, offset2+8),
+                                                  tvb_get_ntohieee_float(tvb, offset2+12),
+                                                  tvb_get_ntohl(tvb, offset2+16),
+                                                  tvb_get_ntohl(tvb, offset2+20));
+                           break;
 
+                       case 128:
+                           /* Null Service (RFC2997) */
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
+                                                     offset2, param_len*4, 
+                                                     "Null Service TSpec: ");
+                           tspec_tree = proto_item_add_subtree(ti2, ett_rsvp_sender_tspec_subtree);
+                               
+                           proto_tree_add_text(tspec_tree, tvb, offset2, 1, 
+                                               "Parameter %u - %s", 
+                                               param_id,
+                                               val_to_str(param_id, svc_vals, "Unknown"));
+                           proto_tree_add_text(tspec_tree, tvb, offset2+1, 1,
+                                               "Parameter %u flags: %x", 
+                                               param_id,
+                                               tvb_get_guint8(tvb, offset2+1));
+                           proto_tree_add_text(tspec_tree, tvb, offset2+2, 2,
+                                               "Parameter %u data length: %u words, " 
+                                               "not including header",
+                                               param_id,
+                                               tvb_get_ntohs(tvb, offset2+2));
+                           proto_tree_add_text(tspec_tree, tvb, offset2+4, 4,
+                                               "Maximum packet size [M]: %u", 
+                                               tvb_get_ntohl(tvb, offset2+4));
+                           proto_item_append_text(ti, "Null Service. M=%u", 
+                                                  tvb_get_ntohl(tvb, offset2+4));
+                           proto_item_append_text(ti2, "Max pkt size=%u", 
+                                                  tvb_get_ntohl(tvb, offset2+4));
+                           break;
+
+                       case 126:
+                           /* Compression hint (RFC3006) */
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
+                                                     offset2, param_len*4, 
+                                                     "Compression Hint: ");
+                           tspec_tree = proto_item_add_subtree(ti2, ett_rsvp_sender_tspec_subtree);
+                               
+                           proto_tree_add_text(tspec_tree, tvb, offset2, 1, 
+                                               "Parameter %u - %s", 
+                                               param_id,
+                                               val_to_str(param_id, svc_vals, "Unknown"));
+                           proto_tree_add_text(tspec_tree, tvb, offset2+1, 1,
+                                               "Parameter %u flags: %x", 
+                                               param_id,
+                                               tvb_get_guint8(tvb, offset2+1));
+                           proto_tree_add_text(tspec_tree, tvb, offset2+2, 2,
+                                               "Parameter %u data length: %u words, " 
+                                               "not including header",
+                                               param_id,
+                                               tvb_get_ntohs(tvb, offset2+2));
+                           proto_tree_add_text(tspec_tree, tvb, offset2+4, 4,
+                                               "Hint: %u", 
+                                               tvb_get_ntohl(tvb, offset2+4));
+                           proto_tree_add_text(tspec_tree, tvb, offset2+4, 4,
+                                               "Compression Factor: %u", 
+                                               tvb_get_ntohl(tvb, offset2+8));
+                           proto_item_append_text(ti, "Compression Hint. Hint=%u, Factor=%u", 
+                                                  tvb_get_ntohl(tvb, offset2+4),
+                                                  tvb_get_ntohl(tvb, offset2+8));
+                           proto_item_append_text(ti2, "Hint=%u, Factor=%u", 
+                                                  tvb_get_ntohl(tvb, offset2+4),
+                                                  tvb_get_ntohl(tvb, offset2+8));
+                           break;
+
+                       default: 
+                           proto_tree_add_text(rsvp_object_tree, tvb, offset2, param_len*4, 
+                                               "Unknown parameter %d, %d words", 
+                                               param_id, param_len);
+                           break;
+                       }
+                       param_len_processed += param_len;
+                       offset2 += param_len*4;
                    }
-                   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;
+               proto_tree *flowspec_tree;
 
-               mylen = obj_length;
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_flowspec);
-               proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, 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, 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, intsrv_services_str);
-                   if (!str) str = "Unknown";
+               proto_item_set_text(ti, "FLOWSPEC: ");
 
-                   proto_tree_add_text(rsvp_object_tree, offset2, 1, 
+               mylen -= 4;
+               offset2+= 4;
+               while (mylen > 0) {
+                   guint8 service_num;
+                   guint16 length;
+                   guint8 param_id;
+                   guint16 param_len;
+                   guint16 param_len_processed;
+
+                   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, 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));
-
-                   offset2+=4; mylen -=4; 
-
-                   switch(sh->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, offset2, 1, 
-                                           "Parameter %u - %s", 
-                                           isf->tspec.param_id, str);
-                       proto_tree_add_text(rsvp_object_tree, offset2+1, 1, 
-                                           "Parameter %u flags: %x", 
-                                           isf->tspec.param_id, isf->tspec.flags_tspec);
-                       proto_tree_add_text(rsvp_object_tree, 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, offset2+4, 4, 
-                                           "Token bucket rate: %ld", 
-                                           pieee_to_long(pd+offset2+4));
-                       proto_tree_add_text(rsvp_object_tree, offset2+8, 4, 
-                                           "Token bucket size: %ld", 
-                                           pieee_to_long(pd+offset2+8));
-                       proto_tree_add_text(rsvp_object_tree, offset2+12, 4, 
-                                           "Peak data rate: %ld", 
-                                           pieee_to_long(pd+offset2+12));
-                       proto_tree_add_text(rsvp_object_tree, offset2+16, 4, 
-                                           "Minimum policed unit: %u", 
-                                           pntohl(pd+offset2+16));
-                       proto_tree_add_text(rsvp_object_tree, offset2+20, 4, 
-                                           "Maximum policed unit: %u", 
-                                           pntohl(pd+offset2+20));
-                       if (sh->service_num!=QOS_GUARANTEED)
+                                       service_num,
+                                       length);
+
+                   mylen -= 4;
+                   offset2 += 4;
+
+                   proto_item_append_text(ti, "%s: ", 
+                                          val_to_str(service_num, intsrv_services_str, 
+                                                     "Unknown (%d)"));
+
+                   /* Process all known service headers as a set of parameters */
+                   param_len_processed = 0;
+                   while (param_len_processed < length) {
+                       param_id = tvb_get_guint8(tvb, offset2);
+                       param_len = tvb_get_ntohs(tvb, offset2+2) + 1;
+                       switch(param_id) {
+                       case 127: 
+                           /* Token Bucket */
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
+                                                     offset2, param_len*4, 
+                                                     "Token Bucket: ");
+                           flowspec_tree = proto_item_add_subtree(ti2, ett_rsvp_flowspec_subtree);
+
+                           proto_tree_add_text(flowspec_tree, tvb, offset2, 1, 
+                                               "Parameter %u - %s", 
+                                               param_id,
+                                               val_to_str(param_id, svc_vals, "Unknown"));
+                           proto_tree_add_text(flowspec_tree, tvb, offset2+1, 1,
+                                               "Parameter %u flags: 0x%02x",
+                                               param_id,
+                                               tvb_get_guint8(tvb, offset2+1));
+                           proto_tree_add_text(flowspec_tree, tvb, offset2+2, 2,
+                                               "Parameter %u data length: %u words, " 
+                                               "not including header",
+                                               param_id,
+                                               tvb_get_ntohs(tvb, offset2+2));
+                           proto_tree_add_text(flowspec_tree, tvb, offset2+4, 4,
+                                               "Token bucket rate: %.10g", 
+                                               tvb_get_ntohieee_float(tvb, offset2+4));
+                           proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4,
+                                               "Token bucket size: %.10g", 
+                                               tvb_get_ntohieee_float(tvb, offset2+8));
+                           proto_tree_add_text(flowspec_tree, tvb, offset2+12, 4,
+                                               "Peak data rate: %.10g", 
+                                               tvb_get_ntohieee_float(tvb, offset2+12));
+                           proto_tree_add_text(flowspec_tree, tvb, offset2+16, 4,
+                                               "Minimum policed unit [m]: %u", 
+                                               tvb_get_ntohl(tvb, offset2+16));
+                           proto_tree_add_text(flowspec_tree, tvb, offset2+20, 4,
+                                               "Maximum packet size [M]: %u", 
+                                               tvb_get_ntohl(tvb, offset2+20));
+                           proto_item_append_text(ti, "Token Bucket, %.10g bytes/sec. ", 
+                                                  tvb_get_ntohieee_float(tvb, offset2+4));
+                           proto_item_append_text(ti2, "Rate=%.10g Burst=%.10g Peak=%.10g m=%u M=%u", 
+                                                  tvb_get_ntohieee_float(tvb, offset2+4),
+                                                  tvb_get_ntohieee_float(tvb, offset2+8),
+                                                  tvb_get_ntohieee_float(tvb, offset2+12),
+                                                  tvb_get_ntohl(tvb, offset2+16),
+                                                  tvb_get_ntohl(tvb, offset2+20));
+                           break;
+
+                       case 130:
+                           /* Guaranteed-rate RSpec */
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
+                                                     offset2, param_len*4, 
+                                                     "Guaranteed-Rate RSpec: ");
+                           flowspec_tree = proto_item_add_subtree(ti2, ett_rsvp_flowspec_subtree);
+                           proto_tree_add_text(flowspec_tree, tvb, offset2, 1,
+                                               "Parameter %u - %s", 
+                                               param_id,
+                                               val_to_str(param_id, svc_vals, "Unknown"));
+                           proto_tree_add_text(flowspec_tree, tvb, offset2+1, 1, 
+                                               "Parameter %u flags: %x", 
+                                               param_id,
+                                               tvb_get_guint8(tvb, offset2+1));
+                           proto_tree_add_text(flowspec_tree, tvb, offset2+2, 2,
+                                               "Parameter %u data length: %u words, " 
+                                               "not including header",
+                                               param_id,
+                                               tvb_get_ntohs(tvb, offset2+2));
+                           
+                           proto_tree_add_text(flowspec_tree, tvb, offset2+4, 4,
+                                               "Rate: %.10g", 
+                                               tvb_get_ntohieee_float(tvb, offset2+4));
+                           proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4,
+                                               "Slack term: %u", 
+                                               tvb_get_ntohl(tvb, offset2+8));
+                           proto_item_append_text(ti, "RSpec, %.10g bytes/sec. ", 
+                                                  tvb_get_ntohieee_float(tvb, offset2+4));
+                           proto_item_append_text(ti2, "R=%.10g, s=%u", 
+                                                  tvb_get_ntohieee_float(tvb, offset2+4),
+                                                  tvb_get_ntohl(tvb, offset2+8));
+                           break;
+
+                       case 128:
+                           /* Null Service (RFC2997) */
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
+                                                     offset2, param_len*4, 
+                                                     "Null Service Flowspec: ");
+                           flowspec_tree = proto_item_add_subtree(ti2, ett_rsvp_flowspec_subtree);
+                               
+                           proto_tree_add_text(flowspec_tree, tvb, offset2, 1, 
+                                               "Parameter %u - %s", 
+                                               param_id,
+                                               val_to_str(param_id, svc_vals, "Unknown"));
+                           proto_tree_add_text(flowspec_tree, tvb, offset2+1, 1,
+                                               "Parameter %u flags: %x", 
+                                               param_id,
+                                               tvb_get_guint8(tvb, offset2+1));
+                           proto_tree_add_text(flowspec_tree, tvb, offset2+2, 2,
+                                               "Parameter %u data length: %u words, " 
+                                               "not including header",
+                                               param_id,
+                                               tvb_get_ntohs(tvb, offset2+2));
+                           proto_tree_add_text(flowspec_tree, tvb, offset2+4, 4,
+                                               "Maximum packet size [M]: %u", 
+                                               tvb_get_ntohl(tvb, offset2+4));
+                           proto_item_append_text(ti, "Null Service. M=%u", 
+                                                  tvb_get_ntohl(tvb, offset2+4));
+                           proto_item_append_text(ti2, "Max pkt size=%u", 
+                                                  tvb_get_ntohl(tvb, offset2+4));
+                           break;
+
+                       default: 
+                           proto_tree_add_text(rsvp_object_tree, tvb, offset2, param_len*4, 
+                                               "Unknown parameter %d, %d words", 
+                                               param_id, param_len);
                            break;
-                       
-                       /* Guaranteed-rate RSpec */
-                       str = match_strval(isf->rspec.param_id, svc_vals);
-                       if (!str) str="Unknown";
-                       proto_tree_add_text(rsvp_object_tree, offset2+24, 1, 
-                                           "Parameter %u - %s", 
-                                           isf->rspec.param_id, str);
-                       proto_tree_add_text(rsvp_object_tree, offset2+25, 1, 
-                                           "Parameter %u flags: %x", 
-                                           isf->rspec.param_id, isf->rspec.flags_rspec);
-                       proto_tree_add_text(rsvp_object_tree, offset2+26, 2, 
-                                           "Parameter %u data length: %u words, " 
-                                           "not including header",
-                                           isf->rspec.param_id,
-                                           ntohs(isf->rspec.param2_length));
-
-                       proto_tree_add_text(rsvp_object_tree, offset2+28, 4, 
-                                           "Rate: %ld", 
-                                           pieee_to_long(pd+offset2+28));
-                       proto_tree_add_text(rsvp_object_tree, offset2+32, 4, 
-                                           "Slack term: %u", 
-                                           pntohl(pd+offset2+32));
-                       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, offset2, 1, 
-                                           "Parameter %u - %s", 
-                                           qf->param_id, str);
-                       proto_tree_add_text(rsvp_object_tree, offset2+1, 1, 
-                                           "Parameter %u flags: %x", 
-                                           qf->param_id, qf->flags_tspec);
-                       proto_tree_add_text(rsvp_object_tree, 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, offset2+4, 4, 
-                                           "Maximum policed unit: %u", 
-                                           pntohl(pd+offset2+4));
-                       
-                       break;
+                       }
+                       param_len_processed += param_len;
+                       offset2 += param_len * 4;
                    }
-                   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, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, 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, 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, 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, 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, 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, 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:
@@ -1596,39 +1912,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, 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, offset2, 
-                                                   (pntohs(&phdr->length)+1)<<2,
-                                                   "%s - %lu (type %u, length %u)",
-                                                   str, 
-                                                   pieee_to_long(&phdr->dataval), 
-                                                   phdr->id, pntohs(&phdr->length));
+                               proto_tree_add_text(adspec_tree, tvb, offset2,
+                                                   (phdr_length+1)<<2,
+                                                   "%s - %.10g (type %u, length %u)",
+                                                   str,
+                                                   tvb_get_ntohieee_float(tvb, offset2+4),
+                                                   id, phdr_length);
                                break;
                            default: 
-                               proto_tree_add_text(adspec_tree, 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, 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;
@@ -1636,134 +1952,205 @@ 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, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, 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, 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;
+               }
+
+               case 4: {
+                   unsigned short l3pid = tvb_get_ntohs(tvb, offset2+2);
+                   unsigned char  lsp_enc = tvb_get_guint8(tvb,offset2);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: 4 (Generalized Label Request)");
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
+                                       "LSP Encoding Type: %s",
+                                       val_to_str(lsp_enc, gmpls_lsp_enc_str, "Unknown (%d)"));
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
+                                       "Switching Type: %s",
+                                       val_to_str(tvb_get_guint8(tvb,offset2+1), 
+                                                  gmpls_switching_type_str, "Unknown (%d)"));
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
+                                       "G-PID: %s (0x%0x)",
+                                       val_to_str(l3pid, gmpls_gpid_str, 
+                                                  val_to_str(l3pid, etype_vals, 
+                                                             "Unknown G-PID(0x%04x)")),
+                                       l3pid);
+                    proto_item_set_text(ti, "LABEL REQUEST: Generalized: LSP Encoding=%s, "
+                                       "Switching Type=%s, G-PID=%s ",
+                                       val_to_str(lsp_enc, gmpls_lsp_enc_str, "Unknown (%d)"),
+                                       val_to_str(tvb_get_guint8(tvb,offset2+1), 
+                                                  gmpls_switching_type_str, "Unknown (%d)"),
+                                       val_to_str(l3pid, gmpls_gpid_str, 
+                                                  val_to_str(l3pid, etype_vals, 
+                                                             "Unknown (0x%04x)")));
                    break;
                }
 
                default: {
-                   proto_tree_add_text(rsvp_object_tree, offset+3, 1, 
-                                       "C-type: Unknown (%d)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, 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_LABEL : 
+           case RSVP_CLASS_UPSTREAM_LABEL : 
+           case RSVP_CLASS_SUGGESTED_LABEL : 
+           case RSVP_CLASS_LABEL : {
+               char *name;
+               name = (class==RSVP_CLASS_SUGGESTED_LABEL ? "SUGGESTED LABEL" : 
+                       (class==RSVP_CLASS_UPSTREAM_LABEL ? "UPSTREAM LABEL" :
+                        "LABEL"));
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_label);
-               proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, 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, 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, offset+3, 1, 
+                                       "C-type: 1 (Packet Label)");
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
+                                        "Label: %u", 
+                                        tvb_get_ntohl(tvb, offset2));
+                    proto_item_set_text(ti, "%s: %d", name,
+                                        tvb_get_ntohl(tvb, offset2));
+                   break;
+               }
+
+               case 2: {
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: 2 (Generalized Label)");
+                    proto_item_set_text(ti, "%s: Generalized: ", name);
+                   for (i = 0; i < mylen; i += 4) {
+                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+i, 4,
+                                           "Generalized Label: %u", 
+                                           tvb_get_ntohl(tvb, offset2+i));
+                       if (i < 16) {
+                           proto_item_append_text(ti, "%d%s", 
+                                                  tvb_get_ntohl(tvb, offset2+i),
+                                                  i+4<mylen?", ":"");
+                       } else if (i == 16) {
+                           proto_item_append_text(ti, "...");
+                       }                           
+                   }
                    break;
                }
 
                default: {
-                   proto_tree_add_text(rsvp_object_tree, offset+3, 1, 
-                                       "C-type: Unknown (%d)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, 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_SESSION_ATTRIBUTE : 
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_session_attribute);
-               proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, 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, offset2, 1,
-                                       "Setup priority: %d", s_attr->setup_prio);
-                   proto_tree_add_text(rsvp_object_tree, offset2+1, 1,
-                                       "Hold priority: %d", s_attr->hold_prio);
-                   ti2 = proto_tree_add_text(rsvp_object_tree, 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, 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, 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, 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, offset2+3, 1,
-                                       "Name length: %d", s_attr->name_len);
-                   memset(s_name, 0, 64);
-                   strncpy(s_name, s_attr->name, 60); 
-                   if (s_attr->name_len>60) sprintf(&(s_name[60]), "...");
-                   proto_tree_add_text(rsvp_object_tree, 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));
+
+                   proto_item_set_text(ti, "SESSION ATTRIBUTE: SetupPrio %d, HoldPrio %d, %s%s%s [%s]",
+                                       tvb_get_guint8(tvb, offset2), 
+                                       tvb_get_guint8(tvb, offset2+1),
+                                       flags &0x01 ? "Local Protection, " : "",
+                                       flags &0x02 ? "Merging, " : "",
+                                       flags &0x04 ? "May Reroute, " : "",
+                                       name_len ? (char*)tvb_format_text(tvb, offset2+4, name_len) : "");
                    break;
                }
 
                default: {
-                   proto_tree_add_text(rsvp_object_tree, offset+3, 1, 
-                                       "C-type: Unknown (%d)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, 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;
                }
                }
@@ -1771,118 +2158,215 @@ 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, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, 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;
+                   proto_item_set_text(ti, "EXPLICIT ROUTE: ");
+                   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, 
+                           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, 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, offset2+l, 1, 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                "Type: 1 (IPv4)");
-                           proto_tree_add_text(rsvp_ero_subtree, offset2+l+1, 1, 
-                                               "Length: %d", pd[offset2+l+1]);
-                           proto_tree_add_text(rsvp_ero_subtree, offset2+l+2, 4, 
-                                               "IPv4 hop: %s", ip_to_str(&pd[offset2+l+2]));
-                           proto_tree_add_text(rsvp_ero_subtree, 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));
+                           if (i < 4) {
+                               proto_item_append_text(ti, "IPv4 %s%s", 
+                                                      ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)),
+                                                      k ? " [L]":"");
+                           }
+
                            break;
 
                        case 2: /* IPv6 */
-                           ti2 = proto_tree_add_text(rsvp_object_tree, 
+                           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, 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, offset2+l, 1, 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                "Type: 2 (IPv6)");
-                           proto_tree_add_text(rsvp_ero_subtree, 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, offset2+l+2, 16, 
-                                               "IPv6 hop: %s", ip6_to_str(ip6a));
-                           proto_tree_add_text(rsvp_ero_subtree, 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));
+                           if (i < 4) {
+                               proto_item_append_text(ti, "IPv6 [...]%s", k ? " [L]":"");
+                           }
+
+                           break;
+
+                       case 3: /* Label */
+                           k = tvb_get_guint8(tvb, offset2+l) & 0x80;
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb, 
+                                                     offset2+l, 8,
+                                                     "Label Subobject - %d, %s",
+                                                     tvb_get_ntohl(tvb, offset2+l+4), 
+                                                     k ? "Loose" : "Strict");
+                           rsvp_ero_subtree = 
+                               proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj); 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
+                                               k ? "Loose Hop " : "Strict Hop");
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
+                                               "Type: 3 (Label)");
+                           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, 1,
+                                               "Flags: %0x", 
+                                               tvb_get_guint8(tvb, offset2+l+2));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+3, 1,
+                                               "C-Type: %u",
+                                               tvb_get_guint8(tvb, offset2+l+3));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+4, 4,
+                                               "Label: %d",
+                                               tvb_get_ntohl(tvb, offset2+l+4));
+                           if (i < 4) {
+                               proto_item_append_text(ti, "Label %d%s", 
+                                                      tvb_get_ntohl(tvb, offset2+l+4), 
+                                                      k ? " [L]":"");
+                           }
+                           break;
+
+                       case 4: /* Unnumbered Interface-ID */
+                           k = tvb_get_guint8(tvb, offset2+l) & 0x80;
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb, 
+                                                     offset2+l, 8,
+                                                     "Unnumbered Interface-ID - %s, %d, %s",
+                                                     ip_to_str(tvb_get_ptr(tvb, offset2+l+4, 4)),
+                                                     tvb_get_ntohl(tvb, offset2+l+8), 
+                                                     k ? "Loose" : "Strict");
+                           rsvp_ero_subtree = 
+                               proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj); 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
+                                               k ? "Loose Hop " : "Strict Hop");
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
+                                               "Type: 4 (Unnumbered Interface-ID)");
+                           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+4, 4,
+                                               "Router-ID: %s",
+                                               ip_to_str(tvb_get_ptr(tvb, offset2+l+4, 4)));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+8, 4,
+                                               "Interface-ID: %d",
+                                               tvb_get_ntohl(tvb, offset2+l+8));
+                           if (i < 4) {
+                               proto_item_append_text(ti, "Unnum %s/%d%s", 
+                                                      ip_to_str(tvb_get_ptr(tvb, offset2+l+4, 4)),
+                                                      tvb_get_ntohl(tvb, offset2+l+8),
+                                                      k ? " [L]":"");
+                           }
+
                            break;
 
                        case 32: /* AS */
-                           k = pntohs(offset2+l+2);
-                           ti2 = proto_tree_add_text(rsvp_object_tree, 
+                           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, offset2+l, 1, 
-                                               k ? "Loose Hop " : "Strict Hop");
-                           proto_tree_add_text(rsvp_ero_subtree, 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, offset2+l+1, 1, 
-                                               "Length: %d", pd[offset2+l+1]);
-                           proto_tree_add_text(rsvp_ero_subtree, 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);
+                           if (i < 4) {
+                               proto_item_append_text(ti, "AS %d", 
+                                                      tvb_get_ntohs(tvb, offset2+l+2));
+                           }
+
                            break;
 
                        case 64: /* Path Term */
-                           k = ((unsigned char)pd[offset2+l]) & 0x80;
-                           ti2 = proto_tree_add_text(rsvp_object_tree, 
+                           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, 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, 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, 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));
+                           if (i < 4) {
+                               proto_item_append_text(ti, "Path Term");
+                           }
                            break;
 
                        default: /* Unknown subobject */
-                           k = ((unsigned char)pd[offset2+l]) & 0x80;
-                           ti2 = proto_tree_add_text(rsvp_object_tree, 
-                                                     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, 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, offset2+l, 1, 
-                                               "Type: %d (Unknown)", j);
-                           proto_tree_add_text(rsvp_ero_subtree, 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);
+                       if (l < mylen) {
+                           if (i < 4)
+                               proto_item_append_text(ti, ", ");
+                           else if (i==4)
+                               proto_item_append_text(ti, "...");
+                       }
                    }
                    break;
                }
                default: {
-                   proto_tree_add_text(rsvp_object_tree, offset+3, 1, 
-                                       "C-type: Unknown (%d)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, 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;
                }
                }
@@ -1891,96 +2375,429 @@ 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, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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);
+               proto_item_set_text(ti, "RECORD ROUTE: ");
+               mylen = obj_length - 4;
+               switch(type) {
                case 1: {
-                   proto_tree_add_text(rsvp_object_tree, 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, 
+                           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, offset2+l, 1, 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                "Type: 1 (IPv4)");
-                           proto_tree_add_text(rsvp_ero_subtree, offset2+l+1, 1, 
-                                               "Length: %d", pd[offset2+l+1]);
-                           proto_tree_add_text(rsvp_ero_subtree, offset2+l+2, 4, 
-                                               "IPv4 hop: %s", ip_to_str(&pd[offset2+l+2]));
-                           proto_tree_add_text(rsvp_ero_subtree, 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));
+                           if (i < 4) {
+                               proto_item_append_text(ti, "IPv4 %s", 
+                                                      ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)));
+                           }
+
                            break;
 
                        case 2: /* IPv6 */
-                           ti2 = proto_tree_add_text(rsvp_object_tree, 
+                           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, offset2+l, 1, 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
                                                "Type: 2 (IPv6)");
-                           proto_tree_add_text(rsvp_ero_subtree, 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, offset2+l+2, 16, 
-                                               "IPv6 hop: %s", ip6_to_str(ip6a));
-                           proto_tree_add_text(rsvp_ero_subtree, 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));
+                           if (i < 4) {
+                               proto_item_append_text(ti, "IPv6 [...]");
+                           }
+                           break;
+
+                       case 3: /* Label */
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb, 
+                                                     offset2+l, 8,
+                                                     "Label Subobject - %d",
+                                                     tvb_get_ntohl(tvb, offset2+l+4));
+                           rsvp_ero_subtree = 
+                               proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj); 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
+                                               "Type: 3 (Label)");
+                           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, 1,
+                                               "Flags: %0x", 
+                                               tvb_get_guint8(tvb, offset2+l+2));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+3, 1,
+                                               "C-Type: %u",
+                                               tvb_get_guint8(tvb, offset2+l+3));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+4, 4,
+                                               "Label: %d",
+                                               tvb_get_ntohl(tvb, offset2+l+4));
+                           if (i < 4) {
+                               proto_item_append_text(ti, "Label %d", 
+                                                      tvb_get_ntohl(tvb, offset2+l+4));
+                           }
+                           break;
+
+                       case 4: /* Unnumbered Interface-ID */
+                           ti2 = proto_tree_add_text(rsvp_object_tree, tvb, 
+                                                     offset2+l, 8,
+                                                     "Unnumbered Interface-ID - %s, %d",
+                                                     ip_to_str(tvb_get_ptr(tvb, offset2+l+4, 4)),
+                                                     tvb_get_ntohl(tvb, offset2+l+8));
+                           rsvp_ero_subtree = 
+                               proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj); 
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
+                                               "Type: 4 (Unnumbered Interface-ID)");
+                           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+1, 1,
+                                               "Flags: %u",
+                                               tvb_get_guint8(tvb, offset2+l+2));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+4, 4,
+                                               "Router-ID: %s",
+                                               ip_to_str(tvb_get_ptr(tvb, offset2+l+4, 4)));
+                           proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+8, 4,
+                                               "Interface-ID: %d",
+                                               tvb_get_ntohl(tvb, offset2+l+8));
+                           if (i < 4) {
+                               proto_item_append_text(ti, "Unnum %s/%d", 
+                                                      ip_to_str(tvb_get_ptr(tvb, offset2+l+4, 4)),
+                                                      tvb_get_ntohl(tvb, offset2+l+8));
+                           }
                            break;
 
                        default: /* Unknown subobject */
-                           k = ((unsigned char)pd[offset2+l]) & 0x80;
-                           ti2 = proto_tree_add_text(rsvp_object_tree, 
-                                                     offset2+l, pd[offset2+l+1],
-                                                     "Unknown subobject: %d", j);
+                           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, offset2+l, 1, 
-                                               k ? "Loose Hop " : "Strict Hop");
-                           proto_tree_add_text(rsvp_ero_subtree, offset2+l, 1, 
-                                               "Type: %d (Unknown)", j);
-                           proto_tree_add_text(rsvp_ero_subtree, 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);
+                       if (l < mylen) {
+                           if (i < 4)
+                               proto_item_append_text(ti, ", ");
+                           else if (i==4)
+                               proto_item_append_text(ti, "...");
+                       }
                    }
                    break;
                }
                
                default: {
-                   proto_tree_add_text(rsvp_object_tree, offset+3, 1, 
-                                       "C-type: Unknown (%d)",
-                                       obj->type);
-                   i = obj_length - sizeof(rsvp_object);
-                   proto_tree_add_text(rsvp_object_tree, 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;
+
+           case RSVP_CLASS_DCLASS:
+               rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_dclass);
+               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);
+               proto_item_set_text(ti, "DCLASS: ");
+                switch(type) {
+                case 1: 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: 1");
+                    for (mylen = 4; mylen < obj_length; mylen += 4) {
+                        proto_tree_add_text(rsvp_object_tree, tvb, offset+mylen+3, 1,
+                                            "DSCP: %s", 
+                                           val_to_str(tvb_get_guint8(tvb, offset+mylen+3),
+                                                      dscp_vals, "Unknown (%d)"));
+                       proto_item_append_text(ti, "%d%s", 
+                                              tvb_get_guint8(tvb, offset+mylen+3)>>2,
+                                              mylen==obj_length-4 ? "" : 
+                                              mylen<16 ? ", " : 
+                                              mylen==16 ? ", ..." : "");
+                   }
+                    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_ADMIN_STATUS: {
+               guint32 status;
+               rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_admin_status);
+               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);
+               proto_item_set_text(ti, "ADMIN STATUS: ");
+                switch(type) {
+                case 1: 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: 1");
+                   status = tvb_get_ntohl(tvb, offset2);
+                   ti2 = proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
+                                             "Admin Status: 0x%08x", status);
+                   rsvp_admin_subtree = 
+                       proto_item_add_subtree(ti2, ett_rsvp_admin_status_flags); 
+                   proto_tree_add_text(rsvp_admin_subtree, tvb, offset2, 1,
+                                       (status & (1<<31)) ? 
+                                       "R: 1. Reflect" : 
+                                       "R: 0. Do not reflect");
+                   proto_tree_add_text(rsvp_admin_subtree, tvb, offset2+3, 1,
+                                       (status & (1<<2)) ? 
+                                       "T: 1. Testing" : 
+                                       "T: 0. ");
+                   proto_tree_add_text(rsvp_admin_subtree, tvb, offset2+3, 1,
+                                       (status & (1<<1)) ? 
+                                       "A: 1. Administratively down" : 
+                                       "A: 0. ");
+                   proto_tree_add_text(rsvp_admin_subtree, tvb, offset2+3, 1,
+                                       (status & 1) ? 
+                                       "D: 1. Deletion in progress" : 
+                                       "D: 0. ");
+                    proto_item_set_text(ti, "ADMIN-STATUS: %s %s %s %s", 
+                                       (status & (1<<31)) ? "Reflect" : "",
+                                       (status & (1<<2))  ? "Testing" : "",
+                                       (status & (1<<1))  ? "Admin-Down" : "",
+                                       (status & (1<<0))  ? "Deleting" : "");
+                   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_LSP_TUNNEL_IF_ID:
+               rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_lsp_tunnel_if_id);
+               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);
+               proto_item_set_text(ti, "LSP INTERFACE-ID: ");
+                switch(type) {
+                case 1: 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: 1 - IPv4");
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4, 
+                                       "Router ID: %s",
+                                       ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
+                                       "Interface ID: %u", tvb_get_ntohl(tvb, offset2+4));
+                    proto_item_set_text(ti, "LSP INTERFACE-ID: IPv4, Router-ID %s, Interface-ID %d", 
+                                        ip_to_str(tvb_get_ptr(tvb, offset2, 4)),
+                                       tvb_get_ntohl(tvb, offset2+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;
+
            default :
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_unknown_class);
-               proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", 
-                                   obj_length);
-               proto_tree_add_text(rsvp_object_tree, 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, 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 :
@@ -2002,6 +2819,7 @@ proto_register_rsvp(void)
                &ett_rsvp_hdr,
                &ett_rsvp_session,
                &ett_rsvp_hop,
+               &ett_rsvp_hop_subobj,
                &ett_rsvp_time_values,
                &ett_rsvp_error,
                &ett_rsvp_scope,
@@ -2010,7 +2828,9 @@ proto_register_rsvp(void)
                &ett_rsvp_sender_template,
                &ett_rsvp_filter_spec,
                &ett_rsvp_sender_tspec,
+               &ett_rsvp_sender_tspec_subtree,
                &ett_rsvp_flowspec,
+               &ett_rsvp_flowspec_subtree,
                &ett_rsvp_adspec,
                &ett_rsvp_adspec_subtree,
                &ett_rsvp_integrity,
@@ -2023,10 +2843,25 @@ proto_register_rsvp(void)
                &ett_rsvp_explicit_route_subobj,
                &ett_rsvp_record_route,
                &ett_rsvp_record_route_subobj,
+               &ett_rsvp_hello_obj,
+               &ett_rsvp_dclass,
+               &ett_rsvp_lsp_tunnel_if_id,
+               &ett_rsvp_admin_status,
+               &ett_rsvp_admin_status_flags,
                &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));
 }
+
+void
+proto_reg_handoff_rsvp(void)
+{
+       dissector_handle_t rsvp_handle;
+
+       rsvp_handle = create_dissector_handle(dissect_rsvp, proto_rsvp);
+       dissector_add("ip.proto", IP_PROTO_RSVP, rsvp_handle);
+}