Add HFILL to explicitly fill in some additional structure members.
[obnox/wireshark/wip.git] / packet-rsvp.c
index e11b0bb555132ce5d049b33c72b5eb6e19b17c69..842af9ee94d9bfbae10dc20eb224f92d03f4105a 100644 (file)
@@ -3,7 +3,7 @@
  *
  * (c) Copyright Ashok Narayanan <ashokn@cisco.com>
  *
- * $Id: packet-rsvp.c,v 1.39 2001/04/23 17:51:33 guy Exp $
+ * $Id: packet-rsvp.c,v 1.46 2001/06/26 20:50:30 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
@@ -69,7 +69,6 @@
 
 #include "packet.h"
 #include "in_cksum.h"
-#include "packet-ipv6.h"
 #include "ieee-float.h"
 #include "etypes.h"
 #include "ipproto.h"
@@ -97,6 +96,7 @@ static gint ett_rsvp_label = -1;
 static gint ett_rsvp_label_request = -1;
 static gint ett_rsvp_session_attribute = -1;
 static gint ett_rsvp_session_attribute_flags = -1;
+static gint ett_rsvp_hello_obj = -1;
 static gint ett_rsvp_explicit_route = -1;
 static gint ett_rsvp_explicit_route_subobj = -1;
 static gint ett_rsvp_record_route = -1;
