aboutsummaryrefslogtreecommitdiffstats
path: root/packet-rsvp.c
diff options
context:
space:
mode:
authorashokn <ashokn@f5534014-38df-0310-8fa8-9805f1628bb7>2002-10-08 23:29:15 +0000
committerashokn <ashokn@f5534014-38df-0310-8fa8-9805f1628bb7>2002-10-08 23:29:15 +0000
commit38da0b67dc012257cc1815f60e8e2eb5c71dae9b (patch)
tree2effed650a6f37269fcb0b93dc82c090adcac11a /packet-rsvp.c
parentfd11527a439b7f4b3dd3fb717858928c5d539bf8 (diff)
- Fixed RRO flag support that got dropped in the previous commit.
- Added support for FRR as per draft-ietf-mpls-rsvp-lsp-fastreroute-00.txt git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@6383 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'packet-rsvp.c')
-rw-r--r--packet-rsvp.c312
1 files changed, 266 insertions, 46 deletions
diff --git a/packet-rsvp.c b/packet-rsvp.c
index 98ce82f59a..cf00a40902 100644
--- a/packet-rsvp.c
+++ b/packet-rsvp.c
@@ -3,7 +3,7 @@
*
* (c) Copyright Ashok Narayanan <ashokn@cisco.com>
*
- * $Id: packet-rsvp.c,v 1.74 2002/10/02 21:15:27 ashokn Exp $
+ * $Id: packet-rsvp.c,v 1.75 2002/10/08 23:29:15 ashokn Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -111,6 +111,7 @@ enum {
TT_EXPLICIT_ROUTE_SUBOBJ,
TT_RECORD_ROUTE,
TT_RECORD_ROUTE_SUBOBJ,
+ TT_RECORD_ROUTE_SUBOBJ_FLAGS,
TT_ADMIN_STATUS,
TT_ADMIN_STATUS_FLAGS,
TT_GEN_UNI,
@@ -118,6 +119,8 @@ enum {
TT_BUNDLE_COMPMSG,
TT_RESTART_CAP,
TT_PROTECTION_INFO,
+ TT_FAST_REROUTE,
+ TT_DETOUR,
TT_UNKNOWN_CLASS,
TT_MAX,
@@ -227,7 +230,10 @@ enum rsvp_classes {
RSVP_CLASS_SESSION_ATTRIBUTE = 207,
RSVP_CLASS_GENERALIZED_UNI,
RSVP_CLASS_DCLASS = 225,
- RSVP_CLASS_LSP_TUNNEL_IF_ID = 227
+ RSVP_CLASS_LSP_TUNNEL_IF_ID = 227,
+
+ RSVP_CLASS_FAST_REROUTE = 228, /* TBD */
+ RSVP_CLASS_DETOUR = 229, /* TBD */
};
static value_string rsvp_class_vals[] = {
@@ -2590,12 +2596,20 @@ dissect_rsvp_session_attribute (proto_tree *ti, tvbuff_t *tvb,
"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"));
+ "Label recording desired",
+ "Label recording not desired"));
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"));
+ "SE style desired",
+ "SE style not desired"));
+ proto_tree_add_text(rsvp_sa_flags_tree, tvb, offset2+2, 1,
+ decode_boolean_bitfield(flags, 0x08, 8,
+ "Bandwidth protection desired",
+ "Bandwidth protection not desired"));
+ proto_tree_add_text(rsvp_sa_flags_tree, tvb, offset2+2, 1,
+ decode_boolean_bitfield(flags, 0x10, 8,
+ "Node protection desired",
+ "Node protection not desired"));
name_len = tvb_get_guint8(tvb, offset2+3);
proto_tree_add_text(rsvp_object_tree, tvb, offset2+3, 1,
@@ -2605,12 +2619,14 @@ dissect_rsvp_session_attribute (proto_tree *ti, tvbuff_t *tvb,
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]",
+ proto_item_set_text(ti, "SESSION ATTRIBUTE: SetupPrio %d, HoldPrio %d, %s%s%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, " : "",
+ flags &0x02 ? "Label Recording, " : "",
+ flags &0x04 ? "SE Style, " : "",
+ flags &0x08 ? "Bandwidth Protection, " : "",
+ flags &0x10 ? "Node Protection, " : "",
name_len ? (char*)tvb_format_text(tvb, offset2+4, name_len) : "");
break;
@@ -2633,7 +2649,7 @@ dissect_rsvp_ero_rro_subobjects (proto_tree *ti, proto_tree *rsvp_object_tree,
int offset, int obj_length, int class)
{
int i, j, k, l;
- proto_tree *ti2, *rsvp_ro_subtree;
+ proto_tree *ti2, *rsvp_ro_subtree, *rsvp_rro_flags_subtree;
int tree_type;
switch(class) {
@@ -2657,11 +2673,13 @@ dissect_rsvp_ero_rro_subobjects (proto_tree *ti, proto_tree *rsvp_object_tree,
offset+l, 8,
"IPv4 Subobject - %s, %s",
ip_to_str(tvb_get_ptr(tvb, offset+l+2, 4)),
- k ? "Loose" : "Strict");
+ class == RSVP_CLASS_EXPLICIT_ROUTE ?
+ (k ? "Loose" : "Strict") : "");
rsvp_ro_subtree =
proto_item_add_subtree(ti2, tree_type);
- proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l, 1,
- k ? "Loose Hop " : "Strict Hop");
+ if (class == RSVP_CLASS_EXPLICIT_ROUTE)
+ proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l, 1,
+ k ? "Loose Hop " : "Strict Hop");
proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l, 1,
"Type: 1 (IPv4)");
proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l+1, 1,
@@ -2673,6 +2691,32 @@ dissect_rsvp_ero_rro_subobjects (proto_tree *ti, proto_tree *rsvp_object_tree,
proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l+6, 1,
"Prefix length: %u",
tvb_get_guint8(tvb, offset+l+6));
+ if (class == RSVP_CLASS_RECORD_ROUTE) {
+ if (k&0x01) proto_item_append_text(ti2, ", Local Protection Available");
+ if (k&0x02) proto_item_append_text(ti2, ", Local Protection In Use");
+ if (k&0x04) proto_item_append_text(ti2, ", Backup BW Avail");
+ if (k&0x08) proto_item_append_text(ti2, ", Backup is Next-Next-Hop");
+ ti2 = proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l+7, 1,
+ "Flags: 0x%08x", k);
+ rsvp_rro_flags_subtree =
+ proto_item_add_subtree(ti2, TREE(TT_RECORD_ROUTE_SUBOBJ_FLAGS));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+7, 1,
+ decode_boolean_bitfield(k, 0x01, 8,
+ "Local Protection Available",
+ "Local Protection Not Available"));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+7, 1,
+ decode_boolean_bitfield(k, 0x02, 8,
+ "Local Protection In Use",
+ "Local Protection Not In Use"));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+7, 1,
+ decode_boolean_bitfield(k, 0x04, 8,
+ "Bandwidth Protection Available",
+ "Bandwidth Protection Not Available"));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+7, 1,
+ decode_boolean_bitfield(k, 0x08, 8,
+ "Node Protection Available",
+ "Node Protection Not Available"));
+ }
if (i < 4) {
proto_item_append_text(ti, "IPv4 %s%s",
ip_to_str(tvb_get_ptr(tvb, offset+l+2, 4)),
@@ -2688,8 +2732,9 @@ dissect_rsvp_ero_rro_subobjects (proto_tree *ti, proto_tree *rsvp_object_tree,
rsvp_ro_subtree =
proto_item_add_subtree(ti2, tree_type);
k = tvb_get_guint8(tvb, offset+l) & 0x80;
- proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l, 1,
- k ? "Loose Hop " : "Strict Hop");
+ if (class == RSVP_CLASS_EXPLICIT_ROUTE)
+ proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l, 1,
+ k ? "Loose Hop " : "Strict Hop");
proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l, 1,
"Type: 2 (IPv6)");
proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l+1, 1,
@@ -2700,7 +2745,33 @@ dissect_rsvp_ero_rro_subobjects (proto_tree *ti, proto_tree *rsvp_object_tree,
ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset+l+2, 16)));
proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l+18, 1,
"Prefix length: %u",
- tvb_get_guint8(tvb, offset+l+6));
+ tvb_get_guint8(tvb, offset+l+18));
+ if (class == RSVP_CLASS_RECORD_ROUTE) {
+ if (k&0x01) proto_item_append_text(ti2, ", Local Protection Available");
+ if (k&0x02) proto_item_append_text(ti2, ", Local Protection In Use");
+ if (k&0x04) proto_item_append_text(ti2, ", Backup BW Avail");
+ if (k&0x08) proto_item_append_text(ti2, ", Backup is Next-Next-Hop");
+ ti2 = proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l+19, 1,
+ "Flags: 0x%08x", k);
+ rsvp_rro_flags_subtree =
+ proto_item_add_subtree(ti2, TREE(TT_RECORD_ROUTE_SUBOBJ_FLAGS));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+19, 1,
+ decode_boolean_bitfield(k, 0x01, 8,
+ "Local Protection Available",
+ "Local Protection Not Available"));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+19, 1,
+ decode_boolean_bitfield(k, 0x02, 8,
+ "Local Protection In Use",
+ "Local Protection Not In Use"));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+19, 1,
+ decode_boolean_bitfield(k, 0x04, 8,
+ "Backup Tunnel Has Bandwidth",
+ "Backup Tunnel Does Not Have Bandwidth"));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+19, 1,
+ decode_boolean_bitfield(k, 0x08, 8,
+ "Backup Tunnel Goes To Next-Next-Hop",
+ "Backup Tunnel Goes To Next-Hop"));
+ }
if (i < 4) {
proto_item_append_text(ti, "IPv6 [...]%s", k ? " [L]":"");
}
@@ -2713,19 +2784,44 @@ dissect_rsvp_ero_rro_subobjects (proto_tree *ti, proto_tree *rsvp_object_tree,
offset+l, 8,
"Label Subobject - %d, %s",
tvb_get_ntohl(tvb, offset+l+4),
- k ? "Loose" : "Strict");
+ class == RSVP_CLASS_EXPLICIT_ROUTE ?
+ (k ? "Loose" : "Strict") : "");
rsvp_ro_subtree =
proto_item_add_subtree(ti2, tree_type);
- proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l, 1,
- k ? "Loose Hop " : "Strict Hop");
+ if (class == RSVP_CLASS_EXPLICIT_ROUTE)
+ proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l, 1,
+ k ? "Loose Hop " : "Strict Hop");
proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l, 1,
"Type: 3 (Label)");
proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l+1, 1,
"Length: %u",
tvb_get_guint8(tvb, offset+l+1));
- proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l+2, 1,
- "Flags: %0x",
- tvb_get_guint8(tvb, offset+l+2));
+ if (class == RSVP_CLASS_RECORD_ROUTE) {
+ if (k&0x01) proto_item_append_text(ti2, ", Local Protection Available");
+ if (k&0x02) proto_item_append_text(ti2, ", Local Protection In Use");
+ if (k&0x04) proto_item_append_text(ti2, ", Backup BW Avail");
+ if (k&0x08) proto_item_append_text(ti2, ", Backup is Next-Next-Hop");
+ ti2 = proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l+2, 1,
+ "Flags: 0x%08x", k);
+ rsvp_rro_flags_subtree =
+ proto_item_add_subtree(ti2, TREE(TT_RECORD_ROUTE_SUBOBJ_FLAGS));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+2, 1,
+ decode_boolean_bitfield(k, 0x01, 8,
+ "Local Protection Available",
+ "Local Protection Not Available"));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+2, 1,
+ decode_boolean_bitfield(k, 0x02, 8,
+ "Local Protection In Use",
+ "Local Protection Not In Use"));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+2, 1,
+ decode_boolean_bitfield(k, 0x04, 8,
+ "Backup Tunnel Has Bandwidth",
+ "Backup Tunnel Does Not Have Bandwidth"));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+2, 1,
+ decode_boolean_bitfield(k, 0x08, 8,
+ "Backup Tunnel Goes To Next-Next-Hop",
+ "Backup Tunnel Goes To Next-Hop"));
+ }
proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l+3, 1,
"C-Type: %u",
tvb_get_guint8(tvb, offset+l+3));
@@ -2746,16 +2842,44 @@ dissect_rsvp_ero_rro_subobjects (proto_tree *ti, proto_tree *rsvp_object_tree,
"Unnumbered Interface-ID - %s, %d, %s",
ip_to_str(tvb_get_ptr(tvb, offset+l+4, 4)),
tvb_get_ntohl(tvb, offset+l+8),
- k ? "Loose" : "Strict");
+ class == RSVP_CLASS_EXPLICIT_ROUTE ?
+ (k ? "Loose" : "Strict") : "");
rsvp_ro_subtree =
proto_item_add_subtree(ti2, tree_type);
- proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l, 1,
- k ? "Loose Hop " : "Strict Hop");
+ if (class == RSVP_CLASS_EXPLICIT_ROUTE)
+ proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l, 1,
+ k ? "Loose Hop " : "Strict Hop");
proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l, 1,
"Type: 4 (Unnumbered Interface-ID)");
proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l+1, 1,
"Length: %u",
tvb_get_guint8(tvb, offset+l+1));
+ if (class == RSVP_CLASS_RECORD_ROUTE) {
+ if (k&0x01) proto_item_append_text(ti2, ", Local Protection Available");
+ if (k&0x02) proto_item_append_text(ti2, ", Local Protection In Use");
+ if (k&0x04) proto_item_append_text(ti2, ", Backup BW Avail");
+ if (k&0x08) proto_item_append_text(ti2, ", Backup is Next-Next-Hop");
+ ti2 = proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l+2, 1,
+ "Flags: 0x%08x", k);
+ rsvp_rro_flags_subtree =
+ proto_item_add_subtree(ti2, TREE(TT_RECORD_ROUTE_SUBOBJ_FLAGS));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+2, 1,
+ decode_boolean_bitfield(k, 0x01, 8,
+ "Local Protection Available",
+ "Local Protection Not Available"));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+2, 1,
+ decode_boolean_bitfield(k, 0x02, 8,
+ "Local Protection In Use",
+ "Local Protection Not In Use"));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+2, 1,
+ decode_boolean_bitfield(k, 0x04, 8,
+ "Backup Tunnel Has Bandwidth",
+ "Backup Tunnel Does Not Have Bandwidth"));
+ proto_tree_add_text(rsvp_rro_flags_subtree, tvb, offset+l+2, 1,
+ decode_boolean_bitfield(k, 0x08, 8,
+ "Backup Tunnel Goes To Next-Next-Hop",
+ "Backup Tunnel Goes To Next-Hop"));
+ }
proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l+4, 4,
"Router-ID: %s",
ip_to_str(tvb_get_ptr(tvb, offset+l+4, 4)));
@@ -2794,26 +2918,6 @@ dissect_rsvp_ero_rro_subobjects (proto_tree *ti, proto_tree *rsvp_object_tree,
break;
- case 64: /* Path Term */
- if (class == RSVP_CLASS_RECORD_ROUTE) goto defaultsub;
- k = tvb_get_guint8(tvb, offset+l) & 0x80;
- ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
- offset+l, 4,
- "LSP Path Termination");
- rsvp_ro_subtree =
- proto_item_add_subtree(ti2, tree_type);
- proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l, 1,
- k ? "Loose Hop " : "Strict Hop");
- proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l, 1,
- "Type: 64 (MPLS LSP Path Termination)");
- proto_tree_add_text(rsvp_ro_subtree, tvb, offset+l+1, 1,
- "Length: %u",
- tvb_get_guint8(tvb, offset+l+1));
- if (i < 4) {
- proto_item_append_text(ti, "Path Term");
- }
- break;
-
default: /* Unknown subobject */
defaultsub:
k = tvb_get_guint8(tvb, offset+l) & 0x80;
@@ -3608,7 +3712,7 @@ dissect_rsvp_protection_info (proto_tree *ti, tvbuff_t *tvb,
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",
+ proto_item_append_text(ti, "Router-ID %s, Interface-ID %d",
ip_to_str(tvb_get_ptr(tvb, offset2, 4)),
tvb_get_ntohl(tvb, offset2+4));
break;
@@ -3624,6 +3728,114 @@ dissect_rsvp_protection_info (proto_tree *ti, tvbuff_t *tvb,
}
/*------------------------------------------------------------------------------
+ * FAST REROUTE
+ *------------------------------------------------------------------------------*/
+static void
+dissect_rsvp_fast_reroute (proto_tree *ti, tvbuff_t *tvb,
+ int offset, int obj_length,
+ int class, int type,
+ char *type_str)
+{
+ proto_tree *rsvp_object_tree;
+
+ rsvp_object_tree = proto_item_add_subtree(ti, TREE(TT_FAST_REROUTE));
+ 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, type_str);
+ proto_item_set_text(ti, "FAST_REROUTE: ");
+ switch(type) {
+ case 1:
+ case 7:
+ if ((type==1 && obj_length!=24) || (type==7 && obj_length!=20)) {
+ proto_tree_add_text(rsvp_object_tree, tvb, offset, obj_length,
+ "<<<Invalid length: cannot decode>>>");
+ proto_item_append_text(ti, "Invalid length");
+ break;
+ }
+ 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,
+ "Setup Priority: %d", tvb_get_guint8(tvb, offset+4));
+ proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 1,
+ "Hold Priority: %d", tvb_get_guint8(tvb, offset+5));
+ proto_tree_add_text(rsvp_object_tree, tvb, offset+6, 1,
+ "Hop Limit: %d", tvb_get_guint8(tvb, offset+6));
+ proto_tree_add_text(rsvp_object_tree, tvb, offset+7, 1,
+ "Flags: %d", tvb_get_guint8(tvb, offset+7));
+ proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
+ "Bandwidth: %.10g", tvb_get_ntohieee_float(tvb, offset+8));
+ proto_tree_add_text(rsvp_object_tree, tvb, offset+12, 4,
+ "Exclude-Any: 0x%0x", tvb_get_ntohl(tvb, offset+12));
+ proto_tree_add_text(rsvp_object_tree, tvb, offset+16, 4,
+ "Include-Any: 0x%0x", tvb_get_ntohl(tvb, offset+16));
+ if (type==1) {
+ proto_tree_add_text(rsvp_object_tree, tvb, offset+20, 4,
+ "Include-All: 0x%0x", tvb_get_ntohl(tvb, offset+20));
+ }
+ break;
+
+ default:
+ proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
+ "C-type: Unknown (%u)",
+ type);
+ proto_tree_add_text(rsvp_object_tree, tvb, offset+4, obj_length - 4,
+ "Data (%d bytes)", obj_length - 4);
+ break;
+ }
+}
+
+/*------------------------------------------------------------------------------
+ * DETOUR
+ *------------------------------------------------------------------------------*/
+static void
+dissect_rsvp_detour (proto_tree *ti, tvbuff_t *tvb,
+ int offset, int obj_length,
+ int class, int type,
+ char *type_str)
+{
+ proto_tree *rsvp_object_tree;
+ int remaining_length, count;
+
+ rsvp_object_tree = proto_item_add_subtree(ti, TREE(TT_DETOUR));
+ 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, type_str);
+ proto_item_set_text(ti, "FAST_REROUTE: ");
+ switch(type) {
+ case 7:
+ for (remaining_length = obj_length - 4, count = 1;
+ remaining_length > 0; remaining_length -= 8, count++) {
+ if (remaining_length < 8) {
+ proto_tree_add_text(rsvp_object_tree, tvb, offset+remaining_length,
+ obj_length-remaining_length,
+ "<<<Invalid length: cannot decode>>>");
+ proto_item_append_text(ti, "Invalid length");
+ break;
+ }
+ proto_tree_add_text(rsvp_object_tree, tvb, offset+4+remaining_length, 4,
+ "PLR ID %d: %s", count,
+ ip_to_str(tvb_get_ptr(tvb, offset+4+remaining_length, 4)));
+ proto_tree_add_text(rsvp_object_tree, tvb, offset+4+remaining_length, 4,
+ "Avoid Node ID %d: %s", count,
+ ip_to_str(tvb_get_ptr(tvb, offset+4+remaining_length, 4)));
+ }
+ break;
+
+ default:
+ proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
+ "C-type: Unknown (%u)",
+ type);
+ proto_tree_add_text(rsvp_object_tree, tvb, offset+4, obj_length - 4,
+ "Data (%d bytes)", obj_length - 4);
+ break;
+ }
+}
+
+/*------------------------------------------------------------------------------
* Dissect a single RSVP message in a tree
*------------------------------------------------------------------------------*/
static void
@@ -3881,6 +4093,14 @@ dissect_rsvp_msg_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
dissect_rsvp_protection_info(ti, tvb, offset, obj_length, class, type, type_str);
break;
+ case RSVP_CLASS_FAST_REROUTE:
+ dissect_rsvp_fast_reroute(ti, tvb, offset, obj_length, class, type, type_str);
+ break;
+
+ case RSVP_CLASS_DETOUR:
+ dissect_rsvp_detour(ti, tvb, offset, obj_length, class, type, type_str);
+ break;
+
case RSVP_CLASS_NULL:
default:
rsvp_object_tree = proto_item_add_subtree(ti, TREE(TT_UNKNOWN_CLASS));