*
* (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>
#include "packet.h"
#include "in_cksum.h"
-#include "packet-ipv6.h"
#include "ieee-float.h"
#include "etypes.h"
#include "ipproto.h"
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;
* 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_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}
};
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[] = {
{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}
};
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[] = {
{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}
};
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 */
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 */
/* 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)
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;
int obj_length;
int mylen;
int offset2;
+ char *objtype;
if (check_col(pinfo->fd, COL_PROTOCOL))
col_set_str(pinfo->fd, COL_PROTOCOL, "RSVP");
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;
}
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;
}
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;
}
"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;
}
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;
}
"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;
}
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;
}
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);
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) {
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;
}
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;
}
"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 :
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;
}
"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);
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 :
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;
"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 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;
}
}
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,
&ett_rsvp_explicit_route_subobj,
&ett_rsvp_record_route,
&ett_rsvp_record_route_subobj,
+ &ett_rsvp_hello_obj,
&ett_rsvp_unknown_class,
};