@@ -108,9 +108,18 @@ static gint ett_rsvp_unknown_class = -1;
  * RSVP message types
  */
 typedef enum {
-    RSVP_MSG_PATH=1, RSVP_MSG_RESV, RSVP_MSG_PERR, RSVP_MSG_RERR,
-    RSVP_MSG_PTEAR, RSVP_MSG_RTEAR, RSVP_MSG_CONFIRM, 
-    RSVP_MSG_RTEAR_CONFIRM=10
+    RSVP_MSG_PATH=1, 
+    RSVP_MSG_RESV, 
+    RSVP_MSG_PERR, 
+    RSVP_MSG_RERR,
+    RSVP_MSG_PTEAR, 
+    RSVP_MSG_RTEAR, 
+    RSVP_MSG_CONFIRM, 
+    RSVP_MSG_RTEAR_CONFIRM=10,
+    RSVP_MSG_BUNDLE = 12,
+    RSVP_MSG_ACK,
+    RSVP_MSG_SREFRESH = 15,
+    RSVP_MSG_HELLO = 20
 } rsvp_message_types;
 
 static value_string message_type_vals[] = { 
@@ -122,6 +131,10 @@ static value_string message_type_vals[] = {
     {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}
 };
 
@@ -153,7 +166,12 @@ enum rsvp_classes {
     RSVP_CLASS_EXPLICIT_ROUTE,
     RSVP_CLASS_RECORD_ROUTE,
 
+    RSVP_CLASS_MESSAGE_ID = 23,
+    RSVP_CLASS_MESSAGE_ID_ACK,
+    RSVP_CLASS_MESSAGE_ID_LIST,
+
     RSVP_CLASS_SESSION_ATTRIBUTE=207,
+    RSVP_CLASS_HELLO = 22
 };
 
 static value_string rsvp_class_vals[] = { 
@@ -177,6 +195,10 @@ static value_string rsvp_class_vals[] = {
     {RSVP_CLASS_EXPLICIT_ROUTE, "EXPLICIT ROUTE object"},
     {RSVP_CLASS_RECORD_ROUTE, "RECORD ROUTE object"},
     {RSVP_CLASS_SESSION_ATTRIBUTE, "SESSION ATTRIBUTE object"},
+    {RSVP_CLASS_MESSAGE_ID, "MESSAGE-ID object"},
+    {RSVP_CLASS_MESSAGE_ID_ACK, "MESSAGE-ID ACK/NACK object"},
+    {RSVP_CLASS_MESSAGE_ID_LIST, "MESSAGE-ID LIST object"},
+    {RSVP_CLASS_HELLO, "HELLO object"},
     {0, NULL}
 };
 
@@ -198,7 +220,9 @@ enum rsvp_error_types {
     RSVP_ERROR_UNKNOWN_C_TYPE,
     RSVP_ERROR_TRAFFIC = 21,
     RSVP_ERROR_TRAFFIC_SYSTEM,
-    RSVP_ERROR_SYSTEM
+    RSVP_ERROR_SYSTEM,
+    RSVP_ERROR_ROUTING,
+    RSVP_ERROR_NOTIFY
 };
 
 static value_string rsvp_error_vals[] = {
@@ -216,6 +240,9 @@ static value_string rsvp_error_vals[] = {
     {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_SYSTEM, "RSVP System Error"},
+    {RSVP_ERROR_ROUTING, "Routing Error"},
+    {RSVP_ERROR_NOTIFY, "RSVP Notify Error"},
     {0, NULL}
 };
 
@@ -340,7 +367,12 @@ enum rsvp_filter_keys {
     RSVPF_JUNK_MSG8,
     RSVPF_JUNK_MSG9,
     RSVPF_RTEARCONFIRM,
-
+    RSVPF_JUNK11,
+    RSVPF_BUNDLE,
+    RSVPF_ACK,
+    RSVPF_JUNK14,
+    RSVPF_SREFRESH,
+    RSVPF_HELLO,
     /* Does the message contain an object of this type? */
     RSVPF_OBJECT,
     /* Object present shorthands */
@@ -365,9 +397,12 @@ enum rsvp_filter_keys {
     RSVPF_LABEL_REQUEST,
     RSVPF_EXPLICIT_ROUTE,
     RSVPF_RECORD_ROUTE,
-
+    RSVPF_DUMMY_4,
+    RSVPF_MESSAGE_ID,
+    RSVPF_MESSAGE_ID_ACK,
+    RSVPF_MESSAGE_ID_LIST,
+    RSVPF_HELLO_OBJ,
     RSVPF_SESSION_ATTRIBUTE,
-
     RSVPF_UNKNOWN_OBJ, 
 
     /* Session object */
@@ -393,160 +428,184 @@ static hf_register_info rsvpf_info[] = {
     /* Message type number */
     {&rsvp_filter[RSVPF_MSG], 
      { "Message Type", "rsvp.msg", FT_UINT8, BASE_DEC, VALS(message_type_vals), 0x0,
-       "" }},
+       "", HFILL }},
 
     /* Message type shorthands */
     {&rsvp_filter[RSVPF_PATH], 
      { "Path Message", "rsvp.path", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_HELLO], 
+     { "HELLO Message", "rsvp.hello", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_RESV], 
      { "Resv Message", "rsvp.resv", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_PATHERR], 
      { "Path Error Message", "rsvp.perr", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_RESVERR], 
      { "Resv Error Message", "rsvp.rerr", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_PATHTEAR], 
      { "Path Tear Message", "rsvp.ptear", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_RESVTEAR], 
      { "Resv Tear Message", "rsvp.rtear", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_RCONFIRM], 
      { "Resv Confirm Message", "rsvp.resvconf", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_RTEARCONFIRM], 
      { "Resv Tear Confirm Message", "rsvp.rtearconf", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     /* Object class */
     {&rsvp_filter[RSVPF_OBJECT], 
      { "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_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_HOP], 
      { "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_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_TIME_VALUES], 
      { "TIME VALUES", "rsvp.time", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_ERROR], 
      { "ERROR", "rsvp.error", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_SCOPE], 
      { "SCOPE", "rsvp.scope", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_STYLE], 
      { "STYLE", "rsvp.style", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_FLOWSPEC], 
      { "FLOWSPEC", "rsvp.flowspec", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_FILTER_SPEC], 
      { "FILTERSPEC", "rsvp.filter", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_SENDER], 
      { "SENDER TEMPLATE", "rsvp.sender", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_TSPEC], 
      { "SENDER TSPEC", "rsvp.tspec", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_ADSPEC], 
      { "ADSPEC", "rsvp.adspec", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_POLICY], 
      { "POLICY", "rsvp.policy", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_CONFIRM], 
      { "CONFIRM", "rsvp.confirm", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_LABEL], 
      { "LABEL", "rsvp.label", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_LABEL_REQUEST], 
      { "LABEL REQUEST", "rsvp.label_request", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_SESSION_ATTRIBUTE], 
      { "SESSION ATTRIBUTE", "rsvp.session_attribute", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_EXPLICIT_ROUTE], 
      { "EXPLICIT ROUTE", "rsvp.explicit_route", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_RECORD_ROUTE], 
      { "RECORD ROUTE", "rsvp.record_route", FT_NONE, BASE_NONE, NULL, 0x0,
-       "" }},
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_MESSAGE_ID], 
+     { "MESSAGE-ID", "rsvp.msgid", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_MESSAGE_ID_ACK], 
+     { "MESSAGE-ID ACK", "rsvp.ack", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_MESSAGE_ID_LIST], 
+     { "MESSAGE-ID LIST", "rsvp.msgid_list", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
+
+    {&rsvp_filter[RSVPF_HELLO_OBJ], 
+     { "HELLO Message", "rsvp.hello", FT_NONE, BASE_NONE, NULL, 0x0,
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_UNKNOWN_OBJ], 
      { "Unknown object", "rsvp.obj_unknown", FT_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_DEC, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_SESSION_PROTO], 
      { "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_DEC, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID], 
      { "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_DEC, NULL, 0x0,
-       "" }},
+       "", HFILL }},
 
     {&rsvp_filter[RSVPF_SENDER_LSP_ID], 
      { "Sender LSP ID", "rsvp.sender.lsp_id", FT_UINT16, BASE_DEC, NULL, 0x0,
-       "" }}
+       "", HFILL }}
 };
 
 static inline int rsvp_class_to_filter_num(int classnum)
@@ -570,8 +629,14 @@ static inline int rsvp_class_to_filter_num(int classnum)
     case RSVP_CLASS_LABEL_REQUEST :
     case RSVP_CLASS_EXPLICIT_ROUTE :
     case RSVP_CLASS_RECORD_ROUTE :
+    case RSVP_CLASS_MESSAGE_ID :
+    case RSVP_CLASS_MESSAGE_ID_ACK :
+    case RSVP_CLASS_MESSAGE_ID_LIST :    
        return classnum + RSVPF_OBJECT;
        break;
+    case RSVP_CLASS_HELLO :
+        return RSVPF_HELLO_OBJ;
+        break;
 
     case RSVP_CLASS_SESSION_ATTRIBUTE :
        return RSVPF_SESSION_ATTRIBUTE;
@@ -599,6 +664,7 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
     int obj_length;
     int mylen;
     int offset2;
+    char *objtype;
 
     if (check_col(pinfo->fd, COL_PROTOCOL))
         col_set_str(pinfo->fd, COL_PROTOCOL, "RSVP");
@@ -702,10 +768,14 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                                        offset2+4, 1, FALSE);
                    proto_tree_add_text(rsvp_object_tree, tvb, offset2+5, 1,
                                        "Flags: %x",
-                                       tvb_get_ntohs(tvb, offset2+5));
+                                       tvb_get_guint8(tvb, offset2+5));
                    proto_tree_add_item(rsvp_object_tree,
                                        rsvp_filter[RSVPF_SESSION_PORT], tvb, 
                                        offset2+6, 2, FALSE);
+                    proto_item_set_text(ti, "SESSION: IPv4, %s, %d, %d", 
+                                        ip_to_str(tvb_get_ptr(tvb, offset2, 4)), 
+                                        tvb_get_guint8(tvb, offset2+4),
+                                        tvb_get_ntohs(tvb, offset2+6));
                    break;
                }
 
@@ -745,6 +815,10 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                    proto_tree_add_item_hidden(rsvp_object_tree,
                                        rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
                                        tvb, offset2+8, 4, FALSE);
+                    proto_item_set_text(ti, "SESSION: IPv4-LSP, %s, %d, %0x", 
+                                        ip_to_str(tvb_get_ptr(tvb, offset2, 4)), 
+                                        tvb_get_ntohs(tvb, offset2+6),
+                                        tvb_get_ntohl(tvb, offset2+8));
                    break;
                }
 
