Revert "TODO epan/dissectors/asn1/kerberos/packet-kerberos-template.c new GSS flags"
[wireshark-sm.git] / epan / dissectors / packet-rsvp.c
blob9b9e902964e863d89a9bc348e4d816598c83095b
1 /* packet-rsvp.c
2 * Routines for RSVP packet disassembly
4 * (c) Copyright Ashok Narayanan <ashokn@cisco.com>
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
10 * SPDX-License-Identifier: GPL-2.0-or-later
14 * NOTES
16 * This module defines routines to disassemble RSVP packets, as defined in
17 * RFC 2205. All objects from RFC2205 are supported, in IPv4 and IPv6 mode.
18 * In addition, the Integrated Services traffic specification objects
19 * defined in RFC2210 are also supported.
21 * IPv6 support is not completely tested
23 * Mar 3, 2000: Added support for MPLS/TE objects, as defined in
24 * <draft-ietf-mpls-rsvp-lsp-tunnel-04.txt>
26 * May 6, 2004: Added support for E-NNI objects, as defined in
27 * <OIF-E-NNI-01.0> (Roberto Morro)
28 * <roberto.morro[AT]tilab.com>
30 * May 6, 2004: Modified some UNI objects, as defined in
31 * <OIF2003.249.09> (Roberto Morro)
32 * <roberto.morro[AT]tilab.com>
34 * June 2, 2005: Modified more UNI objects to show correct TNA
35 * addresses; Fixed LSP interface ID subobject (Richard Rabbat)
36 * <richard[AT]us.fujitsu.com>
38 * July 25, 2005: improved ERROR and LABEL_SET objects dissector;
39 * new ASSOCIATION object dissector (Roberto Morro)
40 * <roberto.morro[AT]tilab.com>
42 * August 22, 2005: added support for tapping and conversations.
43 * (Manu Pathak) <mapathak[AT]cisco.com>
45 * July 4, 2006: added support for RFC4124; new CLASSTYPE object dissector
46 * (FF) <francesco.fondelli[AT]gmail.com>
48 * June 9, 2007: added support for draft-ietf-ccamp-ethernet-traffic-parameters-02
49 * and draft-ietf-ccamp-lsp-hierarchy-bis-02; added support for NOTIFY_REQUEST
50 * and RECOVERY_LABEL objects (Roberto Morro) * <roberto.morro[AT]tilab.com>
52 * Oct 21, 2009: add support for RFC4328, new G.709 traffic parameters,
53 * update gpid, switching and encoding type values to actual IANA numbers.
54 * (FF) <francesco.fondelli[AT]gmail.com>
56 * Gen 20, 2010: add support for ERROR_STRING IF_ID TLV (see RFC 4783)
57 * (FF) <francesco.fondelli[AT]gmail.com>
59 * Feb 12, 2010: add support for generalized label interpretation: SUKLM
60 * format for SONET/SDH label (RFC 4606), t3t2t1 format for G.709 ODUk label
61 * (RFC 4328), G.694 format for lambda label (draft-ietf-ccamp-gmpls-g-694-lamb
62 * da-labels-05). Add related user preference option.
63 * (FF) <francesco.fondelli[AT]gmail.com>
65 * Dec 3, 2010: add support for vendor private class object and ERO/RRO
66 * sub-object (see RFC 3936).
67 * (FF) <francesco.fondelli[AT]gmail.com>
69 * Dec 21, 2010: add new PROTECTION obj c-type 2 (RFC4872),
70 * new TLVs for IF_ID (RFC4920), Path Key subobj in ERO (RFC5520),
71 * new ASSOCIATION obj c-type 4 (oif2008.389), new LSP_ATTRIBUTES and
72 * LSP_REQUIRED_ATTRIBUTES objects (RFC5420), improved ERROR object dissection,
73 * new ADMIN_STATUS flags and fix to conversation (not applied to ACK, SREFRESH
74 * and HELLO messages).
75 * (Roberto Morro) <roberto.morro[AT]telecomitalia.it>
77 * Jul 20, 2013: add support for Exclude Routes (XRO) (see RFC 4874)
78 * (FF) <francesco.fondelli[AT]gmail.com>
80 * Added support for "Ethernet line" LSP encoding (RFC 6004)
81 * Added support for flexi-grid label (RFC 7699)
82 * Added support for codepoint for network-assigned label (RFC 8359)
83 * Added support for clean-up and bug fixes on ERO/RRO/XRO
84 * Added support for full support of RFC 8001, including error code
85 * - (c) 2018 Julien Meuric <julien.meuric@orange.com>
86 * - (c) 2018 Khalifa Ndiaye <khalifa.ndiaye@orange.com>
90 #include "config.h"
92 #include <epan/packet.h>
93 #include <epan/expert.h>
94 #include <epan/prefs.h>
95 #include <epan/to_str.h>
96 #include <epan/in_cksum.h>
97 #include <epan/etypes.h>
98 #include <epan/ipproto.h>
99 #include <epan/conversation.h>
100 #include <epan/conversation_table.h>
101 #include <epan/tap.h>
102 #include <epan/addr_resolv.h>
103 #include <epan/tfs.h>
104 #include <epan/unit_strings.h>
106 #include <wsutil/array.h>
107 #include <wsutil/utf8_entities.h>
108 #include "packet-rsvp.h"
109 #include "packet-ip.h"
110 #include "packet-diffserv-mpls-common.h"
111 #include "packet-osi.h"
113 /* RSVP over UDP encapsulation */
114 #define UDP_PORT_PRSVP 3455
116 void proto_register_rsvp(void);
117 void proto_reg_handoff_rsvp(void);
118 static dissector_handle_t rsvp_handle, rsvpe2ei_handle;
120 static int proto_rsvp;
121 static int proto_rsvp_e2e1;
123 static int hf_rsvp_error_flags;
124 static int hf_rsvp_error_flags_path_state_removed;
125 static int hf_rsvp_error_flags_not_guilty;
126 static int hf_rsvp_error_flags_in_place;
127 static int hf_rsvp_eth_tspec_tlv_color_mode;
128 static int hf_rsvp_eth_tspec_tlv_coupling_flag;
129 static int hf_rsvp_sender_tspec_standard_contiguous_concatenation;
130 static int hf_rsvp_sender_tspec_arbitrary_contiguous_concatenation;
131 static int hf_rsvp_sender_tspec_regenerator_section;
132 static int hf_rsvp_sender_tspec_multiplex_section;
133 static int hf_rsvp_sender_tspec_J0_transparency;
134 static int hf_rsvp_sender_tspec_SOH_RSOH_DCC_transparency;
135 static int hf_rsvp_sender_tspec_LOH_MSOH_DCC_transparency;
136 static int hf_rsvp_sender_tspec_LOH_MSOH_extended_DCC_transparency;
137 static int hf_rsvp_sender_tspec_K1_K2_transparency;
138 static int hf_rsvp_sender_tspec_E1_transparency;
139 static int hf_rsvp_sender_tspec_F1_transparency;
140 static int hf_rsvp_sender_tspec_E2_transparency;
141 static int hf_rsvp_sender_tspec_B1_transparency;
142 static int hf_rsvp_sender_tspec_B2_transparency;
143 static int hf_rsvp_sender_tspec_M0_transparency;
144 static int hf_rsvp_sender_tspec_M1_transparency;
145 static int hf_rsvp_flowspec_standard_contiguous_concatenation;
146 static int hf_rsvp_flowspec_arbitrary_contiguous_concatenation;
147 static int hf_rsvp_flowspec_regenerator_section;
148 static int hf_rsvp_flowspec_multiplex_section;
149 static int hf_rsvp_flowspec_J0_transparency;
150 static int hf_rsvp_flowspec_SOH_RSOH_DCC_transparency;
151 static int hf_rsvp_flowspec_LOH_MSOH_DCC_transparency;
152 static int hf_rsvp_flowspec_LOH_MSOH_extended_DCC_transparency;
153 static int hf_rsvp_flowspec_K1_K2_transparency;
154 static int hf_rsvp_flowspec_E1_transparency;
155 static int hf_rsvp_flowspec_F1_transparency;
156 static int hf_rsvp_flowspec_E2_transparency;
157 static int hf_rsvp_flowspec_B1_transparency;
158 static int hf_rsvp_flowspec_B2_transparency;
159 static int hf_rsvp_flowspec_M0_transparency;
160 static int hf_rsvp_flowspec_M1_transparency;
161 static int hf_rsvp_integrity_flags_handshake;
162 static int hf_rsvp_sa_flags_local;
163 static int hf_rsvp_sa_flags_label;
164 static int hf_rsvp_sa_flags_se_style;
165 static int hf_rsvp_sa_flags_bandwidth;
166 static int hf_rsvp_sa_flags_node;
167 static int hf_rsvp_rro_flags_local_avail;
168 static int hf_rsvp_rro_flags_local_in_use;
169 static int hf_rsvp_rro_flags_bandwidth;
170 static int hf_rsvp_rro_flags_node;
171 static int hf_rsvp_rro_flags_node_address;
172 static int hf_rsvp_rro_flags_backup_tunnel_bandwidth;
173 static int hf_rsvp_rro_flags_backup_tunnel_hop;
174 static int hf_rsvp_rro_flags_global_label;
175 static int hf_rsvp_lsp_attr;
176 static int hf_rsvp_lsp_attr_e2e;
177 static int hf_rsvp_lsp_attr_boundary;
178 static int hf_rsvp_lsp_attr_segment;
179 static int hf_rsvp_lsp_attr_integrity;
180 static int hf_rsvp_lsp_attr_contiguous;
181 static int hf_rsvp_lsp_attr_stitching;
182 static int hf_rsvp_lsp_attr_preplanned;
183 static int hf_rsvp_lsp_attr_nophp;
184 static int hf_rsvp_lsp_attr_oobmap;
185 static int hf_rsvp_lsp_attr_entropy;
186 static int hf_rsvp_lsp_attr_oammep;
187 static int hf_rsvp_lsp_attr_oammip;
188 static int hf_rsvp_lsp_attr_loopback;
189 static int hf_rsvp_lsp_attr_p2mp;
190 static int hf_rsvp_lsp_attr_rtm;
191 static int hf_rsvp_lsp_attr_lsi;
192 static int hf_rsvp_lsp_attr_lsids2e;
193 static int hf_rsvp_lsp_attr_telinklabel;
194 static int hf_rsvp_lsp_attr_srlgcollect;
195 static int hf_rsvp_gen_uni_direction;
196 static int hf_rsvp_protection_info_flags_secondary_lsp;
197 static int hf_rsvp_pi_link_flags_extra_traffic;
198 static int hf_rsvp_pi_link_flags_unprotected;
199 static int hf_rsvp_pi_link_flags_shared;
200 static int hf_rsvp_pi_link_flags_dedicated1_1;
201 static int hf_rsvp_pi_link_flags_dedicated1plus1;
202 static int hf_rsvp_pi_link_flags_enhanced;
203 static int hf_rsvp_pi_link_flags_extra;
204 static int hf_rsvp_pi_link_flags_dedicated_1_1;
205 static int hf_rsvp_pi_link_flags_dedicated_1plus1;
206 static int hf_rsvp_rfc4872_secondary;
207 static int hf_rsvp_rfc4872_protecting;
208 static int hf_rsvp_rfc4872_notification_msg;
209 static int hf_rsvp_rfc4872_operational;
210 static int hf_rsvp_pi_lsp_flags_full_rerouting;
211 static int hf_rsvp_pi_lsp_flags_rerouting_extra;
212 static int hf_rsvp_pi_lsp_flags_1_n_protection;
213 static int hf_rsvp_pi_lsp_flags_1plus1_unidirectional;
214 static int hf_rsvp_pi_lsp_flags_1plus1_bidirectional;
215 static int hf_rsvp_protection_info_in_place;
216 static int hf_rsvp_protection_info_required;
217 static int hf_rsvp_pi_seg_flags_full_rerouting;
218 static int hf_rsvp_pi_seg_flags_rerouting_extra;
219 static int hf_rsvp_pi_seg_flags_1_n_protection;
220 static int hf_rsvp_pi_seg_flags_1plus1_unidirectional;
221 static int hf_rsvp_pi_seg_flags_1plus1_bidirectional;
222 static int hf_rsvp_frr_flags_one2one_backup;
223 static int hf_rsvp_frr_flags_facility_backup;
224 static int hf_rsvp_type;
225 static int hf_rsvp_3gpp_obj_tid;
226 static int hf_rsvp_3gpp_obj_ie_len;
227 static int hf_rsvp_3gpp_obj_ie_type;
228 static int hf_rsvp_3gpp_obj_ue_ipv4_addr;
229 static int hf_rsvp_3gpp_obj_ue_ipv6_addr;
230 static int hf_rsvp_3gpp_obj_tft_d;
231 static int hf_rsvp_3gpp_obj_tft_ns;
232 static int hf_rsvp_3gpp_obj_tft_sr_id;
233 static int hf_rsvp_3gpp_obj_tft_p;
234 static int hf_rsvp_3gpp_obj_tft_opcode;
235 static int hf_rsvp_3gpp_obj_tft_n_pkt_flt;
236 static int hf_rsvp_3gpp_obj_flow_id;
237 static int hf_rsvp_3gpp_obj_pf_ev_prec;
238 static int hf_rsvp_3gpp_obj_pf_len;
239 static int hf_rsvp_3gpp_obj_pf_type;
240 static int hf_rsvp_3gpp_obj_pf_cont_len;
241 static int hf_rsvp_3gpp_obj_pf_comp_type_id;
242 static int hf_rsvp_3gpp_obj_pf_src_ipv4;
243 static int hf_rsvp_3gpp_obj_pf_dst_ipv4;
244 static int hf_rsvp_3gpp_obj_pf_ipv4_mask;
245 static int hf_rsvp_3gpp_obj_pf_src_ipv6;
246 static int hf_rsvp_3gpp_obj_pf_dst_ipv6;
247 static int hf_rsvp_3gpp_obj_pf_ipv6_prefix_length;
248 static int hf_rsvp_3gpp_obj_pf_prot_next;
249 static int hf_rsvp_3gpp_obj_pf_dst_port;
250 static int hf_rsvp_3gpp_obj_pf_src_port;
251 static int hf_rsvp_3gpp_obj_pf_ipsec_spi;
252 static int hf_rsvp_3gpp_obj_pf_tos_tc;
253 static int hf_rsvp_3gpp_obj_pf_flow_lbl;
254 static int hf_rsvp_3gpp_obj_pf_ipv6;
255 static int hf_rsvp_3gpp_obj_pf_treatment;
256 static int hf_rsvp_3gpp_obj_pf_hint;
257 static int hf_rsvp_3gpp_obj_tft_qos_list_len;
258 static int hf_rsvp_3gpp_r_qos_blob_len;
259 static int hf_rsvp_3gpp_r_qos_blob_flow_pri;
260 static int hf_rsvp_3gpp_r_qos_blob_num_qos_att_set;
261 static int hf_rsvp_3gpp_qos_att_set_len;
262 static int hf_rsvp_3gpp_qos_attribute_set_id;
263 static int hf_rsvp_3gpp_qos_attribute_verbose;
264 static int hf_rsvp_3gpp_qos_attribute_prof_id;
265 static int hf_rsvp_3gpp_qos_attribute_traff_cls;
266 static int hf_rsvp_3gpp_qos_attribute_peak_rate;
267 static int hf_rsvp_3gpp_qos_attribute_bucket_size;
268 static int hf_rsvp_3gpp_qos_attribute_token_rate;
269 static int hf_rsvp_3gpp_qos_attribute_max_latency;
270 static int hf_rsvp_3gpp_qos_attribute_max_loss_rte;
271 static int hf_rsvp_3gpp_qos_attribute_delay_var_sensitive;
272 static int hf_rsvp_3gpp_qos_attribute_reserved;
273 static int hf_rsvp_3gpp_r_qos_blob;
274 static int hf_rsvp_3gpp_qos_result;
275 static int hf_rsvp_xro_sobj_lbit;
276 static int hf_rsvp_rro_sobj_dbit;
277 static int hf_rsvp_xro_sobj_len;
278 static int hf_rsvp_xro_sobj_ipv4_addr;
279 static int hf_rsvp_xro_sobj_ipv4_prefix;
280 static int hf_rsvp_xro_sobj_ipv4_attr;
281 static int hf_rsvp_xro_sobj_ipv6_attr;
282 static int hf_rsvp_xro_sobj_srlg_id;
283 static int hf_rsvp_xro_sobj_srlg_res;
284 static int hf_rsvp_private_data;
285 static int hf_rsvp_juniper_numtlvs;
286 static int hf_rsvp_juniper_padlength;
287 static int hf_rsvp_juniper_type;
288 static int hf_rsvp_juniper_length;
289 static int hf_rsvp_juniper_attrib_cos;
290 static int hf_rsvp_juniper_attrib_metric1;
291 static int hf_rsvp_juniper_attrib_metric2;
292 static int hf_rsvp_juniper_attrib_ccc_status;
293 static int hf_rsvp_juniper_attrib_path;
294 static int hf_rsvp_juniper_attrib_unknown;
295 static int hf_rsvp_juniper_unknown;
296 static int hf_rsvp_juniper_pad;
297 static int hf_rsvp_unknown_data;
298 static int hf_rsvp_ctype;
299 static int hf_rsvp_ctype_session;
300 static int hf_rsvp_ctype_scope;
301 static int hf_rsvp_ctype_label_request;
302 static int hf_rsvp_ctype_integrity;
303 static int hf_rsvp_ctype_adspec;
304 static int hf_rsvp_ctype_tspec;
305 static int hf_rsvp_ctype_call_id;
306 static int hf_rsvp_ctype_template;
307 static int hf_rsvp_ctype_style;
308 static int hf_rsvp_ctype_policy;
309 static int hf_rsvp_ctype_error;
310 static int hf_rsvp_ctype_attribute;
311 static int hf_rsvp_ctype_explicit_route;
312 static int hf_rsvp_ctype_secondary_explicit_route;
313 static int hf_rsvp_ctype_flowspec;
314 static int hf_rsvp_ctype_hop;
315 static int hf_rsvp_ctype_confirm;
316 static int hf_rsvp_ctype_time_values;
317 static int hf_rsvp_ctype_record_route;
318 static int hf_rsvp_ctype_secondary_record_route;
319 static int hf_rsvp_ctype_exclude_route;
320 static int hf_rsvp_ctype_message_id;
321 static int hf_rsvp_ctype_message_id_ack;
322 static int hf_rsvp_ctype_message_id_list;
323 static int hf_rsvp_ctype_hello;
324 static int hf_rsvp_ctype_dclass;
325 static int hf_rsvp_ctype_admin_status;
326 static int hf_rsvp_ctype_lsp_attributes;
327 static int hf_rsvp_ctype_label_set;
328 static int hf_rsvp_ctype_association;
329 static int hf_rsvp_ctype_tunnel_if_id;
330 static int hf_rsvp_ctype_3gpp_object;
331 static int hf_rsvp_ctype_restart_cap;
332 static int hf_rsvp_ctype_link_cap;
333 static int hf_rsvp_ctype_capability;
334 static int hf_rsvp_ctype_protection_info;
335 static int hf_rsvp_ctype_fast_reroute;
336 static int hf_rsvp_ctype_detour;
337 static int hf_rsvp_ctype_diffserv;
338 static int hf_rsvp_ctype_diffserv_aware_te;
339 static int hf_rsvp_ctype_vendor;
340 static int hf_rsvp_ctype_juniper;
341 static int hf_rsvp_ctype_unknown;
342 static int hf_rsvp_ctype_label;
343 static int hf_rsvp_ctype_notify_request;
344 static int hf_rsvp_ctype_generalized_uni;
345 static int hf_rsvp_parameter;
346 static int hf_rsvp_parameter_flags;
347 static int hf_rsvp_parameter_length;
348 static int hf_rsvp_error_value;
349 static int hf_rsvp_class;
350 static int hf_rsvp_class_length;
351 static int hf_rsvp_reserved;
352 static int hf_rsvp_switching_granularity;
353 static int hf_rsvp_callid_srcaddr_ether;
354 static int hf_rsvp_callid_srcaddr_bytes;
355 static int hf_rsvp_loose_hop;
356 static int hf_rsvp_data_length;
358 static int hf_rsvp_ctype_s2l_sub_lsp;
359 static int hf_rsvp_s2l_sub_lsp_destination_ipv4_address;
360 static int hf_rsvp_s2l_sub_lsp_destination_ipv6_address;
361 static int hf_rsvp_s2l_sub_lsp_data;
363 /* Generated from convert_proto_tree_add_text.pl */
364 static int hf_rsvp_message_id_data;
365 static int hf_rsvp_ero_rro_subobjects_length;
366 static int hf_rsvp_fast_reroute_hop_limit;
367 static int hf_rsvp_lsp_tunnel_if_id_router_id;
368 static int hf_rsvp_ero_rro_subobjects_path_key;
369 static int hf_rsvp_ifid_tlv_area;
370 static int hf_rsvp_session_attribute_include_any;
371 static int hf_rsvp_lsp_tunnel_if_id_sc_pc_scn_address;
372 static int hf_rsvp_ero_rro_subobjects_ipv6_hop;
373 static int hf_rsvp_lsp_tunnel_if_id_ipv6_interface_address;
374 static int hf_rsvp_lsp_tunnel_if_id_component_link_identifier_ipv4;
375 static int hf_rsvp_ifid_tlvinterface_id;
376 static int hf_rsvp_eth_tspec_cir;
377 static int hf_rsvp_confirm_receiver_address_ipv6;
378 static int hf_rsvp_error_error_node_ipv6;
379 static int hf_rsvp_time_values_data;
380 static int hf_rsvp_flowspec_rate;
381 static int hf_rsvp_session_attribute_hold_priority;
382 static int hf_rsvp_notify_request_notify_node_address_ipv4;
383 static int hf_rsvp_lsp_tunnel_if_id_action;
384 static int hf_rsvp_scope_data;
385 static int hf_rsvp_label_request_l3pid;
386 static int hf_rsvp_eth_tspec_index;
387 static int hf_rsvp_integrity_sequence_number;
388 static int hf_rsvp_adspec_message_format_version;
389 static int hf_rsvp_fast_reroute_setup_priority;
390 static int hf_rsvp_eth_tspec_reserved;
391 static int hf_rsvp_eth_tspec_el2cp;
392 static int hf_rsvp_eth_tspec_il2cp;
393 static int hf_rsvp_fast_reroute_include_all;
394 static int hf_rsvp_association_routing_area_id;
395 static int hf_rsvp_label_label;
396 static int hf_rsvp_session_attribute_include_all;
397 static int hf_rsvp_flowspec_token_bucket_rate;
398 static int hf_rsvp_call_id_address_type;
399 static int hf_rsvp_session_attribute_name_length;
400 static int hf_rsvp_detour_data;
401 static int hf_rsvp_association_node_id;
402 static int hf_rsvp_ifid_tlv_length;
403 static int hf_rsvp_flags;
404 static int hf_rsvp_tspec_message_format_version;
405 static int hf_rsvp_ifid_tlv_ipv4_address;
406 static int hf_rsvp_hop_data;
407 static int hf_rsvp_ifid_tlv_data;
408 static int hf_rsvp_length;
409 static int hf_rsvp_ero_rro_subobjects_pce_id_ipv6;
410 static int hf_rsvp_association_data;
411 static int hf_rsvp_tspec_number_of_multiplexed_components;
412 static int hf_rsvp_session_attribute_setup_priority;
413 static int hf_rsvp_message_id_flags;
414 static int hf_rsvp_hop_logical_interface;
415 static int hf_rsvp_compression_factor;
416 static int hf_rsvp_ero_rro_subobjects_private_data;
417 static int hf_rsvp_lsp_attributes_tlv_data;
418 static int hf_rsvp_flowspec_token_bucket_size;
419 static int hf_rsvp_call_id_data;
420 static int hf_rsvp_template_filter_source_address_ipv6;
421 static int hf_rsvp_message_id_ack_flags;
422 static int hf_rsvp_flowspec_multiplier;
423 static int hf_rsvp_tspec_token_bucket_size;
424 static int hf_rsvp_admin_status_bits;
425 static int hf_rsvp_admin_status_data;
426 static int hf_rsvp_tspec_peak_data_rate;
427 static int hf_rsvp_flowspec_number_of_virtual_components;
428 static int hf_rsvp_hop_neighbor_address_ipv6;
429 static int hf_rsvp_flowspec_signal_type_sonet;
430 static int hf_rsvp_ifid_tlv_autonomous_system;
431 static int hf_rsvp_scope_ipv6_address;
432 static int hf_rsvp_flowspec_service_header;
433 static int hf_rsvp_tspec_hint;
434 static int hf_rsvp_label_set_action;
435 static int hf_rsvp_error_data;
436 static int hf_rsvp_style_flags;
437 static int hf_rsvp_g_pid;
438 static int hf_rsvp_integrity_key_identifier;
439 static int hf_rsvp_adspec_service_header;
440 static int hf_rsvp_ifid_tlv_error_string;
441 static int hf_rsvp_session_destination_address;
442 static int hf_rsvp_ifid_tlv_node_id;
443 static int hf_rsvp_lsp_tunnel_if_id_component_link_identifier;
444 static int hf_rsvp_call_id_international_segment;
445 static int hf_rsvp_fast_reroute_include_any;
446 static int hf_rsvp_label_request_min_vci;
447 static int hf_rsvp_tspec_profile;
448 static int hf_rsvp_eth_tspec_length;
449 static int hf_rsvp_exclude_route_data;
450 static int hf_rsvp_record_route_data;
451 static int hf_rsvp_secondary_record_route_data;
452 static int hf_rsvp_confirm_receiver_address_ipv4;
453 static int hf_rsvp_message_id_list_message_id;
454 static int hf_rsvp_template_filter_ipv4_tunnel_sender_address;
455 static int hf_rsvp_template_filter_ipv6_tunnel_sender_address;
456 static int hf_rsvp_template_filter_sub_group_originator_id;
457 static int hf_rsvp_template_filter_sub_group_id;
458 static int hf_rsvp_template_filter_data;
459 static int hf_rsvp_notify_request_notify_node_address_ipv6;
460 static int hf_rsvp_message_id_ack_data;
461 static int hf_rsvp_eth_tspec_profile;
462 static int hf_rsvp_label_request_max_vpi;
463 static int hf_rsvp_ero_rro_subobjects_private_length;
464 static int hf_rsvp_fast_reroute_exclude_any;
465 static int hf_rsvp_lsp_tunnel_if_id_data;
466 static int hf_rsvp_hello_destination_instance;
467 static int hf_rsvp_tspec_signal_type_g709;
468 static int hf_rsvp_call_id_reserved;
469 static int hf_rsvp_version;
470 static int hf_rsvp_association_source_ipv6;
471 static int hf_rsvp_ero_rro_subobjects_flags;
472 static int hf_rsvp_lsp_tunnel_if_id_lsp_encoding_type;
473 static int hf_rsvp_association_type;
474 static int hf_rsvp_tspec_data;
475 static int hf_rsvp_session_destination_port;
476 static int hf_rsvp_association_id;
477 static int hf_rsvp_integrity_hash;
478 static int hf_rsvp_flowspec_number_of_contiguous_components;
479 static int hf_rsvp_policy_data;
480 static int hf_rsvp_tspec_token_bucket_rate;
481 static int hf_rsvp_tspec_multiplier;
482 static int hf_rsvp_dclass_dscp;
483 static int hf_rsvp_tspec_number_of_contiguous_components;
484 static int hf_rsvp_session_p2mp_id;
485 static int hf_rsvp_session_data;
486 static int hf_rsvp_lsp_tunnel_if_id_target_igp_instance;
487 static int hf_rsvp_flowspec_profile;
488 static int hf_rsvp_message_id_ack_epoch;
489 static int hf_rsvp_hello_source_instance;
490 static int hf_rsvp_scope_ipv4_address;
491 static int hf_rsvp_label_request_lsp_encoding_type;
492 static int hf_rsvp_fast_reroute_hold_priority;
493 static int hf_rsvp_label_request_max_vci;
494 static int hf_rsvp_fast_reroute_flags;
495 static int hf_rsvp_flowspec_peak_data_rate;
496 static int hf_rsvp_ero_rro_subobjects_label;
497 static int hf_rsvp_notify_request_data;
498 static int hf_rsvp_lsp_tunnel_if_id_connection_id;
499 static int hf_rsvp_eth_tspec_ebs;
500 static int hf_rsvp_fast_reroute_data;
501 static int hf_rsvp_label_request_min_vpi;
502 static int hf_rsvp_session_attribute_data;
503 static int hf_rsvp_protection_info_data;
504 static int hf_rsvp_tspec_transparency;
505 static int hf_rsvp_ifid_tlv_label;
506 static int hf_rsvp_session_extended_ipv4_address;
507 static int hf_rsvp_diffserv_aware_te_data;
508 static int hf_rsvp_lsp_tunnel_if_id_signal_type;
509 static int hf_rsvp_ero_rro_subobjects_pce_id_ipv4;
510 static int hf_rsvp_error_error_node_ipv4;
511 static int hf_rsvp_session_protocol;
512 static int hf_rsvp_tspec_signal_type_sonet;
513 static int hf_rsvp_session_attribute_flags;
514 static int hf_rsvp_ero_rro_subobjects_router_id;
515 static int hf_rsvp_message_id_list_data;
516 static int hf_rsvp_style_style;
517 static int hf_rsvp_tspec_number_of_virtual_components;
518 static int hf_rsvp_tspec_mtu;
519 static int hf_rsvp_lsp_tunnel_if_id_length;
520 static int hf_rsvp_ifid_tlv_ipv6_address;
521 static int hf_rsvp_diffserv_data;
522 static int hf_rsvp_session_flags;
523 static int hf_rsvp_flowspec_transparency;
524 static int hf_rsvp_dclass_data;
525 static int hf_rsvp_lsp_tunnel_if_id_interface_id;
526 static int hf_rsvp_lsp_tunnel_if_id_sc_pc_id;
527 static int hf_rsvp_error_error_code;
528 static int hf_rsvp_lsp_tunnel_if_id_ipv4_interface_address;
529 static int hf_rsvp_session_attribute_exclude_any;
530 static int hf_rsvp_sending_ttl;
531 static int hf_rsvp_integrity_flags;
532 static int hf_rsvp_message_id_ack_message_id;
533 static int hf_rsvp_message_id_message_id;
534 static int hf_rsvp_ero_rro_subobjects_interface_id;
535 static int hf_rsvp_message_length;
536 static int hf_rsvp_message_id_epoch;
537 static int hf_rsvp_flowspec_signal_type_g709;
538 static int hf_rsvp_label_request_data;
539 static int hf_rsvp_restart_cap_data;
540 static int hf_rsvp_link_cap_data;
541 static int hf_rsvp_capability_flags;
542 static int hf_rsvp_capability_flags_reserved;
543 static int hf_rsvp_capability_flags_i;
544 static int hf_rsvp_capability_flags_f;
545 static int hf_rsvp_capability_flags_t;
546 static int hf_rsvp_capability_flags_r;
547 static int hf_rsvp_capability_flags_s;
548 static int hf_rsvp_capability_data;
549 static int hf_rsvp_lsp_attributes_tlv;
550 static int hf_rsvp_flowspec_mtu;
551 static int hf_rsvp_flowspec_m;
552 static int hf_rsvp_tspec_service_header;
553 static int hf_rsvp_eth_tspec_cbs;
554 static int hf_rsvp_call_id_national_segment;
555 static int hf_rsvp_template_filter_source_port;
556 static int hf_rsvp_eth_tspec_eir;
557 static int hf_rsvp_ero_rro_subobjects_ipv4_hop;
558 static int hf_rsvp_lsp_tunnel_if_id_switching_type;
559 static int hf_rsvp_flowspec_number_of_multiplexed_components;
560 static int hf_rsvp_label_request_switching_type;
561 static int hf_rsvp_ero_rro_subobjects_prefix_length;
562 static int hf_rsvp_explicit_route_data;
563 static int hf_rsvp_secondary_explicit_route_data;
564 static int hf_rsvp_association_source_ipv4;
565 static int hf_rsvp_call_id_local_identifier;
566 static int hf_rsvp_flowspec_message_format_version;
567 static int hf_rsvp_tspec_requested_concatenation;
568 static int hf_rsvp_association_padding;
569 static int hf_rsvp_hop_neighbor_address_ipv4;
570 static int hf_rsvp_flowspec_requested_concatenation;
571 static int hf_rsvp_fast_reroute_bandwidth;
572 static int hf_rsvp_message_id_list_epoch;
573 static int hf_rsvp_style_data;
574 static int hf_rsvp_session_dscp;
575 static int hf_rsvp_confirm_data;
576 static int hf_rsvp_protection_info_link_flags;
577 static int hf_rsvp_message_id_list_flags;
578 static int hf_rsvp_label_data;
579 static int hf_rsvp_flowspec_slack_term;
580 static int hf_rsvp_label_generalized_label;
581 static int hf_rsvp_label_generalized_label_evpl_vlad_id;
582 static int hf_rsvp_session_attribute_name;
583 static int hf_rsvp_ifid_tlv_padding;
584 static int hf_rsvp_max_dlci;
585 static int hf_rsvp_minimum_policed_unit;
586 static int hf_rsvp_dlci_length;
587 static int hf_rsvp_label_request_m;
588 static int hf_rsvp_detour_avoid_node_id;
589 static int hf_rsvp_restart_cap_restart_time;
590 static int hf_rsvp_nsap_length;
591 static int hf_rsvp_message_checksum;
592 static int hf_rsvp_ero_rro_autonomous_system;
593 static int hf_rsvp_gen_uni_service_level;
594 static int hf_rsvp_hf_rsvp_adspec_break_bit;
595 static int hf_rsvp_extended_tunnel_id;
596 static int hf_rsvp_extended_tunnel_ipv6;
597 static int hf_rsvp_maximum_packet_size;
598 static int hf_rsvp_min_dlci;
599 static int hf_rsvp_gen_uni_data;
600 static int hf_rsvp_gen_uni_logical_port_id;
601 static int hf_rsvp_refresh_interval;
602 static int hf_rsvp_detour_plr_id;
603 static int hf_rsvp_restart_cap_recovery_time;
604 static int hf_rsvp_extended_tunnel;
605 static int hf_rsvp_call_attributes_endpont_id;
606 static int hf_rsvp_isis_area_id;
607 static int hf_rsvp_adspec_type;
608 static int hf_rsvp_adspec_len;
609 static int hf_rsvp_adspec_uint;
610 static int hf_rsvp_adspec_float;
611 static int hf_rsvp_adspec_bytes;
612 static int hf_rsvp_wavelength_grid;
613 static int hf_rsvp_wavelength_cs1;
614 static int hf_rsvp_wavelength_cs2;
615 static int hf_rsvp_wavelength_cs3;
616 static int hf_rsvp_wavelength_channel_spacing;
617 static int hf_rsvp_wavelength_n;
618 static int hf_rsvp_wavelength_m;
619 static int hf_rsvp_wavelength_freq;
620 static int hf_rsvp_wavelength_wavelength;
621 static int hf_rsvp_sonet_s;
622 static int hf_rsvp_sonet_u;
623 static int hf_rsvp_sonet_k;
624 static int hf_rsvp_sonet_l;
625 static int hf_rsvp_sonet_m;
626 static int hf_rsvp_g709_t3;
627 static int hf_rsvp_g709_t2;
628 static int hf_rsvp_g709_t1;
629 static int hf_rsvp_label_set_type;
630 static int hf_rsvp_label_set_subchannel;
631 static int hf_rsvp_nsap_address;
632 static int hf_rsvp_class_diversity;
633 static int hf_rsvp_egress_label_type;
634 static int hf_rsvp_egress_label;
635 static int hf_rsvp_source_transport_network_addr;
636 static int hf_rsvp_ie_data;
637 static int hf_rsvp_3gpp_obj_pf_dst_port_range;
638 static int hf_rsvp_3gpp_obj_pf_src_port_range;
640 static expert_field ei_rsvp_invalid_length;
641 static expert_field ei_rsvp_packet_filter_component;
642 static expert_field ei_rsvp_bundle_component_msg;
643 static expert_field ei_rsvp_parameter;
644 static expert_field ei_rsvp_adspec_type;
645 static expert_field ei_rsvp_call_id_address_type;
646 static expert_field ei_rsvp_session_type;
648 static int rsvp_tap;
651 * All RSVP packets belonging to a particular flow belong to the same
652 * conversation. The following structure definitions are for auxiliary
653 * structures which have all the relevant flow information to make up the
654 * RSVP five-tuple. Note that the values of the five-tuple are determined
655 * from the session object and sender template/filter spec for PATH/RESV
656 * messages.
657 * Update rsvp_request_equal() when you add stuff here. You might also
658 * have to update rsvp_request_hash().
659 * TODO: Support for IPv6 conversations.
662 typedef struct rsvp_session_ipv4_info {
663 address destination;
664 uint8_t protocol;
665 uint16_t udp_dest_port;
666 } rsvp_session_ipv4_info;
668 typedef struct rsvp_session_ipv6_info {
669 /* not supported yet */
671 uint8_t dummy;
672 } rsvp_session_ipv6_info;
674 typedef struct rsvp_session_ipv4_lsp_info {
675 address destination;
676 uint16_t udp_dest_port;
677 uint32_t ext_tunnel_id;
678 } rsvp_session_ipv4_lsp_info;
680 typedef struct rsvp_session_ipv6_lsp_info {
681 address destination;
682 uint16_t udp_dest_port;
683 uint64_t ext_tunnel_id;
684 } rsvp_session_ipv6_lsp_info;
686 typedef struct rsvp_session_agg_ipv4_info {
687 address destination;
688 uint8_t dscp;
689 } rsvp_session_agg_ipv4_info;
691 typedef struct rsvp_session_ipv4_uni_info {
692 address destination;
693 uint16_t udp_dest_port;
694 uint32_t ext_tunnel_id;
695 } rsvp_session_ipv4_uni_info;
697 typedef struct rsvp_session_ipv4_p2mp_lsp_info {
698 address destination;
699 uint16_t udp_dest_port;
700 uint32_t ext_tunnel_id;
701 } rsvp_session_ipv4_p2mp_lsp_info;
703 typedef struct rsvp_session_ipv6_p2mp_lsp_info {
704 address destination;
705 uint16_t udp_dest_port;
706 uint64_t ext_tunnel_id;
707 } rsvp_session_ipv6_p2mp_lsp_info;
709 typedef struct rsvp_session_ipv4_enni_info {
710 address destination;
711 uint16_t udp_dest_port;
712 uint32_t ext_tunnel_id;
713 } rsvp_session_ipv4_enni_info;
715 typedef struct rsvp_template_filter_info {
716 address source;
717 uint16_t udp_source_port;
718 } rsvp_template_filter_info;
721 * The actual request key consists of a union of the various session objects
722 * (which are uniquely identified based on the session type), and the
723 * source_info structure, which has the information derived from the sender
724 * template or the filter spec.
725 * The request key is populated by copying the information from the
726 * rsvp_conversation_info structure (rsvph), which in turn is populated when
727 * the session, filter and sender template objects are dissected.
729 struct rsvp_request_key {
730 uint32_t session_type;
732 union { /* differentiated by session_type field */
733 rsvp_session_ipv4_info session_ipv4;
734 rsvp_session_ipv6_info session_ipv6;
735 rsvp_session_ipv4_lsp_info session_ipv4_lsp;
736 rsvp_session_ipv6_lsp_info session_ipv6_lsp;
737 rsvp_session_agg_ipv4_info session_agg_ipv4;
738 rsvp_session_ipv4_uni_info session_ipv4_uni;
739 rsvp_session_ipv4_p2mp_lsp_info session_ipv4_p2mp_lsp;
740 rsvp_session_ipv6_p2mp_lsp_info session_ipv6_p2mp_lsp;
741 rsvp_session_ipv4_enni_info session_ipv4_enni;
742 } u;
744 rsvp_template_filter_info source_info;
745 uint32_t conversation;
749 * At present, there is nothing particularly important that we need to
750 * store for the request value for each rsvp_request_key, so we just
751 * store the unique 32-bit identifier internally allocated for the key
752 * (and stored in the conversation attribute of rsvp_request_key above.
753 * If this changes in the future, then other stuff can be added here.
755 struct rsvp_request_val {
756 uint32_t value;
760 * Initialize the conversation related data structures.
762 static wmem_map_t *rsvp_request_hash;
765 * The list of tree types
767 enum {
768 TT_RSVP,
769 TT_HDR,
770 TT_SESSION,
771 TT_HOP,
772 TT_HOP_SUBOBJ,
773 TT_TIME_VALUES,
774 TT_ERROR,
775 TT_ERROR_SUBOBJ,
776 TT_ERROR_FLAGS,
777 TT_SCOPE,
778 TT_STYLE,
779 TT_CONFIRM,
780 TT_SENDER_TEMPLATE,
781 TT_FILTER_SPEC,
782 TT_TSPEC,
783 TT_TSPEC_SUBTREE,
784 TT_FLOWSPEC,
785 TT_FLOWSPEC_SUBTREE,
786 TT_ETHSPEC_SUBTREE,
787 TT_ADSPEC,
788 TT_ADSPEC_SUBTREE,
789 TT_INTEGRITY,
790 TT_INTEGRITY_FLAGS,
791 TT_DCLASS,
792 TT_LSP_TUNNEL_IF_ID,
793 TT_LSP_TUNNEL_IF_ID_SUBTREE,
794 TT_POLICY,
795 TT_MESSAGE_ID,
796 TT_MESSAGE_ID_ACK,
797 TT_MESSAGE_ID_LIST,
798 TT_LABEL,
799 TT_LABEL_SET,
800 TT_LABEL_REQUEST,
801 TT_SESSION_ATTRIBUTE,
802 TT_SESSION_ATTRIBUTE_FLAGS,
803 TT_HELLO_OBJ,
804 TT_EXPLICIT_ROUTE,
805 TT_EXPLICIT_ROUTE_SUBOBJ,
806 TT_EXCLUDE_ROUTE,
807 TT_EXCLUDE_ROUTE_SUBOBJ,
808 TT_RECORD_ROUTE,
809 TT_RECORD_ROUTE_SUBOBJ,
810 TT_RECORD_ROUTE_SUBOBJ_FLAGS,
811 TT_ADMIN_STATUS,
812 TT_ADMIN_STATUS_FLAGS,
813 TT_LSP_ATTRIBUTES,
814 TT_LSP_ATTRIBUTES_FLAGS,
815 TT_ASSOCIATION,
816 TT_GEN_UNI,
817 TT_GEN_UNI_SUBOBJ,
818 TT_CALL_ID,
819 TT_3GPP2_OBJECT,
820 TT_BUNDLE_COMPMSG,
821 TT_RESTART_CAP,
822 TT_LINK_CAP,
823 TT_CAPABILITY,
824 TT_CAPABILITY_FLAGS,
825 TT_PROTECTION_INFO,
826 TT_PROTECTION_INFO_LINK,
827 TT_PROTECTION_INFO_LSP,
828 TT_PROTECTION_INFO_SEG,
829 TT_FAST_REROUTE,
830 TT_FAST_REROUTE_FLAGS,
831 TT_DETOUR,
832 TT_DIFFSERV,
833 TT_DIFFSERV_MAP,
834 TT_DIFFSERV_MAP_PHBID,
835 TT_CLASSTYPE,
836 TT_PRIVATE_CLASS,
837 TT_JUNIPER,
838 TT_UNKNOWN_CLASS,
839 TT_3GPP_OBJ_FLOW,
840 TT_3GPP_OBJ_QOS,
841 TT_3GPP_OBJ_QOS_SUB_BLOB,
842 TT_3GPP_OBJ_T2,
843 TT_3GPP_OBJ_HO,
844 TT_ADSPEC_TYPE_SUBTREE,
845 TT_WAVELENGTH,
846 TT_SONET_SDH,
847 TT_G709,
848 TT_RSVP_LSP_ATTR,
850 TT_MAX
852 static int ett_treelist[TT_MAX];
853 #define TREE(X) ett_treelist[(X)]
855 /* Should we dissect bundle messages? */
856 static bool rsvp_bundle_dissect = true;
858 /* FF: How should we dissect generalized label? */
859 static const enum_val_t rsvp_generalized_label_options[] = {
860 /* see RFC 3471 Section 3.2.1.2 */
861 { "data", "data (no interpretation)", 1 },
862 /* see RFC 4606 Section 3 */
863 { "SUKLM", "SONET/SDH (\"S, U, K, L, M\" scheme)", 2 },
864 /* see I-D draft-ietf-ccamp-gmpls-g-694-lambda-labels-05 */
865 { "G694", "Wavelength Label (fixed or flexi grid)", 3 },
866 /* see RFC 4328 Section 4.1 */
867 { "G709", "ODUk Label", 4 },
868 { NULL, NULL, 0 }
871 static unsigned rsvp_generalized_label_option = 1;
874 * RSVP message types.
875 * See
877 * http://www.iana.org/assignments/rsvp-parameters
879 typedef enum {
880 RSVP_MSG_PATH = 1, /* RFC 2205 */
881 RSVP_MSG_RESV, /* RFC 2205 */
882 RSVP_MSG_PERR, /* RFC 2205 */
883 RSVP_MSG_RERR, /* RFC 2205 */
884 RSVP_MSG_PTEAR, /* RFC 2205 */
885 RSVP_MSG_RTEAR, /* RFC 2205 */
886 RSVP_MSG_CONFIRM, /* XXX - DREQ, RFC 2745? */
887 /* 9 is DREP, RFC 2745 */
888 RSVP_MSG_RTEAR_CONFIRM = 10, /* from Fred Baker at Cisco */
889 /* 11 is unassigned */
890 RSVP_MSG_BUNDLE = 12, /* RFC 2961 */
891 RSVP_MSG_ACK, /* RFC 2961 */
892 /* 14 is reserved */
893 RSVP_MSG_SREFRESH = 15, /* RFC 2961 */
894 /* 16, 17, 18, 19 not listed */
895 RSVP_MSG_HELLO = 20, /* RFC 3209 */
896 RSVP_MSG_NOTIFY /* [RFC3473] */
897 /* 25 is Integrity Challenge RFC 2747, RFC 3097 */
898 /* 26 is Integrity Response RFC 2747, RFC 3097 */
899 /* 66 is DSBM_willing [SBM] */
900 /* 67 is I_AM_DSBM [SBM] */
901 /* [SBM] is Subnet Bandwidth Manager ID from July 1997 */
902 } rsvp_message_types;
904 static const value_string message_type_vals[] = {
905 { RSVP_MSG_PATH, "PATH Message. "},
906 { RSVP_MSG_RESV, "RESV Message. "},
907 { RSVP_MSG_PERR, "PATH ERROR Message. "},
908 { RSVP_MSG_RERR, "RESV ERROR Message. "},
909 { RSVP_MSG_PTEAR, "PATH TEAR Message. "},
910 { RSVP_MSG_RTEAR, "RESV TEAR Message. "},
911 { RSVP_MSG_CONFIRM, "CONFIRM Message. "},
912 { RSVP_MSG_RTEAR_CONFIRM, "RESV TEAR CONFIRM Message. "},
913 { RSVP_MSG_BUNDLE, "BUNDLE Message. "},
914 { RSVP_MSG_ACK, "ACK Message. "},
915 { RSVP_MSG_SREFRESH, "SREFRESH Message. "},
916 { RSVP_MSG_HELLO, "HELLO Message. "},
917 { RSVP_MSG_NOTIFY, "NOTIFY Message. "},
918 { 0, NULL}
920 static value_string_ext message_type_vals_ext = VALUE_STRING_EXT_INIT(message_type_vals);
923 * FF: please keep this list in sync with
924 * http://www.iana.org/assignments/rsvp-parameters
925 * Registry Name: 'Class'
927 enum rsvp_classes {
928 RSVP_CLASS_NULL = 0,
929 RSVP_CLASS_SESSION,
931 RSVP_CLASS_HOP = 3,
932 RSVP_CLASS_INTEGRITY,
933 RSVP_CLASS_TIME_VALUES,
934 RSVP_CLASS_ERROR,
935 RSVP_CLASS_SCOPE,
936 RSVP_CLASS_STYLE,
937 RSVP_CLASS_FLOWSPEC,
938 RSVP_CLASS_FILTER_SPEC,
939 RSVP_CLASS_SENDER_TEMPLATE,
940 RSVP_CLASS_SENDER_TSPEC,
941 RSVP_CLASS_ADSPEC,
942 RSVP_CLASS_POLICY,
943 RSVP_CLASS_CONFIRM,
944 RSVP_CLASS_LABEL,
945 RSVP_CLASS_HOP_COUNT,
946 RSVP_CLASS_STRICT_SOURCE_ROUTE,
947 RSVP_CLASS_LABEL_REQUEST = 19,
948 RSVP_CLASS_EXPLICIT_ROUTE,
949 RSVP_CLASS_RECORD_ROUTE,
951 RSVP_CLASS_HELLO,
953 RSVP_CLASS_MESSAGE_ID,
954 RSVP_CLASS_MESSAGE_ID_ACK,
955 RSVP_CLASS_MESSAGE_ID_LIST,
957 /* 26-29 Unassigned */
959 RSVP_CLASS_DIAGNOSTIC = 30,
960 RSVP_CLASS_ROUTE,
961 RSVP_CLASS_DIAG_RESPONSE,
962 RSVP_CLASS_DIAG_SELECT,
963 RSVP_CLASS_RECOVERY_LABEL,
964 RSVP_CLASS_UPSTREAM_LABEL,
965 RSVP_CLASS_LABEL_SET,
966 RSVP_CLASS_PROTECTION,
968 /* 38-41 Unassigned */
969 RSVP_CLASS_DSBM_IP_ADDRESS = 42,
970 RSVP_CLASS_SBM_PRIORITY,
971 RSVP_CLASS_DSBM_TIMER_INTERVALS,
972 RSVP_CLASS_SBM_INFO,
974 /* 46-49 Unassigned */
976 RSVP_CLASS_S2L_SUB_LSP = 50,
978 /* 51-62 Unassigned */
980 RSVP_CLASS_DETOUR = 63,
981 RSVP_CLASS_CHALLENGE,
982 RSVP_CLASS_DIFFSERV,
983 RSVP_CLASS_CLASSTYPE, /* FF: RFC4124 */
984 RSVP_CLASS_LSP_REQUIRED_ATTRIBUTES = 67,
986 /* 68-123 Unassigned */
988 RSVP_CLASS_VENDOR_PRIVATE_1 = 124,
989 RSVP_CLASS_VENDOR_PRIVATE_2 = 125,
990 RSVP_CLASS_VENDOR_PRIVATE_3 = 126,
991 RSVP_CLASS_VENDOR_PRIVATE_4 = 127,
993 RSVP_CLASS_NODE_CHAR = 128,
994 RSVP_CLASS_SUGGESTED_LABEL,
995 RSVP_CLASS_ACCEPTABLE_LABEL_SET,
996 RSVP_CLASS_RESTART_CAP,
997 RSVP_CLASS_LINK_CAP = 133,
998 RSVP_CLASS_CAPABILITY,
1000 /* 135-160 Unassigned */
1002 /* 166-187 Unassigned */
1004 RSVP_CLASS_VENDOR_PRIVATE_5 = 188,
1005 RSVP_CLASS_VENDOR_PRIVATE_6 = 189,
1006 RSVP_CLASS_VENDOR_PRIVATE_7 = 190,
1007 RSVP_CLASS_VENDOR_PRIVATE_8 = 191,
1009 RSVP_CLASS_SESSION_ASSOC = 192,
1010 RSVP_CLASS_LSP_TUNNEL_IF_ID,
1011 /* 194 Unassigned */
1012 RSVP_CLASS_NOTIFY_REQUEST = 195,
1013 RSVP_CLASS_ADMIN_STATUS,
1014 RSVP_CLASS_LSP_ATTRIBUTES,
1015 RSVP_CLASS_ALARM_SPEC,
1016 RSVP_CLASS_ASSOCIATION,
1017 RSVP_CLASS_SECONDARY_EXPLICIT_ROUTE,
1018 RSVP_CLASS_SECONDARY_RECORD_ROUTE,
1019 RSVP_CLASS_CALL_ATTRIBUTES,
1021 /* 203-204 Unassigned */
1023 204 Proprietary Juniper LSP properties
1024 https://www.juniper.net/techpubs/en_US/junos12.1/information-products/topic-collections/nog-mpls-logs/topic-20284.html
1026 RSVP_CLASS_JUNIPER_PROPERTIES = 204,
1027 RSVP_CLASS_FAST_REROUTE = 205,
1028 /* 206 Unassigned */
1029 RSVP_CLASS_SESSION_ATTRIBUTE = 207,
1030 /* 208-223 Unassigned */
1032 Class Numbers 224-255 are assigned by IANA using FCFS allocation.
1033 RSVP will silently ignore, but FORWARD an object with a Class Number
1034 in this range that it does not understand.
1036 /* 224 Unassigned */
1037 RSVP_CLASS_DCLASS = 225,
1038 RSVP_CLASS_PACKETCABLE_EXTENSIONS,
1039 RSVP_CLASS_ATM_SERVICECLASS,
1040 RSVP_CLASS_CALL_OPS,
1041 RSVP_CLASS_GENERALIZED_UNI,
1042 RSVP_CLASS_CALL_ID,
1043 RSVP_CLASS_3GPP2_OBJECT,
1044 RSVP_CLASS_EXCLUDE_ROUTE,
1046 /* 233-251 Unassigned */
1048 RSVP_CLASS_VENDOR_PRIVATE_9 = 252,
1049 RSVP_CLASS_VENDOR_PRIVATE_10 = 253,
1050 RSVP_CLASS_VENDOR_PRIVATE_11 = 254,
1051 RSVP_CLASS_VENDOR_PRIVATE_12 = 255
1054 /* XXX: are any/all of the "missing" values below supposed to have value-strings */
1055 static const value_string rsvp_class_vals[] = {
1056 { RSVP_CLASS_NULL, "NULL object"},
1057 { RSVP_CLASS_SESSION, "SESSION object"},
1059 { RSVP_CLASS_HOP, "HOP object"},
1060 { RSVP_CLASS_INTEGRITY, "INTEGRITY object"},
1061 { RSVP_CLASS_TIME_VALUES, "TIME VALUES object"},
1062 { RSVP_CLASS_ERROR, "ERROR object"},
1063 { RSVP_CLASS_SCOPE, "SCOPE object"},
1064 { RSVP_CLASS_STYLE, "STYLE object"},
1065 { RSVP_CLASS_FLOWSPEC, "FLOWSPEC object"},
1066 { RSVP_CLASS_FILTER_SPEC, "FILTER SPEC object"},
1067 { RSVP_CLASS_SENDER_TEMPLATE, "SENDER TEMPLATE object"},
1068 { RSVP_CLASS_SENDER_TSPEC, "SENDER TSPEC object"},
1069 { RSVP_CLASS_ADSPEC, "ADSPEC object"},
1070 { RSVP_CLASS_POLICY, "POLICY object"},
1071 { RSVP_CLASS_CONFIRM, "CONFIRM object"},
1072 { RSVP_CLASS_LABEL, "LABEL object"},
1073 { RSVP_CLASS_HOP_COUNT, "HOP_COUNT object"},
1074 { RSVP_CLASS_STRICT_SOURCE_ROUTE, "STRICT_SOURCE_ROUTE object"},
1075 { RSVP_CLASS_LABEL_REQUEST, "LABEL REQUEST object"},
1076 { RSVP_CLASS_EXPLICIT_ROUTE, "EXPLICIT ROUTE object"},
1077 { RSVP_CLASS_RECORD_ROUTE, "RECORD ROUTE object"},
1079 { RSVP_CLASS_HELLO, "HELLO object"},
1081 { RSVP_CLASS_MESSAGE_ID, "MESSAGE-ID object"},
1082 { RSVP_CLASS_MESSAGE_ID_ACK, "MESSAGE-ID ACK/NACK object"},
1083 { RSVP_CLASS_MESSAGE_ID_LIST, "MESSAGE-ID LIST object"},
1086 RSVP_CLASS_DIAGNOSTIC
1087 RSVP_CLASS_ROUTE,
1088 RSVP_CLASS_DIAG_RESPONSE,
1089 RSVP_CLASS_DIAG_SELECT,
1092 { RSVP_CLASS_RECOVERY_LABEL, "RECOVERY-LABEL object"},
1093 { RSVP_CLASS_UPSTREAM_LABEL, "UPSTREAM-LABEL object"},
1094 { RSVP_CLASS_LABEL_SET, "LABEL-SET object"},
1095 { RSVP_CLASS_PROTECTION, "PROTECTION object"},
1098 RSVP_CLASS_DSBM_IP_ADDRESS
1099 RSVP_CLASS_SBM_PRIORITY,
1100 RSVP_CLASS_DSBM_TIMER_INTERVALS,
1101 RSVP_CLASS_SBM_INFO,
1103 { RSVP_CLASS_S2L_SUB_LSP, "S2L_SUB_LSP object"},
1104 { RSVP_CLASS_DETOUR, "DETOUR object"},
1106 RSVP_CLASS_CHALLENGE,
1108 { RSVP_CLASS_DIFFSERV, "DIFFSERV object"},
1109 { RSVP_CLASS_CLASSTYPE, "CLASSTYPE object"},
1111 { RSVP_CLASS_LSP_REQUIRED_ATTRIBUTES, "LSP REQUIRED ATTRIBUTES object"},
1114 { RSVP_CLASS_VENDOR_PRIVATE_1, "VENDOR PRIVATE object (0bbbbbbb: "
1115 "reject if unknown)"},
1116 { RSVP_CLASS_VENDOR_PRIVATE_2, "VENDOR PRIVATE object (0bbbbbbb: "
1117 "reject if unknown)"},
1118 { RSVP_CLASS_VENDOR_PRIVATE_3, "VENDOR PRIVATE object (0bbbbbbb: "
1119 "reject if unknown)"},
1120 { RSVP_CLASS_VENDOR_PRIVATE_4, "VENDOR PRIVATE object (0bbbbbbb: "
1121 "reject if unknown)"},
1124 RSVP_CLASS_NODE_CHAR
1126 { RSVP_CLASS_SUGGESTED_LABEL, "SUGGESTED-LABEL object"},
1127 { RSVP_CLASS_ACCEPTABLE_LABEL_SET, "ACCEPTABLE-LABEL-SET object"},
1128 { RSVP_CLASS_RESTART_CAP, "RESTART-CAPABILITY object"},
1129 { RSVP_CLASS_LINK_CAP, "LINK-CAPABILITY object"},
1130 { RSVP_CLASS_CAPABILITY, "Capability object"},
1132 { RSVP_CLASS_VENDOR_PRIVATE_5, "VENDOR PRIVATE object (10bbbbbb: "
1133 "ignore if unknown)"},
1134 { RSVP_CLASS_VENDOR_PRIVATE_6, "VENDOR PRIVATE object (10bbbbbb: "
1135 "ignore if unknown)"},
1136 { RSVP_CLASS_VENDOR_PRIVATE_7, "VENDOR PRIVATE object (10bbbbbb: "
1137 "ignore if unknown)"},
1138 { RSVP_CLASS_VENDOR_PRIVATE_8, "VENDOR PRIVATE object (10bbbbbb: "
1139 "ignore if unknown)"},
1141 RSVP_CLASS_SESSION_ASSOC
1143 { RSVP_CLASS_LSP_TUNNEL_IF_ID, "LSP-TUNNEL INTERFACE-ID object"},
1145 { RSVP_CLASS_NOTIFY_REQUEST, "NOTIFY-REQUEST object"},
1146 { RSVP_CLASS_ADMIN_STATUS, "ADMIN-STATUS object"},
1147 { RSVP_CLASS_LSP_ATTRIBUTES, "LSP ATTRIBUTES object"},
1149 RSVP_CLASS_ALARM_SPEC,
1151 { RSVP_CLASS_ASSOCIATION, "ASSOCIATION object"},
1153 { RSVP_CLASS_SECONDARY_EXPLICIT_ROUTE, "SECONDARY EXPLICIT ROUTE object"},
1154 { RSVP_CLASS_SECONDARY_RECORD_ROUTE, "SECONDARY RECORD ROUTE object"},
1156 { RSVP_CLASS_CALL_ATTRIBUTES, "CALL ATTRIBUTES object"},
1158 { RSVP_CLASS_JUNIPER_PROPERTIES, "Juniper properties object"},
1159 { RSVP_CLASS_FAST_REROUTE, "FAST-REROUTE object"},
1161 { RSVP_CLASS_SESSION_ATTRIBUTE, "SESSION ATTRIBUTE object"},
1163 { RSVP_CLASS_DCLASS, "DCLASS object"},
1165 RSVP_CLASS_PACKETCABLE_EXTENSIONS,
1166 RSVP_CLASS_ATM_SERVICECLASS,
1167 RSVP_CLASS_CALL_OPS,
1169 { RSVP_CLASS_GENERALIZED_UNI, "GENERALIZED-UNI object"},
1170 { RSVP_CLASS_CALL_ID, "CALL-ID object"},
1171 { RSVP_CLASS_3GPP2_OBJECT, "3GPP2 object"},
1172 { RSVP_CLASS_EXCLUDE_ROUTE, "EXCLUDE ROUTE object"},
1174 { RSVP_CLASS_VENDOR_PRIVATE_9, "VENDOR PRIVATE object (11bbbbbb: "
1175 "forward if unknown)"},
1176 { RSVP_CLASS_VENDOR_PRIVATE_10, "VENDOR PRIVATE object (11bbbbbb: "
1177 "forward if unknown)"},
1178 { RSVP_CLASS_VENDOR_PRIVATE_11, "VENDOR PRIVATE object (11bbbbbb: "
1179 "forward if unknown)"},
1180 { RSVP_CLASS_VENDOR_PRIVATE_12, "VENDOR PRIVATE object (11bbbbbb: "
1181 "forward if unknown)"},
1182 { 0, NULL}
1184 static value_string_ext rsvp_class_vals_ext = VALUE_STRING_EXT_INIT(rsvp_class_vals);
1187 * RSVP error values
1189 enum rsvp_error_types {
1190 RSVP_ERROR_CONFIRM = 0,
1191 RSVP_ERROR_ADMISSION,
1192 RSVP_ERROR_POLICY,
1193 RSVP_ERROR_NO_PATH,
1194 RSVP_ERROR_NO_SENDER,
1195 RSVP_ERROR_CONFLICT_RESV_STYLE,
1196 RSVP_ERROR_UNKNOWN_RESV_STYLE,
1197 RSVP_ERROR_CONFLICT_DEST_PORTS,
1198 RSVP_ERROR_CONFLICT_SRC_PORTS,
1199 /* 9-11 Reserved */
1200 RSVP_ERROR_PREEMPTED =12,
1201 RSVP_ERROR_UNKNOWN_CLASS,
1202 RSVP_ERROR_UNKNOWN_C_TYPE,
1203 /* 15-19 Reserved */
1204 RSVP_ERROR_RES_FOR_API = 20,
1205 RSVP_ERROR_TRAFFIC,
1206 RSVP_ERROR_TRAFFIC_SYSTEM,
1207 RSVP_ERROR_SYSTEM,
1208 RSVP_ERROR_ROUTING,
1209 RSVP_ERROR_NOTIFY,
1210 RSVP_ERROR_NEW_AGGR, /* RFC3175 */
1211 RSVP_ERROR_DIFFSERV,
1212 RSVP_ERROR_DSTE, /* RFC4124 */
1213 RSVP_ERROR_UNKNOWN_ATTR_TLV, /* RFC5420 */
1214 RSVP_ERROR_UNKNOWN_ATTR_BIT, /* RFC5420 */
1215 RSVP_ERROR_ALARMS, /* RFC4783 */
1216 RSVP_ERROR_CALL_MGMT, /* RFC4974 */
1217 RSVP_ERROR_USER_ERROR_SPEC, /* RFC5284 */
1218 RSVP_ERROR_REROUTE, /* RFC5710 */
1219 RSVP_ERROR_HO_PROC_FAIL, /* RFC5852 */
1220 RSVP_ERROR_UNREC_REC_PROXY_ERR, /* RFC5946 */
1221 RSVP_ERROR_RSVP_OVER_MPLS_PROB, /* RFC6016 */
1222 RSVP_ERROR_LSP_HIER_ISSUE, /* RFC6107 */
1223 RSVP_ERROR_VCAT_CALL_MGMT /* RFC6344 */
1227 static const value_string rsvp_error_codes[] = {
1228 { RSVP_ERROR_CONFIRM, "Confirmation"},
1229 { RSVP_ERROR_ADMISSION, "Admission Control Failure "},
1230 { RSVP_ERROR_POLICY, "Policy Control Failure"},
1231 { RSVP_ERROR_NO_PATH, "No PATH information for this RESV message"},
1232 { RSVP_ERROR_NO_SENDER, "No sender information for this RESV message"},
1233 { RSVP_ERROR_CONFLICT_RESV_STYLE, "Conflicting reservation styles"},
1234 { RSVP_ERROR_UNKNOWN_RESV_STYLE, "Unknown reservation style"},
1235 { RSVP_ERROR_CONFLICT_DEST_PORTS, "Conflicting destination ports"},
1236 { RSVP_ERROR_CONFLICT_SRC_PORTS, "Conflicting source ports"},
1237 { RSVP_ERROR_PREEMPTED, "Service preempted"},
1238 { RSVP_ERROR_UNKNOWN_CLASS, "Unknown object class"},
1239 { RSVP_ERROR_UNKNOWN_C_TYPE, "Unknown object C-type"},
1240 { RSVP_ERROR_RES_FOR_API, "Reserved for API"},
1241 { RSVP_ERROR_TRAFFIC, "Traffic Control Error"},
1242 { RSVP_ERROR_TRAFFIC_SYSTEM, "Traffic Control System Error"},
1243 { RSVP_ERROR_SYSTEM, "RSVP System Error"},
1244 { RSVP_ERROR_ROUTING, "Routing Error"},
1245 { RSVP_ERROR_NOTIFY, "RSVP Notify Error"},
1246 { RSVP_ERROR_NEW_AGGR, "New aggregate needed"},
1247 { RSVP_ERROR_DIFFSERV, "RSVP Diff-Serv Error"},
1248 { RSVP_ERROR_DSTE, "RSVP DiffServ-aware TE Error"},
1249 { RSVP_ERROR_UNKNOWN_ATTR_TLV, "Unknown attributes TLV"},
1250 { RSVP_ERROR_UNKNOWN_ATTR_BIT, "Unknown attributes bit"},
1251 { RSVP_ERROR_ALARMS, "Alarms"},
1252 { RSVP_ERROR_CALL_MGMT, "Call management"},
1253 { RSVP_ERROR_USER_ERROR_SPEC, "User error spec"},
1254 { RSVP_ERROR_REROUTE, "Reroute"},
1255 { RSVP_ERROR_HO_PROC_FAIL, "Handover Procedure Failure"},
1256 { RSVP_ERROR_UNREC_REC_PROXY_ERR, "Unrecoverable Receiver Proxy Error"},
1257 { RSVP_ERROR_RSVP_OVER_MPLS_PROB, "RSVP over MPLS Problem"},
1258 { RSVP_ERROR_LSP_HIER_ISSUE, "LSP Hierarchy Issue"},
1259 { RSVP_ERROR_VCAT_CALL_MGMT, "VCAT Call Management"},
1261 { 0, NULL}
1263 static value_string_ext rsvp_error_codes_ext = VALUE_STRING_EXT_INIT(rsvp_error_codes);
1265 static const value_string rsvp_admission_control_error_vals[] = {
1266 { 1, "Delay bound cannot be met"},
1267 { 2, "Requested bandwidth unavailable"},
1268 { 3, "MTU in flowspec larger than interface MTU"},
1269 { 4, "LSP Admission Failure"},
1270 { 5, "Bad Association Type"},
1271 { 0, NULL}
1273 static value_string_ext rsvp_admission_control_error_vals_ext = VALUE_STRING_EXT_INIT(rsvp_admission_control_error_vals);
1275 static const value_string rsvp_policy_control_error_vals[] = {
1276 { 0, "Information reporting"},
1277 { 1, "Warning"},
1278 { 2, "Reason unknown"},
1279 { 3, "Generic Policy Rejection"},
1280 { 4, "Quota or Accounting violation"},
1281 { 5, "Flow was preempted"},
1282 { 6, "Previously installed policy expired (not refreshed)"},
1283 { 7, "Previous policy data was replaced & caused rejection"},
1284 { 8, "Policies could not be merged (multicast)"},
1285 { 9, "PDP down or non functioning"},
1286 { 10, "Third Party Server (e.g., Kerberos) unavailable"},
1287 { 11, "POLICY_DATA object has bad syntax"},
1288 { 12, "POLICY_DATA object failed Integrity Check"},
1289 { 13, "POLICY_ELEMENT object has bad syntax"},
1290 { 14, "Mandatory PE Missing (Empty PE is in the PD object)"},
1291 { 15, "PEP Out of resources to handle policies."},
1292 { 16, "PDP encountered bad RSVP objects or syntax"},
1293 { 17, "Service type was rejected"},
1294 { 18, "Reservation Style was rejected"},
1295 { 19, "FlowSpec was rejected (too large)"},
1296 { 20, "Hard Pre-empted"},
1297 { 21, "SRLG Recording Rejected"},
1298 { 100, "Unauthorized sender"},
1299 { 101, "Unauthorized receiver"},
1300 { 102, "ERR_PARTIAL_PREEMPT"},
1301 { 103, "Inter-domain policy failure"},
1302 { 104, "Inter-domain explicit route rejected"},
1303 { 0, NULL}
1305 static value_string_ext rsvp_policy_control_error_vals_ext = VALUE_STRING_EXT_INIT(rsvp_policy_control_error_vals);
1307 static const value_string rsvp_traffic_control_error_vals[] = {
1308 { 1, "Service conflict"},
1309 { 2, "Service unsupported"},
1310 { 3, "Bad Flowspec value"},
1311 { 4, "Bad Tspec value"},
1312 { 5, "Bad Adspec value"},
1313 { 0, NULL}
1315 static value_string_ext rsvp_traffic_control_error_vals_ext = VALUE_STRING_EXT_INIT(rsvp_traffic_control_error_vals);
1317 static const value_string rsvp_routing_error_vals[] = {
1318 { 1, "Bad EXPLICIT_ROUTE object"},
1319 { 2, "Bad strict node"},
1320 { 3, "Bad loose node"},
1321 { 4, "Bad initial subobject"},
1322 { 5, "No route available toward destination"},
1323 { 6, "Unacceptable label value"},
1324 { 7, "RRO indicated routing loops"},
1325 { 8, "Non-RSVP-capable router stands in the path"},
1326 { 9, "MPLS label allocation failure"},
1327 { 10, "Unsupported L3PID"},
1328 { 11, "Label Set"},
1329 { 12, "Switching Type"},
1330 { 13, "Unassigned"},
1331 { 14, "Unsupported Encoding"},
1332 { 15, "Unsupported Link Protection"},
1333 { 16, "Unknown Interface Index"},
1334 { 17, "Unsupported LSP Protection"},
1335 { 18, "PROTECTION object not applicable"},
1336 { 19, "Bad PRIMARY_PATH_ROUTE object"},
1337 { 20, "PRIMARY_PATH_ROUTE object not applicable"},
1338 { 21, "LSP Segment Protection Failed"},
1339 { 22, "Re-routing limit exceeded"},
1340 { 23, "Unable to Branch"},
1341 { 24, "Unsupported LSP Integrity"},
1342 { 25, "P2MP Re-Merge Detected"},
1343 { 26, "P2MP Re-Merge Parameter Mismatch"},
1344 { 27, "ERO Resulted in Re-Merge"},
1345 { 28, "Contiguous LSP type not supported"},
1346 { 29, "ERO conflicts with inter-domain signaling method"},
1347 { 30, "Stitching unsupported"},
1348 { 31, "Unknown PCE-ID for PKS expansion"},
1349 { 32, "Unreachable PCE for PKS expansion"},
1350 { 33, "Unknown Path Key for PKS expansion"},
1351 { 34, "ERO too large for MTU"},
1352 { 64, "Unsupported Exclude Route Subobject Type"},
1353 { 65, "Inconsistent Subobject"},
1354 { 66, "Local Node in Exclude Route"},
1355 { 67, "Route Blocked by Exclude Route"},
1356 { 68, "XRO Too Complex"},
1357 { 69, "EXRS Too Complex"},
1358 { 100, "Diversity not available"},
1359 { 101, "Service level not available"},
1360 { 102, "Invalid/Unknown connection ID"},
1361 { 103, "No route available toward source (ASON)"},
1362 { 104, "Unacceptable interface ID (ASON)"},
1363 { 105, "Invalid/unknown call ID (ASON)"},
1364 { 106, "Invalid SPC interface ID/label (ASON)"},
1365 { 0, NULL}
1367 static value_string_ext rsvp_routing_error_vals_ext = VALUE_STRING_EXT_INIT(rsvp_routing_error_vals);
1369 static const value_string rsvp_notify_error_vals[] = {
1370 { 1, "RRO too large for MTU"},
1371 { 2, "RRO Notification"},
1372 { 3, "Tunnel locally repaired"},
1373 { 4, "Control Channel Active State"},
1374 { 5, "Control Channel Degraded State"},
1375 { 6, "Preferable path exists"},
1376 { 7, "Link maintenance required"},
1377 { 8, "Node maintenance required"},
1378 { 9, "LSP Failure"},
1379 { 10, "LSP recovered"},
1380 { 11, "LSP Local Failure"},
1381 { 12, "No OOB mapping received"},
1382 { 0, NULL}
1384 static value_string_ext rsvp_notify_error_vals_ext = VALUE_STRING_EXT_INIT(rsvp_notify_error_vals);
1386 static const value_string rsvp_diffserv_error_vals[] = {
1387 { 1, "Unexpected DIFFSERV object"},
1388 { 2, "Unsupported PHB"},
1389 { 3, "Invalid `EXP<->PHB mapping'"},
1390 { 4, "Unsupported PSC"},
1391 { 5, "Per-LSP context allocation failure"},
1392 { 0, NULL}
1394 static value_string_ext rsvp_diffserv_error_vals_ext = VALUE_STRING_EXT_INIT(rsvp_diffserv_error_vals);
1396 /* FF: RFC4124 */
1397 static const value_string rsvp_diffserv_aware_te_error_vals[] = {
1398 { 1, "Unexpected CLASSTYPE object"},
1399 { 2, "Unsupported Class-Type"},
1400 { 3, "Invalid Class-Type value"},
1401 { 4, "CT and setup priority do not form a configured TE-Class"},
1402 { 5, "CT and holding priority do not form a configured TE-Class"},
1403 { 6, "CT and setup priority do not form a configured TE-Class AND CT and holding priority do not form a configured TE-Class"},
1404 { 7, "Inconsistency between signaled PSC and signaled CT"},
1405 { 8, "Inconsistency between signaled PHBs and signaled CT"},
1406 { 0, NULL}
1408 static value_string_ext rsvp_diffserv_aware_te_error_vals_ext = VALUE_STRING_EXT_INIT(rsvp_diffserv_aware_te_error_vals);
1410 static const value_string rsvp_call_mgmt_error_vals[] = {
1411 { 1, "Call ID Contention"},
1412 { 2, "Connections still Exist"},
1413 { 3, "Unknown Call ID"},
1414 { 4, "Duplicate Call"},
1415 { 0, NULL}
1417 static value_string_ext rsvp_call_mgmt_error_vals_ext = VALUE_STRING_EXT_INIT(rsvp_call_mgmt_error_vals);
1420 * Defines the reservation style plus style-specific information that
1421 * is not a FLOWSPEC or FILTER_SPEC object, in a RESV message.
1423 #define RSVP_DISTINCT (1 << 3)
1424 #define RSVP_SHARED (2 << 3)
1425 #define RSVP_SHARING_MASK (RSVP_DISTINCT | RSVP_SHARED)
1427 #define RSVP_SCOPE_WILD 1
1428 #define RSVP_SCOPE_EXPLICIT 2
1429 #define RSVP_SCOPE_MASK 0x07
1431 #define RSVP_WF (RSVP_SHARED | RSVP_SCOPE_WILD)
1432 #define RSVP_FF (RSVP_DISTINCT | RSVP_SCOPE_EXPLICIT)
1433 #define RSVP_SE (RSVP_SHARED | RSVP_SCOPE_EXPLICIT)
1435 static const value_string style_vals[] = {
1436 { RSVP_WF, "Wildcard Filter" },
1437 { RSVP_FF, "Fixed Filter" },
1438 { RSVP_SE, "Shared-Explicit" },
1439 { 0, NULL }
1442 enum {
1443 RSVP_SESSION_TYPE_IPV4 = 1,
1444 RSVP_SESSION_TYPE_IPV6,
1446 RSVP_SESSION_TYPE_IPV4_LSP = 7,
1447 RSVP_SESSION_TYPE_IPV6_LSP,
1449 RSVP_SESSION_TYPE_AGGREGATE_IPV4 = 9,
1450 RSVP_SESSION_TYPE_AGGREGATE_IPV6,
1452 RSVP_SESSION_TYPE_IPV4_UNI = 11,
1454 RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV4 = 13,
1455 RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV6,
1456 RSVP_SESSION_TYPE_IPV4_E_NNI
1460 * Defines a desired QoS, in a RESV message.
1462 enum qos_service_type {
1463 QOS_QUALITATIVE = 128, /* Qualitative service */
1464 QOS_NULL = 6, /* Null service (RFC2997) */
1465 QOS_CONTROLLED_LOAD= 5, /* Controlled Load Service */
1466 QOS_GUARANTEED = 2, /* Guaranteed service */
1467 QOS_TSPEC = 1 /* Traffic specification */
1470 static const value_string qos_vals[] = {
1471 { QOS_QUALITATIVE, "Qualitative QoS" },
1472 { QOS_NULL, "Null-Service QoS" },
1473 { QOS_CONTROLLED_LOAD, "Controlled-load QoS" },
1474 { QOS_GUARANTEED, "Guaranteed rate QoS" },
1475 { QOS_TSPEC, "Traffic specification" },
1476 { 0, NULL }
1479 static const value_string svc_vals[] = {
1480 { 126, "Compression Hint" },
1481 { 127, "Token bucket" },
1482 { 128, "Null Service" },
1483 { 130, "Guaranteed-rate RSpec" },
1484 { 0, NULL }
1486 static value_string_ext svc_vals_ext = VALUE_STRING_EXT_INIT(svc_vals);
1488 enum rsvp_spec_types { INTSRV = 2 };
1490 enum intsrv_services {
1491 INTSRV_GENERAL = 1,
1492 INTSRV_GTD = 2,
1493 INTSRV_CLOAD = 5,
1494 INTSRV_NULL = 6,
1495 INTSRV_QUALITATIVE = 128
1498 static const value_string intsrv_services_str[] = {
1499 { INTSRV_GENERAL, "Default General Parameters"},
1500 { INTSRV_GTD, "Guaranteed Rate"},
1501 { INTSRV_CLOAD, "Controlled Load"},
1502 { INTSRV_NULL, "Null Service"},
1503 { INTSRV_QUALITATIVE, "Null Service"},
1504 { 0, NULL }
1506 static value_string_ext intsrv_services_str_ext = VALUE_STRING_EXT_INIT(intsrv_services_str);
1508 /*Ingress Layer 2 Control Processing values*/
1509 static const value_string il2cp_val_str[] = {
1510 { 0, "Ingress Layer 2 Control Processing: 0 - Reserved" },
1511 { 1, "Ingress Layer 2 Control Processing: 1 - Discard/Block" },
1512 { 2, "Ingress Layer 2 Control Processing: 2 - Peer/Process" },
1513 { 3, "Ingress Layer 2 Control Processing: 3 - Pass to EVC/Pass" },
1514 { 4, "Ingress Layer 2 Control Processing: 4 - Peer and Pass to EVC" },
1515 { 0, NULL }
1518 /*Egress Layer 2 Control Processing values*/
1519 static const value_string el2cp_val_str[] = {
1520 { 0, "Egress Layer 2 Control Processing: 0 - Reserved" },
1521 { 1, "Egress Layer 2 Control Processing: 1 - Based on IL2CP Value" },
1522 { 2, "Egress Layer 2 Control Processing: 2 - Generate" },
1523 { 3, "Egress Layer 2 Control Processing: 3 - None" },
1524 { 4, "Egress Layer 2 Control Processing: 4 - Reserved" },
1525 { 0, NULL }
1528 #if 0
1529 enum intsrv_field_name {
1530 INTSRV_NON_IS_HOPS = 1,
1531 INTSRV_COMPOSED_NON_IS_HOPS,
1532 INTSRV_IS_HOPS,
1533 INTSRV_COMPOSED_IS_HOPS,
1534 INTSRV_PATH_BANDWIDTH,
1535 INTSRV_MIN_PATH_BANDWIDTH,
1536 INTSRV_IF_LATENCY,
1537 INTSRV_PATH_LATENCY,
1538 INTSRV_MTU,
1539 INTSRV_COMPOSED_MTU,
1541 INTSRV_TOKEN_BUCKET_TSPEC = 127,
1542 INTSRV_QUALITATIVE_TSPEC = 128,
1543 INTSRV_GTD_RSPEC = 130,
1545 INTSRV_DELAY = 131, /* Gtd Parameter C - Max Delay Bound - bytes */
1546 INTSRV_MAX_JITTER, /* Gtd Parameter D - Max Jitter */
1547 INTSRV_E2E_DELAY, /* Gtd Parameter Ctot */
1548 INTSRV_E2E_MAX_JITTER, /* Gtd Parameter Dtot */
1549 INTSRV_SHP_DELAY, /* Gtd Parameter Csum */
1550 INTSRV_SHP_MAX_JITTER /* Gtd Parameter Dsum */
1552 #endif
1554 static const value_string adspec_params[] = {
1555 { 4, "IS Hop Count"},
1556 { 6, "Path b/w estimate"},
1557 { 8, "Minimum path latency"},
1558 { 10, "Composed MTU"},
1559 { 133, "End-to-end composed value for C"},
1560 { 134, "End-to-end composed value for D"},
1561 { 135, "Since-last-reshaping point composed C"},
1562 { 136, "Since-last-reshaping point composed D"},
1563 { 0, NULL }
1565 static value_string_ext adspec_params_ext = VALUE_STRING_EXT_INIT(adspec_params);
1568 * FF: please keep this list in sync with
1569 * http://www.iana.org/assignments/gmpls-sig-parameters/gmpls-sig-parameters.xhtml
1570 * Registry Name: 'LSP Encoding Types'
1572 const range_string gmpls_lsp_enc_rvals[] = {
1573 { 1, 1, "Packet" },
1574 { 2, 2, "Ethernet" },
1575 { 3, 3, "ANSI/ETSI PDH" },
1576 { 4, 4, "Reserved" },
1577 { 5, 5, "SDH ITU-T G.707 / SONET ANSI T1.105" },
1578 { 6, 6, "Reserved" },
1579 { 7, 7, "Digital Wrapper" },
1580 { 8, 8, "Lambda (photonic)" },
1581 { 9, 9, "Fiber" },
1582 { 10, 10, "Reserved" },
1583 { 11, 11, "FiberChannel" },
1584 { 12, 12, "G.709 ODUk (Digital Path)" },
1585 { 13, 13, "G.709 Optical Channel" },
1586 { 14, 14, "Ethernet Line (EPL Type 2)" },
1587 { 15, 239, "Unassigned" },
1588 { 240, 255, "Experimental Usage/temporarily" },
1589 { 0, 0, NULL }
1593 * FF: please keep this list in sync with
1594 * http://www.iana.org/assignments/gmpls-sig-parameters/gmpls-sig-parameters.xhtml
1595 * Registry Name: 'Switching Types'
1597 const range_string gmpls_switching_type_rvals[] = {
1598 { 1, 1, "Packet-Switch Capable-1 (PSC-1)" },
1599 { 2, 2, "Packet-Switch Capable-2 (PSC-2)" },
1600 { 3, 3, "Packet-Switch Capable-3 (PSC-3)" },
1601 { 4, 4, "Packet-Switch Capable-4 (PSC-4)" },
1602 { 5, 29, "Unassigned" },
1603 { 30, 30, "Ethernet Virtual Private Line (EVPL)" },
1604 { 31, 39, "Unassigned" },
1605 { 40, 40, "802.1 PBB-TE" },
1606 { 41, 50, "Unassigned" },
1607 { 51, 51, "Layer-2 Switch Capable (L2SC)" },
1608 { 52, 99, "Unassigned" },
1609 { 100, 100, "Time-Division-Multiplex Capable (TDM)" },
1610 { 101, 124, "Unassigned" },
1611 { 125, 125, "Data Channel Switching Capable (DCSC)" },
1612 { 126, 149, "Unassigned" },
1613 { 150, 150, "Lambda-Switch Capable (LSC)" },
1614 { 151, 151, "WSON-LSC"},
1615 { 152, 152, "Flexi-Grid-LSC"},
1616 { 153, 199, "Unassigned" },
1617 { 200, 200, "Fiber-Switch Capable (FSC)" },
1618 { 201, 255, "Unassigned" },
1619 { 0, 0, NULL }
1623 * FF: please keep this list in sync with
1624 * http://www.iana.org/assignments/gmpls-sig-parameters/gmpls-sig-parameters.xhtml
1625 * Registry Name: 'Generalized PID (G-PID)'
1627 static const range_string gmpls_gpid_rvals[] = {
1628 { 0, 0, "Unknown" },
1629 { 1, 4, "Reserved" },
1630 { 5, 5, "Asynchronous mapping of E4" },
1631 { 6, 6, "Asynchronous mapping of DS3/T3" },
1632 { 7, 7, "Asynchronous mapping of E3" },
1633 { 8, 8, "Bit synchronous mapping of E3" },
1634 { 9, 9, "Byte synchronous mapping of E3" },
1635 { 10, 10, "Asynchronous mapping of DS2/T2" },
1636 { 11, 11, "Bit synchronous mapping of DS2/T2" },
1637 { 12, 12, "Reserved" },
1638 { 13, 13, "Asynchronous mapping of E1" },
1639 { 14, 14, "Byte synchronous mapping of E1" },
1640 { 15, 15, "Byte synchronous mapping of 31 * DS0" },
1641 { 16, 16, "Asynchronous mapping of DS1/T1" },
1642 { 17, 17, "Bit synchronous mapping of DS1/T1" },
1643 { 18, 18, "Byte synchronous mapping of DS1/T1" },
1644 { 19, 19, "VC-11 in VC-12" },
1645 { 20, 21, "Reserved" },
1646 { 22, 22, "DS1 SF Asynchronous" },
1647 { 23, 23, "DS1 ESF Asynchronous" },
1648 { 24, 24, "DS3 M23 Asynchronous" },
1649 { 25, 25, "DS3 C-Bit Parity Asynchronous" },
1650 { 26, 26, "VT/LOVC" },
1651 { 27, 27, "STS SPE/HOVC" },
1652 { 28, 28, "POS - No Scrambling, 16 bit CRC" },
1653 { 29, 29, "POS - No Scrambling, 32 bit CRC" },
1654 { 30, 30, "POS - Scrambling, 16 bit CRC" },
1655 { 31, 31, "POS - Scrambling, 32 bit CRC" },
1656 { 32, 32, "ATM mapping" },
1657 { 33, 33, "Ethernet PHY" },
1658 { 34, 34, "SONET/SDH" },
1659 { 35, 35, "Reserved (SONET deprecated)" },
1660 { 36, 36, "Digital Wrapper" },
1661 { 37, 37, "Lambda" },
1662 { 38, 38, "ANSI/ETSI PDH" },
1663 { 39, 39, "Reserved" },
1664 { 40, 40, "Link Access Protocol SDH (LAPS - X.85 and X.86)" },
1665 { 41, 41, "FDDI" },
1666 { 42, 42, "DQDB (ETSI ETS 300 216)" },
1667 { 43, 43, "FiberChannel-3 (Services)" },
1668 { 44, 44, "HDLC" },
1669 { 45, 45, "Ethernet V2/DIX (only)" },
1670 { 46, 46, "Ethernet 802.3 (only)" },
1671 { 47, 47, "G.709 ODUj" },
1672 { 48, 48, "G.709 OTUk(v)" },
1673 { 49, 49, "CBR/CBRa" },
1674 { 50, 50, "CBRb" },
1675 { 51, 51, "BSOT" },
1676 { 52, 52, "BSNT" },
1677 { 53, 53, "IP/PPP (GFP)" },
1678 { 54, 54, "Ethernet MAC (framed GFP)" },
1679 { 55, 55, "Ethernet PHY (transparent GFP" },
1680 { 56, 56, "ESCON" },
1681 { 57, 57, "FICON" },
1682 { 58, 58, "Fiber Channel" },
1683 { 59, 31743, "Unassigned" },
1684 { 31744, 32767, "Experimental Usage/temporarily" },
1685 { 32768, 65535, "Reserved" },
1686 { 0, 0, NULL },
1689 const value_string gmpls_protection_cap_str[] = {
1690 { 1, "Extra Traffic"},
1691 { 2, "Unprotected"},
1692 { 4, "Shared"},
1693 { 8, "Dedicated 1:1"},
1694 { 16, "Dedicated 1+1"},
1695 { 32, "Enhanced"},
1696 { 64, "Reserved"},
1697 { 128, "Reserved"},
1698 { 0, NULL }
1701 static const value_string gmpls_sonet_signal_type_str[] = {
1702 { 1, "VT1.5 SPE / VC-11"},
1703 { 2, "VT2 SPE / VC-12"},
1704 { 3, "VT3 SPE"},
1705 { 4, "VT6 SPE / VC-2"},
1706 { 5, "STS-1 SPE / VC-3"},
1707 { 6, "STS-3c SPE / VC-4"},
1708 { 7, "STS-1 / STM-0 (transp)"},
1709 { 8, "STS-3 / STM-1 (transp)"},
1710 { 9, "STS-12 / STM-4 (transp)"},
1711 { 10, "STS-48 / STM-16 (transp)"},
1712 { 11, "STS-192 / STM-64 (transp)"},
1713 { 12, "STS-768 / STM-256 (transp)"},
1715 /* Extended non-SONET signal types */
1716 { 13, "VTG / TUG-2"},
1717 { 14, "TUG-3"},
1718 { 15, "STSG-3 / AUG-1"},
1719 { 16, "STSG-12 / AUG-4"},
1720 { 17, "STSG-48 / AUG-16"},
1721 { 18, "STSG-192 / AUG-64"},
1722 { 19, "STSG-768 / AUG-256"},
1724 /* Other SONEt signal types */
1725 { 21, "STS-12c SPE / VC-4-4c"},
1726 { 22, "STS-48c SPE / VC-4-16c"},
1727 { 23, "STS-192c SPE / VC-4-64c"},
1728 { 0, NULL}
1730 value_string_ext gmpls_sonet_signal_type_str_ext = VALUE_STRING_EXT_INIT(gmpls_sonet_signal_type_str);
1732 static const value_string ouni_guni_diversity_str[] = {
1733 { 1, "Node Diverse"},
1734 { 2, "Link Diverse"},
1735 { 3, "Shared-Risk Link Group Diverse"},
1736 { 4, "Shared Path"},
1737 { 0, NULL}
1740 /* FF: RFC 4328 G.709 signal type */
1741 static const range_string gmpls_g709_signal_type_rvals[] = {
1742 { 0, 0, "Not significant"},
1743 { 1, 1, "ODU1 (i.e., 2.5 Gbps)"},
1744 { 2, 2, "ODU2 (i.e., 10 Gbps)"},
1745 { 3, 3, "ODU3 (i.e., 40 Gbps)"},
1746 { 4, 5, "Reserved (for future use)"},
1747 { 6, 6, "OCh at 2.5 Gbps"},
1748 { 7, 7, "OCh at 10 Gbps"},
1749 { 8, 8, "OCh at 40 Gbps"},
1750 { 9, 255, "Reserved (for future use)"},
1751 { 0, 0, NULL}
1754 /* XRO related */
1756 static const value_string rsvp_xro_sobj_lbit_vals[] = {
1757 { 1, "Should be avoided" },
1758 { 0, "Must be excluded" },
1759 { 0, NULL }
1762 /* RRO related */
1763 static const value_string rsvp_rro_sobj_dbit_vals[] = {
1764 { 1, "Upstream direction" },
1765 { 0, "Downstream direction" },
1766 { 0, NULL }
1769 #if 0
1770 static const value_string rsvp_xro_sobj_type_vals[] = {
1771 { 1, "IPv4 prefix" },
1772 { 2, "IPv6 prefix" },
1773 { 4, "Unnumbered Interface ID" },
1774 { 32, "Autonomous system number" },
1775 { 33, "Explicit Exclusion Route subobject (EXRS)" },
1776 { 34, "SRLG" },
1777 { 0, NULL }
1779 #endif
1781 static const value_string rsvp_xro_sobj_ip_attr_vals[] = {
1782 { 0, "Interface" },
1783 { 1, "Node" },
1784 { 2, "SRLG" },
1785 { 0, NULL }
1788 static const value_string rsvp_juniper_attr_vals[] = {
1789 { 0x01, "Cos" },
1790 { 0x02, "Metric 1" },
1791 { 0x04, "Metric 2" },
1792 { 0x08, "CCC Status" },
1793 { 0x10, "Path Type" },
1794 { 0, NULL }
1797 static const value_string rsvp_juniper_path_attr_vals[] = {
1798 { 0x02, "Primary" },
1799 { 0x03, "Secondary" },
1800 { 0, NULL }
1803 /* -------------------- Stuff for MPLS/TE objects -------------------- */
1805 static const value_string proto_vals[] = {
1806 { IP_PROTO_ICMP, "ICMP"},
1807 { IP_PROTO_IGMP, "IGMP"},
1808 { IP_PROTO_TCP, "TCP" },
1809 { IP_PROTO_UDP, "UDP" },
1810 { IP_PROTO_OSPF, "OSPF"},
1811 { 0, NULL }
1814 /* Filter keys */
1815 enum hf_rsvp_filter_keys {
1817 /* Message types */
1818 RSVPF_MSG, /* Message type */
1819 /* Shorthand for message types */
1820 RSVPF_PATH,
1821 RSVPF_RESV,
1822 RSVPF_PATHERR,
1823 RSVPF_RESVERR,
1824 RSVPF_PATHTEAR,
1825 RSVPF_RESVTEAR,
1826 RSVPF_RCONFIRM,
1827 RSVPF_JUNK_MSG8,
1828 RSVPF_JUNK_MSG9,
1829 RSVPF_RTEARCONFIRM,
1830 RSVPF_JUNK11,
1831 RSVPF_BUNDLE,
1832 RSVPF_ACK,
1833 RSVPF_JUNK14,
1834 RSVPF_SREFRESH,
1835 RSVPF_JUNK16,
1836 RSVPF_JUNK17,
1837 RSVPF_JUNK18,
1838 RSVPF_JUNK19,
1839 RSVPF_HELLO,
1840 RSVPF_NOTIFY,
1841 /* Does the message contain an object of this type? */
1842 RSVPF_OBJECT,
1843 /* Object present shorthands */
1844 RSVPF_SESSION,
1845 RSVPF_DUMMY_1,
1846 RSVPF_HOP,
1847 RSVPF_INTEGRITY,
1848 RSVPF_TIME_VALUES,
1849 RSVPF_ERROR,
1850 RSVPF_SCOPE,
1851 RSVPF_STYLE,
1852 RSVPF_FLOWSPEC,
1853 RSVPF_FILTER_SPEC,
1854 RSVPF_SENDER,
1855 RSVPF_TSPEC,
1856 RSVPF_ADSPEC,
1857 RSVPF_POLICY,
1858 RSVPF_CONFIRM,
1859 RSVPF_LABEL,
1860 RSVPF_DUMMY_2,
1861 RSVPF_DUMMY_3,
1862 RSVPF_LABEL_REQUEST,
1863 RSVPF_EXPLICIT_ROUTE,
1864 RSVPF_RECORD_ROUTE,
1865 RSVPF_HELLO_OBJ,
1866 RSVPF_MESSAGE_ID,
1867 RSVPF_MESSAGE_ID_ACK,
1868 RSVPF_MESSAGE_ID_LIST,
1869 RSVPF_RECOVERY_LABEL,
1870 RSVPF_UPSTREAM_LABEL,
1871 RSVPF_LABEL_SET,
1872 RSVPF_PROTECTION,
1873 RSVPF_DIFFSERV,
1874 RSVPF_DSTE,
1876 RSVPF_SUGGESTED_LABEL,
1877 RSVPF_ACCEPTABLE_LABEL_SET,
1878 RSVPF_RESTART_CAP,
1880 RSVPF_LINK_CAP,
1881 RSVPF_CAPABILITY,
1883 RSVPF_SESSION_ATTRIBUTE,
1884 RSVPF_DCLASS,
1885 RSVPF_LSP_TUNNEL_IF_ID,
1886 RSVPF_NOTIFY_REQUEST,
1887 RSVPF_ADMIN_STATUS,
1888 RSVPF_ADMIN_STATUS_REFLECT,
1889 RSVPF_ADMIN_STATUS_HANDOVER,
1890 RSVPF_ADMIN_STATUS_LOCKOUT,
1891 RSVPF_ADMIN_STATUS_INHIBIT,
1892 RSVPF_ADMIN_STATUS_CALL_MGMT,
1893 RSVPF_ADMIN_STATUS_TESTING,
1894 RSVPF_ADMIN_STATUS_DOWN,
1895 RSVPF_ADMIN_STATUS_DELETE,
1896 RSVPF_LSP_ATTRIBUTES,
1897 RSVPF_ASSOCIATION,
1898 RSVPF_CALL_ATTRIBUTES,
1899 RSVPF_GENERALIZED_UNI,
1900 RSVPF_CALL_ID,
1901 RSVPF_3GPP2_OBJECT,
1902 RSVPF_UNKNOWN_OBJ,
1904 /* Session object */
1905 RSVPF_SESSION_IP,
1906 RSVPF_SESSION_SHORT_CALL_ID,
1907 RSVPF_SESSION_PROTO,
1908 RSVPF_SESSION_PORT,
1909 RSVPF_SESSION_TUNNEL_ID,
1910 RSVPF_SESSION_EXT_TUNNEL_ID,
1911 RSVPF_SESSION_EXT_TUNNEL_ID_IPV6,
1913 /* Sender template */
1914 RSVPF_SENDER_IP,
1915 RSVPF_SENDER_PORT,
1916 RSVPF_SENDER_LSP_ID,
1917 RSVPF_SENDER_SHORT_CALL_ID,
1919 /* Diffserv object */
1920 RSVPF_DIFFSERV_MAPNB,
1921 RSVPF_DIFFSERV_MAP,
1922 RSVPF_DIFFSERV_MAP_EXP,
1923 RSVPF_DIFFSERV_PHBID,
1924 RSVPF_DIFFSERV_PHBID_DSCP,
1925 RSVPF_DIFFSERV_PHBID_CODE,
1926 RSVPF_DIFFSERV_PHBID_BIT14,
1927 RSVPF_DIFFSERV_PHBID_BIT15,
1929 /* Diffserv-aware TE object */
1930 RSVPF_DSTE_CLASSTYPE,
1932 /* Generalized UNI object */
1933 RSVPF_GUNI_SRC_IPV4,
1934 RSVPF_GUNI_DST_IPV4,
1935 RSVPF_GUNI_SRC_IPV6,
1936 RSVPF_GUNI_DST_IPV6,
1938 /* CALL ID object */
1939 RSVPF_CALL_ID_SRC_ADDR_IPV4,
1940 RSVPF_CALL_ID_SRC_ADDR_IPV6,
1942 /* EXCLUDE ROUTE object */
1943 RSVPF_EXCLUDE_ROUTE,
1945 /* S2L_SUB_LSP object */
1946 RSVPF_S2L_SUB_LSP,
1948 /* Vendor Private objects */
1949 RSVPF_PRIVATE_OBJ,
1950 RSVPF_ENT_CODE,
1952 RSVPF_SECONDARY_EXPLICIT_ROUTE,
1953 RSVPF_SECONDARY_RECORD_ROUTE,
1955 RSVPF_JUNIPER,
1957 /* Sentinel */
1958 RSVPF_MAX
1961 static const true_false_string tfs_desired_not_desired = { "Desired", "Not Desired" };
1962 static const true_false_string tfs_next_next_hop_next_hop = { "Next-Next-Hop", "Next-Hop" };
1963 static const true_false_string tfs_loose_strict_hop = { "Loose Hop", "Strict Hop" };
1964 static const true_false_string tfs_can_cannot = { "Can", "Cannot" };
1965 static const true_false_string tfs_gen_uni_direction = { "U: 1 - Upstream label/port ID", "U: 0 - Downstream label/port ID" };
1967 static const unit_name_string units_word_not_including_header = { " word, not including header", " words, not including header" };
1969 static int hf_rsvp_filter[RSVPF_MAX];
1971 /* RSVP Conversation related Hash functions */
1974 * Compare two RSVP request keys to see if they are equal. Return 1 if they
1975 * are, 0 otherwise.
1976 * Two RSVP request keys are equal if and only if they have the exactly the
1977 * same internal conversation identifier, session type, and matching values in
1978 * the session info and source info structures.
1980 static int
1981 rsvp_equal(const void *k1, const void *k2)
1983 const struct rsvp_request_key *key1 = (const struct rsvp_request_key*) k1;
1984 const struct rsvp_request_key *key2 = (const struct rsvp_request_key*) k2;
1986 if (key1->conversation != key2->conversation) {
1987 return 0;
1990 if (key1->session_type != key2->session_type) {
1991 return 0;
1994 switch (key1->session_type) {
1995 case RSVP_SESSION_TYPE_IPV4:
1996 if (addresses_equal(&key1->u.session_ipv4.destination,
1997 &key2->u.session_ipv4.destination) == false)
1998 return 0;
2000 if (key1->u.session_ipv4.protocol != key2->u.session_ipv4.protocol)
2001 return 0;
2003 if (key1->u.session_ipv4.udp_dest_port != key2->u.session_ipv4.udp_dest_port)
2004 return 0;
2006 break;
2008 case RSVP_SESSION_TYPE_IPV6:
2009 /* this is not supported yet for conversations */
2010 break;
2012 case RSVP_SESSION_TYPE_IPV4_LSP:
2013 if (addresses_equal(&key1->u.session_ipv4_lsp.destination,
2014 &key2->u.session_ipv4_lsp.destination) == false)
2015 return 0;
2017 if (key1->u.session_ipv4_lsp.udp_dest_port !=
2018 key2->u.session_ipv4_lsp.udp_dest_port)
2019 return 0;
2022 if (key1->u.session_ipv4_lsp.ext_tunnel_id !=
2023 key2->u.session_ipv4_lsp.ext_tunnel_id)
2024 return 0;
2026 break;
2028 case RSVP_SESSION_TYPE_AGGREGATE_IPV4:
2029 if (addresses_equal(&key1->u.session_agg_ipv4.destination,
2030 &key2->u.session_agg_ipv4.destination) == false)
2031 return 0;
2033 if (key1->u.session_agg_ipv4.dscp != key2->u.session_agg_ipv4.dscp)
2034 return 0;
2036 break;
2038 case RSVP_SESSION_TYPE_AGGREGATE_IPV6:
2039 /* this is not supported yet for conversations */
2040 break;
2042 case RSVP_SESSION_TYPE_IPV4_UNI:
2043 if (addresses_equal(&key1->u.session_ipv4_uni.destination,
2044 &key2->u.session_ipv4_uni.destination) == false)
2045 return 0;
2047 if (key1->u.session_ipv4_uni.udp_dest_port !=
2048 key2->u.session_ipv4_uni.udp_dest_port)
2049 return 0;
2052 if (key1->u.session_ipv4_uni.ext_tunnel_id !=
2053 key2->u.session_ipv4_uni.ext_tunnel_id)
2054 return 0;
2056 break;
2058 case RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV4:
2059 if (addresses_equal(&key1->u.session_ipv4_p2mp_lsp.destination,
2060 &key2->u.session_ipv4_p2mp_lsp.destination) == false)
2061 return 0;
2063 if (key1->u.session_ipv4_p2mp_lsp.udp_dest_port !=
2064 key2->u.session_ipv4_p2mp_lsp.udp_dest_port)
2065 return 0;
2068 if (key1->u.session_ipv4_p2mp_lsp.ext_tunnel_id !=
2069 key2->u.session_ipv4_p2mp_lsp.ext_tunnel_id)
2070 return 0;
2072 break;
2074 case RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV6:
2075 if (addresses_equal(&key1->u.session_ipv6_p2mp_lsp.destination,
2076 &key2->u.session_ipv6_p2mp_lsp.destination) == false)
2077 return 0;
2079 if (key1->u.session_ipv6_p2mp_lsp.udp_dest_port !=
2080 key2->u.session_ipv6_p2mp_lsp.udp_dest_port)
2081 return 0;
2084 if (key1->u.session_ipv6_p2mp_lsp.ext_tunnel_id !=
2085 key2->u.session_ipv6_p2mp_lsp.ext_tunnel_id)
2086 return 0;
2088 break;
2090 case RSVP_SESSION_TYPE_IPV4_E_NNI:
2091 if (addresses_equal(&key1->u.session_ipv4_enni.destination,
2092 &key2->u.session_ipv4_enni.destination) == false)
2093 return 0;
2095 if (key1->u.session_ipv4_enni.udp_dest_port !=
2096 key2->u.session_ipv4_enni.udp_dest_port)
2097 return 0;
2100 if (key1->u.session_ipv4_enni.ext_tunnel_id !=
2101 key2->u.session_ipv4_enni.ext_tunnel_id)
2102 return 0;
2104 break;
2106 default:
2107 /* This should never happen. */
2108 break;
2111 if (addresses_equal(&key1->source_info.source,
2112 &key2->source_info.source) == false)
2113 return 0;
2115 if (key1->source_info.udp_source_port != key2->source_info.udp_source_port)
2116 return 0;
2118 /* If we get here, the two keys are equal. */
2119 return 1;
2123 * Calculate a hash key for the supplied RSVP request. The internally allocated
2124 * conversation-id is unique, so we just use that.
2126 static unsigned
2127 rsvp_hash(const void *k)
2129 const struct rsvp_request_key *key = (const struct rsvp_request_key*) k;
2130 return key->conversation;
2133 static const char* rsvp_conv_get_filter_type(conv_item_t* conv, conv_filter_type_e filter)
2135 if ((filter == CONV_FT_SRC_ADDRESS) && (conv->src_address.type == AT_IPv4))
2136 return "ip.src";
2138 if ((filter == CONV_FT_DST_ADDRESS) && (conv->dst_address.type == AT_IPv4))
2139 return "ip.dst";
2141 if ((filter == CONV_FT_ANY_ADDRESS) && (conv->src_address.type == AT_IPv4))
2142 return "ip.addr";
2144 return CONV_FILTER_INVALID;
2147 static ct_dissector_info_t rsvp_ct_dissector_info = {&rsvp_conv_get_filter_type};
2149 static tap_packet_status
2150 rsvp_conversation_packet(void *pct, packet_info *pinfo, epan_dissect_t *edt _U_, const void *vip, tap_flags_t flags)
2152 conv_hash_t *hash = (conv_hash_t*) pct;
2153 hash->flags = flags;
2155 const rsvp_conversation_info *rsvph = (const rsvp_conversation_info *)vip;
2157 add_conversation_table_data(hash, &rsvph->source, &rsvph->destination,
2158 0, 0, 1, pinfo->fd->pkt_len, &pinfo->rel_ts, &pinfo->abs_ts, &rsvp_ct_dissector_info, CONVERSATION_NONE);
2160 return TAP_PACKET_REDRAW;
2163 static const char* rsvp_endpoint_get_filter_type(endpoint_item_t* endpoint, conv_filter_type_e filter)
2165 if ((filter == CONV_FT_ANY_ADDRESS) && (endpoint->myaddress.type == AT_IPv4))
2166 return "ip.addr";
2168 return CONV_FILTER_INVALID;
2171 static et_dissector_info_t rsvp_endpoint_dissector_info = {&rsvp_endpoint_get_filter_type};
2173 static tap_packet_status
2174 rsvp_endpoint_packet(void *pit, packet_info *pinfo, epan_dissect_t *edt _U_, const void *vip, tap_flags_t flags)
2176 conv_hash_t *hash = (conv_hash_t*) pit;
2177 hash->flags = flags;
2179 const rsvp_conversation_info *rsvph = (const rsvp_conversation_info *)vip;
2181 /* Take two "add" passes per packet, adding for each direction, ensures
2182 * that all packets are counted properly (even if address is sending to
2183 * itself). XXX - this could probably be done more efficiently inside
2184 * endpoint_table
2186 add_endpoint_table_data(hash, &rsvph->source, 0, true, 1, pinfo->fd->pkt_len, &rsvp_endpoint_dissector_info, ENDPOINT_NONE);
2187 add_endpoint_table_data(hash, &rsvph->destination, 0, false, 1, pinfo->fd->pkt_len, &rsvp_endpoint_dissector_info, ENDPOINT_NONE);
2188 return TAP_PACKET_REDRAW;
2191 static inline int
2192 rsvp_class_to_filter_num(int classnum)
2194 switch(classnum) {
2195 case RSVP_CLASS_SESSION :
2196 case RSVP_CLASS_HOP :
2197 case RSVP_CLASS_INTEGRITY :
2198 case RSVP_CLASS_TIME_VALUES :
2199 case RSVP_CLASS_ERROR :
2200 case RSVP_CLASS_SCOPE :
2201 case RSVP_CLASS_STYLE :
2202 case RSVP_CLASS_FLOWSPEC :
2203 case RSVP_CLASS_FILTER_SPEC :
2204 case RSVP_CLASS_SENDER_TEMPLATE :
2205 case RSVP_CLASS_SENDER_TSPEC :
2206 case RSVP_CLASS_ADSPEC :
2207 case RSVP_CLASS_POLICY :
2208 case RSVP_CLASS_CONFIRM :
2209 case RSVP_CLASS_LABEL :
2210 case RSVP_CLASS_LABEL_REQUEST :
2211 case RSVP_CLASS_HELLO :
2212 case RSVP_CLASS_EXPLICIT_ROUTE :
2213 case RSVP_CLASS_RECORD_ROUTE :
2214 case RSVP_CLASS_MESSAGE_ID :
2215 case RSVP_CLASS_MESSAGE_ID_ACK :
2216 case RSVP_CLASS_MESSAGE_ID_LIST :
2217 return classnum + RSVPF_OBJECT;
2219 case RSVP_CLASS_RECOVERY_LABEL :
2220 case RSVP_CLASS_UPSTREAM_LABEL :
2221 case RSVP_CLASS_LABEL_SET :
2222 case RSVP_CLASS_PROTECTION :
2223 return RSVPF_RECOVERY_LABEL + (classnum - RSVP_CLASS_RECOVERY_LABEL);
2225 case RSVP_CLASS_SUGGESTED_LABEL :
2226 case RSVP_CLASS_ACCEPTABLE_LABEL_SET :
2227 case RSVP_CLASS_RESTART_CAP :
2228 return RSVPF_SUGGESTED_LABEL + (classnum - RSVP_CLASS_SUGGESTED_LABEL);
2230 case RSVP_CLASS_LINK_CAP :
2231 return RSVPF_LINK_CAP;
2233 case RSVP_CLASS_CAPABILITY :
2234 return RSVPF_CAPABILITY;
2236 case RSVP_CLASS_DIFFSERV :
2237 return RSVPF_DIFFSERV;
2239 case RSVP_CLASS_CLASSTYPE :
2240 return RSVPF_DSTE;
2242 case RSVP_CLASS_NOTIFY_REQUEST :
2243 return RSVPF_NOTIFY_REQUEST;
2244 case RSVP_CLASS_ADMIN_STATUS :
2245 return RSVPF_ADMIN_STATUS;
2246 case RSVP_CLASS_LSP_ATTRIBUTES :
2247 return RSVPF_LSP_ATTRIBUTES;
2248 case RSVP_CLASS_ASSOCIATION :
2249 return RSVPF_ASSOCIATION;
2250 case RSVP_CLASS_CALL_ATTRIBUTES:
2251 return RSVPF_CALL_ATTRIBUTES;
2253 case RSVP_CLASS_SESSION_ATTRIBUTE :
2254 return RSVPF_SESSION_ATTRIBUTE;
2255 case RSVP_CLASS_GENERALIZED_UNI :
2256 return RSVPF_GENERALIZED_UNI;
2257 case RSVP_CLASS_CALL_ID :
2258 return RSVPF_CALL_ID;
2259 case RSVP_CLASS_3GPP2_OBJECT :
2260 return RSVPF_3GPP2_OBJECT;
2261 case RSVP_CLASS_DCLASS :
2262 return RSVPF_DCLASS;
2263 case RSVP_CLASS_LSP_TUNNEL_IF_ID :
2264 return RSVPF_LSP_TUNNEL_IF_ID;
2265 case RSVP_CLASS_EXCLUDE_ROUTE:
2266 return RSVPF_EXCLUDE_ROUTE;
2268 case RSVP_CLASS_S2L_SUB_LSP:
2269 return RSVPF_S2L_SUB_LSP;
2271 case RSVP_CLASS_SECONDARY_EXPLICIT_ROUTE:
2272 return RSVPF_SECONDARY_EXPLICIT_ROUTE;
2273 case RSVP_CLASS_SECONDARY_RECORD_ROUTE:
2274 return RSVPF_SECONDARY_RECORD_ROUTE;
2276 case RSVP_CLASS_JUNIPER_PROPERTIES :
2277 return RSVPF_JUNIPER;
2278 case RSVP_CLASS_VENDOR_PRIVATE_1:
2279 case RSVP_CLASS_VENDOR_PRIVATE_2:
2280 case RSVP_CLASS_VENDOR_PRIVATE_3:
2281 case RSVP_CLASS_VENDOR_PRIVATE_4:
2282 case RSVP_CLASS_VENDOR_PRIVATE_5:
2283 case RSVP_CLASS_VENDOR_PRIVATE_6:
2284 case RSVP_CLASS_VENDOR_PRIVATE_7:
2285 case RSVP_CLASS_VENDOR_PRIVATE_8:
2286 case RSVP_CLASS_VENDOR_PRIVATE_9:
2287 case RSVP_CLASS_VENDOR_PRIVATE_10:
2288 case RSVP_CLASS_VENDOR_PRIVATE_11:
2289 case RSVP_CLASS_VENDOR_PRIVATE_12:
2290 return RSVPF_PRIVATE_OBJ;
2292 default:
2293 return RSVPF_UNKNOWN_OBJ;
2297 static inline int
2298 rsvp_class_to_tree_type(int classnum)
2300 switch(classnum) {
2301 case RSVP_CLASS_SESSION :
2302 return TT_SESSION;
2303 case RSVP_CLASS_HOP :
2304 return TT_HOP;
2305 case RSVP_CLASS_INTEGRITY :
2306 return TT_INTEGRITY;
2307 case RSVP_CLASS_TIME_VALUES :
2308 return TT_TIME_VALUES;
2309 case RSVP_CLASS_ERROR :
2310 return TT_ERROR;
2311 case RSVP_CLASS_SCOPE :
2312 return TT_SCOPE;
2313 case RSVP_CLASS_STYLE :
2314 return TT_STYLE;
2315 case RSVP_CLASS_FLOWSPEC :
2316 return TT_FLOWSPEC;
2317 case RSVP_CLASS_FILTER_SPEC :
2318 return TT_FILTER_SPEC;
2319 case RSVP_CLASS_SENDER_TEMPLATE :
2320 return TT_SENDER_TEMPLATE;
2321 case RSVP_CLASS_SENDER_TSPEC :
2322 return TT_TSPEC;
2323 case RSVP_CLASS_ADSPEC :
2324 return TT_ADSPEC;
2325 case RSVP_CLASS_POLICY :
2326 return TT_POLICY;
2327 case RSVP_CLASS_CONFIRM :
2328 return TT_CONFIRM;
2329 case RSVP_CLASS_RECOVERY_LABEL :
2330 case RSVP_CLASS_UPSTREAM_LABEL :
2331 case RSVP_CLASS_SUGGESTED_LABEL :
2332 case RSVP_CLASS_LABEL :
2333 return TT_LABEL;
2334 case RSVP_CLASS_LABEL_REQUEST :
2335 return TT_LABEL_REQUEST;
2336 case RSVP_CLASS_HELLO :
2337 return TT_HELLO_OBJ;
2338 case RSVP_CLASS_EXPLICIT_ROUTE :
2339 return TT_EXPLICIT_ROUTE;
2340 case RSVP_CLASS_RECORD_ROUTE :
2341 return TT_RECORD_ROUTE;
2342 case RSVP_CLASS_MESSAGE_ID :
2343 return TT_MESSAGE_ID;
2344 case RSVP_CLASS_MESSAGE_ID_ACK :
2345 return TT_MESSAGE_ID_ACK;
2346 case RSVP_CLASS_MESSAGE_ID_LIST :
2347 return TT_MESSAGE_ID_LIST;
2348 case RSVP_CLASS_LABEL_SET :
2349 return TT_LABEL_SET;
2350 case RSVP_CLASS_PROTECTION :
2351 return TT_PROTECTION_INFO;
2352 case RSVP_CLASS_ACCEPTABLE_LABEL_SET :
2353 return TT_UNKNOWN_CLASS;
2354 case RSVP_CLASS_RESTART_CAP :
2355 return TT_RESTART_CAP;
2356 case RSVP_CLASS_LINK_CAP :
2357 return TT_LINK_CAP;
2358 case RSVP_CLASS_CAPABILITY :
2359 return TT_CAPABILITY;
2360 case RSVP_CLASS_DIFFSERV :
2361 return TT_DIFFSERV;
2362 case RSVP_CLASS_CLASSTYPE:
2363 return TT_CLASSTYPE;
2364 case RSVP_CLASS_NOTIFY_REQUEST :
2365 return TT_UNKNOWN_CLASS;
2366 case RSVP_CLASS_ADMIN_STATUS :
2367 return TT_ADMIN_STATUS;
2368 case RSVP_CLASS_LSP_ATTRIBUTES :
2369 case RSVP_CLASS_LSP_REQUIRED_ATTRIBUTES :
2370 return TT_LSP_ATTRIBUTES;
2371 case RSVP_CLASS_ASSOCIATION :
2372 return TT_ASSOCIATION;
2373 case RSVP_CLASS_CALL_ATTRIBUTES:
2374 return RSVPF_CALL_ATTRIBUTES;
2375 case RSVP_CLASS_JUNIPER_PROPERTIES :
2376 return TT_JUNIPER;
2377 case RSVP_CLASS_SESSION_ATTRIBUTE :
2378 return TT_SESSION_ATTRIBUTE;
2379 case RSVP_CLASS_GENERALIZED_UNI :
2380 return TT_GEN_UNI;
2381 case RSVP_CLASS_CALL_ID :
2382 return TT_CALL_ID;
2383 case RSVP_CLASS_3GPP2_OBJECT :
2384 return TT_3GPP2_OBJECT;
2385 case RSVP_CLASS_DCLASS :
2386 return TT_DCLASS;
2387 case RSVP_CLASS_LSP_TUNNEL_IF_ID :
2388 return TT_LSP_TUNNEL_IF_ID;
2389 case RSVP_CLASS_EXCLUDE_ROUTE :
2390 return TT_EXCLUDE_ROUTE;
2391 case RSVP_CLASS_VENDOR_PRIVATE_1:
2392 case RSVP_CLASS_VENDOR_PRIVATE_2:
2393 case RSVP_CLASS_VENDOR_PRIVATE_3:
2394 case RSVP_CLASS_VENDOR_PRIVATE_4:
2395 case RSVP_CLASS_VENDOR_PRIVATE_5:
2396 case RSVP_CLASS_VENDOR_PRIVATE_6:
2397 case RSVP_CLASS_VENDOR_PRIVATE_7:
2398 case RSVP_CLASS_VENDOR_PRIVATE_8:
2399 case RSVP_CLASS_VENDOR_PRIVATE_9:
2400 case RSVP_CLASS_VENDOR_PRIVATE_10:
2401 case RSVP_CLASS_VENDOR_PRIVATE_11:
2402 case RSVP_CLASS_VENDOR_PRIVATE_12:
2403 return TT_PRIVATE_CLASS;
2404 default:
2405 return TT_UNKNOWN_CLASS;
2409 static void
2410 find_rsvp_session_tempfilt(tvbuff_t *tvb, int hdr_offset, int *session_offp, int *tempfilt_offp)
2412 int s_off = 0, t_off = 0;
2413 int len, off;
2414 unsigned obj_length;
2416 if (!tvb_bytes_exist(tvb, hdr_offset+6, 2))
2417 goto done;
2419 len = tvb_get_ntohs(tvb, hdr_offset+6) + hdr_offset;
2420 for (off = hdr_offset + 8; (off < len) && tvb_bytes_exist(tvb, off, 3); off += obj_length) {
2421 obj_length = tvb_get_ntohs(tvb, off);
2422 if (obj_length == 0)
2423 break;
2424 switch(tvb_get_uint8(tvb, off+2)) {
2425 case RSVP_CLASS_SESSION:
2426 s_off = off;
2427 break;
2428 case RSVP_CLASS_SENDER_TEMPLATE:
2429 case RSVP_CLASS_FILTER_SPEC:
2430 t_off = off;
2431 break;
2432 default:
2433 break;
2437 done:
2438 if (session_offp) *session_offp = s_off;
2439 if (tempfilt_offp) *tempfilt_offp = t_off;
2442 static const value_string rsvp_c_type_session_vals[] = {
2443 {RSVP_SESSION_TYPE_IPV4, "IPv4"},
2444 {RSVP_SESSION_TYPE_IPV4_LSP, "IPv4-LSP"},
2445 {RSVP_SESSION_TYPE_IPV6_LSP, "IPv6-LSP"},
2446 {RSVP_SESSION_TYPE_AGGREGATE_IPV4, "IPv4-Aggregate"},
2447 {RSVP_SESSION_TYPE_IPV4_UNI, "IPv4-UNI"},
2448 {RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV4, "IPv4-P2MP LSP TUNNEL"},
2449 {RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV6, "IPv6-P2MP LSP TUNNEL"},
2450 {RSVP_SESSION_TYPE_IPV4_E_NNI, "IPv4-E-NNI"},
2451 {0, NULL }
2454 static const value_string rsvp_c_type_call_id_vals[] = {
2455 {0, "Empty"},
2456 {1, "Operator Specific"},
2457 {2, "Globally Unique"},
2458 {0, NULL }
2461 static const value_string rsvp_c_type_hop_vals[] = {
2462 {1, "IPv4"},
2463 {2, "IPv6"},
2464 {3, "IPv4 IF-ID"},
2465 {4, "IPv6 IF-ID"},
2466 {0, NULL }
2469 static const value_string rsvp_c_type_time_values_vals[] = {
2470 {1, "Time Values"},
2471 {0, NULL }
2474 static const value_string rsvp_c_type_error_vals[] = {
2475 {1, "IPv4"},
2476 {2, "IPv6"},
2477 {3, "IPv4 IF-ID"},
2478 {4, "IPv6 IF-ID"},
2479 {0, NULL }
2482 static const value_string rsvp_c_type_scope_vals[] = {
2483 {1, "IPv4"},
2484 {2, "IPv6"},
2485 {0, NULL }
2488 static const value_string rsvp_c_type_style_vals[] = {
2489 {1, "Style"},
2490 {0, NULL }
2493 static const value_string rsvp_c_type_confirm_vals[] = {
2494 {1, "IPv4"},
2495 {2, "IPv6"},
2496 {0, NULL }
2499 static const value_string rsvp_c_type_template_vals[] = {
2500 {1, "IPv4"},
2501 {2, "IPv6"},
2502 {7, "IPv4 LSP"},
2503 {8, "IPv6 LSP"},
2504 {9, "IPv4 Aggregate"},
2505 {12, "P2MP_LSP_TUNNEL_IPv4"},
2506 {13, "P2MP_LSP_TUNNEL_IPv6"},
2507 {0, NULL }
2510 static const value_string rsvp_c_type_tspec_vals[] = {
2511 {2, "Integrated Services"},
2512 {4, "SONET/SDH"},
2513 {5, "G.709"},
2514 {6, "Ethernet"},
2515 {0, NULL }
2518 static const value_string rsvp_c_type_flowspec_vals[] = {
2519 {2, "Integrated Services"},
2520 {4, "SONET/SDH"},
2521 {5, "G.709"},
2522 {6, "Ethernet"},
2523 {0, NULL }
2526 static const value_string rsvp_c_type_label_request_vals[] = {
2527 { 2, "Label Request with ATM label Range"},
2528 { 3, "Label Request with Frame-Relay label Range"},
2529 { 4, "Generalized Label Request"},
2530 { 5, "Generalized Channel_set Label Request"},
2531 { 0, NULL }
2534 static const value_string rsvp_c_type_attribute_vals[] = {
2535 { 1, "IPv4 LSP"},
2536 { 7, "IPv4 LSP Resource Affinities"},
2537 { 0, NULL }
2540 static const value_string rsvp_c_type_association_vals[] = {
2541 { 1, "IPv4"},
2542 { 2, "IPv6"},
2543 { 4, "Routing Area"},
2544 { 0, NULL }
2547 static const value_string rsvp_c_type_tunnel_if_vals[] = {
2548 { 1, "Unnumbered interface"},
2549 { 2, "IPv4"},
2550 { 3, "IPv6"},
2551 { 4, "Unnumbered interface with target"},
2552 { 0, NULL }
2555 static const value_string rsvp_c_type_diffserv_vals[] = {
2556 { 1, "E-LSP"},
2557 { 2, "L-LSP"},
2558 { 0, NULL }
2561 static const value_string rsvp_c_type_label_vals[] = {
2562 { 1, "Packet Label"},
2563 { 2, "Generalized Label"},
2564 { 4, "Generalized Channel_set"},
2565 { 0, NULL }
2568 static const value_string rsvp_c_type_notify_request_vals[] = {
2569 { 1, "IPv4"},
2570 { 2, "IPv6"},
2571 { 0, NULL }
2574 static const value_string rsvp_c_type_s2l_sub_lsp_vals[] = {
2575 { 1, "IPv4"},
2576 { 2, "IPv6"},
2577 { 0, NULL }
2580 static char *
2581 summary_session(wmem_allocator_t *pool, tvbuff_t *tvb, int offset)
2583 switch(tvb_get_uint8(tvb, offset+3)) {
2584 case RSVP_SESSION_TYPE_IPV4:
2585 return wmem_strdup_printf(pool,
2586 "SESSION: IPv4, Destination %s, Protocol %d, Port %d. ",
2587 tvb_ip_to_str(pool, tvb, offset+4),
2588 tvb_get_uint8(tvb, offset+8),
2589 tvb_get_ntohs(tvb, offset+10));
2590 break;
2591 case RSVP_SESSION_TYPE_IPV4_LSP:
2592 return wmem_strdup_printf(pool,
2593 "SESSION: IPv4-LSP, Destination %s, Short Call ID %d, Tunnel ID %d, Ext ID %0x. ",
2594 tvb_ip_to_str(pool, tvb, offset+4),
2595 tvb_get_ntohs(tvb, offset+8),
2596 tvb_get_ntohs(tvb, offset+10),
2597 tvb_get_ntohl(tvb, offset+12));
2598 break;
2599 case RSVP_SESSION_TYPE_IPV6_LSP:
2600 return wmem_strdup_printf(pool,
2601 "SESSION: IPv6-LSP, Destination %s, Short Call ID %d, Tunnel ID %d, Ext ID %0x%0x%0x%0x. ",
2602 tvb_ip6_to_str(pool, tvb, offset+4),
2603 tvb_get_ntohs(tvb, offset+20),
2604 tvb_get_ntohs(tvb, offset+22),
2605 tvb_get_ntohl(tvb, offset+24),
2606 tvb_get_ntohl(tvb, offset+28),
2607 tvb_get_ntohl(tvb, offset+32),
2608 tvb_get_ntohl(tvb, offset+36));
2609 case RSVP_SESSION_TYPE_AGGREGATE_IPV4:
2610 return wmem_strdup_printf(pool,
2611 "SESSION: IPv4-Aggregate, Destination %s, DSCP %d. ",
2612 tvb_ip_to_str(pool, tvb, offset+4),
2613 tvb_get_uint8(tvb, offset+11));
2614 break;
2615 case RSVP_SESSION_TYPE_IPV4_UNI:
2616 return wmem_strdup_printf(pool,
2617 "SESSION: IPv4-UNI, Destination %s, Tunnel ID %d, Ext Address %s. ",
2618 tvb_ip_to_str(pool, tvb, offset+4),
2619 tvb_get_ntohs(tvb, offset+10),
2620 tvb_ip_to_str(pool, tvb, offset+12));
2621 break;
2622 case RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV4:
2623 return wmem_strdup_printf(pool,
2624 "SESSION: IPv4-P2MP LSP TUNNEL, P2MP ID %u, Tunnel ID %d, Ext Tunnel %s. ",
2625 tvb_get_ntohl(tvb, offset+4),
2626 tvb_get_ntohs(tvb, offset+10),
2627 tvb_ip_to_str(pool, tvb, offset+12));
2628 break;
2629 case RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV6:
2630 return wmem_strdup_printf(pool,
2631 "SESSION: IPv6-P2MP LSP TUNNEL, P2MP ID %u, Tunnel ID %d, Ext Tunnel %s. ",
2632 tvb_get_ntohl(tvb, offset+4),
2633 tvb_get_ntohs(tvb, offset+10),
2634 tvb_ip6_to_str(pool, tvb, offset+12));
2635 break;
2636 case RSVP_SESSION_TYPE_IPV4_E_NNI:
2637 return wmem_strdup_printf(pool,
2638 "SESSION: IPv4-E-NNI, Destination %s, Tunnel ID %d, Ext Address %s. ",
2639 tvb_ip_to_str(pool, tvb, offset+4),
2640 tvb_get_ntohs(tvb, offset+10),
2641 tvb_ip_to_str(pool, tvb, offset+12));
2642 break;
2643 default:
2644 return wmem_strdup_printf(pool,
2645 "SESSION: Type %d. ", tvb_get_uint8(tvb, offset+3));
2646 break;
2648 DISSECTOR_ASSERT_NOT_REACHED();
2651 static char *
2652 summary_template(wmem_allocator_t *pool, tvbuff_t *tvb, int offset)
2654 const char *objtype;
2656 if (tvb_get_uint8(tvb, offset+2) == RSVP_CLASS_FILTER_SPEC)
2657 objtype = "FILTERSPEC";
2658 else
2659 objtype = "SENDER TEMPLATE";
2661 switch(tvb_get_uint8(tvb, offset+3)) {
2662 case 1:
2663 return wmem_strdup_printf(pool,
2664 "%s: IPv4, Sender %s, Port %d. ", objtype,
2665 tvb_ip_to_str(pool, tvb, offset+4),
2666 tvb_get_ntohs(tvb, offset+10));
2667 break;
2668 case 7:
2669 return wmem_strdup_printf(pool,
2670 "%s: IPv4-LSP, Tunnel Source: %s, Short Call ID: %d, LSP ID: %d. ", objtype,
2671 tvb_ip_to_str(pool, tvb, offset+4),
2672 tvb_get_ntohs(tvb, offset+8),
2673 tvb_get_ntohs(tvb, offset+10));
2674 break;
2675 case 8:
2676 return wmem_strdup_printf(pool,
2677 "%s: IPv6-LSP, Tunnel Source: %s, Short Call ID: %d, LSP ID: %d. ", objtype,
2678 tvb_ip6_to_str(pool, tvb, offset+4),
2679 tvb_get_ntohs(tvb, offset+20),
2680 tvb_get_ntohs(tvb, offset+22));
2681 break;
2682 case 9:
2683 return wmem_strdup_printf(pool,
2684 "%s: IPv4-Aggregate, Aggregator %s. ", objtype,
2685 tvb_ip_to_str(pool, tvb, offset+4));
2686 break;
2687 case 12:
2688 return wmem_strdup_printf(pool,
2689 "%s: P2MP_LSP_TUNNEL_IPv4, IPv4 tunnel sender address %s, LSP ID: %d, Sub-Group ID %d. ", objtype,
2690 tvb_ip_to_str(pool, tvb, offset+4),
2691 tvb_get_ntohs(tvb, offset+10),
2692 tvb_get_ntohs(tvb, offset+18));
2693 break;
2694 case 13:
2695 return wmem_strdup_printf(pool,
2696 "%s: P2MP_LSP_TUNNEL_IPv6, IPv6 tunnel sender address %s, LSP ID: %d, Sub-Group ID %d. ", objtype,
2697 tvb_ip_to_str(pool, tvb, offset+4),
2698 tvb_get_ntohs(tvb, offset+22),
2699 tvb_get_ntohs(tvb, offset+40));
2700 break;
2701 default:
2702 return wmem_strdup_printf(pool,
2703 "%s: Type %d. ", objtype, tvb_get_uint8(tvb, offset+3));
2704 break;
2706 DISSECTOR_ASSERT_NOT_REACHED();
2709 /*------------------------------------------------------------------------------
2710 * SESSION
2711 *------------------------------------------------------------------------------*/
2712 static void
2713 dissect_rsvp_session(packet_info *pinfo, proto_item *ti, proto_tree *rsvp_object_tree,
2714 tvbuff_t *tvb,
2715 int offset, int obj_length,
2716 int rsvp_class _U_, int type,
2717 rsvp_conversation_info *rsvph)
2719 proto_item *hidden_item;
2720 int offset2 = offset + 4;
2722 proto_item_set_text(ti, "%s", summary_session(pinfo->pool, tvb, offset));
2724 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
2725 proto_item_set_hidden(hidden_item);
2727 switch(type) {
2728 case RSVP_SESSION_TYPE_IPV4:
2729 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_session, tvb, offset+3, 1, ENC_BIG_ENDIAN);
2730 proto_tree_add_item(rsvp_object_tree,
2731 hf_rsvp_filter[RSVPF_SESSION_IP],
2732 tvb, offset2, 4, ENC_BIG_ENDIAN);
2734 proto_tree_add_item(rsvp_object_tree,
2735 hf_rsvp_filter[RSVPF_SESSION_PROTO], tvb,
2736 offset2+4, 1, ENC_BIG_ENDIAN);
2737 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_flags, tvb, offset2+5, 1, ENC_BIG_ENDIAN);
2738 proto_tree_add_item(rsvp_object_tree,
2739 hf_rsvp_filter[RSVPF_SESSION_PORT], tvb,
2740 offset2+6, 2, ENC_BIG_ENDIAN);
2743 * Save this information to build the conversation request key
2744 * later.
2746 rsvph->session_type = RSVP_SESSION_TYPE_IPV4;
2747 set_address_tvb(&rsvph->destination, AT_IPv4, 4, tvb, offset2);
2748 rsvph->protocol = tvb_get_uint8(tvb, offset2+4);
2749 rsvph->udp_dest_port = tvb_get_ntohs(tvb, offset2+6);
2751 break;
2753 case RSVP_SESSION_TYPE_IPV6:
2754 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_session, tvb, offset+3, 1, ENC_BIG_ENDIAN);
2755 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_destination_address, tvb, offset2, 16, ENC_NA);
2756 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_protocol, tvb, offset2+16, 1, ENC_BIG_ENDIAN);
2757 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_flags, tvb, offset2+17, 1, ENC_BIG_ENDIAN);
2758 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_destination_port, tvb, offset2+18, 2, ENC_BIG_ENDIAN);
2760 * Save this information to build the conversation request key
2761 * later. IPv6 conversatiuon support is not implemented yet, so only
2762 * the session type is stored.
2764 rsvph->session_type = RSVP_SESSION_TYPE_IPV6;
2766 break;
2768 case RSVP_SESSION_TYPE_IPV4_LSP:
2769 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_session, tvb, offset+3, 1, ENC_BIG_ENDIAN);
2770 proto_tree_add_item(rsvp_object_tree,
2771 hf_rsvp_filter[RSVPF_SESSION_IP],
2772 tvb, offset2, 4, ENC_BIG_ENDIAN);
2774 /*short call id*/
2775 proto_tree_add_item(rsvp_object_tree,
2776 hf_rsvp_filter[RSVPF_SESSION_SHORT_CALL_ID],
2777 tvb, offset2+4, 2, ENC_BIG_ENDIAN);
2779 proto_tree_add_item(rsvp_object_tree,
2780 hf_rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
2781 tvb, offset2+6, 2, ENC_BIG_ENDIAN);
2783 proto_tree_add_uint_format_value(rsvp_object_tree, hf_rsvp_extended_tunnel_id, tvb, offset2+8, 4,
2784 tvb_get_ntohl(tvb, offset2+8), "%u (%s)",
2785 tvb_get_ntohl(tvb, offset2+8),
2786 tvb_ip_to_str(pinfo->pool, tvb, offset2+8));
2787 hidden_item = proto_tree_add_item(rsvp_object_tree,
2788 hf_rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
2789 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
2790 proto_item_set_hidden(hidden_item);
2793 * Save this information to build the conversation request key
2794 * later.
2796 rsvph->session_type = RSVP_SESSION_TYPE_IPV4_LSP;
2797 set_address_tvb(&rsvph->destination, AT_IPv4, 4, tvb, offset2);
2798 rsvph->udp_dest_port = tvb_get_ntohs(tvb, offset2+6);
2799 rsvph->ext_tunnel_id = tvb_get_ntohl(tvb, offset2 + 8);
2800 break;
2802 case RSVP_SESSION_TYPE_IPV6_LSP:
2803 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_session, tvb, offset+3, 1, ENC_BIG_ENDIAN);
2804 proto_tree_add_item(rsvp_object_tree,
2805 hf_rsvp_filter[RSVPF_SESSION_IP],
2806 tvb, offset2, 16, ENC_BIG_ENDIAN);
2808 /*short call id*/
2809 proto_tree_add_item(rsvp_object_tree,
2810 hf_rsvp_filter[RSVPF_SESSION_SHORT_CALL_ID],
2811 tvb, offset2+16, 2, ENC_BIG_ENDIAN);
2813 proto_tree_add_item(rsvp_object_tree,
2814 hf_rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
2815 tvb, offset2+18, 2, ENC_BIG_ENDIAN);
2817 proto_tree_add_item(rsvp_object_tree, hf_rsvp_extended_tunnel_ipv6, tvb, offset2+20, 16, ENC_NA);
2818 proto_item_set_text(ti, "Extended Tunnel ID: (%s)", tvb_ip6_to_str(pinfo->pool, tvb, offset2+20));
2821 hidden_item = proto_tree_add_item(rsvp_object_tree,
2822 hf_rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID_IPV6],
2823 tvb, offset2+20, 16, ENC_NA);
2824 proto_item_set_hidden(hidden_item);
2827 * Save this information to build the conversation request key
2828 * later.
2830 rsvph->session_type = RSVP_SESSION_TYPE_IPV6_LSP;
2831 set_address_tvb(&rsvph->destination, AT_IPv6, 16, tvb, offset2);
2832 rsvph->udp_dest_port = tvb_get_ntohs(tvb, offset2+18);
2833 rsvph->ext_tunnel_id_ipv6_pre = tvb_get_ntoh64(tvb, offset2+20);
2834 rsvph->ext_tunnel_id_ipv6_post = tvb_get_ntoh64(tvb, offset2+28);
2835 break;
2838 case RSVP_SESSION_TYPE_AGGREGATE_IPV4:
2839 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_session, tvb, offset+3, 1, ENC_BIG_ENDIAN);
2840 proto_tree_add_item(rsvp_object_tree,
2841 hf_rsvp_filter[RSVPF_SESSION_IP],
2842 tvb, offset2, 4, ENC_BIG_ENDIAN);
2844 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_dscp, tvb, offset2+7, 1, ENC_BIG_ENDIAN);
2846 * Save this information to build the conversation request key
2847 * later.
2849 rsvph->session_type = RSVP_SESSION_TYPE_AGGREGATE_IPV4;
2850 set_address_tvb(&rsvph->destination, AT_IPv4, 4, tvb, offset2);
2851 rsvph->dscp = tvb_get_uint8(tvb, offset2+7);
2852 rsvph->ext_tunnel_id = tvb_get_ntohl(tvb, offset2 + 8);
2853 break;
2855 case RSVP_SESSION_TYPE_IPV4_UNI:
2856 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_session, tvb, offset+3, 1, ENC_BIG_ENDIAN);
2857 proto_tree_add_item(rsvp_object_tree,
2858 hf_rsvp_filter[RSVPF_SESSION_IP],
2859 tvb, offset2, 4, ENC_BIG_ENDIAN);
2861 proto_tree_add_item(rsvp_object_tree,
2862 hf_rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
2863 tvb, offset2+6, 2, ENC_BIG_ENDIAN);
2865 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_extended_ipv4_address, tvb, offset2+8, 4, ENC_BIG_ENDIAN);
2866 hidden_item = proto_tree_add_item(rsvp_object_tree,
2867 hf_rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
2868 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
2869 proto_item_set_hidden(hidden_item);
2872 * Save this information to build the conversation request key
2873 * later.
2875 rsvph->session_type = RSVP_SESSION_TYPE_IPV4_UNI;
2876 set_address_tvb(&rsvph->destination, AT_IPv4, 4, tvb, offset2);
2877 rsvph->udp_dest_port = tvb_get_ntohs(tvb, offset2+6);
2878 rsvph->ext_tunnel_id = tvb_get_ntohl(tvb, offset2 + 8);
2880 break;
2882 case RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV4:
2883 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_session, tvb, offset+3, 1, ENC_BIG_ENDIAN);
2884 proto_tree_add_item(rsvp_object_tree,
2885 hf_rsvp_session_p2mp_id,
2886 tvb, offset2, 4, ENC_BIG_ENDIAN);
2888 proto_tree_add_item(rsvp_object_tree,
2889 hf_rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
2890 tvb, offset2+6, 2, ENC_BIG_ENDIAN);
2892 proto_tree_add_item(rsvp_object_tree, hf_rsvp_extended_tunnel, tvb, offset2+8, 4, ENC_BIG_ENDIAN);
2893 hidden_item = proto_tree_add_item(rsvp_object_tree,
2894 hf_rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
2895 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
2896 proto_item_set_hidden(hidden_item);
2899 * Save this information to build the conversation request key
2900 * later.
2902 rsvph->session_type = RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV4;
2903 set_address_tvb(&rsvph->destination, AT_IPv4, 4, tvb, offset2);
2904 rsvph->udp_dest_port = tvb_get_ntohs(tvb, offset2+6);
2905 rsvph->ext_tunnel_id = tvb_get_ntohl(tvb, offset2 + 8);
2907 break;
2908 case RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV6:
2909 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_session, tvb, offset+3, 1, ENC_BIG_ENDIAN);
2910 proto_tree_add_item(rsvp_object_tree,
2911 hf_rsvp_session_p2mp_id,
2912 tvb, offset2, 4, ENC_BIG_ENDIAN);
2914 proto_tree_add_item(rsvp_object_tree,
2915 hf_rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
2916 tvb, offset2+6, 2, ENC_BIG_ENDIAN);
2918 proto_tree_add_item(rsvp_object_tree, hf_rsvp_extended_tunnel_ipv6, tvb, offset2+8, 16, ENC_NA);
2919 hidden_item = proto_tree_add_item(rsvp_object_tree,
2920 hf_rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID_IPV6],
2921 tvb, offset2+8, 16, ENC_NA);
2922 proto_item_set_hidden(hidden_item);
2925 * Save this information to build the conversation request key
2926 * later.
2928 rsvph->session_type = RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV6;
2929 set_address_tvb(&rsvph->destination, AT_IPv6, 16, tvb, offset2);
2930 rsvph->udp_dest_port = tvb_get_ntohs(tvb, offset2+18);
2931 rsvph->ext_tunnel_id_ipv6_pre = tvb_get_ntoh64(tvb, offset2+20);
2932 rsvph->ext_tunnel_id_ipv6_post = tvb_get_ntoh64(tvb, offset2+28);
2933 break;
2935 case RSVP_SESSION_TYPE_IPV4_E_NNI:
2936 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_session, tvb, offset+3, 1, ENC_BIG_ENDIAN);
2937 proto_tree_add_item(rsvp_object_tree,
2938 hf_rsvp_filter[RSVPF_SESSION_IP],
2939 tvb, offset2, 4, ENC_BIG_ENDIAN);
2941 proto_tree_add_item(rsvp_object_tree,
2942 hf_rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
2943 tvb, offset2+6, 2, ENC_BIG_ENDIAN);
2945 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_extended_ipv4_address, tvb, offset2+8, 4, ENC_BIG_ENDIAN);
2946 hidden_item = proto_tree_add_item(rsvp_object_tree,
2947 hf_rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
2948 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
2949 proto_item_set_hidden(hidden_item);
2952 * Save this information to build the conversation request key
2953 * later.
2955 rsvph->session_type = RSVP_SESSION_TYPE_IPV4_E_NNI;
2956 set_address_tvb(&rsvph->destination, AT_IPv4, 4, tvb, offset2);
2957 rsvph->udp_dest_port = tvb_get_ntohs(tvb, offset2+6);
2958 rsvph->ext_tunnel_id = tvb_get_ntohl(tvb, offset2 + 8);
2960 break;
2962 default:
2963 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_session, tvb, offset+3, 1, ENC_BIG_ENDIAN);
2964 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_data, tvb, offset2, obj_length-4, ENC_NA);
2965 break;
2969 /*------------------------------------------------------------------------------
2970 * TLVs for HOP, ERROR and other IF_ID extended objects (RFC4920)
2971 * (TODO: TLV type 12, 13, 25)
2972 *------------------------------------------------------------------------------*/
2973 static void
2974 // NOLINTNEXTLINE(misc-no-recursion)
2975 dissect_rsvp_ifid_tlv(proto_tree *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
2976 tvbuff_t *tvb, int offset, int length,
2977 int subtree_type)
2979 int tlv_off, padding;
2980 uint16_t tlv_type;
2981 int tlv_len;
2982 uint8_t isis_len;
2983 const char *tlv_name, *ip_str;
2984 proto_tree *rsvp_ifid_subtree=NULL, *ti2 = NULL;
2986 for (tlv_off = 0; tlv_off < length; ) {
2987 tlv_type = tvb_get_ntohs(tvb, offset+tlv_off);
2988 tlv_len = tvb_get_ntohs(tvb, offset+tlv_off+2);
2990 if ((tlv_len == 0) || (tlv_off+tlv_len > length)) {
2991 proto_tree_add_expert_format(rsvp_object_tree, pinfo, &ei_rsvp_invalid_length,
2992 tvb, offset+tlv_off+2, 2, "Invalid TLV length");
2993 return;
2995 switch(tlv_type) {
2996 case 1: /* IPv4 */
2997 tlv_name = "";
2998 goto ifid_ipv4;
2999 case 14: /* PREVIOUS_HOP_IPV4 */
3000 tlv_name = "Previous-Hop ";
3001 goto ifid_ipv4;
3002 case 16: /* INCOMING_IPV4 */
3003 tlv_name = "Incoming ";
3004 ifid_ipv4:
3005 ip_str = tvb_ip_to_str(pinfo->pool, tvb, offset+tlv_off+4);
3006 rsvp_ifid_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
3007 offset+tlv_off, tlv_len,
3008 subtree_type, NULL, "%sIPv4 TLV - %s", tlv_name,
3009 ip_str);
3011 proto_tree_add_uint_format_value(rsvp_ifid_subtree, hf_rsvp_type, tvb, offset+tlv_off, 2,
3012 tlv_type, "%d (%sIPv4)", tlv_type, tlv_name);
3013 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_length, tvb, offset+tlv_off+2, 2, ENC_BIG_ENDIAN);
3014 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_ipv4_address, tvb, offset+tlv_off+4, 4, ENC_BIG_ENDIAN);
3015 proto_item_append_text(ti, "%sIPv4: %s. ", tlv_name, ip_str);
3016 break;
3018 case 2: /* IPv6 */
3019 tlv_name = "";
3020 goto ifid_ipv6;
3021 case 15: /* PREVIOUS_HOP_IPV6 */
3022 tlv_name = "Previous-Hop ";
3023 goto ifid_ipv6;
3024 case 17: /* INCOMING_IPV6 */
3025 tlv_name = "Incoming ";
3026 ifid_ipv6:
3027 ip_str = tvb_ip6_to_str(pinfo->pool, tvb, offset+tlv_off+4);
3028 rsvp_ifid_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
3029 offset+tlv_off, tlv_len,
3030 subtree_type, NULL, "%sIPv6 TLV - %s", tlv_name, ip_str);
3032 proto_tree_add_uint_format_value(rsvp_ifid_subtree, hf_rsvp_type, tvb, offset+tlv_off, 2,
3033 tlv_type, "%d (%sIPv6)", tlv_type, tlv_name);
3034 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_length, tvb, offset+tlv_off+2, 2, ENC_BIG_ENDIAN);
3035 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_ipv6_address, tvb, offset+tlv_off+4, 16, ENC_NA);
3036 proto_item_append_text(ti, "%sIPv6: %s. ", tlv_name, ip_str);
3037 break;
3039 case 3: /* IF_INDEX */
3040 tlv_name = "";
3041 goto ifid_ifindex;
3042 case 4: /* COMPONENT_IF_DOWNSTREAM */
3043 tlv_name = " Forward";
3044 goto ifid_ifindex;
3045 case 5: /* COMPONENT_IF_UPSTREAM */
3046 tlv_name = " Reverse";
3047 goto ifid_ifindex;
3048 case 18: /* INCOMING_IF_INDEX */
3049 tlv_name = " Incoming";
3050 ifid_ifindex:
3051 ip_str = tvb_ip_to_str(pinfo->pool, tvb, offset+tlv_off+4);
3052 rsvp_ifid_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
3053 offset+tlv_off, tlv_len,
3054 subtree_type, NULL, "Interface-Index%s TLV - %s, %d",
3055 tlv_name,
3056 ip_str,
3057 tvb_get_ntohl(tvb, offset+tlv_off+8));
3058 proto_tree_add_uint_format_value(rsvp_ifid_subtree, hf_rsvp_type, tvb, offset+tlv_off, 2,
3059 tlv_type, "%d (Interface Index%s)", tlv_type, tlv_name);
3060 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_length, tvb, offset+tlv_off+2, 2, ENC_BIG_ENDIAN);
3061 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_ipv4_address, tvb, offset+tlv_off+4, 4, ENC_BIG_ENDIAN);
3062 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlvinterface_id, tvb, offset+tlv_off+8, 4, ENC_BIG_ENDIAN);
3063 proto_item_append_text(ti, "Data If-Index%s: %s, %d. ", tlv_name, ip_str,
3064 tvb_get_ntohl(tvb, offset+tlv_off+8));
3065 break;
3067 case 6: /* DOWNSTREAM_LABEL */
3068 tlv_name = "Downstream";
3069 goto ifid_label;
3070 case 7: /* UPSTREAM_LABEL */
3071 tlv_name = "Upstream";
3072 goto ifid_label;
3073 case 19: /* INCOMING_DOWN_LABEL */
3074 tlv_name = "Incoming-Downstream";
3075 goto ifid_label;
3076 case 20: /* INCOMING_UP_LABEL */
3077 tlv_name = "Incoming-Upstream";
3078 ifid_label:
3079 rsvp_ifid_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
3080 offset+tlv_off, tlv_len,
3081 subtree_type, NULL, "%s-Label TLV - %u", tlv_name,
3082 tvb_get_ntohl(tvb, offset+tlv_off+4));
3083 proto_tree_add_uint_format_value(rsvp_ifid_subtree, hf_rsvp_type, tvb, offset+tlv_off, 2,
3084 tlv_type, "%d (%s-Label)", tlv_type, tlv_name);
3085 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_length, tvb, offset+tlv_off+2, 2, ENC_BIG_ENDIAN);
3086 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_label, tvb, offset+tlv_off+4, 4, ENC_BIG_ENDIAN);
3087 proto_item_append_text(ti, "%s-Label: %u. ", tlv_name,
3088 tvb_get_ntohl(tvb, offset+tlv_off+4));
3089 break;
3092 case 8: /* NODE_ID */
3093 tlv_name = "";
3094 goto ifid_nodeid;
3095 case 21: /* REPORTING_NODE_ID */
3096 tlv_name = "Reporting-";
3097 ifid_nodeid:
3098 ip_str = tvb_ip_to_str(pinfo->pool, tvb, offset+tlv_off+4);
3099 rsvp_ifid_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
3100 offset+tlv_off, tlv_len,
3101 subtree_type, NULL, "%sNode-ID TLV - %s", tlv_name,
3102 ip_str);
3103 proto_tree_add_uint_format_value(rsvp_ifid_subtree, hf_rsvp_type, tvb, offset+tlv_off, 2,
3104 tlv_type, "%d (%sNode-ID)", tlv_type, tlv_name);
3105 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_length, tvb, offset+tlv_off+2, 2, ENC_BIG_ENDIAN);
3106 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_node_id, tvb, offset+tlv_off+4, 4, ENC_BIG_ENDIAN);
3107 proto_item_append_text(ti, "%sNode-ID: %s. ", tlv_name, ip_str);
3108 break;
3110 case 9: /* OSPF_AREA */
3111 tlv_name = "";
3112 goto ifid_ospf;
3113 case 22: /* REPORTING_OSPF_AREA */
3114 tlv_name = "Reporting-";
3115 ifid_ospf:
3116 rsvp_ifid_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
3117 offset+tlv_off, tlv_len,
3118 subtree_type, NULL, "%sOSPF-Area TLV - %u", tlv_name,
3119 tvb_get_ntohl(tvb, offset+tlv_off+4));
3120 proto_tree_add_uint_format_value(rsvp_ifid_subtree, hf_rsvp_type, tvb, offset+tlv_off, 2,
3121 tlv_type, "%d (%sOSPF-Area)", tlv_type, tlv_name);
3122 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_length, tvb, offset+tlv_off+2, 2, ENC_BIG_ENDIAN);
3123 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_area, tvb, offset+tlv_off+4, 4, ENC_BIG_ENDIAN);
3124 proto_item_append_text(ti, "%sOSPF-Area: %u. ", tlv_name,
3125 tvb_get_ntohl(tvb, offset+tlv_off+4));
3126 break;
3128 case 10: /* ISIS_AREA */
3129 tlv_name = "";
3130 goto ifid_isis;
3131 case 23: /* REPORTING_ISIS_AREA */
3132 tlv_name = "Reporting-";
3133 ifid_isis:
3134 isis_len = tvb_get_uint8(tvb, offset+tlv_off+4);
3135 if ((isis_len < 2) || (isis_len > 11))
3137 proto_tree_add_expert_format(rsvp_object_tree, pinfo, &ei_rsvp_invalid_length, tvb, offset+tlv_off, tlv_len,
3138 "%sISIS-Area TLV - Invalid Length field", tlv_name);
3139 break;
3141 ip_str = print_nsap_net(pinfo->pool, tvb, offset+tlv_off+5, isis_len);
3142 rsvp_ifid_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
3143 offset+tlv_off, tlv_len,
3144 subtree_type, NULL, "%sISIS-Area TLV - %s", tlv_name,
3145 ip_str);
3146 proto_tree_add_uint_format_value(rsvp_ifid_subtree, hf_rsvp_type, tvb, offset+tlv_off, 2,
3147 tlv_type, "%d (%sISIS-Area)", tlv_type, tlv_name);
3148 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_length, tvb, offset+tlv_off+2, 2, ENC_BIG_ENDIAN);
3149 proto_tree_add_string(rsvp_ifid_subtree, hf_rsvp_isis_area_id, tvb, offset+tlv_off+4, 4, ip_str);
3150 proto_item_append_text(ti, "%sISIS-Area: %s. ", tlv_name, ip_str);
3151 break;
3153 case 11: /* AUTONOMOUS_SYSTEM */
3154 tlv_name = "";
3155 goto ifid_as;
3156 case 24: /* REPORTING_AUTONOMOUS_SYSTEM */
3157 tlv_name = "Reporting-";
3158 ifid_as:
3159 rsvp_ifid_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
3160 offset+tlv_off, tlv_len,
3161 subtree_type, NULL, "%sAS TLV - %u", tlv_name,
3162 tvb_get_ntohl(tvb, offset+tlv_off+4));
3163 proto_tree_add_uint_format_value(rsvp_ifid_subtree, hf_rsvp_type, tvb, offset+tlv_off, 2,
3164 tlv_type, "%d (%sAS)", tlv_type, tlv_name);
3165 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_length, tvb, offset+tlv_off+2, 2, ENC_BIG_ENDIAN);
3166 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_autonomous_system, tvb, offset+tlv_off+4, 4, ENC_BIG_ENDIAN);
3167 proto_item_append_text(ti, "%sAS: %u. ", tlv_name,
3168 tvb_get_ntohl(tvb, offset+tlv_off+4));
3169 break;
3171 case 26: /* NODE_EXCLUSIONS */
3172 tlv_name = "Node";
3173 goto ifid_ex;
3174 case 27: /* LINK_EXCLUSIONS */
3175 tlv_name = "Link";
3176 ifid_ex:
3177 rsvp_ifid_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
3178 offset+tlv_off, tlv_len,
3179 subtree_type, &ti2, "%s-Exclusions TLV - ", tlv_name);
3180 proto_tree_add_uint_format_value(rsvp_ifid_subtree, hf_rsvp_type, tvb, offset+tlv_off, 2,
3181 tlv_type, "%d (%s-Exclusions)", tlv_type, tlv_name);
3182 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_length, tvb, offset+tlv_off+2, 2, ENC_BIG_ENDIAN);
3183 increment_dissection_depth(pinfo);
3184 dissect_rsvp_ifid_tlv(ti2, pinfo, rsvp_ifid_subtree, tvb, offset+tlv_off+4,
3185 tlv_len-4, TREE(TT_HOP_SUBOBJ));
3186 decrement_dissection_depth(pinfo);
3187 break;
3188 case 516:
3189 /* FF: ERROR_STRING TLV, RFC 4783 */
3190 rsvp_ifid_subtree = proto_tree_add_subtree_format(rsvp_object_tree,
3191 tvb, offset + tlv_off,
3192 tlv_len,
3193 subtree_type, NULL, "ERROR_STRING TLV - %s",
3194 tvb_format_text(pinfo->pool, tvb, offset + tlv_off + 4,
3195 tlv_len - 4));
3196 proto_tree_add_uint_format_value(rsvp_ifid_subtree, hf_rsvp_type, tvb, offset + tlv_off, 2,
3197 tlv_type, "516 (ERROR_STRING)");
3198 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_length, tvb, offset + tlv_off + 2, 2, ENC_BIG_ENDIAN);
3199 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_error_string, tvb, offset + tlv_off + 4, tlv_len - 4, ENC_NA|ENC_ASCII);
3200 break;
3202 default:
3203 /* FF: not yet known TLVs are displayed as raw data */
3204 rsvp_ifid_subtree = proto_tree_add_subtree_format(rsvp_object_tree,
3205 tvb, offset + tlv_off,
3206 tlv_len,
3207 subtree_type, NULL, "Unknown TLV (%u)", tlv_type);
3208 proto_tree_add_uint_format_value(rsvp_ifid_subtree, hf_rsvp_type, tvb, offset + tlv_off, 2,
3209 tlv_type, "%u (Unknown)", tlv_type);
3210 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_length, tvb, offset + tlv_off + 2, 2, ENC_BIG_ENDIAN);
3211 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_data, tvb, offset + tlv_off + 4, tlv_len - 4, ENC_NA);
3212 break;
3215 padding = (4 - (tlv_len % 4)) % 4;
3216 if (padding != 0)
3217 proto_tree_add_item(rsvp_ifid_subtree, hf_rsvp_ifid_tlv_padding, tvb, offset + tlv_off + tlv_len, padding, ENC_NA);
3218 tlv_off += tlv_len + padding;
3222 /*------------------------------------------------------------------------------
3223 * HOP
3224 *------------------------------------------------------------------------------*/
3225 static void
3226 dissect_rsvp_hop(proto_item *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
3227 tvbuff_t *tvb,
3228 int offset, int obj_length,
3229 int rsvp_class _U_, int type)
3231 int offset2 = offset + 4;
3232 proto_tree *hidden_item;
3234 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3235 proto_item_set_hidden(hidden_item);
3237 switch(type) {
3238 case 1:
3239 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_hop, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3240 proto_tree_add_item(rsvp_object_tree, hf_rsvp_hop_neighbor_address_ipv4, tvb, offset2, 4, ENC_BIG_ENDIAN);
3241 proto_tree_add_item(rsvp_object_tree, hf_rsvp_hop_logical_interface, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
3242 proto_item_set_text(ti, "HOP: IPv4, %s",
3243 tvb_ip_to_str(pinfo->pool, tvb, offset2));
3244 break;
3246 case 2:
3247 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_hop, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3248 proto_tree_add_item(rsvp_object_tree, hf_rsvp_hop_neighbor_address_ipv6, tvb, offset2, 16, ENC_NA);
3249 proto_tree_add_item(rsvp_object_tree, hf_rsvp_hop_logical_interface, tvb, offset2+16, 4, ENC_BIG_ENDIAN);
3250 break;
3252 case 3:
3253 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_hop, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3254 proto_tree_add_item(rsvp_object_tree, hf_rsvp_hop_neighbor_address_ipv4, tvb, offset2, 4, ENC_BIG_ENDIAN);
3255 proto_tree_add_item(rsvp_object_tree, hf_rsvp_hop_logical_interface, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
3257 proto_item_set_text(ti, "HOP: IPv4 IF-ID. Control IPv4: %s. ",
3258 tvb_ip_to_str(pinfo->pool, tvb, offset2));
3260 dissect_rsvp_ifid_tlv(ti, pinfo, rsvp_object_tree, tvb, offset+12, obj_length-12,
3261 TREE(TT_HOP_SUBOBJ));
3263 break;
3265 case 4:
3266 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_hop, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3267 proto_tree_add_item(rsvp_object_tree, hf_rsvp_hop_neighbor_address_ipv6, tvb, offset2, 16, ENC_NA);
3268 proto_tree_add_item(rsvp_object_tree, hf_rsvp_hop_logical_interface, tvb, offset2+16, 4, ENC_BIG_ENDIAN);
3270 proto_item_set_text(ti, "HOP: IPv6 IF-ID. Control IPv6: %s. ",
3271 tvb_ip6_to_str(pinfo->pool, tvb, offset2));
3273 dissect_rsvp_ifid_tlv(ti, pinfo, rsvp_object_tree, tvb, offset+24, obj_length-24,
3274 TREE(TT_HOP_SUBOBJ));
3276 break;
3278 default:
3279 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_hop, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3280 proto_tree_add_item(rsvp_object_tree, hf_rsvp_hop_data, tvb, offset2, obj_length - 4, ENC_NA);
3281 break;
3285 /*------------------------------------------------------------------------------
3286 * TIME VALUES
3287 *------------------------------------------------------------------------------*/
3288 static void
3289 dissect_rsvp_time_values(proto_item *ti, proto_tree *rsvp_object_tree,
3290 tvbuff_t *tvb,
3291 int offset, int obj_length,
3292 int rsvp_class _U_, int type)
3294 int offset2 = offset + 4;
3295 proto_item *hidden_item;
3297 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3298 proto_item_set_hidden(hidden_item);
3300 switch(type) {
3301 case 1:
3302 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_time_values, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3303 proto_tree_add_uint_format_value(rsvp_object_tree, hf_rsvp_refresh_interval, tvb, offset2, 4,
3304 tvb_get_ntohl(tvb, offset2), "%u ms (%u seconds)",
3305 tvb_get_ntohl(tvb, offset2),
3306 tvb_get_ntohl(tvb, offset2)/1000);
3307 proto_item_set_text(ti, "TIME VALUES: %d ms",
3308 tvb_get_ntohl(tvb, offset2));
3309 break;
3311 default:
3312 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_time_values, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3313 proto_tree_add_item(rsvp_object_tree, hf_rsvp_time_values_data, tvb, offset2, obj_length - 4, ENC_NA);
3314 break;
3318 /*------------------------------------------------------------------------------
3319 * Error value field in ERROR object
3320 *------------------------------------------------------------------------------*/
3321 static uint16_t
3322 dissect_rsvp_error_value(proto_tree *ti, tvbuff_t *tvb,
3323 int offset, uint8_t error_code)
3325 uint16_t error_val;
3326 uint8_t error_class, error_ctype;
3327 value_string_ext *rsvp_error_vals_ext_p = NULL;
3329 error_val = tvb_get_ntohs(tvb, offset);
3330 switch (error_code) {
3331 case RSVP_ERROR_ADMISSION:
3332 rsvp_error_vals_ext_p = &rsvp_admission_control_error_vals_ext;
3333 break;
3334 case RSVP_ERROR_POLICY:
3335 rsvp_error_vals_ext_p = &rsvp_policy_control_error_vals_ext;
3336 break;
3337 case RSVP_ERROR_TRAFFIC:
3338 rsvp_error_vals_ext_p = &rsvp_traffic_control_error_vals_ext;
3339 break;
3340 case RSVP_ERROR_ROUTING:
3341 rsvp_error_vals_ext_p = &rsvp_routing_error_vals_ext;
3342 break;
3343 case RSVP_ERROR_NOTIFY:
3344 rsvp_error_vals_ext_p = &rsvp_notify_error_vals_ext;
3345 break;
3346 case RSVP_ERROR_DIFFSERV:
3347 rsvp_error_vals_ext_p = &rsvp_diffserv_error_vals_ext;
3348 break;
3349 case RSVP_ERROR_DSTE:
3350 rsvp_error_vals_ext_p = &rsvp_diffserv_aware_te_error_vals_ext;
3351 break;
3352 case RSVP_ERROR_CALL_MGMT:
3353 rsvp_error_vals_ext_p = &rsvp_call_mgmt_error_vals_ext;
3354 break;
3357 switch (error_code) {
3358 case RSVP_ERROR_ADMISSION:
3359 case RSVP_ERROR_TRAFFIC:
3360 if ((error_val & 0xc0) == 0) {
3361 DISSECTOR_ASSERT(rsvp_error_vals_ext_p != NULL);
3362 proto_tree_add_uint_format_value(ti, hf_rsvp_error_value, tvb, offset, 2,
3363 error_val, "%s (%u)",
3364 val_to_str_ext(error_val, rsvp_error_vals_ext_p, "Unknown (%d)"), error_val);
3366 else if ((error_val & 0xc0) == 0x80) {
3367 proto_tree_add_uint_format_value(ti, hf_rsvp_error_value, tvb, offset, 2,
3368 error_val, "Organization specific subcode (%u)", error_val);
3370 else if ((error_val & 0xc0) == 0xc0) {
3371 proto_tree_add_uint_format_value(ti, hf_rsvp_error_value, tvb, offset, 2,
3372 error_val, "Service specific subcode (%u)", error_val);
3374 break;
3375 case RSVP_ERROR_UNKNOWN_CLASS:
3376 case RSVP_ERROR_UNKNOWN_C_TYPE:
3377 error_class = error_val / 256;
3378 error_ctype = error_val % 256;
3379 proto_tree_add_uint_format_value(ti, hf_rsvp_class, tvb, offset, 2, error_class, "%u (%s) - CType: %u",
3380 error_class, val_to_str_ext_const(error_class, &rsvp_class_vals_ext, "Unknown"),
3381 error_ctype);
3382 break;
3383 case RSVP_ERROR_POLICY:
3384 case RSVP_ERROR_NOTIFY:
3385 case RSVP_ERROR_ROUTING:
3386 case RSVP_ERROR_DIFFSERV:
3387 case RSVP_ERROR_DSTE:
3388 case RSVP_ERROR_CALL_MGMT:
3389 DISSECTOR_ASSERT(rsvp_error_vals_ext_p != NULL);
3390 proto_tree_add_uint_format_value(ti, hf_rsvp_error_value, tvb, offset, 2, error_val, "%s (%u)",
3391 val_to_str_ext(error_val, rsvp_error_vals_ext_p, "Unknown (%d)"), error_val);
3392 break;
3393 default:
3394 proto_tree_add_uint_format_value(ti, hf_rsvp_error_value, tvb, offset, 2, error_val, "%u", error_val);
3395 break;
3397 return error_val;
3400 /*------------------------------------------------------------------------------
3401 * ERROR
3402 *------------------------------------------------------------------------------*/
3403 static void
3404 dissect_rsvp_error(proto_item *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
3405 tvbuff_t *tvb,
3406 int offset, int obj_length,
3407 int rsvp_class _U_, int type)
3409 int offset2 = offset + 4;
3410 int offset3 = 0;
3411 uint8_t error_flags;
3412 uint8_t error_code;
3413 uint16_t error_val;
3414 proto_tree *ti2 = NULL, *rsvp_error_subtree;
3415 proto_item *hidden_item;
3417 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3418 proto_item_set_hidden(hidden_item);
3420 switch(type) {
3421 case 1: {
3422 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_error, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3423 if(obj_length>4) {
3424 proto_tree_add_item(rsvp_object_tree, hf_rsvp_error_error_node_ipv4, tvb, offset2, 4, ENC_BIG_ENDIAN);
3426 offset3 = offset2+4;
3428 break;
3431 case 2: {
3432 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_error, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3433 if(obj_length>4) {
3434 proto_tree_add_item(rsvp_object_tree, hf_rsvp_error_error_node_ipv6, tvb, offset2, 16, ENC_NA);
3436 offset3 = offset2+16;
3438 break;
3441 case 3: {
3442 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_error, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3443 if(obj_length>4) {
3444 proto_tree_add_item(rsvp_object_tree, hf_rsvp_error_error_node_ipv4, tvb, offset2, 4, ENC_BIG_ENDIAN);
3446 offset3 = offset2+4;
3448 break;
3451 case 4: {
3452 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_error, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3453 if(obj_length>16) {
3454 proto_tree_add_item(rsvp_object_tree, hf_rsvp_error_error_node_ipv6, tvb, offset2, 16, ENC_NA);
3456 offset3 = offset2+16;
3458 break;
3461 default:
3462 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_error, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3463 if(obj_length>4) {
3464 proto_tree_add_item(rsvp_object_tree, hf_rsvp_error_data, tvb, offset2, obj_length - 4, ENC_NA);
3466 return;
3469 if(obj_length>4) {
3470 error_flags = tvb_get_uint8(tvb, offset3);
3471 ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_error_flags,
3472 tvb, offset3, 1, ENC_BIG_ENDIAN);
3473 rsvp_error_subtree = proto_item_add_subtree(ti2, TREE(TT_ERROR_FLAGS));
3474 proto_tree_add_item(rsvp_error_subtree, hf_rsvp_error_flags_path_state_removed,
3475 tvb, offset3, 1, ENC_BIG_ENDIAN);
3476 proto_tree_add_item(rsvp_error_subtree, hf_rsvp_error_flags_not_guilty,
3477 tvb, offset3, 1, ENC_BIG_ENDIAN);
3478 proto_tree_add_item(rsvp_error_subtree, hf_rsvp_error_flags_in_place,
3479 tvb, offset3, 1, ENC_BIG_ENDIAN);
3480 proto_item_append_text(ti2, " %s %s %s",
3481 (error_flags & (1U<<2)) ? "Path-State-Removed" : "",
3482 (error_flags & (1U<<1)) ? "NotGuilty" : "",
3483 (error_flags & (1U<<0)) ? "InPlace" : "");
3484 error_code = tvb_get_uint8(tvb, offset3+1);
3485 proto_tree_add_item(rsvp_object_tree, hf_rsvp_error_error_code, tvb, offset3+1, 1, ENC_BIG_ENDIAN);
3486 error_val = dissect_rsvp_error_value(rsvp_object_tree, tvb, offset3+2, error_code);
3490 switch (type) {
3491 case 1:
3492 proto_item_set_text(ti, "ERROR: IPv4, Error code: %s, Value: %d, Error Node: %s",
3493 val_to_str_ext(error_code, &rsvp_error_codes_ext, "Unknown (%d)"),
3494 error_val, tvb_ip_to_str(pinfo->pool, tvb, offset2));
3495 break;
3496 case 3:
3497 proto_item_set_text(ti, "ERROR: IPv4 IF-ID, Error code: %s, Value: %d, Control Node: %s. ",
3498 val_to_str_ext(error_code, &rsvp_error_codes_ext, "Unknown (%d)"),
3499 error_val, tvb_ip_to_str(pinfo->pool, tvb, offset2));
3500 dissect_rsvp_ifid_tlv(ti, pinfo, rsvp_object_tree, tvb, offset+12, obj_length-12,
3501 TREE(TT_ERROR_SUBOBJ));
3502 break;
3507 /*------------------------------------------------------------------------------
3508 * SCOPE
3509 *------------------------------------------------------------------------------*/
3510 static void
3511 dissect_rsvp_scope(proto_item *ti _U_, proto_tree *rsvp_object_tree,
3512 tvbuff_t *tvb,
3513 int offset, int obj_length,
3514 int rsvp_class _U_, int type)
3516 int offset2 = offset + 4;
3517 int mylen;
3518 proto_item *hidden_item;
3520 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3521 proto_item_set_hidden(hidden_item);
3523 mylen = obj_length - 4;
3524 switch(type) {
3525 case 1: {
3526 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_scope, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3527 while (mylen > 0) {
3528 proto_tree_add_item(rsvp_object_tree, hf_rsvp_scope_ipv4_address, tvb, offset2, 4, ENC_BIG_ENDIAN);
3529 offset2 += 4;
3530 mylen -= 4;
3532 break;
3535 case 2: {
3536 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_scope, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3537 while (mylen > 0) {
3538 proto_tree_add_item(rsvp_object_tree, hf_rsvp_scope_ipv6_address, tvb, offset2, 16, ENC_NA);
3539 offset2 += 16;
3540 mylen -= 16;
3542 break;
3545 default:
3546 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_scope, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3547 proto_tree_add_item(rsvp_object_tree, hf_rsvp_scope_data, tvb, offset2, mylen, ENC_NA);
3548 break;
3552 /*------------------------------------------------------------------------------
3553 * STYLE
3554 *------------------------------------------------------------------------------*/
3555 static void
3556 dissect_rsvp_style(proto_item *ti, proto_tree *rsvp_object_tree,
3557 tvbuff_t *tvb,
3558 int offset, int obj_length,
3559 int rsvp_class _U_, int type)
3561 int offset2 = offset + 4;
3562 proto_item *hidden_item;
3564 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3565 proto_item_set_hidden(hidden_item);
3567 switch(type) {
3568 case 1: {
3569 uint32_t style;
3571 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_style, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3572 proto_tree_add_item(rsvp_object_tree, hf_rsvp_style_flags, tvb, offset2, 1, ENC_BIG_ENDIAN);
3573 style = tvb_get_ntoh24(tvb, offset2+1);
3574 proto_tree_add_item(rsvp_object_tree, hf_rsvp_style_style, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
3575 proto_item_set_text(ti, "STYLE: %s (%d)",
3576 val_to_str_const(style, style_vals, "Unknown"),
3577 style);
3578 break;
3581 default:
3582 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_style, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3583 proto_tree_add_item(rsvp_object_tree, hf_rsvp_style_data, tvb, offset2, obj_length - 4, ENC_NA);
3584 break;
3588 /*------------------------------------------------------------------------------
3589 * CONFIRM
3590 *------------------------------------------------------------------------------*/
3591 static void
3592 dissect_rsvp_confirm(proto_item *ti, proto_tree *rsvp_object_tree,
3593 tvbuff_t *tvb,
3594 int offset, int obj_length,
3595 int rsvp_class _U_, int type)
3597 int offset2 = offset + 4;
3598 proto_item *hidden_item;
3600 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3601 proto_item_set_hidden(hidden_item);
3603 switch(type) {
3604 case 1: {
3605 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_confirm, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3606 proto_tree_add_item(rsvp_object_tree, hf_rsvp_confirm_receiver_address_ipv4, tvb, offset2, 4, ENC_BIG_ENDIAN);
3607 proto_item_set_text(ti, "CONFIRM: Receiver %s",
3608 tvb_ip_to_str(wmem_packet_scope(), tvb, offset2));
3609 break;
3612 case 2: {
3613 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_confirm, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3614 proto_tree_add_item(rsvp_object_tree, hf_rsvp_confirm_receiver_address_ipv6, tvb, offset2, 16, ENC_NA);
3615 break;
3618 default:
3619 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_confirm, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3620 proto_tree_add_item(rsvp_object_tree, hf_rsvp_confirm_data, tvb, offset2, obj_length - 4, ENC_NA);
3621 break;
3625 /*------------------------------------------------------------------------------
3626 * SENDER TEMPLATE and FILTERSPEC
3627 *------------------------------------------------------------------------------*/
3628 static void
3629 dissect_rsvp_template_filter(packet_info *pinfo, proto_item *ti, proto_tree *rsvp_object_tree,
3630 tvbuff_t *tvb,
3631 int offset, int obj_length,
3632 int rsvp_class, int type,
3633 rsvp_conversation_info *rsvph)
3635 int offset2 = offset + 4;
3636 proto_item *hidden_item;
3638 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3639 proto_item_set_hidden(hidden_item);
3641 proto_item_set_text(ti, "%s", summary_template(pinfo->pool, tvb, offset));
3642 switch(type) {
3643 case 1:
3644 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_template, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3645 proto_tree_add_item(rsvp_object_tree,
3646 hf_rsvp_filter[RSVPF_SENDER_IP],
3647 tvb, offset2, 4, ENC_BIG_ENDIAN);
3648 proto_tree_add_item(rsvp_object_tree,
3649 hf_rsvp_filter[RSVPF_SENDER_PORT],
3650 tvb, offset2+6, 2, ENC_BIG_ENDIAN);
3653 * Save this information to build the conversation request key later.
3655 set_address_tvb(&rsvph->source, AT_IPv4, 4, tvb, offset2);
3656 rsvph->udp_source_port = tvb_get_ntohs(tvb, offset2+6);
3657 break;
3659 case 2:
3660 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_template, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3661 proto_tree_add_item(rsvp_object_tree, hf_rsvp_template_filter_source_address_ipv6, tvb, offset2, 16, ENC_NA);
3662 proto_tree_add_item(rsvp_object_tree, hf_rsvp_template_filter_source_port, tvb, offset2+18, 2, ENC_BIG_ENDIAN);
3663 break;
3665 case 7:
3666 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_template, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3667 proto_tree_add_item(rsvp_object_tree,
3668 hf_rsvp_filter[RSVPF_SENDER_IP],
3669 tvb, offset2, 4, ENC_BIG_ENDIAN);
3670 /*short call ID*/
3671 if (rsvp_class == RSVP_CLASS_SENDER_TEMPLATE){
3672 proto_tree_add_item(rsvp_object_tree,
3673 hf_rsvp_filter[RSVPF_SENDER_SHORT_CALL_ID],
3674 tvb, offset2+4, 2, ENC_BIG_ENDIAN);
3677 proto_tree_add_item(rsvp_object_tree,
3678 hf_rsvp_filter[RSVPF_SENDER_LSP_ID],
3679 tvb, offset2+6, 2, ENC_BIG_ENDIAN);
3682 * Save this information to build the conversation request key later.
3684 set_address_tvb(&rsvph->source, AT_IPv4, 4, tvb, offset2);
3685 rsvph->udp_source_port = tvb_get_ntohs(tvb, offset2+6);
3686 break;
3688 case 8:
3689 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_template, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3690 proto_tree_add_item(rsvp_object_tree,
3691 hf_rsvp_filter[RSVPF_SENDER_IP],
3692 tvb, offset2, 16, ENC_BIG_ENDIAN);
3693 /*short call ID*/
3694 if (rsvp_class == RSVP_CLASS_SENDER_TEMPLATE){
3695 proto_tree_add_item(rsvp_object_tree,
3696 hf_rsvp_filter[RSVPF_SENDER_SHORT_CALL_ID],
3697 tvb, offset2+16, 2, ENC_BIG_ENDIAN);
3699 proto_tree_add_item(rsvp_object_tree,
3700 hf_rsvp_filter[RSVPF_SENDER_LSP_ID],
3701 tvb, offset2+18, 2, ENC_BIG_ENDIAN);
3704 * Save this information to build the conversation request key later.
3706 set_address_tvb(&rsvph->source, AT_IPv6, 16, tvb, offset2);
3707 rsvph->udp_source_port = tvb_get_ntohs(tvb, offset2+18);
3708 break;
3710 case 9:
3711 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_template, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3712 proto_tree_add_item(rsvp_object_tree,
3713 hf_rsvp_filter[RSVPF_SENDER_IP],
3714 tvb, offset2, 4, ENC_BIG_ENDIAN);
3717 * Save this information to build the conversation request key later.
3719 set_address_tvb(&rsvph->source, AT_IPv4, 4, tvb, offset2);
3720 break;
3722 case 12:
3723 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_template, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3724 proto_tree_add_item(rsvp_object_tree,
3725 hf_rsvp_template_filter_ipv4_tunnel_sender_address,
3726 tvb, offset2, 4, ENC_BIG_ENDIAN);
3727 offset2 += 4;
3728 proto_tree_add_item(rsvp_object_tree, hf_rsvp_reserved,
3729 tvb, offset2, 2, ENC_NA);
3730 offset2 += 2;
3731 proto_tree_add_item(rsvp_object_tree,
3732 hf_rsvp_filter[RSVPF_SENDER_LSP_ID],
3733 tvb, offset2, 2, ENC_BIG_ENDIAN);
3734 offset2 += 2;
3735 proto_tree_add_item(rsvp_object_tree,
3736 hf_rsvp_template_filter_sub_group_originator_id,
3737 tvb, offset2, 4, ENC_NA);
3738 offset2 += 4;
3739 proto_tree_add_item(rsvp_object_tree, hf_rsvp_reserved,
3740 tvb, offset2, 2, ENC_NA);
3741 offset2 += 2;
3742 proto_tree_add_item(rsvp_object_tree,
3743 hf_rsvp_template_filter_sub_group_id,
3744 tvb, offset2, 2, ENC_BIG_ENDIAN);
3745 /*offset += 2;*/
3746 break;
3748 case 13:
3749 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_template, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3750 proto_tree_add_item(rsvp_object_tree,
3751 hf_rsvp_template_filter_ipv6_tunnel_sender_address,
3752 tvb, offset2, 16, ENC_NA);
3753 offset2 += 16;
3754 proto_tree_add_item(rsvp_object_tree, hf_rsvp_reserved,
3755 tvb, offset2, 2, ENC_NA);
3756 offset2 += 2;
3757 proto_tree_add_item(rsvp_object_tree,
3758 hf_rsvp_filter[RSVPF_SENDER_LSP_ID],
3759 tvb, offset2, 2, ENC_BIG_ENDIAN);
3760 offset2 += 2;
3761 proto_tree_add_item(rsvp_object_tree,
3762 hf_rsvp_template_filter_sub_group_originator_id,
3763 tvb, offset2, 16, ENC_NA);
3764 offset2 += 16;
3765 proto_tree_add_item(rsvp_object_tree, hf_rsvp_reserved,
3766 tvb, offset2, 2, ENC_NA);
3767 offset2 += 2;
3768 proto_tree_add_item(rsvp_object_tree,
3769 hf_rsvp_template_filter_sub_group_id,
3770 tvb, offset2, 2, ENC_BIG_ENDIAN);
3771 /*offset += 2;*/
3772 break;
3774 default:
3775 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_template, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3776 proto_tree_add_item(rsvp_object_tree, hf_rsvp_template_filter_data, tvb, offset2, obj_length - 4, ENC_NA);
3777 break;
3781 /*------------------------------------------------------------------------------
3782 * TLVs for Ethernet SENDER TSPEC and FLOWSPEC (RFC6003)
3783 *------------------------------------------------------------------------------*/
3784 static void
3785 dissect_rsvp_eth_tspec_tlv(proto_item *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
3786 tvbuff_t *tvb, int offset, int tlv_length,
3787 int subtree_type)
3789 int tlv_off;
3790 int bit_offset;
3791 uint16_t tlv_type;
3792 int tlv_len;
3793 uint8_t profile;
3794 proto_tree *rsvp_ethspec_subtree, *ethspec_profile_subtree, *ti3;
3796 for (tlv_off = 0; tlv_off < tlv_length; ) {
3797 tlv_type = tvb_get_ntohs(tvb, offset+tlv_off);
3798 tlv_len = tvb_get_ntohs(tvb, offset+tlv_off+2);
3800 if ((tlv_len == 0) || (tlv_off+tlv_len > tlv_length)) {
3801 proto_tree_add_expert(rsvp_object_tree, pinfo, &ei_rsvp_invalid_length, tvb, offset+tlv_off+2, 2);
3802 return;
3804 switch(tlv_type) {
3805 case 0:
3806 case 1:
3808 /*case 2: ethernet bandwidth profile according to RFC 6003*/
3809 case 2:
3810 rsvp_ethspec_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
3811 offset+tlv_off, tlv_len, subtree_type, NULL,
3812 "Ethernet Bandwidth Profile TLV: CIR=%.10g, CBS=%.10g, "
3813 "EIR=%.10g, EBS=%.10g",
3814 tvb_get_ntohieee_float(tvb, offset+tlv_off+8),
3815 tvb_get_ntohieee_float(tvb, offset+tlv_off+12),
3816 tvb_get_ntohieee_float(tvb, offset+tlv_off+16),
3817 tvb_get_ntohieee_float(tvb, offset+tlv_off+20));
3818 proto_tree_add_uint_format_value(rsvp_ethspec_subtree, hf_rsvp_type, tvb, offset+tlv_off, 2,
3819 tlv_type, "%u - Ethernet Bandwidth Profile", tlv_type);
3820 proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_length, tvb, offset+tlv_off+2, 2, ENC_BIG_ENDIAN);
3821 profile = tvb_get_uint8(tvb, offset+tlv_off+4);
3822 ti3 = proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_profile, tvb, offset+tlv_off+4, 1, ENC_NA);
3823 ethspec_profile_subtree = proto_item_add_subtree(ti3, TREE(TT_ETHSPEC_SUBTREE));
3824 proto_tree_add_item(ethspec_profile_subtree, hf_rsvp_eth_tspec_tlv_color_mode,
3825 tvb, offset+tlv_off+4, 1, ENC_BIG_ENDIAN);
3826 proto_tree_add_item(ethspec_profile_subtree, hf_rsvp_eth_tspec_tlv_coupling_flag,
3827 tvb, offset+tlv_off+4, 1, ENC_BIG_ENDIAN);
3828 proto_item_append_text(ti3, " %s %s",
3829 (profile & (1U<<1)) ? "CM" : "",
3830 (profile & (1U<<0)) ? "CF" : "");
3831 proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_index, tvb, offset+tlv_off+5, 1, ENC_NA);
3832 proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_reserved, tvb, offset+tlv_off+6, 2, ENC_BIG_ENDIAN);
3833 proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_cir, tvb, offset+tlv_off+8, 4, ENC_BIG_ENDIAN);
3834 proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_cbs, tvb, offset+tlv_off+12, 4, ENC_BIG_ENDIAN);
3835 proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_eir, tvb, offset+tlv_off+16, 4, ENC_BIG_ENDIAN);
3836 proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_ebs, tvb, offset+tlv_off+20, 4, ENC_BIG_ENDIAN);
3838 proto_item_append_text(ti, "ETH profile: CIR=%.10g, CBS=%.10g, EIR=%.10g, "
3839 "EBS=%.10g",
3840 tvb_get_ntohieee_float(tvb, offset+tlv_off+8),
3841 tvb_get_ntohieee_float(tvb, offset+tlv_off+12),
3842 tvb_get_ntohieee_float(tvb, offset+tlv_off+16),
3843 tvb_get_ntohieee_float(tvb, offset+tlv_off+20));
3844 break;
3846 /* L2CP RFC 6004 */
3847 case 3:
3848 if (tlv_len != 8){
3849 proto_tree_add_expert_format(rsvp_object_tree, pinfo, &ei_rsvp_invalid_length,
3850 tvb, offset+tlv_off+2, 2, "Invalid TLV length");
3851 return;
3853 /* point to the first bit in the Ingress Layer 2 Control Processing */
3854 bit_offset = (offset<<5) + 31;
3855 proto_tree_add_bits_item(rsvp_object_tree, hf_rsvp_eth_tspec_il2cp, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
3856 bit_offset += 4;
3857 proto_tree_add_bits_item(rsvp_object_tree, hf_rsvp_eth_tspec_el2cp, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
3858 break;
3860 case 255:
3861 rsvp_ethspec_subtree = proto_tree_add_subtree(rsvp_object_tree, tvb,
3862 offset+tlv_off, tlv_len,
3863 subtree_type, NULL, "RESERVED (RFC6003)");
3864 proto_tree_add_uint_format_value(rsvp_ethspec_subtree, hf_rsvp_type, tvb, offset+tlv_off, 2,
3865 tlv_type, "%u (RESERVED)", tlv_type);
3866 proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_length, tvb, offset+tlv_off+2, 2, ENC_BIG_ENDIAN);
3867 break;
3869 case 129: /* OIF demo 2009 */
3870 rsvp_ethspec_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
3871 offset+tlv_off, tlv_len, subtree_type, NULL,
3872 "Ethernet Bandwidth Profile TLV: CIR=%.10g, CBS=%.10g, "
3873 "EIR=%.10g, EBS=%.10g",
3874 tvb_get_ntohieee_float(tvb, offset+tlv_off+8),
3875 tvb_get_ntohieee_float(tvb, offset+tlv_off+12),
3876 tvb_get_ntohieee_float(tvb, offset+tlv_off+16),
3877 tvb_get_ntohieee_float(tvb, offset+tlv_off+20));
3878 proto_tree_add_uint_format_value(rsvp_ethspec_subtree, hf_rsvp_type, tvb, offset+tlv_off, 2,
3879 tlv_type, "%u - Ethernet Bandwidth Profile", tlv_type);
3880 proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_length, tvb, offset+tlv_off+2, 2, ENC_BIG_ENDIAN);
3881 profile = tvb_get_uint8(tvb, offset+tlv_off+4);
3882 ti3 = proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_profile, tvb, offset+tlv_off+4, 1, ENC_BIG_ENDIAN);
3883 ethspec_profile_subtree = proto_item_add_subtree(ti3, TREE(TT_ETHSPEC_SUBTREE));
3884 proto_tree_add_item(ethspec_profile_subtree, hf_rsvp_eth_tspec_tlv_color_mode,
3885 tvb, offset+tlv_off+4, 1, ENC_BIG_ENDIAN);
3886 proto_tree_add_item(ethspec_profile_subtree, hf_rsvp_eth_tspec_tlv_coupling_flag,
3887 tvb, offset+tlv_off+4, 1, ENC_BIG_ENDIAN);
3888 proto_item_append_text(ti3, " %s %s",
3889 (profile & (1U<<1)) ? "CM" : "",
3890 (profile & (1U<<0)) ? "CF" : "");
3891 proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_index, tvb, offset+tlv_off+5, 1, ENC_BIG_ENDIAN);
3892 proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_reserved, tvb, offset+tlv_off+6, 2, ENC_BIG_ENDIAN);
3893 proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_cir, tvb, offset+tlv_off+8, 4, ENC_BIG_ENDIAN);
3894 proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_cbs, tvb, offset+tlv_off+12, 4, ENC_BIG_ENDIAN);
3895 proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_eir, tvb, offset+tlv_off+16, 4, ENC_BIG_ENDIAN);
3896 proto_tree_add_item(rsvp_ethspec_subtree, hf_rsvp_eth_tspec_ebs, tvb, offset+tlv_off+20, 4, ENC_BIG_ENDIAN);
3898 proto_item_append_text(ti, "ETH profile: CIR=%.10g, CBS=%.10g, EIR=%.10g, "
3899 "EBS=%.10g",
3900 tvb_get_ntohieee_float(tvb, offset+tlv_off+8),
3901 tvb_get_ntohieee_float(tvb, offset+tlv_off+12),
3902 tvb_get_ntohieee_float(tvb, offset+tlv_off+16),
3903 tvb_get_ntohieee_float(tvb, offset+tlv_off+20));
3904 break;
3906 default:
3907 proto_tree_add_uint_format(rsvp_object_tree, hf_rsvp_type, tvb, offset+tlv_off, 2,
3908 tlv_type, "Unknown TLV: %u", tlv_type);
3909 break;
3911 tlv_off += tlv_len;
3915 /*------------------------------------------------------------------------------
3916 * SENDER TSPEC
3917 *------------------------------------------------------------------------------*/
3918 static const value_string rsvp_switching_granularity_vals[] = {
3919 {0, "Provided in signaling"},
3920 {1, "Ethernet port"},
3921 {2, "Ethernet frame"},
3922 {0, NULL }
3925 static void
3926 dissect_rsvp_tspec(proto_item *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
3927 tvbuff_t *tvb,
3928 int offset, int obj_length,
3929 int rsvp_class _U_, int type)
3931 int offset2 = offset + 4;
3932 int mylen;
3933 proto_tree *tspec_tree, *ti2 = NULL;
3934 uint8_t signal_type;
3935 uint16_t m;
3936 proto_item *hidden_item;
3938 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3939 proto_item_set_hidden(hidden_item);
3941 mylen = obj_length - 4;
3943 switch(type) {
3944 case 2:
3945 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_tspec, tvb, offset+3, 1, ENC_BIG_ENDIAN);
3946 proto_tree_add_item(rsvp_object_tree, hf_rsvp_tspec_message_format_version, tvb, offset2, 1, ENC_BIG_ENDIAN);
3947 proto_tree_add_item(rsvp_object_tree, hf_rsvp_data_length, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
3949 mylen -= 4;
3950 offset2 += 4;
3952 proto_item_set_text(ti, "SENDER TSPEC: IntServ, ");
3954 while (mylen > 0) {
3955 uint8_t param_id;
3956 unsigned param_len, raw_len;
3957 unsigned param_len_processed;
3958 unsigned length;
3960 proto_tree_add_item(rsvp_object_tree, hf_rsvp_tspec_service_header, tvb, offset2, 1, ENC_BIG_ENDIAN);
3961 proto_tree_add_item_ret_uint(rsvp_object_tree, hf_rsvp_data_length, tvb, offset2+2, 2, ENC_BIG_ENDIAN, &length);
3963 mylen -= 4;
3964 offset2 += 4;
3966 /* Process all known service headers as a set of parameters */
3967 param_len_processed = 0;
3968 while (param_len_processed < length) {
3969 param_id = tvb_get_uint8(tvb, offset2);
3970 ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_parameter, tvb, offset2, 1, ENC_NA);
3971 raw_len = tvb_get_ntohs(tvb, offset2+2);
3972 param_len = raw_len + 1;
3973 switch(param_id) {
3974 case 127:
3975 /* Token Bucket */
3976 proto_item_set_len(ti2, param_len*4);
3977 tspec_tree = proto_item_add_subtree(ti2, TREE(TT_TSPEC_SUBTREE));
3979 proto_tree_add_item(tspec_tree, hf_rsvp_parameter_flags, tvb, offset2+1, 1, ENC_NA);
3980 proto_tree_add_uint(tspec_tree, hf_rsvp_parameter_length, tvb, offset2+2, 2, raw_len);
3981 proto_tree_add_item(tspec_tree, hf_rsvp_tspec_token_bucket_rate, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
3982 proto_tree_add_item(tspec_tree, hf_rsvp_tspec_token_bucket_size, tvb, offset2+8, 4, ENC_BIG_ENDIAN);
3983 proto_tree_add_item(tspec_tree, hf_rsvp_tspec_peak_data_rate, tvb, offset2+12, 4, ENC_BIG_ENDIAN);
3984 proto_tree_add_item(tspec_tree, hf_rsvp_minimum_policed_unit, tvb, offset2+16, 4, ENC_BIG_ENDIAN);
3985 proto_tree_add_item(tspec_tree, hf_rsvp_maximum_packet_size, tvb, offset2+20, 4, ENC_BIG_ENDIAN);
3986 proto_item_append_text(ti, "Token Bucket, %.10g bytes/sec. ",
3987 tvb_get_ntohieee_float(tvb, offset2+4));
3988 proto_item_append_text(ti2, "Rate=%.10g Burst=%.10g Peak=%.10g m=%u M=%u",
3989 tvb_get_ntohieee_float(tvb, offset2+4),
3990 tvb_get_ntohieee_float(tvb, offset2+8),
3991 tvb_get_ntohieee_float(tvb, offset2+12),
3992 tvb_get_ntohl(tvb, offset2+16),
3993 tvb_get_ntohl(tvb, offset2+20));
3994 break;
3996 case 128:
3997 /* Null Service (RFC2997) */
3998 proto_item_set_len(ti2, param_len*4);
3999 tspec_tree = proto_item_add_subtree(ti2, TREE(TT_TSPEC_SUBTREE));
4001 proto_tree_add_item(tspec_tree, hf_rsvp_parameter_flags, tvb, offset2+1, 1, ENC_NA);
4002 proto_tree_add_uint(tspec_tree, hf_rsvp_parameter_length, tvb, offset2+2, 2, raw_len);
4003 proto_tree_add_item(tspec_tree, hf_rsvp_maximum_packet_size, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
4004 proto_item_append_text(ti, "Null Service. M=%u",
4005 tvb_get_ntohl(tvb, offset2+4));
4006 proto_item_append_text(ti2, "Max pkt size=%u",
4007 tvb_get_ntohl(tvb, offset2+4));
4008 break;
4010 case 126:
4011 /* Compression hint (RFC3006) */
4012 proto_item_set_len(ti2, param_len*4);
4013 tspec_tree = proto_item_add_subtree(ti2, TREE(TT_TSPEC_SUBTREE));
4015 proto_tree_add_item(tspec_tree, hf_rsvp_parameter_flags, tvb, offset2+1, 1, ENC_NA);
4016 proto_tree_add_uint(tspec_tree, hf_rsvp_parameter_length, tvb, offset2+2, 2, raw_len);
4017 proto_tree_add_item(tspec_tree, hf_rsvp_tspec_hint, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
4018 proto_tree_add_item(tspec_tree, hf_rsvp_compression_factor, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
4019 proto_item_append_text(ti, "Compression Hint. Hint=%u, Factor=%u",
4020 tvb_get_ntohl(tvb, offset2+4),
4021 tvb_get_ntohl(tvb, offset2+8));
4022 proto_item_append_text(ti2, "Hint=%u, Factor=%u",
4023 tvb_get_ntohl(tvb, offset2+4),
4024 tvb_get_ntohl(tvb, offset2+8));
4025 break;
4027 default:
4028 proto_item_set_len(ti2, param_len*4);
4029 expert_add_info_format(pinfo, ti2, &ei_rsvp_parameter, "Unknown parameter %d, %d words", param_id, param_len);
4030 break;
4032 param_len_processed += param_len;
4033 offset2 += param_len*4;
4035 mylen -= length*4;
4037 break;
4039 case 4: /* SONET/SDH Tspec */
4040 proto_item_set_text(ti, "SENDER TSPEC: SONET/SDH, ");
4042 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_tspec, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4043 signal_type = tvb_get_uint8(tvb, offset2);
4044 proto_tree_add_item(rsvp_object_tree, hf_rsvp_tspec_signal_type_sonet, tvb, offset2, 1, ENC_BIG_ENDIAN);
4045 ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_tspec_requested_concatenation, tvb, offset2+1, 1, ENC_BIG_ENDIAN);
4046 tspec_tree = proto_item_add_subtree(ti2, TREE(TT_TSPEC_SUBTREE));
4047 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_standard_contiguous_concatenation,
4048 tvb, offset2+1, 1, ENC_BIG_ENDIAN);
4049 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_arbitrary_contiguous_concatenation,
4050 tvb, offset2+1, 1, ENC_BIG_ENDIAN);
4051 proto_tree_add_item(rsvp_object_tree, hf_rsvp_tspec_number_of_contiguous_components, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
4052 proto_tree_add_item(rsvp_object_tree, hf_rsvp_tspec_number_of_virtual_components, tvb, offset2+4, 2, ENC_BIG_ENDIAN);
4053 proto_tree_add_item(rsvp_object_tree, hf_rsvp_tspec_multiplier, tvb, offset2+6, 2, ENC_BIG_ENDIAN);
4054 ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_tspec_transparency, tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4055 tspec_tree = proto_item_add_subtree(ti2, TREE(TT_TSPEC_SUBTREE));
4057 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_regenerator_section,
4058 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4059 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_multiplex_section,
4060 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4061 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_J0_transparency,
4062 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4063 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_SOH_RSOH_DCC_transparency,
4064 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4065 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_LOH_MSOH_DCC_transparency,
4066 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4067 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_LOH_MSOH_extended_DCC_transparency,
4068 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4069 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_K1_K2_transparency,
4070 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4071 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_E1_transparency,
4072 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4073 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_F1_transparency,
4074 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4075 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_E2_transparency,
4076 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4077 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_B1_transparency,
4078 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4079 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_B2_transparency,
4080 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4081 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_M0_transparency,
4082 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4083 proto_tree_add_item(tspec_tree, hf_rsvp_sender_tspec_M1_transparency,
4084 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4086 proto_tree_add_item(rsvp_object_tree, hf_rsvp_tspec_profile, tvb, offset2+12, 4, ENC_BIG_ENDIAN);
4088 proto_item_append_text(ti, "Signal [%s], RCC %d, NCC %d, NVC %d, MT %d, Transparency %d, Profile %d",
4089 val_to_str_ext_const(signal_type, &gmpls_sonet_signal_type_str_ext, "Unknown"),
4090 tvb_get_uint8(tvb, offset2+1), tvb_get_ntohs(tvb, offset2+2),
4091 tvb_get_ntohs(tvb, offset2+4), tvb_get_ntohs(tvb, offset2+6),
4092 tvb_get_ntohl(tvb, offset2+8), tvb_get_ntohl(tvb, offset2+12));
4093 break;
4095 case 5: /* FF: G.709 TSPEC, RFC 4328 */
4096 proto_item_set_text(ti, "SENDER TSPEC: G.709, ");
4098 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_tspec, tvb, offset + 3, 1, ENC_BIG_ENDIAN);
4099 signal_type = tvb_get_uint8(tvb, offset2);
4100 proto_tree_add_item(rsvp_object_tree, hf_rsvp_tspec_signal_type_g709, tvb, offset2, 1, ENC_BIG_ENDIAN);
4101 proto_tree_add_item(rsvp_object_tree, hf_rsvp_tspec_number_of_multiplexed_components, tvb, offset2 + 2, 2, ENC_BIG_ENDIAN);
4102 proto_tree_add_item(rsvp_object_tree, hf_rsvp_tspec_number_of_virtual_components, tvb, offset2 + 4, 2, ENC_BIG_ENDIAN);
4104 proto_tree_add_item(rsvp_object_tree, hf_rsvp_tspec_multiplier, tvb, offset2 + 6, 2, ENC_BIG_ENDIAN);
4105 proto_item_append_text(ti, "Signal [%s], NMC %d, NVC %d, MT %d",
4106 rval_to_str_const(signal_type,
4107 gmpls_g709_signal_type_rvals,
4108 "Unknown"),
4109 tvb_get_ntohs(tvb, offset2 + 2),
4110 tvb_get_ntohs(tvb, offset2 + 4),
4111 tvb_get_ntohs(tvb, offset2 + 6));
4112 break;
4114 case 6: /* Ethernet TSPEC (RFC6003) */
4115 proto_item_set_text(ti, "SENDER TSPEC: Ethernet, ");
4116 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_tspec, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4117 proto_tree_add_item(rsvp_object_tree, hf_rsvp_switching_granularity, tvb, offset2, 2, ENC_BIG_ENDIAN);
4118 proto_tree_add_item(rsvp_object_tree, hf_rsvp_tspec_mtu, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
4120 dissect_rsvp_eth_tspec_tlv(ti, pinfo, rsvp_object_tree, tvb, offset+8, obj_length-8,
4121 TREE(TT_TSPEC_SUBTREE));
4122 break;
4124 case 8: /* SSON FOWSPEC (RFC7762)*/
4125 m = tvb_get_ntohs(tvb, offset2);
4126 proto_item_set_text(ti, "SENDER TSPEC: SSON, ");
4127 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_flowspec, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4128 proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_m, tvb, offset2, 2, ENC_BIG_ENDIAN);
4129 proto_item_append_text(ti, "slot width (m) = %f (%d)",
4130 m*12.5,
4131 tvb_get_ntohs(tvb, offset2));
4132 break;
4134 default: /* Unknown TSpec */
4135 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_tspec, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4136 proto_tree_add_item(rsvp_object_tree, hf_rsvp_tspec_data, tvb, offset2, obj_length - 4, ENC_NA);
4137 break;
4142 /*------------------------------------------------------------------------------
4143 * FLOWSPEC
4144 *------------------------------------------------------------------------------*/
4145 static void
4146 dissect_rsvp_flowspec(proto_item *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
4147 tvbuff_t *tvb,
4148 int offset, int obj_length,
4149 int rsvp_class _U_, int type)
4151 int offset2 = offset + 4;
4152 int mylen, signal_type;
4153 proto_tree *flowspec_tree, *ti2 = NULL;
4154 proto_item *hidden_item;
4155 uint16_t m;
4157 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4158 proto_item_set_hidden(hidden_item);
4160 mylen = obj_length - 4;
4162 switch(type) {
4164 case 2:
4165 if (mylen < 4) {
4166 proto_tree_add_expert_format(rsvp_object_tree, pinfo, &ei_rsvp_invalid_length, tvb, 0, 0,
4167 "Object length %u < 8", obj_length);
4168 return;
4170 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_flowspec, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4171 proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_message_format_version, tvb, offset2, 1, ENC_BIG_ENDIAN);
4172 proto_tree_add_item(rsvp_object_tree, hf_rsvp_data_length, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
4174 proto_item_set_text(ti, "FLOWSPEC: ");
4176 mylen -= 4;
4177 offset2+= 4;
4178 while (mylen > 0) {
4179 uint8_t service_num;
4180 unsigned length;
4181 uint8_t param_id;
4182 unsigned param_len, raw_len;
4183 unsigned param_len_processed;
4185 if (mylen < 4) {
4186 proto_tree_add_expert_format(rsvp_object_tree, pinfo, &ei_rsvp_invalid_length, tvb, 0, 0,
4187 "Object length %u not large enough", obj_length);
4188 return;
4190 service_num = tvb_get_uint8(tvb, offset2);
4191 proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_service_header, tvb, offset2, 1, ENC_BIG_ENDIAN);
4192 proto_tree_add_item_ret_uint(rsvp_object_tree, hf_rsvp_data_length, tvb, offset2+2, 2, ENC_BIG_ENDIAN, &length);
4194 mylen -= 4;
4195 offset2 += 4;
4197 proto_item_append_text(ti, "%s: ",
4198 val_to_str_ext(service_num, &intsrv_services_str_ext,
4199 "Unknown (%d)"));
4201 /* Process all known service headers as a set of parameters */
4202 param_len_processed = 0;
4203 while (param_len_processed < length) {
4204 ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_parameter, tvb, offset2, 1, ENC_NA);
4205 param_id = tvb_get_uint8(tvb, offset2);
4206 raw_len = tvb_get_ntohs(tvb, offset2+2);
4207 param_len = raw_len + 1;
4208 switch(param_id) {
4209 case 127:
4210 /* Token Bucket */
4211 proto_item_set_len(ti2, param_len*4);
4212 flowspec_tree = proto_item_add_subtree(ti2, TREE(TT_FLOWSPEC_SUBTREE));
4214 proto_tree_add_item(flowspec_tree, hf_rsvp_parameter_flags, tvb, offset2+1, 1, ENC_NA);
4215 proto_tree_add_uint(flowspec_tree, hf_rsvp_parameter_length, tvb, offset2+2, 2, raw_len);
4216 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_token_bucket_rate, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
4217 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_token_bucket_size, tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4218 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_peak_data_rate, tvb, offset2+12, 4, ENC_BIG_ENDIAN);
4219 proto_tree_add_item(flowspec_tree, hf_rsvp_minimum_policed_unit, tvb, offset2+16, 4, ENC_BIG_ENDIAN);
4220 proto_tree_add_item(flowspec_tree, hf_rsvp_maximum_packet_size, tvb, offset2+20, 4, ENC_BIG_ENDIAN);
4221 proto_item_append_text(ti, "Token Bucket, %.10g bytes/sec. ",
4222 tvb_get_ntohieee_float(tvb, offset2+4));
4223 proto_item_append_text(ti2, "Rate=%.10g Burst=%.10g Peak=%.10g m=%u M=%u",
4224 tvb_get_ntohieee_float(tvb, offset2+4),
4225 tvb_get_ntohieee_float(tvb, offset2+8),
4226 tvb_get_ntohieee_float(tvb, offset2+12),
4227 tvb_get_ntohl(tvb, offset2+16),
4228 tvb_get_ntohl(tvb, offset2+20));
4229 break;
4231 case 130:
4232 /* Guaranteed-rate RSpec */
4233 proto_item_set_len(ti2, param_len*4);
4234 flowspec_tree = proto_item_add_subtree(ti2, TREE(TT_FLOWSPEC_SUBTREE));
4236 proto_tree_add_item(flowspec_tree, hf_rsvp_parameter_flags, tvb, offset2+1, 1, ENC_NA);
4237 proto_tree_add_uint(flowspec_tree, hf_rsvp_parameter_length, tvb, offset2+2, 2, raw_len);
4239 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_rate, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
4240 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_slack_term, tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4241 proto_item_append_text(ti, "RSpec, %.10g bytes/sec. ",
4242 tvb_get_ntohieee_float(tvb, offset2+4));
4243 proto_item_append_text(ti2, "R=%.10g, s=%u",
4244 tvb_get_ntohieee_float(tvb, offset2+4),
4245 tvb_get_ntohl(tvb, offset2+8));
4246 break;
4248 case 128:
4249 /* Null Service (RFC2997) */
4250 proto_item_set_len(ti2, param_len*4);
4251 flowspec_tree = proto_item_add_subtree(ti2, TREE(TT_FLOWSPEC_SUBTREE));
4253 proto_tree_add_item(flowspec_tree, hf_rsvp_parameter_flags, tvb, offset2+1, 1, ENC_NA);
4254 proto_tree_add_uint(flowspec_tree, hf_rsvp_parameter_length, tvb, offset2+2, 2, raw_len);
4255 proto_tree_add_item(flowspec_tree, hf_rsvp_maximum_packet_size, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
4256 proto_item_append_text(ti, "Null Service. M=%u",
4257 tvb_get_ntohl(tvb, offset2+4));
4258 proto_item_append_text(ti2, "Max pkt size=%u",
4259 tvb_get_ntohl(tvb, offset2+4));
4260 break;
4262 default:
4263 expert_add_info_format(pinfo, ti2, &ei_rsvp_parameter, "Unknown parameter %d, %d words", param_id, param_len);
4264 break;
4266 param_len_processed += param_len;
4267 offset2 += param_len * 4;
4270 /* offset2 += length*4; */
4271 mylen -= length*4;
4273 break;
4275 case 4:
4276 proto_item_set_text(ti, "FLOWSPEC: SONET/SDH, ");
4278 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_flowspec, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4279 signal_type = tvb_get_uint8(tvb, offset2);
4280 proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_signal_type_sonet, tvb, offset2, 1, ENC_BIG_ENDIAN);
4281 ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_requested_concatenation, tvb, offset2+1, 1, ENC_BIG_ENDIAN);
4282 flowspec_tree = proto_item_add_subtree(ti2, TREE(TT_FLOWSPEC_SUBTREE));
4283 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_standard_contiguous_concatenation,
4284 tvb, offset2+1, 1, ENC_BIG_ENDIAN);
4285 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_arbitrary_contiguous_concatenation,
4286 tvb, offset2+1, 1, ENC_BIG_ENDIAN);
4287 proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_number_of_contiguous_components, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
4288 proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_number_of_virtual_components, tvb, offset2+4, 2, ENC_BIG_ENDIAN);
4289 proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_multiplier, tvb, offset2+6, 2, ENC_BIG_ENDIAN);
4290 ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_transparency, tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4291 flowspec_tree = proto_item_add_subtree(ti2, TREE(TT_FLOWSPEC_SUBTREE));
4293 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_regenerator_section,
4294 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4295 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_multiplex_section,
4296 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4297 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_J0_transparency,
4298 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4299 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_SOH_RSOH_DCC_transparency,
4300 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4301 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_LOH_MSOH_DCC_transparency,
4302 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4303 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_LOH_MSOH_extended_DCC_transparency,
4304 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4305 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_K1_K2_transparency,
4306 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4307 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_E1_transparency,
4308 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4309 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_F1_transparency,
4310 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4311 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_E2_transparency,
4312 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4313 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_B1_transparency,
4314 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4315 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_B2_transparency,
4316 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4317 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_M0_transparency,
4318 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4319 proto_tree_add_item(flowspec_tree, hf_rsvp_flowspec_M1_transparency,
4320 tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4322 proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_profile, tvb, offset2+12, 4, ENC_BIG_ENDIAN);
4324 proto_item_append_text(ti, "Signal [%s], RCC %d, NCC %d, NVC %d, MT %d, Transparency %d, Profile %d",
4325 val_to_str_ext_const(signal_type, &gmpls_sonet_signal_type_str_ext, "Unknown"),
4326 tvb_get_uint8(tvb, offset2+1), tvb_get_ntohs(tvb, offset2+2),
4327 tvb_get_ntohs(tvb, offset2+4), tvb_get_ntohs(tvb, offset2+6),
4328 tvb_get_ntohl(tvb, offset2+8), tvb_get_ntohl(tvb, offset2+12));
4329 break;
4331 case 5: /* FF: G.709 FLOWSPEC, RFC 4328 */
4332 proto_item_set_text(ti, "FLOWSPEC: G.709, ");
4334 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_flowspec, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4335 signal_type = tvb_get_uint8(tvb, offset2);
4336 proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_signal_type_g709, tvb, offset2, 1, ENC_BIG_ENDIAN);
4337 proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_number_of_multiplexed_components, tvb, offset2 + 2, 2, ENC_BIG_ENDIAN);
4338 proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_number_of_virtual_components, tvb, offset2 + 4, 2, ENC_BIG_ENDIAN);
4340 proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_multiplier, tvb, offset2 + 6, 2, ENC_BIG_ENDIAN);
4341 proto_item_append_text(ti, "Signal [%s], NMC %d, NVC %d, MT %d",
4342 rval_to_str_const(signal_type,
4343 gmpls_g709_signal_type_rvals,
4344 "Unknown"),
4345 tvb_get_ntohs(tvb, offset2 + 2),
4346 tvb_get_ntohs(tvb, offset2 + 4),
4347 tvb_get_ntohs(tvb, offset2 + 6));
4348 break;
4350 case 6: /* Ethernet FLOWSPEC (RFC6003) */
4351 proto_item_set_text(ti, "FLOWSPEC: Ethernet, ");
4352 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_flowspec, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4353 proto_tree_add_item(rsvp_object_tree, hf_rsvp_switching_granularity, tvb, offset2, 2, ENC_BIG_ENDIAN);
4354 proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_mtu, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
4356 dissect_rsvp_eth_tspec_tlv(ti, pinfo, rsvp_object_tree, tvb, offset+8, obj_length-8,
4357 TREE(TT_FLOWSPEC_SUBTREE));
4358 break;
4359 case 8: /* SSON FOWSPEC (RFC7762)*/
4360 m = tvb_get_ntohs(tvb, offset2);
4361 proto_item_set_text(ti, "FLOWSPEC: SSON, ");
4362 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_flowspec, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4363 proto_tree_add_item(rsvp_object_tree, hf_rsvp_flowspec_m, tvb, offset2, 2, ENC_BIG_ENDIAN);
4364 proto_item_append_text(ti, "slot width (m) = %f (%d)",
4365 m*12.5,
4366 tvb_get_ntohs(tvb, offset2));
4367 break;
4369 default:
4370 break;
4374 /*------------------------------------------------------------------------------
4375 * ADSPEC
4376 *------------------------------------------------------------------------------*/
4377 static void
4378 dissect_rsvp_adspec(proto_item *ti _U_, packet_info* pinfo, proto_tree *rsvp_object_tree,
4379 tvbuff_t *tvb,
4380 int offset, int obj_length,
4381 int rsvp_class _U_, int type _U_)
4383 int offset2 = offset + 4;
4384 int mylen, i;
4385 proto_tree *adspec_tree, *adspec_type_tree;
4386 proto_item *ti2;
4388 proto_item *hidden_item;
4390 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4391 proto_item_set_hidden(hidden_item);
4393 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_adspec, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4394 mylen = obj_length - 4;
4396 proto_tree_add_item(rsvp_object_tree, hf_rsvp_adspec_message_format_version, tvb, offset2, 1, ENC_BIG_ENDIAN);
4397 proto_tree_add_item(rsvp_object_tree, hf_rsvp_data_length, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
4398 mylen -= 4;
4399 offset2 += 4;
4400 while (mylen > 0) {
4401 uint8_t service_num;
4402 unsigned length;
4403 const char *str;
4405 service_num = tvb_get_uint8(tvb, offset2);
4406 str = val_to_str_ext_const(service_num, &intsrv_services_str_ext, "Unknown");
4407 length = tvb_get_ntohs(tvb, offset2+2);
4408 adspec_tree = proto_tree_add_subtree(rsvp_object_tree, tvb, offset2,
4409 (length+1)*4, TREE(TT_ADSPEC_SUBTREE), NULL, str);
4411 proto_tree_add_item(adspec_tree, hf_rsvp_adspec_service_header, tvb, offset2, 1, ENC_BIG_ENDIAN);
4412 proto_tree_add_item(adspec_tree, hf_rsvp_hf_rsvp_adspec_break_bit, tvb, offset2+1, 1, ENC_NA);
4413 proto_tree_add_uint(adspec_tree, hf_rsvp_data_length, tvb, offset2+2, 2, length);
4414 mylen -= 4;
4415 offset2 += 4;
4416 i = length*4;
4417 while (i > 0) {
4418 unsigned id, phdr_length;
4420 ti2 = proto_tree_add_item_ret_uint(adspec_tree, hf_rsvp_adspec_type, tvb, offset2, 1, ENC_NA, &id);
4421 adspec_type_tree = proto_item_add_subtree(ti2, TREE(TT_ADSPEC_TYPE_SUBTREE));
4422 proto_tree_add_item_ret_uint(adspec_type_tree, hf_rsvp_adspec_len, tvb, offset2+2, 2, ENC_BIG_ENDIAN, &phdr_length);
4423 proto_item_set_len(ti2, phdr_length);
4424 str = try_val_to_str_ext(id, &adspec_params_ext);
4425 if (str) {
4426 switch(id) {
4427 case 4:
4428 case 8:
4429 case 10:
4430 case 133:
4431 case 134:
4432 case 135:
4433 case 136:
4434 /* 32-bit unsigned integer */
4435 proto_tree_add_uint_format(adspec_type_tree, hf_rsvp_adspec_uint, tvb, offset2, (phdr_length+1)<<2, tvb_get_ntohl(tvb, offset2+4),
4436 "%s: %u", str, tvb_get_ntohl(tvb, offset2+4));
4437 break;
4439 case 6:
4440 /* IEEE float */
4441 proto_tree_add_float_format(adspec_type_tree, hf_rsvp_adspec_float, tvb, offset2, (phdr_length+1)<<2, tvb_get_ntohieee_float(tvb, offset2+4),
4442 "%s: %.10g", str, tvb_get_ntohieee_float(tvb, offset2+4));
4443 break;
4444 default:
4445 proto_tree_add_bytes_format(adspec_tree, hf_rsvp_adspec_bytes, tvb, offset2, (phdr_length+1)<<2, NULL, "%s", str);
4446 break;
4448 } else {
4449 expert_add_info(pinfo, ti2, &ei_rsvp_adspec_type);
4451 offset2 += (phdr_length+1)<<2;
4452 i -= (phdr_length+1)<<2;
4453 mylen -= (phdr_length+1)<<2;
4458 /*------------------------------------------------------------------------------
4459 * INTEGRITY
4460 *------------------------------------------------------------------------------*/
4461 static void
4462 dissect_rsvp_integrity(proto_item *ti _U_, proto_tree *rsvp_object_tree,
4463 tvbuff_t *tvb,
4464 int offset, int obj_length,
4465 int rsvp_class _U_, int type _U_)
4467 int offset2 = offset + 4;
4468 proto_tree *ti2, *rsvp_integ_flags_tree;
4469 proto_item *hidden_item;
4471 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4472 proto_item_set_hidden(hidden_item);
4474 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_integrity, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4476 ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_integrity_flags, tvb, offset2, 1, ENC_BIG_ENDIAN);
4477 rsvp_integ_flags_tree = proto_item_add_subtree(ti2, TREE(TT_INTEGRITY_FLAGS));
4478 proto_tree_add_item(rsvp_integ_flags_tree, hf_rsvp_integrity_flags_handshake,
4479 tvb, offset2, 1, ENC_BIG_ENDIAN);
4480 proto_tree_add_item(rsvp_object_tree, hf_rsvp_integrity_key_identifier, tvb, offset2+2, 6, ENC_NA);
4481 proto_tree_add_item(rsvp_object_tree, hf_rsvp_integrity_sequence_number, tvb, offset2+8, 8, ENC_BIG_ENDIAN);
4482 proto_tree_add_item(rsvp_object_tree, hf_rsvp_integrity_hash, tvb, offset2+16, obj_length - 20, ENC_NA);
4485 /*------------------------------------------------------------------------------
4486 * POLICY
4487 *------------------------------------------------------------------------------*/
4488 static void
4489 dissect_rsvp_policy(proto_item *ti _U_, proto_tree *rsvp_object_tree,
4490 tvbuff_t *tvb,
4491 int offset, int obj_length,
4492 int rsvp_class _U_, int type _U_)
4494 int offset2 = offset + 4;
4495 proto_item *hidden_item;
4497 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4498 proto_item_set_hidden(hidden_item);
4500 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_policy, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4501 proto_tree_add_item(rsvp_object_tree, hf_rsvp_policy_data, tvb, offset2, obj_length - 4, ENC_NA);
4504 /*------------------------------------------------------------------------------
4505 * LABEL_REQUEST
4506 *------------------------------------------------------------------------------*/
4507 static void
4508 dissect_rsvp_label_request(proto_item *ti, proto_tree *rsvp_object_tree,
4509 tvbuff_t *tvb,
4510 int offset, int obj_length,
4511 int rsvp_class _U_, int type)
4513 int offset2 = offset + 4;
4514 proto_item *hidden_item;
4516 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4517 proto_item_set_hidden(hidden_item);
4519 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_label_request, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4521 switch(type) {
4522 case 1: {
4523 unsigned short l3pid = tvb_get_ntohs(tvb, offset2+2);
4524 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_request_l3pid, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
4525 proto_item_set_text(ti, "LABEL REQUEST: Basic: L3PID: %s (0x%04x)",
4526 val_to_str_const(l3pid, etype_vals, "Unknown"),
4527 l3pid);
4528 break;
4531 case 2: {
4532 unsigned short l3pid = tvb_get_ntohs(tvb, offset2+2);
4533 unsigned short min_vpi, min_vci, max_vpi, max_vci;
4534 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_request_l3pid, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
4535 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_request_m, tvb, offset2+4, 1, ENC_NA);
4536 min_vpi = tvb_get_ntohs(tvb, offset2+4) & 0x7f;
4537 min_vci = tvb_get_ntohs(tvb, offset2+6);
4538 max_vpi = tvb_get_ntohs(tvb, offset2+8) & 0x7f;
4539 max_vci = tvb_get_ntohs(tvb, offset2+10);
4540 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_request_min_vpi, tvb, offset2+4, 2, ENC_BIG_ENDIAN);
4541 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_request_min_vci, tvb, offset2+6, 2, ENC_BIG_ENDIAN);
4542 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_request_max_vpi, tvb, offset2+8, 2, ENC_BIG_ENDIAN);
4543 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_request_max_vci, tvb, offset2+10, 2, ENC_BIG_ENDIAN);
4544 proto_item_set_text(ti, "LABEL REQUEST: ATM: L3PID: %s (0x%04x). VPI/VCI: Min: %d/%d, Max: %d/%d. %s Merge. ",
4545 val_to_str_const(l3pid, etype_vals, "Unknown"), l3pid,
4546 min_vpi, min_vci, max_vpi, max_vci,
4547 (tvb_get_uint8(tvb, offset2+4) & 0x80) ? "Can" : "Cannot");
4548 break;
4551 case 3: {
4552 uint16_t l3pid = tvb_get_ntohs(tvb, offset2+2);
4553 uint32_t min_dlci, max_dlci, dlci_len, dlci_len_code;
4554 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_request_l3pid, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
4555 dlci_len_code = (tvb_get_ntohs(tvb, offset2+4) & 0x0180) >> 7;
4556 min_dlci = tvb_get_ntohl(tvb, offset2+4) & 0x7fffff;
4557 max_dlci = tvb_get_ntohl(tvb, offset2+8) & 0x7fffff;
4558 switch(dlci_len_code) {
4559 case 0:
4560 /* 10-bit DLCIs */
4561 dlci_len = 10;
4562 min_dlci &= 0x3ff;
4563 max_dlci &= 0x3ff;
4564 break;
4565 case 2:
4566 dlci_len = 23;
4567 break;
4568 default:
4569 dlci_len = 0;
4570 min_dlci = 0;
4571 max_dlci = 0;
4572 break;
4574 proto_tree_add_uint_format_value(rsvp_object_tree, hf_rsvp_dlci_length, tvb, offset2+4, 2,
4575 dlci_len, "%s (%d)",
4576 (dlci_len==10) ? "10 bits" :
4577 (dlci_len==23) ? "23 bits" :
4578 "INVALID", dlci_len_code);
4579 proto_tree_add_uint(rsvp_object_tree, hf_rsvp_min_dlci, tvb, offset2+5, 3, min_dlci);
4580 proto_tree_add_uint(rsvp_object_tree, hf_rsvp_max_dlci, tvb, offset2+8, 2, max_dlci);
4581 proto_item_set_text(ti, "LABEL REQUEST: Frame: L3PID: %s (0x%04x). DLCI Len: %s. Min DLCI: %d. Max DLCI: %d",
4582 val_to_str_const(l3pid, etype_vals, "Unknown"), l3pid,
4583 (dlci_len==10) ? "10 bits" :
4584 (dlci_len==23) ? "23 bits" :
4585 "INVALID", min_dlci, max_dlci);
4586 break;
4588 case 4:
4589 case 5: {
4590 unsigned short l3pid = tvb_get_ntohs(tvb, offset2+2);
4591 unsigned char lsp_enc = tvb_get_uint8(tvb,offset2);
4592 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_request_lsp_encoding_type, tvb, offset2, 1, ENC_BIG_ENDIAN);
4593 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_request_switching_type, tvb, offset2+1, 1, ENC_BIG_ENDIAN);
4594 proto_tree_add_item(rsvp_object_tree, hf_rsvp_g_pid, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
4595 proto_item_set_text(ti, "LABEL REQUEST: Generalized: LSP Encoding=%s, "
4596 "Switching Type=%s, G-PID=%s ",
4597 rval_to_str(lsp_enc, gmpls_lsp_enc_rvals, "Unknown (%d)"),
4598 rval_to_str(tvb_get_uint8(tvb,offset2+1),
4599 gmpls_switching_type_rvals, "Unknown (%d)"),
4600 rval_to_str_const(l3pid, gmpls_gpid_rvals,
4601 val_to_str(l3pid, etype_vals,
4602 "Unknown (0x%04x)")));
4603 break;
4606 default:
4607 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_request_data, tvb, offset2, obj_length - 4, ENC_NA);
4608 break;
4609 } /* switch(type) */
4612 /*-----------------------------------------------------------------------------
4613 * LABEL
4614 *---------------------------------------------------------------------------*/
4617 FF: G.694 lambda label, see draft-ietf-ccamp-gmpls-g-694-lambda-labels-05
4619 0 1 2 3
4620 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
4621 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4622 |Grid | C.S | Reserved | n |
4623 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4625 static const value_string lambda_grid_vals[] = {
4626 { 1, "DWDM"},
4627 { 2, "CWDM"},
4628 { 3, "Flexi"},
4629 { 0, NULL }
4632 static const value_string grid1_cs_vals[] = {
4633 { 1, "100GHz"},
4634 { 2, "50GHz"},
4635 { 3, "25GHz"},
4636 { 4, "12.5GHz"},
4637 { 0, NULL }
4639 static const value_string grid2_cs_vals[] = {
4640 { 1, "20nm"},
4641 { 0, NULL }
4643 static const value_string grid3_cs_vals[] = {
4644 { 5, "6.25GHz"},
4645 { 0, NULL }
4648 static void
4649 dissect_glabel_lambda(proto_tree *ti, proto_tree *rsvp_object_tree,
4650 tvbuff_t *tvb,
4651 int offset)
4653 float freq = 0.0f;
4654 float slot_width = 0.0f;
4655 uint32_t wavelength = 0;
4656 float cs_thz = 0.0f;
4657 proto_tree *wavelength_tree;
4658 uint8_t grid, cs;
4659 int16_t n, m;
4663 grid = ((tvb_get_uint8(tvb, offset) & 0xE0) >> 5);
4664 cs = ((tvb_get_uint8(tvb, offset) & 0x1E) >> 1);
4665 n = tvb_get_ntohs(tvb, offset + 2);
4667 wavelength_tree = proto_tree_add_subtree(rsvp_object_tree, tvb, offset, 4, TREE(TT_WAVELENGTH), NULL, "Wavelength Label");
4668 proto_tree_add_item(wavelength_tree, hf_rsvp_wavelength_grid, tvb, offset, 1, ENC_NA);
4671 switch(grid) {
4672 case 1: /* DWDM grid: Frequency (THz) = 193.1 THz + n * channel spacing (THz) */
4673 cs_thz =
4674 cs == 1 ? 0.1f :
4675 cs == 2 ? 0.05f :
4676 cs == 3 ? 0.025f :
4677 cs == 4 ? 0.0125f :
4678 0.0f;
4679 freq = 193.1f + (n * cs_thz);
4680 proto_tree_add_item(wavelength_tree, hf_rsvp_wavelength_cs1, tvb, offset, 1, ENC_NA);
4681 proto_tree_add_uint_format_value(wavelength_tree, hf_rsvp_wavelength_n, tvb, offset+2, 2, n, "%d", n);
4682 proto_tree_add_float_format_value(wavelength_tree, hf_rsvp_wavelength_freq, tvb, offset, 4, freq, "%.2fTHz", freq);
4683 proto_item_append_text(ti, ": Wavelength: grid=DWDM, channel spacing=%s, central frequency=%d, freq=%.2fTHz",
4684 val_to_str_const(cs, grid1_cs_vals, "Unknown"), n, freq);
4685 break;
4686 case 2: /* CWDM grid: Wavelength (nm) = 1471 nm + n * 20 nm */
4687 wavelength = 1471 + (n * 20);
4688 proto_tree_add_item(wavelength_tree, hf_rsvp_wavelength_cs2, tvb, offset, 1, ENC_NA);
4689 proto_tree_add_item(wavelength_tree, hf_rsvp_wavelength_n, tvb, offset+2, 2, ENC_BIG_ENDIAN);
4690 proto_tree_add_uint_format_value(wavelength_tree, hf_rsvp_wavelength_wavelength, tvb, offset, 4, wavelength, "%unm", wavelength);
4691 proto_item_append_text(ti, ": Wavelength: grid=CWDM, channel spacing=%s, central frequenc=%d, wavelength=%unm",
4692 val_to_str_const(cs, grid2_cs_vals, "Unknown"), n, wavelength);
4693 break;
4694 case 3: /* flexi grid: Slot width (Ghz) = 12.5 Ghz * m, see RFC 7699 */
4695 m = tvb_get_ntohs(tvb, offset + 4);
4696 slot_width = 12.5f * m;
4697 proto_tree_add_item(wavelength_tree, hf_rsvp_wavelength_cs3, tvb, offset, 1, ENC_NA);
4698 proto_tree_add_item(wavelength_tree, hf_rsvp_wavelength_n, tvb, offset+2, 2, ENC_BIG_ENDIAN);
4699 proto_tree_add_float_format_value(wavelength_tree, hf_rsvp_wavelength_m, tvb, offset, 4, slot_width, "%.2fGHz", slot_width);
4700 proto_item_append_text(ti, ": Wavelength: grid=flexi, channel spacing=%s, central frequenc=%d, Channel Width=%.2fGhz",
4701 val_to_str_const(cs, grid3_cs_vals, "Unknown"), n, slot_width);
4702 break;
4703 default: /* unknown grid: */
4704 proto_tree_add_item(wavelength_tree, hf_rsvp_wavelength_channel_spacing, tvb, offset, 1, ENC_NA);
4705 proto_tree_add_item(wavelength_tree, hf_rsvp_wavelength_n, tvb, offset+2, 2, ENC_BIG_ENDIAN);
4706 proto_item_append_text(ti, ": Wavelength: grid=%u, channel spacing=%u, central frequenc=%d", grid, cs, n);
4707 break;
4712 FF: SONET/SDH label, see RFC 4606
4714 0 1 2 3
4715 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
4716 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4717 | S | U | K | L | M |
4718 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4720 static void
4721 dissect_glabel_sdh(proto_tree *ti _U_, proto_tree *rsvp_object_tree,
4722 tvbuff_t *tvb,
4723 int offset)
4725 uint16_t s;
4726 uint8_t u, k, l, m;
4727 proto_tree* sonet_tree;
4729 sonet_tree = proto_tree_add_subtree(rsvp_object_tree, tvb, offset, 4, TREE(TT_SONET_SDH), NULL, "SONET/SDH Label");
4730 proto_tree_add_item(sonet_tree, hf_rsvp_sonet_s, tvb, offset, 2, ENC_BIG_ENDIAN);
4731 proto_tree_add_item(sonet_tree, hf_rsvp_sonet_u, tvb, offset+2, 1, ENC_BIG_ENDIAN);
4732 proto_tree_add_item(sonet_tree, hf_rsvp_sonet_k, tvb, offset+2, 1, ENC_BIG_ENDIAN);
4733 proto_tree_add_item(sonet_tree, hf_rsvp_sonet_l, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4734 proto_tree_add_item(sonet_tree, hf_rsvp_sonet_m, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4736 s = tvb_get_ntohs(tvb, offset);
4737 u = ((tvb_get_uint8(tvb, offset + 2) & 0xF0) >> 4);
4738 k = ((tvb_get_uint8(tvb, offset + 2) & 0x0F) >> 0);
4739 l = ((tvb_get_uint8(tvb, offset + 3) & 0xF0) >> 4);
4740 m = ((tvb_get_uint8(tvb, offset + 3) & 0x0F) >> 0);
4741 proto_item_append_text(ti, ": SONET/SDH: S=%u, U=%u, K=%u, L=%u, M=%u",
4742 s, u, k, l, m);
4746 FF: G.709 label (aka ODUk label), see RFC 4328
4748 0 1 2 3
4749 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
4750 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4751 | Reserved | t3 | t2 |t1
4752 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4754 static void
4755 dissect_glabel_g709(proto_tree *ti _U_, proto_tree *rsvp_object_tree,
4756 tvbuff_t *tvb,
4757 int offset)
4759 uint8_t t1, t2, t3;
4760 proto_tree* g709_tree;
4762 g709_tree = proto_tree_add_subtree(rsvp_object_tree, tvb, offset, 4, TREE(TT_G709), NULL, "G.709 ODUk Label");
4763 proto_tree_add_item(g709_tree, hf_rsvp_g709_t3, tvb, offset+2, 2, ENC_BIG_ENDIAN);
4764 proto_tree_add_item(g709_tree, hf_rsvp_g709_t2, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4765 proto_tree_add_item(g709_tree, hf_rsvp_g709_t1, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4767 t2 = ((tvb_get_uint8(tvb, offset + 3) & 0x0E) >> 1);
4768 t1 = ((tvb_get_uint8(tvb, offset + 3) & 0x01) >> 0);
4769 t3 = ((tvb_get_uint8(tvb, offset + 2) & 0x03) << 4);
4770 t3 |= ((tvb_get_uint8(tvb, offset + 3) & 0xF0) >> 4);
4772 proto_item_append_text(ti, ": G.709 ODUk: "
4773 "t3=%u, "
4774 "t2=%u, "
4775 "t1=%u",
4776 t3, t2, t1);
4780 FF: EVPL Generalized Label, see RFC6004
4782 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
4783 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4784 | Rsvd | VLAN ID |
4785 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4787 static void
4788 dissect_glabel_evpl(proto_tree *ti _U_, proto_tree *rsvp_object_tree,
4789 tvbuff_t *tvb,
4790 int offset)
4792 int bit_offset;
4793 uint16_t vlan_id = ((tvb_get_ntohs(tvb,offset) << 4) & 0xFFFF);
4795 /* point to the first bit in VLAN ID */
4796 bit_offset = (offset<<2)+3;
4797 proto_tree_add_bits_item(rsvp_object_tree,hf_rsvp_label_generalized_label_evpl_vlad_id,tvb, bit_offset, 12, ENC_BIG_ENDIAN);
4798 proto_item_append_text(ti, ": EVPL Generalized Label: "
4799 "VLAN ID = %u" ,vlan_id);
4802 static void
4803 dissect_rsvp_label(proto_tree *ti, proto_tree *rsvp_object_tree,
4804 tvbuff_t *tvb,
4805 int offset, int obj_length,
4806 int rsvp_class, int type)
4808 int offset2 = offset + 4;
4809 int mylen, i;
4810 const char *name;
4811 proto_item *hidden_item;
4812 uint32_t unassigned_upstream_label;
4814 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4815 proto_item_set_hidden(hidden_item);
4817 name = (rsvp_class==RSVP_CLASS_SUGGESTED_LABEL ? "SUGGESTED LABEL":
4818 (rsvp_class==RSVP_CLASS_UPSTREAM_LABEL ? "UPSTREAM LABEL":
4819 (rsvp_class==RSVP_CLASS_RECOVERY_LABEL ? "RECOVERY LABEL":
4820 "LABEL")));
4821 mylen = obj_length - 4;
4822 switch(type) {
4823 case 1:
4824 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_label, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4825 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_label, tvb, offset2, 4, ENC_BIG_ENDIAN);
4826 proto_item_set_text(ti, "%s: %u", name,
4827 tvb_get_ntohl(tvb, offset2));
4828 break;
4830 case 2:
4831 unassigned_upstream_label = tvb_get_ntoh24(tvb, offset2);
4832 if(unassigned_upstream_label == 0xffffffff){ /* Unassigned upstream label, see RFC 8359 */
4833 proto_item_append_text(ti, ": Unassigned upstream label ( 0x%x )",unassigned_upstream_label);
4835 else {
4836 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_label, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4837 if (rsvp_generalized_label_option == 1) { /* FF: no generalized label interpretation */
4838 proto_item_set_text(ti, "%s: Generalized: ", name);
4839 for (i = 0; i < mylen; i += 4) {
4840 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_generalized_label, tvb, offset2+i, 4, ENC_BIG_ENDIAN);
4841 if (i < 16) {
4842 proto_item_append_text(ti, "0x%x%s", tvb_get_ntohl(tvb, offset2+i), i+4<mylen?", ":"");
4844 else if (i == 16) {
4845 proto_item_append_text(ti, "...");
4848 } else if (rsvp_generalized_label_option == 2) {
4849 dissect_glabel_sdh(ti, rsvp_object_tree, tvb, offset2);
4850 } else if (rsvp_generalized_label_option == 4) {
4851 dissect_glabel_g709(ti, rsvp_object_tree, tvb, offset2);
4852 } else if (rsvp_generalized_label_option == 3) {
4853 dissect_glabel_lambda(ti, rsvp_object_tree, tvb, offset2);
4854 } else if (rsvp_generalized_label_option == 5) {
4855 dissect_glabel_evpl(ti, rsvp_object_tree, tvb, offset2);
4858 break;
4860 case 4:
4861 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_label, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4862 proto_item_append_text(ti, ": Generalized Channel_set");
4863 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_data, tvb, offset2, mylen, ENC_NA);
4864 break;
4866 default:
4867 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_label, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4868 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_data, tvb, offset2, mylen, ENC_NA);
4869 break;
4872 /*------------------------------------------------------------------------------
4873 * LABEL_SET
4874 *------------------------------------------------------------------------------*/
4875 static const value_string action_type_vals[] = {
4876 { 0, "Inclusive list"},
4877 { 1, "Exclusive list"},
4878 { 2, "Inclusive range"},
4879 { 3, "Exclusive range"},
4880 { 0, NULL}
4883 static void
4884 dissect_rsvp_label_set(proto_item *ti, proto_tree *rsvp_object_tree,
4885 tvbuff_t *tvb,
4886 int offset, int obj_length,
4887 int rsvp_class _U_, int type _U_)
4889 int offset2 = offset + 8;
4890 uint8_t label_type;
4891 int len, i;
4893 len = obj_length - 8;
4894 proto_item *hidden_item;
4896 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4897 proto_item_set_hidden(hidden_item);
4899 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_label_set, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4900 proto_tree_add_item(rsvp_object_tree, hf_rsvp_label_set_action, tvb, offset+4, 1, ENC_BIG_ENDIAN);
4901 proto_item_append_text(ti, ": %s",
4902 val_to_str(tvb_get_uint8(tvb, offset+4),
4903 action_type_vals, "Unknown (%u)"));
4904 label_type = tvb_get_uint8 (tvb, offset+7);
4905 proto_tree_add_uint_format_value(rsvp_object_tree, hf_rsvp_label_set_type, tvb, offset+7, 1, label_type,
4906 "%s", (label_type == 1) ? "Packet Label" : "Generalized Label");
4907 proto_item_append_text(ti, ", %s",
4908 (label_type == 1) ? "Packet Label: " : "Generalized Label: ");
4910 for (i = 0; i < len/4; i++) {
4911 uint32_t subchannel = tvb_get_ntohl(tvb, offset2+i*4);
4912 proto_tree_add_uint_format_value(rsvp_object_tree, hf_rsvp_label_set_subchannel, tvb, offset2+i*4, 4, subchannel,
4913 "Subchannel %u: %u (0x%x)", i+1, subchannel, subchannel);
4915 if (i<5) {
4916 if (i!=0)
4917 proto_item_append_text(ti, ", ");
4919 proto_item_append_text(ti, "%u",
4920 tvb_get_ntohl(tvb, offset2+i*4));
4925 /*------------------------------------------------------------------------------
4926 * SESSION ATTRIBUTE
4927 *------------------------------------------------------------------------------*/
4928 static void
4929 dissect_rsvp_session_attribute(proto_item *ti, proto_tree *rsvp_object_tree,
4930 tvbuff_t *tvb,
4931 int offset, int obj_length,
4932 int rsvp_class _U_, int type)
4934 int offset2 = offset + 4;
4935 uint8_t flags;
4936 uint8_t name_len;
4937 proto_tree *ti2, *rsvp_sa_flags_tree;
4938 proto_item *hidden_item;
4940 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4941 proto_item_set_hidden(hidden_item);
4943 switch(type) {
4944 case 1:
4945 case 7:
4947 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_attribute, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4949 if (type == 1) {
4950 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_attribute_exclude_any, tvb, offset2, 4, ENC_BIG_ENDIAN);
4951 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_attribute_include_any, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
4952 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_attribute_include_all, tvb, offset2+8, 4, ENC_BIG_ENDIAN);
4953 offset2 = offset2+12;
4956 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_attribute_setup_priority, tvb, offset2, 1, ENC_BIG_ENDIAN);
4957 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_attribute_hold_priority, tvb, offset2+1, 1, ENC_BIG_ENDIAN);
4958 flags = tvb_get_uint8(tvb, offset2+2);
4959 ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_attribute_flags, tvb, offset2+2, 1, ENC_BIG_ENDIAN);
4960 rsvp_sa_flags_tree = proto_item_add_subtree(ti2,
4961 TREE(TT_SESSION_ATTRIBUTE_FLAGS));
4962 proto_tree_add_item(rsvp_sa_flags_tree, hf_rsvp_sa_flags_local,
4963 tvb, offset2+2, 1, ENC_BIG_ENDIAN);
4964 proto_tree_add_item(rsvp_sa_flags_tree, hf_rsvp_sa_flags_label,
4965 tvb, offset2+2, 1, ENC_BIG_ENDIAN);
4966 proto_tree_add_item(rsvp_sa_flags_tree, hf_rsvp_sa_flags_se_style,
4967 tvb, offset2+2, 1, ENC_BIG_ENDIAN);
4968 proto_tree_add_item(rsvp_sa_flags_tree, hf_rsvp_sa_flags_bandwidth,
4969 tvb, offset2+2, 1, ENC_BIG_ENDIAN);
4970 proto_tree_add_item(rsvp_sa_flags_tree, hf_rsvp_sa_flags_node,
4971 tvb, offset2+2, 1, ENC_BIG_ENDIAN);
4973 name_len = tvb_get_uint8(tvb, offset2+3);
4974 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_attribute_name_length, tvb, offset2+3, 1, ENC_BIG_ENDIAN);
4975 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_attribute_name, tvb, offset2+4, name_len, ENC_NA|ENC_ASCII);
4976 proto_item_set_text(ti, "SESSION ATTRIBUTE: SetupPrio %d, HoldPrio %d, %s%s%s%s%s [%s]",
4977 tvb_get_uint8(tvb, offset2),
4978 tvb_get_uint8(tvb, offset2+1),
4979 flags &0x01 ? "Local Protection, " : "",
4980 flags &0x02 ? "Label Recording, " : "",
4981 flags &0x04 ? "SE Style, " : "",
4982 flags &0x08 ? "Bandwidth Protection, " : "",
4983 flags &0x10 ? "Node Protection, " : "",
4984 name_len ? tvb_format_text(wmem_packet_scope(), tvb, offset2+4, name_len) : "");
4985 break;
4987 default:
4988 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_attribute, tvb, offset+3, 1, ENC_BIG_ENDIAN);
4989 proto_tree_add_item(rsvp_object_tree, hf_rsvp_session_attribute_data, tvb, offset2, obj_length - 4, ENC_NA);
4990 break;
4994 /*------------------------------------------------------------------------------
4995 * EXPLICIT ROUTE AND RECORD ROUTE SUBOBJECTS,
4996 * RFC 3209, RFC 3473, RFC 5420, RFC 4873, RFC 5553
4997 *------------------------------------------------------------------------------*/
4998 static void
4999 dissect_rsvp_ro_subobjects(proto_tree *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
5000 tvbuff_t *tvb,
5001 int offset, int obj_length, int rsvp_class)
5003 int i, type, lbit, dbit, path_key, l, flags;
5004 proto_tree *ti2 = NULL, *rsvp_ro_subtree, *rsvp_rro_flags_subtree;
5005 int tree_type;
5007 switch(rsvp_class) {
5008 case RSVP_CLASS_EXPLICIT_ROUTE:
5009 case RSVP_CLASS_SECONDARY_EXPLICIT_ROUTE:
5010 tree_type = TREE(TT_EXPLICIT_ROUTE_SUBOBJ);
5011 break;
5012 case RSVP_CLASS_RECORD_ROUTE:
5013 case RSVP_CLASS_SECONDARY_RECORD_ROUTE:
5014 tree_type = TREE(TT_RECORD_ROUTE_SUBOBJ);
5015 break;
5016 case RSVP_CLASS_EXCLUDE_ROUTE:
5017 tree_type = TREE(TT_EXCLUDE_ROUTE_SUBOBJ);
5018 break;
5019 default:
5020 /* Bail out */
5021 return;
5023 /* 0 1 2 3 */
5024 /* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 */
5025 /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
5026 /* |L| Type | Length | Value... | */
5027 /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
5029 for (i=1, l = 0; l < obj_length - 4; i++) {
5030 type = tvb_get_uint8(tvb, offset + l);
5031 if ((rsvp_class == RSVP_CLASS_EXPLICIT_ROUTE) ||
5032 (rsvp_class == RSVP_CLASS_EXCLUDE_ROUTE) ||
5033 (rsvp_class == RSVP_CLASS_SECONDARY_EXPLICIT_ROUTE))
5034 type &= 0x7f;
5035 lbit = tvb_get_uint8(tvb, offset + l) & 0x80;
5036 dbit = tvb_get_uint8(tvb, offset + l + 2) & 0x80;
5037 switch(type) {
5038 case 1: /* IPv4 */
5039 rsvp_ro_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
5040 offset+l, 8,
5041 tree_type, &ti2, "IPv4 Subobject - %s%s",
5042 tvb_ip_to_str(pinfo->pool, tvb, offset+l+2),
5043 (rsvp_class == RSVP_CLASS_EXPLICIT_ROUTE ||
5044 rsvp_class == RSVP_CLASS_SECONDARY_EXPLICIT_ROUTE) ?
5045 (lbit ? ", Loose" : ", Strict") : "");
5047 if (rsvp_class == RSVP_CLASS_EXPLICIT_ROUTE || rsvp_class == RSVP_CLASS_SECONDARY_EXPLICIT_ROUTE)
5048 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_loose_hop, tvb, offset+l, 1, ENC_NA);
5049 if (rsvp_class == RSVP_CLASS_EXCLUDE_ROUTE){
5050 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_xro_sobj_lbit, tvb, offset+l, 1, ENC_BIG_ENDIAN);
5052 proto_tree_add_uint_format_value(rsvp_ro_subtree, hf_rsvp_type, tvb, offset+l, 1, type, "1 (IPv4)");
5053 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_length, tvb, offset+l+1, 1, ENC_BIG_ENDIAN);
5054 if(rsvp_class == RSVP_CLASS_EXPLICIT_ROUTE || rsvp_class == RSVP_CLASS_RECORD_ROUTE ||
5055 rsvp_class == RSVP_CLASS_SECONDARY_EXPLICIT_ROUTE || rsvp_class == RSVP_CLASS_SECONDARY_RECORD_ROUTE){
5056 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_ipv4_hop, tvb, offset+l+2, 4, ENC_BIG_ENDIAN);
5057 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_prefix_length, tvb, offset+l+6, 1, ENC_BIG_ENDIAN);
5059 if(rsvp_class == RSVP_CLASS_EXCLUDE_ROUTE){
5060 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_xro_sobj_ipv4_addr, tvb, offset + l + 2, 4, ENC_BIG_ENDIAN);
5061 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_xro_sobj_ipv4_prefix, tvb, offset + l + 6, 1, ENC_BIG_ENDIAN);
5062 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_xro_sobj_ipv4_attr, tvb, offset + l + 7, 1, ENC_BIG_ENDIAN);
5064 if (i < 4) {
5065 proto_item_append_text(ti, "IPv4 %s%s",
5066 tvb_ip_to_str(pinfo->pool, tvb, offset+l+2),
5067 lbit ? " [L]" : "");
5069 if (rsvp_class == RSVP_CLASS_RECORD_ROUTE || rsvp_class == RSVP_CLASS_SECONDARY_RECORD_ROUTE) {
5070 flags = tvb_get_uint8(tvb, offset+l+7);
5071 if (flags&0x20) {
5072 proto_item_append_text(ti, " (Node-id)");
5073 proto_item_append_text(ti2, " (Node-id)");
5075 if (flags&0x01) proto_item_append_text(ti2, ", Local Protection Available");
5076 if (flags&0x02) proto_item_append_text(ti2, ", Local Protection In Use");
5077 if (flags&0x04) proto_item_append_text(ti2, ", Backup BW Avail");
5078 if (flags&0x08) proto_item_append_text(ti2, ", Backup is Next-Next-Hop");
5079 ti2 = proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_flags, tvb, offset+l+7, 1, ENC_BIG_ENDIAN);
5080 rsvp_rro_flags_subtree =
5081 proto_item_add_subtree(ti2, TREE(TT_RECORD_ROUTE_SUBOBJ_FLAGS));
5082 proto_tree_add_item(rsvp_rro_flags_subtree, hf_rsvp_rro_flags_local_avail,
5083 tvb, offset+l+7, 1, ENC_BIG_ENDIAN);
5084 proto_tree_add_item(rsvp_rro_flags_subtree, hf_rsvp_rro_flags_local_in_use,
5085 tvb, offset+l+7, 1, ENC_BIG_ENDIAN);
5086 proto_tree_add_item(rsvp_rro_flags_subtree, hf_rsvp_rro_flags_bandwidth,
5087 tvb, offset+l+7, 1, ENC_BIG_ENDIAN);
5088 proto_tree_add_item(rsvp_rro_flags_subtree, hf_rsvp_rro_flags_node,
5089 tvb, offset+l+7, 1, ENC_BIG_ENDIAN);
5090 proto_tree_add_item(rsvp_rro_flags_subtree, hf_rsvp_rro_flags_node_address,
5091 tvb, offset+l+7, 1, ENC_BIG_ENDIAN);
5094 break;
5096 case 2: /* IPv6 */
5097 rsvp_ro_subtree = proto_tree_add_subtree(rsvp_object_tree, tvb,
5098 offset+l, 20, tree_type, &ti2,
5099 "IPv6 Subobject");
5100 if (rsvp_class == RSVP_CLASS_EXPLICIT_ROUTE || rsvp_class == RSVP_CLASS_SECONDARY_EXPLICIT_ROUTE){
5101 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_loose_hop, tvb, offset+l, 1, ENC_NA);
5104 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_xro_sobj_lbit,
5105 tvb, offset + l, 1, ENC_BIG_ENDIAN);
5106 proto_tree_add_uint_format_value(rsvp_ro_subtree, hf_rsvp_type,
5107 tvb, offset+l, 1, type, "2 (IPv6)");
5108 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_length,
5109 tvb, offset+l+1, 1, ENC_BIG_ENDIAN);
5110 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_ipv6_hop,
5111 tvb, offset+l+2, 16, ENC_NA);
5112 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_prefix_length,
5113 tvb, offset+l+18, 1, ENC_BIG_ENDIAN);
5114 if(rsvp_class == RSVP_CLASS_EXCLUDE_ROUTE){
5115 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_xro_sobj_ipv6_attr,
5116 tvb, offset + l + 19, 1, ENC_BIG_ENDIAN);
5118 if (i < 4) {
5119 proto_item_append_text(ti, "IPv6 [...]%s", lbit ? " [L]":"");
5121 if (rsvp_class == RSVP_CLASS_RECORD_ROUTE || rsvp_class == RSVP_CLASS_SECONDARY_RECORD_ROUTE) {
5122 flags = tvb_get_uint8(tvb, offset+l+19);
5123 if (flags&0x20) {
5124 proto_item_append_text(ti, " (Node-id)");
5125 proto_item_append_text(ti2, " (Node-id)");
5127 if (flags&0x01) proto_item_append_text(ti2, ", Local Protection Available");
5128 if (flags&0x02) proto_item_append_text(ti2, ", Local Protection In Use");
5129 if (flags&0x04) proto_item_append_text(ti2, ", Backup BW Avail");
5130 if (flags&0x08) proto_item_append_text(ti2, ", Backup is Next-Next-Hop");
5131 ti2 = proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_flags, tvb, offset+l+19, 1, ENC_BIG_ENDIAN);
5132 rsvp_rro_flags_subtree =
5133 proto_item_add_subtree(ti2, TREE(TT_RECORD_ROUTE_SUBOBJ_FLAGS));
5135 proto_tree_add_item(rsvp_rro_flags_subtree, hf_rsvp_rro_flags_local_avail,
5136 tvb, offset+l+19, 1, ENC_BIG_ENDIAN);
5137 proto_tree_add_item(rsvp_rro_flags_subtree, hf_rsvp_rro_flags_local_in_use,
5138 tvb, offset+l+19, 1, ENC_BIG_ENDIAN);
5139 proto_tree_add_item(rsvp_rro_flags_subtree, hf_rsvp_rro_flags_backup_tunnel_bandwidth,
5140 tvb, offset+l+19, 1, ENC_BIG_ENDIAN);
5141 proto_tree_add_item(rsvp_rro_flags_subtree, hf_rsvp_rro_flags_backup_tunnel_hop,
5142 tvb, offset+l+19, 1, ENC_BIG_ENDIAN);
5143 proto_tree_add_item(rsvp_rro_flags_subtree, hf_rsvp_rro_flags_node_address,
5144 tvb, offset+l+19, 1, ENC_BIG_ENDIAN);
5148 break;
5150 case 3: /* Label RFC 3477 */
5151 rsvp_ro_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
5152 offset+l, 8,
5153 tree_type, &ti2, "Label Subobject - %d, %s",
5154 tvb_get_ntohl(tvb, offset+l+4),
5155 (rsvp_class == RSVP_CLASS_EXPLICIT_ROUTE ||
5156 rsvp_class == RSVP_CLASS_SECONDARY_EXPLICIT_ROUTE) ?
5157 (lbit ? "Loose" : "Strict") : "");
5158 if (rsvp_class == RSVP_CLASS_EXPLICIT_ROUTE || rsvp_class == RSVP_CLASS_SECONDARY_EXPLICIT_ROUTE)
5159 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_loose_hop, tvb, offset+l, 1, ENC_NA);
5161 proto_tree_add_uint_format_value(rsvp_ro_subtree, hf_rsvp_type, tvb, offset+l, 1,
5162 type, "3 (Label)");
5163 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_length, tvb, offset+l+1, 1, ENC_BIG_ENDIAN);
5164 if (rsvp_class == RSVP_CLASS_RECORD_ROUTE || rsvp_class == RSVP_CLASS_SECONDARY_RECORD_ROUTE) {
5165 flags = tvb_get_uint8(tvb, offset+l+2);
5166 if (flags&0x01) proto_item_append_text(ti2, "The label will be understood if received on any interface");
5167 ti2 = proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_flags, tvb, offset+l+2, 1, ENC_BIG_ENDIAN);
5168 rsvp_rro_flags_subtree =
5169 proto_item_add_subtree(ti2, TREE(TT_RECORD_ROUTE_SUBOBJ_FLAGS));
5171 proto_tree_add_item(rsvp_rro_flags_subtree, hf_rsvp_rro_flags_global_label,
5172 tvb, offset+l+2, 1, ENC_BIG_ENDIAN);
5174 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ctype, tvb, offset+l+3, 1, ENC_BIG_ENDIAN);
5175 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_label, tvb, offset+l+4, 4, ENC_BIG_ENDIAN);
5176 if (i < 4) {
5177 proto_item_append_text(ti, "Label %d%s",
5178 tvb_get_ntohl(tvb, offset+l+4),
5179 lbit ? " [L]":"");
5181 break;
5183 case 4: /* Unnumbered Interface-ID RFC 3477, RFC 6107*/
5184 rsvp_ro_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
5185 offset+l, 8, tree_type, &ti2,
5186 "Unnumbered Interface-ID - %s, %d, %s",
5187 tvb_ip_to_str(pinfo->pool, tvb, offset+l+4),
5188 tvb_get_ntohl(tvb, offset+l+8),
5189 (rsvp_class == RSVP_CLASS_EXPLICIT_ROUTE ||
5190 rsvp_class == RSVP_CLASS_SECONDARY_EXPLICIT_ROUTE) ?
5191 (lbit ? "Loose" : "Strict") : "");
5192 if (rsvp_class == RSVP_CLASS_EXPLICIT_ROUTE || rsvp_class == RSVP_CLASS_SECONDARY_EXPLICIT_ROUTE)
5193 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_loose_hop, tvb, offset+l, 1, ENC_NA);
5195 proto_tree_add_uint_format_value(rsvp_ro_subtree, hf_rsvp_type, tvb, offset+l, 1,
5196 type, "4 (Unnumbered Interface-ID)");
5197 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_length, tvb, offset+l+1, 1, ENC_BIG_ENDIAN);
5198 if (rsvp_class == RSVP_CLASS_RECORD_ROUTE || rsvp_class == RSVP_CLASS_SECONDARY_RECORD_ROUTE) {
5199 flags = tvb_get_uint8(tvb, offset+l+2);
5200 if (flags&0x01) proto_item_append_text(ti2, ", Local Protection Available");
5201 if (flags&0x02) proto_item_append_text(ti2, ", Local Protection In Use");
5202 ti2 = proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_flags, tvb, offset+l+2, 1, ENC_BIG_ENDIAN);
5203 rsvp_rro_flags_subtree =
5204 proto_item_add_subtree(ti2, TREE(TT_RECORD_ROUTE_SUBOBJ_FLAGS));
5205 proto_tree_add_item(rsvp_rro_flags_subtree, hf_rsvp_rro_flags_local_avail,
5206 tvb, offset+l+2, 1, ENC_BIG_ENDIAN);
5207 proto_tree_add_item(rsvp_rro_flags_subtree, hf_rsvp_rro_flags_local_in_use,
5208 tvb, offset+l+2, 1, ENC_BIG_ENDIAN);
5210 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_router_id, tvb, offset+l+4, 4, ENC_BIG_ENDIAN);
5211 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_interface_id, tvb, offset+l+8, 4, ENC_BIG_ENDIAN);
5212 if (i < 4) {
5213 proto_item_append_text(ti, "Unnum %s/%d%s",
5214 tvb_ip_to_str(pinfo->pool, tvb, offset+l+4),
5215 tvb_get_ntohl(tvb, offset+l+8),
5216 lbit ? " [L]":"");
5218 break;
5220 case 21:
5222 case 32: /* AS */
5223 if (rsvp_class == RSVP_CLASS_RECORD_ROUTE || rsvp_class == RSVP_CLASS_EXCLUDE_ROUTE ||
5224 rsvp_class == RSVP_CLASS_SECONDARY_RECORD_ROUTE) goto defaultsub;
5225 lbit = tvb_get_ntohs(tvb, offset+l+2);
5226 rsvp_ro_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
5227 offset+l, 4, tree_type, &ti2,
5228 "Autonomous System %u",
5229 lbit);
5230 proto_tree_add_uint_format_value(rsvp_ro_subtree, hf_rsvp_type, tvb, offset+l, 1,
5231 type, "32 (Autonomous System Number)");
5232 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_length, tvb, offset+l+1, 1, ENC_BIG_ENDIAN);
5233 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_autonomous_system, tvb, offset+l+2, 2, ENC_BIG_ENDIAN);
5234 if (i < 4) {
5235 proto_item_append_text(ti, "AS %d",
5236 tvb_get_ntohs(tvb, offset+l+2));
5238 break;
5241 case 34: /* SRLG subobject RFC 4874 */
5242 if (rsvp_class == RSVP_CLASS_EXPLICIT_ROUTE || rsvp_class == RSVP_CLASS_SECONDARY_EXPLICIT_ROUTE) goto defaultsub;
5243 if (rsvp_class == RSVP_CLASS_RECORD_ROUTE || rsvp_class == RSVP_CLASS_SECONDARY_RECORD_ROUTE){
5244 rsvp_ro_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
5245 offset + l, 8, tree_type, NULL,
5246 "SRLG Subobject - %u",
5247 tvb_get_ntohl(tvb, offset + l + 4));
5249 proto_tree_add_uint_format_value(rsvp_ro_subtree, hf_rsvp_type,
5250 tvb, offset+l, 1,type, "34 (SRLG sub-object)");
5251 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_xro_sobj_len,
5252 tvb, offset + l + 1, 1, ENC_BIG_ENDIAN);
5253 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_rro_sobj_dbit,
5254 tvb, offset + l+2, 1, ENC_BIG_ENDIAN);
5255 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_xro_sobj_srlg_res,
5256 tvb, offset + l + 2, 2, ENC_BIG_ENDIAN);
5257 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_xro_sobj_srlg_id,
5258 tvb, offset + l + 4, 4, ENC_BIG_ENDIAN);
5260 if (i < 4) {
5261 proto_item_append_text(ti, "SRLG %u%s",
5262 tvb_get_ntohl(tvb, offset + l + 4),
5263 dbit ? " [D]" : "");
5266 else{
5267 rsvp_ro_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
5268 offset + l, 8, tree_type, NULL,
5269 "SRLG Subobject - %u",
5270 tvb_get_ntohl(tvb, offset + l + 2));
5271 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_xro_sobj_lbit,
5272 tvb, offset + l, 1, ENC_BIG_ENDIAN);
5273 proto_tree_add_uint_format_value(rsvp_ro_subtree, hf_rsvp_type,
5274 tvb, offset+l, 1,type, "34 (SRLG sub-object)");
5275 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_xro_sobj_len,
5276 tvb, offset + l + 1, 1, ENC_BIG_ENDIAN);
5277 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_xro_sobj_srlg_id,
5278 tvb, offset + l + 2, 4, ENC_BIG_ENDIAN);
5279 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_xro_sobj_srlg_res,
5280 tvb, offset + l + 6, 2, ENC_BIG_ENDIAN);
5281 if (i < 4) {
5282 proto_item_append_text(ti, "SRLG %u%s",
5283 tvb_get_ntohl(tvb, offset + l + 2),
5284 lbit ? " [L]" : "");
5287 break;
5289 case 64: /* PKSv4 - RFC5520 */
5290 if (rsvp_class == RSVP_CLASS_RECORD_ROUTE || rsvp_class == RSVP_CLASS_EXCLUDE_ROUTE ||
5291 rsvp_class == RSVP_CLASS_SECONDARY_RECORD_ROUTE) goto defaultsub;
5292 path_key = tvb_get_ntohs(tvb, offset+l+2);
5293 rsvp_ro_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
5294 offset+l, 8, tree_type, &ti2,
5295 "Path Key subobject - %s, %u",
5296 tvb_ip_to_str(pinfo->pool, tvb, offset+l+4),
5297 path_key);
5298 proto_tree_add_uint_format_value(rsvp_ro_subtree, hf_rsvp_type, tvb, offset+l, 1,
5299 type, "64 (Path Key with IPv4 PCE-ID)");
5300 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_length, tvb, offset+l+1, 1, ENC_BIG_ENDIAN);
5301 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_path_key, tvb, offset+l+2, 2, ENC_BIG_ENDIAN);
5302 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_pce_id_ipv4, tvb, offset+l+4, 4, ENC_BIG_ENDIAN);
5303 if (i < 4) {
5304 proto_item_append_text(ti, "Path Key %d", path_key);
5306 break;
5308 case 65: /* PKSv6 - RFC5520 */
5309 if (rsvp_class == RSVP_CLASS_RECORD_ROUTE || rsvp_class == RSVP_CLASS_EXCLUDE_ROUTE ||
5310 rsvp_class == RSVP_CLASS_SECONDARY_RECORD_ROUTE) goto defaultsub;
5311 path_key = tvb_get_ntohs(tvb, offset+l+2);
5312 rsvp_ro_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
5313 offset+l, 8, tree_type, &ti2,
5314 "Path Key subobject - %s, %u",
5315 tvb_ip6_to_str(pinfo->pool, tvb, offset+l+4),
5316 path_key);
5317 proto_tree_add_uint_format_value(rsvp_ro_subtree, hf_rsvp_type, tvb, offset+l, 1,
5318 type, "65 (Path Key with IPv6 PCE-ID)");
5319 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_length, tvb, offset+l+1, 1, ENC_BIG_ENDIAN);
5320 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_path_key, tvb, offset+l+2, 2, ENC_BIG_ENDIAN);
5321 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_pce_id_ipv6, tvb, offset+l+4, 16, ENC_NA);
5322 if (i < 4) {
5323 proto_item_append_text(ti, "Path Key %d", path_key);
5325 break;
5327 case 124:
5328 case 125:
5329 case 126:
5330 case 127:
5332 * FF: Types 124 through 127 are to be reserved for Vendor
5333 * Private Use (see RFC 3936, Section 2.3.1) in case of
5334 * EXPLICIT_ROUTE (aka ERO).
5336 if (rsvp_class == RSVP_CLASS_RECORD_ROUTE || rsvp_class == RSVP_CLASS_SECONDARY_RECORD_ROUTE)
5337 goto defaultsub;
5338 else
5339 goto privatesub;
5340 break;
5342 case 252:
5343 case 253:
5344 case 254:
5345 case 255:
5347 * FF: Types 252 through 255 are to be reserved for Vendor
5348 * Private Use (see RFC 3936, Section 2.3.1) in case of
5349 * RECORD_ROUTE (aka RRO).
5352 privatesub: /* Private subobject */
5354 * FF: The first four octets of the sub-object contents of
5355 * a Vendor Private sub-object of an EXPLICIT_ROUTE or
5356 * RECORD_ROUTE object MUST be that vendor's SMI enterprise
5357 * code in network octet order.
5360 uint8_t private_so_len = tvb_get_uint8(tvb, offset+l+1);
5361 rsvp_ro_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb, offset+l,
5362 tvb_get_uint8(tvb, offset+l+1),
5363 tree_type, &ti2, "Private Subobject: %d", type);
5364 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_loose_hop, tvb, offset+l, 1, ENC_NA);
5365 proto_tree_add_uint_format_value(rsvp_ro_subtree, hf_rsvp_type, tvb, offset+l, 1,
5366 type, "%u (Private)", type);
5367 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_private_length, tvb, offset+l+1, 1, ENC_BIG_ENDIAN);
5369 proto_tree_add_item(rsvp_ro_subtree,
5370 hf_rsvp_filter[RSVPF_ENT_CODE],
5371 tvb, offset+l+4, 4, ENC_BIG_ENDIAN);
5372 if (private_so_len > 8) {
5373 /* some private data */
5374 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_private_data, tvb, offset+l+8, private_so_len - 8, ENC_NA);
5377 break;
5379 default: /* Unknown subobject */
5380 defaultsub:
5381 rsvp_ro_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
5382 offset+l,
5383 tvb_get_uint8(tvb, offset+l+1),
5384 tree_type, &ti2, "Unknown subobject: %d", type);
5385 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_loose_hop, tvb, offset+l, 1, ENC_NA);
5387 proto_tree_add_uint_format_value(rsvp_ro_subtree, hf_rsvp_type, tvb, offset+l, 1,
5388 type, "%u (Unknown)", type);
5389 proto_tree_add_item(rsvp_ro_subtree, hf_rsvp_ero_rro_subobjects_length, tvb, offset+l+1, 1, ENC_BIG_ENDIAN);
5390 break;
5393 if (tvb_get_uint8(tvb, offset+l+1) < 1) {
5394 proto_tree_add_expert_format(rsvp_ro_subtree, pinfo, &ei_rsvp_invalid_length, tvb, offset+l+1, 1,
5395 "Invalid length: %u", tvb_get_uint8(tvb, offset+l+1));
5396 return;
5398 l += tvb_get_uint8(tvb, offset+l+1);
5399 if (l < obj_length - 4) {
5400 if (i < 4)
5401 proto_item_append_text(ti, ", ");
5402 else if (i==4)
5403 proto_item_append_text(ti, "...");
5410 /*------------------------------------------------------------------------------
5411 * EXPLICIT ROUTE OBJECT
5412 *------------------------------------------------------------------------------*/
5413 static void
5414 dissect_rsvp_explicit_route(proto_item *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
5415 tvbuff_t *tvb,
5416 int offset, int obj_length,
5417 int rsvp_class, int type)
5419 proto_item *hidden_item;
5421 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5422 proto_item_set_hidden(hidden_item);
5424 switch(type) {
5425 case 1:
5426 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_explicit_route, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5427 proto_item_set_text(ti, "EXPLICIT ROUTE: ");
5429 dissect_rsvp_ro_subobjects(ti, pinfo, rsvp_object_tree, tvb,
5430 offset + 4, obj_length, rsvp_class);
5431 break;
5433 default:
5434 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_explicit_route, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5435 proto_tree_add_item(rsvp_object_tree, hf_rsvp_explicit_route_data, tvb, offset+4, obj_length - 4, ENC_NA);
5436 break;
5440 /*------------------------------------------------------------------------------
5441 * RECORD ROUTE OBJECT
5442 *------------------------------------------------------------------------------*/
5443 static void
5444 dissect_rsvp_record_route(proto_item *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
5445 tvbuff_t *tvb,
5446 int offset, int obj_length,
5447 int rsvp_class, int type)
5449 proto_item *hidden_item;
5451 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5452 proto_item_set_hidden(hidden_item);
5454 proto_item_set_text(ti, "RECORD ROUTE: ");
5455 switch(type) {
5456 case 1:
5457 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_record_route, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5459 dissect_rsvp_ro_subobjects(ti, pinfo, rsvp_object_tree, tvb,
5460 offset + 4, obj_length, rsvp_class);
5461 break;
5463 default:
5464 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_record_route, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5465 proto_tree_add_item(rsvp_object_tree, hf_rsvp_record_route_data, tvb, offset+4, obj_length - 4, ENC_NA);
5466 break;
5470 /*------------------------------------------------------------------------------
5471 * EXCLUDE ROUTE OBJECT
5472 *------------------------------------------------------------------------------*/
5473 static void
5474 dissect_rsvp_exclude_route(proto_item *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
5475 tvbuff_t *tvb, int offset, int obj_length,
5476 int rsvp_class, int ctype)
5478 proto_item *hidden_item;
5480 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5481 proto_item_set_hidden(hidden_item);
5483 proto_item_set_text(ti, "EXCLUDE ROUTE: ");
5484 switch (ctype) {
5485 case 1:
5486 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_exclude_route, tvb, offset + 3, 1, ENC_BIG_ENDIAN);
5487 dissect_rsvp_ro_subobjects(ti, pinfo, rsvp_object_tree, tvb,
5488 offset + 4, obj_length, rsvp_class);
5489 break;
5491 default:
5492 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_exclude_route, tvb, offset + 3, 1, ENC_BIG_ENDIAN);
5493 proto_tree_add_item(rsvp_object_tree, hf_rsvp_exclude_route_data, tvb, offset + 4, obj_length - 4, ENC_NA);
5494 break;
5498 /*------------------------------------------------------------------------------
5499 * MESSAGE ID
5500 *------------------------------------------------------------------------------*/
5501 static void
5502 dissect_rsvp_message_id(proto_tree *ti, proto_tree *rsvp_object_tree,
5503 tvbuff_t *tvb,
5504 int offset, int obj_length,
5505 int rsvp_class _U_, int type)
5507 int offset2 = offset + 4;
5508 proto_item *hidden_item;
5510 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5511 proto_item_set_hidden(hidden_item);
5513 switch(type) {
5514 case 1:
5515 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_message_id, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5516 proto_tree_add_item(rsvp_object_tree, hf_rsvp_message_id_flags, tvb, offset+4, 1, ENC_BIG_ENDIAN);
5517 proto_tree_add_item(rsvp_object_tree, hf_rsvp_message_id_epoch, tvb, offset+5, 3, ENC_BIG_ENDIAN);
5518 proto_tree_add_item(rsvp_object_tree, hf_rsvp_message_id_message_id, tvb, offset+8, 4, ENC_BIG_ENDIAN);
5519 proto_item_set_text(ti, "MESSAGE-ID: %d %s",
5520 tvb_get_ntohl(tvb, offset+8),
5521 tvb_get_uint8(tvb, offset+4) & 1 ? "(Ack Desired)" : "");
5522 break;
5524 default:
5525 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_message_id, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5526 proto_tree_add_item(rsvp_object_tree, hf_rsvp_message_id_data, tvb, offset2, obj_length - 4, ENC_NA);
5527 break;
5531 /*------------------------------------------------------------------------------
5532 * MESSAGE ID ACK
5533 *------------------------------------------------------------------------------*/
5534 static void
5535 dissect_rsvp_message_id_ack(proto_tree *ti, proto_tree *rsvp_object_tree,
5536 tvbuff_t *tvb,
5537 int offset, int obj_length,
5538 int rsvp_class _U_, int type)
5540 int offset2 = offset + 4;
5542 switch(type) {
5543 case 1:
5544 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_message_id_ack, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5545 proto_tree_add_item(rsvp_object_tree, hf_rsvp_message_id_ack_flags, tvb, offset+4, 1, ENC_BIG_ENDIAN);
5546 proto_tree_add_item(rsvp_object_tree, hf_rsvp_message_id_ack_epoch, tvb, offset+5, 3, ENC_BIG_ENDIAN);
5547 proto_tree_add_item(rsvp_object_tree, hf_rsvp_message_id_ack_message_id, tvb, offset+8, 4, ENC_BIG_ENDIAN);
5548 proto_item_set_text(ti, "MESSAGE-ID ACK: %d", tvb_get_ntohl(tvb, offset+8));
5549 break;
5551 case 2:
5552 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_message_id_ack, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5553 proto_tree_add_item(rsvp_object_tree, hf_rsvp_message_id_ack_flags, tvb, offset+4, 1, ENC_BIG_ENDIAN);
5554 proto_tree_add_item(rsvp_object_tree, hf_rsvp_message_id_ack_epoch, tvb, offset+5, 3, ENC_BIG_ENDIAN);
5555 proto_tree_add_item(rsvp_object_tree, hf_rsvp_message_id_ack_message_id, tvb, offset+8, 4, ENC_BIG_ENDIAN);
5556 proto_item_set_text(ti, "MESSAGE-ID NACK: %d", tvb_get_ntohl(tvb, offset+8));
5557 break;
5559 default:
5560 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_message_id_ack, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5561 proto_tree_add_item(rsvp_object_tree, hf_rsvp_message_id_ack_data, tvb, offset2, obj_length - 4, ENC_NA);
5562 break;
5566 /*------------------------------------------------------------------------------
5567 * MESSAGE ID LIST
5568 *------------------------------------------------------------------------------*/
5569 static void
5570 dissect_rsvp_message_id_list(proto_tree *ti, proto_tree *rsvp_object_tree,
5571 tvbuff_t *tvb,
5572 int offset, int obj_length,
5573 int rsvp_class _U_, int type)
5575 int offset2 = offset + 4;
5576 int mylen;
5577 proto_item *hidden_item;
5579 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5580 proto_item_set_hidden(hidden_item);
5582 switch(type) {
5583 case 1:
5584 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_message_id_list, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5585 proto_tree_add_item(rsvp_object_tree, hf_rsvp_message_id_list_flags, tvb, offset+4, 1, ENC_BIG_ENDIAN);
5586 proto_tree_add_item(rsvp_object_tree, hf_rsvp_message_id_list_epoch, tvb, offset+5, 3, ENC_BIG_ENDIAN);
5587 for (mylen = 8; mylen < obj_length; mylen += 4)
5588 proto_tree_add_item(rsvp_object_tree, hf_rsvp_message_id_list_message_id, tvb, offset+mylen, 4, ENC_BIG_ENDIAN);
5589 proto_item_set_text(ti, "MESSAGE-ID LIST: %d IDs",
5590 (obj_length - 8)/4);
5591 break;
5593 default:
5594 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_message_id_list, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5595 proto_tree_add_item(rsvp_object_tree, hf_rsvp_message_id_list_data, tvb, offset2, obj_length - 4, ENC_NA);
5596 break;
5600 /*------------------------------------------------------------------------------
5601 * HELLO
5602 *------------------------------------------------------------------------------*/
5603 static void
5604 dissect_rsvp_hello(proto_tree *ti, proto_tree *rsvp_object_tree,
5605 tvbuff_t *tvb,
5606 int offset, int obj_length _U_,
5607 int rsvp_class _U_, int type)
5609 proto_item *hidden_item;
5611 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5612 proto_item_set_hidden(hidden_item);
5614 switch(type) {
5615 case 1:
5616 case 2:
5617 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_hello, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5618 proto_tree_add_item(rsvp_object_tree, hf_rsvp_hello_source_instance, tvb, offset+4, 4, ENC_BIG_ENDIAN);
5619 proto_tree_add_item(rsvp_object_tree, hf_rsvp_hello_destination_instance, tvb, offset+8, 4, ENC_BIG_ENDIAN);
5620 proto_item_append_text(ti, ": %s. Src Instance: 0x%0x. Dest Instance: 0x%0x. ",
5621 type==1 ? "REQUEST" : "ACK",
5622 tvb_get_ntohl(tvb, offset+4),
5623 tvb_get_ntohl(tvb, offset+8));
5624 break;
5625 default:
5626 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_hello, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5627 break;
5631 /*------------------------------------------------------------------------------
5632 * DCLASS
5633 *------------------------------------------------------------------------------*/
5634 static void
5635 dissect_rsvp_dclass(proto_tree *ti, proto_tree *rsvp_object_tree,
5636 tvbuff_t *tvb,
5637 int offset, int obj_length,
5638 int rsvp_class _U_, int type)
5640 int offset2 = offset + 4;
5641 int mylen;
5642 proto_item *hidden_item;
5644 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5645 proto_item_set_hidden(hidden_item);
5647 proto_item_set_text(ti, "DCLASS: ");
5648 switch(type) {
5649 case 1:
5650 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_dclass, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5651 for (mylen = 4; mylen < obj_length; mylen += 4) {
5652 proto_tree_add_item(rsvp_object_tree, hf_rsvp_dclass_dscp, tvb, offset+mylen+3, 1, ENC_BIG_ENDIAN);
5653 proto_item_append_text(ti, "%d%s",
5654 tvb_get_uint8(tvb, offset+mylen+3)>>2,
5655 mylen==obj_length-4 ? "":
5656 mylen<16 ? ", ":
5657 mylen==16 ? ", ..." : "");
5659 break;
5661 default:
5662 mylen = obj_length - 4;
5663 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_dclass, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5664 proto_tree_add_item(rsvp_object_tree, hf_rsvp_dclass_data, tvb, offset2, mylen, ENC_NA);
5665 break;
5669 /*------------------------------------------------------------------------------
5670 * ADMINISTRATIVE STATUS
5671 *------------------------------------------------------------------------------*/
5672 static void
5673 dissect_rsvp_admin_status(proto_tree *ti, proto_tree *rsvp_object_tree,
5674 tvbuff_t *tvb,
5675 int offset, int obj_length,
5676 int rsvp_class _U_, int type)
5678 int offset2 = offset + 4;
5679 uint32_t status;
5680 static int * const status_flags[] = {
5681 &hf_rsvp_filter[RSVPF_ADMIN_STATUS_REFLECT],
5682 &hf_rsvp_filter[RSVPF_ADMIN_STATUS_HANDOVER],
5683 &hf_rsvp_filter[RSVPF_ADMIN_STATUS_LOCKOUT],
5684 &hf_rsvp_filter[RSVPF_ADMIN_STATUS_INHIBIT],
5685 &hf_rsvp_filter[RSVPF_ADMIN_STATUS_CALL_MGMT],
5686 &hf_rsvp_filter[RSVPF_ADMIN_STATUS_TESTING],
5687 &hf_rsvp_filter[RSVPF_ADMIN_STATUS_DOWN],
5688 &hf_rsvp_filter[RSVPF_ADMIN_STATUS_DELETE],
5689 NULL
5691 proto_item *hidden_item;
5693 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5694 proto_item_set_hidden(hidden_item);
5696 proto_item_set_text(ti, "ADMIN STATUS: ");
5697 switch(type) {
5698 case 1:
5699 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_admin_status, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5700 status = tvb_get_ntohl(tvb, offset2);
5702 proto_tree_add_bitmask(rsvp_object_tree, tvb, offset2, hf_rsvp_admin_status_bits, TREE(TT_ADMIN_STATUS_FLAGS), status_flags, ENC_BIG_ENDIAN);
5704 proto_item_set_text(ti, "ADMIN-STATUS: %s%s%s%s%s%s%s%s",
5705 (status & (1U<<31)) ? "Reflect " : "",
5706 (status & (1U<<6)) ? "Handover " : "",
5707 (status & (1U<<5)) ? "Lockout " : "",
5708 (status & (1U<<4)) ? "Inhibit " : "",
5709 (status & (1U<<3)) ? "Call " : "",
5710 (status & (1U<<2)) ? "Testing " : "",
5711 (status & (1U<<1)) ? "Admin-Down " : "",
5712 (status & (1U<<0)) ? "Deleting " : "");
5713 break;
5715 default:
5716 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_admin_status, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5717 proto_tree_add_item(rsvp_object_tree, hf_rsvp_admin_status_data, tvb, offset2, obj_length - 4, ENC_NA);
5718 break;
5722 /*------------------------------------------------------------------------------
5723 * LSP ATTRIBUTES
5724 *------------------------------------------------------------------------------*/
5725 static void
5726 dissect_rsvp_lsp_attributes(proto_tree *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
5727 tvbuff_t *tvb, int offset, int obj_length,
5728 int rsvp_class, int type)
5730 int tlv_off;
5731 uint32_t attributes;
5732 uint16_t tlv_type, tlv_len;
5733 proto_tree *ti2, *rsvp_lsp_attr_subtree;
5734 static int * const rsvp_lsp_attr_flags[] = {
5735 &hf_rsvp_lsp_attr_e2e,
5736 &hf_rsvp_lsp_attr_boundary,
5737 &hf_rsvp_lsp_attr_segment,
5738 &hf_rsvp_lsp_attr_integrity,
5739 &hf_rsvp_lsp_attr_contiguous,
5740 &hf_rsvp_lsp_attr_stitching,
5741 &hf_rsvp_lsp_attr_preplanned,
5742 &hf_rsvp_lsp_attr_nophp,
5743 &hf_rsvp_lsp_attr_oobmap,
5744 &hf_rsvp_lsp_attr_entropy,
5745 &hf_rsvp_lsp_attr_oammep,
5746 &hf_rsvp_lsp_attr_oammip,
5747 &hf_rsvp_lsp_attr_srlgcollect,
5748 &hf_rsvp_lsp_attr_loopback,
5749 &hf_rsvp_lsp_attr_p2mp,
5750 &hf_rsvp_lsp_attr_rtm,
5751 &hf_rsvp_lsp_attr_telinklabel,
5752 &hf_rsvp_lsp_attr_lsi,
5753 &hf_rsvp_lsp_attr_lsids2e,
5754 NULL
5756 proto_item *hidden_item;
5758 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5759 proto_item_set_hidden(hidden_item);
5761 if (rsvp_class == RSVP_CLASS_LSP_REQUIRED_ATTRIBUTES)
5762 proto_item_set_text(ti, "LSP REQUIRED ATTRIBUTES: ");
5763 else
5764 proto_item_set_text(ti, "LSP ATTRIBUTES: ");
5766 switch(type) {
5767 case 1:
5768 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_lsp_attributes, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5769 for (tlv_off = 4; tlv_off < obj_length-4; ) {
5770 tlv_type = tvb_get_ntohs(tvb, offset+tlv_off);
5771 tlv_len = tvb_get_ntohs(tvb, offset+tlv_off+2);
5773 if ((tlv_len == 0) || (tlv_off+tlv_len > obj_length)) {
5774 proto_tree_add_expert(rsvp_object_tree, pinfo, &ei_rsvp_invalid_length, tvb, offset+tlv_off+2, 2);
5775 return;
5777 switch(tlv_type) {
5778 case 1:
5779 attributes = tvb_get_ntohl(tvb, offset+tlv_off+4);
5780 ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_lsp_attributes_tlv, tvb, offset+tlv_off, 4, ENC_BIG_ENDIAN);
5781 rsvp_lsp_attr_subtree = proto_item_add_subtree(ti2, TREE(TT_LSP_ATTRIBUTES_FLAGS));
5782 proto_tree_add_bitmask(rsvp_lsp_attr_subtree, tvb, offset+tlv_off+4, hf_rsvp_lsp_attr, ett_treelist[TT_RSVP_LSP_ATTR], rsvp_lsp_attr_flags, ENC_NA);
5783 proto_item_append_text(ti, "LSP Attribute:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
5784 (attributes & 0x80000000) ? " End-to-end re-routing" : "",
5785 (attributes & 0x40000000) ? " Boundary re-routing" : "",
5786 (attributes & 0x20000000) ? " Segment-based re-routing" : "",
5787 (attributes & 0x10000000) ? " LSP Integrity Required" : "",
5788 (attributes & 0x08000000) ? " Contiguous LSP" : "",
5789 (attributes & 0x04000000) ? " LSP stitching desired" : "",
5790 (attributes & 0x02000000) ? " Pre-Planned LSP Flag" : "",
5791 (attributes & 0x01000000) ? " Non-PHP behavior flag" : "",
5792 (attributes & 0x00800000) ? " OOB mapping flag" : "",
5793 (attributes & 0x00400000) ? " Entropy Label Capability" : "",
5794 (attributes & 0x00200000) ? " OAM MEP entities desired" : "",
5795 (attributes & 0x00100000) ? " OAM MIP entities desired" : "",
5796 (attributes & 0x00080000) ? " SRLG Collection Flag" : "",
5797 (attributes & 0x00040000) ? " Loopback" : "",
5798 (attributes & 0x00020000) ? " P2MP-TE Tree Re-evaluation Request" : "",
5799 (attributes & 0x00010000) ? " RTM_SET" : "",
5800 (attributes & 0x00008000) ? " TE Link Label" : "",
5801 (attributes & 0x00004000) ? " LSI-D" : "",
5802 (attributes & 0x00002000) ? " LSI-D-S2E" : "");
5804 break;
5806 default:
5807 proto_tree_add_uint_format(rsvp_object_tree, hf_rsvp_type, tvb, offset+tlv_off, tlv_len,
5808 tlv_type, "Unknown TLV: %d", tlv_type);
5809 break;
5811 tlv_off += tlv_len;
5813 break;
5815 default:
5816 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_lsp_attributes, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5817 proto_tree_add_item(rsvp_object_tree, hf_rsvp_lsp_attributes_tlv_data, tvb, offset+4, obj_length - 4, ENC_NA);
5818 break;
5822 /*------------------------------------------------------------------------------
5823 * ASSOCIATION
5824 *------------------------------------------------------------------------------*/
5825 static const value_string association_type_vals[] = {
5826 { 0, "Reserved"},
5827 { 1, "Recovery"},
5828 { 2, "Resource Sharing"},
5829 { 3, "Segment Recovery"},
5830 { 4, "Inter-domain Recovery"},
5831 { 0, NULL}
5834 static void
5835 dissect_rsvp_association(proto_tree *ti, proto_tree *rsvp_object_tree,
5836 tvbuff_t *tvb,
5837 int offset, int obj_length,
5838 int rsvp_class _U_, int type)
5840 uint16_t association_type;
5841 uint16_t association_id;
5842 proto_item *hidden_item;
5844 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5845 proto_item_set_hidden(hidden_item);
5847 proto_item_set_text(ti, "ASSOCIATION ");
5848 association_type = tvb_get_ntohs (tvb, offset + 4);
5849 association_id = tvb_get_ntohs (tvb, offset + 6);
5850 switch(type) {
5851 case 1:
5852 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_association, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5853 proto_item_append_text(ti, "(IPv4): ");
5854 proto_tree_add_item(rsvp_object_tree, hf_rsvp_association_type, tvb, offset+4, 2, ENC_BIG_ENDIAN);
5855 proto_item_append_text(ti, "%s. ",
5856 val_to_str(association_type, association_type_vals, "Unknown (%u)"));
5857 proto_tree_add_item(rsvp_object_tree, hf_rsvp_association_id, tvb, offset+6, 2, ENC_BIG_ENDIAN);
5858 proto_item_append_text(ti, "ID: %u. ", association_id);
5859 proto_tree_add_item(rsvp_object_tree, hf_rsvp_association_source_ipv4, tvb, offset+8, 4, ENC_BIG_ENDIAN);
5860 proto_item_append_text(ti, "Src: %s", tvb_ip_to_str(wmem_packet_scope(), tvb, offset+8));
5861 break;
5863 case 2:
5864 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_association, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5865 proto_item_append_text(ti, "(IPv6): ");
5866 proto_tree_add_item(rsvp_object_tree, hf_rsvp_association_type, tvb, offset+4, 2, ENC_BIG_ENDIAN);
5867 proto_item_append_text(ti, "%s. ",
5868 val_to_str(association_type, association_type_vals, "Unknown (%u)"));
5869 proto_tree_add_item(rsvp_object_tree, hf_rsvp_association_id, tvb, offset+6, 2, ENC_BIG_ENDIAN);
5870 proto_item_append_text(ti, "ID: %u. ", association_id);
5871 proto_tree_add_item(rsvp_object_tree, hf_rsvp_association_source_ipv6, tvb, offset+8, 16, ENC_NA);
5872 proto_item_append_text(ti, "Src: %s", tvb_ip6_to_str(wmem_packet_scope(), tvb, offset+8));
5873 break;
5875 case 4: /* oif2008.389 */
5876 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_association, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5877 proto_item_append_text(ti, "(Routing Area): ");
5878 proto_tree_add_item(rsvp_object_tree, hf_rsvp_association_type, tvb, offset+4, 2, ENC_BIG_ENDIAN);
5879 proto_item_append_text(ti, "%s. ",
5880 val_to_str(association_type, association_type_vals, "Unknown (%u)"));
5881 proto_tree_add_item(rsvp_object_tree, hf_rsvp_association_id, tvb, offset+6, 2, ENC_BIG_ENDIAN);
5882 proto_item_append_text(ti, "Association ID: %u, ", association_id);
5883 proto_tree_add_item(rsvp_object_tree, hf_rsvp_association_routing_area_id, tvb, offset+8, 4, ENC_BIG_ENDIAN);
5884 proto_item_append_text(ti, "Routing Area ID: %u, ", tvb_get_ntohl (tvb, offset+8));
5885 proto_tree_add_item(rsvp_object_tree, hf_rsvp_association_node_id, tvb, offset+12, 4, ENC_BIG_ENDIAN);
5886 proto_item_append_text(ti, "Node ID: %s", tvb_ip_to_str(wmem_packet_scope(), tvb, offset+12));
5887 proto_tree_add_item(rsvp_object_tree, hf_rsvp_association_padding, tvb, offset+8, 16, ENC_NA);
5888 break;
5890 default:
5891 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_association, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5892 proto_tree_add_item(rsvp_object_tree, hf_rsvp_association_data, tvb, offset+4, obj_length - 4, ENC_NA);
5893 break;
5896 /*------------------------------------------------------------------------------
5897 * TLVs for LSP TUNNEL IF ID object
5898 * draft-ietf-ccamp-lsp-hierarchy-bis-02
5899 *------------------------------------------------------------------------------*/
5900 static void
5901 dissect_rsvp_lsp_tunnel_if_id_tlv(proto_tree *rsvp_object_tree, packet_info* pinfo,
5902 tvbuff_t *tvb, int offset, int tlv_length,
5903 int subtree_type)
5905 int tlv_off;
5906 uint16_t tlv_type;
5907 int tlv_len;
5908 proto_tree *ti, *rsvp_lsp_tunnel_if_id_subtree;
5910 for (tlv_off = 0; tlv_off < tlv_length; ) {
5911 tlv_type = tvb_get_ntohs(tvb, offset+tlv_off);
5912 tlv_len = tvb_get_ntohs(tvb, offset+tlv_off+2);
5914 if ((tlv_len == 0) || ((tlv_off+tlv_len) > tlv_length)) {
5915 proto_tree_add_expert(rsvp_object_tree, pinfo, &ei_rsvp_invalid_length, tvb, offset+tlv_off+2, 2);
5916 return;
5918 switch(tlv_type) {
5919 case 1:
5920 rsvp_lsp_tunnel_if_id_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
5921 offset+tlv_off, tlv_len, subtree_type, NULL,
5922 "Unnumbered component link identifier: %u",
5923 tvb_get_ntohl(tvb, offset+tlv_off+4));
5924 proto_tree_add_uint_format_value(rsvp_lsp_tunnel_if_id_subtree, hf_rsvp_type, tvb, offset+tlv_off, 2,
5925 tlv_type, "1 (Unnumbered component link identifier)");
5926 proto_tree_add_item(rsvp_lsp_tunnel_if_id_subtree, hf_rsvp_lsp_tunnel_if_id_length, tvb, offset+tlv_off+2, 2, ENC_BIG_ENDIAN);
5927 proto_tree_add_item(rsvp_lsp_tunnel_if_id_subtree, hf_rsvp_lsp_tunnel_if_id_component_link_identifier, tvb, offset+tlv_off+4, 4, ENC_BIG_ENDIAN);
5928 break;
5930 case 2:
5931 rsvp_lsp_tunnel_if_id_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
5932 offset+tlv_off, tlv_len, subtree_type, NULL,
5933 "IPv4 component link identifier: %s",
5934 tvb_ip_to_str(pinfo->pool, tvb, offset+tlv_off+4));
5935 proto_tree_add_uint_format_value(rsvp_lsp_tunnel_if_id_subtree, hf_rsvp_type, tvb, offset+tlv_off, 2,
5936 tlv_type, "2 (IPv4 component link identifier)");
5937 proto_tree_add_item(rsvp_lsp_tunnel_if_id_subtree, hf_rsvp_lsp_tunnel_if_id_length, tvb, offset+tlv_off+2, 2, ENC_BIG_ENDIAN);
5938 proto_tree_add_item(rsvp_lsp_tunnel_if_id_subtree, hf_rsvp_lsp_tunnel_if_id_component_link_identifier_ipv4, tvb, offset+tlv_off+4, 4, ENC_BIG_ENDIAN);
5939 break;
5941 case 32769: /* oif-p0040.002.09 demo spec */
5942 rsvp_lsp_tunnel_if_id_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
5943 offset+tlv_off, tlv_len, subtree_type, &ti,
5944 "Targeted client layer: ");
5945 proto_tree_add_uint_format_value(rsvp_lsp_tunnel_if_id_subtree, hf_rsvp_type, tvb, offset+tlv_off, 2,
5946 tlv_type, "32769 (Targeted client layer)");
5947 proto_tree_add_item(rsvp_lsp_tunnel_if_id_subtree, hf_rsvp_lsp_tunnel_if_id_length, tvb, offset+tlv_off+2, 2, ENC_BIG_ENDIAN);
5948 proto_tree_add_item(rsvp_lsp_tunnel_if_id_subtree, hf_rsvp_lsp_tunnel_if_id_lsp_encoding_type, tvb, offset+tlv_off+4, 1, ENC_BIG_ENDIAN);
5949 proto_tree_add_item(rsvp_lsp_tunnel_if_id_subtree, hf_rsvp_lsp_tunnel_if_id_switching_type, tvb, offset+tlv_off+5, 1, ENC_BIG_ENDIAN);
5950 proto_tree_add_item(rsvp_lsp_tunnel_if_id_subtree, hf_rsvp_lsp_tunnel_if_id_signal_type, tvb, offset+tlv_off+6, 1, ENC_BIG_ENDIAN);
5951 proto_tree_add_item(rsvp_lsp_tunnel_if_id_subtree, hf_rsvp_lsp_tunnel_if_id_connection_id, tvb, offset+tlv_off+8, 8, ENC_BIG_ENDIAN);
5952 proto_tree_add_item(rsvp_lsp_tunnel_if_id_subtree, hf_rsvp_lsp_tunnel_if_id_sc_pc_id, tvb, offset+tlv_off+16, 4, ENC_BIG_ENDIAN);
5953 proto_tree_add_item(rsvp_lsp_tunnel_if_id_subtree, hf_rsvp_lsp_tunnel_if_id_sc_pc_scn_address, tvb, offset+tlv_off+20, 4, ENC_BIG_ENDIAN);
5954 proto_item_append_text(ti, "LSP Encoding=%s, Switching Type=%s, Signal Type=%s",
5955 rval_to_str(tvb_get_uint8(tvb,offset+tlv_off+4),
5956 gmpls_lsp_enc_rvals, "Unknown (%d)"),
5957 rval_to_str(tvb_get_uint8(tvb,offset+tlv_off+5),
5958 gmpls_switching_type_rvals, "Unknown (%d)"),
5959 val_to_str_ext(tvb_get_uint8(tvb,offset+tlv_off+6),
5960 &gmpls_sonet_signal_type_str_ext, "Unknown (%d)"));
5961 break;
5963 default:
5964 proto_tree_add_uint_format(rsvp_object_tree, hf_rsvp_type, tvb, offset+tlv_off, 2,
5965 tlv_type, "Unknown TLV: %u", tlv_type);
5966 break;
5968 tlv_off += tlv_len;
5972 /*------------------------------------------------------------------------------
5973 * LSP TUNNEL INTERFACE ID
5974 *------------------------------------------------------------------------------*/
5975 static const value_string lsp_tunnel_if_id_action_str[] = {
5976 { 0, "LSP is FA (MPLS-TE topology advertisement only)"},
5977 { 1, "LSP is RA (IP network advertisement only)"},
5978 { 2, "LSP is RA (both IP and MPLS-TE topology advertisement)"},
5979 { 3, "LSP is to be used as a virtual local link"},
5980 { 0, NULL}
5983 static void
5984 dissect_rsvp_lsp_tunnel_if_id(proto_tree *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
5985 tvbuff_t *tvb,
5986 int offset, int obj_length,
5987 int rsvp_class _U_, int type)
5989 proto_item *hidden_item;
5991 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5992 proto_item_set_hidden(hidden_item);
5994 proto_item_set_text(ti, "LSP INTERFACE-ID: ");
5995 switch(type) {
5996 case 1:
5997 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_tunnel_if_id, tvb, offset+3, 1, ENC_BIG_ENDIAN);
5998 proto_tree_add_item(rsvp_object_tree, hf_rsvp_lsp_tunnel_if_id_router_id, tvb, offset+4, 4, ENC_BIG_ENDIAN);
5999 proto_tree_add_item(rsvp_object_tree, hf_rsvp_lsp_tunnel_if_id_interface_id, tvb, offset+8, 4, ENC_BIG_ENDIAN);
6000 proto_item_set_text(ti, "LSP INTERFACE-ID: Unnumbered, Router-ID %s, Interface-ID %d",
6001 tvb_ip_to_str(pinfo->pool, tvb, offset+4),
6002 tvb_get_ntohl(tvb, offset+8));
6003 break;
6005 case 2:
6006 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_tunnel_if_id, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6007 proto_tree_add_item(rsvp_object_tree, hf_rsvp_lsp_tunnel_if_id_ipv4_interface_address, tvb, offset+4, 4, ENC_BIG_ENDIAN);
6008 proto_tree_add_item(rsvp_object_tree, hf_rsvp_lsp_tunnel_if_id_target_igp_instance, tvb, offset+8, 4, ENC_BIG_ENDIAN);
6009 proto_item_set_text(ti, "LSP INTERFACE-ID: IPv4, interface address %s,"
6010 "IGP instance %s",
6011 tvb_ip_to_str(pinfo->pool, tvb, offset+4),
6012 tvb_ip_to_str(pinfo->pool, tvb, offset+8));
6013 proto_tree_add_item(rsvp_object_tree, hf_rsvp_lsp_tunnel_if_id_action, tvb, offset+12, 1, ENC_BIG_ENDIAN);
6014 dissect_rsvp_lsp_tunnel_if_id_tlv(rsvp_object_tree, pinfo, tvb, offset+16, obj_length-16,
6015 TREE(TT_LSP_TUNNEL_IF_ID_SUBTREE));
6016 break;
6018 case 3:
6019 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_tunnel_if_id, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6020 proto_tree_add_item(rsvp_object_tree, hf_rsvp_lsp_tunnel_if_id_ipv6_interface_address, tvb, offset+4, 16, ENC_NA);
6021 proto_tree_add_item(rsvp_object_tree, hf_rsvp_lsp_tunnel_if_id_target_igp_instance, tvb, offset+20, 4, ENC_BIG_ENDIAN);
6022 proto_item_set_text(ti, "LSP INTERFACE-ID: IPv6, interface address %s,"
6023 "IGP instance %s",
6024 tvb_ip6_to_str(pinfo->pool, tvb, offset+4),
6025 tvb_ip_to_str(pinfo->pool, tvb, offset+20));
6026 proto_tree_add_item(rsvp_object_tree, hf_rsvp_lsp_tunnel_if_id_action, tvb, offset+24, 1, ENC_BIG_ENDIAN);
6027 dissect_rsvp_lsp_tunnel_if_id_tlv(rsvp_object_tree, pinfo, tvb, offset+28, obj_length-28,
6028 TREE(TT_LSP_TUNNEL_IF_ID_SUBTREE));
6029 break;
6031 case 4:
6032 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_tunnel_if_id, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6033 proto_tree_add_item(rsvp_object_tree, hf_rsvp_lsp_tunnel_if_id_router_id, tvb, offset+4, 4, ENC_BIG_ENDIAN);
6034 proto_tree_add_item(rsvp_object_tree, hf_rsvp_lsp_tunnel_if_id_interface_id, tvb, offset+8, 4, ENC_BIG_ENDIAN);
6035 proto_tree_add_item(rsvp_object_tree, hf_rsvp_lsp_tunnel_if_id_target_igp_instance, tvb, offset+12, 4, ENC_BIG_ENDIAN);
6036 proto_item_set_text(ti, "LSP INTERFACE-ID: Unnumbered with target, Router-ID %s,"
6037 " Interface-ID %d, IGP instance %s",
6038 tvb_ip_to_str(pinfo->pool, tvb, offset+4),
6039 tvb_get_ntohl(tvb, offset+8),
6040 tvb_ip_to_str(pinfo->pool, tvb, offset+12));
6041 proto_tree_add_item(rsvp_object_tree, hf_rsvp_lsp_tunnel_if_id_action, tvb, offset+16, 1, ENC_BIG_ENDIAN);
6042 dissect_rsvp_lsp_tunnel_if_id_tlv(rsvp_object_tree, pinfo, tvb, offset+20, obj_length-20,
6043 TREE(TT_LSP_TUNNEL_IF_ID_SUBTREE));
6044 break;
6046 default:
6047 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_tunnel_if_id, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6048 proto_tree_add_item(rsvp_object_tree, hf_rsvp_lsp_tunnel_if_id_data, tvb, offset+4, obj_length-4, ENC_NA);
6049 break;
6053 /*------------------------------------------------------------------------------
6054 * NOTIFY REQUEST
6055 *------------------------------------------------------------------------------*/
6056 static void
6057 dissect_rsvp_notify_request(proto_item *ti, proto_tree *rsvp_object_tree,
6058 tvbuff_t *tvb,
6059 int offset, int obj_length,
6060 int rsvp_class _U_, int type)
6062 int offset2 = offset + 4;
6063 proto_item *hidden_item;
6065 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6066 proto_item_set_hidden(hidden_item);
6068 switch(type) {
6069 case 1: {
6070 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_notify_request, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6071 proto_tree_add_item(rsvp_object_tree, hf_rsvp_notify_request_notify_node_address_ipv4, tvb, offset2, 4, ENC_BIG_ENDIAN);
6072 proto_item_append_text(ti, ": Notify node: %s",
6073 tvb_ip_to_str(wmem_packet_scope(), tvb, offset2));
6074 break;
6077 case 2: {
6078 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_notify_request, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6079 proto_tree_add_item(rsvp_object_tree, hf_rsvp_notify_request_notify_node_address_ipv6, tvb, offset2, 16, ENC_NA);
6080 proto_item_append_text(ti, ": Notify node: %s",
6081 tvb_ip6_to_str(wmem_packet_scope(), tvb, offset2));
6082 break;
6085 default:
6086 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_notify_request, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6087 proto_tree_add_item(rsvp_object_tree, hf_rsvp_notify_request_data, tvb, offset2, obj_length - 4, ENC_NA);
6088 break;
6092 /*------------------------------------------------------------------------------
6093 * GENERALIZED UNI
6094 *------------------------------------------------------------------------------*/
6095 static void
6096 dissect_rsvp_gen_uni(proto_tree *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
6097 tvbuff_t *tvb,
6098 int offset, int obj_length,
6099 int rsvp_class _U_, int type,
6100 rsvp_conversation_info *rsvph)
6102 int offset2 = offset + 4;
6103 int mylen, i, j, k, l;
6104 proto_item *ti2= NULL, *len_item;
6105 proto_tree *rsvp_gen_uni_subtree, *rsvp_session_subtree, *rsvp_template_subtree;
6106 int s_len, s_class, s_type, sobj_len, nsap_len;
6107 int offset3;
6108 proto_item *hidden_item;
6110 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6111 proto_item_set_hidden(hidden_item);
6113 proto_item_set_text(ti, "GENERALIZED UNI: ");
6115 mylen = obj_length - 4;
6116 switch(type) {
6117 case 1: {
6118 const char *c;
6119 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_generalized_uni, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6120 for (i=1, l = 0; l < mylen; i++) {
6121 sobj_len = tvb_get_ntohs(tvb, offset2+l);
6122 j = tvb_get_uint8(tvb, offset2+l+2);
6123 switch(j) {
6124 case 1:
6125 case 2: /* We do source and destination TNA together */
6126 c = (j==1) ? "Source" : "Destination";
6127 k = tvb_get_uint8(tvb, offset2+l+3);
6128 switch(k) {
6129 case 1:
6130 rsvp_gen_uni_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
6131 offset2+l, 8, TREE(TT_GEN_UNI_SUBOBJ), NULL,
6132 "%s IPv4 TNA: %s", c,
6133 tvb_ip_to_str(pinfo->pool, tvb, offset2+l+4));
6134 proto_tree_add_uint_format_value(rsvp_gen_uni_subtree, hf_rsvp_class, tvb, offset2+l+2, 1,
6135 j, "%d (%s)", j, c);
6136 proto_tree_add_uint_format_value(rsvp_gen_uni_subtree, hf_rsvp_type, tvb, offset2+l+3, 1,
6137 k, "1 (IPv4)");
6138 proto_tree_add_uint(rsvp_gen_uni_subtree, hf_rsvp_class_length, tvb, offset2+l, 2, sobj_len);
6139 if (j==1)
6140 proto_tree_add_item(rsvp_gen_uni_subtree, hf_rsvp_filter[RSVPF_GUNI_SRC_IPV4],
6141 tvb, offset2+l+4, 4, ENC_BIG_ENDIAN);
6142 else
6143 proto_tree_add_item(rsvp_gen_uni_subtree, hf_rsvp_filter[RSVPF_GUNI_DST_IPV4],
6144 tvb, offset2+l+4, 4, ENC_BIG_ENDIAN);
6145 if (i < 4) {
6146 proto_item_append_text(ti, "%s IPv4 TNA: %s", c,
6147 tvb_ip_to_str(pinfo->pool, tvb, offset2+l+4));
6149 break;
6151 case 2:
6152 rsvp_gen_uni_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
6153 offset2+l, 20, TREE(TT_GEN_UNI_SUBOBJ), NULL,
6154 "%s IPv6 TNA:", c);
6155 proto_tree_add_uint_format_value(rsvp_gen_uni_subtree, hf_rsvp_class, tvb, offset2+l+2, 1,
6156 j, "%d (%s)", j, c);
6157 proto_tree_add_uint_format_value(rsvp_gen_uni_subtree, hf_rsvp_type, tvb, offset2+l+3, 1,
6158 k, "2 (IPv6)");
6159 proto_tree_add_uint(rsvp_gen_uni_subtree, hf_rsvp_class_length, tvb, offset2+l, 2, sobj_len);
6160 if (j==1)
6161 proto_tree_add_item(rsvp_gen_uni_subtree, hf_rsvp_filter[RSVPF_GUNI_SRC_IPV6],
6162 tvb, offset2+l+4, 16, ENC_NA);
6163 else
6164 proto_tree_add_item(rsvp_gen_uni_subtree, hf_rsvp_filter[RSVPF_GUNI_DST_IPV6],
6165 tvb, offset2+l+4, 16, ENC_NA);
6166 if (i < 4) {
6167 proto_item_append_text(ti, "%s IPv6 TNA: %s", c,
6168 tvb_ip6_to_str(pinfo->pool, tvb, offset2+l+4));
6170 break;
6172 case 3:
6173 rsvp_gen_uni_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
6174 offset2+l, tvb_get_ntohs(tvb, offset2+l),
6175 TREE(TT_GEN_UNI_SUBOBJ), NULL, "%s NSAP TNA: ", c);
6176 nsap_len = tvb_get_uint8(tvb, offset2+l+4);
6177 proto_tree_add_uint_format_value(rsvp_gen_uni_subtree, hf_rsvp_class, tvb, offset2+l+2, 1,
6178 j, "%d (%s)", j, c);
6179 proto_tree_add_uint_format_value(rsvp_gen_uni_subtree, hf_rsvp_type, tvb, offset2+l+3, 1,
6180 k, "3 (NSAP)");
6181 proto_tree_add_uint(rsvp_gen_uni_subtree, hf_rsvp_class_length, tvb, offset2+l, 2, sobj_len);
6182 proto_tree_add_item(rsvp_gen_uni_subtree, hf_rsvp_nsap_length, tvb, offset2+l+4, 1, ENC_BIG_ENDIAN);
6183 proto_tree_add_string(rsvp_gen_uni_subtree, hf_rsvp_nsap_address, tvb, offset2+l+5, sobj_len-4,
6184 print_nsap_net(pinfo->pool, tvb, offset2+l+5, nsap_len));
6185 if (i < 4) {
6186 proto_item_append_text(ti, "%s NSAP TNA: %s", c,
6187 print_nsap_net(pinfo->pool, tvb, offset2+l+5, nsap_len));
6189 break;
6191 default:
6192 rsvp_gen_uni_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
6193 offset2+l, tvb_get_ntohs(tvb, offset2+l),
6194 TREE(TT_GEN_UNI_SUBOBJ), NULL, "%s UNKNOWN TNA", c);
6195 proto_tree_add_uint_format_value(rsvp_gen_uni_subtree, hf_rsvp_class, tvb, offset2+l+2, 1,
6196 j, "%d (%s)", j, c);
6197 proto_tree_add_uint_format_value(rsvp_gen_uni_subtree, hf_rsvp_type, tvb, offset2+l+3, 1,
6198 k, "%d (UNKNOWN)", k);
6199 proto_tree_add_uint(rsvp_gen_uni_subtree, hf_rsvp_class_length, tvb, offset2+l, 2, sobj_len);
6200 proto_tree_add_item(rsvp_gen_uni_subtree, hf_rsvp_gen_uni_data, tvb, offset2+l+4, sobj_len-4, ENC_NA);
6201 if (i < 4) {
6202 proto_item_append_text(ti, "%s UNKNOWN", c);
6204 break;
6206 break;
6208 case 3: /* Diversity subobject */
6209 k = tvb_get_uint8(tvb, offset2+l+3);
6210 switch(k) {
6211 default:
6212 case 1:
6213 rsvp_gen_uni_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
6214 offset2+l, tvb_get_ntohs(tvb, offset2+l),
6215 TREE(TT_GEN_UNI_SUBOBJ), &ti2, "Diversity Subobject");
6216 proto_tree_add_uint_format_value(rsvp_gen_uni_subtree, hf_rsvp_class, tvb, offset2+l+2, 1,
6217 j, "%d (Diversity)", j);
6218 proto_tree_add_uint(rsvp_gen_uni_subtree, hf_rsvp_type, tvb, offset2+l+3, 1, k);
6219 proto_tree_add_uint(rsvp_gen_uni_subtree, hf_rsvp_class_length, tvb, offset2+l, 2, sobj_len);
6220 proto_tree_add_item(rsvp_gen_uni_subtree, hf_rsvp_class_diversity, tvb, offset2+l+4, 1, ENC_NA);
6221 s_len = tvb_get_ntohs(tvb, offset2+l+8);
6222 s_class = tvb_get_uint8(tvb, offset2+l+10);
6223 s_type = tvb_get_uint8(tvb, offset2+l+11);
6224 rsvp_session_subtree = proto_tree_add_subtree(rsvp_gen_uni_subtree, tvb, offset2+l+8,
6225 s_len, TREE(rsvp_class_to_tree_type(s_class)), &ti2, "Session");
6226 len_item = proto_tree_add_uint(rsvp_session_subtree, hf_rsvp_length, tvb, offset2+l+8, 2, s_len);
6227 if (s_len < 4) {
6228 expert_add_info_format(pinfo, len_item, &ei_rsvp_invalid_length,
6229 "Length: %u (bogus, must be >= 4)", s_len);
6230 break;
6232 proto_tree_add_uint(rsvp_session_subtree, hf_rsvp_filter[RSVPF_OBJECT], tvb,
6233 offset2+8+l+10, 1, s_class);
6234 dissect_rsvp_session(pinfo, ti2, rsvp_session_subtree, tvb, offset2+l+8,
6235 s_len, s_class, s_type, rsvph);
6236 offset3 = offset2 + s_len;
6237 s_len = tvb_get_ntohs(tvb, offset3+l+8);
6238 s_class = tvb_get_uint8(tvb, offset3+l+10);
6239 s_type = tvb_get_uint8(tvb, offset3+l+11);
6240 rsvp_template_subtree = proto_tree_add_subtree(rsvp_gen_uni_subtree, tvb, offset3+l+8,
6241 s_len, TREE(rsvp_class_to_tree_type(s_class)), &ti2, "Template");
6243 proto_tree_add_uint(rsvp_template_subtree, hf_rsvp_length, tvb, offset3+l+8, 2, s_len);
6244 if (s_len < 4) {
6245 expert_add_info_format(pinfo, len_item, &ei_rsvp_invalid_length,
6246 "Length: %u (bogus, must be >= 4)", s_len);
6247 break;
6249 proto_tree_add_uint(rsvp_template_subtree, hf_rsvp_filter[RSVPF_OBJECT], tvb,
6250 offset3+8+l+10, 1, s_class);
6251 dissect_rsvp_template_filter(pinfo, ti2, rsvp_template_subtree, tvb, offset3+l+8,
6252 s_len, s_class, s_type, rsvph);
6254 if (i < 4) {
6255 proto_item_append_text(ti, "Diversity");
6257 break;
6260 break;
6262 case 4: /* Egress Label */
6263 k = tvb_get_uint8(tvb, offset2+l+3);
6264 if (k == 1) /* Egress label sub-type */
6265 rsvp_gen_uni_subtree = proto_tree_add_subtree(rsvp_object_tree, tvb,
6266 offset2+l, sobj_len, TREE(TT_GEN_UNI_SUBOBJ), &ti2,
6267 "Egress Label Subobject");
6268 else if (k == 2) /* SPC_label sub-type (see G.7713.2) */
6269 rsvp_gen_uni_subtree = proto_tree_add_subtree(rsvp_object_tree, tvb,
6270 offset2+l, sobj_len, TREE(TT_GEN_UNI_SUBOBJ), &ti2,
6271 "SPC Label Subobject");
6272 else
6273 rsvp_gen_uni_subtree = proto_tree_add_subtree(rsvp_object_tree, tvb,
6274 offset2+l, sobj_len, TREE(TT_GEN_UNI_SUBOBJ), &ti2,
6275 "Unknown Label Subobject");
6276 proto_tree_add_uint_format_value(rsvp_gen_uni_subtree, hf_rsvp_class, tvb, offset2+l+2, 1,
6277 j, "%d (Egress/SPC Label)", j);
6278 proto_tree_add_uint(rsvp_gen_uni_subtree, hf_rsvp_type, tvb, offset2+l+3, 1, k);
6279 proto_tree_add_uint(rsvp_gen_uni_subtree, hf_rsvp_class_length, tvb, offset2+l, 2, sobj_len);
6280 proto_tree_add_item(rsvp_gen_uni_subtree, hf_rsvp_gen_uni_direction,
6281 tvb, offset+l+2, 1, ENC_BIG_ENDIAN);
6282 proto_tree_add_item(rsvp_gen_uni_subtree, hf_rsvp_egress_label_type, tvb, offset2+l+7, 1, ENC_BIG_ENDIAN);
6283 proto_tree_add_item(rsvp_gen_uni_subtree, hf_rsvp_gen_uni_logical_port_id, tvb, offset2+l+8, 4, ENC_BIG_ENDIAN);
6284 proto_item_append_text(ti2, ": %s, Label type %d, Port ID %d, Label ",
6285 tvb_get_uint8(tvb, offset2+l+4) & 0x80 ?
6286 "Upstream" : "Downstream",
6287 tvb_get_uint8(tvb, offset2+l+7),
6288 tvb_get_ntohl(tvb, offset2+l+8));
6289 for (j=12; j < sobj_len; j+=4) {
6290 proto_tree_add_item(rsvp_gen_uni_subtree, hf_rsvp_egress_label, tvb, offset2+l+j, 4, ENC_BIG_ENDIAN);
6291 proto_item_append_text(ti2, "%u ", tvb_get_ntohl(tvb, offset2+l+j));
6293 if (i < 4) {
6294 if (k == 1)
6295 proto_item_append_text(ti, "Egress Label");
6296 else if (k == 2)
6297 proto_item_append_text(ti, "SPC Label");
6299 break;
6301 case 5: /* Service Level */
6302 k = tvb_get_uint8(tvb, offset2+l+3);
6303 switch(k) {
6304 default:
6305 case 1:
6306 rsvp_gen_uni_subtree = proto_tree_add_subtree(rsvp_object_tree, tvb,
6307 offset2+l, sobj_len, TREE(TT_GEN_UNI_SUBOBJ), &ti2,
6308 "Service Level Subobject");
6309 proto_tree_add_uint_format_value(rsvp_gen_uni_subtree, hf_rsvp_class, tvb, offset2+l+2, 1,
6310 j, "%d (Service Level)", j);
6311 proto_tree_add_uint(rsvp_gen_uni_subtree, hf_rsvp_type, tvb, offset2+l+3, 1, k);
6312 proto_tree_add_uint(rsvp_gen_uni_subtree, hf_rsvp_class_length, tvb, offset2+l, 2, sobj_len);
6313 proto_tree_add_item(rsvp_gen_uni_subtree, hf_rsvp_gen_uni_service_level, tvb, offset2+l+4, 1, ENC_BIG_ENDIAN);
6314 proto_item_append_text(ti2, ": %u", tvb_get_uint8(tvb, offset2+l+4));
6315 if (i < 4) {
6316 proto_item_append_text(ti, "Service Level %d", tvb_get_uint8(tvb, offset2+l+4));
6318 break;
6320 break;
6322 default: /* Unknown subobject */
6323 rsvp_gen_uni_subtree = proto_tree_add_subtree_format(rsvp_object_tree, tvb,
6324 offset2+l, sobj_len, TREE(TT_GEN_UNI_SUBOBJ), NULL,
6325 "Unknown subobject: %u",
6327 proto_tree_add_uint_format_value(rsvp_gen_uni_subtree, hf_rsvp_type, tvb, offset2+l, 1,
6328 j, "%u (Unknown)", j);
6329 proto_tree_add_item(rsvp_gen_uni_subtree, hf_rsvp_class_length, tvb, offset2+l+1, 1, ENC_BIG_ENDIAN);
6330 break;
6333 if (tvb_get_uint8(tvb, offset2+l+1) < 1) {
6334 proto_tree_add_expert_format(rsvp_gen_uni_subtree, pinfo, &ei_rsvp_invalid_length, tvb, offset2+l+1, 1,
6335 "Invalid length: %u", tvb_get_uint8(tvb, offset2+l+1));
6336 return;
6338 l += tvb_get_uint8(tvb, offset2+l+1);
6339 if (l < mylen) {
6340 if (i < 4)
6341 proto_item_append_text(ti, ", ");
6342 else if (i==4)
6343 proto_item_append_text(ti, "...");
6346 break;
6349 default:
6350 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_generalized_uni, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6351 proto_tree_add_item(rsvp_object_tree, hf_rsvp_gen_uni_data, tvb, offset2, mylen, ENC_NA);
6352 break;
6356 /*------------------------------------------------------------------------------
6357 * CALL_ID
6358 *------------------------------------------------------------------------------*/
6359 static const value_string address_type_vals[] = {
6360 { 1, "1 (IPv4)"},
6361 { 2, "2 (IPv6)"},
6362 { 3, "3 (NSAP)"},
6363 { 4, "4 (MAC)"},
6364 { 0x7f, "0x7f (Vendor-defined)"},
6365 { 0, NULL}
6368 static void
6369 dissect_rsvp_call_id(proto_tree *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
6370 tvbuff_t *tvb,
6371 int offset, int obj_length,
6372 int rsvp_class _U_, int c_type)
6374 int type = 0;
6375 const uint8_t *str;
6376 int offset2 = offset + 4;
6377 int offset3, offset4, len;
6378 proto_tree *ti2 = NULL, *hidden_item;
6380 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6381 proto_item_set_hidden(hidden_item);
6384 proto_item_set_text(ti, "CALL-ID: ");
6385 switch(c_type) {
6386 case 0:
6387 proto_item_append_text(ti,"Empty");
6388 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_call_id, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6389 if (obj_length > 4)
6390 proto_tree_add_item(rsvp_object_tree, hf_rsvp_call_id_data, tvb, offset2, obj_length-4, ENC_NA);
6391 break;
6392 case 1:
6393 case 2:
6394 type = tvb_get_uint8 (tvb, offset2);
6395 if (c_type == 1) {
6396 offset3 = offset2 + 4;
6397 len = obj_length - 16;
6398 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_call_id, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6399 ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_call_id_address_type, tvb, offset2, 1, ENC_BIG_ENDIAN);
6400 proto_tree_add_item(rsvp_object_tree, hf_rsvp_call_id_reserved, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
6401 proto_item_append_text(ti, "Operator-Specific. Addr Type: %s. ",
6402 val_to_str(type, address_type_vals, "Unknown (%u)"));
6404 else {
6405 offset3 = offset2 + 16;
6406 len = obj_length - 28;
6407 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_call_id, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6408 ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_call_id_address_type, tvb, offset2, 1, ENC_BIG_ENDIAN);
6409 proto_tree_add_item_ret_string(rsvp_object_tree, hf_rsvp_call_id_international_segment, tvb, offset2 + 1, 3, ENC_NA|ENC_ASCII, pinfo->pool, &str);
6410 proto_item_append_text(ti, "Globally-Unique. Addr Type: %s. Intl Segment: %s. ",
6411 val_to_str(type, address_type_vals, "Unknown (%u)"), str);
6412 proto_tree_add_item_ret_string(rsvp_object_tree, hf_rsvp_call_id_national_segment, tvb, offset2 + 4, 12, ENC_NA|ENC_ASCII, pinfo->pool, &str);
6413 proto_item_append_text(ti, "Natl Segment: %s. ", str);
6416 switch(type) {
6417 case 1:
6418 offset4 = offset3 + 4;
6419 str = tvb_ip_to_str(pinfo->pool, tvb, offset3);
6420 proto_tree_add_item(rsvp_object_tree, hf_rsvp_filter[RSVPF_CALL_ID_SRC_ADDR_IPV4],
6421 tvb, offset3, 4, ENC_BIG_ENDIAN);
6422 break;
6424 case 2:
6425 offset4 = offset3 + 16;
6426 str = tvb_ip6_to_str(pinfo->pool, tvb, offset3);
6427 proto_tree_add_item(rsvp_object_tree, hf_rsvp_filter[RSVPF_CALL_ID_SRC_ADDR_IPV6],
6428 tvb, offset3, 16, ENC_NA);
6429 break;
6431 case 3:
6432 offset4 = offset3 + 20;
6433 str = print_nsap_net(pinfo->pool, tvb, offset3, 20);
6434 proto_tree_add_string(rsvp_object_tree, hf_rsvp_source_transport_network_addr, tvb, offset3, 20, str);
6435 break;
6437 case 4:
6438 offset4 = offset3 + 6;
6439 str = tvb_ether_to_str(pinfo->pool, tvb, offset3);
6440 proto_tree_add_item(rsvp_object_tree, hf_rsvp_callid_srcaddr_ether, tvb, offset3, 6, ENC_NA);
6441 break;
6443 case 0x7F:
6444 offset4 = offset3 + len;
6445 str = tvb_bytes_to_str(pinfo->pool, tvb, offset3, len);
6446 proto_tree_add_item(rsvp_object_tree, hf_rsvp_callid_srcaddr_bytes, tvb, offset3, len, ENC_NA);
6447 break;
6449 default:
6450 offset4 = offset3 + len;
6451 str = "???";
6452 expert_add_info(pinfo, ti2, &ei_rsvp_call_id_address_type);
6453 break;
6456 proto_item_append_text(ti, "Src: %s. ", str);
6457 proto_tree_add_item(rsvp_object_tree, hf_rsvp_call_id_local_identifier, tvb, offset4, 8, ENC_NA);
6458 proto_item_append_text(ti, "Local ID: %s. ", tvb_bytes_to_str(pinfo->pool, tvb, offset4, 8));
6459 break;
6461 default:
6462 proto_item_append_text(ti, " Unknown");
6463 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_call_id, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6464 proto_tree_add_item(rsvp_object_tree, hf_rsvp_call_id_data, tvb, offset2, obj_length-4, ENC_NA);
6465 break;
6469 /*------------------------------------------------------------------------------
6470 * 3GPP2_OBJECT X.S0057-0 v1.0, X.S0011-004-E v1.0
6471 *------------------------------------------------------------------------------*/
6472 static const value_string rsvp_3gpp_object_ie_type_vals[] = {
6473 { 0, "TFT IPv4"},
6474 { 1, "TFT IPv4 Error"},
6475 { 2, "TFT IPv6"},
6476 { 3, "TFT IPv6 Error"},
6477 { 4, "Header Removal"},
6478 { 5, "Header Removal Error"},
6479 { 6, "Channel Treatment"},
6480 { 7, "Channel Treatment Error"},
6481 { 0, NULL}
6484 static const value_string rsvp_3gpp_object_tft_d_vals[] = {
6485 { 0, "Forward Direction"},
6486 { 1, "Reverse Direction"},
6487 { 2, "Reserved"},
6488 { 3, "Reserved"},
6489 { 0, NULL}
6492 static const value_string rsvp_3gpp_obj_tft_opcode_vals[] = {
6493 { 0x00, "Spare"},
6494 { 0x01, "Create new TFT"},
6495 { 0x02, "Delete existing TFT"},
6496 { 0x03, "Add packet filters to existing TFT"},
6497 { 0x04, "Replace packet filters in existing TFT"},
6498 { 0x05, "Delete packet filters from existing TFT"},
6499 { 0x06, "QoS Check"},
6500 { 0x07, "Reserved"},
6501 { 0x80, "Initiate Flow Request"},
6502 { 0x81, "QoS Check Confirm"},
6503 { 0x82, "Initiate Delete Packet Filter from Existing TFT"},
6504 { 0x83, "Initiate Replace packet filters in existing TFT"},
6505 { 0, NULL}
6508 static const value_string rsvp_3gpp_obj_pf_comp_type_id_vals[] = {
6509 { 16, "IPv4 Source Address with Subnet Mask"},
6510 { 17, "IPv4 Destination Address with Subnet Mask"},
6511 { 32, "IPv6 Source Address with Prefix Length"},
6512 { 33, "IPv6 Destination Address with Prefix Length"},
6513 { 48, "Protocol /Next header"},
6514 { 64, "Single Destination Port"},
6515 { 65, "Destination Port range"},
6516 { 80, "Single Source Port"},
6517 { 81, "Source Port range"},
6518 { 96, "Security Parameter Index"},
6519 { 112, "Type of Service/Traffic Class"},
6520 { 128, "Flow label"},
6521 { 129, "Type 2 Routing Header with Prefix Length"},
6522 { 130, "Home Address Option with Prefix Length"},
6523 { 0, NULL}
6526 static const value_string rsvp_3gpp_obj_pf_treatment_vals[] = {
6527 { 0, "Header Compression"},
6528 { 1, "Maximum Buffer Timer"},
6529 { 0, NULL}
6532 #if 0
6533 static const value_string rsvp_3gpp_qos_result_vals[] = {
6534 { 0, "Successful"},
6535 { 1, "UE Initiated QoS is not authorized"},
6536 { 2, "NW initiated QoS in progress for this flow"},
6537 { 3, "Requested FlowProfileIDs failed mapping"},
6538 { 0, NULL}
6540 #endif
6542 static const value_string rsvp_3gpp_obj_traffic_class_vals[] = {
6543 { 0, "Unknown"},
6544 { 1, "Conversational"},
6545 { 2, "Streaming"},
6546 { 3, "Interactive"},
6547 { 4, "Background"},
6548 { 0, NULL}
6551 static void
6552 dissect_rsvp_3gpp_object(proto_tree *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
6553 tvbuff_t *tvb,
6554 int offset, int obj_length,
6555 int rsvp_class _U_, int c_type)
6557 uint16_t length, ie_type;
6558 proto_tree *hidden_item;
6560 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6561 proto_item_set_hidden(hidden_item);
6563 offset+=3;
6564 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_3gpp_object, tvb, offset, 1, ENC_BIG_ENDIAN);
6565 offset++;
6566 /* Set obj_length to the remaining bytes */
6567 obj_length = obj_length - 4;
6568 if(c_type==1){
6569 /* Transaction ID */
6570 proto_tree_add_item(rsvp_object_tree, hf_rsvp_3gpp_obj_tid, tvb, offset, 4, ENC_BIG_ENDIAN);
6571 offset+=4;
6572 obj_length = obj_length - 4;
6573 /* IE List */
6574 while(obj_length>0){
6575 length = tvb_get_ntohs(tvb, offset);
6576 proto_tree_add_item(rsvp_object_tree, hf_rsvp_3gpp_obj_ie_len, tvb, offset, 2, ENC_BIG_ENDIAN);
6577 offset+=2;
6578 ie_type = tvb_get_ntohs(tvb, offset);
6579 proto_tree_add_item(rsvp_object_tree, hf_rsvp_3gpp_obj_ie_type, tvb, offset, 2, ENC_BIG_ENDIAN);
6580 offset+=2;
6582 if ((ie_type == 0)||(ie_type==2)){
6583 uint8_t tft_opcode, tft_n_pkt_flt;
6584 int i;
6586 if(ie_type == 0){
6587 /*IPv4*/
6588 proto_tree_add_item(rsvp_object_tree, hf_rsvp_3gpp_obj_ue_ipv4_addr, tvb, offset, 4, ENC_BIG_ENDIAN);
6589 offset+=4;
6590 }else{
6591 proto_tree_add_item(rsvp_object_tree, hf_rsvp_3gpp_obj_ue_ipv6_addr, tvb, offset, 16, ENC_NA);
6592 offset+=16;
6594 /* D Reserved NS SR_ID Reserved P TFT Operation Code Number of Packet filters */
6595 /* D */
6596 proto_tree_add_item(rsvp_object_tree, hf_rsvp_3gpp_obj_tft_d, tvb, offset, 4, ENC_BIG_ENDIAN);
6597 /* NS */
6598 proto_tree_add_item(rsvp_object_tree, hf_rsvp_3gpp_obj_tft_ns, tvb, offset, 4, ENC_BIG_ENDIAN);
6599 /* SR_ID */
6600 proto_tree_add_item(rsvp_object_tree, hf_rsvp_3gpp_obj_tft_sr_id, tvb, offset, 4, ENC_BIG_ENDIAN);
6601 /* P */
6602 proto_tree_add_item(rsvp_object_tree, hf_rsvp_3gpp_obj_tft_p, tvb, offset, 4, ENC_BIG_ENDIAN);
6603 /* TFT Operation Code */
6604 tft_opcode = tvb_get_uint8(tvb, offset+2);
6605 proto_tree_add_item(rsvp_object_tree, hf_rsvp_3gpp_obj_tft_opcode, tvb, offset, 4, ENC_BIG_ENDIAN);
6606 /* Number of Packet filters */
6607 tft_n_pkt_flt = tvb_get_uint8(tvb, offset+3);
6608 proto_tree_add_item(rsvp_object_tree, hf_rsvp_3gpp_obj_tft_n_pkt_flt, tvb, offset, 4, ENC_BIG_ENDIAN);
6609 offset+=4;
6610 /* Packet filter list
6611 * The packet filter list contains a variable number of packet filters. It shall be
6612 * encoded same as defined in X.S0011-D Chapter 4 [5] except as defined
6613 * below:
6614 * For "QoS Check Confirm" operations, the packet filter list shall be empty.
6615 * For "Initiate Delete Packet Filter from Existing TFT", the packet filter list
6616 * shall contain a variable number of Flow Identifiers given in the number of
6617 * packet filters field. In this case, the packet filter evaluation precedence,
6618 * length, and contents are not included, only the Flow Identifiers are
6619 * included. See Figure B-6, X.S0011-D [5] .
6620 * For "Initiate Flow request" and "Initiate Replace Packet Filters in Existing
6621 * TFT" Replace Packet Filters in Existing TFT the packet filter list shall
6622 * contain a variable number of Flow Identifiers, along with the packet filter
6623 * contents. See Figure B-7, X.S0011-D
6625 if((tft_opcode!=0x81)&&(tft_n_pkt_flt != 0)){
6626 /* Packet Filter List */
6627 for (i = 0; i < tft_n_pkt_flt; i++) {
6628 proto_tree *flow_tree, *t2_tree;
6629 uint16_t pkt_flt_len, item_len, pf_cont_len;
6630 uint8_t pf_comp_type_id;
6632 flow_tree = proto_tree_add_subtree_format(rsvp_object_tree, tvb, offset, -1, ett_treelist[TT_3GPP_OBJ_FLOW], &ti, "Flow Identifier Num %u",i+1);
6633 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_flow_id, tvb, offset, 1, ENC_BIG_ENDIAN);
6634 offset++;
6635 item_len = 1;
6636 if((tft_opcode==0x05)||(tft_opcode==0x82)){
6637 /* delete packet filters from existing TFT, Initiate Delete Packet Filter from Existing TFT */
6638 proto_item_set_len(ti, item_len);
6639 continue;
6641 /* Packet filter evaluation precedence */
6642 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_ev_prec, tvb, offset, 1, ENC_BIG_ENDIAN);
6643 offset++;
6644 /* Packet filter length */
6645 pkt_flt_len = tvb_get_ntohs(tvb,offset);
6646 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_len, tvb, offset, 2, ENC_BIG_ENDIAN);
6647 item_len = item_len + pkt_flt_len +1;
6648 offset+=2;
6649 /* Packet filter contents */
6650 /* PF Type (0-1) */
6651 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_type, tvb, offset, 1, ENC_BIG_ENDIAN);
6652 offset++;
6653 /* Length */
6654 pf_cont_len = tvb_get_uint8(tvb, offset);
6655 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_cont_len, tvb, offset, 1, ENC_BIG_ENDIAN);
6656 offset++;
6657 /* Packet filter component type identifier */
6658 pf_comp_type_id = tvb_get_uint8(tvb, offset);
6659 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_comp_type_id, tvb, offset, 1, ENC_BIG_ENDIAN);
6660 offset++;
6661 /* Packet filter component */
6662 switch(pf_comp_type_id){
6663 case 16: /* IPv4 Source Address with Subnet Mask */
6664 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_src_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
6665 offset+=4;
6666 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_ipv4_mask, tvb, offset, 4, ENC_BIG_ENDIAN);
6667 offset+=4;
6668 pf_cont_len-=11;
6669 break;
6670 case 17: /* IPv4 Destination Address with Subnet Mask */
6671 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_dst_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
6672 offset+=4;
6673 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_ipv4_mask, tvb, offset, 4, ENC_BIG_ENDIAN);
6674 offset+=4;
6675 /* Items length (8 + 3)*/
6676 pf_cont_len-=11;
6677 break;
6678 case 32: /* IPv6 Source Address with Prefix Length */
6679 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_src_ipv6, tvb, offset, 16, ENC_NA);
6680 offset+=16;
6681 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_ipv6_prefix_length, tvb, offset, 1, ENC_BIG_ENDIAN);
6682 offset++;
6683 /* Items length (17 + 3)*/
6684 pf_cont_len-=20;
6685 break;
6686 case 33: /* IPv6 Destination Address with Prefix Length */
6687 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_dst_ipv6, tvb, offset, 16, ENC_NA);
6688 offset+=16;
6689 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_ipv6_prefix_length, tvb, offset, 1, ENC_BIG_ENDIAN);
6690 offset++;
6691 /* Items length (17 + 3)*/
6692 pf_cont_len-=20;
6693 break;
6694 case 48: /* Protocol /Next header */
6695 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_prot_next, tvb, offset, 1, ENC_BIG_ENDIAN);
6696 offset++;
6697 /* Items length (1 + 3)*/
6698 pf_cont_len-=4;
6699 break;
6700 case 64: /* Single Destination Port */
6701 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_dst_port, tvb, offset, 2, ENC_BIG_ENDIAN);
6702 offset+=2;
6703 /* Items length (2 + 3)*/
6704 pf_cont_len-=5;
6705 break;
6706 case 65: /* Destination Port range */
6707 proto_tree_add_uint_format_value(rsvp_object_tree, hf_rsvp_3gpp_obj_pf_dst_port_range, tvb, offset, 4,
6708 tvb_get_ntohs(tvb,offset), "%u-%u", tvb_get_ntohs(tvb,offset), tvb_get_ntohs(tvb,offset+2));
6709 offset+=4;
6710 break;
6711 case 80: /* Single Source Port */
6712 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_src_port, tvb, offset, 2, ENC_BIG_ENDIAN);
6713 offset+=2;
6714 /* Items length (2 + 3)*/
6715 pf_cont_len-=5;
6716 break;
6717 case 81: /* Source Port range */
6718 proto_tree_add_uint_format_value(rsvp_object_tree, hf_rsvp_3gpp_obj_pf_src_port_range, tvb, offset, 4,
6719 tvb_get_ntohs(tvb,offset), "Source Port range %u-%u", tvb_get_ntohs(tvb,offset), tvb_get_ntohs(tvb,offset+2));
6720 offset+=4;
6721 /* Items length (4 + 3)*/
6722 pf_cont_len-=7;
6723 break;
6724 case 96: /* Security Parameter Index */
6725 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_ipsec_spi, tvb, offset, 4, ENC_BIG_ENDIAN);
6726 offset+=4;
6727 /* Items length (4 + 3)*/
6728 pf_cont_len-=7;
6729 break;
6730 case 112: /* Type of Service/Traffic Class */
6731 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_tos_tc, tvb, offset, 1, ENC_BIG_ENDIAN);
6732 offset++;
6733 /* Items length (1 + 3)*/
6734 pf_cont_len-=4;
6735 break;
6736 case 128: /* Flow label */
6737 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_flow_lbl, tvb, offset, 3, ENC_BIG_ENDIAN);
6738 offset+=3;
6739 /* Items length (3 + 3)*/
6740 pf_cont_len-=6;
6741 break;
6742 case 129: /* Type 2 Routing Header with Prefix Length */
6743 t2_tree = proto_tree_add_subtree(flow_tree, tvb, offset, 17, ett_treelist[TT_3GPP_OBJ_T2], NULL, "Type 2 Routing Header packet filter");
6744 proto_tree_add_item(t2_tree, hf_rsvp_3gpp_obj_pf_ipv6, tvb, offset, 16, ENC_NA);
6745 offset+=16;
6746 proto_tree_add_item(t2_tree, hf_rsvp_3gpp_obj_pf_ipv6_prefix_length, tvb, offset, 1, ENC_BIG_ENDIAN);
6747 offset++;
6748 /* Items length (17 + 3)*/
6749 pf_cont_len-=20;
6750 break;
6751 case 130: /* Home Address Option with Prefix Length */
6752 t2_tree = proto_tree_add_subtree(flow_tree, tvb, offset, 17, ett_treelist[TT_3GPP_OBJ_HO], NULL, "Home address Option packet filter");
6753 proto_tree_add_item(t2_tree, hf_rsvp_3gpp_obj_pf_ipv6, tvb, offset, 16, ENC_NA);
6754 offset+=16;
6755 proto_tree_add_item(t2_tree, hf_rsvp_3gpp_obj_pf_ipv6_prefix_length, tvb, offset, 1, ENC_BIG_ENDIAN);
6756 offset++;
6757 /* Items length (17 + 3)*/
6758 pf_cont_len-=20;
6759 break;
6761 default:
6762 proto_tree_add_expert(flow_tree, pinfo, &ei_rsvp_packet_filter_component, tvb, offset, pf_cont_len-2);
6763 offset = offset + pkt_flt_len - 5;
6764 pf_cont_len=0;
6765 break;
6767 if(pf_cont_len != 0){
6768 /* Packet filter treatment */
6769 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_treatment, tvb, offset, 1, ENC_BIG_ENDIAN);
6770 offset++;
6771 /* [RFC 3006] hint */
6772 proto_tree_add_item(flow_tree, hf_rsvp_3gpp_obj_pf_hint, tvb, offset, 4, ENC_BIG_ENDIAN);
6773 offset+=4;
6775 proto_item_set_len(ti, item_len);
6778 /* QoS List (QoS Check, QoS-Check Confirm Initiate Flow Request
6779 * and Initiate Replace Packet Filters in Existing TFT)
6780 * XXX
6781 * Create new TFT?
6783 if((tft_opcode == 0x01)||(tft_opcode == 0x06)||(tft_opcode == 0x80)||(tft_opcode == 0x81)||(tft_opcode == 0x83)){
6784 /* QoS List Length */
6785 int32_t tft_qos_list_len;
6786 uint8_t blob_len, item_len, padding_len;
6787 bool verbose;
6788 proto_tree *qos_tree, *qos_sub_blob_tree, *qos_att_tree;
6789 int num = 0, j, num_qos_att_set;
6791 tft_qos_list_len = tvb_get_ntohs(tvb, offset);
6792 proto_tree_add_item(rsvp_object_tree, hf_rsvp_3gpp_obj_tft_qos_list_len, tvb, offset, 2, ENC_BIG_ENDIAN);
6793 offset+=2;
6794 tft_qos_list_len-=2;
6795 if(tft_qos_list_len > 0){
6796 while (tft_qos_list_len>0) {
6797 int bit_offset; /* offset in bits */
6798 uint8_t qos_attribute_set_len;
6800 num++;
6802 qos_tree = proto_tree_add_subtree_format(rsvp_object_tree, tvb, offset, -1,
6803 ett_treelist[TT_3GPP_OBJ_QOS], NULL, "QOS Flow Identifier Num %u", num);
6805 /* Flow Identifier */
6806 proto_tree_add_item(qos_tree, hf_rsvp_3gpp_obj_flow_id, tvb, offset, 1, ENC_BIG_ENDIAN);
6807 offset++;
6808 tft_qos_list_len--;
6810 /* R_QOS_SUB_BLOB_LEN 1 */
6811 blob_len = tvb_get_uint8(tvb, offset);
6812 proto_tree_add_item(qos_tree, hf_rsvp_3gpp_r_qos_blob_len, tvb, offset, 1, ENC_BIG_ENDIAN);
6813 offset++;
6814 tft_qos_list_len--;
6816 /* R_QoS_SUB_BLOB X.S0011-004-D */
6817 ti = proto_tree_add_item(qos_tree, hf_rsvp_3gpp_r_qos_blob, tvb, offset, blob_len, ENC_NA);
6818 qos_sub_blob_tree = proto_item_add_subtree(ti, ett_treelist[TT_3GPP_OBJ_QOS_SUB_BLOB]);
6820 proto_tree_add_item(qos_sub_blob_tree, hf_rsvp_3gpp_r_qos_blob_flow_pri, tvb, offset, 1, ENC_BIG_ENDIAN);
6821 proto_tree_add_item(qos_sub_blob_tree, hf_rsvp_3gpp_r_qos_blob_num_qos_att_set, tvb, offset, 1, ENC_BIG_ENDIAN);
6822 num_qos_att_set = (tvb_get_uint8(tvb, offset) & 0x0e)>>1;
6823 /* point to the first bit in the QoS_ATTRIBUTE_SET */
6824 bit_offset = (offset<<3)+7;
6825 for (j = 0; j < num_qos_att_set; j++) {
6826 qos_attribute_set_len = tvb_get_bits8(tvb,bit_offset,4);
6827 qos_att_tree = proto_tree_add_subtree_format(qos_sub_blob_tree, tvb, bit_offset>>3, qos_attribute_set_len, ett_treelist[TT_3GPP_OBJ_QOS_SUB_BLOB], NULL,
6828 "QoS_ATTRIBUTE_SET %u(%u bytes)", j+1, qos_attribute_set_len);
6829 proto_tree_add_bits_item(qos_att_tree, hf_rsvp_3gpp_qos_att_set_len, tvb, bit_offset, 4, ENC_BIG_ENDIAN);
6830 bit_offset+=4;
6832 if(qos_attribute_set_len==0){
6833 break;
6836 proto_tree_add_bits_item(qos_att_tree, hf_rsvp_3gpp_qos_attribute_set_id, tvb, bit_offset, 7, ENC_BIG_ENDIAN);
6837 bit_offset+=7;
6839 verbose = tvb_get_bits8(tvb, bit_offset, 1);
6840 proto_tree_add_bits_item(qos_att_tree, hf_rsvp_3gpp_qos_attribute_verbose, tvb, bit_offset, 1, ENC_BIG_ENDIAN);
6841 bit_offset++;
6844 if(verbose == false){
6845 proto_tree_add_bits_item(qos_att_tree, hf_rsvp_3gpp_qos_attribute_prof_id, tvb, bit_offset, 16, ENC_BIG_ENDIAN);
6846 bit_offset+=16;
6847 }else{
6848 /* Traffic_Class 0 or 3 */
6849 proto_tree_add_bits_item(qos_att_tree, hf_rsvp_3gpp_qos_attribute_traff_cls, tvb, bit_offset, 3, ENC_BIG_ENDIAN);
6850 bit_offset+=3;
6851 /* Peak_Rate 0 or 16 */
6852 proto_tree_add_bits_item(qos_att_tree, hf_rsvp_3gpp_qos_attribute_peak_rate, tvb, bit_offset, 16, ENC_BIG_ENDIAN);
6853 bit_offset+=16;
6854 /* Bucket_Size 0 or 16 */
6855 proto_tree_add_bits_item(qos_att_tree, hf_rsvp_3gpp_qos_attribute_bucket_size, tvb, bit_offset, 16, ENC_BIG_ENDIAN);
6856 bit_offset+=16;
6857 /* Token_Rate 0 or 16 */
6858 proto_tree_add_bits_item(qos_att_tree, hf_rsvp_3gpp_qos_attribute_token_rate, tvb, bit_offset, 16, ENC_BIG_ENDIAN);
6859 bit_offset+=16;
6860 /* Max_Latency 0 or 8 */
6861 proto_tree_add_bits_item(qos_att_tree, hf_rsvp_3gpp_qos_attribute_max_latency, tvb, bit_offset, 16, ENC_BIG_ENDIAN);
6862 bit_offset+=8;
6863 /* Max_Loss_Rate 0 or 8 */
6864 proto_tree_add_bits_item(qos_att_tree, hf_rsvp_3gpp_qos_attribute_max_loss_rte, tvb, bit_offset, 16, ENC_BIG_ENDIAN);
6865 bit_offset+=8;
6866 /* Delay_Var_Sensitive 0 or 1 */
6867 proto_tree_add_bits_item(qos_att_tree, hf_rsvp_3gpp_qos_attribute_delay_var_sensitive, tvb, bit_offset, 16, ENC_BIG_ENDIAN);
6868 bit_offset+=1;
6870 /* Padd to fill up to octet boundary, Reserved 0-7 as needed */
6871 padding_len = 0;
6872 if((bit_offset & 0x07) != 0){
6873 padding_len = 8 - (bit_offset & 0x07);
6874 proto_tree_add_bits_item(qos_att_tree, hf_rsvp_3gpp_qos_attribute_reserved, tvb, bit_offset, padding_len, ENC_BIG_ENDIAN);
6876 bit_offset = bit_offset + padding_len;
6880 offset = offset + blob_len;
6881 tft_qos_list_len = tft_qos_list_len - blob_len;
6883 /* Result Code This field is only included in the ResvConf message when
6884 * the TFT Operation Code field is set to QoS-Check Confirm.
6886 item_len = blob_len + 2;
6887 if(tft_opcode == 0x81){
6888 proto_tree_add_item(qos_tree, hf_rsvp_3gpp_qos_result, tvb, offset, 1, ENC_BIG_ENDIAN);
6889 offset++;
6890 tft_qos_list_len--;
6891 item_len++;
6893 proto_item_set_len(ti, item_len);
6896 }else{
6897 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ie_data, tvb, offset, length-2, ENC_NA);
6899 obj_length = obj_length - length;
6904 /*------------------------------------------------------------------------------
6905 * RESTART CAPABILITY
6906 *------------------------------------------------------------------------------*/
6907 static void
6908 dissect_rsvp_restart_cap(proto_tree *ti, proto_tree *rsvp_object_tree,
6909 tvbuff_t *tvb,
6910 int offset, int obj_length,
6911 int rsvp_class _U_, int type)
6913 int offset2 = offset + 4;
6914 unsigned restart, recovery;
6915 proto_tree *hidden_item;
6917 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6918 proto_item_set_hidden(hidden_item);
6920 proto_item_set_text(ti, "RESTART CAPABILITY: ");
6921 switch(type) {
6922 case 1:
6923 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_restart_cap, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6924 proto_tree_add_item_ret_uint(rsvp_object_tree, hf_rsvp_restart_cap_restart_time, tvb, offset2, 4,
6925 ENC_BIG_ENDIAN, &restart);
6926 proto_tree_add_item_ret_uint(rsvp_object_tree, hf_rsvp_restart_cap_recovery_time, tvb, offset2+4, 4,
6927 ENC_BIG_ENDIAN, &recovery);
6928 proto_item_append_text(ti, "Restart Time: %d ms. Recovery Time: %d ms.",
6929 restart, recovery);
6930 break;
6932 default:
6933 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_restart_cap, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6934 proto_tree_add_item(rsvp_object_tree, hf_rsvp_restart_cap_data, tvb, offset2, obj_length - 4, ENC_NA);
6935 break;
6939 /*------------------------------------------------------------------------------
6940 * LINK CAPABILITY
6941 *------------------------------------------------------------------------------*/
6942 static void
6943 dissect_rsvp_link_cap(proto_item *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
6944 tvbuff_t *tvb,
6945 int offset, int obj_length,
6946 int rsvp_class, int type)
6948 proto_tree *hidden_item;
6950 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6951 proto_item_set_hidden(hidden_item);
6953 proto_item_set_text(ti, "LINK CAPABILITY: ");
6954 switch(type) {
6955 case 1:
6956 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_link_cap, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6958 dissect_rsvp_ro_subobjects(ti, pinfo, rsvp_object_tree, tvb,
6959 offset + 4, obj_length, rsvp_class);
6960 break;
6962 default:
6963 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_link_cap, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6964 proto_tree_add_item(rsvp_object_tree, hf_rsvp_link_cap_data, tvb, offset+4, obj_length - 4, ENC_NA);
6965 break;
6970 /*------------------------------------------------------------------------------
6971 * Capability Object
6972 *------------------------------------------------------------------------------*/
6973 static void
6974 dissect_rsvp_capability(proto_item *ti, packet_info* pinfo _U_, proto_tree *rsvp_object_tree,
6975 tvbuff_t *tvb,
6976 int offset, int obj_length,
6977 int rsvp_class _U_, int type)
6979 proto_tree *hidden_item;
6981 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
6982 proto_item_set_hidden(hidden_item);
6984 proto_item_set_text(ti, "Capability: ");
6986 static int * const flags[] = {
6987 &hf_rsvp_capability_flags_reserved,
6988 &hf_rsvp_capability_flags_f,
6989 &hf_rsvp_capability_flags_i,
6990 &hf_rsvp_capability_flags_t,
6991 &hf_rsvp_capability_flags_r,
6992 &hf_rsvp_capability_flags_s,
6993 NULL
6995 uint64_t cap_flags;
6997 switch(type) {
6998 case 1:
6999 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_capability, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7001 proto_tree_add_bitmask_ret_uint64(rsvp_object_tree, tvb, offset+4, hf_rsvp_capability_flags, TREE(TT_CAPABILITY_FLAGS), flags, ENC_BIG_ENDIAN, &cap_flags);
7002 proto_item_append_text(ti, "%s%s%s%s%s",
7003 cap_flags&0x10 ? "F":UTF8_MIDDLE_DOT,
7004 cap_flags&0x08 ? "I":UTF8_MIDDLE_DOT,
7005 cap_flags&0x04 ? "T":UTF8_MIDDLE_DOT,
7006 cap_flags&0x02 ? "R":UTF8_MIDDLE_DOT,
7007 cap_flags&0x01 ? "S":UTF8_MIDDLE_DOT);
7008 break;
7010 default:
7011 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_capability, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7012 proto_tree_add_item(rsvp_object_tree, hf_rsvp_capability_data, tvb, offset+4, obj_length - 4, ENC_NA);
7013 break;
7017 /*------------------------------------------------------------------------------
7018 * PROTECTION INFORMATION
7019 *------------------------------------------------------------------------------*/
7020 static void
7021 dissect_rsvp_protection_info(proto_tree *ti, proto_tree *rsvp_object_tree,
7022 tvbuff_t *tvb,
7023 int offset, int obj_length,
7024 int rsvp_class _U_, int type)
7026 uint8_t flags1, lsp_flags, link_flags, seg_flags;
7027 proto_tree *ti2, *rsvp_pi_link_flags_tree, *rsvp_pi_lsp_flags_tree, *rsvp_pi_seg_flags_tree;
7028 int offset2 = offset + 4;
7029 proto_tree *hidden_item;
7031 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7032 proto_item_set_hidden(hidden_item);
7034 proto_item_set_text(ti, "PROTECTION_INFO: ");
7035 switch(type) {
7036 case 1:
7037 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_protection_info, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7038 flags1 = tvb_get_uint8(tvb, offset2);
7039 proto_tree_add_item(rsvp_object_tree, hf_rsvp_protection_info_flags_secondary_lsp,
7040 tvb, offset2, 1, ENC_BIG_ENDIAN);
7042 link_flags = tvb_get_uint8(tvb, offset2+3);
7043 ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_protection_info_link_flags, tvb, offset2+3, 1, ENC_BIG_ENDIAN);
7044 rsvp_pi_link_flags_tree = proto_item_add_subtree(ti2, TREE(TT_PROTECTION_INFO_LINK));
7045 proto_tree_add_item(rsvp_pi_link_flags_tree, hf_rsvp_pi_link_flags_extra_traffic,
7046 tvb, offset2+3, 1, ENC_BIG_ENDIAN);
7047 proto_tree_add_item(rsvp_pi_link_flags_tree, hf_rsvp_pi_link_flags_unprotected,
7048 tvb, offset2+3, 1, ENC_BIG_ENDIAN);
7049 proto_tree_add_item(rsvp_pi_link_flags_tree, hf_rsvp_pi_link_flags_shared,
7050 tvb, offset2+3, 1, ENC_BIG_ENDIAN);
7051 proto_tree_add_item(rsvp_pi_link_flags_tree, hf_rsvp_pi_link_flags_dedicated1_1,
7052 tvb, offset2+3, 1, ENC_BIG_ENDIAN);
7053 proto_tree_add_item(rsvp_pi_link_flags_tree, hf_rsvp_pi_link_flags_dedicated1plus1,
7054 tvb, offset2+3, 1, ENC_BIG_ENDIAN);
7055 proto_tree_add_item(rsvp_pi_link_flags_tree, hf_rsvp_pi_link_flags_enhanced,
7056 tvb, offset2+3, 1, ENC_BIG_ENDIAN);
7057 proto_item_append_text(ti, "%s%s%s%s%s%s%s.",
7058 flags1&0x80 ? "SecondaryLSP ":"",
7059 link_flags&0x01 ? "ExtraTraffic ":"",
7060 link_flags&0x02 ? "Unprotected ":"",
7061 link_flags&0x04 ? "Shared ":"",
7062 link_flags&0x08 ? "Dedicated1:1 ":"",
7063 link_flags&0x10 ? "Dedicated1+1 ":"",
7064 link_flags&0x20 ? "Enhanced ":"");
7065 break;
7067 case 2: /* RFC4872 */
7068 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_protection_info, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7069 flags1 = tvb_get_uint8(tvb, offset2);
7070 proto_tree_add_item(rsvp_object_tree, hf_rsvp_rfc4872_secondary,
7071 tvb, offset2, 1, ENC_BIG_ENDIAN);
7072 proto_tree_add_item(rsvp_object_tree, hf_rsvp_rfc4872_protecting,
7073 tvb, offset2, 1, ENC_BIG_ENDIAN);
7074 proto_tree_add_item(rsvp_object_tree, hf_rsvp_rfc4872_notification_msg,
7075 tvb, offset2, 1, ENC_BIG_ENDIAN);
7076 proto_tree_add_item(rsvp_object_tree, hf_rsvp_rfc4872_operational,
7077 tvb, offset2, 1, ENC_BIG_ENDIAN);
7079 lsp_flags = tvb_get_uint8(tvb, offset2+1);
7080 rsvp_pi_lsp_flags_tree = proto_tree_add_subtree_format(rsvp_object_tree, tvb, offset2+1, 1,
7081 TREE(TT_PROTECTION_INFO_LSP), NULL, "LSP Flags: 0x%02x -%s%s%s%s%s%s", lsp_flags,
7082 lsp_flags == 0 ? " Unprotected":"",
7083 lsp_flags&0x01 ? " Rerouting":"",
7084 lsp_flags&0x02 ? " Rerouting with extra-traffic":"",
7085 lsp_flags&0x04 ? " 1:N Protection with extra-traffic":"",
7086 lsp_flags&0x08 ? " 1+1 Unidirectional protection":"",
7087 lsp_flags&0x10 ? " 1+1 Bidirectional protection":"");
7088 proto_tree_add_item(rsvp_pi_lsp_flags_tree, hf_rsvp_pi_lsp_flags_full_rerouting,
7089 tvb, offset2+1, 1, ENC_BIG_ENDIAN);
7090 proto_tree_add_item(rsvp_pi_lsp_flags_tree, hf_rsvp_pi_lsp_flags_rerouting_extra,
7091 tvb, offset2+1, 1, ENC_BIG_ENDIAN);
7092 proto_tree_add_item(rsvp_pi_lsp_flags_tree, hf_rsvp_pi_lsp_flags_1_n_protection,
7093 tvb, offset2+1, 1, ENC_BIG_ENDIAN);
7094 proto_tree_add_item(rsvp_pi_lsp_flags_tree, hf_rsvp_pi_lsp_flags_1plus1_unidirectional,
7095 tvb, offset2+1, 1, ENC_BIG_ENDIAN);
7096 proto_tree_add_item(rsvp_pi_lsp_flags_tree, hf_rsvp_pi_lsp_flags_1plus1_bidirectional,
7097 tvb, offset2+1, 1, ENC_BIG_ENDIAN);
7099 link_flags = tvb_get_uint8(tvb, offset2+3);
7100 rsvp_pi_link_flags_tree = proto_tree_add_subtree_format(rsvp_object_tree, tvb, offset2+3, 1,
7101 TREE(TT_PROTECTION_INFO_LINK), NULL, "Link Flags: 0x%02x -%s%s%s%s%s%s", link_flags,
7102 link_flags&0x01 ? " ExtraTraffic":"",
7103 link_flags&0x02 ? " Unprotected":"",
7104 link_flags&0x04 ? " Shared":"",
7105 link_flags&0x08 ? " Dedicated1:1":"",
7106 link_flags&0x10 ? " Dedicated1+1":"",
7107 link_flags&0x20 ? " Enhanced":"");
7108 proto_tree_add_item(rsvp_pi_link_flags_tree, hf_rsvp_pi_link_flags_extra,
7109 tvb, offset2+3, 1, ENC_BIG_ENDIAN);
7110 proto_tree_add_item(rsvp_pi_link_flags_tree, hf_rsvp_pi_link_flags_unprotected,
7111 tvb, offset2+3, 1, ENC_BIG_ENDIAN);
7112 proto_tree_add_item(rsvp_pi_link_flags_tree, hf_rsvp_pi_link_flags_shared,
7113 tvb, offset2+3, 1, ENC_BIG_ENDIAN);
7114 proto_tree_add_item(rsvp_pi_link_flags_tree, hf_rsvp_pi_link_flags_dedicated_1_1,
7115 tvb, offset2+3, 1, ENC_BIG_ENDIAN);
7116 proto_tree_add_item(rsvp_pi_link_flags_tree, hf_rsvp_pi_link_flags_dedicated_1plus1,
7117 tvb, offset2+3, 1, ENC_BIG_ENDIAN);
7118 proto_tree_add_item(rsvp_pi_link_flags_tree, hf_rsvp_pi_link_flags_enhanced,
7119 tvb, offset2+3, 1, ENC_BIG_ENDIAN);
7121 proto_tree_add_item(rsvp_object_tree, hf_rsvp_protection_info_in_place,
7122 tvb, offset2+4, 1, ENC_BIG_ENDIAN);
7123 proto_tree_add_item(rsvp_object_tree, hf_rsvp_protection_info_required,
7124 tvb, offset2+4, 1, ENC_BIG_ENDIAN);
7126 seg_flags = tvb_get_uint8(tvb, offset2+5);
7127 rsvp_pi_seg_flags_tree = proto_tree_add_subtree_format(rsvp_object_tree, tvb, offset2+5, 1,
7128 TREE(TT_PROTECTION_INFO_SEG), NULL, "Segment recovery Flags: 0x%02x - %s%s%s%s%s%s", seg_flags,
7129 seg_flags == 0 ? " Unprotected":"",
7130 seg_flags&0x01 ? " Rerouting":"",
7131 seg_flags&0x02 ? " Rerouting with extra-traffic":"",
7132 seg_flags&0x04 ? " 1:N Protection with extra-traffic":"",
7133 seg_flags&0x08 ? " 1+1 Unidirectional protection":"",
7134 seg_flags&0x10 ? " 1+1 Bidirectional protection":"");
7135 proto_tree_add_item(rsvp_pi_seg_flags_tree, hf_rsvp_pi_seg_flags_full_rerouting,
7136 tvb, offset2+1, 1, ENC_BIG_ENDIAN);
7137 proto_tree_add_item(rsvp_pi_seg_flags_tree, hf_rsvp_pi_seg_flags_rerouting_extra,
7138 tvb, offset2+1, 1, ENC_BIG_ENDIAN);
7139 proto_tree_add_item(rsvp_pi_seg_flags_tree, hf_rsvp_pi_seg_flags_1_n_protection,
7140 tvb, offset2+1, 1, ENC_BIG_ENDIAN);
7141 proto_tree_add_item(rsvp_pi_seg_flags_tree, hf_rsvp_pi_seg_flags_1plus1_unidirectional,
7142 tvb, offset2+1, 1, ENC_BIG_ENDIAN);
7143 proto_tree_add_item(rsvp_pi_seg_flags_tree, hf_rsvp_pi_seg_flags_1plus1_bidirectional,
7144 tvb, offset2+1, 1, ENC_BIG_ENDIAN);
7146 proto_item_append_text(ti, "%s%s%s%s Link:%s%s%s%s%s%s, LSP:%s%s%s%s%s%s.",
7147 flags1&0x80 ? "SecondaryLSP ":"",
7148 flags1&0x40 ? "ProtectingLSP ":"",
7149 flags1&0x20 ? "Notification ":"",
7150 flags1&0x10 ? "OperationalLSP ":"",
7151 link_flags&0x01 ? " ExtraTraffic":"",
7152 link_flags&0x02 ? " Unprotected":"",
7153 link_flags&0x04 ? " Shared":"",
7154 link_flags&0x08 ? " Dedicated1:1":"",
7155 link_flags&0x10 ? " Dedicated1+1":"",
7156 link_flags&0x20 ? " Enhanced":"",
7157 lsp_flags == 0 ? " Unprotected":"",
7158 lsp_flags&0x01 ? " Rerouting":"",
7159 lsp_flags&0x02 ? " Rerouting with extra-traffic":"",
7160 lsp_flags&0x04 ? " 1:N Protection with extra-traffic":"",
7161 lsp_flags&0x08 ? " 1+1 Unidirectional protection":"",
7162 lsp_flags&0x10 ? " 1+1 Bidirectional protection":"");
7163 break;
7165 default:
7166 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_protection_info, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7167 proto_tree_add_item(rsvp_object_tree, hf_rsvp_protection_info_data, tvb, offset2, obj_length - 4, ENC_NA);
7168 break;
7172 /*------------------------------------------------------------------------------
7173 * FAST REROUTE
7174 *------------------------------------------------------------------------------*/
7175 static void
7176 dissect_rsvp_fast_reroute(proto_tree *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
7177 tvbuff_t *tvb,
7178 int offset, int obj_length,
7179 int rsvp_class _U_, int type)
7181 uint8_t flags;
7182 proto_tree *ti2, *rsvp_frr_flags_tree;
7183 proto_tree *hidden_item;
7185 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7186 proto_item_set_hidden(hidden_item);
7188 proto_item_set_text(ti, "FAST_REROUTE: ");
7189 switch(type) {
7190 case 1:
7191 case 7:
7192 if (((type == 1) && (obj_length != 24)) || ((type == 7) && (obj_length != 20))) {
7193 proto_tree_add_expert_format(rsvp_object_tree, pinfo, &ei_rsvp_invalid_length, tvb, offset, obj_length,
7194 "Invalid length: cannot decode");
7195 proto_item_append_text(ti, "Invalid length");
7196 break;
7198 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_fast_reroute, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7199 proto_tree_add_item(rsvp_object_tree, hf_rsvp_fast_reroute_setup_priority, tvb, offset+4, 1, ENC_BIG_ENDIAN);
7200 proto_tree_add_item(rsvp_object_tree, hf_rsvp_fast_reroute_hold_priority, tvb, offset+5, 1, ENC_BIG_ENDIAN);
7201 proto_tree_add_item(rsvp_object_tree, hf_rsvp_fast_reroute_hop_limit, tvb, offset+6, 1, ENC_BIG_ENDIAN);
7203 flags = tvb_get_uint8(tvb, offset+7);
7204 ti2 = proto_tree_add_item(rsvp_object_tree, hf_rsvp_fast_reroute_flags, tvb, offset+7, 1, ENC_BIG_ENDIAN);
7205 rsvp_frr_flags_tree = proto_item_add_subtree(ti2, TREE(TT_FAST_REROUTE_FLAGS));
7206 proto_tree_add_item(rsvp_frr_flags_tree, hf_rsvp_frr_flags_one2one_backup,
7207 tvb, offset+7, 1, ENC_BIG_ENDIAN);
7208 proto_tree_add_item(rsvp_frr_flags_tree, hf_rsvp_frr_flags_facility_backup,
7209 tvb, offset+7, 1, ENC_BIG_ENDIAN);
7210 proto_tree_add_item(rsvp_object_tree, hf_rsvp_fast_reroute_bandwidth, tvb, offset+8, 4, ENC_BIG_ENDIAN);
7211 proto_tree_add_item(rsvp_object_tree, hf_rsvp_fast_reroute_include_any, tvb, offset+12, 4, ENC_BIG_ENDIAN);
7212 proto_tree_add_item(rsvp_object_tree, hf_rsvp_fast_reroute_exclude_any, tvb, offset+16, 4, ENC_BIG_ENDIAN);
7213 if (type == 1) {
7214 proto_tree_add_item(rsvp_object_tree, hf_rsvp_fast_reroute_include_all, tvb, offset+20, 4, ENC_BIG_ENDIAN);
7217 proto_item_append_text(ti, "%s%s",
7218 flags &0x01 ? "One-to-One Backup, " : "",
7219 flags &0x02 ? "Facility Backup" : "");
7220 break;
7222 default:
7223 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_fast_reroute, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7224 proto_tree_add_item(rsvp_object_tree, hf_rsvp_fast_reroute_data, tvb, offset+4, obj_length - 4, ENC_NA);
7225 break;
7229 /*------------------------------------------------------------------------------
7230 * S2L_SUB_LSP
7231 *------------------------------------------------------------------------------*/
7232 static void
7233 dissect_rsvp_s2l_sub_lsp(proto_tree *ti, packet_info* pinfo _U_, proto_tree *rsvp_object_tree,
7234 tvbuff_t *tvb,
7235 int offset, int obj_length,
7236 int rsvp_class _U_, int type)
7239 proto_tree *hidden_item;
7241 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7242 proto_item_set_hidden(hidden_item);
7244 proto_item_set_text(ti, "S2L SUB LSP: ");
7245 switch(type) {
7246 case 1: /* IPv4 */
7247 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_s2l_sub_lsp, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7248 offset += 4;
7250 proto_tree_add_item(rsvp_object_tree, hf_rsvp_s2l_sub_lsp_destination_ipv4_address, tvb, offset, 4, ENC_BIG_ENDIAN);
7251 proto_item_append_text(ti, "IPv4 %s", tvb_ip_to_str(pinfo->pool, tvb, offset));
7252 break;
7254 case 2: /* IPv6 */
7255 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_s2l_sub_lsp, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7256 offset += 4;
7258 proto_tree_add_item(rsvp_object_tree, hf_rsvp_s2l_sub_lsp_destination_ipv6_address, tvb, offset, 16, ENC_NA);
7259 proto_item_append_text(ti, "IPv6 %s", tvb_ip6_to_str(pinfo->pool, tvb, offset));
7260 break;
7262 default:
7263 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_s2l_sub_lsp, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7264 proto_tree_add_item(rsvp_object_tree, hf_rsvp_s2l_sub_lsp_data, tvb, offset+4, obj_length - 4, ENC_NA);
7265 break;
7269 /*------------------------------------------------------------------------------
7270 * DETOUR
7271 *------------------------------------------------------------------------------*/
7272 static void
7273 dissect_rsvp_detour(proto_tree *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
7274 tvbuff_t *tvb,
7275 int offset, int obj_length,
7276 int rsvp_class _U_, int type)
7278 int remaining_length, count;
7279 int iter;
7280 proto_tree *hidden_item;
7282 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7283 proto_item_set_hidden(hidden_item);
7285 proto_item_set_text(ti, "DETOUR: ");
7286 switch(type) {
7287 case 7:
7288 iter = 0;
7289 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_detour, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7290 for (remaining_length = obj_length - 4, count = 1;
7291 remaining_length > 0; remaining_length -= 8, count++) {
7292 if (remaining_length < 8) {
7293 proto_tree_add_expert_format(rsvp_object_tree, pinfo, &ei_rsvp_invalid_length, tvb, offset+remaining_length,
7294 obj_length-remaining_length,
7295 "Invalid length: cannot decode");
7296 proto_item_append_text(ti, "Invalid length");
7297 break;
7299 iter++;
7300 proto_tree_add_ipv4_format(rsvp_object_tree, hf_rsvp_detour_plr_id, tvb, offset+(4*iter), 4,
7301 tvb_get_ntohl(tvb, offset+(4*iter)), "PLR ID %d: %s", count,
7302 tvb_ip_to_str(pinfo->pool, tvb, offset+(4*iter)));
7303 iter++;
7304 proto_tree_add_ipv4_format(rsvp_object_tree, hf_rsvp_detour_avoid_node_id, tvb, offset+(4*iter), 4,
7305 tvb_get_ntohl(tvb, offset+(4*iter)), "Avoid Node ID %d: %s", count,
7306 tvb_ip_to_str(pinfo->pool, tvb, offset+(4*iter)));
7308 break;
7310 default:
7311 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_detour, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7312 proto_tree_add_item(rsvp_object_tree, hf_rsvp_detour_data, tvb, offset+4, obj_length - 4, ENC_NA);
7313 break;
7317 /*------------------------------------------------------------------------------
7318 * DIFFSERV
7319 *------------------------------------------------------------------------------*/
7320 static void
7321 dissect_rsvp_diffserv(proto_tree *ti, proto_tree *rsvp_object_tree,
7322 tvbuff_t *tvb,
7323 int offset, int obj_length,
7324 int rsvp_class _U_, int type)
7326 int mapnb, count;
7327 int *hfindexes[] = {
7328 &hf_rsvp_filter[RSVPF_DIFFSERV_MAP],
7329 &hf_rsvp_filter[RSVPF_DIFFSERV_MAP_EXP],
7330 &hf_rsvp_filter[RSVPF_DIFFSERV_PHBID],
7331 &hf_rsvp_filter[RSVPF_DIFFSERV_PHBID_DSCP],
7332 &hf_rsvp_filter[RSVPF_DIFFSERV_PHBID_CODE],
7333 &hf_rsvp_filter[RSVPF_DIFFSERV_PHBID_BIT14],
7334 &hf_rsvp_filter[RSVPF_DIFFSERV_PHBID_BIT15]
7336 int *etts[] = {
7337 &TREE(TT_DIFFSERV_MAP),
7338 &TREE(TT_DIFFSERV_MAP_PHBID)
7340 proto_tree *hidden_item;
7342 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7343 proto_item_set_hidden(hidden_item);
7345 proto_item_set_text(ti, "DIFFSERV: ");
7346 offset += 3;
7347 switch (type) {
7348 case 1:
7349 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_diffserv, tvb, offset, 1, ENC_BIG_ENDIAN);
7350 proto_tree_add_uint(rsvp_object_tree, hf_rsvp_filter[RSVPF_DIFFSERV_MAPNB],
7351 tvb, offset + 4, 1,
7352 mapnb = tvb_get_uint8(tvb, offset + 4) & 15);
7353 proto_item_append_text(ti, "E-LSP, %u MAP%s", mapnb,
7354 (mapnb == 0) ? "" : "s");
7355 offset += 5;
7357 for (count = 0; count < mapnb; count++) {
7358 dissect_diffserv_mpls_common(tvb, rsvp_object_tree, type,
7359 offset, hfindexes, etts);
7360 offset += 4;
7362 break;
7363 case 2:
7364 proto_item_append_text(ti, "L-LSP");
7365 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_diffserv, tvb, offset, 1, ENC_BIG_ENDIAN);
7366 dissect_diffserv_mpls_common(tvb, rsvp_object_tree, type,
7367 offset + 3, hfindexes, etts);
7368 break;
7369 default:
7370 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_diffserv, tvb, offset, 1, ENC_BIG_ENDIAN);
7371 proto_tree_add_item(rsvp_object_tree, hf_rsvp_diffserv_data, tvb, offset + 1, obj_length - 4, ENC_NA);
7372 break;
7376 /*------------------------------------------------------------------------------
7377 * CLASSTYPE
7378 *------------------------------------------------------------------------------*/
7379 static void
7380 dissect_rsvp_diffserv_aware_te(proto_tree *ti, proto_tree *rsvp_object_tree,
7381 tvbuff_t *tvb,
7382 int offset, int obj_length,
7383 int rsvp_class _U_, int type)
7385 proto_item *hidden_item;
7386 int offset2 = offset + 4;
7387 uint8_t ct = 0;
7389 hidden_item = proto_tree_add_item(rsvp_object_tree,
7390 hf_rsvp_filter[RSVPF_DSTE],
7391 tvb, offset, 8, ENC_NA);
7392 proto_item_set_hidden(hidden_item);
7394 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7395 proto_item_set_hidden(hidden_item);
7397 switch(type) {
7398 case 1:
7399 ct = tvb_get_uint8(tvb, offset2+3);
7400 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_diffserv_aware_te, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7401 proto_tree_add_item(rsvp_object_tree,
7402 hf_rsvp_filter[RSVPF_DSTE_CLASSTYPE],
7403 tvb, offset2+3, 1, ENC_BIG_ENDIAN);
7404 proto_item_set_text(ti, "CLASSTYPE: CT %u", ct);
7405 break;
7406 default:
7407 proto_item_set_text(ti, "CLASSTYPE: (Unknown C-type)");
7408 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_diffserv_aware_te, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7409 proto_tree_add_item(rsvp_object_tree, hf_rsvp_diffserv_aware_te_data, tvb, offset2, obj_length - 4, ENC_NA);
7410 break;
7414 /*----------------------------------------------------------------------------
7415 * VENDOR PRIVATE USE
7416 *---------------------------------------------------------------------------*/
7417 static void
7418 dissect_rsvp_vendor_private_use(proto_tree *ti _U_,
7419 proto_tree *rsvp_object_tree,
7420 tvbuff_t *tvb,
7421 int offset, int obj_length,
7422 int rsvp_class _U_, int type _U_)
7425 * FF: from Section 2, RFC 3936
7427 * "Organization/Vendor Private" ranges refer to values that are
7428 * enterprise-specific; these MUST NOT be registered with IANA. For
7429 * Vendor Private values, the first 4-octet word of the data field MUST
7430 * be an enterprise code [ENT: www.iana.org/assignments/enterprise-numbers]
7431 * (network order) as registered with the IANA SMI Network Management
7432 * Private Enterprise Codes, and the rest of the data thereafter is for
7433 * the private use of the registered enterprise.
7435 proto_item *hidden_item;
7437 hidden_item = proto_tree_add_item(rsvp_object_tree,
7438 hf_rsvp_filter[RSVPF_PRIVATE_OBJ],
7439 tvb, offset, obj_length, ENC_NA);
7440 proto_item_set_hidden(hidden_item);
7442 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7443 proto_item_set_hidden(hidden_item);
7445 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_vendor, tvb, offset + 3, 1, ENC_BIG_ENDIAN);
7446 proto_tree_add_item(rsvp_object_tree,
7447 hf_rsvp_filter[RSVPF_ENT_CODE],
7448 tvb, offset + 4, 4, ENC_BIG_ENDIAN);
7449 proto_tree_add_item(rsvp_object_tree, hf_rsvp_private_data, tvb, offset + 8,
7450 obj_length - 8, ENC_NA);
7453 /*------------------------------------------------------------------------------
7454 * SECONDARY EXPLICIT ROUTE OBJECT
7455 *------------------------------------------------------------------------------*/
7456 static void
7457 dissect_rsvp_secondary_explicit_route(proto_item *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
7458 tvbuff_t *tvb,
7459 int offset, int obj_length,
7460 int rsvp_class, int type)
7462 proto_item *hidden_item;
7464 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7465 proto_item_set_hidden(hidden_item);
7467 proto_item_set_text(ti, "SECONDARY EXPLICIT ROUTE: ");
7468 switch(type) {
7469 case 2: // P2MP
7470 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_secondary_explicit_route, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7472 dissect_rsvp_ro_subobjects(ti, pinfo, rsvp_object_tree, tvb, offset + 4, obj_length, rsvp_class);
7473 break;
7475 default:
7476 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_secondary_explicit_route, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7477 proto_tree_add_item(rsvp_object_tree, hf_rsvp_secondary_explicit_route_data, tvb, offset+4, obj_length - 4, ENC_NA);
7478 break;
7482 /*------------------------------------------------------------------------------
7483 * SECONDARY RECORD ROUTE OBJECT
7484 *------------------------------------------------------------------------------*/
7485 static void
7486 dissect_rsvp_secondary_record_route(proto_item *ti, packet_info* pinfo, proto_tree *rsvp_object_tree,
7487 tvbuff_t *tvb,
7488 int offset, int obj_length,
7489 int rsvp_class, int type)
7491 proto_item *hidden_item;
7493 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7494 proto_item_set_hidden(hidden_item);
7496 proto_item_set_text(ti, "SECONDARY RECORD ROUTE: ");
7497 switch(type) {
7498 case 2: // P2MP
7499 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_secondary_record_route, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7501 dissect_rsvp_ro_subobjects(ti, pinfo, rsvp_object_tree, tvb, offset + 4, obj_length, rsvp_class);
7502 break;
7504 default:
7505 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_secondary_record_route, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7506 proto_tree_add_item(rsvp_object_tree, hf_rsvp_secondary_record_route_data, tvb, offset+4, obj_length - 4, ENC_NA);
7507 break;
7511 /*----------------------------------------------------------------------------
7512 * CALL ATTRIBUTES
7513 *---------------------------------------------------------------------------*/
7514 static void
7515 dissect_rsvp_call_attributes(proto_tree *ti _U_, packet_info* pinfo, proto_tree *rsvp_object_tree,
7516 tvbuff_t *tvb, int offset, int obj_length _U_, int rsvp_class _U_, int type _U_)
7519 int offset2 = offset + 4;
7520 uint16_t tlv_type;
7521 uint16_t tlv_len;
7523 tlv_type = tvb_get_ntohs(tvb, offset2);
7524 tlv_len = tvb_get_ntohs(tvb, offset2+2);
7526 if (tlv_len < 4){
7527 proto_tree_add_expert_format(rsvp_object_tree, pinfo, &ei_rsvp_invalid_length,
7528 tvb, offset2+2, 2, "Invalid TLV length");
7529 return;
7532 switch(tlv_type){
7533 case 2:
7534 proto_tree_add_item(rsvp_object_tree, hf_rsvp_call_attributes_endpont_id, tvb, offset2 + 4, tlv_len - 4, ENC_NA|ENC_ASCII);
7535 break;
7539 /*----------------------------------------------------------------------------
7540 * JUNIPER PROPRIETARY
7541 *---------------------------------------------------------------------------*/
7542 static void
7543 dissect_rsvp_juniper(proto_tree *ti _U_,
7544 proto_tree *rsvp_object_tree,
7545 tvbuff_t *tvb,
7546 int offset, int obj_length,
7547 int rsvp_class _U_, int type)
7550 * Juniper proprietary TLVs:
7551 * According to the tcpdump code, this is of the form:
7552 * #TLVs (2 bytes)
7553 * #Padbytes (2 bytes)
7554 * per TLV:
7555 * type (1 byte)
7556 * length
7557 * value (length-2 bytes)
7558 * padbytes
7561 proto_item *hidden_item;
7563 hidden_item = proto_tree_add_item(rsvp_object_tree,
7564 hf_rsvp_filter[RSVPF_JUNIPER],
7565 tvb, offset, obj_length, ENC_NA);
7566 proto_item_set_hidden(hidden_item);
7568 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7569 proto_item_set_hidden(hidden_item);
7571 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_juniper, tvb, offset + 3, 1, ENC_BIG_ENDIAN);
7572 offset += 4;
7573 if (type == 1) {
7574 unsigned tlvs, pad;
7575 tlvs = tvb_get_ntohs(tvb, offset);
7576 proto_tree_add_item(rsvp_object_tree, hf_rsvp_juniper_numtlvs, tvb,
7577 offset, 2, ENC_BIG_ENDIAN);
7578 offset += 2;
7579 pad = tvb_get_ntohs(tvb, offset);
7580 proto_tree_add_item(rsvp_object_tree, hf_rsvp_juniper_padlength, tvb,
7581 offset, 2, ENC_BIG_ENDIAN);
7582 offset += 2;
7583 while (tlvs > 0) {
7584 uint8_t t, l;
7585 t = tvb_get_uint8(tvb, offset);
7586 proto_tree_add_item(rsvp_object_tree, hf_rsvp_juniper_type, tvb,
7587 offset, 1, ENC_BIG_ENDIAN);
7588 offset += 1;
7589 l = tvb_get_uint8(tvb, offset);
7590 proto_tree_add_item(rsvp_object_tree, hf_rsvp_juniper_length, tvb,
7591 offset, 1, ENC_BIG_ENDIAN);
7592 offset += 1;
7593 switch (t) {
7594 case 0x01:
7595 proto_tree_add_item(rsvp_object_tree, hf_rsvp_juniper_attrib_cos, tvb,
7596 offset, l-2, ENC_BIG_ENDIAN);
7597 offset += (l-2);
7598 break;
7599 case 0x02:
7600 proto_tree_add_item(rsvp_object_tree, hf_rsvp_juniper_attrib_metric1, tvb,
7601 offset, l-2, ENC_BIG_ENDIAN);
7602 offset += (l-2);
7603 break;
7604 case 0x04:
7605 proto_tree_add_item(rsvp_object_tree, hf_rsvp_juniper_attrib_metric2, tvb,
7606 offset, l-2, ENC_BIG_ENDIAN);
7607 offset += (l-2);
7608 break;
7609 case 0x08:
7610 proto_tree_add_item(rsvp_object_tree, hf_rsvp_juniper_attrib_ccc_status, tvb,
7611 offset, l-2, ENC_BIG_ENDIAN);
7612 offset += (l-2);
7613 break;
7614 case 0x10:
7615 proto_tree_add_item(rsvp_object_tree, hf_rsvp_juniper_attrib_path, tvb,
7616 offset, l-2, ENC_BIG_ENDIAN);
7617 offset += (l-2);
7618 break;
7619 default:
7620 proto_tree_add_item(rsvp_object_tree, hf_rsvp_juniper_attrib_unknown, tvb,
7621 offset, l-2, ENC_NA);
7622 offset += (l-2);
7623 break;
7625 tlvs--;
7627 proto_tree_add_item(rsvp_object_tree, hf_rsvp_juniper_pad, tvb,
7628 offset, pad, ENC_NA);
7629 } else if (obj_length > 4) {
7630 proto_tree_add_item(rsvp_object_tree, hf_rsvp_juniper_unknown, tvb,
7631 offset, obj_length, ENC_NA);
7635 /*----------------------------------------------------------------------------
7636 * UNKNOWN
7637 *---------------------------------------------------------------------------*/
7638 static void
7639 dissect_rsvp_unknown(proto_tree *ti _U_,
7640 proto_tree *rsvp_object_tree,
7641 tvbuff_t *tvb,
7642 int offset, int obj_length,
7643 int rsvp_class _U_, int type _U_)
7645 proto_tree *hidden_item;
7647 hidden_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype, tvb, offset+3, 1, ENC_BIG_ENDIAN);
7648 proto_item_set_hidden(hidden_item);
7650 proto_tree_add_item(rsvp_object_tree, hf_rsvp_ctype_unknown, tvb, offset + 3, 1, ENC_BIG_ENDIAN);
7651 if (obj_length > 4) {
7652 proto_tree_add_item(rsvp_object_tree, hf_rsvp_unknown_data, tvb, offset + 4,
7653 obj_length - 4, ENC_NA);
7658 /*------------------------------------------------------------------------------
7659 * Dissect a single RSVP message in a tree
7660 *------------------------------------------------------------------------------*/
7661 static void
7662 // NOLINTNEXTLINE(misc-no-recursion)
7663 dissect_rsvp_msg_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
7664 int tree_mode, rsvp_conversation_info *rsvph, bool e2ei)
7666 proto_tree *rsvp_tree;
7667 proto_tree *rsvp_header_tree;
7668 proto_tree *rsvp_object_tree;
7669 proto_tree *ti, *len_item;
7670 proto_item *hidden_item, *cksum_item;
7671 uint16_t cksum, computed_cksum;
7672 vec_t cksum_vec[1];
7673 int offset = 0;
7674 int len;
7675 uint8_t message_type;
7676 int session_off, tempfilt_off;
7677 int msg_length;
7678 int obj_length;
7679 bool have_integrity_object = false;
7681 offset = 0;
7682 msg_length = tvb_get_ntohs(tvb, 6);
7683 message_type = tvb_get_uint8(tvb, 1);
7685 ti = proto_tree_add_item(tree, proto_rsvp, tvb, offset, msg_length,
7686 ENC_NA);
7687 rsvp_tree = proto_item_add_subtree(ti, tree_mode);
7688 if (e2ei)
7689 proto_item_append_text(rsvp_tree, " (E2E-IGNORE)");
7690 proto_item_append_text(rsvp_tree, ": ");
7691 proto_item_append_text(rsvp_tree, "%s", val_to_str_ext(message_type, &message_type_vals_ext,
7692 "Unknown (%u). "));
7693 find_rsvp_session_tempfilt(tvb, 0, &session_off, &tempfilt_off);
7694 if (session_off)
7695 proto_item_append_text(rsvp_tree, "%s", summary_session(pinfo->pool, tvb, session_off));
7696 if (tempfilt_off)
7697 proto_item_append_text(rsvp_tree, "%s", summary_template(pinfo->pool, tvb, tempfilt_off));
7699 rsvp_header_tree = proto_tree_add_subtree_format(rsvp_tree, tvb, offset, 8,
7700 TREE(TT_HDR), &ti, "RSVP Header. %s",
7701 val_to_str_ext(message_type, &message_type_vals_ext,
7702 "Unknown Message (%u). "));
7703 if (e2ei)
7704 proto_item_append_text(ti, " (E2E-IGNORE)");
7706 proto_tree_add_item(rsvp_header_tree, hf_rsvp_version, tvb, offset, 1, ENC_BIG_ENDIAN);
7707 proto_tree_add_item(rsvp_header_tree, hf_rsvp_flags, tvb, offset, 1, ENC_BIG_ENDIAN);
7708 proto_tree_add_uint(rsvp_header_tree, hf_rsvp_filter[RSVPF_MSG], tvb,
7709 offset+1, 1, message_type);
7710 switch (RSVPF_MSG + message_type) {
7712 case RSVPF_PATH:
7713 case RSVPF_RESV:
7714 case RSVPF_PATHERR:
7715 case RSVPF_RESVERR:
7716 case RSVPF_PATHTEAR:
7717 case RSVPF_RESVTEAR:
7718 case RSVPF_RCONFIRM:
7719 case RSVPF_RTEARCONFIRM:
7720 case RSVPF_BUNDLE:
7721 case RSVPF_ACK:
7722 case RSVPF_SREFRESH:
7723 case RSVPF_HELLO:
7724 case RSVPF_NOTIFY:
7725 hidden_item = proto_tree_add_boolean(rsvp_header_tree, hf_rsvp_filter[RSVPF_MSG + message_type], tvb,
7726 offset+1, 1, 1);
7727 proto_item_set_hidden(hidden_item);
7728 break;
7731 cksum = tvb_get_ntohs(tvb, offset+2);
7732 cksum_item = proto_tree_add_item(rsvp_header_tree, hf_rsvp_message_checksum, tvb, offset+2, 2, ENC_BIG_ENDIAN);
7734 proto_tree_add_item(rsvp_header_tree, hf_rsvp_sending_ttl, tvb, offset+4, 1, ENC_BIG_ENDIAN);
7735 proto_tree_add_item(rsvp_header_tree, hf_rsvp_message_length, tvb, offset+6, 2, ENC_BIG_ENDIAN);
7737 offset = 8;
7738 len = 8;
7740 if (message_type == RSVP_MSG_BUNDLE) {
7741 /* Bundle message. Dissect component messages */
7742 if (rsvp_bundle_dissect) {
7743 int len2 = 8;
7744 while (len2 < msg_length) {
7745 int sub_len;
7746 tvbuff_t *tvb_sub;
7747 sub_len = tvb_get_ntohs(tvb, len2+6);
7748 tvb_sub = tvb_new_subset_length(tvb, len2, sub_len);
7749 increment_dissection_depth(pinfo);
7750 dissect_rsvp_msg_tree(tvb_sub, pinfo, rsvp_tree, TREE(TT_BUNDLE_COMPMSG), rsvph, e2ei);
7751 decrement_dissection_depth(pinfo);
7752 len2 += sub_len;
7754 } else {
7755 proto_tree_add_expert(rsvp_tree, pinfo, &ei_rsvp_bundle_component_msg, tvb, offset, msg_length - len);
7757 return;
7760 while (len < msg_length) {
7761 uint8_t rsvp_class;
7762 uint8_t type;
7764 obj_length = tvb_get_ntohs(tvb, offset);
7765 rsvp_class = tvb_get_uint8(tvb, offset+2);
7766 type = tvb_get_uint8(tvb, offset+3);
7767 ti = proto_tree_add_item(rsvp_tree, hf_rsvp_filter[rsvp_class_to_filter_num(rsvp_class)],
7768 tvb, offset, obj_length, ENC_BIG_ENDIAN);
7769 rsvp_object_tree = proto_item_add_subtree(ti, TREE(rsvp_class_to_tree_type(rsvp_class)));
7770 len_item = proto_tree_add_item(rsvp_object_tree, hf_rsvp_length, tvb, offset, 2, ENC_BIG_ENDIAN);
7771 if (obj_length < 4) {
7772 expert_add_info_format(pinfo, len_item, &ei_rsvp_invalid_length,
7773 "Length: %u (bogus, must be >= 4)", obj_length);
7774 break;
7776 proto_tree_add_uint(rsvp_object_tree, hf_rsvp_filter[RSVPF_OBJECT], tvb,
7777 offset+2, 1, rsvp_class);
7779 switch(rsvp_class) {
7781 case RSVP_CLASS_SESSION:
7782 dissect_rsvp_session(pinfo, ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type, rsvph);
7783 break;
7785 case RSVP_CLASS_HOP:
7786 dissect_rsvp_hop(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7787 break;
7789 case RSVP_CLASS_TIME_VALUES:
7790 dissect_rsvp_time_values(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7791 break;
7793 case RSVP_CLASS_ERROR:
7794 dissect_rsvp_error(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7795 break;
7797 case RSVP_CLASS_SCOPE:
7798 dissect_rsvp_scope(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7799 break;
7801 case RSVP_CLASS_STYLE:
7802 dissect_rsvp_style(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7803 break;
7805 case RSVP_CLASS_CONFIRM:
7806 dissect_rsvp_confirm(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7807 break;
7809 case RSVP_CLASS_SENDER_TEMPLATE:
7810 case RSVP_CLASS_FILTER_SPEC:
7811 dissect_rsvp_template_filter(pinfo, ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type, rsvph);
7812 break;
7814 case RSVP_CLASS_SENDER_TSPEC:
7815 dissect_rsvp_tspec(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7816 break;
7818 case RSVP_CLASS_FLOWSPEC:
7819 dissect_rsvp_flowspec(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7820 break;
7822 case RSVP_CLASS_ADSPEC:
7823 dissect_rsvp_adspec(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7824 break;
7826 case RSVP_CLASS_INTEGRITY:
7827 have_integrity_object = true;
7828 dissect_rsvp_integrity(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7829 break;
7831 case RSVP_CLASS_POLICY:
7832 dissect_rsvp_policy(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7833 break;
7835 case RSVP_CLASS_LABEL_REQUEST:
7836 dissect_rsvp_label_request(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7837 break;
7839 case RSVP_CLASS_RECOVERY_LABEL:
7840 case RSVP_CLASS_UPSTREAM_LABEL:
7841 case RSVP_CLASS_SUGGESTED_LABEL:
7842 case RSVP_CLASS_LABEL:
7843 dissect_rsvp_label(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7844 break;
7846 case RSVP_CLASS_LABEL_SET:
7847 dissect_rsvp_label_set(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7848 break;
7850 case RSVP_CLASS_SESSION_ATTRIBUTE:
7851 dissect_rsvp_session_attribute(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7852 break;
7854 case RSVP_CLASS_EXPLICIT_ROUTE:
7855 dissect_rsvp_explicit_route(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7856 break;
7858 case RSVP_CLASS_RECORD_ROUTE:
7859 dissect_rsvp_record_route(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7860 break;
7862 case RSVP_CLASS_EXCLUDE_ROUTE:
7863 dissect_rsvp_exclude_route(ti, pinfo, rsvp_object_tree, tvb, offset,
7864 obj_length, rsvp_class, type);
7865 break;
7867 case RSVP_CLASS_MESSAGE_ID:
7868 dissect_rsvp_message_id(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7869 break;
7871 case RSVP_CLASS_MESSAGE_ID_ACK:
7872 dissect_rsvp_message_id_ack(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7873 break;
7875 case RSVP_CLASS_MESSAGE_ID_LIST:
7876 dissect_rsvp_message_id_list(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7877 break;
7879 case RSVP_CLASS_HELLO:
7880 dissect_rsvp_hello(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7881 break;
7883 case RSVP_CLASS_DCLASS:
7884 dissect_rsvp_dclass(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7885 break;
7887 case RSVP_CLASS_ADMIN_STATUS:
7888 dissect_rsvp_admin_status(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7889 break;
7891 case RSVP_CLASS_LSP_ATTRIBUTES:
7892 case RSVP_CLASS_LSP_REQUIRED_ATTRIBUTES:
7893 dissect_rsvp_lsp_attributes(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7894 break;
7896 case RSVP_CLASS_ASSOCIATION:
7897 dissect_rsvp_association(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7898 break;
7900 case RSVP_CLASS_LSP_TUNNEL_IF_ID:
7901 dissect_rsvp_lsp_tunnel_if_id(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7902 break;
7904 case RSVP_CLASS_NOTIFY_REQUEST:
7905 dissect_rsvp_notify_request(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7906 break;
7908 case RSVP_CLASS_GENERALIZED_UNI:
7909 dissect_rsvp_gen_uni(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type, rsvph);
7910 break;
7912 case RSVP_CLASS_CALL_ID:
7913 dissect_rsvp_call_id(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7914 break;
7916 case RSVP_CLASS_3GPP2_OBJECT:
7917 dissect_rsvp_3gpp_object(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7918 break;
7920 case RSVP_CLASS_RESTART_CAP:
7921 dissect_rsvp_restart_cap(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7922 break;
7924 case RSVP_CLASS_LINK_CAP:
7925 dissect_rsvp_link_cap(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7926 break;
7928 case RSVP_CLASS_CAPABILITY:
7929 dissect_rsvp_capability(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7930 break;
7932 case RSVP_CLASS_PROTECTION:
7933 dissect_rsvp_protection_info(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7934 break;
7936 case RSVP_CLASS_FAST_REROUTE:
7937 dissect_rsvp_fast_reroute(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7938 break;
7940 case RSVP_CLASS_S2L_SUB_LSP:
7941 dissect_rsvp_s2l_sub_lsp(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7942 break;
7944 case RSVP_CLASS_DETOUR:
7945 dissect_rsvp_detour(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7946 break;
7948 case RSVP_CLASS_DIFFSERV:
7949 dissect_rsvp_diffserv(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7950 break;
7952 case RSVP_CLASS_CLASSTYPE:
7953 dissect_rsvp_diffserv_aware_te(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7954 break;
7956 case RSVP_CLASS_VENDOR_PRIVATE_1:
7957 case RSVP_CLASS_VENDOR_PRIVATE_2:
7958 case RSVP_CLASS_VENDOR_PRIVATE_3:
7959 case RSVP_CLASS_VENDOR_PRIVATE_4:
7960 case RSVP_CLASS_VENDOR_PRIVATE_5:
7961 case RSVP_CLASS_VENDOR_PRIVATE_6:
7962 case RSVP_CLASS_VENDOR_PRIVATE_7:
7963 case RSVP_CLASS_VENDOR_PRIVATE_8:
7964 case RSVP_CLASS_VENDOR_PRIVATE_9:
7965 case RSVP_CLASS_VENDOR_PRIVATE_10:
7966 case RSVP_CLASS_VENDOR_PRIVATE_11:
7967 case RSVP_CLASS_VENDOR_PRIVATE_12:
7968 dissect_rsvp_vendor_private_use(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7969 break;
7971 case RSVP_CLASS_SECONDARY_EXPLICIT_ROUTE:
7972 dissect_rsvp_secondary_explicit_route(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7973 break;
7974 case RSVP_CLASS_SECONDARY_RECORD_ROUTE:
7975 dissect_rsvp_secondary_record_route(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7976 break;
7978 case RSVP_CLASS_CALL_ATTRIBUTES:
7979 dissect_rsvp_call_attributes(ti, pinfo, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7980 break;
7982 case RSVP_CLASS_JUNIPER_PROPERTIES:
7983 dissect_rsvp_juniper(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7984 break;
7985 case RSVP_CLASS_NULL:
7986 default:
7987 dissect_rsvp_unknown(ti, rsvp_object_tree, tvb, offset, obj_length, rsvp_class, type);
7988 break;
7991 offset += obj_length;
7992 len += obj_length;
7995 /* We delay the checksum check until here so we know if the message
7996 * contained an integrity object or not */
7997 if (!pinfo->fragmented && ((int) tvb_captured_length(tvb) >= msg_length)) {
7998 /* The packet isn't part of a fragmented datagram and isn't
7999 truncated, so we can checksum it. */
8000 SET_CKSUM_VEC_TVB(cksum_vec[0], tvb, 0, msg_length);
8001 computed_cksum = in_cksum(&cksum_vec[0], 1);
8003 * in_cksum() should never return 0xFFFF here, because, to quote
8004 * RFC 1624 section 3 "Discussion":
8006 * In one's complement, there are two representations of
8007 * zero: the all zero and the all one bit values, often
8008 * referred to as +0 and -0. One's complement addition
8009 * of non-zero inputs can produce -0 as a result, but
8010 * never +0. Since there is guaranteed to be at least
8011 * one non-zero field in the IP header, and the checksum
8012 * field in the protocol header is the complement of the
8013 * sum, the checksum field can never contain ~(+0), which
8014 * is -0 (0xFFFF). It can, however, contain ~(-0), which
8015 * is +0 (0x0000).
8017 * RFC 1624 is discussing the checksum of the *IPv4* header,
8018 * where the "version" field is 4, ensuring that, in a valid
8019 * IPv4 header, there is at least one non-zero field, but it
8020 * also applies to an RSVP packet, because header includes a
8021 * version field with the value 1, so at least one field in
8022 * the checksummed data is non-zero.
8024 * in_cksum() returns the negation of the one's-complement
8025 * sum of all the data handed to it, and that data won't be
8026 * all zero, so the sum won't be 0 (+0), and thus the negation
8027 * won't be -0, i.e. won't be 0xFFFF.
8029 if (computed_cksum == 0) {
8030 proto_item_append_text(cksum_item, " [correct]");
8031 } else if (cksum == 0 && have_integrity_object) {
8032 proto_item_append_text(cksum_item, " [ignored, integrity object used]");
8033 } else {
8034 proto_item_append_text(cksum_item, " [incorrect, should be 0x%04x]",
8035 in_cksum_shouldbe(cksum, computed_cksum));
8040 /*------------------------------------------------------------------------------
8041 * The main loop
8042 *------------------------------------------------------------------------------*/
8043 static void
8044 dissect_rsvp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, bool e2ei)
8046 uint8_t message_type;
8047 int session_off, tempfilt_off;
8049 rsvp_conversation_info *rsvph;
8050 conversation_t *conversation;
8051 struct rsvp_request_key request_key, *new_request_key;
8052 struct rsvp_request_val *request_val;
8054 col_clear(pinfo->cinfo, COL_INFO);
8056 message_type = tvb_get_uint8(tvb, 1);
8058 rsvph = wmem_new0(pinfo->pool, rsvp_conversation_info);
8060 /* Copy over the source and destination addresses from the pinfo structure */
8061 set_address(&rsvph->source, pinfo->src.type, pinfo->src.len, pinfo->src.data);
8062 set_address(&rsvph->destination, pinfo->dst.type, pinfo->dst.len, pinfo->dst.data);
8064 col_add_str(pinfo->cinfo, COL_INFO,
8065 val_to_str_ext(message_type, &message_type_vals_ext, "Unknown (%u). "));
8067 if (message_type == RSVP_MSG_BUNDLE) {
8068 col_set_str(pinfo->cinfo, COL_INFO,
8069 rsvp_bundle_dissect ?
8070 "Component Messages Dissected" :
8071 "Component Messages Not Dissected");
8072 } else {
8073 find_rsvp_session_tempfilt(tvb, 0, &session_off, &tempfilt_off);
8074 if (session_off)
8075 col_append_str(pinfo->cinfo, COL_INFO, summary_session(pinfo->pool, tvb, session_off));
8076 if (tempfilt_off)
8077 col_append_str(pinfo->cinfo, COL_INFO, summary_template(pinfo->pool, tvb, tempfilt_off));
8080 dissect_rsvp_msg_tree(tvb, pinfo, tree, TREE(TT_RSVP), rsvph, e2ei);
8082 /* ACK, SREFRESH and HELLO messages don't have any associated SESSION and,
8083 therefore, no conversation */
8084 if ((message_type == RSVP_MSG_ACK) ||
8085 (message_type == RSVP_MSG_SREFRESH) ||
8086 (message_type == RSVP_MSG_HELLO))
8087 return;
8089 /* Find out what conversation this packet is part of. */
8090 conversation = find_or_create_conversation(pinfo);
8092 /* Now build the request key */
8093 memset(&request_key, 0, sizeof(request_key));
8094 request_key.conversation = conversation->conv_index;
8095 request_key.session_type = rsvph->session_type;
8097 switch (request_key.session_type) {
8098 case RSVP_SESSION_TYPE_IPV4:
8099 set_address(&request_key.u.session_ipv4.destination,
8100 rsvph->destination.type, rsvph->destination.len,
8101 rsvph->destination.data);
8102 request_key.u.session_ipv4.protocol = rsvph->protocol;
8103 request_key.u.session_ipv4.udp_dest_port = rsvph->udp_dest_port;
8104 break;
8106 case RSVP_SESSION_TYPE_IPV6:
8107 /* Not supported yet */
8108 break;
8110 case RSVP_SESSION_TYPE_IPV4_LSP:
8111 set_address(&request_key.u.session_ipv4_lsp.destination,
8112 rsvph->destination.type, rsvph->destination.len,
8113 rsvph->destination.data);
8114 request_key.u.session_ipv4_lsp.udp_dest_port = rsvph->udp_dest_port;
8115 request_key.u.session_ipv4_lsp.ext_tunnel_id = rsvph->ext_tunnel_id;
8116 break;
8118 case RSVP_SESSION_TYPE_AGGREGATE_IPV4:
8119 set_address(&request_key.u.session_agg_ipv4.destination,
8120 rsvph->destination.type, rsvph->destination.len,
8121 rsvph->destination.data);
8122 request_key.u.session_agg_ipv4.dscp = rsvph->dscp;
8123 break;
8125 case RSVP_SESSION_TYPE_IPV4_UNI:
8126 set_address(&request_key.u.session_ipv4_uni.destination,
8127 rsvph->destination.type, rsvph->destination.len,
8128 rsvph->destination.data);
8129 request_key.u.session_ipv4_uni.udp_dest_port = rsvph->udp_dest_port;
8130 request_key.u.session_ipv4_uni.ext_tunnel_id = rsvph->ext_tunnel_id;
8131 break;
8133 case RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV4:
8134 set_address(&request_key.u.session_ipv4_p2mp_lsp.destination,
8135 rsvph->destination.type, rsvph->destination.len,
8136 rsvph->destination.data);
8137 request_key.u.session_ipv4_p2mp_lsp.udp_dest_port = rsvph->udp_dest_port;
8138 request_key.u.session_ipv4_p2mp_lsp.ext_tunnel_id = rsvph->ext_tunnel_id;
8139 break;
8141 case RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV6:
8142 set_address(&request_key.u.session_ipv6_p2mp_lsp.destination,
8143 rsvph->destination.type, rsvph->destination.len,
8144 rsvph->destination.data);
8145 request_key.u.session_ipv6_p2mp_lsp.udp_dest_port = rsvph->udp_dest_port;
8146 request_key.u.session_ipv6_p2mp_lsp.ext_tunnel_id = rsvph->ext_tunnel_id_ipv6_pre;
8147 break;
8149 case RSVP_SESSION_TYPE_IPV4_E_NNI:
8150 set_address(&request_key.u.session_ipv4_enni.destination,
8151 rsvph->destination.type, rsvph->destination.len,
8152 rsvph->destination.data);
8153 request_key.u.session_ipv4_enni.udp_dest_port = rsvph->udp_dest_port;
8154 request_key.u.session_ipv4_enni.ext_tunnel_id = rsvph->ext_tunnel_id;
8155 break;
8156 default:
8157 /* This should never happen. */
8158 proto_tree_add_expert(tree, pinfo, &ei_rsvp_session_type, tvb, 0, 0);
8159 break;
8162 copy_address_shallow(&request_key.source_info.source, &rsvph->source);
8163 request_key.source_info.udp_source_port = rsvph->udp_source_port;
8165 /* See if a request with this key already exists */
8166 request_val =
8167 (struct rsvp_request_val *) wmem_map_lookup(rsvp_request_hash,
8168 &request_key);
8170 /* If not, insert the new request key into the hash table */
8171 if (!request_val) {
8172 new_request_key = (struct rsvp_request_key *)wmem_memdup(
8173 wmem_file_scope(), &request_key, sizeof(struct rsvp_request_key));
8174 switch (request_key.session_type) {
8175 case RSVP_SESSION_TYPE_IPV4:
8176 copy_address_wmem(wmem_file_scope(), &new_request_key->u.session_ipv4.destination,
8177 &request_key.u.session_ipv4.destination);
8178 break;
8179 case RSVP_SESSION_TYPE_IPV4_LSP:
8180 copy_address_wmem(wmem_file_scope(), &new_request_key->u.session_ipv4_lsp.destination,
8181 &request_key.u.session_ipv4_lsp.destination);
8182 break;
8183 case RSVP_SESSION_TYPE_AGGREGATE_IPV4:
8184 copy_address_wmem(wmem_file_scope(), &new_request_key->u.session_agg_ipv4.destination,
8185 &request_key.u.session_agg_ipv4.destination);
8186 break;
8187 case RSVP_SESSION_TYPE_IPV4_UNI:
8188 copy_address_wmem(wmem_file_scope(), &new_request_key->u.session_ipv4_uni.destination,
8189 &request_key.u.session_ipv4_uni.destination);
8190 break;
8191 case RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV4:
8192 copy_address_wmem(wmem_file_scope(), &new_request_key->u.session_ipv4_p2mp_lsp.destination,
8193 &request_key.u.session_ipv4_p2mp_lsp.destination);
8194 break;
8195 case RSVP_SESSION_TYPE_P2MP_LSP_TUNNEL_IPV6:
8196 copy_address_wmem(wmem_file_scope(), &new_request_key->u.session_ipv6_p2mp_lsp.destination,
8197 &request_key.u.session_ipv6_p2mp_lsp.destination);
8198 break;
8199 case RSVP_SESSION_TYPE_IPV4_E_NNI:
8200 copy_address_wmem(wmem_file_scope(), &new_request_key->u.session_ipv4_enni.destination,
8201 &request_key.u.session_ipv4_enni.destination);
8202 break;
8203 default:
8204 break;
8206 copy_address_wmem(wmem_file_scope(), &new_request_key->source_info.source, &rsvph->source);
8208 request_val = wmem_new(wmem_file_scope(), struct rsvp_request_val);
8209 request_val->value = conversation->conv_index;
8211 wmem_map_insert(rsvp_request_hash, new_request_key, request_val);
8214 tap_queue_packet(rsvp_tap, pinfo, rsvph);
8217 static int
8218 dissect_rsvp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
8220 col_set_str(pinfo->cinfo, COL_PROTOCOL, "RSVP");
8222 dissect_rsvp_common(tvb, pinfo, tree, false);
8223 return tvb_captured_length(tvb);
8226 static int
8227 dissect_rsvp_e2ei(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
8229 col_set_str(pinfo->cinfo, COL_PROTOCOL, "RSVP-E2EI");
8231 dissect_rsvp_common(tvb, pinfo, tree, true);
8232 return tvb_captured_length(tvb);
8235 static void
8236 register_rsvp_prefs(void)
8238 module_t *rsvp_module;
8240 rsvp_module = prefs_register_protocol(proto_rsvp, NULL);
8241 prefs_register_bool_preference(
8242 rsvp_module, "process_bundle",
8243 "Dissect sub-messages in BUNDLE message",
8244 "Specifies whether Wireshark should decode and display sub-messages within BUNDLE messages",
8245 &rsvp_bundle_dissect);
8246 prefs_register_enum_preference(
8247 rsvp_module, "generalized_label_options",
8248 "Dissect generalized labels as",
8249 "Specifies how Wireshark should dissect generalized labels",
8250 (int *)&rsvp_generalized_label_option,
8251 rsvp_generalized_label_options,
8252 false);
8255 void
8256 proto_register_rsvp(void)
8258 int i;
8260 static hf_register_info rsvpf_info[] = {
8262 /* Message type number */
8263 {&hf_rsvp_filter[RSVPF_MSG],
8264 { "Message Type", "rsvp.msg",
8265 FT_UINT8, BASE_DEC | BASE_EXT_STRING, &message_type_vals_ext, 0x0,
8266 NULL, HFILL }
8269 /* Message type shorthands */
8270 {&hf_rsvp_filter[RSVPF_PATH],
8271 { "Path Message", "rsvp.path",
8272 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8273 NULL, HFILL }
8276 {&hf_rsvp_filter[RSVPF_RESV],
8277 { "Resv Message", "rsvp.resv",
8278 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8279 NULL, HFILL }
8282 {&hf_rsvp_filter[RSVPF_PATHERR],
8283 { "Path Error Message", "rsvp.perr",
8284 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8285 NULL, HFILL }
8288 {&hf_rsvp_filter[RSVPF_RESVERR],
8289 { "Resv Error Message", "rsvp.rerr",
8290 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8291 NULL, HFILL }
8294 {&hf_rsvp_filter[RSVPF_PATHTEAR],
8295 { "Path Tear Message", "rsvp.ptear",
8296 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8297 NULL, HFILL }
8300 {&hf_rsvp_filter[RSVPF_RESVTEAR],
8301 { "Resv Tear Message", "rsvp.rtear",
8302 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8303 NULL, HFILL }
8306 {&hf_rsvp_filter[RSVPF_RCONFIRM],
8307 { "Resv Confirm Message", "rsvp.resvconf",
8308 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8309 NULL, HFILL }
8312 {&hf_rsvp_filter[RSVPF_RTEARCONFIRM],
8313 { "Resv Tear Confirm Message", "rsvp.rtearconf",
8314 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8315 NULL, HFILL }
8318 {&hf_rsvp_filter[RSVPF_BUNDLE],
8319 { "Bundle Message", "rsvp.bundle",
8320 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8321 NULL, HFILL }
8324 {&hf_rsvp_filter[RSVPF_ACK],
8325 { "Ack Message", "rsvp.ack",
8326 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8327 NULL, HFILL }
8330 {&hf_rsvp_filter[RSVPF_SREFRESH],
8331 { "Srefresh Message", "rsvp.srefresh",
8332 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8333 NULL, HFILL }
8336 {&hf_rsvp_filter[RSVPF_HELLO],
8337 { "HELLO Message", "rsvp.hello",
8338 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8339 NULL, HFILL }
8342 /* Object class */
8343 {&hf_rsvp_filter[RSVPF_OBJECT],
8344 { "Object class", "rsvp.object",
8345 FT_UINT8, BASE_DEC | BASE_EXT_STRING, &rsvp_class_vals_ext, 0x0,
8346 NULL, HFILL }
8349 {&hf_rsvp_ctype,
8350 { "C-type", "rsvp.ctype",
8351 FT_UINT32, BASE_DEC, NULL, 0x0,
8352 NULL, HFILL }
8355 {&hf_rsvp_ctype_session,
8356 { "C-type", "rsvp.ctype.session",
8357 FT_UINT32, BASE_DEC, VALS(rsvp_c_type_session_vals), 0x0,
8358 NULL, HFILL }
8361 {&hf_rsvp_ctype_3gpp_object,
8362 { "C-type", "rsvp.ctype.3gpp_object",
8363 FT_UINT32, BASE_DEC, NULL, 0x0,
8364 NULL, HFILL }
8367 {&hf_rsvp_ctype_restart_cap,
8368 { "C-type", "rsvp.ctype.restart_cap",
8369 FT_UINT32, BASE_DEC, NULL, 0x0,
8370 NULL, HFILL }
8373 {&hf_rsvp_ctype_link_cap,
8374 { "C-type", "rsvp.ctype.link_cap",
8375 FT_UINT32, BASE_DEC, NULL, 0x0,
8376 NULL, HFILL }
8379 {&hf_rsvp_ctype_capability,
8380 { "C-type", "rsvp.ctype.capability",
8381 FT_UINT32, BASE_DEC, NULL, 0x0,
8382 NULL, HFILL }
8385 {&hf_rsvp_ctype_protection_info,
8386 { "C-type", "rsvp.ctype.protection_info",
8387 FT_UINT32, BASE_DEC, NULL, 0x0,
8388 NULL, HFILL }
8391 {&hf_rsvp_ctype_fast_reroute,
8392 { "C-type", "rsvp.ctype.fast_reroute",
8393 FT_UINT32, BASE_DEC, NULL, 0x0,
8394 NULL, HFILL }
8397 {&hf_rsvp_ctype_detour,
8398 { "C-type", "rsvp.ctype.detour",
8399 FT_UINT32, BASE_DEC, NULL, 0x0,
8400 NULL, HFILL }
8403 {&hf_rsvp_ctype_diffserv,
8404 { "C-type", "rsvp.ctype.diffserv",
8405 FT_UINT32, BASE_DEC, VALS(rsvp_c_type_diffserv_vals), 0x0,
8406 NULL, HFILL }
8409 {&hf_rsvp_ctype_diffserv_aware_te,
8410 { "C-type", "rsvp.ctype.diffserv_aware_te",
8411 FT_UINT32, BASE_DEC, NULL, 0x0,
8412 NULL, HFILL }
8415 {&hf_rsvp_ctype_vendor,
8416 { "C-type", "rsvp.ctype.vendor",
8417 FT_UINT32, BASE_DEC, NULL, 0x0,
8418 NULL, HFILL }
8421 {&hf_rsvp_ctype_juniper,
8422 { "C-type", "rsvp.ctype.juniper",
8423 FT_UINT32, BASE_DEC, NULL, 0x0,
8424 NULL, HFILL }
8427 {&hf_rsvp_ctype_unknown,
8428 { "C-type", "rsvp.ctype.unknown",
8429 FT_UINT32, BASE_DEC, NULL, 0x0,
8430 NULL, HFILL }
8433 {&hf_rsvp_ctype_label,
8434 { "C-type", "rsvp.ctype.label",
8435 FT_UINT32, BASE_DEC, VALS(rsvp_c_type_label_vals), 0x0,
8436 NULL, HFILL }
8439 {&hf_rsvp_ctype_notify_request,
8440 { "C-type", "rsvp.ctype.notify_request",
8441 FT_UINT32, BASE_DEC, VALS(rsvp_c_type_notify_request_vals), 0x0,
8442 NULL, HFILL }
8445 {&hf_rsvp_ctype_generalized_uni,
8446 { "C-type", "rsvp.ctype.generalized_uni",
8447 FT_UINT32, BASE_DEC, NULL, 0x0,
8448 NULL, HFILL }
8451 {&hf_rsvp_parameter,
8452 { "Parameter", "rsvp.parameter",
8453 FT_UINT8, BASE_DEC|BASE_EXT_STRING, &svc_vals_ext, 0x0,
8454 NULL, HFILL }
8457 {&hf_rsvp_parameter_flags,
8458 { "Parameter flags", "rsvp.parameter_flags",
8459 FT_UINT8, BASE_HEX, NULL, 0x0,
8460 NULL, HFILL }
8463 {&hf_rsvp_parameter_length,
8464 { "Parameter length", "rsvp.parameter_length",
8465 FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_word_not_including_header), 0x0,
8466 NULL, HFILL }
8469 {&hf_rsvp_error_value,
8470 { "Error value", "rsvp.error_value",
8471 FT_UINT16, BASE_DEC, NULL, 0x0,
8472 NULL, HFILL }
8475 {&hf_rsvp_class,
8476 { "Class", "rsvp.class",
8477 FT_UINT16, BASE_DEC, NULL, 0x0,
8478 NULL, HFILL }
8481 {&hf_rsvp_class_length,
8482 { "Length", "rsvp.class_length",
8483 FT_UINT16, BASE_DEC, NULL, 0x0,
8484 NULL, HFILL }
8487 {&hf_rsvp_reserved,
8488 { "Reserved", "rsvp.ctype.reserved",
8489 FT_BYTES, BASE_NONE, NULL, 0x0,
8490 NULL, HFILL }
8493 {&hf_rsvp_switching_granularity,
8494 { "Switching granularity", "rsvp.switching_granularity",
8495 FT_UINT16, BASE_DEC, VALS(rsvp_switching_granularity_vals), 0x0,
8496 NULL, HFILL }
8499 {&hf_rsvp_filter[RSVPF_NOTIFY],
8500 { "Notify Message", "rsvp.notify",
8501 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
8502 NULL, HFILL }
8505 /* Object present shorthands */
8506 {&hf_rsvp_filter[RSVPF_SESSION],
8507 { "SESSION", "rsvp.session",
8508 FT_NONE, BASE_NONE, NULL, 0x0,
8509 NULL, HFILL }
8512 {&hf_rsvp_filter[RSVPF_HOP],
8513 { "HOP", "rsvp.hop",
8514 FT_NONE, BASE_NONE, NULL, 0x0,
8515 NULL, HFILL }
8518 {&hf_rsvp_filter[RSVPF_HELLO_OBJ],
8519 { "HELLO Request/Ack", "rsvp.hello_obj",
8520 FT_NONE, BASE_NONE, NULL, 0x0,
8521 NULL, HFILL }
8524 {&hf_rsvp_filter[RSVPF_INTEGRITY],
8525 { "INTEGRITY", "rsvp.integrity",
8526 FT_NONE, BASE_NONE, NULL, 0x0,
8527 NULL, HFILL }
8530 {&hf_rsvp_filter[RSVPF_TIME_VALUES],
8531 { "TIME VALUES", "rsvp.time",
8532 FT_NONE, BASE_NONE, NULL, 0x0,
8533 NULL, HFILL }
8536 {&hf_rsvp_filter[RSVPF_ERROR],
8537 { "ERROR", "rsvp.error",
8538 FT_NONE, BASE_NONE, NULL, 0x0,
8539 NULL, HFILL }
8542 {&hf_rsvp_filter[RSVPF_SCOPE],
8543 { "SCOPE", "rsvp.scope",
8544 FT_NONE, BASE_NONE, NULL, 0x0,
8545 NULL, HFILL }
8548 {&hf_rsvp_filter[RSVPF_STYLE],
8549 { "STYLE", "rsvp.style",
8550 FT_NONE, BASE_NONE, NULL, 0x0,
8551 NULL, HFILL }
8554 {&hf_rsvp_filter[RSVPF_FLOWSPEC],
8555 { "FLOWSPEC", "rsvp.flowspec",
8556 FT_NONE, BASE_NONE, NULL, 0x0,
8557 NULL, HFILL }
8560 {&hf_rsvp_filter[RSVPF_FILTER_SPEC],
8561 { "FILTERSPEC", "rsvp.filter",
8562 FT_NONE, BASE_NONE, NULL, 0x0,
8563 NULL, HFILL }
8566 {&hf_rsvp_filter[RSVPF_SENDER],
8567 { "SENDER TEMPLATE", "rsvp.sender",
8568 FT_NONE, BASE_NONE, NULL, 0x0,
8569 NULL, HFILL }
8572 {&hf_rsvp_filter[RSVPF_TSPEC],
8573 { "SENDER TSPEC", "rsvp.tspec",
8574 FT_NONE, BASE_NONE, NULL, 0x0,
8575 NULL, HFILL }
8578 {&hf_rsvp_filter[RSVPF_ADSPEC],
8579 { "ADSPEC", "rsvp.adspec",
8580 FT_NONE, BASE_NONE, NULL, 0x0,
8581 NULL, HFILL }
8584 {&hf_rsvp_filter[RSVPF_POLICY],
8585 { "POLICY", "rsvp.policy",
8586 FT_NONE, BASE_NONE, NULL, 0x0,
8587 NULL, HFILL }
8590 {&hf_rsvp_filter[RSVPF_CONFIRM],
8591 { "CONFIRM", "rsvp.confirm",
8592 FT_NONE, BASE_NONE, NULL, 0x0,
8593 NULL, HFILL }
8596 {&hf_rsvp_filter[RSVPF_LABEL],
8597 { "LABEL", "rsvp.label",
8598 FT_NONE, BASE_NONE, NULL, 0x0,
8599 NULL, HFILL }
8602 {&hf_rsvp_filter[RSVPF_RECOVERY_LABEL],
8603 { "RECOVERY LABEL", "rsvp.recovery_label",
8604 FT_NONE, BASE_NONE, NULL, 0x0,
8605 NULL, HFILL }
8608 {&hf_rsvp_filter[RSVPF_UPSTREAM_LABEL],
8609 { "UPSTREAM LABEL", "rsvp.upstream_label",
8610 FT_NONE, BASE_NONE, NULL, 0x0,
8611 NULL, HFILL }
8614 {&hf_rsvp_filter[RSVPF_SUGGESTED_LABEL],
8615 { "SUGGESTED LABEL", "rsvp.suggested_label",
8616 FT_NONE, BASE_NONE, NULL, 0x0,
8617 NULL, HFILL }
8620 {&hf_rsvp_filter[RSVPF_LABEL_SET],
8621 { "LABEL SET", "rsvp.label_set",
8622 FT_NONE, BASE_NONE, NULL, 0x0,
8623 NULL, HFILL }
8626 {&hf_rsvp_filter[RSVPF_ACCEPTABLE_LABEL_SET],
8627 { "ACCEPTABLE LABEL SET", "rsvp.acceptable_label_set",
8628 FT_NONE, BASE_NONE, NULL, 0x0,
8629 NULL, HFILL }
8632 {&hf_rsvp_filter[RSVPF_PROTECTION],
8633 { "PROTECTION", "rsvp.protection",
8634 FT_NONE, BASE_NONE, NULL, 0x0,
8635 NULL, HFILL }
8638 {&hf_rsvp_filter[RSVPF_DIFFSERV],
8639 { "DIFFSERV", "rsvp.diffserv",
8640 FT_NONE, BASE_NONE, NULL, 0x0,
8641 NULL, HFILL }
8644 {&hf_rsvp_filter[RSVPF_DSTE],
8645 { "CLASSTYPE", "rsvp.dste",
8646 FT_NONE, BASE_NONE, NULL, 0x0,
8647 NULL, HFILL }
8650 {&hf_rsvp_filter[RSVPF_RESTART_CAP],
8651 { "RESTART CAPABILITY", "rsvp.restart",
8652 FT_NONE, BASE_NONE, NULL, 0x0,
8653 NULL, HFILL }
8656 {&hf_rsvp_filter[RSVPF_LINK_CAP],
8657 { "LINK CAPABILITY", "rsvp.link",
8658 FT_NONE, BASE_NONE, NULL, 0x0,
8659 NULL, HFILL }
8662 {&hf_rsvp_filter[RSVPF_CAPABILITY],
8663 { "Capability", "rsvp.capability",
8664 FT_NONE, BASE_NONE, NULL, 0x0,
8665 NULL, HFILL }
8668 {&hf_rsvp_filter[RSVPF_LABEL_REQUEST],
8669 { "LABEL REQUEST", "rsvp.label_request",
8670 FT_NONE, BASE_NONE, NULL, 0x0,
8671 NULL, HFILL }
8674 {&hf_rsvp_filter[RSVPF_SESSION_ATTRIBUTE],
8675 { "SESSION ATTRIBUTE", "rsvp.session_attribute",
8676 FT_NONE, BASE_NONE, NULL, 0x0,
8677 NULL, HFILL }
8680 {&hf_rsvp_filter[RSVPF_EXPLICIT_ROUTE],
8681 { "EXPLICIT ROUTE", "rsvp.explicit_route",
8682 FT_NONE, BASE_NONE, NULL, 0x0,
8683 NULL, HFILL }
8686 {&hf_rsvp_filter[RSVPF_RECORD_ROUTE],
8687 { "RECORD ROUTE", "rsvp.record_route",
8688 FT_NONE, BASE_NONE, NULL, 0x0,
8689 NULL, HFILL }
8692 {&hf_rsvp_filter[RSVPF_MESSAGE_ID],
8693 { "MESSAGE-ID", "rsvp.msgid",
8694 FT_NONE, BASE_NONE, NULL, 0x0,
8695 NULL, HFILL }
8698 {&hf_rsvp_filter[RSVPF_MESSAGE_ID_ACK],
8699 { "MESSAGE-ID ACK", "rsvp.msgid_ack",
8700 FT_NONE, BASE_NONE, NULL, 0x0,
8701 NULL, HFILL }
8704 {&hf_rsvp_filter[RSVPF_MESSAGE_ID_LIST],
8705 { "MESSAGE-ID LIST", "rsvp.msgid_list",
8706 FT_NONE, BASE_NONE, NULL, 0x0,
8707 NULL, HFILL }
8710 {&hf_rsvp_filter[RSVPF_DCLASS],
8711 { "DCLASS", "rsvp.dclass",
8712 FT_NONE, BASE_NONE, NULL, 0x0,
8713 NULL, HFILL }
8716 {&hf_rsvp_filter[RSVPF_LSP_TUNNEL_IF_ID],
8717 { "LSP INTERFACE-ID", "rsvp.lsp_tunnel_if_id",
8718 FT_NONE, BASE_NONE, NULL, 0x0,
8719 NULL, HFILL }
8722 {&hf_rsvp_filter[RSVPF_ADMIN_STATUS],
8723 { "ADMIN STATUS", "rsvp.admin_status",
8724 FT_NONE, BASE_NONE, NULL, 0x0,
8725 NULL, HFILL }
8728 {&hf_rsvp_filter[RSVPF_ADMIN_STATUS_REFLECT],
8729 { "Reflect", "rsvp.admin_status.reflect",
8730 FT_BOOLEAN, 32, NULL, 0x80000000,
8731 NULL, HFILL }
8734 {&hf_rsvp_filter[RSVPF_ADMIN_STATUS_HANDOVER],
8735 { "Handover", "rsvp.admin_status.handover",
8736 FT_BOOLEAN, 32, NULL, 0x40,
8737 NULL, HFILL }
8740 {&hf_rsvp_filter[RSVPF_ADMIN_STATUS_LOCKOUT],
8741 { "Lockout", "rsvp.admin_status.lockout",
8742 FT_BOOLEAN, 32, NULL, 0x20,
8743 NULL, HFILL }
8746 {&hf_rsvp_filter[RSVPF_ADMIN_STATUS_INHIBIT],
8747 { "Inhibit Alarm Communication", "rsvp.admin_status.inhibit",
8748 FT_BOOLEAN, 32, NULL, 0x10,
8749 NULL, HFILL }
8752 {&hf_rsvp_filter[RSVPF_ADMIN_STATUS_CALL_MGMT],
8753 { "Call Management", "rsvp.admin_status.callmgmt",
8754 FT_BOOLEAN, 32, NULL, 0x08,
8755 NULL, HFILL }
8758 {&hf_rsvp_filter[RSVPF_ADMIN_STATUS_TESTING],
8759 { "Testing", "rsvp.admin_status.testing",
8760 FT_BOOLEAN, 32, NULL, 0x04,
8761 NULL, HFILL }
8764 {&hf_rsvp_filter[RSVPF_ADMIN_STATUS_DOWN],
8765 { "Administratively down", "rsvp.admin_status.down",
8766 FT_BOOLEAN, 32, NULL, 0x02,
8767 NULL, HFILL }
8770 {&hf_rsvp_filter[RSVPF_ADMIN_STATUS_DELETE],
8771 { "Delete in progress", "rsvp.admin_status.delete",
8772 FT_BOOLEAN, 32, NULL, 0x01,
8773 NULL, HFILL }
8776 {&hf_rsvp_filter[RSVPF_LSP_ATTRIBUTES],
8777 { "LSP ATTRIBUTES", "rsvp.lsp_attributes",
8778 FT_NONE, BASE_NONE, NULL, 0x0,
8779 NULL, HFILL }
8782 {&hf_rsvp_filter[RSVPF_ASSOCIATION],
8783 { "ASSOCIATION", "rsvp.association",
8784 FT_NONE, BASE_NONE, NULL, 0x0,
8785 NULL, HFILL }
8788 {&hf_rsvp_filter[RSVPF_SECONDARY_EXPLICIT_ROUTE],
8789 { "SECONDARY EXPLICIT ROUTE", "rsvp.secondary_explicit_route",
8790 FT_NONE, BASE_NONE, NULL, 0x0,
8791 NULL, HFILL }
8794 {&hf_rsvp_filter[RSVPF_SECONDARY_RECORD_ROUTE],
8795 { "SECONDARY RECORD ROUTE", "rsvp.secondary_record_route",
8796 FT_NONE, BASE_NONE, NULL, 0x0,
8797 NULL, HFILL }
8800 {&hf_rsvp_filter[RSVPF_CALL_ATTRIBUTES],
8801 { "CALL ATTRIBUTES", "rsvp.call_attributes",
8802 FT_NONE, BASE_NONE, NULL, 0x0,
8803 NULL, HFILL }
8806 {&hf_rsvp_filter[RSVPF_NOTIFY_REQUEST],
8807 { "NOTIFY REQUEST", "rsvp.notify_request",
8808 FT_NONE, BASE_NONE, NULL, 0x0,
8809 NULL, HFILL }
8812 {&hf_rsvp_filter[RSVPF_GENERALIZED_UNI],
8813 { "GENERALIZED UNI", "rsvp.generalized_uni",
8814 FT_NONE, BASE_NONE, NULL, 0x0,
8815 NULL, HFILL }
8818 {&hf_rsvp_filter[RSVPF_CALL_ID],
8819 { "CALL ID", "rsvp.call_id",
8820 FT_NONE, BASE_NONE, NULL, 0x0,
8821 NULL, HFILL }
8824 {&hf_rsvp_filter[RSVPF_3GPP2_OBJECT],
8825 { "3GPP2 OBJECT", "rsvp.3gpp2_object",
8826 FT_NONE, BASE_NONE, NULL, 0x0,
8827 NULL, HFILL }
8829 {&hf_rsvp_filter[RSVPF_PRIVATE_OBJ],
8830 { "Private object", "rsvp.obj_private",
8831 FT_NONE, BASE_NONE, NULL, 0x0,
8832 NULL, HFILL }
8835 {&hf_rsvp_filter[RSVPF_UNKNOWN_OBJ],
8836 { "Unknown object", "rsvp.obj_unknown",
8837 FT_NONE, BASE_NONE, NULL, 0x0,
8838 NULL, HFILL }
8841 /* Session fields */
8842 {&hf_rsvp_filter[RSVPF_SESSION_IP],
8843 { "Destination address", "rsvp.session.ip",
8844 FT_IPv4, BASE_NONE, NULL, 0x0,
8845 NULL, HFILL }
8848 {&hf_rsvp_filter[RSVPF_SESSION_SHORT_CALL_ID],
8849 { "Short Call ID", "rsvp.session.short_call_id",
8850 FT_UINT16, BASE_DEC, NULL, 0x0,
8851 NULL, HFILL }
8854 {&hf_rsvp_filter[RSVPF_SESSION_PORT],
8855 { "Port number", "rsvp.session.port",
8856 FT_UINT16, BASE_DEC, NULL, 0x0,
8857 NULL, HFILL }
8860 {&hf_rsvp_filter[RSVPF_SESSION_PROTO],
8861 { "Protocol", "rsvp.session.proto",
8862 FT_UINT8, BASE_DEC, VALS(proto_vals), 0x0,
8863 NULL, HFILL }
8866 {&hf_rsvp_filter[RSVPF_SESSION_TUNNEL_ID],
8867 { "Tunnel ID", "rsvp.session.tunnel_id",
8868 FT_UINT16, BASE_DEC, NULL, 0x0,
8869 NULL, HFILL }
8872 {&hf_rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID],
8873 { "Extended tunnel ID", "rsvp.session.ext_tunnel_id",
8874 FT_UINT32, BASE_DEC, NULL, 0x0,
8875 NULL, HFILL }
8878 {&hf_rsvp_filter[RSVPF_SESSION_EXT_TUNNEL_ID_IPV6],
8879 { "Extended tunnel ID", "rsvp.session.ext_tunnel_id_ipv6",
8880 FT_IPv6, BASE_NONE, NULL, 0x0,
8881 NULL, HFILL }
8884 {&hf_rsvp_filter[RSVPF_JUNIPER],
8885 { "Juniper", "rsvp.juniper",
8886 FT_NONE, BASE_NONE, NULL, 0x0,
8887 NULL, HFILL }
8890 /* Sender template/Filterspec fields */
8891 {&hf_rsvp_filter[RSVPF_SENDER_IP],
8892 { "Sender IPv4 address", "rsvp.sender.ip",
8893 FT_IPv4, BASE_NONE, NULL, 0x0,
8894 NULL, HFILL }
8897 {&hf_rsvp_filter[RSVPF_SENDER_PORT],
8898 { "Sender port number", "rsvp.sender.port",
8899 FT_UINT16, BASE_DEC, NULL, 0x0,
8900 NULL, HFILL }
8903 {&hf_rsvp_filter[RSVPF_SENDER_LSP_ID],
8904 { "LSP ID", "rsvp.sender.lsp_id",
8905 FT_UINT16, BASE_DEC, NULL, 0x0,
8906 NULL, HFILL }
8909 {&hf_rsvp_filter[RSVPF_SENDER_SHORT_CALL_ID],
8910 { "Short Call ID", "rsvp.sender.short_call_id",
8911 FT_UINT16, BASE_DEC, NULL, 0x0,
8912 NULL, HFILL }
8915 /* Diffserv object fields */
8916 {&hf_rsvp_filter[RSVPF_DIFFSERV_MAPNB],
8917 { "MAPnb", "rsvp.diffserv.mapnb",
8918 FT_UINT8, BASE_DEC, NULL, 0x0,
8919 MAPNB_DESCRIPTION, HFILL }
8922 {&hf_rsvp_filter[RSVPF_DIFFSERV_MAP],
8923 { "MAP", "rsvp.diffserv.map",
8924 FT_NONE, BASE_NONE, NULL, 0x0,
8925 MAP_DESCRIPTION, HFILL }
8928 {&hf_rsvp_filter[RSVPF_DIFFSERV_MAP_EXP],
8929 { "EXP", "rsvp.diffserv.map.exp",
8930 FT_UINT8, BASE_DEC, NULL, 0x0,
8931 EXP_DESCRIPTION, HFILL }
8934 {&hf_rsvp_filter[RSVPF_DIFFSERV_PHBID],
8935 { PHBID_DESCRIPTION, "rsvp.diffserv.phbid",
8936 FT_NONE, BASE_NONE, NULL, 0x0,
8937 NULL, HFILL }
8940 {&hf_rsvp_filter[RSVPF_DIFFSERV_PHBID_DSCP],
8941 { PHBID_DSCP_DESCRIPTION, "rsvp.diffserv.phbid.dscp",
8942 FT_UINT16, BASE_DEC, NULL, PHBID_DSCP_MASK,
8943 NULL, HFILL }
8946 {&hf_rsvp_filter[RSVPF_DIFFSERV_PHBID_CODE],
8947 { PHBID_CODE_DESCRIPTION, "rsvp.diffserv.phbid.code",
8948 FT_UINT16, BASE_DEC, NULL, PHBID_CODE_MASK,
8949 NULL, HFILL }
8952 {&hf_rsvp_filter[RSVPF_DIFFSERV_PHBID_BIT14],
8953 { PHBID_BIT14_DESCRIPTION, "rsvp.diffserv.phbid.bit14",
8954 FT_UINT16, BASE_DEC, VALS(phbid_bit14_vals), PHBID_BIT14_MASK,
8955 NULL, HFILL }
8958 {&hf_rsvp_filter[RSVPF_DIFFSERV_PHBID_BIT15],
8959 { PHBID_BIT15_DESCRIPTION, "rsvp.diffserv.phbid.bit15",
8960 FT_UINT16, BASE_DEC, VALS(phbid_bit15_vals), PHBID_BIT15_MASK,
8961 NULL, HFILL }
8964 /* Diffserv-aware TE object field */
8965 {&hf_rsvp_filter[RSVPF_DSTE_CLASSTYPE],
8966 { "CT", "rsvp.dste.classtype",
8967 FT_UINT8, BASE_DEC, NULL, 0x0,
8968 NULL, HFILL }
8971 /* Generalized UNI object field */
8972 {&hf_rsvp_filter[RSVPF_GUNI_SRC_IPV4],
8973 { "Source TNA", "rsvp.guni.srctna.ipv4",
8974 FT_IPv4, BASE_NONE, NULL, 0x0,
8975 NULL, HFILL }
8978 {&hf_rsvp_filter[RSVPF_GUNI_DST_IPV4],
8979 { "Destination TNA", "rsvp.guni.dsttna.ipv4",
8980 FT_IPv4, BASE_NONE, NULL, 0x0,
8981 NULL, HFILL }
8984 {&hf_rsvp_filter[RSVPF_GUNI_SRC_IPV6],
8985 { "Source TNA", "rsvp.guni.srctna.ipv6",
8986 FT_IPv6, BASE_NONE, NULL, 0x0,
8987 NULL, HFILL }
8990 {&hf_rsvp_filter[RSVPF_GUNI_DST_IPV6],
8991 { "Destination TNA", "rsvp.guni.dsttna.ipv6",
8992 FT_IPv6, BASE_NONE, NULL, 0x0,
8993 NULL, HFILL }
8996 /* Generalized UNI object field */
8997 {&hf_rsvp_filter[RSVPF_CALL_ID_SRC_ADDR_IPV4],
8998 { "Source Transport Network Address", "rsvp.callid.srcaddr.ipv4",
8999 FT_IPv4, BASE_NONE, NULL, 0x0,
9000 NULL, HFILL }
9003 {&hf_rsvp_filter[RSVPF_CALL_ID_SRC_ADDR_IPV6],
9004 { "Source Transport Network Address", "rsvp.callid.srcaddr.ipv6",
9005 FT_IPv6, BASE_NONE, NULL, 0x0,
9006 NULL, HFILL }
9009 {&hf_rsvp_callid_srcaddr_ether,
9010 { "Source Transport Network Address", "rsvp.callid.srcaddr.ether",
9011 FT_ETHER, BASE_NONE, NULL, 0x0,
9012 NULL, HFILL }
9015 {&hf_rsvp_callid_srcaddr_bytes,
9016 { "Source Transport Network Address", "rsvp.callid.srcaddr.bytes",
9017 FT_ETHER, BASE_NONE, NULL, 0x0,
9018 NULL, HFILL }
9021 {&hf_rsvp_filter[RSVPF_EXCLUDE_ROUTE],
9022 { "Exclude Route", "rsvp.exclude_route",
9023 FT_NONE, BASE_NONE, NULL, 0x0,
9024 NULL, HFILL }
9027 /* S2L_SUB_LSP object */
9028 {&hf_rsvp_filter[RSVPF_S2L_SUB_LSP],
9029 { "S2L_SUB_LSP", "rsvp.s2l_sub_lsp",
9030 FT_NONE, BASE_NONE, NULL, 0x0,
9031 NULL, HFILL }
9035 * FF: Vendor Private object field, please see
9036 * http://www.iana.org/assignments/enterprise-numbers
9038 {&hf_rsvp_filter[RSVPF_ENT_CODE],
9039 { "Enterprise Code", "rsvp.obj_private.enterprise",
9040 FT_UINT32, BASE_ENTERPRISES, STRINGS_ENTERPRISES, 0x0,
9041 "IANA Network Management Private Enterprise Code", HFILL }
9044 {&hf_rsvp_error_flags,
9045 { "Flags", "rsvp.error_flags",
9046 FT_UINT8, BASE_HEX, NULL, 0x0,
9047 NULL, HFILL }
9050 {&hf_rsvp_error_flags_path_state_removed,
9051 { "Path State Removed", "rsvp.error_flags.path_state_removed",
9052 FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x04,
9053 NULL, HFILL }
9056 {&hf_rsvp_error_flags_not_guilty,
9057 { "NotGuilty", "rsvp.error_flags.not_guilty",
9058 FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x02,
9059 NULL, HFILL }
9062 {&hf_rsvp_error_flags_in_place,
9063 { "InPlace", "rsvp.error_flags.in_place",
9064 FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x01,
9065 NULL, HFILL }
9068 {&hf_rsvp_eth_tspec_tlv_color_mode,
9069 { "Color Mode (CM)", "rsvp.eth_tspec_tlv.color_mode",
9070 FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x02,
9071 NULL, HFILL }
9074 {&hf_rsvp_eth_tspec_tlv_coupling_flag,
9075 { "Coupling Flag (CF)", "rsvp.eth_tspec_tlv.coupling_flag",
9076 FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x01,
9077 NULL, HFILL }
9080 {&hf_rsvp_sender_tspec_standard_contiguous_concatenation,
9081 { "Standard contiguous concatenation", "rsvp.sender_tspec.standard_contiguous_concatenation",
9082 FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x01,
9083 NULL, HFILL }
9086 {&hf_rsvp_sender_tspec_arbitrary_contiguous_concatenation,
9087 { "Arbitrary contiguous concatenation", "rsvp.sender_tspec.arbitrary_contiguous_concatenation",
9088 FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
9089 NULL, HFILL }
9092 {&hf_rsvp_sender_tspec_regenerator_section,
9093 { "Section/Regenerator Section layer transparency", "rsvp.sender_tspec.regenerator_section",
9094 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000001,
9095 NULL, HFILL }
9098 {&hf_rsvp_sender_tspec_multiplex_section,
9099 { "Line/Multiplex Section layer transparency", "rsvp.sender_tspec.multiplex_section",
9100 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000002,
9101 NULL, HFILL }
9104 {&hf_rsvp_sender_tspec_J0_transparency,
9105 { "J0 transparency", "rsvp.sender_tspec.J0_transparency",
9106 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000004,
9107 NULL, HFILL }
9110 {&hf_rsvp_sender_tspec_SOH_RSOH_DCC_transparency,
9111 { "SOH/RSOH DCC transparency", "rsvp.sender_tspec.SOH_RSOH_DCC_transparency",
9112 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000008,
9113 NULL, HFILL }
9116 {&hf_rsvp_sender_tspec_LOH_MSOH_DCC_transparency,
9117 { "LOH/MSOH DCC transparency", "rsvp.sender_tspec.LOH_MSOH_DCC_transparency",
9118 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000010,
9119 NULL, HFILL }
9122 {&hf_rsvp_sender_tspec_LOH_MSOH_extended_DCC_transparency,
9123 { "LOH/MSOH Extended DCC transparency", "rsvp.sender_tspec.LOH_MSOH_extended_DCC_transparency",
9124 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000020,
9125 NULL, HFILL }
9128 {&hf_rsvp_sender_tspec_K1_K2_transparency,
9129 { "K1/K2 transparency", "rsvp.sender_tspec.K1_K2_transparency",
9130 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000040,
9131 NULL, HFILL }
9134 {&hf_rsvp_sender_tspec_E1_transparency,
9135 { "E1 transparency", "rsvp.sender_tspec.E1_transparency",
9136 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000080,
9137 NULL, HFILL }
9140 {&hf_rsvp_sender_tspec_F1_transparency,
9141 { "F1 transparency", "rsvp.sender_tspec.F1_transparency",
9142 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000100,
9143 NULL, HFILL }
9146 {&hf_rsvp_sender_tspec_E2_transparency,
9147 { "E2 transparency", "rsvp.sender_tspec.E2_transparency",
9148 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000200,
9149 NULL, HFILL }
9152 {&hf_rsvp_sender_tspec_B1_transparency,
9153 { "B1 transparency", "rsvp.sender_tspec.B1_transparency",
9154 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000400,
9155 NULL, HFILL }
9158 {&hf_rsvp_sender_tspec_B2_transparency,
9159 { "B2 transparency", "rsvp.sender_tspec.B2_transparency",
9160 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000800,
9161 NULL, HFILL }
9164 {&hf_rsvp_sender_tspec_M0_transparency,
9165 { "M0 transparency", "rsvp.sender_tspec.M0_transparency",
9166 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00001000,
9167 NULL, HFILL }
9170 {&hf_rsvp_sender_tspec_M1_transparency,
9171 { "M1 transparency", "rsvp.sender_tspec.M1_transparency",
9172 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00002000,
9173 NULL, HFILL }
9176 {&hf_rsvp_flowspec_standard_contiguous_concatenation,
9177 { "Standard contiguous concatenation", "rsvp.flowspec.standard_contiguous_concatenation",
9178 FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x01,
9179 NULL, HFILL }
9182 {&hf_rsvp_flowspec_arbitrary_contiguous_concatenation,
9183 { "Arbitrary contiguous concatenation", "rsvp.flowspec.arbitrary_contiguous_concatenation",
9184 FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
9185 NULL, HFILL }
9188 {&hf_rsvp_flowspec_regenerator_section,
9189 { "Section/Regenerator Section layer transparency", "rsvp.flowspec.regenerator_section",
9190 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000001,
9191 NULL, HFILL }
9194 {&hf_rsvp_flowspec_multiplex_section,
9195 { "Line/Multiplex Section layer transparency", "rsvp.flowspec.multiplex_section",
9196 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000002,
9197 NULL, HFILL }
9200 {&hf_rsvp_flowspec_J0_transparency,
9201 { "J0 transparency", "rsvp.flowspec.J0_transparency",
9202 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000004,
9203 NULL, HFILL }
9206 {&hf_rsvp_flowspec_SOH_RSOH_DCC_transparency,
9207 { "SOH/RSOH DCC transparency", "rsvp.flowspec.SOH_RSOH_DCC_transparency",
9208 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000008,
9209 NULL, HFILL }
9212 {&hf_rsvp_flowspec_LOH_MSOH_DCC_transparency,
9213 { "LOH/MSOH DCC transparency", "rsvp.flowspec.LOH_MSOH_DCC_transparency",
9214 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000010,
9215 NULL, HFILL }
9218 {&hf_rsvp_flowspec_LOH_MSOH_extended_DCC_transparency,
9219 { "LOH/MSOH Extended DCC transparency", "rsvp.flowspec.LOH_MSOH_extended_DCC_transparency",
9220 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000020,
9221 NULL, HFILL }
9224 {&hf_rsvp_flowspec_K1_K2_transparency,
9225 { "K1/K2 transparency", "rsvp.flowspec.K1_K2_transparency",
9226 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000040,
9227 NULL, HFILL }
9230 {&hf_rsvp_flowspec_E1_transparency,
9231 { "E1 transparency", "rsvp.flowspec.E1_transparency",
9232 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000080,
9233 NULL, HFILL }
9236 {&hf_rsvp_flowspec_F1_transparency,
9237 { "F1 transparency", "rsvp.flowspec.F1_transparency",
9238 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000100,
9239 NULL, HFILL }
9242 {&hf_rsvp_flowspec_E2_transparency,
9243 { "E2 transparency", "rsvp.flowspec.E2_transparency",
9244 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000200,
9245 NULL, HFILL }
9248 {&hf_rsvp_flowspec_B1_transparency,
9249 { "B1 transparency", "rsvp.flowspec.B1_transparency",
9250 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000400,
9251 NULL, HFILL }
9254 {&hf_rsvp_flowspec_B2_transparency,
9255 { "B2 transparency", "rsvp.flowspec.B2_transparency",
9256 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00000800,
9257 NULL, HFILL }
9260 {&hf_rsvp_flowspec_M0_transparency,
9261 { "M0 transparency", "rsvp.flowspec.M0_transparency",
9262 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00001000,
9263 NULL, HFILL }
9266 {&hf_rsvp_flowspec_M1_transparency,
9267 { "M1 transparency", "rsvp.flowspec.M1_transparency",
9268 FT_BOOLEAN, 32, TFS(&tfs_yes_no), 0x00002000,
9269 NULL, HFILL }
9272 {&hf_rsvp_integrity_flags_handshake,
9273 { "Handshake", "rsvp.integrity.flags.handshake",
9274 FT_BOOLEAN, 8, TFS(&tfs_capable_not_capable), 0x01,
9275 NULL, HFILL }
9278 {&hf_rsvp_sa_flags_local,
9279 { "Local protection", "rsvp.sa.flags.local",
9280 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x01,
9281 NULL, HFILL }
9284 {&hf_rsvp_sa_flags_label,
9285 { "Label recording", "rsvp.sa.flags.label",
9286 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x02,
9287 NULL, HFILL }
9290 {&hf_rsvp_sa_flags_se_style,
9291 { "SE style", "rsvp.sa.flags.se_style",
9292 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x04,
9293 NULL, HFILL }
9296 {&hf_rsvp_sa_flags_bandwidth,
9297 { "Bandwidth protection", "rsvp.sa.flags.bandwidth",
9298 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x08,
9299 NULL, HFILL }
9302 {&hf_rsvp_sa_flags_node,
9303 { "Node protection", "rsvp.sa.flags.node",
9304 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x10,
9305 NULL, HFILL }
9308 {&hf_rsvp_rro_flags_local_avail,
9309 { "Local Protection", "rsvp.rro.flags.local_avail",
9310 FT_BOOLEAN, 8, TFS(&tfs_available_not_available), 0x01,
9311 NULL, HFILL }
9314 {&hf_rsvp_rro_flags_local_in_use,
9315 { "Local Protection", "rsvp.rro.flags.local_in_use",
9316 FT_BOOLEAN, 8, TFS(&tfs_used_notused), 0x02,
9317 NULL, HFILL }
9320 {&hf_rsvp_rro_flags_bandwidth,
9321 { "Bandwidth Protection", "rsvp.rro.flags.bandwidth",
9322 FT_BOOLEAN, 8, TFS(&tfs_available_not_available), 0x04,
9323 NULL, HFILL }
9326 {&hf_rsvp_rro_flags_node,
9327 { "Node Protection", "rsvp.rro.flags.node",
9328 FT_BOOLEAN, 8, TFS(&tfs_available_not_available), 0x08,
9329 NULL, HFILL }
9332 {&hf_rsvp_rro_flags_node_address,
9333 { "Address Specifies a Node-id Address", "rsvp.rro.flags.node_address",
9334 FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x20,
9335 NULL, HFILL }
9338 {&hf_rsvp_rro_flags_backup_tunnel_bandwidth,
9339 { "Backup Tunnel Has Bandwidth", "rsvp.rro.flags.backup_tunnel_bandwidth",
9340 FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x04,
9341 NULL, HFILL }
9344 {&hf_rsvp_rro_flags_backup_tunnel_hop,
9345 { "Backup Tunnel Goes To", "rsvp.rro.flags.backup_tunnel_hop",
9346 FT_BOOLEAN, 8, TFS(&tfs_next_next_hop_next_hop), 0x08,
9347 NULL, HFILL }
9350 {&hf_rsvp_rro_flags_global_label,
9351 { "Global label", "rsvp.rro.flags.global_label",
9352 FT_BOOLEAN, 8, NULL, 0x01,
9353 NULL, HFILL }
9356 {&hf_rsvp_lsp_attr,
9357 { "LSP Attributes Flags", "rsvp.lsp_attr",
9358 FT_UINT32, BASE_HEX, NULL, 0x0,
9359 NULL, HFILL}
9362 {&hf_rsvp_lsp_attr_e2e,
9363 { "End-to-end re-routing", "rsvp.lsp_attr.e2e",
9364 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x80000000, /* 0 */
9365 NULL, HFILL }
9368 {&hf_rsvp_lsp_attr_boundary,
9369 { "Boundary re-routing", "rsvp.lsp_attr.boundary",
9370 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x40000000, /* 1 */
9371 NULL, HFILL }
9374 {&hf_rsvp_lsp_attr_segment,
9375 { "Segment-based re-routing", "rsvp.lsp_attr.segment",
9376 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x20000000, /* 2 */
9377 NULL, HFILL }
9380 {&hf_rsvp_lsp_attr_integrity,
9381 { "LSP Integrity Required", "rsvp.lsp_attr.integrity",
9382 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x10000000, /* 3 */
9383 NULL, HFILL }
9386 {&hf_rsvp_lsp_attr_contiguous,
9387 { "Contiguous LSP", "rsvp.lsp_attr.contiguous",
9388 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x08000000, /* 4 */
9389 NULL, HFILL }
9392 {&hf_rsvp_lsp_attr_stitching,
9393 { "LSP stitching desired", "rsvp.lsp_attr.stitching",
9394 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x04000000, /* 5 */
9395 NULL, HFILL }
9398 {&hf_rsvp_lsp_attr_preplanned,
9399 { "Pre-Planned LSP Flag", "rsvp.lsp_attr.preplanned",
9400 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x02000000, /* 6 */
9401 NULL, HFILL }
9404 {&hf_rsvp_lsp_attr_nophp,
9405 { "Non-PHP behavior flag", "rsvp.lsp_attr.nophp",
9406 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x01000000, /* 7 */
9407 NULL, HFILL }
9410 {&hf_rsvp_lsp_attr_oobmap,
9411 { "OOB mapping flag", "rsvp.lsp_attr.oobmap",
9412 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x00800000, /* 8 */
9413 NULL, HFILL }
9416 {&hf_rsvp_lsp_attr_entropy,
9417 { "Entropy Label Capability", "rsvp.lsp_attr.entropy",
9418 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x00400000, /* 9 */
9419 NULL, HFILL }
9422 {&hf_rsvp_lsp_attr_oammep,
9423 { "OAM MEP entities desired", "rsvp.lsp_attr.oammep",
9424 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x00200000, /* 10 */
9425 NULL, HFILL }
9428 {&hf_rsvp_lsp_attr_oammip,
9429 { "OAM MIP entities desired", "rsvp.lsp_attr.oammip",
9430 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x00100000, /* 11 */
9431 NULL, HFILL }
9434 {&hf_rsvp_lsp_attr_srlgcollect,
9435 { "SRLG Collection Flag", "rsvp.lsp_attr.srlgcollect",
9436 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x00080000, /* 12 */
9437 NULL, HFILL }
9440 {&hf_rsvp_lsp_attr_loopback,
9441 { "Loopback", "rsvp.lsp_attr.Loopback",
9442 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x00040000, /* 13 */
9443 NULL, HFILL }
9446 {&hf_rsvp_lsp_attr_p2mp,
9447 { "P2MP-TE Tree Re-evaluation Request", "rsvp.lsp_attr.p2mp",
9448 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x00020000, /* 14 */
9449 NULL, HFILL }
9452 {&hf_rsvp_lsp_attr_rtm,
9453 { "RTM_SET", "rsvp.lsp_attr.rtm",
9454 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x00010000, /* 15 */
9455 NULL, HFILL }
9458 {&hf_rsvp_lsp_attr_telinklabel,
9459 { "TE Link Label", "rsvp.lsp_attr.telinklabel",
9460 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x00008000, /* 16 */
9461 NULL, HFILL }
9464 {&hf_rsvp_lsp_attr_lsi,
9465 { "LSI-D", "rsvp.lsp_attr.lsi",
9466 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x00004000, /* 17 */
9467 NULL, HFILL }
9470 {&hf_rsvp_lsp_attr_lsids2e,
9471 { "LSI-D-S2E", "rsvp.lsp_attr.lsids2e",
9472 FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x00002000, /* 18 */
9473 NULL, HFILL }
9476 {&hf_rsvp_gen_uni_direction,
9477 { "Direction", "rsvp.gen_uni.direction",
9478 FT_BOOLEAN, 8, TFS(&tfs_gen_uni_direction), 0x80,
9479 NULL, HFILL }
9482 {&hf_rsvp_protection_info_flags_secondary_lsp,
9483 { "Secondary LSP", "rsvp.pi.flags.secondary_lsp",
9484 FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
9485 NULL, HFILL }
9488 {&hf_rsvp_pi_link_flags_extra_traffic,
9489 { "Extra Traffic", "rsvp.pi_link.flags.extra_traffic",
9490 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x01,
9491 NULL, HFILL }
9494 {&hf_rsvp_pi_link_flags_unprotected,
9495 { "Unprotected", "rsvp.pi_link.flags.unprotected",
9496 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x02,
9497 NULL, HFILL }
9500 {&hf_rsvp_pi_link_flags_shared,
9501 { "Shared", "rsvp.pi_link.flags.shared",
9502 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x04,
9503 NULL, HFILL }
9506 {&hf_rsvp_pi_link_flags_dedicated1_1,
9507 { "Dedicated 1:1", "rsvp.pi_link.flags.dedicated1_1",
9508 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x08,
9509 NULL, HFILL }
9512 {&hf_rsvp_pi_link_flags_dedicated1plus1,
9513 { "Dedicated 1+1", "rsvp.pi_link.flags.dedicated1plus1",
9514 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x10,
9515 NULL, HFILL }
9518 {&hf_rsvp_pi_link_flags_enhanced,
9519 { "Enhanced", "rsvp.pi_link.flags.enhanced",
9520 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x20,
9521 NULL, HFILL }
9524 {&hf_rsvp_pi_link_flags_extra,
9525 { "Extra Traffic", "rsvp.pi_link.flags.extra",
9526 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x01,
9527 NULL, HFILL }
9530 {&hf_rsvp_pi_link_flags_dedicated_1_1,
9531 { "Dedicated 1:1", "rsvp.pi_link.flags.dedicated_1_1",
9532 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x08,
9533 NULL, HFILL }
9536 {&hf_rsvp_pi_link_flags_dedicated_1plus1,
9537 { "Dedicated 1+1", "rsvp.pi_link.flags.dedicated_1plus1",
9538 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x10,
9539 NULL, HFILL }
9542 {&hf_rsvp_rfc4872_secondary,
9543 { "Secondary LSP", "rsvp.rfc4872.secondary",
9544 FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
9545 NULL, HFILL }
9548 {&hf_rsvp_rfc4872_protecting,
9549 { "Protecting LSP", "rsvp.rfc4872.protecting",
9550 FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x40,
9551 NULL, HFILL }
9554 {&hf_rsvp_rfc4872_notification_msg,
9555 { "Protecting LSP", "rsvp.rfc4872.notification_msg",
9556 FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x20,
9557 NULL, HFILL }
9560 {&hf_rsvp_rfc4872_operational,
9561 { "Protecting LSP", "rsvp.rfc4872.operational",
9562 FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
9563 NULL, HFILL }
9566 {&hf_rsvp_pi_lsp_flags_full_rerouting,
9567 { "(Full) rerouting", "rsvp.pi_lsp.flags.full_rerouting",
9568 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x01,
9569 NULL, HFILL }
9572 {&hf_rsvp_pi_lsp_flags_rerouting_extra,
9573 { "Rerouting without extra-traffic", "rsvp.pi_lsp.flags.rerouting_extra",
9574 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x02,
9575 NULL, HFILL }
9578 {&hf_rsvp_pi_lsp_flags_1_n_protection,
9579 { "1:N protection with extra-traffic", "rsvp.pi_lsp.flags.1_n_protection",
9580 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x04,
9581 NULL, HFILL }
9584 {&hf_rsvp_pi_lsp_flags_1plus1_unidirectional,
9585 { "1+1 unidirectional protection", "rsvp.pi_lsp.flags.1plus1_unidirectional",
9586 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x08,
9587 NULL, HFILL }
9590 {&hf_rsvp_pi_lsp_flags_1plus1_bidirectional,
9591 { "1+1 bidirectional protection", "rsvp.pi_lsp.flags.1plus1_bidirectional",
9592 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x10,
9593 NULL, HFILL }
9596 {&hf_rsvp_protection_info_in_place,
9597 { "In-Place", "rsvp.protection_info.in_place",
9598 FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
9599 NULL, HFILL }
9602 {&hf_rsvp_protection_info_required,
9603 { "Required", "rsvp.protection_info.required",
9604 FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x40,
9605 NULL, HFILL }
9608 {&hf_rsvp_pi_seg_flags_full_rerouting,
9609 { "(Full) rerouting", "rsvp.pi_seg.flags.full_rerouting",
9610 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x01,
9611 NULL, HFILL }
9614 {&hf_rsvp_pi_seg_flags_rerouting_extra,
9615 { "Rerouting without extra-traffic", "rsvp.pi_seg.flags.rerouting_extra",
9616 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x02,
9617 NULL, HFILL }
9620 {&hf_rsvp_pi_seg_flags_1_n_protection,
9621 { "1:N protection with extra-traffic", "rsvp.pi_seg.flags.1_n_protection",
9622 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x04,
9623 NULL, HFILL }
9626 {&hf_rsvp_pi_seg_flags_1plus1_unidirectional,
9627 { "1+1 unidirectional protection", "rsvp.pi_seg.flags.1plus1_unidirectional",
9628 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x08,
9629 NULL, HFILL }
9632 {&hf_rsvp_pi_seg_flags_1plus1_bidirectional,
9633 { "1+1 bidirectional protection", "rsvp.pi_seg.flags.1plus1_bidirectional",
9634 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x10,
9635 NULL, HFILL }
9638 {&hf_rsvp_frr_flags_one2one_backup,
9639 { "One-to-One Backup", "rsvp.frr.flags.one2one_backup",
9640 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x01,
9641 NULL, HFILL }
9644 {&hf_rsvp_frr_flags_facility_backup,
9645 { "Facility Backup", "rsvp.frr.flags.facility_backup",
9646 FT_BOOLEAN, 8, TFS(&tfs_desired_not_desired), 0x02,
9647 NULL, HFILL }
9649 {&hf_rsvp_type,
9650 { "Type", "rsvp.type",
9651 FT_UINT16, BASE_DEC, NULL, 0,
9652 NULL, HFILL }
9654 {&hf_rsvp_3gpp_obj_tid,
9655 { "Transaction ID", "rsvp.3gpp_obj.tid",
9656 FT_UINT32, BASE_DEC, NULL, 0,
9657 NULL, HFILL }
9659 {&hf_rsvp_3gpp_obj_ie_len,
9660 { "Length", "rsvp.3gpp_obj.length",
9661 FT_UINT32, BASE_DEC, NULL, 0,
9662 NULL, HFILL }
9664 {&hf_rsvp_3gpp_obj_ie_type,
9665 { "IE Type", "rsvp.3gpp_obj.ie_type",
9666 FT_UINT32, BASE_DEC, VALS(rsvp_3gpp_object_ie_type_vals), 0,
9667 NULL, HFILL }
9669 {&hf_rsvp_3gpp_obj_ue_ipv4_addr,
9670 { "UE IPv4 address", "rsvp.3gpp_obj.ue_ipv4_addr",
9671 FT_IPv4, BASE_NONE, NULL, 0,
9672 NULL, HFILL }
9674 {&hf_rsvp_3gpp_obj_ue_ipv6_addr,
9675 { "UE IPv6 address", "rsvp.3gpp_obj.ue_ipv6_addr",
9676 FT_IPv6, BASE_NONE, NULL, 0,
9677 NULL, HFILL }
9679 {&hf_rsvp_3gpp_obj_tft_d,
9680 { "Direction(D)", "rsvp.3gpp_obj.tft_d",
9681 FT_UINT32, BASE_DEC, VALS(rsvp_3gpp_object_tft_d_vals), 0xc0000000,
9682 NULL, HFILL }
9684 {&hf_rsvp_3gpp_obj_tft_ns,
9685 { "Non-Specific bit(NS)", "rsvp.3gpp_obj.tft_ns",
9686 FT_UINT32, BASE_DEC, NULL, 0x08000000,
9687 NULL, HFILL }
9689 {&hf_rsvp_3gpp_obj_tft_sr_id,
9690 { "SR_ID", "rsvp.3gpp_obj.tft_sr_id",
9691 FT_UINT32, BASE_DEC, NULL, 0x07000000,
9692 NULL, HFILL }
9694 {&hf_rsvp_3gpp_obj_tft_p,
9695 { "Persistency(P)", "rsvp.3gpp_obj.tft_p",
9696 FT_UINT32, BASE_DEC, NULL, 0x00010000,
9697 NULL, HFILL }
9699 {&hf_rsvp_3gpp_obj_tft_opcode,
9700 { "TFT Operation Code", "rsvp.3gpp_obj.tft_opcode",
9701 FT_UINT32, BASE_DEC, VALS(rsvp_3gpp_obj_tft_opcode_vals), 0x0000ff00,
9702 NULL, HFILL }
9704 {&hf_rsvp_3gpp_obj_tft_n_pkt_flt,
9705 { "Number of Packet filters", "rsvp.3gpp_obj.tft_n_pkt_flt",
9706 FT_UINT32, BASE_DEC, NULL, 0x000000ff,
9707 NULL, HFILL }
9709 { &hf_rsvp_3gpp_obj_flow_id,
9710 { "Flow Identifier", "rsvp.3gpp_obj.flow_id",
9711 FT_UINT8, BASE_DEC, NULL, 0,
9712 NULL, HFILL }
9714 { &hf_rsvp_3gpp_obj_pf_ev_prec,
9715 { "Packet filter evaluation precedence", "rsvp.3gpp_obj.pf_ev_prec",
9716 FT_UINT8, BASE_DEC, NULL, 0,
9717 NULL, HFILL }
9719 { &hf_rsvp_3gpp_obj_pf_len,
9720 { "Packet filter length", "rsvp.3gpp_obj.pf_len",
9721 FT_UINT16, BASE_DEC, NULL, 0,
9722 NULL, HFILL }
9724 { &hf_rsvp_3gpp_obj_pf_type,
9725 { "PF Type", "rsvp.3gpp_obj.pf_type",
9726 FT_UINT8, BASE_DEC, NULL, 0,
9727 NULL, HFILL }
9729 { &hf_rsvp_3gpp_obj_pf_cont_len,
9730 { "Length", "rsvp.3gpp_obj.pf_cont_len",
9731 FT_UINT8, BASE_DEC, NULL, 0,
9732 NULL, HFILL }
9734 { &hf_rsvp_3gpp_obj_pf_comp_type_id,
9735 { "PF component identifier", "rsvp.3gpp_obj.pf_comp_type_id",
9736 FT_UINT8, BASE_DEC, VALS(rsvp_3gpp_obj_pf_comp_type_id_vals), 0,
9737 NULL, HFILL }
9739 { &hf_rsvp_3gpp_obj_pf_src_ipv4,
9740 { "IPv4 Source Address", "rsvp.3gpp_obj.pf_src_ipv4",
9741 FT_IPv4, BASE_NONE, NULL, 0,
9742 NULL, HFILL }
9744 { &hf_rsvp_3gpp_obj_pf_dst_ipv4,
9745 { "IPv4 Destination Address", "rsvp.3gpp_obj.pf_dst_ipv4",
9746 FT_IPv4, BASE_NONE, NULL, 0,
9747 NULL, HFILL }
9749 { &hf_rsvp_3gpp_obj_pf_ipv4_mask,
9750 { "IPv4 Mask", "rsvp.3gpp_obj.pf_ipv4_mask",
9751 FT_UINT32, BASE_HEX, NULL, 0,
9752 NULL, HFILL }
9754 { &hf_rsvp_3gpp_obj_pf_src_ipv6,
9755 { "IPv6 Source Address", "rsvp.3gpp_obj.pf_src_ipv6",
9756 FT_IPv6, BASE_NONE, NULL, 0,
9757 NULL, HFILL }
9759 { &hf_rsvp_3gpp_obj_pf_dst_ipv6,
9760 { "IPv6 Destination Address", "rsvp.3gpp_obj.pf_dst_ipv6",
9761 FT_IPv6, BASE_NONE, NULL, 0,
9762 NULL, HFILL }
9764 { &hf_rsvp_3gpp_obj_pf_ipv6_prefix_length,
9765 { "IPv6 Prefix length", "rsvp.3gpp_obj.pf_ipv6_prefix_length",
9766 FT_UINT8, BASE_DEC, NULL, 0,
9767 NULL, HFILL }
9769 { &hf_rsvp_3gpp_obj_pf_prot_next,
9770 { "Protocol field(IPv4) or Next Header(IPv6)", "rsvp.3gpp_obj.pf_prot_next",
9771 FT_UINT8, BASE_DEC, NULL, 0,
9772 NULL, HFILL }
9774 { &hf_rsvp_3gpp_obj_pf_dst_port,
9775 { "Single Destination Port", "rsvp.3gpp_obj.pf_dst_port",
9776 FT_UINT16, BASE_DEC, NULL, 0,
9777 NULL, HFILL }
9779 { &hf_rsvp_3gpp_obj_pf_src_port,
9780 { "Single Source Port", "rsvp.3gpp_obj.pf_src_port",
9781 FT_UINT16, BASE_DEC, NULL, 0,
9782 NULL, HFILL }
9784 { &hf_rsvp_3gpp_obj_pf_ipsec_spi,
9785 { "IPsec SPI", "rsvp.3gpp_obj.pf_ipsec_spi",
9786 FT_UINT32, BASE_DEC, NULL, 0,
9787 NULL, HFILL }
9789 { &hf_rsvp_3gpp_obj_pf_tos_tc,
9790 { "Type of Service (IPv4)/Traffic Class (IPv6)", "rsvp.3gpp_obj.pf_tos_tc",
9791 FT_UINT8, BASE_HEX, NULL, 0,
9792 NULL, HFILL }
9794 { &hf_rsvp_3gpp_obj_pf_flow_lbl,
9795 { "Flow label", "rsvp.3gpp_obj.pf_flow_lbl",
9796 FT_UINT24, BASE_DEC, NULL, 0x0fffff,
9797 NULL, HFILL }
9799 { &hf_rsvp_3gpp_obj_pf_ipv6,
9800 { "IPv6 Address", "rsvp.3gpp_obj.pf_ipv6",
9801 FT_IPv6, BASE_NONE, NULL, 0,
9802 NULL, HFILL }
9804 { &hf_rsvp_3gpp_obj_pf_treatment,
9805 { "PF Treatment", "rsvp.3gpp_obj.pf_treatment",
9806 FT_UINT8, BASE_DEC, VALS(rsvp_3gpp_obj_pf_treatment_vals), 0,
9807 NULL, HFILL }
9809 { &hf_rsvp_3gpp_obj_pf_hint,
9810 { "PF Hint", "rsvp.3gpp_obj.pf_hint",
9811 FT_UINT32, BASE_DEC, NULL, 0,
9812 NULL, HFILL }
9814 { &hf_rsvp_3gpp_obj_tft_qos_list_len,
9815 { "QoS List Length", "rsvp.3gpp_obj.qos_list_len",
9816 FT_UINT16, BASE_DEC, NULL, 0,
9817 NULL, HFILL }
9819 { &hf_rsvp_3gpp_r_qos_blob_len,
9820 { "R_QOS_SUB_BLOB_LEN", "rsvp.3gpp_obj.r_qos_blob_len",
9821 FT_UINT8, BASE_DEC, NULL, 0,
9822 NULL, HFILL }
9824 { &hf_rsvp_3gpp_r_qos_blob_flow_pri,
9825 { "FLOW_PRIORITY", "rsvp.3gpp_obj.r_qos_blob.flow_pri",
9826 FT_UINT8, BASE_DEC, NULL, 0xf0,
9827 NULL, HFILL }
9829 { &hf_rsvp_3gpp_r_qos_blob_num_qos_att_set,
9830 { "NUM_QoS_ATTRIBUTE_SETS", "rsvp.3gpp_obj.r_qos_blob.num_qos_att_set",
9831 FT_UINT8, BASE_DEC, NULL, 0x0e,
9832 NULL, HFILL }
9834 { &hf_rsvp_3gpp_qos_att_set_len,
9835 { "QoS_ATTRIBUTE_SET_LEN", "rsvp.3gpp_obj.r_qos_blob.qos_att_set_len",
9836 FT_UINT8, BASE_DEC, NULL, 0x0,
9837 NULL, HFILL }
9839 { &hf_rsvp_3gpp_qos_attribute_set_id,
9840 { "QoS_ATTRIBUTE_SET_ID", "rsvp.3gpp_obj.r_qos_blob.qos_attribute_set_id",
9841 FT_UINT8, BASE_DEC, NULL, 0x0,
9842 NULL, HFILL }
9844 { &hf_rsvp_3gpp_qos_attribute_verbose,
9845 { "VERBOSE", "rsvp.3gpp_obj.r_qos_blob.verbose",
9846 FT_BOOLEAN, BASE_NONE, NULL, 0x0,
9847 NULL, HFILL }
9849 { &hf_rsvp_3gpp_qos_attribute_prof_id,
9850 { "ProfileID", "rsvp.3gpp_obj.r_qos_blob.prof_id",
9851 FT_UINT8, BASE_DEC, NULL, 0x0,
9852 NULL, HFILL }
9854 { &hf_rsvp_3gpp_qos_attribute_traff_cls,
9855 { "Traffic_Class", "rsvp.3gpp_obj.r_qos_blob.traff_cls",
9856 FT_UINT8, BASE_DEC, VALS(rsvp_3gpp_obj_traffic_class_vals), 0x0,
9857 NULL, HFILL }
9859 { &hf_rsvp_3gpp_qos_attribute_peak_rate,
9860 { "Peak_Rate", "rsvp.3gpp_obj.r_qos_blob.peak_rate",
9861 FT_UINT16, BASE_DEC, NULL, 0x0,
9862 NULL, HFILL }
9864 { &hf_rsvp_3gpp_qos_attribute_bucket_size,
9865 { "Bucket_Size", "rsvp.3gpp_obj.r_qos_blob.bucket_size",
9866 FT_UINT16, BASE_DEC, NULL, 0x0,
9867 NULL, HFILL }
9869 { &hf_rsvp_3gpp_qos_attribute_token_rate,
9870 { "Token_Rate", "rsvp.3gpp_obj.r_qos_blob.token_rate",
9871 FT_UINT16, BASE_DEC, NULL, 0x0,
9872 NULL, HFILL }
9874 { &hf_rsvp_3gpp_qos_attribute_max_latency,
9875 { "Max_Latency", "rsvp.3gpp_obj.r_qos_blob.max_latency",
9876 FT_UINT8, BASE_DEC, NULL, 0x0,
9877 NULL, HFILL }
9879 { &hf_rsvp_3gpp_qos_attribute_max_loss_rte,
9880 { "Max_Loss_Rate", "rsvp.3gpp_obj.r_qos_blob.max_loss_rte",
9881 FT_UINT8, BASE_DEC, NULL, 0x0,
9882 NULL, HFILL }
9884 { &hf_rsvp_3gpp_qos_attribute_delay_var_sensitive,
9885 { "Delay_Var_Sensitive", "rsvp.3gpp_obj.r_qos_blob.delay_var_sensitive",
9886 FT_UINT8, BASE_DEC, NULL, 0x0,
9887 NULL, HFILL }
9889 { &hf_rsvp_3gpp_qos_attribute_reserved,
9890 { "Reserved", "rsvp.3gpp_obj.r_qos_blob.reserved",
9891 FT_UINT8, BASE_DEC, NULL, 0x0,
9892 NULL, HFILL }
9894 { &hf_rsvp_3gpp_r_qos_blob,
9895 { "R_QOS_SUB_BLOB", "rsvp.3gpp_obj.r_qos_blob",
9896 FT_BYTES, BASE_NONE, NULL, 0,
9897 NULL, HFILL }
9899 { &hf_rsvp_3gpp_qos_result,
9900 { "Result Code", "rsvp.3gpp_obj.qos_result_code",
9901 FT_UINT8, BASE_DEC, NULL, 0,
9902 NULL, HFILL }
9905 { &hf_rsvp_xro_sobj_lbit,
9906 { "L(oose) bit", "rsvp.xro.sobj.lbit",
9907 FT_UINT8, BASE_DEC,VALS(rsvp_xro_sobj_lbit_vals), 0x80,
9908 NULL, HFILL
9911 { &hf_rsvp_rro_sobj_dbit,
9912 { "D(irection) bit", "rsvp.rro.sobj.dbit",
9913 FT_UINT8, BASE_DEC,VALS(rsvp_rro_sobj_dbit_vals), 0x80,
9914 NULL, HFILL
9918 { &hf_rsvp_xro_sobj_len,
9919 { "Length", "rsvp.xro.sobj.len",
9920 FT_UINT8, BASE_DEC, NULL, 0,
9921 NULL, HFILL
9925 { &hf_rsvp_xro_sobj_ipv4_addr,
9926 { "IPv4 prefix", "rsvp.xro.sobj.ipv4.addr",
9927 FT_IPv4, BASE_NONE, NULL, 0,
9928 NULL, HFILL
9932 { &hf_rsvp_xro_sobj_ipv4_prefix,
9933 { "Prefix Length", "rsvp.xro.sobj.ipv4.prefix",
9934 FT_UINT8, BASE_DEC, NULL, 0,
9935 NULL, HFILL
9939 { &hf_rsvp_xro_sobj_ipv4_attr,
9940 { "Attribute", "rsvp.xro.sobj.ipv4.attr",
9941 FT_UINT8, BASE_DEC, VALS(rsvp_xro_sobj_ip_attr_vals), 0,
9942 NULL, HFILL
9946 { &hf_rsvp_xro_sobj_ipv6_attr,
9947 { "Attribute", "rsvp.xro.sobj.ipv6.attr",
9948 FT_UINT8, BASE_DEC, VALS(rsvp_xro_sobj_ip_attr_vals), 0,
9949 NULL, HFILL
9953 { &hf_rsvp_xro_sobj_srlg_id,
9954 { "SRLG Id", "rsvp.xro.sobj.srlg.id",
9955 FT_UINT32, BASE_DEC, NULL, 0,
9956 NULL, HFILL
9960 { &hf_rsvp_xro_sobj_srlg_res,
9961 { "Reserved", "rsvp.xro.sobj.srlg.res",
9962 FT_UINT16, BASE_DEC, NULL, 0,
9963 NULL, HFILL
9967 { &hf_rsvp_private_data,
9968 { "Data", "rsvp.private.data",
9969 FT_BYTES, BASE_NONE, NULL, 0,
9970 NULL, HFILL
9974 { &hf_rsvp_juniper_numtlvs,
9975 { "Num TLVs", "rsvp.juniper.tlvs",
9976 FT_UINT16, BASE_DEC, NULL, 0,
9977 NULL, HFILL
9981 { &hf_rsvp_juniper_padlength,
9982 { "Padlength", "rsvp.juniper.padlength",
9983 FT_UINT16, BASE_DEC, NULL, 0,
9984 NULL, HFILL
9988 { &hf_rsvp_juniper_type,
9989 { "Juniper type", "rsvp.juniper.type",
9990 FT_UINT8, BASE_HEX, VALS(rsvp_juniper_attr_vals), 0,
9991 NULL, HFILL
9995 { &hf_rsvp_juniper_length,
9996 { "Juniper length", "rsvp.juniper.length",
9997 FT_UINT8, BASE_DEC, NULL, 0,
9998 NULL, HFILL
10002 { &hf_rsvp_juniper_attrib_cos,
10003 { "Cos", "rsvp.juniper.attrib.cos",
10004 FT_UINT16, BASE_HEX, NULL, 0,
10005 NULL, HFILL
10009 { &hf_rsvp_juniper_attrib_metric1,
10010 { "Metric 1", "rsvp.juniper.attrib.metric1",
10011 FT_UINT16, BASE_HEX, NULL, 0,
10012 NULL, HFILL
10016 { &hf_rsvp_juniper_attrib_metric2,
10017 { "Metric 2", "rsvp.juniper.attrib.metric2",
10018 FT_UINT16, BASE_HEX, NULL, 0,
10019 NULL, HFILL
10023 { &hf_rsvp_juniper_attrib_ccc_status,
10024 { "CCC Status", "rsvp.juniper.attrib.ccc_status",
10025 FT_UINT16, BASE_HEX, NULL, 0,
10026 NULL, HFILL
10030 { &hf_rsvp_juniper_attrib_path,
10031 { "Path type", "rsvp.juniper.attrib.path",
10032 FT_UINT16, BASE_HEX, VALS(rsvp_juniper_path_attr_vals), 0,
10033 NULL, HFILL
10037 { &hf_rsvp_juniper_attrib_unknown,
10038 { "Unknown", "rsvp.juniper.attrib.unknown",
10039 FT_BYTES, BASE_NONE, NULL, 0,
10040 NULL, HFILL
10044 { &hf_rsvp_juniper_pad,
10045 { "Pad", "rsvp.juniper.pad",
10046 FT_BYTES, BASE_NONE, NULL, 0,
10047 NULL, HFILL
10051 { &hf_rsvp_juniper_unknown,
10052 { "Unknown", "rsvp.juniper.unknown",
10053 FT_BYTES, BASE_NONE, NULL, 0,
10054 NULL, HFILL
10058 { &hf_rsvp_unknown_data,
10059 { "Data", "rsvp.unknown.data",
10060 FT_BYTES, BASE_NONE, NULL, 0,
10061 NULL, HFILL
10065 {&hf_rsvp_loose_hop,
10066 { "Hop", "rsvp.loose_hop",
10067 FT_BOOLEAN, 8, TFS(&tfs_loose_strict_hop), 0x80,
10068 NULL, HFILL }
10071 { &hf_rsvp_data_length,
10072 { "Data length", "rsvp.data_length",
10073 FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_word_not_including_header), 0,
10074 NULL, HFILL
10078 { &hf_rsvp_ctype_s2l_sub_lsp,
10079 { "C-Type", "rsvp.ctype.s2l_sub_lsp",
10080 FT_UINT32, BASE_DEC, VALS(rsvp_c_type_s2l_sub_lsp_vals), 0,
10081 NULL, HFILL
10084 { &hf_rsvp_s2l_sub_lsp_destination_ipv4_address,
10085 { "IPv4 S2L Sub-LSP destination address", "rsvp.s2l_sub_lsp.destination_ipv4_address",
10086 FT_IPv4, BASE_NONE, NULL, 0,
10087 NULL, HFILL
10090 { &hf_rsvp_s2l_sub_lsp_destination_ipv6_address,
10091 { "IPv6 S2L Sub-LSP destination address", "rsvp.s2l_sub_lsp.destination_ipv6_address",
10092 FT_IPv6, BASE_NONE, NULL, 0,
10093 NULL, HFILL
10096 { &hf_rsvp_s2l_sub_lsp_data,
10097 { "Data", "rsvp.s2l_sub_lsp.data",
10098 FT_BYTES, BASE_NONE, NULL, 0,
10099 NULL, HFILL
10104 /* Generated from convert_proto_tree_add_text.pl */
10105 { &hf_rsvp_session_flags, { "Flags", "rsvp.session.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10106 { &hf_rsvp_session_destination_address, { "Destination address", "rsvp.session.destination_address", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10107 { &hf_rsvp_session_protocol, { "Protocol", "rsvp.session.protocol", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10108 { &hf_rsvp_session_destination_port, { "Destination port", "rsvp.session.destination_port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10109 { &hf_rsvp_session_dscp, { "DSCP", "rsvp.session.dscp", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &dscp_vals_ext, 0x0, NULL, HFILL }},
10110 { &hf_rsvp_session_extended_ipv4_address, { "Extended IPv4 Address", "rsvp.session.extended_ipv4_address", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10111 { &hf_rsvp_session_p2mp_id, { "P2MP ID", "rsvp.session.p2mp_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10112 { &hf_rsvp_session_data, { "Data", "rsvp.session.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10113 { &hf_rsvp_ifid_tlv_length, { "Length", "rsvp.ifid_tlv.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10114 { &hf_rsvp_ifid_tlv_ipv4_address, { "IPv4 address", "rsvp.ifid_tlv.ipv4_address", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10115 { &hf_rsvp_ifid_tlv_ipv6_address, { "IPv6 address", "rsvp.ifid_tlv.ipv6_address", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10116 { &hf_rsvp_ifid_tlvinterface_id, { "Interface-ID", "rsvp.ifid_tlv.interface_id", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
10117 { &hf_rsvp_ifid_tlv_label, { "Label", "rsvp.ifid_tlv.label", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10118 { &hf_rsvp_ifid_tlv_node_id, { "Node ID", "rsvp.ifid_tlv.node_id", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10119 { &hf_rsvp_ifid_tlv_area, { "Area", "rsvp.ifid_tlv.area", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10120 { &hf_rsvp_ifid_tlv_autonomous_system, { "Autonomous System", "rsvp.ifid_tlv.autonomous_system", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10121 { &hf_rsvp_ifid_tlv_error_string, { "Error String", "rsvp.ifid_tlv.error_string", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10122 { &hf_rsvp_ifid_tlv_data, { "Data", "rsvp.ifid_tlv.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10123 { &hf_rsvp_ifid_tlv_padding, { "Padding", "rsvp.ifid_tlv.padding", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10124 { &hf_rsvp_ctype_hop, { "C-Type", "rsvp.ctype.hop", FT_UINT32, BASE_DEC, VALS(rsvp_c_type_hop_vals), 0x0, NULL, HFILL }},
10125 { &hf_rsvp_hop_neighbor_address_ipv4, { "Neighbor address", "rsvp.hop.neighbor_address_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10126 { &hf_rsvp_hop_logical_interface, { "Logical interface", "rsvp.hop.logical_interface", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10127 { &hf_rsvp_hop_neighbor_address_ipv6, { "Neighbor address", "rsvp.neighbor_address_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10128 { &hf_rsvp_hop_data, { "Data", "rsvp.hop.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10129 { &hf_rsvp_ctype_time_values, { "C-Type", "rsvp.ctype.time_values", FT_UINT32, BASE_DEC, VALS(rsvp_c_type_time_values_vals), 0x0, NULL, HFILL }},
10130 { &hf_rsvp_time_values_data, { "Data", "rsvp.time_values.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10131 { &hf_rsvp_ctype_error, { "C-Type", "rsvp.ctype.error", FT_UINT32, BASE_DEC, VALS(rsvp_c_type_error_vals), 0x0, NULL, HFILL }},
10132 { &hf_rsvp_error_error_node_ipv4, { "Error node", "rsvp.error.error_node_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10133 { &hf_rsvp_error_error_node_ipv6, { "Error node", "rsvp.error.error_node_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10134 { &hf_rsvp_error_data, { "Data", "rsvp.error.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10135 { &hf_rsvp_error_error_code, { "Error code", "rsvp.error.error_code", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &rsvp_error_codes_ext, 0x0, NULL, HFILL }},
10136 { &hf_rsvp_ctype_scope, { "C-Type", "rsvp.ctype.scope", FT_UINT32, BASE_DEC, VALS(rsvp_c_type_scope_vals), 0x0, NULL, HFILL }},
10137 { &hf_rsvp_scope_ipv4_address, { "IPv4 Address", "rsvp.scope.ipv4_address", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10138 { &hf_rsvp_scope_ipv6_address, { "IPv6 Address", "rsvp.scope.ipv6_address", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10139 { &hf_rsvp_scope_data, { "Data", "rsvp.scope.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10140 { &hf_rsvp_ctype_style, { "C-Type", "rsvp.ctype.style", FT_UINT32, BASE_DEC, VALS(rsvp_c_type_style_vals), 0x0, NULL, HFILL }},
10141 { &hf_rsvp_style_flags, { "Flags", "rsvp.style.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10142 { &hf_rsvp_style_style, { "Style", "rsvp.style.style", FT_UINT24, BASE_HEX, VALS(style_vals), 0x0, NULL, HFILL }},
10143 { &hf_rsvp_style_data, { "Data", "rsvp.style.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10144 { &hf_rsvp_ctype_confirm, { "C-Type", "rsvp.ctype.confirm", FT_UINT32, BASE_DEC, VALS(rsvp_c_type_confirm_vals), 0x0, NULL, HFILL }},
10145 { &hf_rsvp_confirm_receiver_address_ipv4, { "Receiver address", "rsvp.confirm.receiver_address_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10146 { &hf_rsvp_confirm_receiver_address_ipv6, { "Receiver address", "rsvp.confirm.receiver_address_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10147 { &hf_rsvp_confirm_data, { "Data", "rsvp.confirm.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10148 { &hf_rsvp_ctype_template, { "C-Type", "rsvp.ctype.template", FT_UINT32, BASE_DEC, VALS(rsvp_c_type_template_vals), 0x0, NULL, HFILL }},
10149 { &hf_rsvp_template_filter_source_address_ipv6, { "Source address", "rsvp.template_filter.source_address_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10150 { &hf_rsvp_template_filter_source_port, { "Source port", "rsvp.template_filter.source_port", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10151 { &hf_rsvp_template_filter_ipv4_tunnel_sender_address, { "IPv4 Tunnel Sender Address", "rsvp.template_filter.ipv4_tunnel_sender_address", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10152 { &hf_rsvp_template_filter_ipv6_tunnel_sender_address, { "IPv6 Tunnel Sender Address", "rsvp.template_filter.ipv6_tunnel_sender_address", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10153 { &hf_rsvp_template_filter_sub_group_originator_id, { "Sub-Group Originator ID", "rsvp.template_filter.sub_group_originator_id", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10154 { &hf_rsvp_template_filter_sub_group_id, { "Sub-Group ID", "rsvp.template_filter.sub_group_id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10155 { &hf_rsvp_template_filter_data, { "Data", "rsvp.template_filter.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10156 { &hf_rsvp_eth_tspec_length, { "Length", "rsvp.eth_tspec.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10157 { &hf_rsvp_eth_tspec_profile, { "Profile", "rsvp.eth_tspec.profile", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10158 { &hf_rsvp_eth_tspec_index, { "Index", "rsvp.eth_tspec.index", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10159 { &hf_rsvp_eth_tspec_reserved, { "Reserved", "rsvp.eth_tspec.reserved", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10160 { &hf_rsvp_eth_tspec_el2cp, { "EL2CP", "rsvp.eth_tspec.el2cp", FT_UINT8, BASE_DEC, VALS(el2cp_val_str), 0x0, NULL, HFILL }},
10161 { &hf_rsvp_eth_tspec_il2cp, { "IL2CP", "rsvp.eth_tspec.il2cp", FT_UINT8, BASE_DEC, VALS(il2cp_val_str), 0x0, NULL, HFILL }},
10162 { &hf_rsvp_eth_tspec_cir, { "CIR", "rsvp.eth_tspec.cir", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10163 { &hf_rsvp_eth_tspec_cbs, { "CBS", "rsvp.eth_tspec.cbs", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10164 { &hf_rsvp_eth_tspec_eir, { "EIR", "rsvp.eth_tspec.eir", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10165 { &hf_rsvp_eth_tspec_ebs, { "EBS", "rsvp.eth_tspec.ebs", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10166 { &hf_rsvp_ctype_tspec, { "C-Type", "rsvp.ctype.tspec", FT_UINT32, BASE_DEC, VALS(rsvp_c_type_tspec_vals), 0x0, NULL, HFILL }},
10167 { &hf_rsvp_tspec_message_format_version, { "Message format version", "rsvp.tspec.message_format_version", FT_UINT8, BASE_DEC, NULL, 0xF0, NULL, HFILL }},
10168 { &hf_rsvp_tspec_service_header, { "Service header", "rsvp.tspec.service_header", FT_UINT8, BASE_DEC, VALS(qos_vals), 0x0, NULL, HFILL }},
10169 { &hf_rsvp_tspec_token_bucket_rate, { "Token bucket rate", "rsvp.tspec.token_bucket_rate", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10170 { &hf_rsvp_tspec_token_bucket_size, { "Token bucket size", "rsvp.tspec.token_bucket_size", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10171 { &hf_rsvp_tspec_peak_data_rate, { "Peak data rate", "rsvp.tspec.peak_data_rate", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10172 { &hf_rsvp_tspec_hint, { "Hint", "rsvp.tspec.hint", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10173 { &hf_rsvp_compression_factor, { "Compression Factor", "rsvp.tspec.compression_factor", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10174 { &hf_rsvp_tspec_signal_type_sonet, { "Signal Type", "rsvp.tspec.signal_type", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &gmpls_sonet_signal_type_str_ext, 0x0, NULL, HFILL }},
10175 { &hf_rsvp_tspec_requested_concatenation, { "Requested Concatenation (RCC)", "rsvp.tspec.requested_concatenation", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10176 { &hf_rsvp_tspec_number_of_contiguous_components, { "Number of Contiguous Components (NCC)", "rsvp.tspec.number_of_contiguous_components", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10177 { &hf_rsvp_tspec_number_of_virtual_components, { "Number of Virtual Components (NVC)", "rsvp.tspec.number_of_virtual_components", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10178 { &hf_rsvp_tspec_multiplier, { "Multiplier (MT)", "rsvp.tspec.multiplier", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10179 { &hf_rsvp_tspec_transparency, { "Transparency (T)", "rsvp.tspec.transparency", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10180 { &hf_rsvp_tspec_profile, { "Profile (P)", "rsvp.tspec.profile", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10181 { &hf_rsvp_tspec_signal_type_g709, { "Signal Type", "rsvp.tspec.signal_type", FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gmpls_g709_signal_type_rvals), 0x0, NULL, HFILL }},
10182 { &hf_rsvp_tspec_number_of_multiplexed_components, { "Number of Multiplexed Components (NMC)", "rsvp.number_of_multiplexed_components", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10183 { &hf_rsvp_tspec_mtu, { "MTU", "rsvp.tspec.mtu", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10184 { &hf_rsvp_tspec_data, { "Data", "rsvp.tspec.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10185 { &hf_rsvp_ctype_flowspec, { "C-Type", "rsvp.ctype.flowspec", FT_UINT32, BASE_DEC, VALS(rsvp_c_type_flowspec_vals), 0x0, NULL, HFILL }},
10186 { &hf_rsvp_flowspec_message_format_version, { "Message format version", "rsvp.flowspec.message_format_version", FT_UINT8, BASE_DEC, NULL, 0xF0, NULL, HFILL }},
10187 { &hf_rsvp_flowspec_service_header, { "Service header", "rsvp.flowspec.service_header", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &intsrv_services_str_ext, 0x0, NULL, HFILL }},
10188 { &hf_rsvp_flowspec_token_bucket_rate, { "Token bucket rate", "rsvp.flowspec.token_bucket_rate", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10189 { &hf_rsvp_flowspec_token_bucket_size, { "Token bucket size", "rsvp.flowspec.token_bucket_size", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10190 { &hf_rsvp_flowspec_peak_data_rate, { "Peak data rate", "rsvp.flowspec.peak_data_rate", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10191 { &hf_rsvp_flowspec_rate, { "Rate", "rsvp.flowspec.rate", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10192 { &hf_rsvp_flowspec_slack_term, { "Slack term", "rsvp.flowspec.slack_term", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10193 { &hf_rsvp_flowspec_signal_type_sonet, { "Signal Type", "rsvp.flowspec.signal_type", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &gmpls_sonet_signal_type_str_ext, 0x0, NULL, HFILL }},
10194 { &hf_rsvp_flowspec_requested_concatenation, { "Requested Concatenation (RCC)", "rsvp.flowspec.requested_concatenation", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10195 { &hf_rsvp_flowspec_number_of_contiguous_components, { "Number of Contiguous Components (NCC)", "rsvp.flowspec.number_of_contiguous_components", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10196 { &hf_rsvp_flowspec_number_of_virtual_components, { "Number of Virtual Components (NVC)", "rsvp.flowspec.number_of_virtual_components", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10197 { &hf_rsvp_flowspec_multiplier, { "Multiplier (MT)", "rsvp.flowspec.multiplier", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10198 { &hf_rsvp_flowspec_transparency, { "Transparency (T)", "rsvp.flowspec.transparency", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10199 { &hf_rsvp_flowspec_profile, { "Profile (P)", "rsvp.flowspec.profile", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10200 { &hf_rsvp_flowspec_signal_type_g709, { "Signal Type", "rsvp.flowspec.signal_type", FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gmpls_g709_signal_type_rvals), 0x0, NULL, HFILL }},
10201 { &hf_rsvp_flowspec_number_of_multiplexed_components, { "Number of Multiplexed Components (NMC)", "rsvp.flowspec.number_of_multiplexed_components", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10202 { &hf_rsvp_flowspec_mtu, { "MTU", "rsvp.flowspec.mtu", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10203 { &hf_rsvp_flowspec_m, { "m", "rsvp.flowspec.m", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10204 { &hf_rsvp_ctype_adspec, { "C-Type", "rsvp.ctype.adspec", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10205 { &hf_rsvp_adspec_message_format_version, { "Message format version", "rsvp.adspec.message_format_version", FT_UINT8, BASE_DEC, NULL, 0xF0, NULL, HFILL }},
10206 { &hf_rsvp_adspec_service_header, { "Service header", "rsvp.adspec.service_header", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &intsrv_services_str_ext, 0x0, NULL, HFILL }},
10207 { &hf_rsvp_ctype_integrity, { "C-Type", "rsvp.ctype.integrity", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10208 { &hf_rsvp_integrity_flags, { "Flags", "rsvp.integrity.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10209 { &hf_rsvp_integrity_key_identifier, { "Key Identifier", "rsvp.integrity.key_identifier", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10210 { &hf_rsvp_integrity_sequence_number, { "Sequence Number", "rsvp.integrity.sequence_number", FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10211 { &hf_rsvp_integrity_hash, { "Hash", "rsvp.integrity.hash", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10212 { &hf_rsvp_ctype_policy, { "C-Type", "rsvp.ctype.policy", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10213 { &hf_rsvp_policy_data, { "Data", "rsvp.policy.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10214 { &hf_rsvp_ctype_label_request, { "C-Type", "rsvp.ctype.label_request", FT_UINT32, BASE_DEC, VALS(rsvp_c_type_label_request_vals), 0x0, NULL, HFILL }},
10215 { &hf_rsvp_label_request_l3pid, { "L3PID", "rsvp.label_request.l3pid", FT_UINT16, BASE_HEX, VALS(etype_vals), 0x0, NULL, HFILL }},
10216 { &hf_rsvp_label_request_min_vpi, { "Min VPI", "rsvp.label_request.min_vpi", FT_UINT16, BASE_DEC, NULL, 0x7f, NULL, HFILL }},
10217 { &hf_rsvp_label_request_min_vci, { "Min VCI", "rsvp.label_request.min_vci", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10218 { &hf_rsvp_label_request_max_vpi, { "Max VPI", "rsvp.label_request.max_vpi", FT_UINT16, BASE_DEC, NULL, 0x7f, NULL, HFILL }},
10219 { &hf_rsvp_label_request_max_vci, { "Max VCI", "rsvp.label_request.max_vci", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10220 { &hf_rsvp_label_request_lsp_encoding_type, { "LSP Encoding Type", "rsvp.label_request.lsp_encoding_type", FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gmpls_lsp_enc_rvals), 0x0, NULL, HFILL }},
10221 { &hf_rsvp_label_request_switching_type, { "Switching Type", "rsvp.label_request.switching_type", FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gmpls_switching_type_rvals), 0x0, NULL, HFILL }},
10222 { &hf_rsvp_g_pid, { "G-PID", "rsvp.label_request.g_pid", FT_UINT16, BASE_HEX|BASE_RANGE_STRING, RVALS(gmpls_gpid_rvals), 0x0, NULL, HFILL }},
10223 { &hf_rsvp_label_request_data, { "Data", "rsvp.label_request.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10224 { &hf_rsvp_label_label, { "Label", "rsvp.label.label", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10225 { &hf_rsvp_label_generalized_label, { "Generalized Label", "rsvp.label.generalized_label", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
10226 { &hf_rsvp_label_generalized_label_evpl_vlad_id, { "VLAN ID", "rsvp.label.generalized_label_evpl_vlad_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10227 { &hf_rsvp_label_data, { "Data", "rsvp.label.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10228 { &hf_rsvp_label_set_action, { "Action", "rsvp.label_set.action", FT_UINT8, BASE_DEC, VALS(action_type_vals), 0x0, NULL, HFILL }},
10229 { &hf_rsvp_ctype_attribute, { "C-Type", "rsvp.ctype.attribute", FT_UINT32, BASE_DEC, VALS(rsvp_c_type_attribute_vals), 0x0, NULL, HFILL }},
10230 { &hf_rsvp_session_attribute_exclude_any, { "Exclude-Any", "rsvp.session_attribute.exclude_any", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10231 { &hf_rsvp_session_attribute_include_any, { "Include-Any", "rsvp.session_attribute.include_any", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10232 { &hf_rsvp_session_attribute_include_all, { "Include-All", "rsvp.session_attribute.include_all", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10233 { &hf_rsvp_session_attribute_setup_priority, { "Setup priority", "rsvp.session_attribute.setup_priority", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10234 { &hf_rsvp_session_attribute_hold_priority, { "Hold priority", "rsvp.session_attribute.hold_priority", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10235 { &hf_rsvp_session_attribute_flags, { "Flags", "rsvp.session_attribute.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10236 { &hf_rsvp_session_attribute_name_length, { "Name length", "rsvp.session_attribute.name_length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10237 { &hf_rsvp_session_attribute_name, { "Name", "rsvp.session_attribute.name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10238 { &hf_rsvp_session_attribute_data, { "Data", "rsvp.session_attribute.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10239 { &hf_rsvp_ero_rro_subobjects_length, { "Length", "rsvp.ero_rro_subobjects.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10240 { &hf_rsvp_ero_rro_subobjects_ipv4_hop, { "IPv4 hop", "rsvp.ero_rro_subobjects.ipv4_hop", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10241 { &hf_rsvp_ero_rro_subobjects_prefix_length, { "Prefix length", "rsvp.ero_rro_subobjects.prefix_length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10242 { &hf_rsvp_ero_rro_subobjects_flags, { "Flags", "rsvp.ero_rro_subobjects.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10243 { &hf_rsvp_ero_rro_subobjects_ipv6_hop, { "IPv6 hop", "rsvp.ero_rro_subobjects.ipv6_hop", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10244 { &hf_rsvp_ero_rro_subobjects_label, { "Label", "rsvp.ero_rro_subobjects.label", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10245 { &hf_rsvp_ero_rro_subobjects_router_id, { "Router-ID", "rsvp.ero_rro_subobjects.router_id", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10246 { &hf_rsvp_ero_rro_subobjects_interface_id, { "Interface-ID", "rsvp.ero_rro_subobjects.interface_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10247 { &hf_rsvp_ero_rro_subobjects_path_key, { "Path Key", "rsvp.ero_rro_subobjects.path_key", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10248 { &hf_rsvp_ero_rro_subobjects_pce_id_ipv4, { "PCE-ID", "rsvp.ero_rro_subobjects.pce_id_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10249 { &hf_rsvp_ero_rro_subobjects_pce_id_ipv6, { "PCE-ID", "rsvp.ero_rro_subobjects.pce_id_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10250 { &hf_rsvp_ero_rro_subobjects_private_length, { "Length", "rsvp.ero_rro_subobjects.private_length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10251 { &hf_rsvp_ero_rro_subobjects_private_data, { "Data", "rsvp.ero_rro_subobjects.private_data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10252 { &hf_rsvp_ctype_explicit_route, { "C-Type", "rsvp.ctype.explicit_route", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10253 { &hf_rsvp_explicit_route_data, { "Data", "rsvp.explicit_route.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10254 { &hf_rsvp_ctype_record_route, { "C-Type", "rsvp.ctype.record_route", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10255 { &hf_rsvp_record_route_data, { "Data", "rsvp.record_route.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10256 { &hf_rsvp_ctype_exclude_route, { "C-Type", "rsvp.ctype.exclude_route", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10257 { &hf_rsvp_exclude_route_data, { "Data", "rsvp.exclude_route.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10258 { &hf_rsvp_ctype_secondary_explicit_route, { "C-Type", "rsvp.ctype.secondary_explicit_route", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10259 { &hf_rsvp_secondary_explicit_route_data, { "Data", "rsvp.secondary_explicit_route.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10260 { &hf_rsvp_ctype_secondary_record_route, { "C-Type", "rsvp.ctype.secondary_record_route", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10261 { &hf_rsvp_secondary_record_route_data, { "Data", "rsvp.secondary_record_route.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10262 { &hf_rsvp_ctype_message_id, { "C-Type", "rsvp.ctype.message_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10263 { &hf_rsvp_message_id_flags, { "Flags", "rsvp.message_id.flags", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10264 { &hf_rsvp_message_id_epoch, { "Epoch", "rsvp.message_id.epoch", FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10265 { &hf_rsvp_message_id_message_id, { "Message-ID", "rsvp.message_id.message_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10266 { &hf_rsvp_message_id_data, { "Data", "rsvp.message_id.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10267 { &hf_rsvp_ctype_message_id_ack, { "C-Type", "rsvp.ctype.message_id_ack", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10268 { &hf_rsvp_message_id_ack_flags, { "Flags", "rsvp.message_id_ack.flags", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10269 { &hf_rsvp_message_id_ack_epoch, { "Epoch", "rsvp.message_id_ack.epoch", FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10270 { &hf_rsvp_message_id_ack_message_id, { "Message-ID", "rsvp.message_id_ack.message_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10271 { &hf_rsvp_message_id_ack_data, { "Data", "rsvp.message_id_ack.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10272 { &hf_rsvp_ctype_message_id_list, { "C-Type", "rsvp.ctype.message_id_list", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10273 { &hf_rsvp_message_id_list_flags, { "Flags", "rsvp.message_id_list.flags", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10274 { &hf_rsvp_message_id_list_epoch, { "Epoch", "rsvp.message_id_list.epoch", FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10275 { &hf_rsvp_message_id_list_message_id, { "Message-ID", "rsvp.message_id_list.message_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10276 { &hf_rsvp_message_id_list_data, { "Data", "rsvp.message_id_list.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10277 { &hf_rsvp_ctype_hello, { "C-Type", "rsvp.ctype.hello", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10278 { &hf_rsvp_hello_source_instance, { "Source Instance", "rsvp.hello.source_instance", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10279 { &hf_rsvp_hello_destination_instance, { "Destination Instance", "rsvp.hello.destination_instance", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10280 { &hf_rsvp_ctype_dclass, { "C-Type", "rsvp.ctype.dclass", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10281 { &hf_rsvp_dclass_dscp, { "DSCP", "rsvp.dclass.dscp", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &dscp_vals_ext, 0x0, NULL, HFILL }},
10282 { &hf_rsvp_dclass_data, { "Data", "rsvp.dclass.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10283 { &hf_rsvp_ctype_admin_status, { "C-Type", "rsvp.ctype.admin_status", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10284 { &hf_rsvp_admin_status_bits, { "Admin Status", "rsvp.admin_status.bits", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10285 { &hf_rsvp_admin_status_data, { "Data", "rsvp.admin_status.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10286 { &hf_rsvp_ctype_lsp_attributes, { "C-Type", "rsvp.ctype.lsp_attributes", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10287 { &hf_rsvp_lsp_attributes_tlv, { "LSP attributes TLV", "rsvp.lsp_attributes_tlv", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10288 { &hf_rsvp_lsp_attributes_tlv_data, { "Data", "rsvp.lsp_attributes_tlv.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10289 { &hf_rsvp_ctype_association, { "C-Type", "rsvp.ctype.association", FT_UINT32, BASE_DEC, VALS(rsvp_c_type_association_vals), 0x0, NULL, HFILL }},
10290 { &hf_rsvp_association_type, { "Association type", "rsvp.association.type", FT_UINT16, BASE_DEC, VALS(association_type_vals), 0x0, NULL, HFILL }},
10291 { &hf_rsvp_association_id, { "Association ID", "rsvp.association.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10292 { &hf_rsvp_association_source_ipv4, { "Association source", "rsvp.association.source_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10293 { &hf_rsvp_association_source_ipv6, { "Association source", "rsvp.association.source_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10294 { &hf_rsvp_association_routing_area_id, { "Routing Area ID", "rsvp.association.routing_area_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10295 { &hf_rsvp_association_node_id, { "Node ID", "rsvp.association.node_id", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10296 { &hf_rsvp_association_padding, { "Padding", "rsvp.association.padding", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10297 { &hf_rsvp_association_data, { "Data", "rsvp.association.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10298 { &hf_rsvp_ctype_tunnel_if_id, { "C-Type", "rsvp.ctype.tunnel_if_id", FT_UINT32, BASE_DEC, VALS(rsvp_c_type_tunnel_if_vals), 0x0, NULL, HFILL }},
10299 { &hf_rsvp_lsp_tunnel_if_id_length, { "Length", "rsvp.lsp_tunnel_if_id.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10300 { &hf_rsvp_lsp_tunnel_if_id_component_link_identifier, { "Component link identifier", "rsvp.lsp_tunnel_if_id.component_link_identifier", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10301 { &hf_rsvp_lsp_tunnel_if_id_component_link_identifier_ipv4, { "Component link identifier", "rsvp.lsp_tunnel_if_id.component_link_identifier_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10302 { &hf_rsvp_lsp_tunnel_if_id_lsp_encoding_type, { "LSP Encoding Type", "rsvp.lsp_tunnel_if_id.lsp_encoding_type", FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gmpls_lsp_enc_rvals), 0x0, NULL, HFILL }},
10303 { &hf_rsvp_lsp_tunnel_if_id_switching_type, { "Switching Type", "rsvp.lsp_tunnel_if_id.switching_type", FT_UINT8, BASE_DEC|BASE_RANGE_STRING, RVALS(gmpls_switching_type_rvals), 0x0, NULL, HFILL }},
10304 { &hf_rsvp_lsp_tunnel_if_id_signal_type, { "Signal Type", "rsvp.lsp_tunnel_if_id.signal_type", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &gmpls_sonet_signal_type_str_ext, 0x0, NULL, HFILL }},
10305 { &hf_rsvp_lsp_tunnel_if_id_connection_id, { "Sub Interface/Connection ID", "rsvp.lsp_tunnel_if_id.connection_id", FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10306 { &hf_rsvp_lsp_tunnel_if_id_sc_pc_id, { "SC PC ID", "rsvp.lsp_tunnel_if_id.sc_pc_id", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10307 { &hf_rsvp_lsp_tunnel_if_id_sc_pc_scn_address, { "SC PC SCN Address", "rsvp.lsp_tunnel_if_id.sc_pc_scn_address", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10308 { &hf_rsvp_lsp_tunnel_if_id_router_id, { "Router ID", "rsvp.lsp_tunnel_if_id.router_id", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10309 { &hf_rsvp_lsp_tunnel_if_id_interface_id, { "Interface ID", "rsvp.lsp_tunnel_if_id.interface_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10310 { &hf_rsvp_lsp_tunnel_if_id_ipv4_interface_address, { "IPv4 interface address", "rsvp.lsp_tunnel_if_id.ipv4_interface_address", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10311 { &hf_rsvp_lsp_tunnel_if_id_target_igp_instance, { "Target IGP instance", "rsvp.lsp_tunnel_if_id.target_igp_instance", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10312 { &hf_rsvp_lsp_tunnel_if_id_action, { "Action", "rsvp.lsp_tunnel_if_id.action", FT_UINT8, BASE_DEC, VALS(lsp_tunnel_if_id_action_str), 0xF0, NULL, HFILL }},
10313 { &hf_rsvp_lsp_tunnel_if_id_ipv6_interface_address, { "IPv6 interface address", "rsvp.lsp_tunnel_if_id.ipv6_interface_address", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10314 { &hf_rsvp_lsp_tunnel_if_id_data, { "Data", "rsvp.lsp_tunnel_if_id.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10315 { &hf_rsvp_notify_request_notify_node_address_ipv4, { "Notify node address", "rsvp.notify_request.notify_node_address_ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10316 { &hf_rsvp_notify_request_notify_node_address_ipv6, { "Notify node address", "rsvp.notify_request.notify_node_address_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10317 { &hf_rsvp_notify_request_data, { "Data", "rsvp.notify_request.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10318 { &hf_rsvp_ctype_call_id, { "C-Type", "rsvp.ctype.call_id", FT_UINT32, BASE_DEC, VALS(rsvp_c_type_call_id_vals), 0x0, NULL, HFILL }},
10319 { &hf_rsvp_call_id_data, { "Data", "rsvp.call_id.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10320 { &hf_rsvp_call_id_address_type, { "Address type", "rsvp.call_id.address_type", FT_UINT8, BASE_DEC, VALS(address_type_vals), 0x0, NULL, HFILL }},
10321 { &hf_rsvp_call_id_reserved, { "Reserved", "rsvp.call_id.reserved", FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10322 { &hf_rsvp_call_id_international_segment, { "International Segment", "rsvp.call_id.international_segment", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10323 { &hf_rsvp_call_id_national_segment, { "National Segment", "rsvp.call_id.national_segment", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10324 { &hf_rsvp_call_id_local_identifier, { "Local Identifier", "rsvp.call_id.local_identifier", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10325 { &hf_rsvp_restart_cap_data, { "Data", "rsvp.restart_cap.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10326 { &hf_rsvp_link_cap_data, { "Data", "rsvp.link_cap.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10327 { &hf_rsvp_capability_flags, { "Flags", "rsvp.capability.flags", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10328 { &hf_rsvp_capability_flags_reserved, { "Reserved", "rsvp.capability.flags.reserved", FT_UINT32, BASE_HEX, NULL, 0xFFFFFFE0, NULL, HFILL }},
10329 { &hf_rsvp_capability_flags_f, { "Per-Peer Flow-Control (F)", "rsvp.capability.flags.f", FT_BOOLEAN, 32, TFS(&tfs_capable_not_capable), 0x00000010, NULL, HFILL }},
10330 { &hf_rsvp_capability_flags_i, { "RI-RSVP (I)", "rsvp.capability.flags.i", FT_BOOLEAN, 32, TFS(&tfs_capable_not_capable), 0x00000008, NULL, HFILL }},
10331 { &hf_rsvp_capability_flags_t, { "RecoveryPath Transmit (T)", "rsvp.capability.flags.t", FT_BOOLEAN, 32, TFS(&tfs_enabled_disabled), 0x00000004, NULL, HFILL }},
10332 { &hf_rsvp_capability_flags_r, { "RecoveryPath (R)", "rsvp.capability.flags.r", FT_BOOLEAN, 32, TFS(&tfs_desired_not_desired), 0x00000002, NULL, HFILL }},
10333 { &hf_rsvp_capability_flags_s, { "RecoveryPath Srefresh (S)", "rsvp.capability.flags.s", FT_BOOLEAN, 32, TFS(&tfs_capable_not_capable), 0x00000001, NULL, HFILL }},
10334 { &hf_rsvp_capability_data, { "Data", "rsvp.capability.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10335 { &hf_rsvp_protection_info_link_flags, { "Link Flags", "rsvp.protection_info.link_flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10336 { &hf_rsvp_protection_info_data, { "Data", "rsvp.protection_info.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10337 { &hf_rsvp_fast_reroute_setup_priority, { "Setup Priority", "rsvp.fast_reroute.setup_priority", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10338 { &hf_rsvp_fast_reroute_hold_priority, { "Hold Priority", "rsvp.fast_reroute.hold_priority", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10339 { &hf_rsvp_fast_reroute_hop_limit, { "Hop Limit", "rsvp.fast_reroute.hop_limit", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10340 { &hf_rsvp_fast_reroute_flags, { "Flags", "rsvp.fast_reroute.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10341 { &hf_rsvp_fast_reroute_bandwidth, { "Bandwidth", "rsvp.fast_reroute.bandwidth", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10342 { &hf_rsvp_fast_reroute_include_any, { "Include-Any", "rsvp.fast_reroute.include_any", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10343 { &hf_rsvp_fast_reroute_exclude_any, { "Exclude-Any", "rsvp.fast_reroute.exclude_any", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10344 { &hf_rsvp_fast_reroute_include_all, { "Include-All", "rsvp.fast_reroute.include_all", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10345 { &hf_rsvp_fast_reroute_data, { "Data", "rsvp.fast_reroute.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10346 { &hf_rsvp_detour_data, { "Data", "rsvp.detour.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10347 { &hf_rsvp_diffserv_data, { "Data", "rsvp.diffserv.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10348 { &hf_rsvp_diffserv_aware_te_data, { "Data", "rsvp.diffserv_aware_te.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10349 { &hf_rsvp_version, { "RSVP Version", "rsvp.version", FT_UINT8, BASE_DEC, NULL, 0xF0, NULL, HFILL }},
10350 { &hf_rsvp_flags, { "Flags", "rsvp.flags", FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL }},
10351 { &hf_rsvp_sending_ttl, { "Sending TTL", "rsvp.sending_ttl", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10352 { &hf_rsvp_message_length, { "Message length", "rsvp.message_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10353 { &hf_rsvp_length, { "Length", "rsvp.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10354 { &hf_rsvp_extended_tunnel_id, { "Extended Tunnel ID", "rsvp.extended_tunnel_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10355 { &hf_rsvp_extended_tunnel_ipv6, { "Extended Tunnel ID", "rsvp.extended_tunnel_id_ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10356 { &hf_rsvp_extended_tunnel, { "Extended Tunnel ID", "rsvp.extended_tunnel", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10357 { &hf_rsvp_refresh_interval, { "Refresh interval", "rsvp.refresh_interval", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10358 { &hf_rsvp_minimum_policed_unit, { "Minimum policed unit [m]", "rsvp.minimum_policed_unit", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10359 { &hf_rsvp_maximum_packet_size, { "Maximum packet size [M]", "rsvp.maximum_packet_size", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10360 { &hf_rsvp_hf_rsvp_adspec_break_bit, { "Break bit", "rsvp.adspec.break_bit", FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x80, NULL, HFILL }},
10361 { &hf_rsvp_label_request_m, { "M (Merge in Data Plane)", "rsvp.label_request.m", FT_BOOLEAN, 8, TFS(&tfs_can_cannot), 0x80, NULL, HFILL }},
10362 { &hf_rsvp_dlci_length, { "DLCI Length", "rsvp.label_request.dlci_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10363 { &hf_rsvp_min_dlci, { "Min DLCI", "rsvp.label_request.min_dlci", FT_UINT24, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10364 { &hf_rsvp_max_dlci, { "Max DLCI", "rsvp.label_request.max_dlci", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10365 { &hf_rsvp_ero_rro_autonomous_system, { "Autonomous System", "rsvp.ero_rro_subobjects.autonomous_system", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10366 { &hf_rsvp_nsap_length, { "NSAP Length", "rsvp.nsap_length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10367 { &hf_rsvp_gen_uni_data, { "Data", "rsvp.gen_uni.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10368 { &hf_rsvp_gen_uni_logical_port_id, { "Logical Port ID", "rsvp.gen_uni.logical_port_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10369 { &hf_rsvp_gen_uni_service_level, { "Service Level", "rsvp.gen_uni.service_level", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10370 { &hf_rsvp_restart_cap_restart_time, { "Restart Time", "rsvp.restart_cap.restart_time", FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL }},
10371 { &hf_rsvp_restart_cap_recovery_time, { "Recovery Time", "rsvp.restart_cap.recovery_time", FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL }},
10372 { &hf_rsvp_detour_plr_id, { "PLR ID", "rsvp.detour.plr_id", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10373 { &hf_rsvp_detour_avoid_node_id, { "Avoid Node ID", "rsvp.detour.avoid_node_id", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10374 { &hf_rsvp_message_checksum, { "Message Checksum", "rsvp.message_checksum", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
10375 { &hf_rsvp_call_attributes_endpont_id, { "Endpoint ID", "rsvp.call_attributes.endpoint_id", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10376 { &hf_rsvp_isis_area_id, { "IS-IS Area Identifier", "rsvp.isis_area_id", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10377 { &hf_rsvp_adspec_type, { "Adspec Type", "rsvp.adspec.type", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &adspec_params_ext, 0x0, NULL, HFILL }},
10378 { &hf_rsvp_adspec_len, { "Length", "rsvp.adspec.len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10379 { &hf_rsvp_adspec_uint, { "Adspec uint", "rsvp.adspec.uint", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10380 { &hf_rsvp_adspec_float, { "Adspec float", "rsvp.adspec.float", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10381 { &hf_rsvp_adspec_bytes, { "Adspec bytes", "rsvp.adspec.bytes", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10382 { &hf_rsvp_wavelength_freq, { "Freq", "rsvp.wavelength.freq", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10383 { &hf_rsvp_wavelength_grid, { "Grid", "rsvp.wavelength.grid", FT_UINT8, BASE_DEC, VALS(lambda_grid_vals), 0xE0, NULL, HFILL }},
10384 { &hf_rsvp_wavelength_cs1, { "Channel Spacing", "rsvp.wavelength.cs1", FT_UINT8, BASE_DEC, VALS(grid1_cs_vals), 0x1E, NULL, HFILL }},
10385 { &hf_rsvp_wavelength_cs2, { "Channel Spacing", "rsvp.wavelength.cs2", FT_UINT8, BASE_DEC, VALS(grid2_cs_vals), 0x1E, NULL, HFILL }},
10386 { &hf_rsvp_wavelength_cs3, { "Channel Spacing", "rsvp.wavelength.cs3", FT_UINT8, BASE_DEC, VALS(grid3_cs_vals), 0x1E, NULL, HFILL }},
10387 { &hf_rsvp_wavelength_channel_spacing, { "Channel Spacing", "rsvp.wavelength.channel_spacing", FT_UINT8, BASE_DEC, NULL, 0x1E, NULL, HFILL }},
10388 { &hf_rsvp_wavelength_n, { "Central Frequency", "rsvp.wavelength.n", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10389 { &hf_rsvp_wavelength_m, { "Channel Width (m)", "rsvp.wavelength.m", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10390 { &hf_rsvp_wavelength_wavelength, { "Wavelength", "rsvp.wavelength.wavelength", FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_nanometers), 0x0, NULL, HFILL }},
10391 { &hf_rsvp_sonet_s, { "S", "rsvp.sonet.s", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10392 { &hf_rsvp_sonet_u, { "U", "rsvp.sonet.u", FT_UINT8, BASE_DEC, NULL, 0xF0, NULL, HFILL }},
10393 { &hf_rsvp_sonet_k, { "K", "rsvp.sonet.k", FT_UINT8, BASE_DEC, NULL, 0x0F, NULL, HFILL }},
10394 { &hf_rsvp_sonet_l, { "L", "rsvp.sonet.l", FT_UINT8, BASE_DEC, NULL, 0xF0, NULL, HFILL }},
10395 { &hf_rsvp_sonet_m, { "M", "rsvp.sonet.m", FT_UINT8, BASE_DEC, NULL, 0x0F, NULL, HFILL }},
10396 { &hf_rsvp_g709_t3, { "t3", "rsvp.g709.t3", FT_UINT16, BASE_DEC, NULL, 0x03F0, NULL, HFILL }},
10397 { &hf_rsvp_g709_t2, { "t2", "rsvp.g709.t2", FT_UINT8, BASE_DEC, NULL, 0x0E, NULL, HFILL }},
10398 { &hf_rsvp_g709_t1, { "t1", "rsvp.g709.t1", FT_UINT8, BASE_DEC, NULL, 0x01, NULL, HFILL }},
10399 { &hf_rsvp_ctype_label_set, { "C-Type", "rsvp.ctype.label_set", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10400 { &hf_rsvp_label_set_type, { "Label type", "rsvp.label_set.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10401 { &hf_rsvp_label_set_subchannel, { "Subchannel", "rsvp.label_set.subchannel", FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
10402 { &hf_rsvp_nsap_address, { "NSAP address", "rsvp.nsap_address", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10403 { &hf_rsvp_class_diversity, { "Diversity", "rsvp.class_diversity", FT_UINT8, BASE_DEC, VALS(ouni_guni_diversity_str), 0xF0, NULL, HFILL }},
10404 { &hf_rsvp_egress_label_type, { "Label type", "rsvp.egress.label_type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10405 { &hf_rsvp_egress_label, { "Label", "rsvp.egress.label", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10406 { &hf_rsvp_source_transport_network_addr, { "Source Transport Network addr", "rsvp.source_transport_network_addr", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10407 { &hf_rsvp_ie_data, { "IE Data", "rsvp.ie_data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
10408 { &hf_rsvp_3gpp_obj_pf_dst_port_range, { "Destination Port range", "rsvp.3gpp_obj.pf_dst_port_range", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10409 { &hf_rsvp_3gpp_obj_pf_src_port_range, { "Source Port range", "rsvp.3gpp_obj.pf_src_port_range", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
10412 static ei_register_info ei[] = {
10413 { &ei_rsvp_invalid_length, { "rsvp.invalid_length", PI_MALFORMED, PI_ERROR, "Invalid length", EXPFILL }},
10414 { &ei_rsvp_packet_filter_component, { "rsvp.packet_filter_component", PI_UNDECODED, PI_WARN, "Not dissected Packet filter component", EXPFILL }},
10415 { &ei_rsvp_bundle_component_msg, { "rsvp.bundle_component_msg", PI_UNDECODED, PI_WARN, "Bundle Component Messages Not Dissected", EXPFILL }},
10416 { &ei_rsvp_parameter, { "rsvp.parameter.unknown", PI_PROTOCOL, PI_WARN, "Unknown parameter", EXPFILL }},
10417 { &ei_rsvp_adspec_type, { "rsvp.adspec.type.unknown", PI_PROTOCOL, PI_WARN, "Unknown type", EXPFILL }},
10418 { &ei_rsvp_call_id_address_type, { "rsvp.call_id.address_type.unknown", PI_PROTOCOL, PI_WARN, "Unknown Transport Network type", EXPFILL }},
10419 { &ei_rsvp_session_type, { "rsvp.session_type.unknown", PI_PROTOCOL, PI_WARN, "Unknown session type", EXPFILL }},
10422 expert_module_t* expert_rsvp;
10424 int *ett_tree[TT_MAX];
10426 /* Build the tree array */
10427 for (i=0; i<TT_MAX; i++) {
10428 ett_tree[i] = &(ett_treelist[i]);
10430 proto_rsvp = proto_register_protocol("Resource ReserVation Protocol (RSVP)", "RSVP", "rsvp");
10431 /* Created to remove Decode As confusion */
10432 proto_rsvp_e2e1 = proto_register_protocol_in_name_only("Resource ReserVation Protocol (RSVP-E2EI)", "RSVP-E2EI", "rsvp-e2ei", proto_rsvp, FT_PROTOCOL);
10434 rsvp_handle = register_dissector("rsvp", dissect_rsvp, proto_rsvp);
10435 rsvpe2ei_handle = register_dissector("rsvp_e2ei", dissect_rsvp_e2ei, proto_rsvp_e2e1);
10437 proto_register_field_array(proto_rsvp, rsvpf_info, array_length(rsvpf_info));
10438 proto_register_subtree_array(ett_tree, array_length(ett_tree));
10439 expert_rsvp = expert_register_protocol(proto_rsvp);
10440 expert_register_field_array(expert_rsvp, ei, array_length(ei));
10441 register_rsvp_prefs();
10443 rsvp_request_hash = wmem_map_new_autoreset(wmem_epan_scope(), wmem_file_scope(), rsvp_hash, rsvp_equal);
10445 register_conversation_table(proto_rsvp, true, rsvp_conversation_packet, rsvp_endpoint_packet);
10447 rsvp_tap = register_tap("rsvp");
10450 void
10451 proto_reg_handoff_rsvp(void)
10453 dissector_add_uint("ip.proto", IP_PROTO_RSVP, rsvp_handle);
10454 dissector_add_uint("ip.proto", IP_PROTO_RSVPE2EI, rsvpe2ei_handle);
10455 dissector_add_uint_with_preference("udp.port", UDP_PORT_PRSVP, rsvp_handle);
10459 * Editor modelines - https://www.wireshark.org/tools/modelines.html
10461 * Local variables:
10462 * c-basic-offset: 4
10463 * tab-width: 8
10464 * indent-tabs-mode: nil
10465 * End:
10467 * vi: set shiftwidth=4 tabstop=8 expandtab:
10468 * :indentSize=4:tabSize=8:noTabs=true: