2 * Routines for RSVP packet disassembly
4 * (c) Copyright Ashok Narayanan <ashokn@cisco.com>
6 * $Id: packet-rsvp.c,v 1.47 2001/10/26 18:28:16 gram 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_hello_obj = -1;
100 static gint ett_rsvp_explicit_route = -1;
101 static gint ett_rsvp_explicit_route_subobj = -1;
102 static gint ett_rsvp_record_route = -1;
103 static gint ett_rsvp_record_route_subobj = -1;
104 static gint ett_rsvp_unknown_class = -1;
118 RSVP_MSG_RTEAR_CONFIRM=10,
119 RSVP_MSG_BUNDLE = 12,
121 RSVP_MSG_SREFRESH = 15,
123 } rsvp_message_types;
125 static value_string message_type_vals[] = {
126 {RSVP_MSG_PATH, "PATH Message"},
127 {RSVP_MSG_RESV, "RESV Message"},
128 {RSVP_MSG_PERR, "PATH ERROR Message"},
129 {RSVP_MSG_RERR, "RESV ERROR Message"},
130 {RSVP_MSG_PTEAR, "PATH TEAR Message"},
131 {RSVP_MSG_RTEAR, "RESV TEAR Message"},
132 {RSVP_MSG_CONFIRM, "CONFIRM Message"},
133 {RSVP_MSG_RTEAR_CONFIRM, "RESV TEAR CONFIRM Message"},
134 {RSVP_MSG_BUNDLE, "BUNDLE Message"},
135 {RSVP_MSG_ACK, "ACK Message"},
136 {RSVP_MSG_SREFRESH, "SREFRESH Message"},
137 {RSVP_MSG_HELLO, "HELLO Message"},
144 #define MAX_RSVP_CLASS 15
151 RSVP_CLASS_INTEGRITY,
152 RSVP_CLASS_TIME_VALUES,
157 RSVP_CLASS_FILTER_SPEC,
158 RSVP_CLASS_SENDER_TEMPLATE,
159 RSVP_CLASS_SENDER_TSPEC,
165 RSVP_CLASS_LABEL_REQUEST=19,
166 RSVP_CLASS_EXPLICIT_ROUTE,
167 RSVP_CLASS_RECORD_ROUTE,
169 RSVP_CLASS_MESSAGE_ID = 23,
170 RSVP_CLASS_MESSAGE_ID_ACK,
171 RSVP_CLASS_MESSAGE_ID_LIST,
173 RSVP_CLASS_SESSION_ATTRIBUTE=207,
174 RSVP_CLASS_HELLO = 22
177 static value_string rsvp_class_vals[] = {
178 {RSVP_CLASS_NULL, "NULL object"},
179 {RSVP_CLASS_SESSION, "SESSION object"},
180 {RSVP_CLASS_HOP, "HOP object"},
181 {RSVP_CLASS_INTEGRITY, "INTEGRITY object"},
182 {RSVP_CLASS_TIME_VALUES, "TIME VALUES object"},
183 {RSVP_CLASS_ERROR, "ERROR object"},
184 {RSVP_CLASS_SCOPE, "SCOPE object"},
185 {RSVP_CLASS_STYLE, "STYLE object"},
186 {RSVP_CLASS_FLOWSPEC, "FLOWSPEC object"},
187 {RSVP_CLASS_FILTER_SPEC, "FILTER SPEC object"},
188 {RSVP_CLASS_SENDER_TEMPLATE, "SENDER TEMPLATE object"},
189 {RSVP_CLASS_SENDER_TSPEC, "SENDER TSPEC object"},
190 {RSVP_CLASS_ADSPEC, "ADSPEC object"},
191 {RSVP_CLASS_POLICY, "POLICY object"},
192 {RSVP_CLASS_CONFIRM, "CONFIRM object"},
193 {RSVP_CLASS_LABEL, "LABEL object"},
194 {RSVP_CLASS_LABEL_REQUEST, "LABEL REQUEST object"},
195 {RSVP_CLASS_EXPLICIT_ROUTE, "EXPLICIT ROUTE object"},
196 {RSVP_CLASS_RECORD_ROUTE, "RECORD ROUTE object"},
197 {RSVP_CLASS_SESSION_ATTRIBUTE, "SESSION ATTRIBUTE object"},
198 {RSVP_CLASS_MESSAGE_ID, "MESSAGE-ID object"},
199 {RSVP_CLASS_MESSAGE_ID_ACK, "MESSAGE-ID ACK/NACK object"},
200 {RSVP_CLASS_MESSAGE_ID_LIST, "MESSAGE-ID LIST object"},
201 {RSVP_CLASS_HELLO, "HELLO object"},
208 enum rsvp_error_types {
209 RSVP_ERROR_CONFIRM = 0,
210 RSVP_ERROR_ADMISSION,
213 RSVP_ERROR_NO_SENDER,
214 RSVP_ERROR_CONFLICT_RESV_STYLE,
215 RSVP_ERROR_UNKNOWN_RESV_STYLE,
216 RSVP_ERROR_CONFLICT_DEST_PORTS,
217 RSVP_ERROR_CONFLICT_SRC_PORTS,
218 RSVP_ERROR_PREEMPTED=12,
219 RSVP_ERROR_UNKNOWN_CLASS,
220 RSVP_ERROR_UNKNOWN_C_TYPE,
221 RSVP_ERROR_TRAFFIC = 21,
222 RSVP_ERROR_TRAFFIC_SYSTEM,
228 static value_string rsvp_error_vals[] = {
229 {RSVP_ERROR_CONFIRM, "Confirmation"},
230 {RSVP_ERROR_ADMISSION, "Admission Control Failure "},
231 {RSVP_ERROR_POLICY, "Policy Control Failure"},
232 {RSVP_ERROR_NO_PATH, "No PATH information for this RESV message"},
233 {RSVP_ERROR_NO_SENDER, "No sender information for this RESV message"},
234 {RSVP_ERROR_CONFLICT_RESV_STYLE, "Conflicting reservation styles"},
235 {RSVP_ERROR_UNKNOWN_RESV_STYLE, "Unknown reservation style"},
236 {RSVP_ERROR_CONFLICT_DEST_PORTS, "Conflicting destination ports"},
237 {RSVP_ERROR_CONFLICT_SRC_PORTS, "Conflicting source ports"},
238 {RSVP_ERROR_PREEMPTED, "Service preempted"},
239 {RSVP_ERROR_UNKNOWN_CLASS, "Unknown object class"},
240 {RSVP_ERROR_UNKNOWN_C_TYPE, "Unknown object C-type"},
241 {RSVP_ERROR_TRAFFIC, "Traffic Control Error"},
242 {RSVP_ERROR_TRAFFIC_SYSTEM, "Traffic Control System Error"},
243 {RSVP_ERROR_SYSTEM, "RSVP System Error"},
244 {RSVP_ERROR_ROUTING, "Routing Error"},
245 {RSVP_ERROR_NOTIFY, "RSVP Notify Error"},
250 * Defines the reservation style plus style-specific information that
251 * is not a FLOWSPEC or FILTER_SPEC object, in a RESV message.
253 #define RSVP_DISTINCT (1 << 3)
254 #define RSVP_SHARED (2 << 3)
255 #define RSVP_SHARING_MASK (RSVP_DISTINCT | RSVP_SHARED)
257 #define RSVP_SCOPE_WILD 1
258 #define RSVP_SCOPE_EXPLICIT 2
259 #define RSVP_SCOPE_MASK 0x07
261 #define RSVP_WF (RSVP_SHARED | RSVP_SCOPE_WILD)
262 #define RSVP_FF (RSVP_DISTINCT | RSVP_SCOPE_EXPLICIT)
263 #define RSVP_SE (RSVP_SHARED | RSVP_SCOPE_EXPLICIT)
265 static value_string style_vals[] = {
266 { RSVP_WF, "Wildcard Filter" },
267 { RSVP_FF, "Fixed Filter" },
268 { RSVP_SE, "Shared-Explicit" },
273 * Defines a desired QoS, in a RESV message.
275 enum qos_service_type {
276 QOS_QUALITATIVE = 128, /* Qualitative service */
277 QOS_CONTROLLED_LOAD= 5, /* Controlled Load Service */
278 QOS_GUARANTEED = 2, /* Guaranteed service */
279 QOS_TSPEC = 1 /* Traffic specification */
282 static value_string qos_vals[] = {
283 { QOS_QUALITATIVE, "Qualitative QoS" },
284 { QOS_CONTROLLED_LOAD, "Controlled-load QoS" },
285 { QOS_GUARANTEED, "Guaranteed rate QoS" },
286 { QOS_TSPEC, "Traffic specification" },
290 static value_string svc_vals[] = {
291 { 127, "Token bucket TSpec" },
292 { 128, "Qualitative TSpec" },
293 { 130, "Guaranteed-rate RSpec" },
297 enum rsvp_spec_types { INTSRV = 2 };
299 enum intsrv_services {
303 INTSRV_QUALITATIVE = 128
306 static value_string intsrv_services_str[] = {
307 {INTSRV_GENERAL, "Default General Parameters"},
308 {INTSRV_GTD, "Guaranteed"},
309 {INTSRV_CLOAD, "Controlled Load"},
310 {INTSRV_QUALITATIVE, "Qualitative"},
314 enum intsrv_field_name {
315 INTSRV_NON_IS_HOPS = 1, INTSRV_COMPOSED_NON_IS_HOPS,
316 INTSRV_IS_HOPS, INTSRV_COMPOSED_IS_HOPS,
317 INTSRV_PATH_BANDWIDTH, INTSRV_MIN_PATH_BANDWIDTH,
318 INTSRV_IF_LATENCY, INTSRV_PATH_LATENCY,
319 INTSRV_MTU, INTSRV_COMPOSED_MTU,
321 INTSRV_TOKEN_BUCKET_TSPEC = 127,
322 INTSRV_QUALITATIVE_TSPEC = 128,
323 INTSRV_GTD_RSPEC = 130,
325 INTSRV_DELAY = 131, /* Gtd Parameter C - Max Delay Bound - bytes */
326 INTSRV_MAX_JITTER, /* Gtd Parameter D - Max Jitter */
327 INTSRV_E2E_DELAY, /* Gtd Parameter Ctot */
328 INTSRV_E2E_MAX_JITTER, /* Gtd Parameter Dtot */
329 INTSRV_SHP_DELAY, /* Gtd Parameter Csum */
330 INTSRV_SHP_MAX_JITTER /* Gtd Parameter Dsum */
333 static value_string adspec_params[] = {
335 {6, "Path b/w estimate"},
336 {8, "Minimum path latency"},
337 {10, "Composed MTU"},
338 {133, "End-to-end composed value for C"},
339 {134, "End-to-end composed value for D"},
340 {135, "Since-last-reshaping point composed C"},
341 {136, "Since-last-reshaping point composed D"},
345 /* -------------------- Stuff for MPLS/TE objects -------------------- */
347 static const value_string proto_vals[] = { {IP_PROTO_ICMP, "ICMP"},
348 {IP_PROTO_IGMP, "IGMP"},
349 {IP_PROTO_TCP, "TCP" },
350 {IP_PROTO_UDP, "UDP" },
351 {IP_PROTO_OSPF, "OSPF"},
355 enum rsvp_filter_keys {
358 RSVPF_MSG, /* Message type */
359 /* Shorthand for message types */
376 /* Does the message contain an object of this type? */
378 /* Object present shorthands */
398 RSVPF_EXPLICIT_ROUTE,
402 RSVPF_MESSAGE_ID_ACK,
403 RSVPF_MESSAGE_ID_LIST,
405 RSVPF_SESSION_ATTRIBUTE,
412 RSVPF_SESSION_TUNNEL_ID,
413 RSVPF_SESSION_EXT_TUNNEL_ID,
415 /* Sender template */
424 static int rsvp_filter[RSVPF_MAX];
426 static hf_register_info rsvpf_info[] = {
428 /* Message type number */
429 {&rsvp_filter[RSVPF_MSG],
430 { "Message Type", "rsvp.msg", FT_UINT8, BASE_DEC, VALS(message_type_vals), 0x0,
433 /* Message type shorthands */
434 {&rsvp_filter[RSVPF_PATH],
435 { "Path Message", "rsvp.path", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
438 {&rsvp_filter[RSVPF_HELLO],
439 { "HELLO Message", "rsvp.hello", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
442 {&rsvp_filter[RSVPF_RESV],
443 { "Resv Message", "rsvp.resv", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
446 {&rsvp_filter[RSVPF_PATHERR],
447 { "Path Error Message", "rsvp.perr", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
450 {&rsvp_filter[RSVPF_RESVERR],
451 { "Resv Error Message", "rsvp.rerr", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
454 {&rsvp_filter[RSVPF_PATHTEAR],
455 { "Path Tear Message", "rsvp.ptear", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
458 {&rsvp_filter[RSVPF_RESVTEAR],
459 { "Resv Tear Message", "rsvp.rtear", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
462 {&rsvp_filter[RSVPF_RCONFIRM],
463 { "Resv Confirm Message", "rsvp.resvconf", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
466 {&rsvp_filter[RSVPF_RTEARCONFIRM],
467 { "Resv Tear Confirm Message", "rsvp.rtearconf", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
471 {&rsvp_filter[RSVPF_OBJECT],
472 { "Object class", "rsvp.object", FT_UINT8, BASE_DEC, VALS(rsvp_class_vals), 0x0,
475 /* Object present shorthands */
476 {&rsvp_filter[RSVPF_SESSION],
477 { "SESSION", "rsvp.session", FT_NONE, BASE_NONE, NULL, 0x0,
480 {&rsvp_filter[RSVPF_HOP],
481 { "HOP", "rsvp.hop", FT_NONE, BASE_NONE, NULL, 0x0,
484 {&rsvp_filter[RSVPF_HELLO_OBJ],
485 { "HELLO Request/Ack", "rsvp.hello_obj", FT_NONE, BASE_NONE, NULL, 0x0,
488 {&rsvp_filter[RSVPF_INTEGRITY],
489 { "INTEGRITY", "rsvp.integrity", FT_NONE, BASE_NONE, NULL, 0x0,
492 {&rsvp_filter[RSVPF_TIME_VALUES],
493 { "TIME VALUES", "rsvp.time", FT_NONE, BASE_NONE, NULL, 0x0,
496 {&rsvp_filter[RSVPF_ERROR],
497 { "ERROR", "rsvp.error", FT_NONE, BASE_NONE, NULL, 0x0,
500 {&rsvp_filter[RSVPF_SCOPE],
501 { "SCOPE", "rsvp.scope", FT_NONE, BASE_NONE, NULL, 0x0,
504 {&rsvp_filter[RSVPF_STYLE],
505 { "STYLE", "rsvp.style", FT_NONE, BASE_NONE, NULL, 0x0,
508 {&rsvp_filter[RSVPF_FLOWSPEC],
509 { "FLOWSPEC", "rsvp.flowspec", FT_NONE, BASE_NONE, NULL, 0x0,
512 {&rsvp_filter[RSVPF_FILTER_SPEC],
513 { "FILTERSPEC", "rsvp.filter", FT_NONE, BASE_NONE, NULL, 0x0,
516 {&rsvp_filter[RSVPF_SENDER],
517 { "SENDER TEMPLATE", "rsvp.sender", FT_NONE, BASE_NONE, NULL, 0x0,
520 {&rsvp_filter[RSVPF_TSPEC],
521 { "SENDER TSPEC", "rsvp.tspec", FT_NONE, BASE_NONE, NULL, 0x0,
524 {&rsvp_filter[RSVPF_ADSPEC],
525 { "ADSPEC", "rsvp.adspec", FT_NONE, BASE_NONE, NULL, 0x0,
528 {&rsvp_filter[RSVPF_POLICY],
529 { "POLICY", "rsvp.policy", FT_NONE, BASE_NONE, NULL, 0x0,
532 {&rsvp_filter[RSVPF_CONFIRM],
533 { "CONFIRM", "rsvp.confirm", FT_NONE, BASE_NONE, NULL, 0x0,
536 {&rsvp_filter[RSVPF_LABEL],
537 { "LABEL", "rsvp.label", FT_NONE, BASE_NONE, NULL, 0x0,
540 {&rsvp_filter[RSVPF_LABEL_REQUEST],
541 { "LABEL REQUEST", "rsvp.label_request", FT_NONE, BASE_NONE, NULL, 0x0,
544 {&rsvp_filter[RSVPF_SESSION_ATTRIBUTE],
545 { "SESSION ATTRIBUTE", "rsvp.session_attribute", FT_NONE, BASE_NONE, NULL, 0x0,
548 {&rsvp_filter[RSVPF_EXPLICIT_ROUTE],
549 { "EXPLICIT ROUTE", "rsvp.explicit_route", FT_NONE, BASE_NONE, NULL, 0x0,
552 {&rsvp_filter[RSVPF_RECORD_ROUTE],
553 { "RECORD ROUTE", "rsvp.record_route", FT_NONE, BASE_NONE, NULL, 0x0,
556 {&rsvp_filter[RSVPF_MESSAGE_ID],
557 { "MESSAGE-ID", "rsvp.msgid", FT_NONE, BASE_NONE, NULL, 0x0,
560 {&rsvp_filter[RSVPF_MESSAGE_ID_ACK],
561 { "MESSAGE-ID ACK", "rsvp.ack", FT_NONE, BASE_NONE, NULL, 0x0,
564 {&rsvp_filter[RSVPF_MESSAGE_ID_LIST],
565 { "MESSAGE-ID LIST", "rsvp.msgid_list", FT_NONE, BASE_NONE, NULL, 0x0,
568 {&rsvp_filter[RSVPF_HELLO_OBJ],
569 { "HELLO Message", "rsvp.hello", FT_NONE, BASE_NONE, NULL, 0x0,
572 {&rsvp_filter[RSVPF_UNKNOWN_OBJ],
573 { "Unknown object", "rsvp.obj_unknown", FT_NONE, BASE_NONE, NULL, 0x0,
577 {&rsvp_filter[RSVPF_SESSION_IP],
578 { "Destination address", "rsvp.session.ip", FT_IPv4, BASE_NONE, NULL, 0x0,
581 {&rsvp_filter[RSVPF_SESSION_PORT],
582 { "Port number", "rsvp.session.port", FT_UINT16, BASE_DEC, NULL, 0x0,
585 {&rsvp_filter[RSVPF_SESSION_PROTO],
586 { "Protocol", "rsvp.session.proto", FT_UINT8, BASE_DEC, VALS(proto_vals), 0x0,
589 {&rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
590 { "Tunnel ID", "rsvp.session.tunnel_id", FT_UINT16, BASE_DEC, NULL, 0x0,
593 {&rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
594 { "Extended tunnel ID", "rsvp.session.ext_tunnel_id", FT_UINT32, BASE_DEC, NULL, 0x0,
597 /* Sender template/Filterspec fields */
598 {&rsvp_filter[RSVPF_SENDER_IP],
599 { "Sender IPv4 address", "rsvp.sender.ip", FT_IPv4, BASE_NONE, NULL, 0x0,
602 {&rsvp_filter[RSVPF_SENDER_PORT],
603 { "Sender port number", "rsvp.sender.port", FT_UINT16, BASE_DEC, NULL, 0x0,
606 {&rsvp_filter[RSVPF_SENDER_LSP_ID],
607 { "Sender LSP ID", "rsvp.sender.lsp_id", FT_UINT16, BASE_DEC, NULL, 0x0,
611 static inline int rsvp_class_to_filter_num(int classnum)
614 case RSVP_CLASS_SESSION :
615 case RSVP_CLASS_HOP :
616 case RSVP_CLASS_INTEGRITY :
617 case RSVP_CLASS_TIME_VALUES :
618 case RSVP_CLASS_ERROR :
619 case RSVP_CLASS_SCOPE :
620 case RSVP_CLASS_STYLE :
621 case RSVP_CLASS_FLOWSPEC :
622 case RSVP_CLASS_FILTER_SPEC :
623 case RSVP_CLASS_SENDER_TEMPLATE :
624 case RSVP_CLASS_SENDER_TSPEC :
625 case RSVP_CLASS_ADSPEC :
626 case RSVP_CLASS_POLICY :
627 case RSVP_CLASS_CONFIRM :
628 case RSVP_CLASS_LABEL :
629 case RSVP_CLASS_LABEL_REQUEST :
630 case RSVP_CLASS_EXPLICIT_ROUTE :
631 case RSVP_CLASS_RECORD_ROUTE :
632 case RSVP_CLASS_MESSAGE_ID :
633 case RSVP_CLASS_MESSAGE_ID_ACK :
634 case RSVP_CLASS_MESSAGE_ID_LIST :
635 return classnum + RSVPF_OBJECT;
637 case RSVP_CLASS_HELLO :
638 return RSVPF_HELLO_OBJ;
641 case RSVP_CLASS_SESSION_ATTRIBUTE :
642 return RSVPF_SESSION_ATTRIBUTE;
645 return RSVPF_UNKNOWN_OBJ;
650 dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
653 proto_tree *rsvp_tree = NULL, *ti, *ti2;
654 proto_tree *rsvp_header_tree;
655 proto_tree *rsvp_object_tree;
656 proto_tree *rsvp_sa_flags_tree;
657 proto_tree *rsvp_ero_subtree;
660 guint16 cksum, computed_cksum;
669 if (check_col(pinfo->fd, COL_PROTOCOL))
670 col_set_str(pinfo->fd, COL_PROTOCOL, "RSVP");
671 if (check_col(pinfo->fd, COL_INFO))
672 col_clear(pinfo->fd, COL_INFO);
674 ver_flags = tvb_get_guint8(tvb, offset+0);
675 message_type = tvb_get_guint8(tvb, offset+1);
676 if (check_col(pinfo->fd, COL_INFO)) {
677 col_add_str(pinfo->fd, COL_INFO,
678 val_to_str(message_type, message_type_vals, "Unknown (%u)"));
682 msg_length = tvb_get_ntohs(tvb, offset+6);
683 ti = proto_tree_add_item(tree, proto_rsvp, tvb, offset, msg_length,
685 rsvp_tree = proto_item_add_subtree(ti, ett_rsvp);
687 ti = proto_tree_add_text(rsvp_tree, tvb, offset, 8, "RSVP Header");
688 rsvp_header_tree = proto_item_add_subtree(ti, ett_rsvp_hdr);
690 proto_tree_add_text(rsvp_header_tree, tvb, offset, 1, "RSVP Version: %u",
691 (ver_flags & 0xf0)>>4);
692 proto_tree_add_text(rsvp_header_tree, tvb, offset, 1, "Flags: %02x",
694 proto_tree_add_uint(rsvp_header_tree, rsvp_filter[RSVPF_MSG], tvb,
695 offset+1, 1, message_type);
696 if (message_type <= RSVPF_RTEARCONFIRM &&
697 message_type != RSVPF_JUNK_MSG8 &&
698 message_type != RSVPF_JUNK_MSG9 ) {
699 proto_tree_add_boolean_hidden(rsvp_header_tree, rsvp_filter[RSVPF_MSG + message_type], tvb,
702 cksum = tvb_get_ntohs(tvb, offset+2);
703 if (!pinfo->fragmented && (int) tvb_length(tvb) >= msg_length) {
704 /* The packet isn't part of a fragmented datagram and isn't
705 truncated, so we can checksum it. */
706 cksum_vec[0].ptr = tvb_get_ptr(tvb, 0, msg_length);
707 cksum_vec[0].len = msg_length;
708 computed_cksum = in_cksum(&cksum_vec[0], 1);
709 if (computed_cksum == 0) {
710 proto_tree_add_text(rsvp_header_tree, tvb, offset+2, 2,
711 "Message Checksum: 0x%04x (correct)",
714 proto_tree_add_text(rsvp_header_tree, tvb, offset+2, 2,
715 "Message Checksum: 0x%04x (incorrect, should be 0x%04x)",
717 in_cksum_shouldbe(cksum, computed_cksum));
720 proto_tree_add_text(rsvp_header_tree, tvb, offset+2, 2,
721 "Message Checksum: 0x%04x",
724 proto_tree_add_text(rsvp_header_tree, tvb, offset+4, 1,
726 tvb_get_guint8(tvb, offset+4));
727 proto_tree_add_text(rsvp_header_tree, tvb, offset+6, 2,
728 "Message length: %u", msg_length);
732 while (len < msg_length) {
737 obj_length = tvb_get_ntohs(tvb, offset);
738 class = tvb_get_guint8(tvb, offset+2);
739 type = tvb_get_guint8(tvb, offset+3);
740 object_type = val_to_str(class, rsvp_class_vals, "Unknown");
741 proto_tree_add_uint_hidden(rsvp_tree, rsvp_filter[RSVPF_OBJECT], tvb,
742 offset, obj_length, class);
743 ti = proto_tree_add_item(rsvp_tree, rsvp_filter[rsvp_class_to_filter_num(class)],
744 tvb, offset, obj_length, FALSE);
750 case RSVP_CLASS_SESSION :
751 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_session);
752 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
753 "Length: %u", obj_length);
754 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
755 "Class number: %u - %s",
757 mylen = obj_length - 4;
760 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
762 proto_tree_add_item(rsvp_object_tree,
763 rsvp_filter[RSVPF_SESSION_IP],
764 tvb, offset2, 4, FALSE);
766 proto_tree_add_item(rsvp_object_tree,
767 rsvp_filter[RSVPF_SESSION_PROTO], tvb,
768 offset2+4, 1, FALSE);
769 proto_tree_add_text(rsvp_object_tree, tvb, offset2+5, 1,
771 tvb_get_guint8(tvb, offset2+5));
772 proto_tree_add_item(rsvp_object_tree,
773 rsvp_filter[RSVPF_SESSION_PORT], tvb,
774 offset2+6, 2, FALSE);
775 proto_item_set_text(ti, "SESSION: IPv4, %s, %d, %d",
776 ip_to_str(tvb_get_ptr(tvb, offset2, 4)),
777 tvb_get_guint8(tvb, offset2+4),
778 tvb_get_ntohs(tvb, offset2+6));
783 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
785 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
786 "Destination address: %s",
787 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
788 proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 1,
790 tvb_get_guint8(tvb, offset2+16));
791 proto_tree_add_text(rsvp_object_tree, tvb, offset2+17, 1,
793 tvb_get_guint8(tvb, offset2+17));
794 proto_tree_add_text(rsvp_object_tree, tvb, offset2+18, 2,
795 "Destination port: %u",
796 tvb_get_ntohs(tvb, offset2+18));
801 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
802 "C-type: 7 - IPv4 LSP");
803 proto_tree_add_item(rsvp_object_tree,
804 rsvp_filter[RSVPF_SESSION_IP],
805 tvb, offset2, 4, FALSE);
807 proto_tree_add_item(rsvp_object_tree,
808 rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
809 tvb, offset2+6, 2, FALSE);
811 proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 4,
812 "Extended Tunnel ID: %u (%s)",
813 tvb_get_ntohl(tvb, offset2+8),
814 ip_to_str(tvb_get_ptr(tvb, offset2+8, 4)));
815 proto_tree_add_item_hidden(rsvp_object_tree,
816 rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
817 tvb, offset2+8, 4, FALSE);
818 proto_item_set_text(ti, "SESSION: IPv4-LSP, %s, %d, %0x",
819 ip_to_str(tvb_get_ptr(tvb, offset2, 4)),
820 tvb_get_ntohs(tvb, offset2+6),
821 tvb_get_ntohl(tvb, offset2+8));
826 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
827 "C-type: Unknown (%u)",
829 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
830 "Data (%d bytes)", mylen);
835 case RSVP_CLASS_HOP :
836 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_hop);
837 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
838 "Length: %u", obj_length);
839 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
840 "Class number: %u - %s",
842 mylen = obj_length - 4;
845 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
847 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
848 "Neighbor address: %s",
849 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
850 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
851 "Logical interface: %u",
852 tvb_get_ntohl(tvb, offset2+4));
853 proto_item_set_text(ti, "HOP: IPv4, %s",
854 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
859 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
861 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
862 "Neighbor address: %s",
863 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
864 proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 4,
865 "Logical interface: 0x%08x",
866 tvb_get_ntohl(tvb, offset2+16));
871 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
872 "C-type: Unknown (%u)",
874 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
875 "Data (%d bytes)", mylen);
880 case RSVP_CLASS_TIME_VALUES :
881 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_time_values);
882 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
883 "Length: %u", obj_length);
884 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
885 "Class number: %u - %s",
887 mylen = obj_length - 4;
890 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
892 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
893 "Refresh interval: %u ms (%u seconds)",
894 tvb_get_ntohl(tvb, offset2),
895 tvb_get_ntohl(tvb, offset2)/1000);
896 proto_item_set_text(ti, "TIME VALUES: %d ms",
897 tvb_get_ntohl(tvb, offset2));
902 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
903 "C-type: Unknown (%u)",
905 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
906 "Data (%d bytes)", mylen);
912 case RSVP_CLASS_ERROR :
913 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_error);
914 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
915 "Length: %u", obj_length);
916 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
917 "Class number: %u - %s",
919 mylen = obj_length - 4;
924 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
926 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
928 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
929 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 1,
931 tvb_get_guint8(tvb, offset2+4));
932 error_code = tvb_get_guint8(tvb, offset2+5);
933 proto_tree_add_text(rsvp_object_tree, tvb, offset2+5, 1,
934 "Error code: %u - %s", error_code,
935 val_to_str(error_code, rsvp_error_vals, "Unknown"));
936 proto_tree_add_text(rsvp_object_tree, tvb, offset2+6, 2,
938 tvb_get_ntohs(tvb, offset2+6));
939 proto_item_set_text(ti, "ERROR: IPv4, %d, %d, %s",
940 tvb_get_guint8(tvb, offset2+5),
941 tvb_get_ntohs(tvb, offset2+6),
942 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
949 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
951 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
953 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
954 proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 1,
956 tvb_get_guint8(tvb, offset2+16));
957 error_code = tvb_get_guint8(tvb, offset2+17);
958 proto_tree_add_text(rsvp_object_tree, tvb, offset2+17, 1,
959 "Error code: %u - %s", error_code,
960 val_to_str(error_code, rsvp_error_vals, "Unknown"));
961 proto_tree_add_text(rsvp_object_tree, tvb, offset2+18, 2,
963 tvb_get_ntohs(tvb, offset2+18));
968 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
969 "C-type: Unknown (%u)",
971 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
972 "Data (%d bytes)", mylen);
978 case RSVP_CLASS_SCOPE :
979 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_scope);
980 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
981 "Length: %u", obj_length);
982 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
983 "Class number: %u - %s",
985 mylen = obj_length - 4;
988 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
991 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
993 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
1001 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1002 "C-type: 2 - IPv6");
1004 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
1006 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1014 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1015 "C-type: Unknown (%u)",
1017 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1018 "Data (%d bytes)", mylen);
1023 case RSVP_CLASS_STYLE :
1024 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_style);
1025 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1026 "Length: %u", obj_length);
1027 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1028 "Class number: %u - %s",
1029 class, object_type);
1030 mylen = obj_length - 4;
1035 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1037 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1039 tvb_get_guint8(tvb, offset2));
1040 style = tvb_get_ntoh24(tvb, offset2+1);
1041 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1,
1042 3, "Style: 0x%06X - %s", style,
1043 val_to_str(style, style_vals, "Unknown"));
1044 proto_item_set_text(ti, "STYLE: %s (%d)",
1045 val_to_str(style, style_vals, "Unknown"),
1051 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1052 "C-type: Unknown (%u)",
1054 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1055 "Data (%d bytes)", mylen);
1061 case RSVP_CLASS_CONFIRM :
1062 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_confirm);
1063 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1064 "Length: %u", obj_length);
1065 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1066 "Class number: %u - %s",
1067 class, object_type);
1068 mylen = obj_length - 4;
1071 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1072 "C-type: 1 - IPv4");
1073 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
1074 "Receiver address: %s",
1075 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
1076 proto_item_set_text(ti, "CONFIRM: %s",
1077 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
1082 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1083 "C-type: 2 - IPv6");
1084 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
1085 "Receiver address: %s",
1086 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1091 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1092 "C-type: Unknown (%u)",
1094 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1095 "Data (%d bytes)", mylen);
1100 case RSVP_CLASS_SENDER_TEMPLATE :
1101 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_sender_template);
1102 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1103 "Length: %u", obj_length);
1104 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1105 "Class number: %u - %s",
1106 class, object_type);
1107 objtype = "SENDER TEMPLATE";
1108 goto common_template;
1109 case RSVP_CLASS_FILTER_SPEC :
1110 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_filter_spec);
1111 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1112 "Length: %u", obj_length);
1113 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1114 "Class number: %u - %s",
1115 class, object_type);
1116 objtype = "FILTERSPEC";
1118 mylen = obj_length - 4;
1121 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1122 "C-type: 1 - IPv4");
1123 proto_tree_add_item(rsvp_object_tree,
1124 rsvp_filter[RSVPF_SENDER_IP],
1125 tvb, offset2, 4, FALSE);
1126 proto_tree_add_item(rsvp_object_tree,
1127 rsvp_filter[RSVPF_SENDER_PORT],
1128 tvb, offset2+6, 2, FALSE);
1129 proto_item_set_text(ti, "%s: IPv4, %s, %d", objtype,
1130 ip_to_str(tvb_get_ptr(tvb, offset2, 4)),
1131 tvb_get_ntohs(tvb, offset2+6));
1136 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1137 "C-type: 2 - IPv6");
1138 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
1139 "Source address: %s",
1140 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1141 proto_tree_add_text(rsvp_object_tree, tvb, offset2+18, 2,
1143 tvb_get_ntohs(tvb, offset2+18));
1148 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1149 "C-type: 7 - IPv4 LSP");
1150 proto_tree_add_item(rsvp_object_tree,
1151 rsvp_filter[RSVPF_SENDER_IP],
1152 tvb, offset2, 4, FALSE);
1153 proto_tree_add_item(rsvp_object_tree,
1154 rsvp_filter[RSVPF_SENDER_LSP_ID],
1155 tvb, offset2+6, 2, FALSE);
1156 proto_item_set_text(ti, "%s: IPv4-LSP, %s, %d", objtype,
1157 ip_to_str(tvb_get_ptr(tvb, offset2, 4)),
1158 tvb_get_ntohs(tvb, offset2+6));
1163 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1164 "C-type: Unknown (%u)",
1166 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1167 "Data (%d bytes)", mylen);
1172 case RSVP_CLASS_SENDER_TSPEC : {
1173 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_sender_tspec);
1174 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1175 "Length: %u", obj_length);
1176 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1177 "Class number: %u - %s",
1178 class, object_type);
1179 mylen = obj_length - 4;
1181 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1182 "Message format version: %u",
1183 tvb_get_guint8(tvb, offset2)>>4);
1184 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1185 "Data length: %u words, not including header",
1186 tvb_get_ntohs(tvb, offset2+2));
1195 service_num = tvb_get_guint8(tvb, offset2);
1196 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1197 "Service header: %u - %s",
1199 val_to_str(service_num, qos_vals, "Unknown"));
1200 length = tvb_get_ntohs(tvb, offset2+2);
1201 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1202 "Length of service %u data: %u words, "
1203 "not including header",
1204 service_num, length);
1209 switch(service_num) {
1212 /* Token bucket TSPEC */
1213 param_id = tvb_get_guint8(tvb, offset2);
1214 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1215 "Parameter %u - %s",
1217 val_to_str(param_id, svc_vals, "Unknown"));
1218 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
1219 "Parameter %u flags: 0x%02x",
1221 tvb_get_guint8(tvb, offset2+1));
1222 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1223 "Parameter %u data length: %u words, "
1224 "not including header",
1226 tvb_get_ntohs(tvb, offset2+2));
1227 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
1228 "Token bucket rate: %ld",
1229 tvb_ieee_to_long(tvb, offset2+4));
1230 proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 4,
1231 "Token bucket size: %ld",
1232 tvb_ieee_to_long(tvb, offset2+8));
1233 proto_tree_add_text(rsvp_object_tree, tvb, offset2+12, 4,
1234 "Peak data rate: %ld",
1235 tvb_ieee_to_long(tvb, offset2+12));
1236 proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 4,
1237 "Minimum policed unit [m]: %u",
1238 tvb_get_ntohl(tvb, offset2+16));
1239 proto_tree_add_text(rsvp_object_tree, tvb, offset2+20, 4,
1240 "Maximum packet size [M]: %u",
1241 tvb_get_ntohl(tvb, offset2+20));
1242 proto_item_set_text(ti, "SENDER TSPEC: IntServ, %lu bytes/sec",
1243 tvb_ieee_to_long(tvb, offset2+4));
1246 case QOS_QUALITATIVE :
1247 /* Token bucket TSPEC */
1248 param_id = tvb_get_guint8(tvb, offset2);
1249 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1250 "Parameter %u - %s",
1252 val_to_str(param_id, svc_vals, "Unknown"));
1253 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
1254 "Parameter %u flags: %x",
1256 tvb_get_guint8(tvb, offset2+1));
1257 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1258 "Parameter %u data length: %u words, "
1259 "not including header",
1261 tvb_get_ntohs(tvb, offset2+2));
1262 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
1263 "Maximum packet size [M]: %u",
1264 tvb_get_ntohl(tvb, offset2+4));
1265 proto_item_set_text(ti, "SENDER TSPEC: Qualitative");
1269 offset2 += length*4;
1275 case RSVP_CLASS_FLOWSPEC : {
1276 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_flowspec);
1277 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1278 "Length: %u", obj_length);
1279 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1280 "Class number: %u - %s",
1281 class, object_type);
1282 mylen = obj_length - 4;
1284 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1285 "Message format version: %u",
1286 tvb_get_guint8(tvb, offset2)>>4);
1287 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1288 "Data length: %u words, not including header",
1289 tvb_get_ntohs(tvb, offset2+2));
1298 service_num = tvb_get_guint8(tvb, offset2);
1299 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1300 "Service header: %u - %s",
1302 val_to_str(service_num, intsrv_services_str, "Unknown"));
1303 length = tvb_get_ntohs(tvb, offset2+2);
1304 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1305 "Length of service %u data: %u words, "
1306 "not including header",
1313 switch(service_num) {
1315 case QOS_CONTROLLED_LOAD :
1316 case QOS_GUARANTEED :
1317 /* Treat both these the same for now */
1318 param_id = tvb_get_guint8(tvb, offset2);
1319 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1320 "Parameter %u - %s",
1322 val_to_str(param_id, svc_vals, "Unknown"));
1323 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
1324 "Parameter %u flags: %x",
1326 tvb_get_guint8(tvb, offset2+1));
1327 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1328 "Parameter %u data length: %u words, "
1329 "not including header",
1331 tvb_get_ntohs(tvb, offset2+2));
1332 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
1333 "Token bucket rate: %ld",
1334 tvb_ieee_to_long(tvb, offset2+4));
1335 proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 4,
1336 "Token bucket size: %ld",
1337 tvb_ieee_to_long(tvb, offset2+8));
1338 proto_tree_add_text(rsvp_object_tree, tvb, offset2+12, 4,
1339 "Peak data rate: %ld",
1340 tvb_ieee_to_long(tvb, offset2+12));
1341 proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 4,
1342 "Minimum policed unit [m]: %u",
1343 tvb_get_ntohl(tvb, offset2+16));
1344 proto_tree_add_text(rsvp_object_tree, tvb, offset2+20, 4,
1345 "Maximum packet size [M]: %u",
1346 tvb_get_ntohl(tvb, offset2+20));
1348 if (service_num != QOS_GUARANTEED) {
1349 proto_item_set_text(ti, "FLOWSPEC: Controlled-Load, %lu bytes/sec",
1350 tvb_ieee_to_long(tvb, offset2+4));
1354 /* Guaranteed-rate RSpec */
1355 param_id = tvb_get_guint8(tvb, offset2+24);
1356 proto_tree_add_text(rsvp_object_tree, tvb, offset2+24, 1,
1357 "Parameter %u - %s",
1359 val_to_str(param_id, svc_vals, "Unknown"));
1360 proto_tree_add_text(rsvp_object_tree, tvb, offset2+25, 1,
1361 "Parameter %u flags: %x",
1363 tvb_get_guint8(tvb, offset2+25));
1364 proto_tree_add_text(rsvp_object_tree, tvb, offset2+26, 2,
1365 "Parameter %u data length: %u words, "
1366 "not including header",
1368 tvb_get_ntohs(tvb, offset2+26));
1370 proto_tree_add_text(rsvp_object_tree, tvb, offset2+28, 4,
1372 tvb_ieee_to_long(tvb, offset2+28));
1373 proto_tree_add_text(rsvp_object_tree, tvb, offset2+32, 4,
1375 tvb_get_ntohl(tvb, offset2+32));
1376 proto_item_set_text(ti, "FLOWSPEC: Guaranteed-Rate, %lu bytes/sec",
1377 tvb_ieee_to_long(tvb, offset2+4));
1380 case QOS_QUALITATIVE :
1381 param_id = tvb_get_guint8(tvb, offset2);
1382 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1383 "Parameter %u - %s",
1385 val_to_str(param_id, svc_vals, "Unknown"));
1386 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
1387 "Parameter %u flags: %x",
1389 tvb_get_guint8(tvb, offset2+1));
1390 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1391 "Parameter %u data length: %u words, "
1392 "not including header",
1394 tvb_get_ntohs(tvb, offset2+2));
1395 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
1396 "Maximum packet size [M]: %u",
1397 tvb_get_ntohl(tvb, offset2+4));
1399 proto_item_set_text(ti, "FLOWSPEC: Qualitative");
1402 offset2 += length*4;
1408 case RSVP_CLASS_ADSPEC : {
1409 proto_tree *adspec_tree;
1411 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_adspec);
1412 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1413 "Length: %u", obj_length);
1414 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1415 "Class number: %u - %s",
1416 class, object_type);
1417 mylen = obj_length - 4;
1419 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1420 "Message format version: %u",
1421 tvb_get_guint8(tvb, offset2)>>4);
1422 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1423 "Data length: %u words, not including header",
1424 tvb_get_ntohs(tvb, offset2+2));
1433 service_num = tvb_get_guint8(tvb, offset2);
1434 str = val_to_str(service_num, intsrv_services_str, "Unknown");
1435 break_bit = tvb_get_guint8(tvb, offset2+1);
1436 length = tvb_get_ntohs(tvb, offset2+2);
1437 ti = proto_tree_add_text(rsvp_object_tree, tvb, offset2,
1440 adspec_tree = proto_item_add_subtree(ti,
1441 ett_rsvp_adspec_subtree);
1442 proto_tree_add_text(adspec_tree, tvb, offset2, 1,
1443 "Service header %u - %s",
1445 proto_tree_add_text(adspec_tree, tvb, offset2+1, 1,
1447 "Break bit set":"Break bit not set");
1448 proto_tree_add_text(adspec_tree, tvb, offset2+2, 2,
1449 "Data length: %u words, not including header",
1456 guint16 phdr_length;
1458 id = tvb_get_guint8(tvb, offset2);
1459 phdr_length = tvb_get_ntohs(tvb, offset2+2);
1460 str = match_strval(id, adspec_params);
1470 /* 32-bit unsigned integer */
1471 proto_tree_add_text(adspec_tree, tvb, offset2,
1473 "%s - %u (type %u, length %u)",
1475 tvb_get_ntohl(tvb, offset2+4),
1481 proto_tree_add_text(adspec_tree, tvb, offset2,
1483 "%s - %lu (type %u, length %u)",
1485 tvb_ieee_to_long(tvb, offset2+4),
1489 proto_tree_add_text(adspec_tree, tvb, offset2,
1491 "%s (type %u, length %u)",
1496 proto_tree_add_text(adspec_tree, tvb, offset2,
1498 "Unknown (type %u, length %u)",
1501 offset2 += (phdr_length+1)<<2;
1502 i -= (phdr_length+1)<<2;
1503 mylen -= (phdr_length+1)<<2;
1509 case RSVP_CLASS_INTEGRITY :
1510 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_integrity);
1511 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1512 "Length: %u", obj_length);
1513 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1514 "Class number: %u - %s",
1515 class, object_type);
1518 case RSVP_CLASS_POLICY :
1519 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
1520 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1521 "Length: %u", obj_length);
1522 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1523 "Class number: %u - %s",
1524 class, object_type);
1527 case RSVP_CLASS_LABEL_REQUEST :
1528 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_label_request);
1529 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1530 "Length: %u", obj_length);
1531 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1532 "Class number: %u - %s",
1533 class, object_type);
1534 mylen = obj_length - 4;
1537 unsigned short l3pid = tvb_get_ntohs(tvb, offset2+2);
1538 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1540 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1541 "L3PID: %s (0x%04x)",
1542 val_to_str(l3pid, etype_vals, "Unknown"),
1544 proto_item_set_text(ti, "LABEL REQUEST: %s (0x%04x)",
1545 val_to_str(l3pid, etype_vals, "Unknown"),
1551 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1552 "C-type: Unknown (%u)",
1554 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1555 "Data (%d bytes)", mylen);
1561 case RSVP_CLASS_LABEL :
1562 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_label);
1563 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1564 "Length: %u", obj_length);
1565 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1566 "Class number: %u - %s",
1567 class, object_type);
1568 mylen = obj_length - 4;
1571 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1573 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
1575 tvb_get_ntohl(tvb, offset2));
1576 proto_item_set_text(ti, "LABEL: %d",
1577 tvb_get_ntohl(tvb, offset2));
1582 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1583 "C-type: Unknown (%u)",
1585 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1586 "Data (%d bytes)", mylen);
1592 case RSVP_CLASS_SESSION_ATTRIBUTE :
1593 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_session_attribute);
1594 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1595 "Length: %u", obj_length);
1596 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1597 "Class number: %u - %s",
1598 class, object_type);
1599 mylen = obj_length - 4;
1605 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1606 "C-type: 7 - IPv4 LSP");
1607 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1608 "Setup priority: %u",
1609 tvb_get_guint8(tvb, offset2));
1610 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
1611 "Hold priority: %u",
1612 tvb_get_guint8(tvb, offset2+1));
1613 flags = tvb_get_guint8(tvb, offset2+2);
1614 ti2 = proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 1,
1615 "Flags: 0x%02x", flags);
1616 rsvp_sa_flags_tree = proto_item_add_subtree(ti2,
1617 ett_rsvp_session_attribute_flags);
1618 proto_tree_add_text(rsvp_sa_flags_tree, tvb, offset2+2, 1,
1619 decode_boolean_bitfield(flags, 0x01, 8,
1620 "Local protection desired",
1621 "Local protection not desired"));
1622 proto_tree_add_text(rsvp_sa_flags_tree, tvb, offset2+2, 1,
1623 decode_boolean_bitfield(flags, 0x02, 8,
1624 "Merging permitted",
1625 "Merging not permitted"));
1626 proto_tree_add_text(rsvp_sa_flags_tree, tvb, offset2+2, 1,
1627 decode_boolean_bitfield(flags, 0x04, 8,
1628 "Ingress node may reroute",
1629 "Ingress node may not reroute"));
1631 name_len = tvb_get_guint8(tvb, offset2+3);
1632 proto_tree_add_text(rsvp_object_tree, tvb, offset2+3, 1,
1633 "Name length: %u", name_len);
1634 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, name_len,
1637 tvb_get_ptr(tvb, offset2+4, name_len));
1642 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1643 "C-type: Unknown (%u)",
1645 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1646 "Data (%d bytes)", mylen);
1652 case RSVP_CLASS_EXPLICIT_ROUTE :
1653 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_explicit_route);
1654 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1655 "Length: %u", obj_length);
1656 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1657 "Class number: %u - %s",
1658 class, object_type);
1659 mylen = obj_length - 4;
1662 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1664 for (i=1, l = 0; l < mylen; i++) {
1665 j = tvb_get_guint8(tvb, offset2+l) & 0x7f;
1668 k = tvb_get_guint8(tvb, offset2+l) & 0x80;
1669 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1671 "IPv4 Subobject - %s, %s",
1672 ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)),
1673 k ? "Loose" : "Strict");
1675 proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
1676 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1677 k ? "Loose Hop " : "Strict Hop");
1678 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1680 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1682 tvb_get_guint8(tvb, offset2+l+1));
1683 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 4,
1685 ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)));
1686 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+6, 1,
1687 "Prefix length: %u",
1688 tvb_get_guint8(tvb, offset2+l+6));
1692 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1696 proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
1697 k = tvb_get_guint8(tvb, offset2+l) & 0x80;
1698 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1699 k ? "Loose Hop " : "Strict Hop");
1700 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1702 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1704 tvb_get_guint8(tvb, offset2+l+1));
1705 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 16,
1707 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l+2, 16)));
1708 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+18, 1,
1709 "Prefix length: %u",
1710 tvb_get_guint8(tvb, offset2+l+6));
1714 k = tvb_get_ntohs(tvb, offset2+l+2);
1715 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1717 "Autonomous System %u",
1720 proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
1721 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1722 k ? "Loose Hop " : "Strict Hop");
1723 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1724 "Type: 32 (Autonomous System Number)");
1725 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1727 tvb_get_guint8(tvb, offset2+l+1));
1728 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 2,
1729 "Autonomous System %u", k);
1732 case 64: /* Path Term */
1733 k = tvb_get_guint8(tvb, offset2+l) & 0x80;
1734 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1736 "LSP Path Termination");
1738 proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
1739 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1740 k ? "Loose Hop " : "Strict Hop");
1741 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1742 "Type: 64 (MPLS LSP Path Termination)");
1743 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1745 tvb_get_guint8(tvb, offset2+l+1));
1748 default: /* Unknown subobject */
1749 k = tvb_get_guint8(tvb, offset2+l) & 0x80;
1750 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1752 tvb_get_guint8(tvb, offset2+l+1),
1753 "Unknown subobject: %d", j);
1755 proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
1756 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1757 k ? "Loose Hop " : "Strict Hop");
1758 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1759 "Type: %u (Unknown)", j);
1760 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1762 tvb_get_guint8(tvb, offset2+l+1));
1766 l += tvb_get_guint8(tvb, offset2+l+1);
1771 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1772 "C-type: Unknown (%u)",
1774 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1775 "Data (%d bytes)", mylen);
1782 case RSVP_CLASS_RECORD_ROUTE :
1783 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_record_route);
1784 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1785 "Length: %u", obj_length);
1786 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1787 "Class number: %u - %s",
1788 class, object_type);
1789 mylen = obj_length - 4;
1792 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1794 for (i=1, l = 0; l < mylen; i++) {
1795 j = tvb_get_guint8(tvb, offset2+l);
1798 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1800 "IPv4 Subobject - %s",
1801 ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)));
1803 proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj);
1804 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1806 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1808 tvb_get_guint8(tvb, offset2+l+1));
1809 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 4,
1811 ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)));
1812 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+6, 1,
1813 "Prefix length: %u",
1814 tvb_get_guint8(tvb, offset2+l+6));
1818 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1822 proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj);
1823 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1825 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1827 tvb_get_guint8(tvb, offset2+l+1));
1828 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 16,
1830 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l+2, 16)));
1831 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+18, 1,
1832 "Prefix length: %u",
1833 tvb_get_guint8(tvb, offset2+l+6));
1836 default: /* Unknown subobject */
1837 k = tvb_get_guint8(tvb, offset2+l) & 0x80;
1838 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1840 tvb_get_guint8(tvb, offset2+l+1),
1841 "Unknown subobject: %u",
1844 proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj);
1845 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1846 k ? "Loose Hop " : "Strict Hop");
1847 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1848 "Type: %u (Unknown)", j);
1849 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1851 tvb_get_guint8(tvb, offset2+l+1));
1855 l += tvb_get_guint8(tvb, offset2+l+1);
1861 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1862 "C-type: Unknown (%u)",
1864 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1865 "Data (%d bytes)", mylen);
1871 case RSVP_CLASS_MESSAGE_ID :
1872 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
1873 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1874 "Length: %u", obj_length);
1875 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1876 "Class number: %u - %s",
1877 class, object_type);
1880 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1882 proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
1883 "Flags: %d", tvb_get_guint8(tvb, offset+4));
1884 proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
1885 "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
1886 proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
1887 "Message-ID: %d", tvb_get_ntohl(tvb, offset+8));
1888 proto_item_set_text(ti, "MESSAGE-ID: %d %s",
1889 tvb_get_ntohl(tvb, offset+8),
1890 tvb_get_guint8(tvb, offset+4) & 1 ? "(Ack Desired)" : "");
1894 mylen = obj_length - 4;
1895 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1896 "C-type: Unknown (%u)",
1898 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1899 "Data (%d bytes)", mylen);
1904 case RSVP_CLASS_MESSAGE_ID_ACK :
1905 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
1906 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1907 "Length: %u", obj_length);
1908 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1909 "Class number: %u - %s",
1910 class, object_type);
1913 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1915 proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
1916 "Flags: %d", tvb_get_guint8(tvb, offset+4));
1917 proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
1918 "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
1919 proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
1920 "Message-ID: %d", tvb_get_ntohl(tvb, offset+8));
1921 proto_item_set_text(ti, "MESSAGE-ID ACK: %d", tvb_get_ntohl(tvb, offset+8));
1925 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1927 proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
1928 "Flags: %d", tvb_get_guint8(tvb, offset+4));
1929 proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
1930 "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
1931 proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
1932 "Message-ID: %d", tvb_get_ntohl(tvb, offset+8));
1933 proto_item_set_text(ti, "MESSAGE-ID NACK: %d", tvb_get_ntohl(tvb, offset+8));
1937 mylen = obj_length - 4;
1938 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1939 "C-type: Unknown (%u)",
1941 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1942 "Data (%d bytes)", mylen);
1947 case RSVP_CLASS_MESSAGE_ID_LIST :
1948 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
1949 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1950 "Length: %u", obj_length);
1951 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1952 "Class number: %u - %s",
1953 class, object_type);
1956 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1958 proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 1,
1959 "Flags: %d", tvb_get_guint8(tvb, offset+4));
1960 proto_tree_add_text(rsvp_object_tree, tvb, offset+5, 3,
1961 "Epoch: %d", tvb_get_ntoh24(tvb, offset+5));
1962 for (mylen = 8; mylen < obj_length; mylen += 4)
1963 proto_tree_add_text(rsvp_object_tree, tvb, offset+mylen, 4,
1964 "Message-ID: %d", tvb_get_ntohl(tvb, offset+mylen));
1965 proto_item_set_text(ti, "MESSAGE-ID LIST: %d IDs",
1966 (obj_length - 8)/4);
1970 mylen = obj_length - 4;
1971 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1972 "C-type: Unknown (%u)",
1974 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1975 "Data (%d bytes)", mylen);
1980 case RSVP_CLASS_HELLO:
1981 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_hello_obj);
1982 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1983 "Length: %u", obj_length);
1984 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1985 "Class number: %u - %s",
1986 class, object_type);
1989 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1990 "C-Type: 1 - HELLO REQUEST object");
1993 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1994 "C-Type: 2 - HELLO ACK object");
1998 proto_tree_add_text(rsvp_object_tree, tvb, offset+4, 4,
1999 "Source Instance: 0x%x",tvb_get_ntohl(tvb, offset+4));
2001 proto_tree_add_text(rsvp_object_tree, tvb, offset+8, 4,
2002 "Destination Instance: 0x%x",tvb_get_ntohl(tvb, offset+8));
2007 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_unknown_class);
2008 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
2009 "Length: %u", obj_length);
2010 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
2011 "Class number: %u - %s",
2012 class, object_type);
2014 mylen = obj_length - 4;
2015 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
2016 "Data (%d bytes)", mylen);
2019 case RSVP_CLASS_NULL :
2024 offset += obj_length;
2031 proto_register_rsvp(void)
2033 static gint *ett[] = {
2038 &ett_rsvp_time_values,
2043 &ett_rsvp_sender_template,
2044 &ett_rsvp_filter_spec,
2045 &ett_rsvp_sender_tspec,
2048 &ett_rsvp_adspec_subtree,
2049 &ett_rsvp_integrity,
2052 &ett_rsvp_label_request,
2053 &ett_rsvp_session_attribute,
2054 &ett_rsvp_session_attribute_flags,
2055 &ett_rsvp_explicit_route,
2056 &ett_rsvp_explicit_route_subobj,
2057 &ett_rsvp_record_route,
2058 &ett_rsvp_record_route_subobj,
2059 &ett_rsvp_hello_obj,
2060 &ett_rsvp_unknown_class,
2063 proto_rsvp = proto_register_protocol("Resource ReserVation Protocol (RSVP)",
2065 proto_register_field_array(proto_rsvp, rsvpf_info, array_length(rsvpf_info));
2066 proto_register_subtree_array(ett, array_length(ett));
2070 proto_reg_handoff_rsvp(void)
2072 dissector_add("ip.proto", IP_PROTO_RSVP, dissect_rsvp, proto_rsvp);