@@ -776,6 +850,8 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                    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;
                }
 
@@ -817,6 +893,8 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                                        "Refresh interval: %u ms (%u seconds)",
                                        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;
                }
 
@@ -858,6 +936,10 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                    proto_tree_add_text(rsvp_object_tree, tvb, offset2+6, 2,
                                        "Error value: %u",
                                        tvb_get_ntohs(tvb, offset2+6));
+                    proto_item_set_text(ti, "ERROR: IPv4, %d, %d, %s", 
+                                        tvb_get_guint8(tvb, offset2+5),
+                                        tvb_get_ntohs(tvb, offset2+6),
+                                        ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
                    break;
                }
 
@@ -956,10 +1038,12 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                                        "Flags: 0x%02x",
                                        tvb_get_guint8(tvb, offset2));
                    style = tvb_get_ntoh24(tvb, offset2+1);
-                   ti = proto_tree_add_text(rsvp_object_tree, tvb, offset2+1,
-                       3, "Style: 0x%06X - %s",
-                       style,
-                       val_to_str(style, style_vals, "Unknown"));
+                   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;
                }
 
@@ -989,6 +1073,8 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                    proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4, 
                                        "Receiver address: %s", 
                                        ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
+                   proto_item_set_text(ti, "CONFIRM: %s", 
+                                       ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
                    break;
                }
 
@@ -1018,6 +1104,7 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
                                    class, object_type);
