2 * Routines for RSVP packet disassembly
4 * (c) Copyright Ashok Narayanan <ashokn@cisco.com>
6 * $Id: packet-rsvp.c,v 1.37 2001/04/19 22:55:31 guy Exp $
8 * Ethereal - Network traffic analyzer
9 * By Gerald Combs <gerald@zing.org>
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 "packet-ip.h"
73 #include "packet-ipv6.h"
74 #include "ieee-float.h"
77 static int proto_rsvp = -1;
79 static gint ett_rsvp = -1;
80 static gint ett_rsvp_hdr = -1;
81 static gint ett_rsvp_session = -1;
82 static gint ett_rsvp_hop = -1;
83 static gint ett_rsvp_time_values = -1;
84 static gint ett_rsvp_error = -1;
85 static gint ett_rsvp_scope = -1;
86 static gint ett_rsvp_style = -1;
87 static gint ett_rsvp_confirm = -1;
88 static gint ett_rsvp_sender_template = -1;
89 static gint ett_rsvp_filter_spec = -1;
90 static gint ett_rsvp_sender_tspec = -1;
91 static gint ett_rsvp_flowspec = -1;
92 static gint ett_rsvp_adspec = -1;
93 static gint ett_rsvp_adspec_subtree = -1;
94 static gint ett_rsvp_integrity = -1;
95 static gint ett_rsvp_policy = -1;
96 static gint ett_rsvp_label = -1;
97 static gint ett_rsvp_label_request = -1;
98 static gint ett_rsvp_session_attribute = -1;
99 static gint ett_rsvp_session_attribute_flags = -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;
111 RSVP_MSG_PATH=1, RSVP_MSG_RESV, RSVP_MSG_PERR, RSVP_MSG_RERR,
112 RSVP_MSG_PTEAR, RSVP_MSG_RTEAR, RSVP_MSG_CONFIRM,
113 RSVP_MSG_RTEAR_CONFIRM=10
114 } rsvp_message_types;
116 static value_string message_type_vals[] = {
117 {RSVP_MSG_PATH, "PATH Message"},
118 {RSVP_MSG_RESV, "RESV Message"},
119 {RSVP_MSG_PERR, "PATH ERROR Message"},
120 {RSVP_MSG_RERR, "RESV ERROR Message"},
121 {RSVP_MSG_PTEAR, "PATH TEAR Message"},
122 {RSVP_MSG_RTEAR, "RESV TEAR Message"},
123 {RSVP_MSG_CONFIRM, "CONFIRM Message"},
124 {RSVP_MSG_RTEAR_CONFIRM, "RESV TEAR CONFIRM Message"},
131 #define MAX_RSVP_CLASS 15
138 RSVP_CLASS_INTEGRITY,
139 RSVP_CLASS_TIME_VALUES,
144 RSVP_CLASS_FILTER_SPEC,
145 RSVP_CLASS_SENDER_TEMPLATE,
146 RSVP_CLASS_SENDER_TSPEC,
152 RSVP_CLASS_LABEL_REQUEST=19,
153 RSVP_CLASS_EXPLICIT_ROUTE,
154 RSVP_CLASS_RECORD_ROUTE,
156 RSVP_CLASS_SESSION_ATTRIBUTE=207,
159 static value_string rsvp_class_vals[] = {
160 {RSVP_CLASS_NULL, "NULL object"},
161 {RSVP_CLASS_SESSION, "SESSION object"},
162 {RSVP_CLASS_HOP, "HOP object"},
163 {RSVP_CLASS_INTEGRITY, "INTEGRITY object"},
164 {RSVP_CLASS_TIME_VALUES, "TIME VALUES object"},
165 {RSVP_CLASS_ERROR, "ERROR object"},
166 {RSVP_CLASS_SCOPE, "SCOPE object"},
167 {RSVP_CLASS_STYLE, "STYLE object"},
168 {RSVP_CLASS_FLOWSPEC, "FLOWSPEC object"},
169 {RSVP_CLASS_FILTER_SPEC, "FILTER SPEC object"},
170 {RSVP_CLASS_SENDER_TEMPLATE, "SENDER TEMPLATE object"},
171 {RSVP_CLASS_SENDER_TSPEC, "SENDER TSPEC object"},
172 {RSVP_CLASS_ADSPEC, "ADSPEC object"},
173 {RSVP_CLASS_POLICY, "POLICY object"},
174 {RSVP_CLASS_CONFIRM, "CONFIRM object"},
175 {RSVP_CLASS_LABEL, "LABEL object"},
176 {RSVP_CLASS_LABEL_REQUEST, "LABEL REQUEST object"},
177 {RSVP_CLASS_EXPLICIT_ROUTE, "EXPLICIT ROUTE object"},
178 {RSVP_CLASS_RECORD_ROUTE, "RECORD ROUTE object"},
179 {RSVP_CLASS_SESSION_ATTRIBUTE, "SESSION ATTRIBUTE object"},
186 enum rsvp_error_types {
187 RSVP_ERROR_CONFIRM = 0,
188 RSVP_ERROR_ADMISSION,
191 RSVP_ERROR_NO_SENDER,
192 RSVP_ERROR_CONFLICT_RESV_STYLE,
193 RSVP_ERROR_UNKNOWN_RESV_STYLE,
194 RSVP_ERROR_CONFLICT_DEST_PORTS,
195 RSVP_ERROR_CONFLICT_SRC_PORTS,
196 RSVP_ERROR_PREEMPTED=12,
197 RSVP_ERROR_UNKNOWN_CLASS,
198 RSVP_ERROR_UNKNOWN_C_TYPE,
199 RSVP_ERROR_TRAFFIC = 21,
200 RSVP_ERROR_TRAFFIC_SYSTEM,
204 static value_string rsvp_error_vals[] = {
205 {RSVP_ERROR_CONFIRM, "Confirmation"},
206 {RSVP_ERROR_ADMISSION, "Admission Control Failure "},
207 {RSVP_ERROR_POLICY, "Policy Control Failure"},
208 {RSVP_ERROR_NO_PATH, "No PATH information for this RESV message"},
209 {RSVP_ERROR_NO_SENDER, "No sender information for this RESV message"},
210 {RSVP_ERROR_CONFLICT_RESV_STYLE, "Conflicting reservation styles"},
211 {RSVP_ERROR_UNKNOWN_RESV_STYLE, "Unknown reservation style"},
212 {RSVP_ERROR_CONFLICT_DEST_PORTS, "Conflicting destination ports"},
213 {RSVP_ERROR_CONFLICT_SRC_PORTS, "Conflicting source ports"},
214 {RSVP_ERROR_PREEMPTED, "Service preempted"},
215 {RSVP_ERROR_UNKNOWN_CLASS, "Unknown object class"},
216 {RSVP_ERROR_UNKNOWN_C_TYPE, "Unknown object C-type"},
217 {RSVP_ERROR_TRAFFIC, "Traffic Control Error"},
218 {RSVP_ERROR_TRAFFIC_SYSTEM, "Traffic Control System Error"},
223 * Defines the reservation style plus style-specific information that
224 * is not a FLOWSPEC or FILTER_SPEC object, in a RESV message.
226 #define RSVP_DISTINCT (1 << 3)
227 #define RSVP_SHARED (2 << 3)
228 #define RSVP_SHARING_MASK (RSVP_DISTINCT | RSVP_SHARED)
230 #define RSVP_SCOPE_WILD 1
231 #define RSVP_SCOPE_EXPLICIT 2
232 #define RSVP_SCOPE_MASK 0x07
234 #define RSVP_WF (RSVP_SHARED | RSVP_SCOPE_WILD)
235 #define RSVP_FF (RSVP_DISTINCT | RSVP_SCOPE_EXPLICIT)
236 #define RSVP_SE (RSVP_SHARED | RSVP_SCOPE_EXPLICIT)
238 static value_string style_vals[] = {
239 { RSVP_WF, "Wildcard Filter" },
240 { RSVP_FF, "Fixed Filter" },
241 { RSVP_SE, "Shared-Explicit" },
246 * Defines a desired QoS, in a RESV message.
248 enum qos_service_type {
249 QOS_QUALITATIVE = 128, /* Qualitative service */
250 QOS_CONTROLLED_LOAD= 5, /* Controlled Load Service */
251 QOS_GUARANTEED = 2, /* Guaranteed service */
252 QOS_TSPEC = 1 /* Traffic specification */
255 static value_string qos_vals[] = {
256 { QOS_QUALITATIVE, "Qualitative QoS" },
257 { QOS_CONTROLLED_LOAD, "Controlled-load QoS" },
258 { QOS_GUARANTEED, "Guaranteed rate QoS" },
259 { QOS_TSPEC, "Traffic specification" },
263 static value_string svc_vals[] = {
264 { 127, "Token bucket TSpec" },
265 { 128, "Qualitative TSpec" },
266 { 130, "Guaranteed-rate RSpec" },
270 enum rsvp_spec_types { INTSRV = 2 };
272 enum intsrv_services {
276 INTSRV_QUALITATIVE = 128
279 static value_string intsrv_services_str[] = {
280 {INTSRV_GENERAL, "Default General Parameters"},
281 {INTSRV_GTD, "Guaranteed"},
282 {INTSRV_CLOAD, "Controlled Load"},
283 {INTSRV_QUALITATIVE, "Qualitative"},
287 enum intsrv_field_name {
288 INTSRV_NON_IS_HOPS = 1, INTSRV_COMPOSED_NON_IS_HOPS,
289 INTSRV_IS_HOPS, INTSRV_COMPOSED_IS_HOPS,
290 INTSRV_PATH_BANDWIDTH, INTSRV_MIN_PATH_BANDWIDTH,
291 INTSRV_IF_LATENCY, INTSRV_PATH_LATENCY,
292 INTSRV_MTU, INTSRV_COMPOSED_MTU,
294 INTSRV_TOKEN_BUCKET_TSPEC = 127,
295 INTSRV_QUALITATIVE_TSPEC = 128,
296 INTSRV_GTD_RSPEC = 130,
298 INTSRV_DELAY = 131, /* Gtd Parameter C - Max Delay Bound - bytes */
299 INTSRV_MAX_JITTER, /* Gtd Parameter D - Max Jitter */
300 INTSRV_E2E_DELAY, /* Gtd Parameter Ctot */
301 INTSRV_E2E_MAX_JITTER, /* Gtd Parameter Dtot */
302 INTSRV_SHP_DELAY, /* Gtd Parameter Csum */
303 INTSRV_SHP_MAX_JITTER /* Gtd Parameter Dsum */
306 static value_string adspec_params[] = {
308 {6, "Path b/w estimate"},
309 {8, "Minimum path latency"},
310 {10, "Composed MTU"},
311 {133, "End-to-end composed value for C"},
312 {134, "End-to-end composed value for D"},
313 {135, "Since-last-reshaping point composed C"},
314 {136, "Since-last-reshaping point composed D"},
318 /* -------------------- Stuff for MPLS/TE objects -------------------- */
320 static const value_string proto_vals[] = { {IP_PROTO_ICMP, "ICMP"},
321 {IP_PROTO_IGMP, "IGMP"},
322 {IP_PROTO_TCP, "TCP" },
323 {IP_PROTO_UDP, "UDP" },
324 {IP_PROTO_OSPF, "OSPF"},
328 enum rsvp_filter_keys {
331 RSVPF_MSG, /* Message type */
332 /* Shorthand for message types */
344 /* Does the message contain an object of this type? */
346 /* Object present shorthands */
366 RSVPF_EXPLICIT_ROUTE,
369 RSVPF_SESSION_ATTRIBUTE,
377 RSVPF_SESSION_TUNNEL_ID,
378 RSVPF_SESSION_EXT_TUNNEL_ID,
380 /* Sender template */
389 static int rsvp_filter[RSVPF_MAX];
391 static hf_register_info rsvpf_info[] = {
393 /* Message type number */
394 {&rsvp_filter[RSVPF_MSG],
395 { "Message Type", "rsvp.msg", FT_UINT8, BASE_DEC, VALS(message_type_vals), 0x0,
398 /* Message type shorthands */
399 {&rsvp_filter[RSVPF_PATH],
400 { "Path Message", "rsvp.path", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
403 {&rsvp_filter[RSVPF_RESV],
404 { "Resv Message", "rsvp.resv", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
407 {&rsvp_filter[RSVPF_PATHERR],
408 { "Path Error Message", "rsvp.perr", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
411 {&rsvp_filter[RSVPF_RESVERR],
412 { "Resv Error Message", "rsvp.rerr", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
415 {&rsvp_filter[RSVPF_PATHTEAR],
416 { "Path Tear Message", "rsvp.ptear", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
419 {&rsvp_filter[RSVPF_RESVTEAR],
420 { "Resv Tear Message", "rsvp.rtear", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
423 {&rsvp_filter[RSVPF_RCONFIRM],
424 { "Resv Confirm Message", "rsvp.resvconf", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
427 {&rsvp_filter[RSVPF_RTEARCONFIRM],
428 { "Resv Tear Confirm Message", "rsvp.rtearconf", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
432 {&rsvp_filter[RSVPF_OBJECT],
433 { "Object class", "rsvp.object", FT_UINT8, BASE_DEC, VALS(rsvp_class_vals), 0x0,
436 /* Object present shorthands */
437 {&rsvp_filter[RSVPF_SESSION],
438 { "SESSION", "rsvp.session", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
441 {&rsvp_filter[RSVPF_HOP],
442 { "HOP", "rsvp.hop", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
445 {&rsvp_filter[RSVPF_INTEGRITY],
446 { "INTEGRITY", "rsvp.integrity", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
449 {&rsvp_filter[RSVPF_TIME_VALUES],
450 { "TIME VALUES", "rsvp.time", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
453 {&rsvp_filter[RSVPF_ERROR],
454 { "ERROR", "rsvp.error", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
457 {&rsvp_filter[RSVPF_SCOPE],
458 { "SCOPE", "rsvp.scope", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
461 {&rsvp_filter[RSVPF_STYLE],
462 { "STYLE", "rsvp.style", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
465 {&rsvp_filter[RSVPF_FLOWSPEC],
466 { "FLOWSPEC", "rsvp.flowspec", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
469 {&rsvp_filter[RSVPF_FILTER_SPEC],
470 { "FILTERSPEC", "rsvp.filter", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
473 {&rsvp_filter[RSVPF_SENDER],
474 { "SENDER TEMPLATE", "rsvp.sender", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
477 {&rsvp_filter[RSVPF_TSPEC],
478 { "SENDER TSPEC", "rsvp.tspec", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
481 {&rsvp_filter[RSVPF_ADSPEC],
482 { "ADSPEC", "rsvp.adspec", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
485 {&rsvp_filter[RSVPF_POLICY],
486 { "POLICY", "rsvp.policy", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
489 {&rsvp_filter[RSVPF_CONFIRM],
490 { "CONFIRM", "rsvp.confirm", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
493 {&rsvp_filter[RSVPF_LABEL],
494 { "LABEL", "rsvp.label", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
497 {&rsvp_filter[RSVPF_LABEL_REQUEST],
498 { "LABEL REQUEST", "rsvp.label_request", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
501 {&rsvp_filter[RSVPF_SESSION_ATTRIBUTE],
502 { "SESSION ATTRIBUTE", "rsvp.session_attribute", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
505 {&rsvp_filter[RSVPF_EXPLICIT_ROUTE],
506 { "EXPLICIT ROUTE", "rsvp.explicit_route", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
509 {&rsvp_filter[RSVPF_RECORD_ROUTE],
510 { "RECORD ROUTE", "rsvp.record_route", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
513 {&rsvp_filter[RSVPF_UNKNOWN_OBJ],
514 { "Unknown object", "rsvp.obj_unknown", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
518 {&rsvp_filter[RSVPF_SESSION_IP],
519 { "Destination address", "rsvp.session.ip", FT_IPv4, BASE_NONE, NULL, 0x0,
522 {&rsvp_filter[RSVPF_SESSION_PORT],
523 { "Port number", "rsvp.session.port", FT_UINT16, BASE_DEC, NULL, 0x0,
526 {&rsvp_filter[RSVPF_SESSION_PROTO],
527 { "Protocol", "rsvp.session.proto", FT_UINT8, BASE_DEC, VALS(proto_vals), 0x0,
530 {&rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
531 { "Tunnel ID", "rsvp.session.tunnel_id", FT_UINT16, BASE_DEC, NULL, 0x0,
534 {&rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
535 { "Extended tunnel ID", "rsvp.session.ext_tunnel_id", FT_UINT32, BASE_DEC, NULL, 0x0,
538 /* Sender template/Filterspec fields */
539 {&rsvp_filter[RSVPF_SENDER_IP],
540 { "Sender IPv4 address", "rsvp.sender.ip", FT_IPv4, BASE_NONE, NULL, 0x0,
543 {&rsvp_filter[RSVPF_SENDER_PORT],
544 { "Sender port number", "rsvp.sender.port", FT_UINT16, BASE_DEC, NULL, 0x0,
547 {&rsvp_filter[RSVPF_SENDER_LSP_ID],
548 { "Sender LSP ID", "rsvp.sender.lsp_id", FT_UINT16, BASE_DEC, NULL, 0x0,
552 static inline int rsvp_class_to_filter_num(int classnum)
555 case RSVP_CLASS_SESSION :
556 case RSVP_CLASS_HOP :
557 case RSVP_CLASS_INTEGRITY :
558 case RSVP_CLASS_TIME_VALUES :
559 case RSVP_CLASS_ERROR :
560 case RSVP_CLASS_SCOPE :
561 case RSVP_CLASS_STYLE :
562 case RSVP_CLASS_FLOWSPEC :
563 case RSVP_CLASS_FILTER_SPEC :
564 case RSVP_CLASS_SENDER_TEMPLATE :
565 case RSVP_CLASS_SENDER_TSPEC :
566 case RSVP_CLASS_ADSPEC :
567 case RSVP_CLASS_POLICY :
568 case RSVP_CLASS_CONFIRM :
569 case RSVP_CLASS_LABEL :
570 case RSVP_CLASS_LABEL_REQUEST :
571 case RSVP_CLASS_EXPLICIT_ROUTE :
572 case RSVP_CLASS_RECORD_ROUTE :
573 return classnum + RSVPF_OBJECT;
576 case RSVP_CLASS_SESSION_ATTRIBUTE :
577 return RSVPF_SESSION_ATTRIBUTE;
580 return RSVPF_UNKNOWN_OBJ;
585 dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
588 proto_tree *rsvp_tree = NULL, *ti, *ti2;
589 proto_tree *rsvp_header_tree;
590 proto_tree *rsvp_object_tree;
591 proto_tree *rsvp_sa_flags_tree;
592 proto_tree *rsvp_ero_subtree;
595 guint16 cksum, computed_cksum;
603 if (check_col(pinfo->fd, COL_PROTOCOL))
604 col_set_str(pinfo->fd, COL_PROTOCOL, "RSVP");
605 if (check_col(pinfo->fd, COL_INFO))
606 col_clear(pinfo->fd, COL_INFO);
608 ver_flags = tvb_get_guint8(tvb, offset+0);
609 message_type = tvb_get_guint8(tvb, offset+1);
610 if (check_col(pinfo->fd, COL_INFO)) {
611 col_add_str(pinfo->fd, COL_INFO,
612 val_to_str(message_type, message_type_vals, "Unknown (%u)"));
616 msg_length = tvb_get_ntohs(tvb, offset+6);
617 ti = proto_tree_add_item(tree, proto_rsvp, tvb, offset, msg_length,
619 rsvp_tree = proto_item_add_subtree(ti, ett_rsvp);
621 ti = proto_tree_add_text(rsvp_tree, tvb, offset, 8, "RSVP Header");
622 rsvp_header_tree = proto_item_add_subtree(ti, ett_rsvp_hdr);
624 proto_tree_add_text(rsvp_header_tree, tvb, offset, 1, "RSVP Version: %u",
625 (ver_flags & 0xf0)>>4);
626 proto_tree_add_text(rsvp_header_tree, tvb, offset, 1, "Flags: %02x",
628 proto_tree_add_uint(rsvp_header_tree, rsvp_filter[RSVPF_MSG], tvb,
629 offset+1, 1, message_type);
630 if (message_type <= RSVPF_RTEARCONFIRM &&
631 message_type != RSVPF_JUNK_MSG8 &&
632 message_type != RSVPF_JUNK_MSG9 ) {
633 proto_tree_add_boolean_hidden(rsvp_header_tree, rsvp_filter[RSVPF_MSG + message_type], tvb,
636 cksum = tvb_get_ntohs(tvb, offset+2);
637 if (!pinfo->fragmented && tvb_length(tvb) >= msg_length) {
638 /* The packet isn't part of a fragmented datagram and isn't
639 truncated, so we can checksum it. */
640 cksum_vec[0].ptr = tvb_get_ptr(tvb, 0, msg_length);
641 cksum_vec[0].len = msg_length;
642 computed_cksum = in_cksum(&cksum_vec[0], 1);
643 if (computed_cksum == 0) {
644 proto_tree_add_text(rsvp_header_tree, tvb, offset+2, 2,
645 "Message Checksum: 0x%04x (correct)",
648 proto_tree_add_text(rsvp_header_tree, tvb, offset+2, 2,
649 "Message Checksum: 0x%04x (incorrect, should be 0x%04x)",
651 in_cksum_shouldbe(cksum, computed_cksum));
654 proto_tree_add_text(rsvp_header_tree, tvb, offset+2, 2,
655 "Message Checksum: 0x%04x",
658 proto_tree_add_text(rsvp_header_tree, tvb, offset+4, 1,
660 tvb_get_guint8(tvb, offset+4));
661 proto_tree_add_text(rsvp_header_tree, tvb, offset+6, 2,
662 "Message length: %u", msg_length);
666 while (len < msg_length) {
671 obj_length = tvb_get_ntohs(tvb, offset);
672 class = tvb_get_guint8(tvb, offset+2);
673 type = tvb_get_guint8(tvb, offset+3);
674 object_type = val_to_str(class, rsvp_class_vals, "Unknown");
675 proto_tree_add_uint_hidden(rsvp_tree, rsvp_filter[RSVPF_OBJECT], tvb,
676 offset, obj_length, class);
677 ti = proto_tree_add_boolean(rsvp_tree, rsvp_filter[rsvp_class_to_filter_num(class)],
678 tvb, offset, obj_length, TRUE);
684 case RSVP_CLASS_SESSION :
685 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_session);
686 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
687 "Length: %u", obj_length);
688 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
689 "Class number: %u - %s",
691 mylen = obj_length - 4;
694 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
696 proto_tree_add_item(rsvp_object_tree,
697 rsvp_filter[RSVPF_SESSION_IP],
698 tvb, offset2, 4, FALSE);
700 proto_tree_add_item(rsvp_object_tree,
701 rsvp_filter[RSVPF_SESSION_PROTO], tvb,
702 offset2+4, 1, FALSE);
703 proto_tree_add_text(rsvp_object_tree, tvb, offset2+5, 1,
705 tvb_get_ntohs(tvb, offset2+5));
706 proto_tree_add_item(rsvp_object_tree,
707 rsvp_filter[RSVPF_SESSION_PORT], tvb,
708 offset2+6, 2, FALSE);
713 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
715 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
716 "Destination address: %s",
717 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
718 proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 1,
720 tvb_get_guint8(tvb, offset2+16));
721 proto_tree_add_text(rsvp_object_tree, tvb, offset2+17, 1,
723 tvb_get_guint8(tvb, offset2+17));
724 proto_tree_add_text(rsvp_object_tree, tvb, offset2+18, 2,
725 "Destination port: %u",
726 tvb_get_ntohs(tvb, offset2+18));
731 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
732 "C-type: 7 - IPv4 LSP");
733 proto_tree_add_item(rsvp_object_tree,
734 rsvp_filter[RSVPF_SESSION_IP],
735 tvb, offset2, 4, FALSE);
737 proto_tree_add_item(rsvp_object_tree,
738 rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
739 tvb, offset2+6, 2, FALSE);
741 proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 4,
742 "Extended Tunnel ID: %u (%s)",
743 tvb_get_ntohl(tvb, offset2+8),
744 ip_to_str(tvb_get_ptr(tvb, offset2+8, 4)));
745 proto_tree_add_item_hidden(rsvp_object_tree,
746 rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
747 tvb, offset2+8, 4, FALSE);
752 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
753 "C-type: Unknown (%u)",
755 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
756 "Data (%d bytes)", mylen);
761 case RSVP_CLASS_HOP :
762 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_hop);
763 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
764 "Length: %u", obj_length);
765 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
766 "Class number: %u - %s",
768 mylen = obj_length - 4;
771 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
773 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
774 "Neighbor address: %s",
775 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
776 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
777 "Logical interface: %u",
778 tvb_get_ntohl(tvb, offset2+4));
783 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
785 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
786 "Neighbor 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, 4,
789 "Logical interface: 0x%08x",
790 tvb_get_ntohl(tvb, offset2+16));
795 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
796 "C-type: Unknown (%u)",
798 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
799 "Data (%d bytes)", mylen);
804 case RSVP_CLASS_TIME_VALUES :
805 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_time_values);
806 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
807 "Length: %u", obj_length);
808 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
809 "Class number: %u - %s",
811 mylen = obj_length - 4;
814 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
816 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
817 "Refresh interval: %u ms (%u seconds)",
818 tvb_get_ntohl(tvb, offset2),
819 tvb_get_ntohl(tvb, offset2)/1000);
824 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
825 "C-type: Unknown (%u)",
827 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
828 "Data (%d bytes)", mylen);
834 case RSVP_CLASS_ERROR :
835 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_error);
836 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
837 "Length: %u", obj_length);
838 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
839 "Class number: %u - %s",
841 mylen = obj_length - 4;
846 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
848 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
850 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
851 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 1,
853 tvb_get_guint8(tvb, offset2+4));
854 error_code = tvb_get_guint8(tvb, offset2+5);
855 proto_tree_add_text(rsvp_object_tree, tvb, offset2+5, 1,
856 "Error code: %u - %s", error_code,
857 val_to_str(error_code, rsvp_error_vals, "Unknown"));
858 proto_tree_add_text(rsvp_object_tree, tvb, offset2+6, 2,
860 tvb_get_ntohs(tvb, offset2+6));
867 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
869 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
871 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
872 proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 1,
874 tvb_get_guint8(tvb, offset2+16));
875 error_code = tvb_get_guint8(tvb, offset2+17);
876 proto_tree_add_text(rsvp_object_tree, tvb, offset2+17, 1,
877 "Error code: %u - %s", error_code,
878 val_to_str(error_code, rsvp_error_vals, "Unknown"));
879 proto_tree_add_text(rsvp_object_tree, tvb, offset2+18, 2,
881 tvb_get_ntohs(tvb, offset2+18));
886 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
887 "C-type: Unknown (%u)",
889 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
890 "Data (%d bytes)", mylen);
896 case RSVP_CLASS_SCOPE :
897 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_scope);
898 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
899 "Length: %u", obj_length);
900 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
901 "Class number: %u - %s",
903 mylen = obj_length - 4;
906 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
909 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
911 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
919 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
922 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
924 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
932 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
933 "C-type: Unknown (%u)",
935 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
936 "Data (%d bytes)", mylen);
941 case RSVP_CLASS_STYLE :
942 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_style);
943 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
944 "Length: %u", obj_length);
945 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
946 "Class number: %u - %s",
948 mylen = obj_length - 4;
953 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
955 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
957 tvb_get_guint8(tvb, offset2));
958 style = tvb_get_ntoh24(tvb, offset2+1);
959 ti = proto_tree_add_text(rsvp_object_tree, tvb, offset2+1,
960 3, "Style: 0x%06X - %s",
962 val_to_str(style, style_vals, "Unknown"));
967 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
968 "C-type: Unknown (%u)",
970 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
971 "Data (%d bytes)", mylen);
977 case RSVP_CLASS_CONFIRM :
978 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_confirm);
979 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
980 "Length: %u", obj_length);
981 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
982 "Class number: %u - %s",
984 mylen = obj_length - 4;
987 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
989 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 4,
990 "Receiver address: %s",
991 ip_to_str(tvb_get_ptr(tvb, offset2, 4)));
996 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
998 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
999 "Receiver address: %s",
1000 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1005 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1006 "C-type: Unknown (%u)",
1008 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1009 "Data (%d bytes)", mylen);
1014 case RSVP_CLASS_SENDER_TEMPLATE :
1015 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_sender_template);
1016 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1017 "Length: %u", obj_length);
1018 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1019 "Class number: %u - %s",
1020 class, object_type);
1021 goto common_template;
1022 case RSVP_CLASS_FILTER_SPEC :
1023 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_filter_spec);
1024 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1025 "Length: %u", obj_length);
1026 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1027 "Class number: %u - %s",
1028 class, object_type);
1030 mylen = obj_length - 4;
1033 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1034 "C-type: 1 - IPv4");
1035 proto_tree_add_item(rsvp_object_tree,
1036 rsvp_filter[RSVPF_SENDER_IP],
1037 tvb, offset2, 4, FALSE);
1038 proto_tree_add_item(rsvp_object_tree,
1039 rsvp_filter[RSVPF_SENDER_PORT],
1040 tvb, offset2+6, 2, FALSE);
1045 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1046 "C-type: 2 - IPv6");
1047 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 16,
1048 "Source address: %s",
1049 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2, 16)));
1050 proto_tree_add_text(rsvp_object_tree, tvb, offset2+18, 2,
1052 tvb_get_ntohs(tvb, offset2+18));
1057 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1058 "C-type: 7 - IPv4 LSP");
1059 proto_tree_add_item(rsvp_object_tree,
1060 rsvp_filter[RSVPF_SENDER_IP],
1061 tvb, offset2, 4, FALSE);
1062 proto_tree_add_item(rsvp_object_tree,
1063 rsvp_filter[RSVPF_SENDER_LSP_ID],
1064 tvb, offset2+6, 2, FALSE);
1069 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1070 "C-type: Unknown (%u)",
1072 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1073 "Data (%d bytes)", mylen);
1078 case RSVP_CLASS_SENDER_TSPEC : {
1079 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_sender_tspec);
1080 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1081 "Length: %u", obj_length);
1082 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1083 "Class number: %u - %s",
1084 class, object_type);
1085 mylen = obj_length - 4;
1087 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1088 "Message format version: %u",
1089 tvb_get_guint8(tvb, offset2)>>4);
1090 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1091 "Data length: %u words, not including header",
1092 tvb_get_ntohs(tvb, offset2+2));
1101 service_num = tvb_get_guint8(tvb, offset2);
1102 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1103 "Service header: %u - %s",
1105 val_to_str(service_num, qos_vals, "Unknown"));
1106 length = tvb_get_ntohs(tvb, offset2+2);
1107 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1108 "Length of service %u data: %u words, "
1109 "not including header",
1110 service_num, length);
1115 switch(service_num) {
1118 /* Token bucket TSPEC */
1119 param_id = tvb_get_guint8(tvb, offset2);
1120 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1121 "Parameter %u - %s",
1123 val_to_str(param_id, svc_vals, "Unknown"));
1124 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
1125 "Parameter %u flags: 0x%02x",
1127 tvb_get_guint8(tvb, offset2+1));
1128 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1129 "Parameter %u data length: %u words, "
1130 "not including header",
1132 tvb_get_ntohs(tvb, offset2+2));
1133 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
1134 "Token bucket rate: %ld",
1135 tvb_ieee_to_long(tvb, offset2+4));
1136 proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 4,
1137 "Token bucket size: %ld",
1138 tvb_ieee_to_long(tvb, offset2+8));
1139 proto_tree_add_text(rsvp_object_tree, tvb, offset2+12, 4,
1140 "Peak data rate: %ld",
1141 tvb_ieee_to_long(tvb, offset2+12));
1142 proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 4,
1143 "Minimum policed unit: %u",
1144 tvb_get_ntohl(tvb, offset2+16));
1145 proto_tree_add_text(rsvp_object_tree, tvb, offset2+20, 4,
1146 "Maximum policed unit: %u",
1147 tvb_get_ntohl(tvb, offset2+20));
1150 case QOS_QUALITATIVE :
1151 /* Token bucket TSPEC */
1152 param_id = tvb_get_guint8(tvb, offset2);
1153 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1154 "Parameter %u - %s",
1156 val_to_str(param_id, svc_vals, "Unknown"));
1157 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
1158 "Parameter %u flags: %x",
1160 tvb_get_guint8(tvb, offset2+1));
1161 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1162 "Parameter %u data length: %u words, "
1163 "not including header",
1165 tvb_get_ntohs(tvb, offset2+2));
1166 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
1167 "Maximum policed unit: %u",
1168 tvb_get_ntohl(tvb, offset2+4));
1172 offset2 += length*4;
1178 case RSVP_CLASS_FLOWSPEC : {
1179 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_flowspec);
1180 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1181 "Length: %u", obj_length);
1182 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1183 "Class number: %u - %s",
1184 class, object_type);
1185 mylen = obj_length - 4;
1187 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1188 "Message format version: %u",
1189 tvb_get_guint8(tvb, offset2)>>4);
1190 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1191 "Data length: %u words, not including header",
1192 tvb_get_ntohs(tvb, offset2+2));
1201 service_num = tvb_get_guint8(tvb, offset2);
1202 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1203 "Service header: %u - %s",
1205 val_to_str(service_num, intsrv_services_str, "Unknown"));
1206 length = tvb_get_ntohs(tvb, offset2+2);
1207 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1208 "Length of service %u data: %u words, "
1209 "not including header",
1216 switch(service_num) {
1218 case QOS_CONTROLLED_LOAD :
1219 case QOS_GUARANTEED :
1220 /* Treat both these the same for now */
1221 param_id = tvb_get_guint8(tvb, offset2);
1222 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1223 "Parameter %u - %s",
1225 val_to_str(param_id, svc_vals, "Unknown"));
1226 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
1227 "Parameter %u flags: %x",
1229 tvb_get_guint8(tvb, offset2+1));
1230 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1231 "Parameter %u data length: %u words, "
1232 "not including header",
1234 tvb_get_ntohs(tvb, offset2+2));
1235 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
1236 "Token bucket rate: %ld",
1237 tvb_ieee_to_long(tvb, offset2+4));
1238 proto_tree_add_text(rsvp_object_tree, tvb, offset2+8, 4,
1239 "Token bucket size: %ld",
1240 tvb_ieee_to_long(tvb, offset2+8));
1241 proto_tree_add_text(rsvp_object_tree, tvb, offset2+12, 4,
1242 "Peak data rate: %ld",
1243 tvb_ieee_to_long(tvb, offset2+12));
1244 proto_tree_add_text(rsvp_object_tree, tvb, offset2+16, 4,
1245 "Minimum policed unit: %u",
1246 tvb_get_ntohl(tvb, offset2+16));
1247 proto_tree_add_text(rsvp_object_tree, tvb, offset2+20, 4,
1248 "Maximum policed unit: %u",
1249 tvb_get_ntohl(tvb, offset2+20));
1250 if (service_num != QOS_GUARANTEED)
1253 /* Guaranteed-rate RSpec */
1254 param_id = tvb_get_guint8(tvb, offset2+24);
1255 proto_tree_add_text(rsvp_object_tree, tvb, offset2+24, 1,
1256 "Parameter %u - %s",
1258 val_to_str(param_id, svc_vals, "Unknown"));
1259 proto_tree_add_text(rsvp_object_tree, tvb, offset2+25, 1,
1260 "Parameter %u flags: %x",
1262 tvb_get_guint8(tvb, offset2+25));
1263 proto_tree_add_text(rsvp_object_tree, tvb, offset2+26, 2,
1264 "Parameter %u data length: %u words, "
1265 "not including header",
1267 tvb_get_ntohs(tvb, offset2+26));
1269 proto_tree_add_text(rsvp_object_tree, tvb, offset2+28, 4,
1271 tvb_ieee_to_long(tvb, offset2+28));
1272 proto_tree_add_text(rsvp_object_tree, tvb, offset2+32, 4,
1274 tvb_get_ntohl(tvb, offset2+32));
1277 case QOS_QUALITATIVE :
1278 param_id = tvb_get_guint8(tvb, offset2);
1279 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1280 "Parameter %u - %s",
1282 val_to_str(param_id, svc_vals, "Unknown"));
1283 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
1284 "Parameter %u flags: %x",
1286 tvb_get_guint8(tvb, offset2+1));
1287 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1288 "Parameter %u data length: %u words, "
1289 "not including header",
1291 tvb_get_ntohs(tvb, offset2+2));
1292 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, 4,
1293 "Maximum policed unit: %u",
1294 tvb_get_ntohl(tvb, offset2+4));
1298 offset2 += length*4;
1304 case RSVP_CLASS_ADSPEC : {
1305 proto_tree *adspec_tree;
1307 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_adspec);
1308 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1309 "Length: %u", obj_length);
1310 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1311 "Class number: %u - %s",
1312 class, object_type);
1313 mylen = obj_length - 4;
1315 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1316 "Message format version: %u",
1317 tvb_get_guint8(tvb, offset2)>>4);
1318 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1319 "Data length: %u words, not including header",
1320 tvb_get_ntohs(tvb, offset2+2));
1329 service_num = tvb_get_guint8(tvb, offset2);
1330 str = val_to_str(service_num, intsrv_services_str, "Unknown");
1331 break_bit = tvb_get_guint8(tvb, offset2+1);
1332 length = tvb_get_ntohs(tvb, offset2+2);
1333 ti = proto_tree_add_text(rsvp_object_tree, tvb, offset2,
1336 adspec_tree = proto_item_add_subtree(ti,
1337 ett_rsvp_adspec_subtree);
1338 proto_tree_add_text(adspec_tree, tvb, offset2, 1,
1339 "Service header %u - %s",
1341 proto_tree_add_text(adspec_tree, tvb, offset2+1, 1,
1343 "Break bit set":"Break bit not set");
1344 proto_tree_add_text(adspec_tree, tvb, offset2+2, 2,
1345 "Data length: %u words, not including header",
1352 guint16 phdr_length;
1354 id = tvb_get_guint8(tvb, offset2);
1355 phdr_length = tvb_get_ntohs(tvb, offset2+2);
1356 str = match_strval(id, adspec_params);
1366 /* 32-bit unsigned integer */
1367 proto_tree_add_text(adspec_tree, tvb, offset2,
1369 "%s - %u (type %u, length %u)",
1371 tvb_get_ntohl(tvb, offset2+4),
1377 proto_tree_add_text(adspec_tree, tvb, offset2,
1379 "%s - %lu (type %u, length %u)",
1381 tvb_ieee_to_long(tvb, offset2+4),
1385 proto_tree_add_text(adspec_tree, tvb, offset2,
1387 "%s (type %u, length %u)",
1392 proto_tree_add_text(adspec_tree, tvb, offset2,
1394 "Unknown (type %u, length %u)",
1397 offset2 += (phdr_length+1)<<2;
1398 i -= (phdr_length+1)<<2;
1399 mylen -= (phdr_length+1)<<2;
1405 case RSVP_CLASS_INTEGRITY :
1406 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_integrity);
1407 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1408 "Length: %u", obj_length);
1409 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1410 "Class number: %u - %s",
1411 class, object_type);
1414 case RSVP_CLASS_POLICY :
1415 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_policy);
1416 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1417 "Length: %u", obj_length);
1418 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1419 "Class number: %u - %s",
1420 class, object_type);
1423 case RSVP_CLASS_LABEL_REQUEST :
1424 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_label_request);
1425 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1426 "Length: %u", obj_length);
1427 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1428 "Class number: %u - %s",
1429 class, object_type);
1430 mylen = obj_length - 4;
1433 unsigned short l3pid = tvb_get_ntohs(tvb, offset2+2);
1434 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1436 proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 2,
1437 "L3PID: %s (0x%04x)",
1438 val_to_str(l3pid, etype_vals, "Unknown"),
1444 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1445 "C-type: Unknown (%u)",
1447 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1448 "Data (%d bytes)", mylen);
1454 case RSVP_CLASS_LABEL :
1455 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_label);
1456 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1457 "Length: %u", obj_length);
1458 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1459 "Class number: %u - %s",
1460 class, object_type);
1461 mylen = obj_length - 4;
1464 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1466 for (i=1, l = 0; l < mylen; l+=4, i++)
1467 proto_tree_add_text(rsvp_object_tree, tvb, offset2+l, 4,
1469 i, tvb_get_ntohl(tvb, offset2+l),
1471 "(Top label)" : "");
1476 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1477 "C-type: Unknown (%u)",
1479 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1480 "Data (%d bytes)", mylen);
1486 case RSVP_CLASS_SESSION_ATTRIBUTE :
1487 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_session_attribute);
1488 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1489 "Length: %u", obj_length);
1490 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1491 "Class number: %u - %s",
1492 class, object_type);
1493 mylen = obj_length - 4;
1499 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1500 "C-type: 7 - IPv4 LSP");
1501 proto_tree_add_text(rsvp_object_tree, tvb, offset2, 1,
1502 "Setup priority: %u",
1503 tvb_get_guint8(tvb, offset2));
1504 proto_tree_add_text(rsvp_object_tree, tvb, offset2+1, 1,
1505 "Hold priority: %u",
1506 tvb_get_guint8(tvb, offset2+1));
1507 flags = tvb_get_guint8(tvb, offset2+2);
1508 ti2 = proto_tree_add_text(rsvp_object_tree, tvb, offset2+2, 1,
1509 "Flags: 0x%02x", flags);
1510 rsvp_sa_flags_tree = proto_item_add_subtree(ti2,
1511 ett_rsvp_session_attribute_flags);
1512 proto_tree_add_text(rsvp_sa_flags_tree, tvb, offset2+2, 1,
1513 decode_boolean_bitfield(flags, 0x01, 8,
1514 "Local protection desired",
1515 "Local protection not desired"));
1516 proto_tree_add_text(rsvp_sa_flags_tree, tvb, offset2+2, 1,
1517 decode_boolean_bitfield(flags, 0x02, 8,
1518 "Merging permitted",
1519 "Merging not permitted"));
1520 proto_tree_add_text(rsvp_sa_flags_tree, tvb, offset2+2, 1,
1521 decode_boolean_bitfield(flags, 0x04, 8,
1522 "Ingress node may reroute",
1523 "Ingress node may not reroute"));
1525 name_len = tvb_get_guint8(tvb, offset2+3);
1526 proto_tree_add_text(rsvp_object_tree, tvb, offset2+3, 1,
1527 "Name length: %u", name_len);
1528 proto_tree_add_text(rsvp_object_tree, tvb, offset2+4, name_len,
1531 tvb_get_ptr(tvb, offset2+4, name_len));
1536 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1537 "C-type: Unknown (%u)",
1539 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1540 "Data (%d bytes)", mylen);
1546 case RSVP_CLASS_EXPLICIT_ROUTE :
1547 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_explicit_route);
1548 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1549 "Length: %u", obj_length);
1550 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1551 "Class number: %u - %s",
1552 class, object_type);
1553 mylen = obj_length - 4;
1556 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1558 for (i=1, l = 0; l < mylen; i++) {
1559 j = tvb_get_guint8(tvb, offset2+l) & 0x7f;
1562 k = tvb_get_guint8(tvb, offset2+l) & 0x80;
1563 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1565 "IPv4 Subobject - %s, %s",
1566 ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)),
1567 k ? "Loose" : "Strict");
1569 proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
1570 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1571 k ? "Loose Hop " : "Strict Hop");
1572 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1574 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1576 tvb_get_guint8(tvb, offset2+l+1));
1577 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 4,
1579 ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)));
1580 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+6, 1,
1581 "Prefix length: %u",
1582 tvb_get_guint8(tvb, offset2+l+6));
1586 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1590 proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
1591 k = tvb_get_guint8(tvb, offset2+l) & 0x80;
1592 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1593 k ? "Loose Hop " : "Strict Hop");
1594 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1596 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1598 tvb_get_guint8(tvb, offset2+l+1));
1599 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 16,
1601 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l+2, 16)));
1602 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+18, 1,
1603 "Prefix length: %u",
1604 tvb_get_guint8(tvb, offset2+l+6));
1608 k = tvb_get_ntohs(tvb, offset2+l+2);
1609 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1611 "Autonomous System %u",
1614 proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
1615 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1616 k ? "Loose Hop " : "Strict Hop");
1617 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1618 "Type: 32 (Autonomous System Number)");
1619 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1621 tvb_get_guint8(tvb, offset2+l+1));
1622 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 2,
1623 "Autonomous System %u", k);
1626 case 64: /* Path Term */
1627 k = tvb_get_guint8(tvb, offset2+l) & 0x80;
1628 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1630 "LSP Path Termination");
1632 proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
1633 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1634 k ? "Loose Hop " : "Strict Hop");
1635 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1636 "Type: 64 (MPLS LSP Path Termination)");
1637 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1639 tvb_get_guint8(tvb, offset2+l+1));
1642 default: /* Unknown subobject */
1643 k = tvb_get_guint8(tvb, offset2+l) & 0x80;
1644 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1646 tvb_get_guint8(tvb, offset2+l+1),
1647 "Unknown subobject: %d", j);
1649 proto_item_add_subtree(ti2, ett_rsvp_explicit_route_subobj);
1650 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1651 k ? "Loose Hop " : "Strict Hop");
1652 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1653 "Type: %u (Unknown)", j);
1654 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1656 tvb_get_guint8(tvb, offset2+l+1));
1660 l += tvb_get_guint8(tvb, offset2+l+1);
1665 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1666 "C-type: Unknown (%u)",
1668 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1669 "Data (%d bytes)", mylen);
1676 case RSVP_CLASS_RECORD_ROUTE :
1677 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_record_route);
1678 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1679 "Length: %u", obj_length);
1680 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1681 "Class number: %u - %s",
1682 class, object_type);
1683 mylen = obj_length - 4;
1686 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1688 for (i=1, l = 0; l < mylen; i++) {
1689 j = tvb_get_guint8(tvb, offset2+l);
1692 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1694 "IPv4 Subobject - %s",
1695 ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)));
1697 proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj);
1698 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1700 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1702 tvb_get_guint8(tvb, offset2+l+1));
1703 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 4,
1705 ip_to_str(tvb_get_ptr(tvb, offset2+l+2, 4)));
1706 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+6, 1,
1707 "Prefix length: %u",
1708 tvb_get_guint8(tvb, offset2+l+6));
1712 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1716 proto_item_add_subtree(ti2, ett_rsvp_record_route_subobj);
1717 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l, 1,
1719 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1721 tvb_get_guint8(tvb, offset2+l+1));
1722 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+2, 16,
1724 ip6_to_str((struct e_in6_addr *)tvb_get_ptr(tvb, offset2+l+2, 16)));
1725 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+18, 1,
1726 "Prefix length: %u",
1727 tvb_get_guint8(tvb, offset2+l+6));
1730 default: /* Unknown subobject */
1731 k = tvb_get_guint8(tvb, offset2+l) & 0x80;
1732 ti2 = proto_tree_add_text(rsvp_object_tree, tvb,
1734 tvb_get_guint8(tvb, offset2+l+1),
1735 "Unknown subobject: %u",
1738 proto_item_add_subtree(ti2, ett_rsvp_record_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: %u (Unknown)", j);
1743 proto_tree_add_text(rsvp_ero_subtree, tvb, offset2+l+1, 1,
1745 tvb_get_guint8(tvb, offset2+l+1));
1749 l += tvb_get_guint8(tvb, offset2+l+1);
1755 proto_tree_add_text(rsvp_object_tree, tvb, offset+3, 1,
1756 "C-type: Unknown (%u)",
1758 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1759 "Data (%d bytes)", mylen);
1766 rsvp_object_tree = proto_item_add_subtree(ti, ett_rsvp_unknown_class);
1767 proto_tree_add_text(rsvp_object_tree, tvb, offset, 2,
1768 "Length: %u", obj_length);
1769 proto_tree_add_text(rsvp_object_tree, tvb, offset+2, 1,
1770 "Class number: %u - %s",
1771 class, object_type);
1773 mylen = obj_length - 4;
1774 proto_tree_add_text(rsvp_object_tree, tvb, offset2, mylen,
1775 "Data (%d bytes)", mylen);
1778 case RSVP_CLASS_NULL :
1783 offset += obj_length;
1790 proto_register_rsvp(void)
1792 static gint *ett[] = {
1797 &ett_rsvp_time_values,
1802 &ett_rsvp_sender_template,
1803 &ett_rsvp_filter_spec,
1804 &ett_rsvp_sender_tspec,
1807 &ett_rsvp_adspec_subtree,
1808 &ett_rsvp_integrity,
1811 &ett_rsvp_label_request,
1812 &ett_rsvp_session_attribute,
1813 &ett_rsvp_session_attribute_flags,
1814 &ett_rsvp_explicit_route,
1815 &ett_rsvp_explicit_route_subobj,
1816 &ett_rsvp_record_route,
1817 &ett_rsvp_record_route_subobj,
1818 &ett_rsvp_unknown_class,
1821 proto_rsvp = proto_register_protocol("Resource ReserVation Protocol (RSVP)",
1823 proto_register_field_array(proto_rsvp, rsvpf_info, array_length(rsvpf_info));
1824 proto_register_subtree_array(ett, array_length(ett));
1828 proto_reg_handoff_rsvp(void)
1830 dissector_add("ip.proto", IP_PROTO_RSVP, dissect_rsvp, proto_rsvp);