diff options
author | ashokn <ashokn@f5534014-38df-0310-8fa8-9805f1628bb7> | 2002-05-16 20:11:32 +0000 |
---|---|---|
committer | ashokn <ashokn@f5534014-38df-0310-8fa8-9805f1628bb7> | 2002-05-16 20:11:32 +0000 |
commit | 1b7ee4b1e094cf38d77fc1653b524f4b052afbfa (patch) | |
tree | f2a1bd7667e77fc2d166da97621138926a4b65d5 /packet-rsvp.c | |
parent | 355c726965a46ad27e83b19b3a847c9e7df4df5e (diff) |
- Major cleanup of the RSVP dissector
- Added support for OIF O-UNI 1.0 (as per 125.7 standard)
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@5492 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'packet-rsvp.c')
-rw-r--r-- | packet-rsvp.c | 4443 |
1 files changed, 2702 insertions, 1741 deletions
diff --git a/packet-rsvp.c b/packet-rsvp.c index c06c42ef5c..531d408c85 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.62 2002/04/25 06:34:42 guy Exp $ + * $Id: packet-rsvp.c,v 1.63 2002/05/16 20:11:32 ashokn Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -95,6 +95,7 @@ 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_integrity_flags = -1; static gint ett_rsvp_dclass = -1; static gint ett_rsvp_lsp_tunnel_if_id = -1; static gint ett_rsvp_policy = -1; @@ -110,6 +111,8 @@ 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_gen_uni = -1; +static gint ett_rsvp_gen_uni_subobj = -1; static gint ett_rsvp_unknown_class = -1; @@ -194,6 +197,7 @@ enum rsvp_classes { RSVP_CLASS_ADMIN_STATUS, RSVP_CLASS_SESSION_ATTRIBUTE = 207, + RSVP_CLASS_GENERALIZED_UNI, RSVP_CLASS_DCLASS = 225, RSVP_CLASS_LSP_TUNNEL_IF_ID = 227, }; @@ -234,6 +238,7 @@ static value_string rsvp_class_vals[] = { {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"}, + {RSVP_CLASS_GENERALIZED_UNI, "GENERALIZED-UNI object"}, {0, NULL} }; @@ -304,6 +309,16 @@ static value_string style_vals[] = { { 0, NULL } }; +enum { + RSVP_SESSION_TYPE_IPV4 = 1, + RSVP_SESSION_TYPE_IPV6, + + RSVP_SESSION_TYPE_IPV4_LSP = 7, + RSVP_SESSION_TYPE_IPV6_LSP, + + RSVP_SESSION_TYPE_IPV4_UNI = 9, +}; + /* * Defines a desired QoS, in a RESV message. */ @@ -449,6 +464,37 @@ static const value_string gmpls_gpid_str[] = { { 0, NULL }, }; +static const value_string gmpls_sonet_signal_type_str[] = { + { 1, "VT1.5 SPE / VC-11"}, + { 2, "VT2 SPE / VC-12"}, + { 3, "VT3 SPE"}, + { 4, "VT6 SPE / VC-2"}, + { 5, "STS-1 SPE / VC-3"}, + { 6, "STS-3c SPE / VC-4"}, + { 7, "STS-1 / STM-0"}, + { 8, "STS-3 / STM-1"}, + { 9, "STS-12 / STM-4"}, + {10, "STS-48 / STM-16"}, + {11, "STS-192 / STM-64"}, + {12, "STS-768 / STM-256"}, + + /* Extended non-SONET signal types */ + {13, "VTG / TUG-2"}, + {14, "TUG-3"}, + {15, "STSG-3 / AUG-1"}, + {16, "STSG-12 / AUG-4"}, + {17, "STSG-48 / AUG-16"}, + {18, "STSG-192 / AUG-64"}, + {19, "STSG-768 / AUG-256"}, +}; + +static const value_string ouni_guni_diversity_str[] = { + {1, "Node Diverse"}, + {2, "Link Diverse"}, + {3, "Shared-Risk Link Group Diverse"}, + {4, "Shared Path"}, +}; + /* -------------------- Stuff for MPLS/TE objects -------------------- */ static const value_string proto_vals[] = { {IP_PROTO_ICMP, "ICMP"}, @@ -522,6 +568,7 @@ enum rsvp_filter_keys { RSVPF_LSP_TUNNEL_IF_ID, RSVPF_NOTIFY_REQUEST, RSVPF_ADMIN_STATUS, + RSVPF_GENERALIZED_UNI, RSVPF_UNKNOWN_OBJ, /* Session object */ @@ -732,6 +779,10 @@ static hf_register_info rsvpf_info[] = { { "NOTIFY REQUEST", "rsvp.notify_request", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }}, + {&rsvp_filter[RSVPF_GENERALIZED_UNI], + { "GENERALIZED UNI", "rsvp.generalized_uni", FT_NONE, BASE_NONE, NULL, 0x0, + "", HFILL }}, + {&rsvp_filter[RSVPF_UNKNOWN_OBJ], { "Unknown object", "rsvp.obj_unknown", FT_NONE, BASE_NONE, NULL, 0x0, "", HFILL }}, @@ -811,11 +862,14 @@ static inline int rsvp_class_to_filter_num(int classnum) return RSVPF_SUGGESTED_LABEL + (classnum - RSVP_CLASS_SUGGESTED_LABEL); case RSVP_CLASS_NOTIFY_REQUEST : + return RSVPF_NOTIFY_REQUEST; case RSVP_CLASS_ADMIN_STATUS : - return RSVPF_NOTIFY_REQUEST + (classnum - RSVP_CLASS_NOTIFY_REQUEST); + return RSVPF_ADMIN_STATUS; case RSVP_CLASS_SESSION_ATTRIBUTE : return RSVPF_SESSION_ATTRIBUTE; + case RSVP_CLASS_GENERALIZED_UNI : + return RSVPF_GENERALIZED_UNI; case RSVP_CLASS_DCLASS : return RSVPF_DCLASS; case RSVP_CLASS_LSP_TUNNEL_IF_ID : @@ -861,18 +915,24 @@ static char *summary_session (tvbuff_t *tvb, int offset) static char buf[80]; switch(tvb_get_guint8(tvb, offset+3)) { - case 1: + case RSVP_SESSION_TYPE_IPV4: 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: + case RSVP_SESSION_TYPE_IPV4_LSP: 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; + case RSVP_SESSION_TYPE_IPV4_UNI: + snprintf(buf, 80, "SESSION: IPv4-UNI, Destination %s, Tunnel ID %d, Ext Address %s. ", + ip_to_str(tvb_get_ptr(tvb, offset+4, 4)), + tvb_get_ntohs(tvb, offset+10), + ip_to_str(tvb_get_ptr(tvb, offset+12, 4))); + break; default: snprintf(buf, 80, "SESSION: Type %d. ", tvb_get_guint8(tvb, offset+3)); } @@ -908,25 +968,2590 @@ static char *summary_template (tvbuff_t *tvb, int offset) return buf; } +/*------------------------------------------------------------------------------ + * SESSION + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_session (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_session); + 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, summary_session(tvb, offset)); + + switch(type) { + case RSVP_SESSION_TYPE_IPV4: + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 1 - IPv4"); + 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 RSVP_SESSION_TYPE_IPV6: + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 2 - IPv6"); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16, + "Destination address: %s", + 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", + tvb_get_ntohs(tvb, offset2+18)); + break; + + case RSVP_SESSION_TYPE_IPV4_LSP: + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 7 - IPv4 LSP"); + 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; + + case RSVP_SESSION_TYPE_IPV4_UNI: + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 9 - IPv4 UNI"); + 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 IPv4 Address: %s", + 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, tvb, offset+3, 1, + "C-type: Unknown (%u)", + type); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, obj_length-4, + "Data (%d bytes)", obj_length-4); + } +} + +/*------------------------------------------------------------------------------ + * HOP + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_hop (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + proto_tree *rsvp_hop_subtree, *ti2; + + rsvp_object_tree= proto_item_add_subtree(ti, ett_rsvp_hop); + + 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); + 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, + "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)); + proto_item_set_text(ti, "HOP: IPv4, %s", + ip_to_str(tvb_get_ptr(tvb, offset2, 4))); + break; + + case 2: + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 2 - IPv6"); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16, + "Neighbor address: %s", + 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; + char *ifindex_name; + 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)); + + proto_item_set_text(ti, "HOP: Out-of-band. Control IPv4: %s. ", + ip_to_str(tvb_get_ptr(tvb, offset2, 4))); + + for (tlv_off = 0; tlv_off < obj_length - 12; ) { + 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_append_text(ti, "Data IPv4: %s. ", + ip_to_str(tvb_get_ptr(tvb, offset2+8+tlv_off+4, 4))); + break; + + case 3: + ifindex_name = ""; + goto hop_ifindex; + case 4: + ifindex_name = " Forward"; + goto hop_ifindex; + case 5: + ifindex_name = " Reverse"; + hop_ifindex: + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, + offset2+8+tlv_off, 12, + "Interface-Index%s TLV - %s, %d", + ifindex_name, + 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: %d (Interface Index%s)", tlv_type, ifindex_name); + 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_append_text(ti, "Data If-Index%s: %s, %d. ", ifindex_name, + 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, tvb, offset+3, 1, + "C-type: Unknown (%u)", + type); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, obj_length - 4, + "Data (%d bytes)", obj_length - 4); + } +} + +/*------------------------------------------------------------------------------ + * TIME VALUES + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_time_values (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_time_values); + 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); + 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, offset2, 4, + "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; + + 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, offset2, obj_length - 4, + "Data (%d bytes)", obj_length - 4); + break; + } +} + +/*------------------------------------------------------------------------------ + * ERROR + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_error (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_error); + 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); + switch(type) { + case 1: { + guint8 error_code; + + 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, + "Error node: %s", + 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: { + 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, tvb, offset2, 16, + "Error node: %s", + 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, tvb, offset+3, 1, + "C-type: Unknown (%u)", + type); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, obj_length - 4, + "Data (%d bytes)", obj_length - 4); + } +} + +/*------------------------------------------------------------------------------ + * SCOPE + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_scope (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + int mylen; + + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_scope); + 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); + mylen = obj_length - 4; + switch(type) { + case 1: { + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 1 - IPv4"); + while (mylen > 0) { + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4, + "IPv4 Address: %s", + ip_to_str(tvb_get_ptr(tvb, offset2, 4))); + offset2 += 4; + mylen -= 4; + } + break; + } + + case 2: { + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 2 - IPv6"); + while (mylen > 0) { + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16, + "IPv6 Address: %s", + ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16))); + offset2 += 16; + mylen -= 16; + } + 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, offset2, mylen, + "Data (%d bytes)", mylen); + } +} + +/*------------------------------------------------------------------------------ + * STYLE + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_style (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_style); + 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); + switch(type) { + case 1: { + guint32 style; + + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 1"); + 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, tvb, offset+3, 1, + "C-type: Unknown (%u)", + type); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, obj_length - 4, + "Data (%d bytes)", obj_length - 4); + break; + } +} + +/*------------------------------------------------------------------------------ + * CONFIRM + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_confirm (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_confirm); + 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); + 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, + "Receiver address: %s", + 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: { + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 2 - IPv6"); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16, + "Receiver address: %s", + ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16))); + 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, offset2, obj_length - 4, + "Data (%d bytes)", obj_length - 4); + } +} + +/*------------------------------------------------------------------------------ + * SENDER TEMPLATE and FILTERSPEC + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_template_filter (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + + switch(class) { + case RSVP_CLASS_SENDER_TEMPLATE : + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_sender_template); + 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); + break; + + default: + 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, + "Length: %u", obj_length); + proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, + "Class number: %u - %s", + class, type_str); + break; + } + + proto_item_set_text(ti, summary_template(tvb, offset)); + switch(type) { + case 1: + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 1 - IPv4"); + 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: + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 2 - IPv6"); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16, + "Source address: %s", + 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, tvb, offset+3, 1, + "C-type: 7 - IPv4 LSP"); + 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, tvb, offset+3, 1, + "C-type: Unknown (%u)", + type); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, obj_length - 4, + "Data (%d bytes)", obj_length - 4); + } +} + +/*------------------------------------------------------------------------------ + * SENDER TSPEC + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_tspec (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + int mylen; + proto_tree *tspec_tree, *ti2; + guint8 signal_type; + + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_sender_tspec); + 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); + mylen = obj_length - 4; + + switch(type) { + case 2: + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 1 - Integrated Services"); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, + "Message format version: %u", + tvb_get_guint8(tvb, offset2)>>4); + proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2, + "Data length: %u words, not including header", + tvb_get_ntohs(tvb, offset2+2)); + + mylen -= 4; + offset2 += 4; + + proto_item_set_text(ti, "SENDER TSPEC: IntServ: "); + + while (mylen > 0) { + guint8 service_num; + guint8 param_id; + guint16 param_len; + guint16 param_len_processed; + guint16 length; + + service_num = tvb_get_guint8(tvb, offset2); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, + "Service header: %u - %s", + 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", + 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; + } + mylen -= length*4; + } + break; + + case 4: /* SONET/SDH Tspec */ + proto_item_set_text(ti, "SENDER TSPEC: SONET/SDH: "); + + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 4 - SONET/SDH"); + signal_type = tvb_get_guint8(tvb, offset2); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, + "Signal Type: %d - %s", signal_type, + val_to_str(signal_type, + gmpls_sonet_signal_type_str, "Unknown")); + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1, + "Requested Concatenation (RCC): %d", tvb_get_guint8(tvb, offset2+1)); + tspec_tree = proto_item_add_subtree(ti2, ett_rsvp_sender_tspec_subtree); + proto_tree_add_text(tspec_tree, tvb, offset2+1, 1, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+1), 0x01, 8, + "Standard contiguous concatenation", + "No standard contiguous concatenation")); + proto_tree_add_text(tspec_tree, tvb, offset2+1, 1, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+1), 0x02, 8, + "Arbitrary contiguous concatenation", + "No arbitrary contiguous concatenation")); + proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2, + "Number of Contiguous Components (NCC): %d", tvb_get_ntohs(tvb, offset2+2)); + proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 2, + "Number of Virtual Components (NVC): %d", tvb_get_ntohs(tvb, offset2+4)); + proto_tree_add_text(rsvp_object_tree, tvb, offset2+6, 2, + "Multiplier (MT): %d", tvb_get_ntohs(tvb, offset2+6)); + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 4, + "Transparency (T): 0x%0x", tvb_get_ntohl(tvb, offset2+8)); + tspec_tree = proto_item_add_subtree(ti2, ett_rsvp_sender_tspec_subtree); + proto_tree_add_text(tspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_ntohl(tvb, offset2+8), 0x0001, 32, + "Section/Regenerator Section layer transparency", + "No Section/Regenerator Section layer transparency")); + proto_tree_add_text(tspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0002, 32, + "Line/Multiplex Section layer transparency", + "No Line/Multiplex Section layer transparency")); + proto_tree_add_text(tspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0004, 32, + "J0 transparency", + "No J0 transparency")); + proto_tree_add_text(tspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0008, 32, + "SOH/RSOH DCC transparency", + "No SOH/RSOH DCC transparency")); + proto_tree_add_text(tspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0010, 32, + "LOH/MSOH DCC transparency", + "No LOH/MSOH DCC transparency")); + proto_tree_add_text(tspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0020, 32, + "LOH/MSOH Extended DCC transparency", + "No LOH/MSOH Extended DCC transparency")); + proto_tree_add_text(tspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0040, 32, + "K1/K2 transparency", + "No K1/K2 transparency")); + proto_tree_add_text(tspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0080, 32, + "E1 transparency", + "No E1 transparency")); + proto_tree_add_text(tspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0100, 32, + "F1 transparency", + "No F1 transparency")); + proto_tree_add_text(tspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0200, 32, + "E2 transparency", + "No E2 transparency")); + proto_tree_add_text(tspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0400, 32, + "B1 transparency", + "No B1 transparency")); + proto_tree_add_text(tspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0800, 32, + "B2 transparency", + "No B2 transparency")); + proto_tree_add_text(tspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x1000, 32, + "M0 transparency", + "No M0 transparency")); + proto_tree_add_text(tspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x2000, 32, + "M1 transparency", + "No M1 transparency")); + proto_tree_add_text(rsvp_object_tree, tvb, offset2+12, 4, + "Profile (P): %d", tvb_get_ntohl(tvb, offset2+12)); + + proto_item_append_text(ti, "Signal [%s], RCC %d, NCC %d, NVC %d, MT %d, Transparency %d, Profile %d", + val_to_str(signal_type, gmpls_sonet_signal_type_str, "Unknown"), + tvb_get_guint8(tvb, offset2+1), tvb_get_ntohs(tvb, offset2+2), + tvb_get_ntohs(tvb, offset2+4), tvb_get_ntohs(tvb, offset2+6), + tvb_get_ntohl(tvb, offset2+8), tvb_get_ntohl(tvb, offset2+12)); + break; + + default: /* Unknown TSpec */ + 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, obj_length - 4, + "Data (%d bytes)", obj_length - 4); + break; + + } +} + +/*------------------------------------------------------------------------------ + * FLOWSPEC + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_flowspec (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + int mylen, signal_type; + proto_tree *flowspec_tree, *ti2; + + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_flowspec); + 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_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: %u", type); + mylen = obj_length - 4; + + switch(type) { + + case 2: + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, + "Message format version: %u", + tvb_get_guint8(tvb, offset2)>>4); + proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2, + "Data length: %u words, not including header", + tvb_get_ntohs(tvb, offset2+2)); + + proto_item_set_text(ti, "FLOWSPEC: "); + + 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", + 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", + 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; + } + param_len_processed += param_len; + offset2 += param_len * 4; + } + + /* offset2 += length*4; */ + mylen -= length*4; + } + break; + + case 4: + proto_item_set_text(ti, "FLOWSPEC: SONET/SDH: "); + + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 4 - SONET/SDH"); + signal_type = tvb_get_guint8(tvb, offset2); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, + "Signal Type: %d - %s", signal_type, + val_to_str(signal_type, + gmpls_sonet_signal_type_str, "Unknown")); + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1, + "Requested Concatenation (RCC): %d", tvb_get_guint8(tvb, offset2+1)); + flowspec_tree = proto_item_add_subtree(ti2, ett_rsvp_flowspec_subtree); + proto_tree_add_text(flowspec_tree, tvb, offset2+1, 1, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+1), 0x01, 8, + "Standard contiguous concatenation", + "No standard contiguous concatenation")); + proto_tree_add_text(flowspec_tree, tvb, offset2+1, 1, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+1), 0x02, 8, + "Arbitrary contiguous concatenation", + "No arbitrary contiguous concatenation")); + proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2, + "Number of Contiguous Components (NCC): %d", tvb_get_ntohs(tvb, offset2+2)); + proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 2, + "Number of Virtual Components (NVC): %d", tvb_get_ntohs(tvb, offset2+4)); + proto_tree_add_text(rsvp_object_tree, tvb, offset2+6, 2, + "Multiplier (MT): %d", tvb_get_ntohs(tvb, offset2+6)); + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 4, + "Transparency (T): 0x%0x", tvb_get_ntohl(tvb, offset2+8)); + flowspec_tree = proto_item_add_subtree(ti2, ett_rsvp_flowspec_subtree); + proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_ntohl(tvb, offset2+8), 0x0001, 32, + "Section/Regenerator Section layer transparency", + "No Section/Regenerator Section layer transparency")); + proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0002, 32, + "Line/Multiplex Section layer transparency", + "No Line/Multiplex Section layer transparency")); + proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0004, 32, + "J0 transparency", + "No J0 transparency")); + proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0008, 32, + "SOH/RSOH DCC transparency", + "No SOH/RSOH DCC transparency")); + proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0010, 32, + "LOH/MSOH DCC transparency", + "No LOH/MSOH DCC transparency")); + proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0020, 32, + "LOH/MSOH Extended DCC transparency", + "No LOH/MSOH Extended DCC transparency")); + proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0040, 32, + "K1/K2 transparency", + "No K1/K2 transparency")); + proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0080, 32, + "E1 transparency", + "No E1 transparency")); + proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0100, 32, + "F1 transparency", + "No F1 transparency")); + proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0200, 32, + "E2 transparency", + "No E2 transparency")); + proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0400, 32, + "B1 transparency", + "No B1 transparency")); + proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x0800, 32, + "B2 transparency", + "No B2 transparency")); + proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x1000, 32, + "M0 transparency", + "No M0 transparency")); + proto_tree_add_text(flowspec_tree, tvb, offset2+8, 4, + decode_boolean_bitfield(tvb_get_guint8(tvb, offset2+8), 0x2000, 32, + "M1 transparency", + "No M1 transparency")); + proto_tree_add_text(rsvp_object_tree, tvb, offset2+12, 4, + "Profile (P): %d", tvb_get_ntohl(tvb, offset2+12)); + + proto_item_append_text(ti, "Signal [%s], RCC %d, NCC %d, NVC %d, MT %d, Transparency %d, Profile %d", + val_to_str(signal_type, gmpls_sonet_signal_type_str, "Unknown"), + tvb_get_guint8(tvb, offset2+1), tvb_get_ntohs(tvb, offset2+2), + tvb_get_ntohs(tvb, offset2+4), tvb_get_ntohs(tvb, offset2+6), + tvb_get_ntohl(tvb, offset2+8), tvb_get_ntohl(tvb, offset2+12)); + break; + + default: + } + + +} + +/*------------------------------------------------------------------------------ + * ADSPEC + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_adspec (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + int mylen, i; + proto_tree *adspec_tree; + + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_adspec); + 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_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: %u", type); + mylen = obj_length - 4; + + proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, + "Message format version: %u", + tvb_get_guint8(tvb, offset2)>>4); + proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2, + "Data length: %u words, not including header", + tvb_get_ntohs(tvb, offset2+2)); + mylen -= 4; + 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, tvb, offset2, 1, + "Service header %u - %s", + 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, tvb, offset2+2, 2, + "Data length: %u words, not including header", + 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(id) { + case 4: + case 8: + case 10: + case 133: + case 134: + case 135: + case 136: + /* 32-bit unsigned integer */ + 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, 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, tvb, offset2, + (phdr_length+1)<<2, + "%s (type %u, length %u)", + str, + id, phdr_length); + } + } else { + proto_tree_add_text(adspec_tree, tvb, offset2, + (phdr_length+1)<<2, + "Unknown (type %u, length %u)", + id, phdr_length); + } + offset2 += (phdr_length+1)<<2; + i -= (phdr_length+1)<<2; + mylen -= (phdr_length+1)<<2; + } + } +} + +/*------------------------------------------------------------------------------ + * INTEGRITY + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_integrity (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + proto_tree *ti2, *rsvp_integ_flags_tree; + int flags; + guint64 sequence_number; + + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_integrity); + 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_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: %u", type); + flags = tvb_get_guint8(tvb, offset2); + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, + "Flags: 0x%02x", flags); + rsvp_integ_flags_tree = proto_item_add_subtree(ti2, ett_rsvp_integrity_flags); + proto_tree_add_text(rsvp_integ_flags_tree, tvb, offset2, 1, + decode_boolean_bitfield(flags, 0x01, 8, "Handshake capable", "Handshake not capable")); + proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 6, + "Key Identifier: %s", tvb_bytes_to_str(tvb, offset2+2, 6)); + sequence_number = tvb_get_ntohl(tvb, offset2+8); + sequence_number <<= 32; + sequence_number = tvb_get_ntohl(tvb, offset2+12); + proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 8, + "Sequence Number: %llu", sequence_number); + proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, obj_length - 20, + "Hash: %s", tvb_bytes_to_str(tvb, offset2+16, obj_length - 20)); +} + +/*------------------------------------------------------------------------------ + * POLICY + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_policy (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + + 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, type_str); + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: %u", type); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, obj_length - 4, + "Data (%d bytes)", obj_length - 4); +} + +/*------------------------------------------------------------------------------ + * LABEL_REQUEST + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_label_request (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_label_request); + 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); + switch(type) { + case 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, 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, tvb, offset+3, 1, + "C-type: Unknown (%u)", + type); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, obj_length - 4, + "Data (%d bytes)", obj_length - 4); + break; + } + } +} + +/*------------------------------------------------------------------------------ + * LABEL + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_label (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + int mylen, i; + 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, 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); + mylen = obj_length - 4; + switch(type) { + case 1: + 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, tvb, offset+3, 1, + "C-type: Unknown (%u)", + type); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen, + "Data (%d bytes)", mylen); + break; + } +} + +/*------------------------------------------------------------------------------ + * SESSION ATTRIBUTE + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_session_attribute (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + guint8 flags; + guint8 name_len; + proto_tree *ti2, *rsvp_sa_flags_tree; + + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_session_attribute); + 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); + switch(type) { + case 7: + + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 7 - IPv4 LSP"); + 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, 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")); + + 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, tvb, offset+3, 1, + "C-type: Unknown (%u)", + type); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, obj_length - 4, + "Data (%d bytes)", obj_length - 4); + break; + } +} + +/*------------------------------------------------------------------------------ + * EXPLICIT ROUTE OBJECT + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_explicit_route (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + int mylen, i, j, k, l; + proto_tree *ti2, *rsvp_ero_subtree; + + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_explicit_route); + 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); + mylen = obj_length - 4; + switch(type) { + case 1: { + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 1"); + 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 = 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(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, tvb, offset2+l, 1, + k ? "Loose Hop " : "Strict Hop"); + proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1, + "Type: 1 (IPv4)"); + 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, tvb, + offset2+l, 20, + "IPv6 Subobject"); + rsvp_ero_subtree = + proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj); + 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, tvb, offset2+l, 1, + "Type: 2 (IPv6)"); + 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 = tvb_get_ntohs(tvb, offset2+l+2); + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, + offset2+l, 4, + "Autonomous System %u", + k); + rsvp_ero_subtree = + proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj); + proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1, + "Type: 32 (Autonomous System Number)"); + 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 = 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, tvb, offset2+l, 1, + k ? "Loose Hop " : "Strict Hop"); + proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1, + "Type: 64 (MPLS LSP Path Termination)"); + 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 = 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, tvb, offset2+l, 1, + k ? "Loose Hop " : "Strict Hop"); + 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 += 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, tvb, offset+3, 1, + "C-type: Unknown (%u)", + type); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen, + "Data (%d bytes)", mylen); + break; + } +} + +/*------------------------------------------------------------------------------ + * RECORD ROUTE OBJECT + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_record_route (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + int mylen, i, j, l; + proto_tree *ti2, *rsvp_rro_subtree; + + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_record_route); + 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, "RECORD ROUTE: "); + mylen = obj_length - 4; + switch(type) { + case 1: { + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 1"); + 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, tvb, + offset2+l, 8, + "IPv4 Subobject - %s", + ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4))); + rsvp_rro_subtree = + proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj); + proto_tree_add_text(rsvp_rro_subtree, tvb, offset2+l, 1, + "Type: 1 (IPv4)"); + proto_tree_add_text(rsvp_rro_subtree, tvb, offset2+l+1, 1, + "Length: %u", + tvb_get_guint8(tvb, offset2+l+1)); + proto_tree_add_text(rsvp_rro_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_rro_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, tvb, + offset2+l, 20, + "IPv6 Subobject"); + rsvp_rro_subtree = + proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj); + proto_tree_add_text(rsvp_rro_subtree, tvb, offset2+l, 1, + "Type: 2 (IPv6)"); + proto_tree_add_text(rsvp_rro_subtree, tvb, offset2+l+1, 1, + "Length: %u", + tvb_get_guint8(tvb, offset2+l+1)); + proto_tree_add_text(rsvp_rro_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_rro_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_rro_subtree = + proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj); + proto_tree_add_text(rsvp_rro_subtree, tvb, offset2+l, 1, + "Type: 3 (Label)"); + proto_tree_add_text(rsvp_rro_subtree, tvb, offset2+l+1, 1, + "Length: %u", + tvb_get_guint8(tvb, offset2+l+1)); + proto_tree_add_text(rsvp_rro_subtree, tvb, offset2+l+2, 1, + "Flags: %0x", + tvb_get_guint8(tvb, offset2+l+2)); + proto_tree_add_text(rsvp_rro_subtree, tvb, offset2+l+3, 1, + "C-Type: %u", + tvb_get_guint8(tvb, offset2+l+3)); + proto_tree_add_text(rsvp_rro_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_rro_subtree = + proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj); + proto_tree_add_text(rsvp_rro_subtree, tvb, offset2+l, 1, + "Type: 4 (Unnumbered Interface-ID)"); + proto_tree_add_text(rsvp_rro_subtree, tvb, offset2+l+1, 1, + "Length: %u", + tvb_get_guint8(tvb, offset2+l+1)); + proto_tree_add_text(rsvp_rro_subtree, tvb, offset2+l+1, 1, + "Flags: %u", + tvb_get_guint8(tvb, offset2+l+2)); + proto_tree_add_text(rsvp_rro_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_rro_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 */ + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, + offset2+l, + tvb_get_guint8(tvb, offset2+l+1), + "Unknown subobject: %u", + j); + rsvp_rro_subtree = + proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj); + proto_tree_add_text(rsvp_rro_subtree, tvb, offset2+l, 1, + "Type: %u (Unknown)", j); + proto_tree_add_text(rsvp_rro_subtree, tvb, offset2+l+1, 1, + "Length: %u", + tvb_get_guint8(tvb, 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, tvb, offset+3, 1, + "C-type: Unknown (%u)", + type); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen, + "Data (%d bytes)", mylen); + break; + } + } +} + +/*------------------------------------------------------------------------------ + * MESSAGE ID + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_message_id (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + + 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, type_str); + 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: + 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, obj_length - 4, + "Data (%d bytes)", obj_length - 4); + break; + } +} + +/*------------------------------------------------------------------------------ + * MESSAGE ID ACK + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_message_id_ack (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + + 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, type_str); + 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: + 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, obj_length - 4, + "Data (%d bytes)", obj_length - 4); + break; + } +} + +/*------------------------------------------------------------------------------ + * MESSAGE ID LIST + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_message_id_list (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + int mylen; + + 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, type_str); + 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, obj_length - 4, + "Data (%d bytes)", obj_length - 4); + break; + } +} + +/*------------------------------------------------------------------------------ + * HELLO + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_hello (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, 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, type_str); + switch(type) { + case 1: + case 2: + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-Type: 1 - HELLO %s object", + type==1 ? "REQUEST" : "ACK"); + 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: + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-Type: %d - UNKNOWN", type); + break; + }; +} + +/*------------------------------------------------------------------------------ + * DCLASS + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_dclass (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + int mylen; + + 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, type_str); + 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; + } +} + +/*------------------------------------------------------------------------------ + * ADMINISTRATIVE STATUS + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_admin_status (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + proto_tree *ti2, *rsvp_admin_subtree; + int mylen; + 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, type_str); + 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, 4, + decode_boolean_bitfield(status, 0x80000000, 32, + "R: Reflect", + "R: Do not reflect")); + proto_tree_add_text(rsvp_admin_subtree, tvb, offset2, 4, + decode_boolean_bitfield(status, 0x04, 32, + "T: Testing", + "T: ")); + proto_tree_add_text(rsvp_admin_subtree, tvb, offset2, 4, + decode_boolean_bitfield(status, 0x02, 32, + "A: Administratively Down", + "A: ")); + proto_tree_add_text(rsvp_admin_subtree, tvb, offset2, 4, + decode_boolean_bitfield(status, 0x01, 32, + "D: Delete In Progress", + "D: ")); + 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, obj_length - 4, + "Data (%d bytes)", obj_length - 4); + break; + } +} + +/*------------------------------------------------------------------------------ + * LSP TUNNEL INTERFACE ID + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_lsp_tunnel_if_id (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + + 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, type_str); + 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: + 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, obj_length - 4, + "Data (%d bytes)", obj_length - 4); + break; + } +} + +/*------------------------------------------------------------------------------ + * GENERALIZED UNI + *------------------------------------------------------------------------------*/ +static void +dissect_rsvp_gen_uni (proto_tree *ti, tvbuff_t *tvb, + int offset, int obj_length, + int class, int type, + char *type_str) +{ + int offset2 = offset + 4; + proto_tree *rsvp_object_tree; + int mylen, i, j, k, l, m; + proto_tree *ti2, *rsvp_gen_uni_subtree; + int s_len, s_class, s_type; + + rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_gen_uni); + 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, "GENERALIZED UNI: "); + + mylen = obj_length - 4; + switch(type) { + case 1: { + char *c; + proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, + "C-type: 1"); + for (i=1, l = 0; l < mylen; i++) { + j = tvb_get_guint8(tvb, offset2+l+2); + switch(j) { + case 1: + case 2: /* We do source and destination TNA together */ + c = (j==1) ? "Source" : "Destination"; + k = tvb_get_guint8(tvb, offset2+l+3); + switch(k) { + case 1: + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, + offset2+l, 8, + "%s IPv4 TNA - %s", c, + ip_to_str(tvb_get_ptr(tvb, offset2+l+4, 4))); + rsvp_gen_uni_subtree = + proto_item_add_subtree(ti2, ett_rsvp_gen_uni_subobj); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+2, 1, + "Class: %d (%s)", j, c); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+3, 1, + "Type: 1 (IPv4)"); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l, 2, + "Length: %u", + tvb_get_ntohs(tvb, offset2+l)); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+4, 4, + "IPv4 hop: %s", + ip_to_str(tvb_get_ptr(tvb, offset2+l+4, 4))); + if (i < 4) { + proto_item_append_text(ti, "%s IPv4 %s", c, + ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4))); + } + break; + + case 2: + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, + offset2+l, 20, + "%s IPv6 TNA", c); + rsvp_gen_uni_subtree = + proto_item_add_subtree(ti2, ett_rsvp_gen_uni_subobj); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+2, 1, + "Class: %d (%s)", j, c); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+3, 1, + "Type: 2 (IPv6)"); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l, 2, + "Length: %u", + tvb_get_ntohs(tvb, offset2+l)); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+4, 4, + "Data"); + if (i < 4) { + proto_item_append_text(ti, "%s IPv6", c); + } + break; + + case 3: + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, + offset2+l, tvb_get_ntohs(tvb, offset2+l), + "%s NSAP TNA", c); + rsvp_gen_uni_subtree = + proto_item_add_subtree(ti2, ett_rsvp_gen_uni_subobj); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+2, 1, + "Class: %d (%s)", j, c); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+3, 1, + "Type: 3 (NSAP)"); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l, 2, + "Length: %u", + tvb_get_ntohs(tvb, offset2+l)); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+4, + tvb_get_ntohs(tvb, offset2+l)-4, + "Data"); + if (i < 4) { + proto_item_append_text(ti, "%s NSAP", c); + } + break; + + default: + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, + offset2+l, tvb_get_ntohs(tvb, offset2+l), + "%s UNKNOWN TNA", c); + rsvp_gen_uni_subtree = + proto_item_add_subtree(ti2, ett_rsvp_gen_uni_subobj); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+2, 1, + "Class: %d (%s)", j, c); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+3, 1, + "Type: %d (UNKNOWN)", j); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l, 2, + "Length: %u", + tvb_get_ntohs(tvb, offset2+l)); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+4, + tvb_get_ntohs(tvb, offset2+l)-4, + "Data"); + if (i < 4) { + proto_item_append_text(ti, "%s UNKNOWN", c); + } + break; + } + break; + + case 3: /* Diversity subobject */ + k = tvb_get_guint8(tvb, offset2+l+3); + switch(k) { + default: + case 1: + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, + offset2+l, tvb_get_ntohs(tvb, offset2+l), + "Diversity Subobject"); + rsvp_gen_uni_subtree = + proto_item_add_subtree(ti2, ett_rsvp_gen_uni_subobj); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+2, 1, + "Class: %d (Diversity)", j); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+3, 1, + "Type: %d", tvb_get_guint8(tvb, offset2+l+3)); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l, 2, + "Length: %u", + tvb_get_ntohs(tvb, offset2+l)); + m = tvb_get_guint8(tvb, offset2+l+4) >> 4; + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+4, 1, + "Diversity: %d - %s", m, + val_to_str(m, ouni_guni_diversity_str, "Unknown")); + s_len = tvb_get_ntohs(tvb, offset2+l+8); + s_class = tvb_get_guint8(tvb, offset2+l+10); + s_type = tvb_get_guint8(tvb, offset2+l+11); + ti2 = proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+8, + s_len, "Session"); + dissect_rsvp_session(ti2, tvb, offset2+l+8, s_len, s_class, s_type, + val_to_str(s_class, rsvp_class_vals, "Unknown")); + offset2 += s_len; + s_len = tvb_get_ntohs(tvb, offset2+l+8); + s_class = tvb_get_guint8(tvb, offset2+l+10); + s_type = tvb_get_guint8(tvb, offset2+l+11); + ti2 = proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+8, + s_len, "Template"); + dissect_rsvp_template_filter(ti2, tvb, offset2+l+8, s_len, s_class, s_type, + val_to_str(s_class, rsvp_class_vals, "Unknown")); + + if (i < 4) { + proto_item_append_text(ti, "Diversity"); + } + break; + + } + break; + + case 4: /* Egress Label */ + k = tvb_get_guint8(tvb, offset2+l+3); + switch(k) { + default: + case 1: + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, + offset2+l, tvb_get_ntohs(tvb, offset2+l), + "Egress Label Subobject"); + rsvp_gen_uni_subtree = + proto_item_add_subtree(ti2, ett_rsvp_gen_uni_subobj); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+2, 1, + "Class: %d (Egress Label)", j); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+3, 1, + "Type: %d", tvb_get_guint8(tvb, offset2+l+3)); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l, 2, + "Length: %u", + tvb_get_ntohs(tvb, offset2+l)); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+4, 1, + "Direction: %s", + decode_boolean_bitfield( + tvb_get_guint8(tvb, offset2+l+4), 0x80, 8, + "U: 1 - Upstream label/port ID", + "U: 0 - Downstream label/port ID")); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+7, 1, + "Label type: %u", tvb_get_guint8(tvb, offset2+l+7)); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+8, 4, + "Logical Port ID: %u", tvb_get_ntohl(tvb, offset2+l+8)); + proto_item_append_text(ti2, ": %s, Label type %d, Port ID %d, Label ", + tvb_get_guint8(tvb, offset2+l+4) & 0x80 ? + "Upstream" : "Downstream", + tvb_get_guint8(tvb, offset2+l+7), + tvb_get_ntohl(tvb, offset2+l+8)); + for (j=12; j < tvb_get_ntohs(tvb, offset2+l); j+=4) { + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+8, 4, + "Label: %u", tvb_get_ntohl(tvb, offset2+l+j)); + proto_item_append_text(ti2, "%u ", tvb_get_ntohl(tvb, offset2+l+j)); + } + if (i < 4) { + proto_item_append_text(ti, "Egress Label"); + } + break; + } + break; + + case 5: /* Service Level */ + k = tvb_get_guint8(tvb, offset2+l+3); + switch(k) { + default: + case 1: + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, + offset2+l, tvb_get_ntohs(tvb, offset2+l), + "Service Level Subobject"); + rsvp_gen_uni_subtree = + proto_item_add_subtree(ti2, ett_rsvp_gen_uni_subobj); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+2, 1, + "Class: %d (Egress Label)", j); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+3, 1, + "Type: %d", tvb_get_guint8(tvb, offset2+l+3)); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l, 2, + "Length: %u", + tvb_get_ntohs(tvb, offset2+l)); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+4, 1, + "Service Level: %u", tvb_get_guint8(tvb, offset2+l+4)); + proto_item_append_text(ti2, ": %u", tvb_get_guint8(tvb, offset2+l+4)); + if (i < 4) { + proto_item_append_text(ti, "Service Level %d", tvb_get_guint8(tvb, offset2+l+4)); + } + break; + } + break; + + default: /* Unknown subobject */ + ti2 = proto_tree_add_text(rsvp_object_tree, tvb, + offset2+l, + tvb_get_ntohs(tvb, offset2+l), + "Unknown subobject: %u", + j); + rsvp_gen_uni_subtree = + proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l, 1, + "Type: %u (Unknown)", j); + proto_tree_add_text(rsvp_gen_uni_subtree, tvb, offset2+l+1, 1, + "Length: %u", + tvb_get_guint8(tvb, 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, tvb, offset+3, 1, + "C-type: Unknown (%u)", + type); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen, + "Data (%d bytes)", mylen); + break; + } +} + +/*------------------------------------------------------------------------------ + * The main loop + *------------------------------------------------------------------------------*/ 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_tree = NULL, *ti; proto_tree *rsvp_header_tree; proto_tree *rsvp_object_tree; - proto_tree *rsvp_sa_flags_tree; - proto_tree *rsvp_ero_subtree; - 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 len; int msg_length; int obj_length; - int mylen; int offset2; int session_off, tempfilt_off; @@ -1003,12 +3628,12 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) while (len < msg_length) { guint8 class; guint8 type; - char *object_type; + char *type_str; 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"); + type_str = 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)], @@ -1018,1791 +3643,124 @@ dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) switch(class) { - case RSVP_CLASS_SESSION : - rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_session); - 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; - proto_item_set_text(ti, summary_session(tvb, offset)); - - switch(type) { - case 1: { - proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, - "C-type: 1 - IPv4"); - 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: { - proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, - "C-type: 2 - IPv6"); - proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16, - "Destination address: %s", - 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", - tvb_get_ntohs(tvb, offset2+18)); - break; - } - - case 7: { - proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, - "C-type: 7 - IPv4 LSP"); - 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, tvb, offset+3, 1, - "C-type: Unknown (%u)", - type); - proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); - } - } + case RSVP_CLASS_SESSION: + dissect_rsvp_session(ti, tvb, offset, obj_length, class, type, type_str); break; - case RSVP_CLASS_HOP : - rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_hop); - 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, tvb, offset+3, 1, - "C-type: 1 - IPv4"); - 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)); - proto_item_set_text(ti, "HOP: IPv4, %s", - ip_to_str(tvb_get_ptr(tvb, offset2, 4))); - break; - } - - case 2: { - proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, - "C-type: 2 - IPv6"); - proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16, - "Neighbor address: %s", - 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, tvb, offset+3, 1, - "C-type: Unknown (%u)", - type); - proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); - } - } + case RSVP_CLASS_HOP: + dissect_rsvp_hop(ti, tvb, offset, obj_length, class, type, type_str); 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, 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, tvb, offset+3, 1, - "C-type: 1"); - proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4, - "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; - } - - 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, offset2, mylen, - "Data (%d bytes)", mylen); - break; - } - } + case RSVP_CLASS_TIME_VALUES: + dissect_rsvp_time_values(ti, tvb, offset, obj_length, class, type, type_str); break; - case RSVP_CLASS_ERROR : - rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_error); - 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: { - guint8 error_code; - - 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, - "Error node: %s", - 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: { - 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, tvb, offset2, 16, - "Error node: %s", - 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, tvb, offset+3, 1, - "C-type: Unknown (%u)", - type); - proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); - } - } + case RSVP_CLASS_ERROR: + dissect_rsvp_error(ti, tvb, offset, obj_length, class, type, type_str); break; - - case RSVP_CLASS_SCOPE : - rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_scope); - 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, tvb, offset+3, 1, - "C-type: 1 - IPv4"); - while (mylen > 0) { - proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4, - "IPv4 Address: %s", - ip_to_str(tvb_get_ptr(tvb, offset2, 4))); - offset2 += 4; - mylen -= 4; - } - break; - } - - case 2: { - proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, - "C-type: 2 - IPv6"); - while (mylen > 0) { - proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16, - "IPv6 Address: %s", - ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16))); - offset2 += 16; - mylen -= 16; - } - 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, offset2, mylen, - "Data (%d bytes)", mylen); - } - } + case RSVP_CLASS_SCOPE: + dissect_rsvp_scope(ti, tvb, offset, obj_length, class, type, type_str); break; - case RSVP_CLASS_STYLE : - rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_style); - 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: { - guint32 style; - - proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, - "C-type: 1"); - 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, tvb, offset+3, 1, - "C-type: Unknown (%u)", - type); - proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); - break; - } - } + case RSVP_CLASS_STYLE: + dissect_rsvp_style(ti, tvb, offset, obj_length, class, type, type_str); break; - case RSVP_CLASS_CONFIRM : - rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_confirm); - 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, tvb, offset+3, 1, - "C-type: 1 - IPv4"); - 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: Receiver %s", - ip_to_str(tvb_get_ptr(tvb, offset2, 4))); - break; - } - - case 2: { - proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, - "C-type: 2 - IPv6"); - proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16, - "Receiver address: %s", - ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16))); - 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, offset2, mylen, - "Data (%d bytes)", mylen); - } - } + case RSVP_CLASS_CONFIRM: + dissect_rsvp_confirm(ti, tvb, offset, obj_length, class, type, type_str); 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, 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); - 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, - "Length: %u", obj_length); - proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1, - "Class number: %u - %s", - class, object_type); - common_template: - mylen = obj_length - 4; - proto_item_set_text(ti, summary_template(tvb, offset)); - switch(type) { - case 1: { - proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, - "C-type: 1 - IPv4"); - 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: { - proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1, - "C-type: 2 - IPv6"); - proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16, - "Source address: %s", - 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, tvb, offset+3, 1, - "C-type: 7 - IPv4 LSP"); - 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, tvb, offset+3, 1, - "C-type: Unknown (%u)", - type); - proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); - } - } + case RSVP_CLASS_SENDER_TEMPLATE: + case RSVP_CLASS_FILTER_SPEC: + dissect_rsvp_template_filter(ti, tvb, offset, obj_length, class, type, type_str); break; - case RSVP_CLASS_SENDER_TSPEC : { - proto_tree *tspec_tree; - - rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_sender_tspec); - 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; - - proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, - "Message format version: %u", - tvb_get_guint8(tvb, offset2)>>4); - proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2, - "Data length: %u words, not including header", - tvb_get_ntohs(tvb, offset2+2)); - - mylen -= 4; - offset2 += 4; - - proto_item_set_text(ti, "SENDER TSPEC: "); - - while (mylen > 0) { - guint8 service_num; - guint8 param_id; - guint16 param_len; - guint16 param_len_processed; - guint16 length; - - service_num = tvb_get_guint8(tvb, offset2); - proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, - "Service header: %u - %s", - 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", - 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 += length*4; */ - mylen -= length*4; - } + case RSVP_CLASS_SENDER_TSPEC: + dissect_rsvp_tspec(ti, tvb, offset, obj_length, class, type, type_str); break; - } - - case RSVP_CLASS_FLOWSPEC : { - proto_tree *flowspec_tree; - rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_flowspec); - 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; - - proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, - "Message format version: %u", - tvb_get_guint8(tvb, offset2)>>4); - proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2, - "Data length: %u words, not including header", - tvb_get_ntohs(tvb, offset2+2)); - - proto_item_set_text(ti, "FLOWSPEC: "); - - 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", - 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", - 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; - } - param_len_processed += param_len; - offset2 += param_len * 4; - } - - /* offset2 += length*4; */ - mylen -= length*4; - } + case RSVP_CLASS_FLOWSPEC: + dissect_rsvp_flowspec(ti, tvb, offset, obj_length, class, type, type_str); break; - } - - case RSVP_CLASS_ADSPEC : { - proto_tree *adspec_tree; - rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_adspec); - 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; - - proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1, - "Message format version: %u", - tvb_get_guint8(tvb, offset2)>>4); - proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2, - "Data length: %u words, not including header", - tvb_get_ntohs(tvb, offset2+2)); - mylen -= 4; - 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, tvb, offset2, 1, - "Service header %u - %s", - 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, tvb, offset2+2, 2, - "Data length: %u words, not including header", - 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(id) { - case 4: - case 8: - case 10: - case 133: - case 134: - case 135: - case 136: - /* 32-bit unsigned integer */ - 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, 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, tvb, offset2, - (phdr_length+1)<<2, - "%s (type %u, length %u)", - str, - id, phdr_length); - } - } else { - proto_tree_add_text(adspec_tree, tvb, offset2, - (phdr_length+1)<<2, - "Unknown (type %u, length %u)", - id, phdr_length); - } - offset2 += (phdr_length+1)<<2; - i -= (phdr_length+1)<<2; - mylen -= (phdr_length+1)<<2; - } - } + case RSVP_CLASS_ADSPEC: + dissect_rsvp_adspec(ti, tvb, offset, obj_length, class, type, type_str); break; - } - case RSVP_CLASS_INTEGRITY : - rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_integrity); - 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); - 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, 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); - 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, 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 = 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, 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 RSVP_CLASS_INTEGRITY: + dissect_rsvp_integrity(ti, tvb, offset, obj_length, class, type, type_str); + 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; - } + case RSVP_CLASS_POLICY: + dissect_rsvp_policy(ti, tvb, offset, obj_length, class, type, type_str); + 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, offset2, mylen, - "Data (%d bytes)", mylen); - break; - } - } + case RSVP_CLASS_LABEL_REQUEST: + dissect_rsvp_label_request(ti, tvb, offset, obj_length, class, type, type_str); break; - 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, 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, 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, tvb, offset+3, 1, - "C-type: Unknown (%u)", - type); - proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); - break; - } - } + case RSVP_CLASS_UPSTREAM_LABEL: + case RSVP_CLASS_SUGGESTED_LABEL: + case RSVP_CLASS_LABEL: + dissect_rsvp_label(ti, tvb, offset, obj_length, class, type, type_str); 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, 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: { - 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, 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, 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")); - - 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, tvb, offset+3, 1, - "C-type: Unknown (%u)", - type); - proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); - break; - } - } + case RSVP_CLASS_SESSION_ATTRIBUTE: + dissect_rsvp_session_attribute(ti, tvb, offset, obj_length, class, type, type_str); break; - case RSVP_CLASS_EXPLICIT_ROUTE : - rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_explicit_route); - 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, tvb, offset+3, 1, - "C-type: 1"); - 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 = 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(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, tvb, offset2+l, 1, - k ? "Loose Hop " : "Strict Hop"); - proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1, - "Type: 1 (IPv4)"); - 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, tvb, - offset2+l, 20, - "IPv6 Subobject"); - rsvp_ero_subtree = - proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj); - 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, tvb, offset2+l, 1, - "Type: 2 (IPv6)"); - 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 = tvb_get_ntohs(tvb, offset2+l+2); - ti2 = proto_tree_add_text(rsvp_object_tree, tvb, - offset2+l, 4, - "Autonomous System %u", - k); - rsvp_ero_subtree = - proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj); - proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1, - "Type: 32 (Autonomous System Number)"); - 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 = 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, tvb, offset2+l, 1, - k ? "Loose Hop " : "Strict Hop"); - proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1, - "Type: 64 (MPLS LSP Path Termination)"); - 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 = 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, tvb, offset2+l, 1, - k ? "Loose Hop " : "Strict Hop"); - 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 += 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, tvb, offset+3, 1, - "C-type: Unknown (%u)", - type); - proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); - break; - } - } + case RSVP_CLASS_EXPLICIT_ROUTE: + dissect_rsvp_explicit_route(ti, tvb, offset, obj_length, class, type, type_str); break; - - case RSVP_CLASS_RECORD_ROUTE : - rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_record_route); - 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, tvb, offset+3, 1, - "C-type: 1"); - 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, tvb, - offset2+l, 8, - "IPv4 Subobject - %s", - 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, tvb, offset2+l, 1, - "Type: 1 (IPv4)"); - 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, 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, tvb, offset2+l, 1, - "Type: 2 (IPv6)"); - 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 */ - 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, 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 += 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, tvb, offset+3, 1, - "C-type: Unknown (%u)", - type); - proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); - break; - } - } + case RSVP_CLASS_RECORD_ROUTE: + dissect_rsvp_record_route(ti, tvb, offset, obj_length, class, type, type_str); 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; - } + case RSVP_CLASS_MESSAGE_ID: + dissect_rsvp_message_id(ti, tvb, offset, obj_length, class, type, type_str); 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; - } + case RSVP_CLASS_MESSAGE_ID_ACK: + dissect_rsvp_message_id_ack(ti, tvb, offset, obj_length, class, type, type_str); 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; - } + case RSVP_CLASS_MESSAGE_ID_LIST: + dissect_rsvp_message_id_list(ti, tvb, offset, obj_length, class, type, type_str); 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)); - + dissect_rsvp_hello(ti, tvb, offset, obj_length, class, type, type_str); 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; - } + dissect_rsvp_dclass(ti, tvb, offset, obj_length, class, type, type_str); 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; - } - } + case RSVP_CLASS_ADMIN_STATUS: + dissect_rsvp_admin_status(ti, tvb, offset, obj_length, class, type, type_str); 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; - } + dissect_rsvp_lsp_tunnel_if_id(ti, tvb, offset, obj_length, class, type, type_str); break; - default : + case RSVP_CLASS_GENERALIZED_UNI: + dissect_rsvp_gen_uni(ti, tvb, offset, obj_length, class, type, type_str); + break; + + case RSVP_CLASS_NULL: + default: rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_unknown_class); 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); - default_class: - mylen = obj_length - 4; - proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen, - "Data (%d bytes)", mylen); + class, type_str); + proto_tree_add_text(rsvp_object_tree, tvb, offset2, obj_length - 4, + "Data (%d bytes)", obj_length - 4); break; - - case RSVP_CLASS_NULL : - break; - } offset += obj_length; @@ -2834,6 +3792,7 @@ proto_register_rsvp(void) &ett_rsvp_adspec, &ett_rsvp_adspec_subtree, &ett_rsvp_integrity, + &ett_rsvp_integrity_flags, &ett_rsvp_policy, &ett_rsvp_label, &ett_rsvp_label_request, @@ -2848,6 +3807,8 @@ proto_register_rsvp(void) &ett_rsvp_lsp_tunnel_if_id, &ett_rsvp_admin_status, &ett_rsvp_admin_status_flags, + &ett_rsvp_gen_uni, + &ett_rsvp_gen_uni_subobj, &ett_rsvp_unknown_class, }; |