+                objtype = "SENDER TEMPLATE";
                goto common_template;
            case RSVP_CLASS_FILTER_SPEC :
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_filter_spec);
@@ -1026,6 +1113,7 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
                                    "Class number: %u - %s", 
                                    class, object_type);
+                objtype = "FILTERSPEC";
            common_template:
                mylen = obj_length - 4;
                switch(type) {
@@ -1038,6 +1126,9 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                    proto_tree_add_item(rsvp_object_tree,
                                        rsvp_filter[RSVPF_SENDER_PORT],
                                        tvb, offset2+6, 2, FALSE);
+                    proto_item_set_text(ti, "%s: IPv4, %s, %d", objtype,
+                                        ip_to_str(tvb_get_ptr(tvb, offset2, 4)), 
+                                        tvb_get_ntohs(tvb, offset2+6));
                    break;
                }
 
@@ -1062,6 +1153,9 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                    proto_tree_add_item(rsvp_object_tree,
                                        rsvp_filter[RSVPF_SENDER_LSP_ID],
                                        tvb, offset2+6, 2, FALSE);
+                    proto_item_set_text(ti, "%s: IPv4-LSP, %s, %d", objtype,
+                                        ip_to_str(tvb_get_ptr(tvb, offset2, 4)), 
+                                        tvb_get_ntohs(tvb, offset2+6));
                    break;
                }
 
@@ -1140,11 +1234,13 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                                            "Peak data rate: %ld", 
                                            tvb_ieee_to_long(tvb, offset2+12));
                        proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 4,
-                                           "Minimum policed unit: %u", 
+                                           "Minimum policed unit [m]: %u", 
                                            tvb_get_ntohl(tvb, offset2+16));
                        proto_tree_add_text(rsvp_object_tree, tvb, offset2+20, 4,
-                                           "Maximum policed unit: %u", 
+                                           "Maximum packet size [M]: %u", 
                                            tvb_get_ntohl(tvb, offset2+20));
+                        proto_item_set_text(ti, "SENDER TSPEC: IntServ, %lu bytes/sec", 
+                                            tvb_ieee_to_long(tvb, offset2+4));
                        break;
 
                    case QOS_QUALITATIVE :
@@ -1164,8 +1260,9 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                                            param_id,
                                            tvb_get_ntohs(tvb, offset2+2));
                        proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
-                                           "Maximum policed unit: %u", 
+                                           "Maximum packet size [M]: %u", 
                                            tvb_get_ntohl(tvb, offset2+4));
+                        proto_item_set_text(ti, "SENDER TSPEC: Qualitative");
                        break;
 
                    }
@@ -1242,13 +1339,17 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                                            "Peak data rate: %ld", 
                                            tvb_ieee_to_long(tvb, offset2+12));
                        proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 4,
-                                           "Minimum policed unit: %u", 
+                                           "Minimum policed unit [m]: %u", 
                                            tvb_get_ntohl(tvb, offset2+16));
                        proto_tree_add_text(rsvp_object_tree, tvb, offset2+20, 4,
-                                           "Maximum policed unit: %u", 
+                                           "Maximum packet size [M]: %u", 
                                            tvb_get_ntohl(tvb, offset2+20));
-                       if (service_num != QOS_GUARANTEED)
+
+                       if (service_num != QOS_GUARANTEED) {
+                            proto_item_set_text(ti, "FLOWSPEC: Controlled-Load, %lu bytes/sec", 
+                                                tvb_ieee_to_long(tvb, offset2+4));
                            break;
+                        }
                        
                        /* Guaranteed-rate RSpec */
                        param_id = tvb_get_guint8(tvb, offset2+24);
@@ -1272,6 +1373,8 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                        proto_tree_add_text(rsvp_object_tree, tvb, offset2+32, 4,
                                            "Slack term: %u", 
                                            tvb_get_ntohl(tvb, offset2+32));
+                        proto_item_set_text(ti, "FLOWSPEC: Guaranteed-Rate, %lu bytes/sec", 
+                                            tvb_ieee_to_long(tvb, offset2+4));
                        break;
 
                    case QOS_QUALITATIVE :
@@ -1290,9 +1393,10 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                                            param_id,
                                            tvb_get_ntohs(tvb, offset2+2));
                        proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
-                                           "Maximum policed unit: %u", 
+                                           "Maximum packet size [M]: %u", 
                                            tvb_get_ntohl(tvb, offset2+4));
                        
+                        proto_item_set_text(ti, "FLOWSPEC: Qualitative");
                        break;
                    }
                    offset2 += length*4;
@@ -1437,6 +1541,9 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                                        "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;
                }
 
@@ -1463,12 +1570,11 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                case 1: {
                    proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
                                        "C-type: 1");
