2 * Routines for RSVP packet disassembly
4 * (c) Copyright Ashok Narayanan <ashokn@cisco.com>
6 * $Id: packet-rsvp.c,v 1.44 2001/06/18 02:17:51 guy Exp $
8 * Ethereal - Network traffic analyzer
9 * By Gerald Combs <gerald@ethereal.com>
10 * Copyright 1998 Gerald Combs
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License
15 * as published by the Free Software Foundation; either version 2
16 * of the License, or (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
31 * This module defines routines to disassemble RSVP packets, as defined in
32 * RFC 2205. All objects from RC2205 are supported, in IPv4 and IPv6 mode.
33 * In addition, the Integrated Services traffic specification objects
34 * defined in RFC2210 are also supported.
36 * IPv6 support is not completely tested
38 * Mar 3, 2000: Added support for MPLS/TE objects, as defined in
39 * <draft-ietf-mpls-rsvp-lsp-tunnel-04.txt>
56 #ifdef HAVE_SYS_TYPES_H
57 # include <sys/types.h>
60 #ifdef HAVE_NETINET_IN_H
61 # include <netinet/in.h>
66 #ifdef NEED_SNPRINTF_H
67 # include "snprintf.h"
72 #include "ieee-float.h"
76 static int proto_rsvp = -1;
78 static gint ett_rsvp = -1;
79 static gint ett_rsvp_hdr = -1;
80 static gint ett_rsvp_session = -1;
81 static gint ett_rsvp_hop = -1;
82 static gint ett_rsvp_time_values = -1;
83 static gint ett_rsvp_error = -1;
84 static gint ett_rsvp_scope = -1;
85 static gint ett_rsvp_style = -1;
86 static gint ett_rsvp_confirm = -1;
87 static gint ett_rsvp_sender_template = -1;
88 static gint ett_rsvp_filter_spec = -1;
89 static gint ett_rsvp_sender_tspec = -1;
90 static gint ett_rsvp_flowspec = -1;
91 static gint ett_rsvp_adspec = -1;
92 static gint ett_rsvp_adspec_subtree = -1;
93 static gint ett_rsvp_integrity = -1;
94 static gint ett_rsvp_policy = -1;
95 static gint ett_rsvp_label = -1;
96 static gint ett_rsvp_label_request = -1;
97 static gint ett_rsvp_session_attribute = -1;
98 static gint ett_rsvp_session_attribute_flags = -1;
99 static gint ett_rsvp_explicit_route = -1;
100 static gint ett_rsvp_explicit_route_subobj = -1;
101 static gint ett_rsvp_record_route = -1;
102 static gint ett_rsvp_record_route_subobj = -1;
103 static gint ett_rsvp_unknown_class = -1;
117 RSVP_MSG_RTEAR_CONFIRM=10,
118 RSVP_MSG_BUNDLE = 12,
120 RSVP_MSG_SREFRESH = 15
121 } rsvp_message_types;
123 static value_string message_type_vals[] = {
124 {RSVP_MSG_PATH, "PATH Message"},
125 {RSVP_MSG_RESV, "RESV Message"},
126 {RSVP_MSG_PERR, "PATH ERROR Message"},
127 {RSVP_MSG_RERR, "RESV ERROR Message"},
128 {RSVP_MSG_PTEAR, "PATH TEAR Message"},
129 {RSVP_MSG_RTEAR, "RESV TEAR Message"},
130 {RSVP_MSG_CONFIRM, "CONFIRM Message"},
131 {RSVP_MSG_RTEAR_CONFIRM, "RESV TEAR CONFIRM Message"},
132 {RSVP_MSG_BUNDLE, "BUNDLE Message"},
133 {RSVP_MSG_ACK, "ACK Message"},
134 {RSVP_MSG_SREFRESH, "SREFRESH Message"},
141 #define MAX_RSVP_CLASS 15
148 RSVP_CLASS_INTEGRITY,
149 RSVP_CLASS_TIME_VALUES,
154 RSVP_CLASS_FILTER_SPEC,
155 RSVP_CLASS_SENDER_TEMPLATE,
156 RSVP_CLASS_SENDER_TSPEC,
162 RSVP_CLASS_LABEL_REQUEST=19,
163 RSVP_CLASS_EXPLICIT_ROUTE,
164 RSVP_CLASS_RECORD_ROUTE,
166 RSVP_CLASS_MESSAGE_ID = 23,
167 RSVP_CLASS_MESSAGE_ID_ACK,
168 RSVP_CLASS_MESSAGE_ID_LIST,
170 RSVP_CLASS_SESSION_ATTRIBUTE=207,
173 static value_string rsvp_class_vals[] = {
174 {RSVP_CLASS_NULL, "NULL object"},
175 {RSVP_CLASS_SESSION, "SESSION object"},
176 {RSVP_CLASS_HOP, "HOP object"},
177 {RSVP_CLASS_INTEGRITY, "INTEGRITY object"},
178 {RSVP_CLASS_TIME_VALUES, "TIME VALUES object"},
179 {RSVP_CLASS_ERROR, "ERROR object"},
180 {RSVP_CLASS_SCOPE, "SCOPE object"},
181 {RSVP_CLASS_STYLE, "STYLE object"},
182 {RSVP_CLASS_FLOWSPEC, "FLOWSPEC object"},
183 {RSVP_CLASS_FILTER_SPEC, "FILTER SPEC object"},
184 {RSVP_CLASS_SENDER_TEMPLATE, "SENDER TEMPLATE object"},
185 {RSVP_CLASS_SENDER_TSPEC, "SENDER TSPEC object"},
186 {RSVP_CLASS_ADSPEC, "ADSPEC object"},
187 {RSVP_CLASS_POLICY, "POLICY object"},
188 {RSVP_CLASS_CONFIRM, "CONFIRM object"},
189 {RSVP_CLASS_LABEL, "LABEL object"},
190 {RSVP_CLASS_LABEL_REQUEST, "LABEL REQUEST object"},
191 {RSVP_CLASS_EXPLICIT_ROUTE, "EXPLICIT ROUTE object"},
192 {RSVP_CLASS_RECORD_ROUTE, "RECORD ROUTE object"},
193 {RSVP_CLASS_SESSION_ATTRIBUTE, "SESSION ATTRIBUTE object"},
194 {RSVP_CLASS_MESSAGE_ID, "MESSAGE-ID object"},
195 {RSVP_CLASS_MESSAGE_ID_ACK, "MESSAGE-ID ACK/NACK object"},
196 {RSVP_CLASS_MESSAGE_ID_LIST, "MESSAGE-ID LIST object"},
203 enum rsvp_error_types {
204 RSVP_ERROR_CONFIRM = 0,
205 RSVP_ERROR_ADMISSION,
208 RSVP_ERROR_NO_SENDER,
209 RSVP_ERROR_CONFLICT_RESV_STYLE,
210 RSVP_ERROR_UNKNOWN_RESV_STYLE,
211 RSVP_ERROR_CONFLICT_DEST_PORTS,
212 RSVP_ERROR_CONFLICT_SRC_PORTS,
213 RSVP_ERROR_PREEMPTED=12,
214 RSVP_ERROR_UNKNOWN_CLASS,
215 RSVP_ERROR_UNKNOWN_C_TYPE,
216 RSVP_ERROR_TRAFFIC = 21,
217 RSVP_ERROR_TRAFFIC_SYSTEM,
223 static value_string rsvp_error_vals[] = {
224 {RSVP_ERROR_CONFIRM, "Confirmation"},
225 {RSVP_ERROR_ADMISSION, "Admission Control Failure "},
226 {RSVP_ERROR_POLICY, "Policy Control Failure"},
227 {RSVP_ERROR_NO_PATH, "No PATH information for this RESV message"},
228 {RSVP_ERROR_NO_SENDER, "No sender information for this RESV message"},
229 {RSVP_ERROR_CONFLICT_RESV_STYLE, "Conflicting reservation styles"},
230 {RSVP_ERROR_UNKNOWN_RESV_STYLE, "Unknown reservation style"},
231 {RSVP_ERROR_CONFLICT_DEST_PORTS, "Conflicting destination ports"},
232 {RSVP_ERROR_CONFLICT_SRC_PORTS, "Conflicting source ports"},
233 {RSVP_ERROR_PREEMPTED, "Service preempted"},
234 {RSVP_ERROR_UNKNOWN_CLASS, "Unknown object class"},
235 {RSVP_ERROR_UNKNOWN_C_TYPE, "Unknown object C-type"},
236 {RSVP_ERROR_TRAFFIC, "Traffic Control Error"},
237 {RSVP_ERROR_TRAFFIC_SYSTEM, "Traffic Control System Error"},
238 {RSVP_ERROR_SYSTEM, "RSVP System Error"},
239 {RSVP_ERROR_ROUTING, "Routing Error"},
240 {RSVP_ERROR_NOTIFY, "RSVP Notify Error"},
245 * Defines the reservation style plus style-specific information that
246 * is not a FLOWSPEC or FILTER_SPEC object, in a RESV message.
248 #define RSVP_DISTINCT (1 << 3)
249 #define RSVP_SHARED (2 << 3)
250 #define RSVP_SHARING_MASK (RSVP_DISTINCT | RSVP_SHARED)
252 #define RSVP_SCOPE_WILD 1
253 #define RSVP_SCOPE_EXPLICIT 2
254 #define RSVP_SCOPE_MASK 0x07
256 #define RSVP_WF (RSVP_SHARED | RSVP_SCOPE_WILD)
257 #define RSVP_FF (RSVP_DISTINCT | RSVP_SCOPE_EXPLICIT)
258 #define RSVP_SE (RSVP_SHARED | RSVP_SCOPE_EXPLICIT)
260 static value_string style_vals[] = {
261 { RSVP_WF, "Wildcard Filter" },
262 { RSVP_FF, "Fixed Filter" },
263 { RSVP_SE, "Shared-Explicit" },
268 * Defines a desired QoS, in a RESV message.
270 enum qos_service_type {
271 QOS_QUALITATIVE = 128, /* Qualitative service */
272 QOS_CONTROLLED_LOAD= 5, /* Controlled Load Service */
273 QOS_GUARANTEED = 2, /* Guaranteed service */
274 QOS_TSPEC = 1 /* Traffic specification */
277 static value_string qos_vals[] = {
278 { QOS_QUALITATIVE, "Qualitative QoS" },
279 { QOS_CONTROLLED_LOAD, "Controlled-load QoS" },
280 { QOS_GUARANTEED, "Guaranteed rate QoS" },
281 { QOS_TSPEC, "Traffic specification" },
285 static value_string svc_vals[] = {
286 { 127, "Token bucket TSpec" },
287 { 128, "Qualitative TSpec" },
288 { 130, "Guaranteed-rate RSpec" },
292 enum rsvp_spec_types { INTSRV = 2 };
294 enum intsrv_services {
298 INTSRV_QUALITATIVE = 128
301 static value_string intsrv_services_str[] = {
302 {INTSRV_GENERAL, "Default General Parameters"},
303 {INTSRV_GTD, "Guaranteed"},
304 {INTSRV_CLOAD, "Controlled Load"},
305 {INTSRV_QUALITATIVE, "Qualitative"},
309 enum intsrv_field_name {
310 INTSRV_NON_IS_HOPS = 1, INTSRV_COMPOSED_NON_IS_HOPS,
311 INTSRV_IS_HOPS, INTSRV_COMPOSED_IS_HOPS,
312 INTSRV_PATH_BANDWIDTH, INTSRV_MIN_PATH_BANDWIDTH,
313 INTSRV_IF_LATENCY, INTSRV_PATH_LATENCY,
314 INTSRV_MTU, INTSRV_COMPOSED_MTU,
316 INTSRV_TOKEN_BUCKET_TSPEC = 127,
317 INTSRV_QUALITATIVE_TSPEC = 128,
318 INTSRV_GTD_RSPEC = 130,
320 INTSRV_DELAY = 131, /* Gtd Parameter C - Max Delay Bound - bytes */
321 INTSRV_MAX_JITTER, /* Gtd Parameter D - Max Jitter */
322 INTSRV_E2E_DELAY, /* Gtd Parameter Ctot */
323 INTSRV_E2E_MAX_JITTER, /* Gtd Parameter Dtot */
324 INTSRV_SHP_DELAY, /* Gtd Parameter Csum */
325 INTSRV_SHP_MAX_JITTER /* Gtd Parameter Dsum */
328 static value_string adspec_params[] = {
330 {6, "Path b/w estimate"},
331 {8, "Minimum path latency"},
332 {10, "Composed MTU"},
333 {133, "End-to-end composed value for C"},
334 {134, "End-to-end composed value for D"},
335 {135, "Since-last-reshaping point composed C"},
336 {136, "Since-last-reshaping point composed D"},
340 /* -------------------- Stuff for MPLS/TE objects -------------------- */
342 static const value_string proto_vals[] = { {IP_PROTO_ICMP, "ICMP"},
343 {IP_PROTO_IGMP, "IGMP"},
344 {IP_PROTO_TCP, "TCP" },
345 {IP_PROTO_UDP, "UDP" },
346 {IP_PROTO_OSPF, "OSPF"},
350 enum rsvp_filter_keys {
353 RSVPF_MSG, /* Message type */
354 /* Shorthand for message types */
371 /* Does the message contain an object of this type? */
373 /* Object present shorthands */
393 RSVPF_EXPLICIT_ROUTE,
397 RSVPF_MESSAGE_ID_ACK,
398 RSVPF_MESSAGE_ID_LIST,
400 RSVPF_SESSION_ATTRIBUTE,
407 RSVPF_SESSION_TUNNEL_ID,
408 RSVPF_SESSION_EXT_TUNNEL_ID,
410 /* Sender template */
419 static int rsvp_filter[RSVPF_MAX];
421 static hf_register_info rsvpf_info[] = {
423 /* Message type number */
424 {&rsvp_filter[RSVPF_MSG],
425 { "Message Type", "rsvp.msg", FT_UINT8, BASE_DEC, VALS(message_type_vals), 0x0,
428 /* Message type shorthands */
429 {&rsvp_filter[RSVPF_PATH],
430 { "Path Message", "rsvp.path", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
433 {&rsvp_filter[RSVPF_RESV],
434 { "Resv Message", "rsvp.resv", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
437 {&rsvp_filter[RSVPF_PATHERR],
438 { "Path Error Message", "rsvp.perr", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
441 {&rsvp_filter[RSVPF_RESVERR],
442 { "Resv Error Message", "rsvp.rerr", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
445 {&rsvp_filter[RSVPF_PATHTEAR],
446 { "Path Tear Message", "rsvp.ptear", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
449 {&rsvp_filter[RSVPF_RESVTEAR],
450 { "Resv Tear Message", "rsvp.rtear", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
453 {&rsvp_filter[RSVPF_RCONFIRM],
454 { "Resv Confirm Message", "rsvp.resvconf", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
457 {&rsvp_filter[RSVPF_RTEARCONFIRM],
458 { "Resv Tear Confirm Message", "rsvp.rtearconf", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
462 {&rsvp_filter[RSVPF_OBJECT],
463 { "Object class", "rsvp.object", FT_UINT8, BASE_DEC, VALS(rsvp_class_vals), 0x0,
466 /* Object present shorthands */
467 {&rsvp_filter[RSVPF_SESSION],
468 { "SESSION", "rsvp.session", FT_NONE, BASE_NONE, NULL, 0x0,
471 {&rsvp_filter[RSVPF_HOP],
472 { "HOP", "rsvp.hop", FT_NONE, BASE_NONE, NULL, 0x0,
475 {&rsvp_filter[RSVPF_INTEGRITY],
476 { "INTEGRITY", "rsvp.integrity", FT_NONE, BASE_NONE, NULL, 0x0,
479 {&rsvp_filter[RSVPF_TIME_VALUES],
480 { "TIME VALUES", "rsvp.time", FT_NONE, BASE_NONE, NULL, 0x0,
483 {&rsvp_filter[RSVPF_ERROR],
484 { "ERROR", "rsvp.error", FT_NONE, BASE_NONE, NULL, 0x0,
487 {&rsvp_filter[RSVPF_SCOPE],
488 { "SCOPE", "rsvp.scope", FT_NONE, BASE_NONE, NULL, 0x0,
491 {&rsvp_filter[RSVPF_STYLE],
492 { "STYLE", "rsvp.style", FT_NONE, BASE_NONE, NULL, 0x0,
495 {&rsvp_filter[RSVPF_FLOWSPEC],
496 { "FLOWSPEC", "rsvp.flowspec", FT_NONE, BASE_NONE, NULL, 0x0,
499 {&rsvp_filter[RSVPF_FILTER_SPEC],
500 { "FILTERSPEC", "rsvp.filter", FT_NONE, BASE_NONE, NULL, 0x0,
503 {&rsvp_filter[RSVPF_SENDER],
504 { "SENDER TEMPLATE", "rsvp.sender", FT_NONE, BASE_NONE, NULL, 0x0,
507 {&rsvp_filter[RSVPF_TSPEC],
508 { "SENDER TSPEC", "rsvp.tspec", FT_NONE, BASE_NONE, NULL, 0x0,
511 {&rsvp_filter[RSVPF_ADSPEC],
512 { "ADSPEC", "rsvp.adspec", FT_NONE, BASE_NONE, NULL, 0x0,
515 {&rsvp_filter[RSVPF_POLICY],
516 { "POLICY", "rsvp.policy", FT_NONE, BASE_NONE, NULL, 0x0,
519 {&rsvp_filter[RSVPF_CONFIRM],
520 { "CONFIRM", "rsvp.confirm", FT_NONE, BASE_NONE, NULL, 0x0,
523 {&rsvp_filter[RSVPF_LABEL],
524 { "LABEL", "rsvp.label", FT_NONE, BASE_NONE, NULL, 0x0,
527 {&rsvp_filter[RSVPF_LABEL_REQUEST],
528 { "LABEL REQUEST", "rsvp.label_request", FT_NONE, BASE_NONE, NULL, 0x0,
531 {&rsvp_filter[RSVPF_SESSION_ATTRIBUTE],
532 { "SESSION ATTRIBUTE", "rsvp.session_attribute", FT_NONE, BASE_NONE, NULL, 0x0,
535 {&rsvp_filter[RSVPF_EXPLICIT_ROUTE],
536 { "EXPLICIT ROUTE", "rsvp.explicit_route", FT_NONE, BASE_NONE, NULL, 0x0,
539 {&rsvp_filter[RSVPF_RECORD_ROUTE],
540 { "RECORD ROUTE", "rsvp.record_route", FT_NONE, BASE_NONE, NULL, 0x0,
543 {&rsvp_filter[RSVPF_MESSAGE_ID],
544 { "MESSAGE-ID", "rsvp.msgid", FT_NONE, BASE_NONE, NULL, 0x0,
547 {&rsvp_filter[RSVPF_MESSAGE_ID_ACK],
548 { "MESSAGE-ID ACK", "rsvp.ack", FT_NONE, BASE_NONE, NULL, 0x0,
551 {&rsvp_filter[RSVPF_MESSAGE_ID_LIST],
552 { "MESSAGE-ID LIST", "rsvp.msgid_list", FT_NONE, BASE_NONE, NULL, 0x0,
555 {&rsvp_filter[RSVPF_UNKNOWN_OBJ],
556 { "Unknown object", "rsvp.obj_unknown", FT_NONE, BASE_NONE, NULL, 0x0,
560 {&rsvp_filter[RSVPF_SESSION_IP],
561 { "Destination address", "rsvp.session.ip", FT_IPv4, BASE_NONE, NULL, 0x0,
564 {&rsvp_filter[RSVPF_SESSION_PORT],
565 { "Port number", "rsvp.session.port", FT_UINT16, BASE_DEC, NULL, 0x0,
568 {&rsvp_filter[RSVPF_SESSION_PROTO],
569 { "Protocol", "rsvp.session.proto", FT_UINT8, BASE_DEC, VALS(proto_vals), 0x0,
572 {&rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
573 { "Tunnel ID", "rsvp.session.tunnel_id", FT_UINT16, BASE_DEC, NULL, 0x0,
576 {&rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
577 { "Extended tunnel ID", "rsvp.session.ext_tunnel_id", FT_UINT32, BASE_DEC, NULL, 0x0,
580 /* Sender template/Filterspec fields */
581 {&rsvp_filter[RSVPF_SENDER_IP],
582 { "Sender IPv4 address", "rsvp.sender.ip", FT_IPv4, BASE_NONE, NULL, 0x0,
585 {&rsvp_filter[RSVPF_SENDER_PORT],
586 { "Sender port number", "rsvp.sender.port", FT_UINT16, BASE_DEC, NULL, 0x0,
589 {&rsvp_filter[RSVPF_SENDER_LSP_ID],
590 { "Sender LSP ID", "rsvp.sender.lsp_id", FT_UINT16, BASE_DEC, NULL, 0x0,
594 static inline int rsvp_class_to_filter_num(int classnum)
597 case RSVP_CLASS_SESSION :
598 case RSVP_CLASS_HOP :
599 case RSVP_CLASS_INTEGRITY :
600 case RSVP_CLASS_TIME_VALUES :
601 case RSVP_CLASS_ERROR :
602 case RSVP_CLASS_SCOPE :
603 case RSVP_CLASS_STYLE :
604 case RSVP_CLASS_FLOWSPEC :
605 case RSVP_CLASS_FILTER_SPEC :
606 case RSVP_CLASS_SENDER_TEMPLATE :
607 case RSVP_CLASS_SENDER_TSPEC :
608 case RSVP_CLASS_ADSPEC :
609 case RSVP_CLASS_POLICY :
610 case RSVP_CLASS_CONFIRM :
611 case RSVP_CLASS_LABEL :
612 case RSVP_CLASS_LABEL_REQUEST :
613 case RSVP_CLASS_EXPLICIT_ROUTE :
614 case RSVP_CLASS_RECORD_ROUTE :
615 case RSVP_CLASS_MESSAGE_ID :
616 case RSVP_CLASS_MESSAGE_ID_ACK :
617 case RSVP_CLASS_MESSAGE_ID_LIST :
618 return classnum + RSVPF_OBJECT;
621 case RSVP_CLASS_SESSION_ATTRIBUTE :
622 return RSVPF_SESSION_ATTRIBUTE;
625 return RSVPF_UNKNOWN_OBJ;
630 dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
633 proto_tree *rsvp_tree = NULL, *ti, *ti2;
634 proto_tree *rsvp_header_tree;
635 proto_tree *rsvp_object_tree;
636 proto_tree *rsvp_sa_flags_tree;
637 proto_tree *rsvp_ero_subtree;
640 guint16 cksum, computed_cksum;
649 if (check_col(pinfo->fd, COL_PROTOCOL))
650 col_set_str(pinfo->fd, COL_PROTOCOL, "RSVP");
651 if (check_col(pinfo->fd, COL_INFO))
652 col_clear(pinfo->fd, COL_INFO);
654 ver_flags = tvb_get_guint8(tvb, offset+0);
655 message_type = tvb_get_guint8(tvb, offset+1);
656 if (check_col(pinfo->fd, COL_INFO)) {
657 col_add_str(pinfo->fd, COL_INFO,
658 val_to_str(message_type, message_type_vals, "Unknown (%u)"));
662 msg_length = tvb_get_ntohs(tvb, offset+6);
663 ti = proto_tree_add_item(tree, proto_rsvp, tvb, offset, msg_length,
665 rsvp_tree = proto_item_add_subtree(ti, ett_rsvp);
667 ti = proto_tree_add_text(rsvp_tree, tvb, offset, 8, "RSVP Header");
668 rsvp_header_tree = proto_item_add_subtree(ti, ett_rsvp_hdr);
670 proto_tree_add_text(rsvp_header_tree, tvb, offset, 1, "RSVP Version: %u",
671 (ver_flags & 0xf0)>>4);
672 proto_tree_add_text(rsvp_header_tree, tvb, offset, 1, "Flags: %02x",
674 proto_tree_add_uint(rsvp_header_tree, rsvp_filter[RSVPF_MSG], tvb,
675 offset+1, 1, message_type);
676 if (message_type <= RSVPF_RTEARCONFIRM &&
677 message_type != RSVPF_JUNK_MSG8 &&
678 message_type != RSVPF_JUNK_MSG9 ) {
679 proto_tree_add_boolean_hidden(rsvp_header_tree, rsvp_filter[RSVPF_MSG + message_type], tvb,
682 cksum = tvb_get_ntohs(tvb, offset+2);
683 if (!pinfo->fragmented && tvb_length(tvb) >= msg_length) {
684 /* The packet isn't part of a fragmented datagram and isn't
685 truncated, so we can checksum it. */
686 cksum_vec[0].ptr = tvb_get_ptr(tvb, 0, msg_length);
687 cksum_vec[0].len = msg_length;
688 computed_cksum = in_cksum(&cksum_vec[0], 1);
689 if (computed_cksum == 0) {
690 proto_tree_add_text(rsvp_header_tree, tvb, offset+2, 2,
691 "Message Checksum: 0x%04x (correct)",
694 proto_tree_add_text(rsvp_header_tree, tvb, offset+2, 2,
695 "Message Checksum: 0x%04x (incorrect, should be 0x%04x)",
697 in_cksum_shouldbe(cksum, computed_cksum));
700 proto_tree_add_text(rsvp_header_tree, tvb, offset+2, 2,
701 "Message Checksum: 0x%04x",
704 proto_tree_add_text(rsvp_header_tree, tvb, offset+4, 1,
706 tvb_get_guint8(tvb, offset+4));
707 proto_tree_add_text(rsvp_header_tree, tvb, offset+6, 2,
708 "Message length: %u", msg_length);
712 while (len < msg_length) {
717 obj_length = tvb_get_ntohs(tvb, offset);
718 class = tvb_get_guint8(tvb, offset+2);
719 type = tvb_get_guint8(tvb, offset+3);
720 object_type = val_to_str(class, rsvp_class_vals, "Unknown");
721 proto_tree_add_uint_hidden(rsvp_tree, rsvp_filter[RSVPF_OBJECT], tvb,
722 offset, obj_length, class);
723 ti = proto_tree_add_item(rsvp_tree, rsvp_filter[rsvp_class_to_filter_num(class)],
724 tvb, offset, obj_length, FALSE);
730 case RSVP_CLASS_SESSION :
731 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_session);
732 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
733 "Length: %u", obj_length);
734 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
735 "Class number: %u - %s",
737 mylen = obj_length - 4;
740 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
742 proto_tree_add_item(rsvp_object_tree,
743 rsvp_filter[RSVPF_SESSION_IP],
744 tvb, offset2, 4, FALSE);
746 proto_tree_add_item(rsvp_object_tree,
747 rsvp_filter[RSVPF_SESSION_PROTO], tvb,
748 offset2+4, 1, FALSE);
749 proto_tree_add_text(rsvp_object_tree, tvb, offset2+5, 1,
751 tvb_get_guint8(tvb, offset2+5));
752 proto_tree_add_item(rsvp_object_tree,
753 rsvp_filter[RSVPF_SESSION_PORT], tvb,
754 offset2+6, 2, FALSE);
755 proto_item_set_text(ti, "SESSION: IPv4, %s, %d, %d",
756 ip_to_str(tvb_get_ptr(tvb, offset2, 4)),
757 tvb_get_guint8(tvb, offset2+4),
758 tvb_get_ntohs(tvb, offset2+6));
763 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
765 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
766 "Destination address: %s",
767 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
768 proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 1,
770 tvb_get_guint8(tvb, offset2+16));
771 proto_tree_add_text(rsvp_object_tree, tvb, offset2+17, 1,
773 tvb_get_guint8(tvb, offset2+17));
774 proto_tree_add_text(rsvp_object_tree, tvb, offset2+18, 2,
775 "Destination port: %u",
776 tvb_get_ntohs(tvb, offset2+18));
781 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
782 "C-type: 7 - IPv4 LSP");
783 proto_tree_add_item(rsvp_object_tree,
784 rsvp_filter[RSVPF_SESSION_IP],
785 tvb, offset2, 4, FALSE);
787 proto_tree_add_item(rsvp_object_tree,
788 rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
789 tvb, offset2+6, 2, FALSE);
791 proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 4,
792 "Extended Tunnel ID: %u (%s)",
793 tvb_get_ntohl(tvb, offset2+8),
794 ip_to_str(tvb_get_ptr(tvb, offset2+8, 4)));
795 proto_tree_add_item_hidden(rsvp_object_tree,
796 rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
797 tvb, offset2+8, 4, FALSE);
798 proto_item_set_text(ti, "SESSION: IPv4-LSP, %s, %d, %0x",
799 ip_to_str(tvb_get_ptr(tvb, offset2, 4)),
800 tvb_get_ntohs(tvb, offset2+6),
801 tvb_get_ntohl(tvb, offset2+8));
806 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
807 "C-type: Unknown (%u)",
809 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
810 "Data (%d bytes)", mylen);
815 case RSVP_CLASS_HOP :
816 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_hop);
817 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
818 "Length: %u", obj_length);
819 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
820 "Class number: %u - %s",
822 mylen = obj_length - 4;
825 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
827 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
828 "Neighbor address: %s",
829 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
830 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
831 "Logical interface: %u",
832 tvb_get_ntohl(tvb, offset2+4));
833 proto_item_set_text(ti, "HOP: IPv4, %s",
834 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
839 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
841 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
842 "Neighbor address: %s",
843 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
844 proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 4,
845 "Logical interface: 0x%08x",
846 tvb_get_ntohl(tvb, offset2+16));
851 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
852 "C-type: Unknown (%u)",
854 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
855 "Data (%d bytes)", mylen);
860 case RSVP_CLASS_TIME_VALUES :
861 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_time_values);
862 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
863 "Length: %u", obj_length);
864 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
865 "Class number: %u - %s",
867 mylen = obj_length - 4;
870 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
872 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
873 "Refresh interval: %u ms (%u seconds)",
874 tvb_get_ntohl(tvb, offset2),
875 tvb_get_ntohl(tvb, offset2)/1000);
876 proto_item_set_text(ti, "TIME VALUES: %d ms",
877 tvb_get_ntohl(tvb, offset2));
882 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
883 "C-type: Unknown (%u)",
885 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
886 "Data (%d bytes)", mylen);
892 case RSVP_CLASS_ERROR :
893 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_error);
894 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
895 "Length: %u", obj_length);
896 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
897 "Class number: %u - %s",
899 mylen = obj_length - 4;
904 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
906 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
908 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
909 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 1,
911 tvb_get_guint8(tvb, offset2+4));
912 error_code = tvb_get_guint8(tvb, offset2+5);
913 proto_tree_add_text(rsvp_object_tree, tvb, offset2+5, 1,
914 "Error code: %u - %s", error_code,
915 val_to_str(error_code, rsvp_error_vals, "Unknown"));
916 proto_tree_add_text(rsvp_object_tree, tvb, offset2+6, 2,
918 tvb_get_ntohs(tvb, offset2+6));
919 proto_item_set_text(ti, "ERROR: IPv4, %d, %d, %s",
920 tvb_get_guint8(tvb, offset2+5),
921 tvb_get_ntohs(tvb, offset2+6),
922 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
929 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
931 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
933 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
934 proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 1,
936 tvb_get_guint8(tvb, offset2+16));
937 error_code = tvb_get_guint8(tvb, offset2+17);
938 proto_tree_add_text(rsvp_object_tree, tvb, offset2+17, 1,
939 "Error code: %u - %s", error_code,
940 val_to_str(error_code, rsvp_error_vals, "Unknown"));
941 proto_tree_add_text(rsvp_object_tree, tvb, offset2+18, 2,
943 tvb_get_ntohs(tvb, offset2+18));
948 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
949 "C-type: Unknown (%u)",
951 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
952 "Data (%d bytes)", mylen);
958 case RSVP_CLASS_SCOPE :
959 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_scope);
960 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
961 "Length: %u", obj_length);
962 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
963 "Class number: %u - %s",
965 mylen = obj_length - 4;
968 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
971 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
973 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
981 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
984 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
986 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
994 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
995 "C-type: Unknown (%u)",
997 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
998 "Data (%d bytes)", mylen);
1003 case RSVP_CLASS_STYLE :
1004 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_style);
1005 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1006 "Length: %u", obj_length);
1007 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1008 "Class number: %u - %s",
1009 class, object_type);
1010 mylen = obj_length - 4;
1015 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1017 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1019 tvb_get_guint8(tvb, offset2));
1020 style = tvb_get_ntoh24(tvb, offset2+1);
1021 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1,
1022 3, "Style: 0x%06X - %s", style,
1023 val_to_str(style, style_vals, "Unknown"));
1024 proto_item_set_text(ti, "STYLE: %s (%d)",
1025 val_to_str(style, style_vals, "Unknown"),
1031 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1032 "C-type: Unknown (%u)",
1034 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1035 "Data (%d bytes)", mylen);
1041 case RSVP_CLASS_CONFIRM :
1042 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_confirm);
1043 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1044 "Length: %u", obj_length);
1045 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1046 "Class number: %u - %s",
1047 class, object_type);
1048 mylen = obj_length - 4;
1051 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1052 "C-type: 1 - IPv4");
1053 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
1054 "Receiver address: %s",
1055 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
1056 proto_item_set_text(ti, "CONFIRM: %s",
1057 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
1062 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1063 "C-type: 2 - IPv6");
1064 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
1065 "Receiver address: %s",
1066 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1071 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1072 "C-type: Unknown (%u)",
1074 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1075 "Data (%d bytes)", mylen);
1080 case RSVP_CLASS_SENDER_TEMPLATE :
1081 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_sender_template);
1082 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1083 "Length: %u", obj_length);
1084 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1085 "Class number: %u - %s",
1086 class, object_type);
1087 objtype = "SENDER TEMPLATE";
1088 goto common_template;
1089 case RSVP_CLASS_FILTER_SPEC :
1090 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_filter_spec);
1091 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1092 "Length: %u", obj_length);
1093 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1094 "Class number: %u - %s",
1095 class, object_type);
1096 objtype = "FILTERSPEC";
1098 mylen = obj_length - 4;
1101 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1102 "C-type: 1 - IPv4");
1103 proto_tree_add_item(rsvp_object_tree,
1104 rsvp_filter[RSVPF_SENDER_IP],
1105 tvb, offset2, 4, FALSE);
1106 proto_tree_add_item(rsvp_object_tree,
1107 rsvp_filter[RSVPF_SENDER_PORT],
1108 tvb, offset2+6, 2, FALSE);
1109 proto_item_set_text(ti, "%s: IPv4, %s, %d", objtype,
1110 ip_to_str(tvb_get_ptr(tvb, offset2, 4)),
1111 tvb_get_ntohs(tvb, offset2+6));
1116 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1117 "C-type: 2 - IPv6");
1118 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
1119 "Source address: %s",
1120 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1121 proto_tree_add_text(rsvp_object_tree, tvb, offset2+18, 2,
1123 tvb_get_ntohs(tvb, offset2+18));
1128 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1129 "C-type: 7 - IPv4 LSP");
1130 proto_tree_add_item(rsvp_object_tree,
1131 rsvp_filter[RSVPF_SENDER_IP],
1132 tvb, offset2, 4, FALSE);
1133 proto_tree_add_item(rsvp_object_tree,
1134 rsvp_filter[RSVPF_SENDER_LSP_ID],
1135 tvb, offset2+6, 2, FALSE);
1136 proto_item_set_text(ti, "%s: IPv4-LSP, %s, %d", objtype,
1137 ip_to_str(tvb_get_ptr(tvb, offset2, 4)),
1138 tvb_get_ntohs(tvb, offset2+6));
1143 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1144 "C-type: Unknown (%u)",
1146 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1147 "Data (%d bytes)", mylen);
1152 case RSVP_CLASS_SENDER_TSPEC : {
1153 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_sender_tspec);
1154 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1155 "Length: %u", obj_length);
1156 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1157 "Class number: %u - %s",
1158 class, object_type);
1159 mylen = obj_length - 4;
1161 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1162 "Message format version: %u",
1163 tvb_get_guint8(tvb, offset2)>>4);
1164 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1165 "Data length: %u words, not including header",
1166 tvb_get_ntohs(tvb, offset2+2));
1175 service_num = tvb_get_guint8(tvb, offset2);
1176 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1177 "Service header: %u - %s",
1179 val_to_str(service_num, qos_vals, "Unknown"));
1180 length = tvb_get_ntohs(tvb, offset2+2);
1181 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1182 "Length of service %u data: %u words, "
1183 "not including header",
1184 service_num, length);
1189 switch(service_num) {
1192 /* Token bucket TSPEC */
1193 param_id = tvb_get_guint8(tvb, offset2);
1194 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1195 "Parameter %u - %s",
1197 val_to_str(param_id, svc_vals, "Unknown"));
1198 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
1199 "Parameter %u flags: 0x%02x",
1201 tvb_get_guint8(tvb, offset2+1));
1202 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1203 "Parameter %u data length: %u words, "
1204 "not including header",
1206 tvb_get_ntohs(tvb, offset2+2));
1207 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
1208 "Token bucket rate: %ld",
1209 tvb_ieee_to_long(tvb, offset2+4));
1210 proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 4,
1211 "Token bucket size: %ld",
1212 tvb_ieee_to_long(tvb, offset2+8));
1213 proto_tree_add_text(rsvp_object_tree, tvb, offset2+12, 4,
1214 "Peak data rate: %ld",
1215 tvb_ieee_to_long(tvb, offset2+12));
1216 proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 4,
1217 "Minimum policed unit [m]: %u",
1218 tvb_get_ntohl(tvb, offset2+16));
1219 proto_tree_add_text(rsvp_object_tree, tvb, offset2+20, 4,
1220 "Maximum packet size [M]: %u",
1221 tvb_get_ntohl(tvb, offset2+20));
1222 proto_item_set_text(ti, "SENDER TSPEC: IntServ, %lu bytes/sec",
1223 tvb_ieee_to_long(tvb, offset2+4));
1226 case QOS_QUALITATIVE :
1227 /* Token bucket TSPEC */
1228 param_id = tvb_get_guint8(tvb, offset2);
1229 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1230 "Parameter %u - %s",
1232 val_to_str(param_id, svc_vals, "Unknown"));
1233 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
1234 "Parameter %u flags: %x",
1236 tvb_get_guint8(tvb, offset2+1));
1237 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1238 "Parameter %u data length: %u words, "
1239 "not including header",
1241 tvb_get_ntohs(tvb, offset2+2));
1242 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
1243 "Maximum packet size [M]: %u",
1244 tvb_get_ntohl(tvb, offset2+4));
1245 proto_item_set_text(ti, "SENDER TSPEC: Qualitative");
1249 offset2 += length*4;
1255 case RSVP_CLASS_FLOWSPEC : {
1256 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_flowspec);
1257 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1258 "Length: %u", obj_length);
1259 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1260 "Class number: %u - %s",
1261 class, object_type);
1262 mylen = obj_length - 4;
1264 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1265 "Message format version: %u",
1266 tvb_get_guint8(tvb, offset2)>>4);
1267 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1268 "Data length: %u words, not including header",
1269 tvb_get_ntohs(tvb, offset2+2));
1278 service_num = tvb_get_guint8(tvb, offset2);
1279 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1280 "Service header: %u - %s",
1282 val_to_str(service_num, intsrv_services_str, "Unknown"));
1283 length = tvb_get_ntohs(tvb, offset2+2);
1284 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1285 "Length of service %u data: %u words, "
1286 "not including header",
1293 switch(service_num) {
1295 case QOS_CONTROLLED_LOAD :
1296 case QOS_GUARANTEED :
1297 /* Treat both these the same for now */
1298 param_id = tvb_get_guint8(tvb, offset2);
1299 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1300 "Parameter %u - %s",
1302 val_to_str(param_id, svc_vals, "Unknown"));
1303 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
1304 "Parameter %u flags: %x",
1306 tvb_get_guint8(tvb, offset2+1));
1307 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1308 "Parameter %u data length: %u words, "
1309 "not including header",
1311 tvb_get_ntohs(tvb, offset2+2));
1312 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
1313 "Token bucket rate: %ld",
1314 tvb_ieee_to_long(tvb, offset2+4));
1315 proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 4,
1316 "Token bucket size: %ld",
1317 tvb_ieee_to_long(tvb, offset2+8));
1318 proto_tree_add_text(rsvp_object_tree, tvb, offset2+12, 4,
1319 "Peak data rate: %ld",
1320 tvb_ieee_to_long(tvb, offset2+12));
1321 proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 4,
1322 "Minimum policed unit [m]: %u",
1323 tvb_get_ntohl(tvb, offset2+16));
1324 proto_tree_add_text(rsvp_object_tree, tvb, offset2+20, 4,
1325 "Maximum packet size [M]: %u",
1326 tvb_get_ntohl(tvb, offset2+20));
1328 if (service_num != QOS_GUARANTEED) {
1329 proto_item_set_text(ti, "FLOWSPEC: Controlled-Load, %lu bytes/sec",
1330 tvb_ieee_to_long(tvb, offset2+4));
1334 /* Guaranteed-rate RSpec */
1335 param_id = tvb_get_guint8(tvb, offset2+24);
1336 proto_tree_add_text(rsvp_object_tree, tvb, offset2+24, 1,
1337 "Parameter %u - %s",
1339 val_to_str(param_id, svc_vals, "Unknown"));
1340 proto_tree_add_text(rsvp_object_tree, tvb, offset2+25, 1,
1341 "Parameter %u flags: %x",
1343 tvb_get_guint8(tvb, offset2+25));
1344 proto_tree_add_text(rsvp_object_tree, tvb, offset2+26, 2,
1345 "Parameter %u data length: %u words, "
1346 "not including header",
1348 tvb_get_ntohs(tvb, offset2+26));
1350 proto_tree_add_text(rsvp_object_tree, tvb, offset2+28, 4,
1352 tvb_ieee_to_long(tvb, offset2+28));
1353 proto_tree_add_text(rsvp_object_tree, tvb, offset2+32, 4,
1355 tvb_get_ntohl(tvb, offset2+32));
1356 proto_item_set_text(ti, "FLOWSPEC: Guaranteed-Rate, %lu bytes/sec",
1357 tvb_ieee_to_long(tvb, offset2+4));
1360 case QOS_QUALITATIVE :
1361 param_id = tvb_get_guint8(tvb, offset2);
1362 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1363 "Parameter %u - %s",
1365 val_to_str(param_id, svc_vals, "Unknown"));
1366 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
1367 "Parameter %u flags: %x",
1369 tvb_get_guint8(tvb, offset2+1));
1370 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1371 "Parameter %u data length: %u words, "
1372 "not including header",
1374 tvb_get_ntohs(tvb, offset2+2));
1375 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
1376 "Maximum packet size [M]: %u",
1377 tvb_get_ntohl(tvb, offset2+4));
1379 proto_item_set_text(ti, "FLOWSPEC: Qualitative");
1382 offset2 += length*4;
1388 case RSVP_CLASS_ADSPEC : {
1389 proto_tree *adspec_tree;
1391 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_adspec);
1392 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1393 "Length: %u", obj_length);
1394 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1395 "Class number: %u - %s",
1396 class, object_type);
1397 mylen = obj_length - 4;
1399 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1400 "Message format version: %u",
1401 tvb_get_guint8(tvb, offset2)>>4);
1402 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1403 "Data length: %u words, not including header",
1404 tvb_get_ntohs(tvb, offset2+2));
1413 service_num = tvb_get_guint8(tvb, offset2);
1414 str = val_to_str(service_num, intsrv_services_str, "Unknown");
1415 break_bit = tvb_get_guint8(tvb, offset2+1);
1416 length = tvb_get_ntohs(tvb, offset2+2);
1417 ti = proto_tree_add_text(rsvp_object_tree, tvb, offset2,
1420 adspec_tree = proto_item_add_subtree(ti,
1421 ett_rsvp_adspec_subtree);
1422 proto_tree_add_text(adspec_tree, tvb, offset2, 1,
1423 "Service header %u - %s",
1425 proto_tree_add_text(adspec_tree, tvb, offset2+1, 1,
1427 "Break bit set":"Break bit not set");
1428 proto_tree_add_text(adspec_tree, tvb, offset2+2, 2,
1429 "Data length: %u words, not including header",
1436 guint16 phdr_length;
1438 id = tvb_get_guint8(tvb, offset2);
1439 phdr_length = tvb_get_ntohs(tvb, offset2+2);
1440 str = match_strval(id, adspec_params);
1450 /* 32-bit unsigned integer */
1451 proto_tree_add_text(adspec_tree, tvb, offset2,
1453 "%s - %u (type %u, length %u)",
1455 tvb_get_ntohl(tvb, offset2+4),
1461 proto_tree_add_text(adspec_tree, tvb, offset2,
1463 "%s - %lu (type %u, length %u)",
1465 tvb_ieee_to_long(tvb, offset2+4),
1469 proto_tree_add_text(adspec_tree, tvb, offset2,
1471 "%s (type %u, length %u)",
1476 proto_tree_add_text(adspec_tree, tvb, offset2,
1478 "Unknown (type %u, length %u)",
1481 offset2 += (phdr_length+1)<<2;
1482 i -= (phdr_length+1)<<2;
1483 mylen -= (phdr_length+1)<<2;
1489 case RSVP_CLASS_INTEGRITY :
1490 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_integrity);
1491 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1492 "Length: %u", obj_length);
1493 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1494 "Class number: %u - %s",
1495 class, object_type);
1498 case RSVP_CLASS_POLICY :
1499 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
1500 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1501 "Length: %u", obj_length);
1502 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1503 "Class number: %u - %s",
1504 class, object_type);
1507 case RSVP_CLASS_LABEL_REQUEST :
1508 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_label_request);
1509 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1510 "Length: %u", obj_length);
1511 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1512 "Class number: %u - %s",
1513 class, object_type);
1514 mylen = obj_length - 4;
1517 unsigned short l3pid = tvb_get_ntohs(tvb, offset2+2);
1518 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1520 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1521 "L3PID: %s (0x%04x)",
1522 val_to_str(l3pid, etype_vals, "Unknown"),
1524 proto_item_set_text(ti, "LABEL REQUEST: %s (0x%04x)",
1525 val_to_str(l3pid, etype_vals, "Unknown"),
1531 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1532 "C-type: Unknown (%u)",
1534 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1535 "Data (%d bytes)", mylen);
1541 case RSVP_CLASS_LABEL :
1542 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_label);
1543 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1544 "Length: %u", obj_length);
1545 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1546 "Class number: %u - %s",
1547 class, object_type);
1548 mylen = obj_length - 4;
1551 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1553 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
1555 tvb_get_ntohl(tvb, offset2));
1556 proto_item_set_text(ti, "LABEL: %d",
1557 tvb_get_ntohl(tvb, offset2));
1562 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1563 "C-type: Unknown (%u)",
1565 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1566 "Data (%d bytes)", mylen);
1572 case RSVP_CLASS_SESSION_ATTRIBUTE :
1573 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_session_attribute);
1574 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1575 "Length: %u", obj_length);
1576 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1577 "Class number: %u - %s",
1578 class, object_type);
1579 mylen = obj_length - 4;
1585 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1586 "C-type: 7 - IPv4 LSP");
1587 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1588 "Setup priority: %u",
1589 tvb_get_guint8(tvb, offset2));
1590 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
1591 "Hold priority: %u",
1592 tvb_get_guint8(tvb, offset2+1));
1593 flags = tvb_get_guint8(tvb, offset2+2);
1594 ti2 = proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 1,
1595 "Flags: 0x%02x", flags);
1596 rsvp_sa_flags_tree = proto_item_add_subtree(ti2,
1597 ett_rsvp_session_attribute_flags);
1598 proto_tree_add_text(rsvp_sa_flags_tree, tvb, offset2+2, 1,
1599 decode_boolean_bitfield(flags, 0x01, 8,
1600 "Local protection desired",
1601 "Local protection not desired"));
1602 proto_tree_add_text(rsvp_sa_flags_tree, tvb, offset2+2, 1,
1603 decode_boolean_bitfield(flags, 0x02, 8,
1604 "Merging permitted",
1605 "Merging not permitted"));
1606 proto_tree_add_text(rsvp_sa_flags_tree, tvb, offset2+2, 1,
1607 decode_boolean_bitfield(flags, 0x04, 8,
1608 "Ingress node may reroute",
1609 "Ingress node may not reroute"));
1611 name_len = tvb_get_guint8(tvb, offset2+3);
1612 proto_tree_add_text(rsvp_object_tree, tvb, offset2+3, 1,
1613 "Name length: %u", name_len);
1614 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, name_len,
1617 tvb_get_ptr(tvb, offset2+4, name_len));
1622 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1623 "C-type: Unknown (%u)",
1625 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1626 "Data (%d bytes)", mylen);
1632 case RSVP_CLASS_EXPLICIT_ROUTE :
1633 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_explicit_route);
1634 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1635 "Length: %u", obj_length);
1636 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1637 "Class number: %u - %s",
1638 class, object_type);
1639 mylen = obj_length - 4;
1642 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1644 for (i=1, l = 0; l < mylen; i++) {
1645 j = tvb_get_guint8(tvb, offset2+l) & 0x7f;
1648 k = tvb_get_guint8(tvb, offset2+l) & 0x80;
1649 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1651 "IPv4 Subobject - %s, %s",
1652 ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)),
1653 k ? "Loose" : "Strict");
1655 proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
1656 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1657 k ? "Loose Hop " : "Strict Hop");
1658 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1660 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1662 tvb_get_guint8(tvb, offset2+l+1));
1663 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 4,
1665 ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)));
1666 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+6, 1,
1667 "Prefix length: %u",
1668 tvb_get_guint8(tvb, offset2+l+6));
1672 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1676 proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
1677 k = tvb_get_guint8(tvb, offset2+l) & 0x80;
1678 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1679 k ? "Loose Hop " : "Strict Hop");
1680 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1682 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1684 tvb_get_guint8(tvb, offset2+l+1));
1685 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 16,
1687 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l+2, 16)));
1688 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+18, 1,
1689 "Prefix length: %u",
1690 tvb_get_guint8(tvb, offset2+l+6));
1694 k = tvb_get_ntohs(tvb, offset2+l+2);
1695 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1697 "Autonomous System %u",
1700 proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
1701 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1702 k ? "Loose Hop " : "Strict Hop");
1703 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1704 "Type: 32 (Autonomous System Number)");
1705 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1707 tvb_get_guint8(tvb, offset2+l+1));
1708 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 2,
1709 "Autonomous System %u", k);
1712 case 64: /* Path Term */
1713 k = tvb_get_guint8(tvb, offset2+l) & 0x80;
1714 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1716 "LSP Path Termination");
1718 proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
1719 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1720 k ? "Loose Hop " : "Strict Hop");
1721 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1722 "Type: 64 (MPLS LSP Path Termination)");
1723 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1725 tvb_get_guint8(tvb, offset2+l+1));
1728 default: /* Unknown subobject */
1729 k = tvb_get_guint8(tvb, offset2+l) & 0x80;
1730 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1732 tvb_get_guint8(tvb, offset2+l+1),
1733 "Unknown subobject: %d", j);
1735 proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
1736 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1737 k ? "Loose Hop " : "Strict Hop");
1738 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1739 "Type: %u (Unknown)", j);
1740 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1742 tvb_get_guint8(tvb, offset2+l+1));
1746 l += tvb_get_guint8(tvb, offset2+l+1);
1751 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1752 "C-type: Unknown (%u)",
1754 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1755 "Data (%d bytes)", mylen);
1762 case RSVP_CLASS_RECORD_ROUTE :
1763 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_record_route);
1764 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1765 "Length: %u", obj_length);
1766 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1767 "Class number: %u - %s",
1768 class, object_type);
1769 mylen = obj_length - 4;
1772 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1774 for (i=1, l = 0; l < mylen; i++) {
1775 j = tvb_get_guint8(tvb, offset2+l);
1778 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1780 "IPv4 Subobject - %s",
1781 ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)));
1783 proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj);
1784 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1786 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1788 tvb_get_guint8(tvb, offset2+l+1));
1789 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 4,
1791 ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)));
1792 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+6, 1,
1793 "Prefix length: %u",
1794 tvb_get_guint8(tvb, offset2+l+6));
1798 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1802 proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj);
1803 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1805 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1807 tvb_get_guint8(tvb, offset2+l+1));
1808 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 16,
1810 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l+2, 16)));
1811 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+18, 1,
1812 "Prefix length: %u",
1813 tvb_get_guint8(tvb, offset2+l+6));
1816 default: /* Unknown subobject */
1817 k = tvb_get_guint8(tvb, offset2+l) & 0x80;
1818 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1820 tvb_get_guint8(tvb, offset2+l+1),
1821 "Unknown subobject: %u",
1824 proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj);
1825 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1826 k ? "Loose Hop " : "Strict Hop");
1827 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1828 "Type: %u (Unknown)", j);
1829 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1831 tvb_get_guint8(tvb, offset2+l+1));
1835 l += tvb_get_guint8(tvb, offset2+l+1);
1841 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1842 "C-type: Unknown (%u)",
1844 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1845 "Data (%d bytes)", mylen);
1851 case RSVP_CLASS_MESSAGE_ID :
1852 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
1853 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1854 "Length: %u", obj_length);
1855 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1856 "Class number: %u - %s",
1857 class, object_type);
1860 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1862 proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
1863 "Flags: %d", tvb_get_guint8(tvb, offset+4));
1864 proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
1865 "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
1866 proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
1867 "Message-ID: %d", tvb_get_ntohl(tvb, offset+8));
1868 proto_item_set_text(ti, "MESSAGE-ID: %d %s",
1869 tvb_get_ntohl(tvb, offset+8),
1870 tvb_get_guint8(tvb, offset+4) & 1 ? "(Ack Desired)" : "");
1874 mylen = obj_length - 4;
1875 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1876 "C-type: Unknown (%u)",
1878 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1879 "Data (%d bytes)", mylen);
1884 case RSVP_CLASS_MESSAGE_ID_ACK :
1885 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
1886 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1887 "Length: %u", obj_length);
1888 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1889 "Class number: %u - %s",
1890 class, object_type);
1893 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1895 proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
1896 "Flags: %d", tvb_get_guint8(tvb, offset+4));
1897 proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
1898 "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
1899 proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
1900 "Message-ID: %d", tvb_get_ntohl(tvb, offset+8));
1901 proto_item_set_text(ti, "MESSAGE-ID ACK: %d", tvb_get_ntohl(tvb, offset+8));
1905 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1907 proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
1908 "Flags: %d", tvb_get_guint8(tvb, offset+4));
1909 proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
1910 "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
1911 proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
1912 "Message-ID: %d", tvb_get_ntohl(tvb, offset+8));
1913 proto_item_set_text(ti, "MESSAGE-ID NACK: %d", tvb_get_ntohl(tvb, offset+8));
1917 mylen = obj_length - 4;
1918 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1919 "C-type: Unknown (%u)",
1921 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1922 "Data (%d bytes)", mylen);
1927 case RSVP_CLASS_MESSAGE_ID_LIST :
1928 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
1929 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1930 "Length: %u", obj_length);
1931 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1932 "Class number: %u - %s",
1933 class, object_type);
1936 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1938 proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
1939 "Flags: %d", tvb_get_guint8(tvb, offset+4));
1940 proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
1941 "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
1942 for (mylen = 8; mylen < obj_length; mylen += 4)
1943 proto_tree_add_text(rsvp_object_tree, tvb, offset+mylen, 4,
1944 "Message-ID: %d", tvb_get_ntohl(tvb, offset+mylen));
1945 proto_item_set_text(ti, "MESSAGE-ID LIST: %d IDs",
1946 (obj_length - 8)/4);
1950 mylen = obj_length - 4;
1951 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1952 "C-type: Unknown (%u)",
1954 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1955 "Data (%d bytes)", mylen);
1961 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_unknown_class);
1962 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1963 "Length: %u", obj_length);
1964 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1965 "Class number: %u - %s",
1966 class, object_type);
1968 mylen = obj_length - 4;
1969 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1970 "Data (%d bytes)", mylen);
1973 case RSVP_CLASS_NULL :
1978 offset += obj_length;
1985 proto_register_rsvp(void)
1987 static gint *ett[] = {
1992 &ett_rsvp_time_values,
1997 &ett_rsvp_sender_template,
1998 &ett_rsvp_filter_spec,
1999 &ett_rsvp_sender_tspec,
2002 &ett_rsvp_adspec_subtree,
2003 &ett_rsvp_integrity,
2006 &ett_rsvp_label_request,
2007 &ett_rsvp_session_attribute,
2008 &ett_rsvp_session_attribute_flags,
2009 &ett_rsvp_explicit_route,
2010 &ett_rsvp_explicit_route_subobj,
2011 &ett_rsvp_record_route,
2012 &ett_rsvp_record_route_subobj,
2013 &ett_rsvp_unknown_class,
2016 proto_rsvp = proto_register_protocol("Resource ReserVation Protocol (RSVP)",
2018 proto_register_field_array(proto_rsvp, rsvpf_info, array_length(rsvpf_info));
2019 proto_register_subtree_array(ett, array_length(ett));
2023 proto_reg_handoff_rsvp(void)
2025 dissector_add("ip.proto", IP_PROTO_RSVP, dissect_rsvp, proto_rsvp);