-                   for (i=1, l = 0; l < mylen; l+=4, i++)
-                       proto_tree_add_text(rsvp_object_tree, tvb, offset2+l, 4,
-                                           "Label %d: %u %s", 
-                                           i, tvb_get_ntohl(tvb, offset2+l), 
-                                           l == mylen - 4 ? 
-                                           "(Top label)" : "");
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
+                                        "Label: %u", 
+                                        tvb_get_ntohl(tvb, offset2));
+                    proto_item_set_text(ti, "LABEL: %d", 
+                                        tvb_get_ntohl(tvb, offset2));
                    break;
                }
 
@@ -1762,6 +1868,141 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                }
                break;
            
+           case RSVP_CLASS_MESSAGE_ID :
+               rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
+                                   "Class number: %u - %s", 
+                                   class, object_type);
+                switch(type) {
+                case 1: 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: 1");
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
+                                        "Flags: %d", tvb_get_guint8(tvb, offset+4));
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
+                                        "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
+                                        "Message-ID: %d", tvb_get_ntohl(tvb, offset+8));
+                    proto_item_set_text(ti, "MESSAGE-ID: %d %s", 
+                                        tvb_get_ntohl(tvb, offset+8), 
+                                        tvb_get_guint8(tvb, offset+4) & 1 ? "(Ack Desired)" : "");
+                    break;
+
+                default:
+                    mylen = obj_length - 4;
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: Unknown (%u)",
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
+                   break;
+                }
+                break;
+
+           case RSVP_CLASS_MESSAGE_ID_ACK :
+               rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
+                                   "Class number: %u - %s", 
+                                   class, object_type);
+                switch(type) {
+                case 1: 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: 1");
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
+                                        "Flags: %d", tvb_get_guint8(tvb, offset+4));
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
+                                        "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
+                                        "Message-ID: %d", tvb_get_ntohl(tvb, offset+8));
+                    proto_item_set_text(ti, "MESSAGE-ID ACK: %d", tvb_get_ntohl(tvb, offset+8));
+                    break;
+
+                case 2: 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: 2");
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
+                                        "Flags: %d", tvb_get_guint8(tvb, offset+4));
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
+                                        "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
+                                        "Message-ID: %d", tvb_get_ntohl(tvb, offset+8));
+                    proto_item_set_text(ti, "MESSAGE-ID NACK: %d", tvb_get_ntohl(tvb, offset+8));
+                    break;
+
+                default:
+                    mylen = obj_length - 4;
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: Unknown (%u)",
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
+                   break;
+                }
+                break;
+
+           case RSVP_CLASS_MESSAGE_ID_LIST :
+               rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
+                                   "Class number: %u - %s", 
+                                   class, object_type);
+                switch(type) {
+                case 1: 
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: 1");
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
+                                        "Flags: %d", tvb_get_guint8(tvb, offset+4));
+                    proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
+                                        "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
+                    for (mylen = 8; mylen < obj_length; mylen += 4)
+                        proto_tree_add_text(rsvp_object_tree, tvb, offset+mylen, 4,
+                                            "Message-ID: %d", tvb_get_ntohl(tvb, offset+mylen));
+                    proto_item_set_text(ti, "MESSAGE-ID LIST: %d IDs", 
+                                        (obj_length - 8)/4);
+                    break;
+
+                default:
+                    mylen = obj_length - 4;
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-type: Unknown (%u)",
+                                       type);
+                   proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
+                                       "Data (%d bytes)", mylen);
+                   break;
+                }
+                break;
+
+           case RSVP_CLASS_HELLO:
+               rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_hello_obj);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
+                                   "Length: %u", obj_length);
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, 
+                                   "Class number: %u - %s", 
+                                   class, object_type);        
+               switch(type) {
+                   case 1:
+                     proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-Type: 1 - HELLO REQUEST object");
+                     break;
+                   case 2:
+                     proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, 
+                                       "C-Type: 2 - HELLO ACK object");
+                     break;
+               };
+
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 4,
+                                   "Source Instance: 0x%x",tvb_get_ntohl(tvb, offset+4));
+   
+               proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
+                                   "Destination Instance: 0x%x",tvb_get_ntohl(tvb, offset+8));
+   
+               break;
+
            default :
                rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_unknown_class);
                proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
@@ -1815,6 +2056,7 @@ proto_register_rsvp(void)
                &ett_rsvp_explicit_route_subobj,
                &ett_rsvp_record_route,
                &ett_rsvp_record_route_subobj,
+               &ett_rsvp_hello_obj,
                &ett_rsvp_unknown_class,
        };