1 /* packet-pcep.c
2 * Routines for PCEP packet disassembly
3 * draft-ietf-pce-pcep-09
4 * draft-ietf-pce-pcep-xro-02
5 * See also RFC 4655, RFC 4657, RFC 5520, RFC 5521, RFC 5440 and RFC 5541
6 *
7 * (c) Copyright 2007 Silvia Cristina Tejedor <silviacristina.tejedor@gmail.com>
8 *
9 * Wireshark - Network traffic analyzer
10 * By Gerald Combs <gerald@wireshark.org>
11 * Copyright 1998 Gerald Combs
12 *
13 * SPDX-License-Identifier: GPL-2.0-or-later
14 *
15 * Added support of "A Set of Monitoring Tools for Path Computation Element
16 * (PCE)-Based Architecture" (RFC 5886)
17 * (c) Copyright 2012 Svetoslav Duhovnikov <duhovnikov[AT]gmail.com>
18 *
19 * Added support of "PCEP Extensions for Stateful PCE"
20 * (draft-ietf-pce-stateful-pce-09) and
21 * "PCEP Extensions for PCE-initiated LSP Setup in a Stateful PCE Model"
22 * (draft-ietf-pce-pce-initiated-lsp-01) and
23 * "Optimizations of Label Switched Path State Synchronization Procedures for a Stateful PCE"
24 * (draft-ietf-pce-stateful-sync-optimizations-01)
25 * (c) Copyright 2014 Simon Zhong <szhong[AT]juniper.net>
26 *
27 * Added support of "PCEP Extensions for Segment Routing"
28 * (draft-ietf-pce-segment-routing-03) and
29 * "Conveying path setup type in PCEP messages"
30 * (draft-ietf-pce-lsp-setup-type-02)
31 * (c) Copyright 2015 Francesco Fondelli <francesco.fondelli[AT]gmail.com>
32 *
33 * Added support of "Extensions to the Path Computation Element Communication Protocol (PCEP)
34 * for Point-to-Multipoint Traffic Engineering Label Switched Paths" (RFC 6006)
35 * (c) Copyright 2015 Francesco Paolucci <fr.paolucci[AT].sssup.it>,
36 * Oscar Gonzalez de Dios <oscar.gonzalezdedios@telefonica.com>,
37 * ICT EU PACE Project, www.ict-pace.net
38 *
39 * Added support of "PCEP Extensions for Establishing Relationships
40 * Between Sets of LSPs" (draft-ietf-pce-association-group-00)
41 * (c) Copyright 2015 Francesco Fondelli <francesco.fondelli[AT]gmail.com>
42 *
43 * Added support of "Conveying Vendor-Specific Constraints in the
44 * Path Computation Element Communication Protocol" (RFC 7470)
45 * Completed support of RFC 6006
46 * Added support of "PCE-Based Computation Procedure to Compute Shortest
47 Constrained Point-to-Multipoint (P2MP) Inter-Domain Traffic Engineering
48 Label Switched Paths" (RFC 7334)
49 * (c) Copyright 2016 Simon Zhong <szhong[AT]juniper.net>
50 *
51 * Added support of "Extensions to the Path Computation Element Communication Protocol (PCEP)
52 * to compute service aware Label Switched Path (LSP)." (draft-ietf-pce-pcep-service-aware-13)
53 * Updated support of "PCEP Extensions for Segment Routing" (draft-ietf-pce-segment-routing-08)
54 * (c) Copyright 2017 Simon Zhong <szhong[AT]juniper.net>
55 * Updated support from draft-ietf-pce-segment-routing-08 to RFC 8664 "PCEP Extensions for Segment Routing"
56 * Added support of draft-ietf-pce-segment-routing-policy-cp-05 "PCEP extension to support Segment Routing Policy Candidate Paths"
57 * (c) Copyright 2021 Oscar Gonzalez de Dios <oscar.gonzalezdedios[AT]telefonica.com>
58 */
59
60 #include "config.h"
61
62 #include <epan/packet.h>
63 #include <epan/to_str.h>
64 #include <epan/expert.h>
65 #include <epan/addr_resolv.h>
66 #include "packet-tcp.h"
67
68 void proto_register_pcep(void);
69 void proto_reg_handoff_pcep(void);
70
71 /* Object-Class */
72 #define PCEP_OPEN_OBJ 1
73 #define PCEP_RP_OBJ 2
74 #define PCEP_NO_PATH_OBJ 3
75 #define PCEP_END_POINT_OBJ 4
76 #define PCEP_BANDWIDTH_OBJ 5
77 #define PCEP_METRIC_OBJ 6
78 #define PCEP_EXPLICIT_ROUTE_OBJ 7
79 #define PCEP_RECORD_ROUTE_OBJ 8
80 #define PCEP_LSPA_OBJ 9
81 #define PCEP_IRO_OBJ 10
82 #define PCEP_SVEC_OBJ 11
83 #define PCEP_NOTIFICATION_OBJ 12
84 #define PCEP_PCEP_ERROR_OBJ 13
85 #define PCEP_LOAD_BALANCING_OBJ 14
86 #define PCEP_CLOSE_OBJ 15
87 #define PCEP_PATH_KEY_OBJ 16
88 #define PCEP_XRO_OBJ 17
89 #define PCEP_OBJ_MONITORING 19
90 #define PCEP_OBJ_PCC_ID_REQ 20
91 #define PCEP_OF_OBJ 21
92 #define PCEP_OBJ_PCE_ID 25
93 #define PCEP_OBJ_PROC_TIME 26
94 #define PCEP_OBJ_OVERLOAD 27
95 #define PCEP_OBJ_UNREACH_DESTINATION 28 /* RFC 6006 */
96 #define PCEP_SERO_OBJ 29
97 #define PCEP_SRRO_OBJ 30
98 #define PCEP_OBJ_BRANCH_NODE_CAPABILITY 31 /* RFC 6006 */
99 #define PCEP_OBJ_LSP 32
100 #define PCEP_OBJ_SRP 33
101 #define PCEP_OBJ_VENDOR_INFORMATION 34 /* RFC 7470 */
102 #define PCEP_OBJ_BU 35 /* draft-ietf-pce-pcep-service-aware */
103 #define PCEP_ASSOCIATION_OBJ 40 /* RFC 8697 */
104
105 /*Subobjects of EXPLICIT ROUTE Object*/
106 #define PCEP_SUB_IPv4 1
107 #define PCEP_SUB_IPv6 2
108 #define PCEP_SUB_LABEL_CONTROL 3
109 #define PCEP_SUB_UNNUMB_INTERFACE_ID 4
110 #define PCEP_SUB_SR_PRE_IANA 5 /* squatted, pre IANA assignment */
111 #define PCEP_SUB_AUTONOMOUS_SYS_NUM 32
112 #define PCEP_SUB_EXRS 33
113 #define PCEP_SUB_SRLG 34
114 #define PCEP_SUB_SR 36 /* IANA assigned code point */
115 #define PCEP_SUB_PKSv4 64
116 #define PCEP_SUB_PKSv6 65
117
118 /*Possible values of the NI in the NO-PATH object*/
119 #define NO_SATISFYING 0
120 #define CHAIN_BROKEN 1
121
122 /*Possible values of L in the ERO and IRO objects */
123 #define STRICT_HOP 0
124 #define LOOSE_HOP 1
125
126 /*Possible values of U in the ERO and RRO objects */
127 #define DOWNSTREAM_LABEL 0
128 #define UPSTREAM_LABEL 1
129
130 /*Possible values of Notification Type */
131 #define NOT_REQ_CANCEL 1
132 #define PCEP_CONGESTION 2
133
134 /*Possible values of Notification Value for NT=1*/
135 #define NOTI_PCC_CANCEL_REQ 1
136 #define NOTI_PCE_CANCEL_REQ 2
137
138 /*Possible values of Notification Value for NT=2*/
139 #define NOTI_PCE_CONGEST 1
140 #define NOTI_PCE_NO_CONGEST 2
141
142 /*Possible types of errors */
143 #define ESTABLISH_FAILURE 1
144 #define CAP_NOT_SUPPORTED 2
145 #define UNKNOWN_OBJ 3
146 #define NOT_SUPP_OBJ 4
147 #define POLICY_VIOLATION 5
148 #define MANDATORY_OBJ_MIS 6
149 #define SYNCH_PCREQ_MIS 7
150 #define UNKNOWN_REQ_REF 8
151 #define ATTEMPT_2_SESSION 9
152 #define INVALID_OBJ 10
153 #define UNRECO_EXRS_SUBOBJ 11
154 #define DIFFSERV_TE_ERROR 12
155 #define BRPC_FAILURE 13
156 #define GCO_ERROR 15
157 #define P2MP_CAPABILITY_ERROR 16
158 #define P2MP_END_POINTS_ERROR 17
159 #define P2MP_FRAGMENT_ERROR 18
160 #define INVALID_OPERATION 19
161 #define LSP_STATE_SYNCHRONIZATION_ERROR 20
162 #define INVALID_PATH_SETUP_TYPE 21
163 #define BAD_PARAMETER_VALUE 23
164 #define LSP_INSTANTIATION_ERROR 24
165 #define ASSOCIATION_ERROR 26
166 #define WSON_RWA_ERROR 27
167 #define H_PCE_ERROR 28
168 #define PATH_COMPUTATION_FAILURE 29
169
170 /*Different values of Reason in the CLOSE object */
171 #define NO_EXP_PROV 1
172 #define DEADTIME_PROV 2
173 #define RECEP_MALFORM_MSG 3
174
175 /*Different values of Attribute in the XRO object */
176 #define ATTR_INTERFACE 0
177 #define ATTR_NODE 1
178 #define ATTR_SRLG 2
179
180 /*Mask for the flags of HEADER of Messages*/
181 #define PCEP_HDR_MSG_RESERVED 0x1f
182
183 /*Mask for the type of HEADER of Objects*/
184 #define MASK_OBJ_TYPE 0xF0
185
186 /*Mask for the flags of HEADER of Objects*/
187 #define PCEP_HDR_OBJ_RESERVED 0x0C
188 #define PCEP_HDR_OBJ_P 0x02
189 #define PCEP_HDR_OBJ_I 0x01
190
191 /*Mask for the flags of OPEN Object*/
192 #define PCEP_OPEN_RES 0x1F
193
194 /*Mask for the flags of RP Object*/
195 #define PCEP_RP_PRI 0x000007
196 #define PCEP_RP_R 0x000008
197 #define PCEP_RP_B 0x000010
198 #define PCEP_RP_O 0x000020
199 #define PCEP_RP_V 0x000040
200 #define PCEP_RP_S 0x000080
201 #define PCEP_RP_P 0x000100
202 #define PCEP_RP_D 0x000200
203 #define PCEP_RP_M 0x000400
204 #define PCEP_RP_E 0x000800
205 #define PCEP_RP_N 0x001000
206 #define PCEP_RP_F 0x002000
207 #define PCEP_RP_C 0x004000 /* RFC 7334 */
208 #define PCEP_RP_RESERVED 0xFF8000
209
210 /*Mask for the flags of NO PATH Object*/
211 #define PCEP_NO_PATH_C 0x8000
212
213 /*Mask for the flags of METRIC Object*/
214 #define PCEP_METRIC_B 0x01
215 #define PCEP_METRIC_C 0x02
216
217 /*Mask for the flags of LSPA Object*/
218 #define PCEP_LSPA_L 0x01
219
220 /* Mask to differentiate the value of L and Type (Explicit Object)*/
221 #define Mask_L 0x80
222 #define Mask_Type 0x7f
223
224 /* RFC 5440 */
225 #define TCP_PORT_PCEP 4189
226
227 #define IPv4 1
228 #define IPv6 2
229
230 /*RFC 6006*/
231 #define IPv4_P2MP 3
232 #define IPv6_P2MP 4
233 /*RFC 6006 - End Points Leaf Types */
234 #define EP_P2MP_NEW_LEAF_TYPE 1
235 #define EP_P2MP_OLD_REMOVE_LEAF_TYPE 2
236 #define EP_P2MP_OLD_MODIFY_LEAF_TYPE 3
237 #define EP_P2MP_OLD_UNCHANGED_LEAF_TYPE 4
238
239 /*Mask for the flags os SVEC Object*/
240 #define PCEP_SVEC_L 0x000001
241 #define PCEP_SVEC_N 0x000002
242 #define PCEP_SVEC_S 0x000004
243 #define PCEP_SVEC_D 0x000008
244 #define PCEP_SVEC_P 0x000010
245
246 /*Mask for the flags of XRO Object*/
247 #define PCEP_XRO_F 0x0001
248
249 /*Mask for the flags of MONITORING Object*/
250 #define PCEP_OBJ_MONITORING_FLAGS_L 0x000001
251 #define PCEP_OBJ_MONITORING_FLAGS_G 0x000002
252 #define PCEP_OBJ_MONITORING_FLAGS_P 0x000004
253 #define PCEP_OBJ_MONITORING_FLAGS_C 0x000008
254 #define PCEP_OBJ_MONITORING_FLAGS_I 0x000010
255 #define PCEP_OBJ_MONITORING_FLAGS_RESERVED 0xFFFFE0
256
257 /*Define types for PCC-ID-REQ Object*/
258 #define PCEP_OBJ_PCC_ID_REQ_IPv4 1
259 #define PCEP_OBJ_PCC_ID_REQ_IPv6 2
260
261 /*Define types for PCE-ID Object*/
262 #define PCEP_OBJ_PCE_ID_IPv4 1
263 #define PCEP_OBJ_PCE_ID_IPv6 2
264
265 /*Mask for the flags of PROC-TIME Object*/
266 #define PCEP_OBJ_PROC_TIME_FLAGS_E 0x0001
267 #define PCEP_OBJ_PROC_TIME_FLAGS_RESERVED 0xFFFE
268
269 /*Mask for the flags of IPv4, IPv6 and UNnumbered InterfaceID Subobjects of RRO Object*/
270 #define PCEP_SUB_LPA 0x01
271 #define PCEP_SUB_LPU 0x02
272
273 /*Mask for the flags of Label SubObject*/
274 #define PCEP_SUB_LABEL_GL 0x01
275
276 /* Mask for the flags of LSP Object */
277 #define PCEP_OBJ_LSP_PLSP_ID 0xFFFFF0
278 #define PCEP_OBJ_LSP_FLAGS_D 0x0001
279 #define PCEP_OBJ_LSP_FLAGS_S 0x0002
280 #define PCEP_OBJ_LSP_FLAGS_R 0x0004
281 #define PCEP_OBJ_LSP_FLAGS_A 0x0008
282 #define PCEP_OBJ_LSP_FLAGS_O 0x0070
283 #define PCEP_OBJ_LSP_FLAGS_C 0x0080
284 #define PCEP_OBJ_LSP_FLAGS_RESERVED 0x0F00
285
286 /* Mask for the flags of SRP Object */
287 #define PCEP_OBJ_SRP_FLAGS_R 0x00000001
288
289 /* Mask for the flags of Stateful PCE Capability TLV */
290 #define PCEP_TLV_STATEFUL_PCE_CAPABILITY_U 0x0001
291 #define PCEP_TLV_STATEFUL_PCE_CAPABILITY_S 0x0002
292 #define PCEP_TLV_STATEFUL_PCE_CAPABILITY_I 0x0004
293 #define PCEP_TLV_STATEFUL_PCE_CAPABILITY_T 0x0008
294 #define PCEP_TLV_STATEFUL_PCE_CAPABILITY_D 0x0010
295 #define PCEP_TLV_STATEFUL_PCE_CAPABILITY_F 0x0020
296
297 /* Mask for the flags of ASSOCIATION Object */
298 #define PCEP_OBJ_ASSOCIATION_FLAGS_R 0x0001
299
300 /* Mask for the flags of SR PCE Capability TLV */
301 #define PCEP_TLV_SR_PCE_CAPABILITY_L 0x01
302
303 /* Mask for the flags of Subobjevct SR*/
304 #define PCEP_SUBOBJ_SR_FLAGS_M 0x001
305 #define PCEP_SUBOBJ_SR_FLAGS_C 0x002
306 #define PCEP_SUBOBJ_SR_FLAGS_S 0x004
307 #define PCEP_SUBOBJ_SR_FLAGS_F 0x008
308
309 static int proto_pcep = -1;
310
311 static gint hf_pcep_endpoint_p2mp_leaf= -1;
312 static gint hf_pcep_hdr_msg_flags_reserved= -1;
313 static gint hf_pcep_hdr_obj_flags = -1;
314 static gint hf_pcep_hdr_obj_flags_reserved= -1;
315 static gint hf_pcep_hdr_obj_flags_p= -1;
316 static gint hf_pcep_hdr_obj_flags_i= -1;
317 static gint hf_pcep_open_flags_res = -1;
318 static gint hf_pcep_rp_flags_pri = -1;
319 static gint hf_pcep_rp_flags_r = -1;
320 static gint hf_pcep_rp_flags_b = -1;
321 static gint hf_pcep_rp_flags_o = -1;
322 static gint hf_pcep_rp_flags_v = -1;
323 static gint hf_pcep_rp_flags_s = -1;
324 static gint hf_pcep_rp_flags_p = -1;
325 static gint hf_pcep_rp_flags_d = -1;
326 static gint hf_pcep_rp_flags_m = -1;
327 static gint hf_pcep_rp_flags_e = -1;
328 static gint hf_pcep_rp_flags_n = -1;
329 static gint hf_pcep_rp_flags_f = -1;
330 static gint hf_pcep_rp_flags_c = -1;
331 static gint hf_pcep_rp_flags_reserved = -1;
332 static gint hf_pcep_no_path_flags_c = -1;
333 static gint hf_pcep_metric_flags_c = -1;
334 static gint hf_pcep_metric_flags_b = -1;
335 static gint hf_pcep_lspa_flags_l = -1;
336 static gint hf_pcep_svec_flags_l = -1;
337 static gint hf_pcep_svec_flags_n = -1;
338 static gint hf_pcep_svec_flags_s = -1;
339 static gint hf_pcep_svec_flags_d = -1;
340 static gint hf_pcep_svec_flags_p = -1;
341 static gint hf_pcep_xro_flags_f = -1;
342 static gint hf_pcep_obj_monitoring_flags_reserved = -1;
343 static gint hf_pcep_obj_monitoring_flags_l= -1;
344 static gint hf_pcep_obj_monitoring_flags_g= -1;
345 static gint hf_pcep_obj_monitoring_flags_p= -1;
346 static gint hf_pcep_obj_monitoring_flags_c= -1;
347 static gint hf_pcep_obj_monitoring_flags_i= -1;
348 static gint hf_pcep_obj_monitoring_monitoring_id_number = -1;
349 static gint hf_pcep_obj_pcc_id_req_ipv4 = -1;
350 static gint hf_pcep_obj_pcc_id_req_ipv6 = -1;
351 static gint hf_pcep_obj_pce_id_ipv4 = -1;
352 static gint hf_pcep_obj_pce_id_ipv6 = -1;
353 static gint hf_pcep_obj_proc_time_flags_reserved = -1;
354 static gint hf_pcep_obj_proc_time_flags_e = -1;
355 static gint hf_pcep_obj_proc_time_cur_proc_time = -1;
356 static gint hf_pcep_obj_proc_time_min_proc_time = -1;
357 static gint hf_pcep_obj_proc_time_max_proc_time = -1;
358 static gint hf_pcep_obj_proc_time_ave_proc_time = -1;
359 static gint hf_pcep_obj_proc_time_var_proc_time = -1;
360 static gint hf_pcep_obj_overload_duration = -1;
361 static gint pcep_subobj_flags_lpa= -1;
362 static gint pcep_subobj_flags_lpu= -1;
363 static gint pcep_subobj_label_flags_gl= -1;
364 static gint hf_pcep_no_path_tlvs_pce = -1;
365 static gint hf_pcep_no_path_tlvs_unk_dest = -1;
366 static gint hf_pcep_no_path_tlvs_unk_src = -1;
367 static gint hf_pcep_no_path_tlvs_brpc = -1;
368 static gint hf_pcep_no_path_tlvs_pks = -1;
369 static gint hf_pcep_no_path_tlvs_no_gco_migr = -1;
370 static gint hf_pcep_no_path_tlvs_no_gco_soln = -1;
371 static gint hf_pcep_no_path_tlvs_p2mp = -1;
372 static gint hf_PCEPF_MSG = -1;
373 static gint hf_PCEPF_OBJECT_CLASS = -1;
374 static gint hf_PCEPF_OBJ_OPEN = -1;
375 static gint hf_PCEPF_OBJ_RP = -1;
376 static gint hf_PCEPF_OBJ_NO_PATH = -1;
377 static gint hf_PCEPF_OBJ_END_POINT = -1;
378 static gint hf_PCEPF_OBJ_BANDWIDTH = -1;
379 static gint hf_PCEPF_OBJ_METRIC = -1;
380 static gint hf_PCEPF_OBJ_EXPLICIT_ROUTE = -1;
381 static gint hf_PCEPF_OBJ_RECORD_ROUTE = -1;
382 static gint hf_PCEPF_OBJ_SERO = -1;
383 static gint hf_PCEPF_OBJ_SRRO = -1;
384 static gint hf_PCEPF_OBJ_LSPA = -1;
385 static gint hf_PCEPF_OBJ_IRO = -1;
386 static gint hf_PCEPF_OBJ_SVEC = -1;
387 static gint hf_PCEPF_OBJ_NOTIFICATION = -1;
388 static gint hf_PCEPF_OBJ_UNKNOWN_TYPE = -1;
389 static gint hf_PCEPF_NOTI_TYPE = -1;
390 static gint hf_PCEPF_NOTI_VAL1 = -1;
391 static gint hf_PCEPF_NOTI_VAL2 = -1;
392 static gint hf_PCEPF_OBJ_PCEP_ERROR = -1;
393 static gint hf_PCEPF_ERROR_TYPE = -1;
394 static gint hf_PCEPF_ERROR_VALUE = -1;
395 static gint hf_PCEPF_OBJ_LOAD_BALANCING = -1;
396 static gint hf_PCEPF_OBJ_CLOSE = -1;
397 static gint hf_PCEPF_OBJ_PATH_KEY = -1;
398 static gint hf_PCEPF_OBJ_XRO = -1;
399 static gint hf_PCEPF_OBJ_MONITORING = -1;
400 static gint hf_PCEPF_OBJ_PCC_ID_REQ = -1;
401 static gint hf_PCEPF_OBJ_OF = -1;
402 static gint hf_PCEPF_OBJ_PCE_ID = -1;
403 static gint hf_PCEPF_OBJ_PROC_TIME = -1;
404 static gint hf_PCEPF_OBJ_OVERLOAD = -1;
405 static gint hf_PCEPF_OBJ_UNREACH_DESTINATION = -1;
406 static gint hf_PCEPF_OBJ_BRANCH_NODE_CAPABILITY = -1;
407 static gint hf_PCEPF_OBJ_LSP = -1;
408 static gint hf_PCEPF_OBJ_SRP = -1;
409 static gint hf_PCEPF_OBJ_ASSOCIATION = -1;
410 static gint hf_PCEPF_OBJ_VENDOR_INFORMATION = -1;
411 static gint hf_PCEPF_OBJ_BU = -1;
412 static gint hf_PCEPF_SUBOBJ = -1;
413 static gint hf_PCEPF_SUBOBJ_7F = -1;
414 static gint hf_PCEPF_SUBOBJ_IPv4 = -1;
415 static gint hf_PCEPF_SUBOBJ_IPv6 = -1;
416 static gint hf_PCEPF_SUBOBJ_LABEL_CONTROL = -1;
417 static gint hf_PCEPF_SUBOBJ_UNNUM_INTERFACEID = -1;
418 static gint hf_PCEPF_SUBOBJ_AUTONOMOUS_SYS_NUM = -1;
419 static gint hf_PCEPF_SUBOBJ_SRLG = -1;
420 static gint hf_PCEPF_SUBOBJ_EXRS = -1;
421 static gint hf_PCEPF_SUBOBJ_PKSv4 = -1;
422 static gint hf_PCEPF_SUBOBJ_PKSv6 = -1;
423 static gint hf_PCEPF_SUBOBJ_XRO = -1;
424 static gint hf_PCEPF_SUBOBJ_SR = -1;
425 #if 0
426 static gint hf_PCEPF_SUB_XRO_ATTRIB = -1;
427 #endif
428
429 static gint hf_pcep_obj_open_type = -1;
430 static gint hf_pcep_obj_rp_type = -1;
431 static gint hf_pcep_obj_no_path_type = -1;
432 static gint hf_pcep_obj_end_point_type = -1;
433 static gint hf_pcep_obj_bandwidth_type = -1;
434 static gint hf_pcep_obj_metric_type = -1;
435 static gint hf_pcep_obj_explicit_route_type = -1;
436 static gint hf_pcep_obj_record_route_type = -1;
437 static gint hf_pcep_obj_lspa_type = -1;
438 static gint hf_pcep_obj_iro_type = -1;
439 static gint hf_pcep_obj_svec_type = -1;
440 static gint hf_pcep_obj_notification_type = -1;
441 static gint hf_pcep_obj_pcep_error_type = -1;
442 static gint hf_pcep_obj_load_balancing_type = -1;
443 static gint hf_pcep_obj_close_type = -1;
444 static gint hf_pcep_obj_path_key_type = -1;
445 static gint hf_pcep_obj_xro_type = -1;
446 static gint hf_pcep_obj_monitoring_type = -1;
447 static gint hf_pcep_obj_pcc_id_req_type = -1;
448 static gint hf_pcep_obj_of_type = -1;
449 static gint hf_pcep_obj_pce_id_type = -1;
450 static gint hf_pcep_obj_proc_time_type = -1;
451 static gint hf_pcep_obj_overload_type = -1;
452 static gint hf_pcep_obj_unreach_destination_type = -1;
453 static gint hf_pcep_obj_sero_type = -1;
454 static gint hf_pcep_obj_srro_type = -1;
455 static gint hf_pcep_obj_branch_node_capability_type = -1;
456 static gint hf_pcep_obj_lsp_type = -1;
457 static gint hf_pcep_obj_srp_type = -1;
458 static gint hf_pcep_obj_vendor_information_type = -1;
459 static gint hf_pcep_obj_bu_type = -1;
460 static gint hf_pcep_obj_association_type = -1;
461
462 /* Generated from convert_proto_tree_add_text.pl */
463 static int hf_pcep_xro_obj_flags = -1;
464 static int hf_pcep_open_obj_keepalive = -1;
465 static int hf_pcep_request_id = -1;
466 static int hf_pcep_lspa_obj_reserved = -1;
467 static int hf_pcep_rp_obj_reserved = -1;
468 static int hf_pcep_svec_obj_reserved = -1;
469 static int hf_pcep_rp_obj_flags = -1;
470 static int hf_pcep_lspa_obj_exclude_any = -1;
471 static int hf_pcep_subobj_srlg_attribute = -1;
472 static int hf_pcep_end_point_obj_destination_ipv4_address = -1;
473 static int hf_pcep_subobj_unnumb_interfaceID_reserved_xroobj = -1;
474 static int hf_pcep_balancing_obj_flags = -1;
475 static int hf_pcep_subobj_unnumb_interfaceID_reserved = -1;
476 static int hf_pcep_lspa_obj_setup_priority = -1;
477 static int hf_pcep_svec_obj_request_id_number = -1;
478 static int hf_pcep_end_point_obj_source_ipv4_address = -1;
479 static int hf_pcep_open_obj_sid = -1;
480 static int hf_pcep_subobj_ipv6_padding = -1;
481 static int hf_pcep_notification_obj_reserved = -1;
482 static int hf_pcep_close_obj_reason = -1;
483 static int hf_pcep_subobj_ipv4_attribute = -1;
484 static int hf_pcep_obj_overload_flags = -1;
485 static int hf_pcep_balancing_obj_maximum_number_of_te_lsps = -1;
486 static int hf_pcep_subobj_exrs_reserved = -1;
487 static int hf_pcep_subobj_label_control_length = -1;
488 static int hf_pcep_subobj_ipv4_length = -1;
489 static int hf_pcep_subobj_ipv6_ipv6 = -1;
490 static int hf_pcep_lspa_obj_holding_priority = -1;
491 static int hf_pcep_rp_obj_requested_id_number = -1;
492 static int hf_pcep_subobj_pksv6_path_key = -1;
493 static int hf_pcep_subobj_unnumb_interfaceID_router_id = -1;
494 static int hf_pcep_subobj_pksv6_pce_id = -1;
495 static int hf_pcep_tlv_padding = -1;
496 static int hf_pcep_subobj_unnumb_interfaceID_flags = -1;
497 static int hf_pcep_subobj_unnumb_interfaceID_length = -1;
498 static int hf_pcep_obj_proc_time_reserved = -1;
499 static int hf_pcep_object_type = -1;
500 static int hf_pcep_subobj_pksv4_length = -1;
501 static int hf_pcep_subobj_ipv6_prefix_length = -1;
502 static int hf_pcep_subobj_ipv6_length = -1;
503 static int hf_pcep_flags = -1;
504 static int hf_pcep_no_path_obj_reserved = -1;
505 static int hf_pcep_subobj_unnumb_interfaceID_interface_id = -1;
506 static int hf_pcep_close_obj_flags = -1;
507 static int hf_pcep_error_obj_flags = -1;
508 static int hf_pcep_metric_obj_flags = -1;
509 static int hf_pcep_subobj_autonomous_sys_num_reserved = -1;
510 static int hf_pcep_subobj_pksv4_path_key = -1;
511 static int hf_pcep_subobj_label_control_flags = -1;
512 static int hf_pcep_notification_obj_value = -1;
513 static int hf_pcep_subobj_label_control_label = -1;
514 static int hf_pcep_metric_obj_metric_value = -1;
515 static int hf_pcep_no_path_obj_flags = -1;
516 static int hf_pcep_obj_monitoring_reserved = -1;
517 static int hf_pcep_obj_of_code = -1;
518 static int hf_pcep_subobj_label_control_u = -1;
519 static int hf_pcep_subobj_autonomous_sys_num_length = -1;
520 static int hf_pcep_message_length = -1;
521 static int hf_pcep_subobj_ipv4_prefix_length = -1;
522 static int hf_pcep_xro_obj_reserved = -1;
523 static int hf_pcep_subobj_pksv4_pce_id = -1;
524 static int hf_pcep_subobj_pksv6_length = -1;
525 static int hf_pcep_end_point_obj_destination_ipv6_address = -1;
526 static int hf_pcep_subobj_autonomous_sys_num_as_number = -1;
527 static int hf_pcep_notification_obj_flags = -1;
528 static int hf_pcep_subobj_unnumb_interfaceID_attribute = -1;
529 static int hf_pcep_object_length = -1;
530 static int hf_pcep_tlv_data = -1;
531 static int hf_pcep_balancing_obj_reserved = -1;
532 static int hf_pcep_subobj_ipv4_flags = -1;
533 static int hf_pcep_subobj_ipv6_attribute = -1;
534 static int hf_pcep_subobj_srlg_id = -1;
535 static int hf_pcep_balancing_obj_minimum_bandwidth = -1;
536 static int hf_pcep_subobj_unnumb_interfaceID_reserved_rrobj = -1;
537 static int hf_pcep_error_obj_reserved = -1;
538 static int hf_pcep_obj_overload_reserved = -1;
539 static int hf_pcep_notification_obj_type = -1;
540 static int hf_pcep_subobj_ipv6_flags = -1;
541 static int hf_pcep_obj_monitoring_flags = -1;
542 static int hf_pcep_subobj_exrs_length = -1;
543 static int hf_pcep_obj_proc_time_flags = -1;
544 static int hf_pcep_subobj_label_control_reserved = -1;
545 static int hf_pcep_version = -1;
546 static int hf_pcep_lspa_obj_flags = -1;
547 static int hf_pcep_subobj_ipv4_ipv4 = -1;
548 static int hf_pcep_tlv_type = -1;
549 static int hf_pcep_subobj_autonomous_sys_num_optional_as_number_high_octets = -1;
550 static int hf_pcep_open_obj_deadtime = -1;
551 static int hf_pcep_bandwidth = -1;
552 static int hf_pcep_tlv_length = -1;
553 static int hf_pcep_subobj_srlg_reserved = -1;
554 static int hf_pcep_metric_obj_type = -1;
555 static int hf_pcep_metric_obj_reserved = -1;
556 static int hf_pcep_svec_obj_flags = -1;
557 static int hf_pcep_open_obj_pcep_version = -1;
558 static int hf_pcep_open_obj_flags = -1;
559 static int hf_pcep_end_point_obj_source_ipv6_address = -1;
560 static int hf_pcep_lspa_obj_include_any = -1;
561 static int hf_pcep_lspa_obj_include_all = -1;
562 static int hf_pcep_subobj_ipv4_padding = -1;
563 static int hf_pcep_subobj_srlg_length = -1;
564 static int hf_pcep_subobj_autonomous_sys_num_attribute = -1;
565 static int hf_pcep_close_obj_reserved = -1;
566 static int hf_pcep_subobj_label_control_c_type = -1;
567 static int hf_pcep_subobj_iro_autonomous_sys_num_l = -1;
568 static int hf_pcep_subobj_autonomous_sys_num_x = -1;
569 static int hf_pcep_subobj_label_control_l = -1;
570 static int hf_pcep_subobj_exrs_l = -1;
571 static int hf_pcep_subobj_unnumb_interfaceID_x = -1;
572 static int hf_pcep_subobj_autonomous_sys_num_l = -1;
573 static int hf_pcep_subobj_pksv6_l = -1;
574 static int hf_pcep_subobj_srlg_x = -1;
575 static int hf_pcep_subobj_ipv4_x = -1;
576 static int hf_pcep_subobj_iro_unnumb_interfaceID_l = -1;
577 static int hf_pcep_subobj_exrs_type = -1;
578 static int hf_pcep_subobj_ipv4_l = -1;
579 static int hf_pcep_of_code = -1;
580 static int hf_pcep_subobj_ipv6_x = -1;
581 static int hf_pcep_no_path_obj_nature_of_issue = -1;
582 static int hf_pcep_subobj_ipv6_l = -1;
583 static int hf_pcep_subobj_pksv4_l = -1;
584 static int hf_pcep_subobj_iro_ipv6_l = -1;
585 static int hf_pcep_subobj_unnumb_interfaceID_l = -1;
586 static int hf_pcep_subobj_iro_ipv4_l = -1;
587 static int hf_pcep_subobj_sr_l = -1;
588 static int hf_pcep_subobj_sr_length = -1;
589 static int hf_pcep_subobj_sr_nt = -1;
590 static int hf_pcep_subobj_sr_flags = -1;
591 static int hf_pcep_subobj_sr_flags_m = -1;
592 static int hf_pcep_subobj_sr_flags_c = -1;
593 static int hf_pcep_subobj_sr_flags_s = -1;
594 static int hf_pcep_subobj_sr_flags_f = -1;
595 static int hf_pcep_subobj_sr_sid = -1;
596 static int hf_pcep_subobj_sr_sid_label = -1;
597 static int hf_pcep_subobj_sr_sid_tc = -1;
598 static int hf_pcep_subobj_sr_sid_s = -1;
599 static int hf_pcep_subobj_sr_sid_ttl = -1;
600 static int hf_pcep_subobj_sr_nai_ipv4_node = -1;
601 static int hf_pcep_subobj_sr_nai_ipv6_node = -1;
602 static int hf_pcep_subobj_sr_nai_local_ipv4_addr = -1;
603 static int hf_pcep_subobj_sr_nai_remote_ipv4_addr = -1;
604 static int hf_pcep_subobj_sr_nai_local_ipv6_addr = -1;
605 static int hf_pcep_subobj_sr_nai_remote_ipv6_addr = -1;
606 static int hf_pcep_subobj_sr_nai_local_node_id = -1;
607 static int hf_pcep_subobj_sr_nai_local_interface_id = -1;
608 static int hf_pcep_subobj_sr_nai_remote_node_id = -1;
609 static int hf_pcep_subobj_sr_nai_remote_interface_id = -1;
610
611 static int hf_pcep_stateful_pce_capability_flags = -1;
612 static int hf_pcep_lsp_update_capability = -1;
613 static int hf_pcep_include_db_version = -1;
614 static int hf_pcep_lsp_instantiation_capability = -1;
615 static int hf_pcep_triggered_resync = -1;
616 static int hf_pcep_delta_lsp_sync_capability = -1;
617 static int hf_pcep_triggered_initial_sync = -1;
618 static int hf_pcep_obj_lsp_flags = -1;
619 static int hf_pcep_obj_lsp_plsp_id = -1;
620 static int hf_pcep_obj_lsp_flags_d = -1;
621 static int hf_pcep_obj_lsp_flags_s = -1;
622 static int hf_pcep_obj_lsp_flags_r = -1;
623 static int hf_pcep_obj_lsp_flags_a = -1;
624 static int hf_pcep_obj_lsp_flags_o = -1;
625 static int hf_pcep_obj_lsp_flags_c = -1;
626 static int hf_pcep_obj_lsp_flags_reserved = -1;
627 static int hf_pcep_obj_srp_flags = -1;
628 static int hf_pcep_obj_srp_flags_r = -1;
629 static int hf_pcep_obj_srp_id_number = -1;
630 static int hf_pcep_symbolic_path_name = -1;
631 static int hf_pcep_ipv4_lsp_id_tunnel_sender_address = -1;
632 static int hf_pcep_ipv4_lsp_id_lsp_id = -1;
633 static int hf_pcep_ipv4_lsp_id_tunnel_id = -1;
634 static int hf_pcep_ipv4_lsp_id_extended_tunnel_id = -1;
635 static int hf_pcep_ipv4_lsp_id_tunnel_endpoint_address = -1;
636 static int hf_pcep_ipv6_lsp_id_tunnel_sender_address = -1;
637 static int hf_pcep_ipv6_lsp_id_lsp_id = -1;
638 static int hf_pcep_ipv6_lsp_id_tunnel_id = -1;
639 static int hf_pcep_ipv6_lsp_id_extended_tunnel_id = -1;
640 static int hf_pcep_ipv6_lsp_id_tunnel_endpoint_address = -1;
641 static int hf_pcep_lsp_error_code = -1;
642 static int hf_pcep_rsvp_user_error_spec = -1;
643 static int hf_pcep_lsp_state_db_version_number = -1;
644 static int hf_pcep_speaker_entity_id = -1;
645 static int hf_pcep_path_setup_type_reserved24 = -1;
646 static int hf_pcep_path_setup_type = -1;
647 static int hf_pcep_path_setup_type_capability_reserved24 = -1;
648 static int hf_pcep_path_setup_type_capability_psts = -1;
649 static int hf_pcep_path_setup_type_capability_pst = -1;
650 static int hf_pcep_sr_pce_capability_reserved = -1; //deprecated
651 static int hf_pcep_sr_pce_capability_sub_tlv_reserved = -1;
652 static int hf_pcep_sr_pce_capability_flags = -1; //deprecated
653 static int hf_pcep_sr_pce_capability_sub_tlv_flags = -1;
654 static int hf_pcep_sr_pce_capability_flags_l = -1; //deprecated
655 static int hf_pcep_sr_pce_capability_sub_tlv_flags_x = -1;
656 static int hf_pcep_sr_pce_capability_sub_tlv_flags_n = -1;
657 static int hf_pcep_sr_pce_capability_msd = -1; //deprecated
658 static int hf_pcep_sr_pce_capability_sub_tlv_msd = -1;
659 static int hf_pcep_association_reserved = -1;
660 static int hf_pcep_association_flags = -1;
661 static int hf_pcep_association_flags_r = -1;
662 static int hf_pcep_association_type = -1;
663 static int hf_pcep_association_id = -1;
664 static int hf_pcep_association_source_ipv4 = -1;
665 static int hf_pcep_association_source_ipv6 = -1;
666 static int hf_pcep_association_source_global = -1;
667 static int hf_pcep_association_id_extended = -1;
668
669 static int hf_pcep_association_id_extended_color = -1;
670 static int hf_pcep_association_id_extended_ipv4_endpoint = -1;
671 static int hf_pcep_association_id_extended_ipv6_endpoint = -1;
672 static int hf_pcep_unreach_destination_obj_ipv4_address = -1;
673 static int hf_pcep_unreach_destination_obj_ipv6_address = -1;
674
675 static int hf_pcep_op_conf_assoc_range_reserved = -1;
676 static int hf_pcep_op_conf_assoc_range_assoc_type = -1;
677 static int hf_pcep_op_conf_assoc_range_start_assoc = -1;
678 static int hf_pcep_op_conf_assoc_range_range = -1;
679
680 static int hf_pcep_srcpag_info_color = -1;
681 static int hf_pcep_srcpag_info_destination_endpoint = -1;
682 static int hf_pcep_srcpag_info_preference = -1;
683
684
685 static int hf_pcep_sr_policy_name = -1;
686 static int hf_pcep_sr_policy_cpath_id_proto_origin = -1;
687 static int hf_pcep_sr_policy_cpath_id_originator_asn = -1;
688 static int hf_pcep_sr_policy_cpath_id_originator_address = -1;
689 static int hf_pcep_sr_policy_cpath_id_discriminator = -1;
690 static int hf_pcep_sr_policy_cpath_name = -1;
691 static int hf_pcep_sr_policy_cpath_preference = -1;
692
693 static int hf_pcep_enterprise_number = -1;
694 static int hf_pcep_enterprise_specific_info = -1;
695 static int hf_pcep_tlv_enterprise_number = -1;
696 static int hf_pcep_tlv_enterprise_specific_info = -1;
697
698 static int hf_pcep_bu_reserved = -1;
699 static int hf_pcep_bu_butype = -1;
700 static int hf_pcep_bu_utilization = -1;
701
702 static int hf_pcep_path_setup_type_capability_sub_tlv_type = -1;
703 static int hf_pcep_path_setup_type_capability_sub_tlv_length = -1;
704
705 static gint ett_pcep = -1;
706 static gint ett_pcep_hdr = -1;
707 static gint ett_pcep_obj_open = -1;
708 static gint ett_pcep_obj_request_parameters = -1;
709 static gint ett_pcep_obj_no_path = -1;
710 static gint ett_pcep_obj_end_point = -1;
711 static gint ett_pcep_obj_bandwidth = -1;
712 static gint ett_pcep_obj_metric = -1;
713 static gint ett_pcep_obj_explicit_route = -1;
714 static gint ett_pcep_obj_record_route = -1;
715 static gint ett_pcep_obj_lspa = -1;
716 static gint ett_pcep_obj_iro = -1;
717 static gint ett_pcep_obj_svec = -1;
718 static gint ett_pcep_obj_notification = -1;
719 static gint ett_pcep_obj_error = -1;
720 static gint ett_pcep_obj_load_balancing = -1;
721 static gint ett_pcep_obj_close = -1;
722 static gint ett_pcep_obj_path_key = -1;
723 static gint ett_pcep_obj_xro = -1;
724 static gint ett_pcep_obj_monitoring = -1;
725 static gint ett_pcep_obj_pcc_id_req = -1;
726 static gint ett_pcep_obj_of = -1;
727 static gint ett_pcep_obj_pce_id = -1;
728 static gint ett_pcep_obj_proc_time = -1;
729 static gint ett_pcep_obj_overload = -1;
730 static gint ett_pcep_obj_unreach_destination = -1;
731 static gint ett_pcep_obj_branch_node_capability = -1;
732 static gint ett_pcep_obj_lsp = -1;
733 static gint ett_pcep_obj_srp = -1;
734 static gint ett_pcep_obj_vendor_information = -1;
735 static gint ett_pcep_obj_bu = -1;
736 static gint ett_pcep_obj_unknown = -1;
737 static gint ett_pcep_obj_sero = -1;
738 static gint ett_pcep_obj_srro = -1;
739 static gint ett_pcep_obj_association = - 1;
740
741 /* Generated from convert_proto_tree_add_text.pl */
742 static expert_field ei_pcep_pcep_object_body_non_defined = EI_INIT;
743 static expert_field ei_pcep_non_defined_object = EI_INIT;
744 static expert_field ei_pcep_object_length = EI_INIT;
745 static expert_field ei_pcep_subobject_bad_length = EI_INIT;
746 static expert_field ei_pcep_non_defined_subobject = EI_INIT;
747 static expert_field ei_pcep_unknown_type_object = EI_INIT;
748
749 /* PCEP message types.*/
750 typedef enum {
751 PCEP_MSG_NO_VALID,
752 PCEP_MSG_OPEN,
753 PCEP_MSG_KEEPALIVE,
754 PCEP_MSG_PATH_COMPUTATION_REQUEST,
755 PCEP_MSG_PATH_COMPUTATION_REPLY,
756 PCEP_MSG_NOTIFICATION,
757 PCEP_MSG_ERROR,
758 PCEP_MSG_CLOSE,
759 PCEP_MSG_PATH_COMPUTATION_MONITORING_REQUEST,
760 PCEP_MSG_PATH_COMPUTATION_MONITORING_REPLY,
761 PCEP_MSG_PATH_COMPUTATION_LSP_STATE_REPORT,
762 PCEP_MSG_PATH_COMPUTATION_LSP_UPDATE_REQUEST,
763 PCEP_MSG_INITIATE
764 } pcep_message_types;
765
766 static const value_string message_type_vals[] = {
767 {PCEP_MSG_OPEN, "Open" },
768 {PCEP_MSG_KEEPALIVE, "Keepalive" },
769 {PCEP_MSG_PATH_COMPUTATION_REQUEST, "Path Computation Request (PCReq)" },
770 {PCEP_MSG_PATH_COMPUTATION_REPLY, "Path Computation Reply (PCRep)" },
771 {PCEP_MSG_NOTIFICATION, "Notification (PCNtf)" },
772 {PCEP_MSG_ERROR, "Error (PCErr)" },
773 {PCEP_MSG_CLOSE, "Close" },
774 {PCEP_MSG_PATH_COMPUTATION_MONITORING_REQUEST, "Path Computation Monitoring Request (PCMonReq)" },
775 {PCEP_MSG_PATH_COMPUTATION_MONITORING_REPLY, "Path Computation Monitoring Reply (PCMonRep)" },
776 {PCEP_MSG_PATH_COMPUTATION_LSP_STATE_REPORT, "Path Computation LSP State Report (PCRpt)" },
777 {PCEP_MSG_PATH_COMPUTATION_LSP_UPDATE_REQUEST, "Path Computation LSP Update Request (PCUpd)" },
778 {PCEP_MSG_INITIATE, "Path Computation LSP Initiate (PCInitiate)" },
779 {0, NULL }
780 };
781
782 static const value_string pcep_class_vals[] = {
783 {PCEP_OPEN_OBJ, "OPEN OBJECT" },
784 {PCEP_RP_OBJ, "RP OBJECT" },
785 {PCEP_NO_PATH_OBJ, "NO-PATH OBJECT" },
786 {PCEP_END_POINT_OBJ, "END-POINT OBJECT" },
787 {PCEP_BANDWIDTH_OBJ, "BANDWIDTH OBJECT" },
788 {PCEP_METRIC_OBJ, "METRIC OBJECT" },
789 {PCEP_EXPLICIT_ROUTE_OBJ, "EXPLICIT ROUTE OBJECT (ERO)" },
790 {PCEP_RECORD_ROUTE_OBJ, "RECORD ROUTE OBJECT (RRO)" },
791 {PCEP_LSPA_OBJ, "LSPA OBJECT" },
792 {PCEP_IRO_OBJ, "IRO OBJECT" },
793 {PCEP_SVEC_OBJ, "SVEC OBJECT" },
794 {PCEP_NOTIFICATION_OBJ, "NOTIFICATION OBJECT" },
795 {PCEP_PCEP_ERROR_OBJ, "PCEP ERROR OBJECT" },
796 {PCEP_LOAD_BALANCING_OBJ, "LOAD BALANCING OBJECT" },
797 {PCEP_CLOSE_OBJ, "CLOSE OBJECT" },
798 {PCEP_PATH_KEY_OBJ, "PATH-KEY OBJECT" },
799 {PCEP_XRO_OBJ, "EXCLUDE ROUTE OBJECT (XRO)" },
800 {PCEP_OBJ_MONITORING, "MONITORING OBJECT" },
801 {PCEP_OBJ_PCC_ID_REQ, "PCC-ID-REQ OBJECT" },
802 {PCEP_OF_OBJ, "OBJECTIVE FUNCTION OBJECT (OF)" },
803 {PCEP_OBJ_PCE_ID, "PCE-ID OBJECT" },
804 {PCEP_OBJ_PROC_TIME, "PROC-TIME OBJECT" },
805 {PCEP_OBJ_OVERLOAD, "OVERLOAD OBJECT" },
806 {PCEP_SERO_OBJ, "SECONDARY EXPLICIT ROUTE OBJECT (SERO)" },
807 {PCEP_SRRO_OBJ, "SECONDARY RECORD ROUTE OBJECT (SRRO)" },
808 {PCEP_OBJ_LSP, "LSP OBJECT" },
809 {PCEP_OBJ_SRP, "SRP OBJECT" },
810 {PCEP_OBJ_VENDOR_INFORMATION, "VENDOR-INFORMATION OBJECT" },
811 {PCEP_OBJ_BU, "BU OBJECT" },
812 {PCEP_ASSOCIATION_OBJ, "ASSOCIATION OBJECT" },
813 {0, NULL }
814 };
815 static value_string_ext pcep_class_vals_ext = VALUE_STRING_EXT_INIT(pcep_class_vals);
816
817 static const value_string pcep_obj_open_type_vals[] = {
818 {1, "Open"},
819 {0, NULL }
820 };
821
822 static const value_string pcep_obj_rp_type_vals[] = {
823 {1, "Request Parameters"},
824 {0, NULL }
825 };
826
827 static const value_string pcep_obj_no_path_type_vals[] = {
828 {1, "No Path"},
829 {0, NULL }
830 };
831
832 static const value_string pcep_obj_end_point_type_vals[] = {
833 {1, "IPv4 addresses"},
834 {2, "IPv6 addresses"},
835 {3, "IPv4" },
836 {4, "IPv6" },
837 {0, NULL }
838 };
839
840 static const value_string pcep_obj_bandwidth_type_vals[] = {
841 {1, "Requested bandwidth" },
842 {2, "Bandwidth of an existing TE LSP for which a reoptimization is requested" },
843 {0, NULL }
844 };
845
846 static const value_string pcep_obj_metric_type_vals[] = {
847 {1, "Metric"},
848 {0, NULL }
849 };
850
851 static const value_string pcep_obj_explicit_route_type_vals[] = {
852 {1, "Explicit Route"},
853 {0, NULL }
854 };
855
856 static const value_string pcep_obj_record_route_type_vals[] = {
857 {1, "Recorded Route"},
858 {0, NULL }
859 };
860
861 static const value_string pcep_obj_lspa_type_vals[] = {
862 {1, "LSP Attributes"},
863 {0, NULL }
864 };
865
866 static const value_string pcep_obj_iro_type_vals[] = {
867 {1, "Include Route"},
868 {0, NULL }
869 };
870
871 static const value_string pcep_obj_svec_type_vals[] = {
872 {1, "Synchronization Vector"},
873 {0, NULL }
874 };
875
876 static const value_string pcep_obj_notification_type_vals[] = {
877 {1, "Notification"},
878 {0, NULL }
879 };
880
881 static const value_string pcep_obj_pcep_error_type_vals[] = {
882 {1, "PCEP Error"},
883 {0, NULL }
884 };
885
886 static const value_string pcep_obj_load_balancing_type_vals[] = {
887 {1, "Load Balancing"},
888 {0, NULL }
889 };
890
891 static const value_string pcep_obj_close_type_vals[] = {
892 {1, "Close"},
893 {0, NULL }
894 };
895
896 static const value_string pcep_obj_path_key_type_vals[] = {
897 {1, "Path Key"},
898 {0, NULL }
899 };
900
901 static const value_string pcep_obj_xro_type_vals[] = {
902 {1, "Route exclusion"},
903 {0, NULL }
904 };
905
906 static const value_string pcep_obj_monitoring_type_vals[] = {
907 {1, "Monitoring"},
908 {0, NULL }
909 };
910
911 static const value_string pcep_obj_pcc_id_req_type_vals[] = {
912 {1, "IPv4 addresses"},
913 {2, "IPv6 addresses"},
914 {0, NULL }
915 };
916
917 static const value_string pcep_obj_of_type_vals[] = {
918 {1, "Objective Function"},
919 {0, NULL }
920 };
921
922 static const value_string pcep_obj_pce_id_type_vals[] = {
923 {1, "IPv4 addresses"},
924 {2, "IPv6 addresses"},
925 {0, NULL }
926 };
927
928 static const value_string pcep_obj_proc_time_type_vals[] = {
929 {1, "PROC-TIME"},
930 {0, NULL }
931 };
932
933 static const value_string pcep_obj_overload_type_vals[] = {
934 {1, "overload"},
935 {0, NULL }
936 };
937
938 static const value_string pcep_obj_unreach_destination_type_vals[] = {
939 {1, "IPv4"},
940 {2, "IPv6"},
941 {0, NULL }
942 };
943
944 static const value_string pcep_obj_sero_type_vals[] = {
945 {1, "SERO"},
946 {0, NULL }
947 };
948
949 static const value_string pcep_obj_srro_type_vals[] = {
950 {1, "SRRO"},
951 {0, NULL }
952 };
953
954 static const value_string pcep_obj_branch_node_capability_type_vals[] = {
955 {1, "Branch node list"},
956 {2, "Non-branch node list"},
957 {0, NULL }
958 };
959
960 static const value_string pcep_obj_lsp_type_vals[] = {
961 {1, "LSP"},
962 {0, NULL }
963 };
964
965 static const value_string pcep_obj_srp_type_vals[] = {
966 {1, "SRP"},
967 {0, NULL }
968 };
969
970 static const value_string pcep_obj_vendor_information_type_vals[] = {
971 {1, "Vendor-Specific Constraints"},
972 {0, NULL }
973 };
974
975 static const value_string pcep_obj_bu_type_vals[] = {
976 {1, "BU"},
977 {0, NULL }
978 };
979
980 static const value_string pcep_obj_association_type_vals[] = {
981 {1, "IPv4"},
982 {2, "IPv6"},
983 {0, NULL }
984 };
985
986 static const value_string pcep_subobj_vals[] = {
987 {PCEP_SUB_IPv4, "SUBOBJECT IPv4" },
988 {PCEP_SUB_IPv6, "SUBOBJECT IPv6" },
989 {PCEP_SUB_LABEL_CONTROL, "SUBOBJECT LABEL" },
990 {PCEP_SUB_UNNUMB_INTERFACE_ID, "SUBOBJECT UNNUMBERED INTERFACE-ID" },
991 {PCEP_SUB_AUTONOMOUS_SYS_NUM, "SUBOBJECT AUTONOMOUS SYSTEM NUMBER" },
992 {PCEP_SUB_SRLG, "SUBOBJECT SRLG" },
993 {PCEP_SUB_SR_PRE_IANA, "SUBOBJECT SR" },
994 {PCEP_SUB_PKSv4, "SUBOBJECT PATH KEY (IPv4)" },
995 {PCEP_SUB_PKSv6, "SUBOBJECT PATH KEY (IPv6)" },
996 {PCEP_SUB_SR, "SUBOBJECT SR" },
997 {0, NULL }
998 };
999
1000
1001 static const value_string pcep_subobj_xro_vals[] = {
1002 {PCEP_SUB_IPv4, "SUBOBJECT IPv4" },
1003 {PCEP_SUB_IPv6, "SUBOBJECT IPv6" },
1004 {PCEP_SUB_UNNUMB_INTERFACE_ID, "SUBOBJECT UNNUMBERED INTERFACE-ID" },
1005 {PCEP_SUB_AUTONOMOUS_SYS_NUM, "SUBOBJECT AUTONOMOUS SYSTEM NUMBER" },
1006 {PCEP_SUB_SRLG, "SUBOBJECT SRLG" },
1007 {0, NULL }
1008 };
1009
1010 /*In the NO-PATH Object the two different possibilities that NI can have*/
1011 static const value_string pcep_no_path_obj_vals[] = {
1012 {NO_SATISFYING, "No path satisfying the set of constraints could be found" },
1013 {CHAIN_BROKEN, "PCEP Chain Broken" },
1014 {0, NULL }
1015 };
1016
1017 /*Different values of "Type (T)" in the METRIC Obj */
1018 static const value_string pcep_metric_obj_vals[] = {
1019 { 0, "Reserved" },
1020 { 1, "IGP Metric" },
1021 { 2, "TE Metric" },
1022 { 3, "Hop Counts" },
1023 { 4, "Aggregate bandwidth consumption" },
1024 { 5, "Load of the most loaded link" },
1025 { 6, "Cumulative IGP cost" },
1026 { 7, "Cumulative TE cost" },
1027 { 8, "P2MP IGM metric" },
1028 { 9, "P2MP TE metric" },
1029 {10, "P2MP hop count metric" },
1030 {11, "Segment-ID (SID) Depth" }, /* RFC 8664 */
1031 {12, "Path Delay metric" }, /* draft-ietf-pce-pcep-service-aware */
1032 {13, "Path Delay Variation metric" }, /* draft-ietf-pce-pcep-service-aware */
1033 {14, "Path Loss metric" }, /* draft-ietf-pce-pcep-service-aware */
1034 {15, "P2MP Path Delay metric" }, /* draft-ietf-pce-pcep-service-aware */
1035 {16, "P2MP Path Delay variation metric"}, /* draft-ietf-pce-pcep-service-aware */
1036 {17, "P2MP Path Loss metric" }, /* draft-ietf-pce-pcep-service-aware */
1037 {0, NULL }
1038 };
1039
1040 /*Different values for (L) in the ERO and IRO Objs */
1041 static const value_string pcep_route_l_obj_vals[] = {
1042 {STRICT_HOP, "Strict Hop" },
1043 {LOOSE_HOP, "Loose Hop" },
1044 {0, NULL }
1045 };
1046
1047 /*Different values of the direction of the label (U) in the ERO and RRO Objs */
1048 static const value_string pcep_route_u_obj_vals[] = {
1049 {DOWNSTREAM_LABEL, "Downstream Label" },
1050 {UPSTREAM_LABEL, "Upstream Label" },
1051 {0, NULL }
1052 };
1053
1054 /*Values of Notification type*/
1055 static const value_string pcep_notification_types_vals[] = {
1056 {NOT_REQ_CANCEL, "Pending Request Cancelled" },
1057 {PCEP_CONGESTION, "PCE Congestion" },
1058 {0, NULL }
1059 };
1060
1061 /*Values of Notification value for Notification Type=1*/
1062 static const value_string pcep_notification_values1_vals[] = {
1063 {NOTI_PCC_CANCEL_REQ, "PCC Cancels a set of Pending Request (s)" },
1064 {NOTI_PCE_CANCEL_REQ, "PCE Cancels a set of Pending Request (s)" },
1065 {0, NULL }
1066 };
1067
1068 /*Values of Notification value for Notification Type=2*/
1069 static const value_string pcep_notification_values2_vals[] = {
1070 {NOTI_PCE_CONGEST, "PCE in Congested State" },
1071 {NOTI_PCE_NO_CONGEST, "PCE no Longer in Congested state" },
1072 {0, NULL }
1073 };
1074
1075
1076 /* PCEP TLVs */
1077 static const value_string pcep_tlvs_vals[] = {
1078 {1, "NO-PATH-VECTOR TLV" },
1079 {2, "OVERLOAD-DURATION TLV" },
1080 {3, "REQ-MISSING TLV" },
1081 {4, "OF-list TLV" },
1082 {5, "Order TLV" },
1083 {6, "P2MP Capable" },
1084 {7, "VENDOR-INFORMATION-TLV" },
1085 {8, "Wavelength Selection" },
1086 {9, "Wavelength Restriction" },
1087 {10, "Wavelength Allocation" },
1088 {11, "Optical Interface Class List" },
1089 {12, "Client Signal Information" },
1090 {13, "H-PCE-CAPABILITY" },
1091 {14, "Domain-ID" },
1092 {15, "H-PCE-FLAG" },
1093 {16, "STATEFUL-PCE-CAPABILITY" },
1094 {17, "SYMBOLIC-PATH-NAME" },
1095 {18, "IPV4-LSP-IDENTIFIERS" },
1096 {19, "IPV6-LSP-IDENTIFIERS" },
1097 {20, "LSP-ERROR-CODE" },
1098 {21, "RSVP-ERROR-SPEC" },
1099 {23, "LSP-DB-VERSION" },
1100 {24, "SPEAKER-ENTITY-ID" },
1101 {26, "SR-PCE-CAPABILITY (deprecated)" },
1102 {27, "PATH-SETUP-TYPE (PRE-IANA)" },
1103 {28, "PATH-SETUP-TYPE" },
1104 {29, "OP-CONF-ASSOC-RANGE" },
1105 {30, "GLOBAL-ASSOCIATION-SOURCE" },
1106 {31, "EXTENDED-ASSOCIATION-ID" },
1107 {32, "P2MP-IPV4-LSP-IDENTIFIERS" },
1108 {33, "P2MP-IPV6-LSP-IDENTIFIERS" },
1109 {34, "PATH-SETUP-TYPE-CAPABILITY" },
1110 {35, "ASSOC-Type-List" },
1111 {36, "AUTO-BANDWIDTH-CAPABILITY" },
1112 {37, "AUTO-BANDWIDTH-ATTRIBUTES" },
1113 {38, "Path Protection Association Group TLV" },
1114 {39, "IPV4-ADDRESS" },
1115 {40, "IPV6-ADDRESS" },
1116 {41, "UNNUMBERED-ENDPOINT" },
1117 {42, "LABEL-REQUEST" },
1118 {43, "LABEL-SET" },
1119 {44, "PROTECTION-ATTRIBUTE" },
1120 {45, "GMPLS-CAPABILITY" },
1121 {46, "DISJOINTNESS-CONFIGURATION" },
1122 {47, "DISJOINTNESS-STATUS" },
1123 {48, "POLICY-PARAMETERS-TLV" },
1124 {49, "SCHED-LSP-ATTRIBUTE" },
1125 {50, "SCHED-PD-LSP-ATTRIBUTE" },
1126 {51, "PCE-FLOWSPEC-CAPABILITY TLV" },
1127 {52, "FLOW FILTER TLV" },
1128 {53, "L2 FLOW FILTER TLV" },
1129 {54, "Bidirectional LSP Association Group TLV" },
1130 {55, "TE-PATH-BINDING" }, /* TEMPORARY - registered 2021-03-29, expires 2022-03-29 draft-ietf-pce-binding-label-sid-07 */
1131 {56, "SRPOLICY-POL-NAME" }, /* TEMPORARY - registered 2021-03-30, expires 2022-03-30 draft-ietf-pce-segment-routing-policy-cp-04 */
1132 {57, "SRPOLICY-CPATH-ID" }, /* TEMPORARY - registered 2021-03-30, expires 2022-03-30 draft-ietf-pce-segment-routing-policy-cp-04 */
1133 {58, "SRPOLICY-CPATH-NAME" }, /* TEMPORARY - registered 2021-03-30, expires 2022-03-30 draft-ietf-pce-segment-routing-policy-cp-04 */
1134 {59, "SRPOLICY-CPATH-PREFERENCE" }, /* TEMPORARY - registered 2021-03-30, expires 2022-03-30 draft-ietf-pce-segment-routing-policy-cp-04 */
1135 {0, NULL }
1136 };
1137
1138
1139 /*Values of Objective Functions*/
1140 static const value_string pcep_of_vals[] = {
1141 { 1, "Minimum Cost Path (MCP)" },
1142 { 2, "Minimum Load Path (MLP)" },
1143 { 3, "Maximum residual Bandwidth Path (MBP)" },
1144 { 4, "Minimize aggregate Bandwidth Consumption (MBC)" },
1145 { 5, "Minimize the Load of the most loaded Link (MLL)" },
1146 { 6, "Minimize the Cumulative Cost of a set of paths (MCC)" },
1147 { 7, "Shortest Path Tree (SPT)" }, /* RFC 6006 */
1148 { 8, "Minimum Cost Tree (MCT)" }, /* RFC 6006 */
1149 { 9, "Minimum Packet Loss Path (MPLP)" }, /* draft-ietf-pce-pcep-service-aware */
1150 {10, "Maximum Under-Utilized Path (MUP)" }, /* draft-ietf-pce-pcep-service-aware */
1151 {11, "Maximum Reserved Under-Utilized Path (MRUP)" }, /* draft-ietf-pce-pcep-service-aware */
1152 {0, NULL }
1153 };
1154
1155
1156 /*Values of Bandwidth Utilization (BU) Object bandwidth utilization Type */
1157 static const value_string pcep_bu_butype_vals[] = {
1158 {0, "Reserved" }, /* draft-ietf-pce-pcep-service-aware */
1159 {1, "LBU (Link Bandwidth Utilization)" }, /* draft-ietf-pce-pcep-service-aware */
1160 {2, "LRBU (Link Residual Bandwidth Utilization)" }, /* draft-ietf-pce-pcep-service-aware */
1161 {0, NULL }
1162 };
1163
1164
1165 /*Values of different types of errors*/
1166 static const value_string pcep_error_types_obj_vals[] = {
1167 {ESTABLISH_FAILURE, "PCEP Session Establishment Failure" },
1168 {CAP_NOT_SUPPORTED, "Capability non supported" },
1169 {UNKNOWN_OBJ, "Unknown Object" },
1170 {NOT_SUPP_OBJ, "Not Supported Object" },
1171 {POLICY_VIOLATION, "Policy Violation" },
1172 {MANDATORY_OBJ_MIS, "Mandatory Object Missing" },
1173 {SYNCH_PCREQ_MIS, "Synchronized Path Computation Request Missing" },
1174 {UNKNOWN_REQ_REF, "Unknown Request Reference" },
1175 {ATTEMPT_2_SESSION, "Attempt to Establish a Second PCEP Session" },
1176 {INVALID_OBJ, "Reception of an invalid object" },
1177 {UNRECO_EXRS_SUBOBJ, "Unrecognized EXRS Subobject" },
1178 {DIFFSERV_TE_ERROR, "Differsv-aware TE error" },
1179 {BRPC_FAILURE, "BRPC procedure completion failure" },
1180 {GCO_ERROR, "Global Concurrent Optimization error" },
1181 {P2MP_CAPABILITY_ERROR, "P2PM capability error" },
1182 {P2MP_END_POINTS_ERROR, "P2PM END-POINTS error" },
1183 {P2MP_FRAGMENT_ERROR, "P2PM Fragmentation error" },
1184 {INVALID_OPERATION, "Invalid Operation" },
1185 {LSP_STATE_SYNCHRONIZATION_ERROR, "LSP State synchronization error" },
1186 {BAD_PARAMETER_VALUE, "Bad parameter value" },
1187 {LSP_INSTANTIATION_ERROR, "LSP instantiation error" },
1188 {ASSOCIATION_ERROR, "Association instantiation error" },
1189 {WSON_RWA_ERROR, "WSON RWA error" },
1190 {H_PCE_ERROR, "H-PCE error" },
1191 {PATH_COMPUTATION_FAILURE, "Path computation failure" },
1192 {0, NULL }
1193 };
1194 static value_string_ext pcep_error_types_obj_vals_ext = VALUE_STRING_EXT_INIT(pcep_error_types_obj_vals);
1195
1196 /*Error values for error type 1*/
1197 static const value_string pcep_error_value_1_vals[] = {
1198 {1, "Reception of an invalid Open msg or a non Open msg"},
1199 {2, "No Open Message received before the expiration of the OpenWait Timer "},
1200 {3, "Unacceptable and non Negotiable session characteristics"},
1201 {4, "Unacceptable but Negotiable session characteristics"},
1202 {5, "Reception of a second Open Message with still Unacceptable Session characteristics"},
1203 {6, "Reception of a PCEPrr message proposing unacceptable session characteristics"},
1204 {7, "NO Keepalive or PCEPrr message received before the expiration of the Keepwait timer supported"},
1205 {8, "PCEP version not supported"},
1206 {0, NULL}
1207 };
1208
1209 /*Error values for error type 3*/
1210 static const value_string pcep_error_value_3_vals[] = {
1211 {1, "Unrecognized object class"},
1212 {2, "Unrecognized object type"},
1213 {0, NULL}
1214 };
1215
1216 /*Error values for error type 4*/
1217 static const value_string pcep_error_value_4_vals[] = {
1218 {1, "Not supported object class"},
1219 {2, "Not supported object type"},
1220 {4, "Not supported parameter"},
1221 {5, "Unsupported network performance constraint"}, /* draft-ietf-pce-pcep-service-aware*/
1222 {0, NULL}
1223 };
1224
1225 /*Error values for error type 5*/
1226 static const value_string pcep_error_value_5_vals[] = {
1227 {1, "C bit of the METRIC object set (Request Rejected)"},
1228 {2, "O bit of the RP object set (Request Rejected)"},
1229 {3, "Objective Function not allowed (Request Rejected)"},
1230 {4, "OF bit of the RP object set (Request Rejected)"},
1231 {5, "Global concurrent optimization not allowed"},
1232 {6, "Monitoring message supported but rejected due to policy violation"},
1233 {7, "P2MP path computation is not allowed"},
1234 {8, "Not allowed network performance constraint"}, /* draft-ietf-pce-pcep-service-aware*/
1235 {0, NULL}
1236 };
1237
1238
1239 /*Error values for error type 6*/
1240 static const value_string pcep_error_value_6_vals[] = {
1241 {1, "RP object missing"},
1242 {2, "RRO object missing for a reoptimization request (R bit of the RP Object set)"},
1243 {3, "END-POINTS object missing"},
1244 {4, "MONITORINS object missing"},
1245 {8, "LSP Object missing"},
1246 {9, "ERO Object missing"},
1247 {10, "SRP Object missing"},
1248 {11, "LSP-IDENTIFIERS TLV missing"},
1249 {12, "LSP-DB-VERSION TLV missing"},
1250 {13, "LSP cleanup TLV missing"},
1251 {14, "SYMBOLIC-PATH-NAME TLV missing"},
1252 {0, NULL}
1253 };
1254
1255 /*Error values for error type 10*/
1256 static const value_string pcep_error_value_10_vals[] = {
1257 {1, "Reception of an object with P flag not set although the P-flag must be set"}, /*RFC 5440*/
1258 {2, "Bad label value"}, /* RFC 8664 */
1259 {3, "Unsupported number of SR-ERO subobjects"}, /* RFC 8664 */
1260 {4, "Bad label format"}, /* RFC 8664 */
1261 {5, "ERO mixes SR-ERO subobjects with other subobject types"}, /* RFC 8664 */
1262 {6, "Both SID and NAI are absent in ERO subobject"}, /* RFC 8664 */
1263 {7, "Both SID and NAI are absent in RRO subobject"}, /* RFC 8664 */
1264 {8, "SYMBOLIC-PATH-NAME TLV missing"}, /* RFC 8281 */
1265 {9, "MSD exceeds the default for the PCEP session"}, /* RFC 8664 */
1266 {10, "RRO mixes SR-RRO subobjects with other object types"}, /* RFC 8664 */
1267 {11, "Malformed object"}, /* RFC 8408 */
1268 {12, "Missing PCE-SR-CAPABILITY sub-TLV"}, /* RFC 8664 */
1269 {13, "Unsupported NAI Type in the SR-ERO/SR-RRO subobject"}, /* RFC 8664 */
1270 {14, "Unknown SID"}, /* RFC 8664 */
1271 {15, "NAI cannot be resolved to a SID"}, /* RFC 8664 */
1272 {16, "Could not find SRGB"}, /* RFC 8664 */
1273 {17, "SID index exceeds SRGB size"}, /* RFC 8664 */
1274 {18, "Could not find SRLB"}, /* RFC 8664 */
1275 {19, "SID index exceeds SRLB size"}, /* RFC 8664 */
1276 {20, "Inconsistent SIDs in SR-ERO/SR-RRO subobjects"}, /* RFC 8664 */
1277 {21, "MSD must be nonzero"}, /* RFC 8664 */
1278 {0, NULL}
1279 };
1280
1281 /*Error values for error type 12*/
1282 static const value_string pcep_error_value_12_vals[] = {
1283 {1, "Unsupported class-type"},
1284 {2, "Invalid class-type"},
1285 {3, "Class-type ans setup priority do not form a configured TE-class"},
1286 {0, NULL}
1287 };
1288
1289 /*Error values for error type 13*/
1290 static const value_string pcep_error_value_13_vals[] = {
1291 {1, "BRPC procedure not supported by one or more PCEs along the domain path"},
1292 {0, NULL}
1293 };
1294
1295 /*Error values for error type 15*/
1296 static const value_string pcep_error_value_15_vals[] = {
1297 {1, "Insufficient memory"},
1298 {2, "Global concurrent optimization not supported"},
1299 {0, NULL}
1300 };
1301
1302 /*Error values for error type 16*/
1303 static const value_string pcep_error_value_16_vals[] = {
1304 {1, "The PCE cannot satisfy the request due to insufficient memory"},
1305 {2, "The PCE is not capable of P2MP computation"},
1306 {0, NULL}
1307 };
1308
1309 /*Error values for error type 17*/
1310 static const value_string pcep_error_value_17_vals[] = {
1311 {1, "The PCE cannot satisfy the request due to no END-POINTS with leaf type 2"},
1312 {2, "The PCE cannot satisfy the request due to no END-POINTS with leaf type 3"},
1313 {3, "The PCE cannot satisfy the request due to no END-POINTS with leaf type 4"},
1314 {4, "The PCE cannot satisfy the request due to inconsistent END-POINTS"},
1315 {0, NULL}
1316 };
1317
1318 /*Error values for error type 18*/
1319 static const value_string pcep_error_value_18_vals[] = {
1320 {1, "Fragmented request failure"},
1321 {0, NULL}
1322 };
1323
1324 /*Error values for error type 19*/
1325 static const value_string pcep_error_value_19_vals[] = {
1326 {1, "Attempted LSP Update Request for a non-delegated LSP. The PCEP-ERROR Object is followed by the LSP Object that identifies the LSP"},
1327 {2, "Attempted LSP Update Request if active stateful PCE capability was not advertised"},
1328 {3, "Attempted LSP Update Request for an LSP identified by an unknown PLSP-ID"},
1329 {4, "A PCE indicates to a PCC that it has exceeded the resource limit allocated for its state, and thus it cannot accept and process its LSP State Report message"},
1330 {5, "Attempted LSP State Report if active stateful PCE capability was not advertised"},
1331 {6, "PCE-initiated LSP limit reached"}, /* draft-ietf-pce-pce-initiated-lsp */
1332 {7, "Delegation for PCE-initiated LSP cannot be revoked"}, /* draft-ietf-pce-pce-initiated-lsp */
1333 {8, "Non-zero PLSP-ID in LSP initiation request"}, /* draft-ietf-pce-pce-initiated-lsp */
1334 {9, "LSP is not PCE-initiated"}, /* draft-ietf-pce-pce-initiated-lsp */
1335 {10, "PCE-initiated operation-frequency limit reached"}, /* draft-ietf-pce-pce-initiated-lsp */
1336 {0, NULL}
1337 };
1338
1339 /*Error values for error type 20*/
1340 static const value_string pcep_error_value_20_vals[] = {
1341 {1, "A PCE indicates to a PCC that it cannot process (an otherwise valid) LSP State Report. The PCEP-ERROR Object is followed by the LSP Object that identifies the LSP"},
1342 {2, "LSP Database version mismatch."},
1343 {3, "The LSP-DB-VERSION TLV Missing when state synchronization avoidance is enabled."},
1344 {4, "Attempt to trigger a synchronization when the TRIGGERED-SYNC capability has not been advertised."},
1345 {5, "A PCC indicates to a PCE that it cannot complete the state synchronization"},
1346 {6, "No sufficient LSP change information for incremental LSP state synchronization."},
1347 {7, "Received an invalid LSP DB Version Number"},
1348 {0, NULL}
1349 };
1350
1351 /* Error values for error type 21 */
1352 static const value_string pcep_error_value_21_vals[] = {
1353 {1, "Unsupported path setup type"},
1354 {2, "Mismatched path setup type"},
1355 {0, NULL}
1356 };
1357
1358 /*Error values for error type 23*/
1359 static const value_string pcep_error_value_23_vals[] = {
1360 {1, "SYMBOLIC-PATH-NAME in use"}, /* draft-ietf-pce-pce-initiated-lsp */
1361 {2, "Speaker identity included for an LSP that is not PCE-initiated"}, /* draft-ietf-pce-pce-initiated-lsp */
1362 {0, NULL}
1363 };
1364
1365 /*Error values for error type 24*/
1366 static const value_string pcep_error_value_24_vals[] = {
1367 {1, "Unacceptable instantiation parameters"}, /* draft-ietf-pce-pce-initiated-lsp */
1368 {2, "Internal error"}, /* draft-ietf-pce-pce-initiated-lsp */
1369 {3, "Signaling error"}, /* draft-ietf-pce-pce-initiated-lsp */
1370 {0, NULL}
1371 };
1372
1373 /*Error values for error type 26*/
1374 static const value_string pcep_error_value_26_vals[] = {
1375 {1, "Association-type is not supported"}, /* [RFC8697] */
1376 {2, "Too many LSPs in the association group"}, /* [RFC8697] */
1377 {3, "Too many association groups"}, /* [RFC8697] */
1378 {4, "Association unknown"}, /* [RFC8697] */
1379 {5, "Operator-configured association information mismatch "}, /* [RFC8697] */
1380 {6, "Association information mismatch"}, /* [RFC8697] */
1381 {7, "Cannot join the association group"}, /* [RFC8697] */
1382 {8, "Association ID not in range"}, /* [RFC8697] */
1383 {9, "Tunnel ID or End points mismatch for Path Protection Association"}, /* [RFC8745] */
1384 {10, "Attempt to add another working/protection LSP for Path Protection Association"}, /* [RFC8745] */
1385 {11, "Protection type is not supported"}, /* [RFC8745] */
1386 {12, "Not expecting policy parameters"}, /* [RFC9005] */
1387 {13, "Unacceptable policy parameters"}, /* [RFC9005] */
1388 {0, NULL}
1389 };
1390
1391 /*Error values for error type 27*/
1392 static const value_string pcep_error_value_27_vals[] = {
1393 {1, "Insufficient memory"}, /* [RFC8780] */
1394 {2, "RWA computation not supported"}, /* [RFC8780] */
1395 {3, "Syntactical encoding error"}, /* [RFC8780] */
1396 {0, NULL}
1397 };
1398
1399 /*Error values for error type 28*/
1400 static const value_string pcep_error_value_28_vals[] = {
1401 {1, "H-PCE Capability not advertised"}, /* [RFC8685] */
1402 {2, "Parent PCE Capability cannot be provided"}, /* [RFC8685] */
1403 {0, NULL}
1404 };
1405
1406 /*Error values for error type 29*/
1407 static const value_string pcep_error_value_29_vals[] = {
1408 {1, "Unacceptable request message"}, /* [RFC8779] */
1409 {2, "Generalized bandwidth value not supported"}, /* [RFC8779] */
1410 {3, "Label set constraint could not be met"}, /* [RFC8779] */
1411 {4, "Label constraint could not be met"}, /* [RFC8779] */
1412 {5, "Constraints could not be met for some intervals"}, /* [RFC8934] */
1413 {0, NULL}
1414 };
1415
1416 static const value_string pcep_close_reason_obj_vals[] = {
1417 {0, "Not defined" },
1418 {NO_EXP_PROV, "No Explanation Provided" },
1419 {DEADTIME_PROV, "Deadtime Expired" },
1420 {RECEP_MALFORM_MSG, "Reception of a Malformed PCEP Message" },
1421 {0, NULL }
1422 };
1423
1424 static const value_string pcep_xro_attribute_obj_vals[] = {
1425 {ATTR_INTERFACE, "Interface" },
1426 {ATTR_NODE, "Node" },
1427 {ATTR_SRLG, "SRLG" },
1428 {0, NULL }
1429 };
1430
1431 static const value_string pcep_object_lsp_flags_operational_vals[] = {
1432 {0, "DOWN" },
1433 {1, "UP" },
1434 {2, "ACTIVE" },
1435 {3, "GOING-DOWN" },
1436 {4, "GOING-UP" },
1437 {5, "Reserved" },
1438 {6, "Reserved" },
1439 {7, "Reserved" },
1440 {0, NULL }
1441 };
1442
1443 static const value_string pcep_tlv_lsp_error_code_vals[] = {
1444 {1, "Unknown reason" },
1445 {2, "Limit reached for PCE-controlled LSPs" },
1446 {3, "Too many pending LSP update requests" },
1447 {4, "Unacceptable parameters" },
1448 {5, "Internal error" },
1449 {6, "LSP administratively brought down" },
1450 {7, "LSP preempted" },
1451 {8, "RSVP signaling error" },
1452 {0, NULL }
1453 };
1454
1455 static const value_string pcep_pst_vals[] = {
1456 {0, "Path is setup via RSVP-TE signaling (default)" },
1457 {1, "Path is setup using Segment Routing" },
1458 {0, NULL }
1459 };
1460
1461 static const value_string pcep_sr_nt_vals[] = {
1462 {0, "NAI is absent" },
1463 {1, "IPv4 Node ID" },
1464 {2, "IPv6 Node ID" },
1465 {3, "IPv4 Adjacency" },
1466 {4, "IPv6 Adjacency with global IPv6 addresses" },
1467 {5, "Unnumbered Adjacency with IPv4 NodeIDs" },
1468 {6, "IPv6 Adjacency with link-local IPv6 addresses" },
1469 {0, NULL }
1470 };
1471
1472 /* types of leaves in a P2MP request */
1473 static const value_string pcep_p2mp_leaf_type_vals[] = {
1474 {EP_P2MP_NEW_LEAF_TYPE, "New leaves to add" },
1475 {EP_P2MP_OLD_REMOVE_LEAF_TYPE , "Old leaves to remove" },
1476 {EP_P2MP_OLD_MODIFY_LEAF_TYPE, "Old leaves whose path can be modified/reoptimized" },
1477 {EP_P2MP_OLD_UNCHANGED_LEAF_TYPE, "Old leaves whose path must be left unchanged" },
1478 {0, NULL }
1479 };
1480
1481 /* Association Type Fields. */
1482 /* https://www.iana.org/assignments/pcep/pcep.xhtml#association-type-field */
1483 static const value_string pcep_association_type_field_vals[] = {
1484 {0, "Reserved"}, /* RFC 8697*/
1485 {1, "Path Protection Association"}, /* RFC 8745 */
1486 {2, "Disjoint Association"}, /* RFC 8800 */
1487 {3, "Policy Association"}, /* RFC 9005 */
1488 {4, "Single-Sided Bidirectional LSP Association"}, /* RFC 9059 */
1489 {5, "Double-Sided Bidirectional LSP Association"}, /* RFC 9059 */
1490 {6, "SR Policy Association"}, /* TEMPORARY registered 2021-03-30 expires 2022-03-30 draft-ietf-pce-segment-routing-policy-cp-04 */
1491 {0, NULL }
1492 };
1493
1494 /* Path Setup Type Capability Sub TLV Type Indicators */
1495 static const value_string pcep_path_setup_type_capability_sub_tlv_vals[] = {
1496 {0, "Reserved" }, /* RFC 8664*/
1497 {1, "PCECC-CAPABILITY" }, /* RFC 9050*/
1498 {26, "SR-PCE-CAPABILITY" }, /* RFC 8664*/
1499 {0, NULL }
1500 };
1501
1502
1503 /* Protocol Origin values in SR Policy Candidate Path Identifiers TLV*/
1504 static const value_string pcep_sr_policy_id_proto_origin_vals[] = {
1505 {10, "PCEP" }, /* draft-ietf-spring-segment-routing-policy section 2.3 */
1506 {20, "BGP SR Policy" }, /* draft-ietf-spring-segment-routing-policy section 2.3 */
1507 {30, "Via Configuration" }, /* draft-ietf-spring-segment-routing-policy section 2.3 */
1508 {0, NULL }
1509 };
1510
1511 #define OBJ_HDR_LEN 4 /* length of object header */
1512
1513 /*------------------------------------------------------------
1514 * SUB-TLVS
1515 * ----------------------------------------------------------------*/
1516 static void
dissect_pcep_path_setup_capabilities_sub_tlvs(proto_tree * pcep_tlv,tvbuff_t * tvb,int offset,gint length,gint ett_pcep_obj)1517 dissect_pcep_path_setup_capabilities_sub_tlvs(proto_tree *pcep_tlv, tvbuff_t *tvb, int offset, gint length, gint ett_pcep_obj)
1518 {
1519 proto_tree *sub_tlv;
1520 guint16 sub_tlv_length, sub_tlv_type;
1521 int j;
1522 int padding = 0;
1523
1524 static int * const sr_pce_capability_sub_tlv_flags[] = {
1525 &hf_pcep_sr_pce_capability_sub_tlv_flags_n,
1526 &hf_pcep_sr_pce_capability_sub_tlv_flags_x,
1527 NULL
1528 };
1529
1530 for (j = 0; j < length; j += 4 + sub_tlv_length + padding) {
1531 sub_tlv_type = tvb_get_ntohs(tvb, offset+j);
1532 sub_tlv_length = tvb_get_ntohs(tvb, offset + j + 2);
1533 sub_tlv = proto_tree_add_subtree(pcep_tlv, tvb, offset + j, sub_tlv_length+4,
1534 ett_pcep_obj, NULL, val_to_str(sub_tlv_type, pcep_path_setup_type_capability_sub_tlv_vals, "Unknown SubTLV (%u). "));
1535 proto_tree_add_item(sub_tlv, hf_pcep_path_setup_type_capability_sub_tlv_type, tvb, offset + j, 2, ENC_BIG_ENDIAN);
1536 proto_tree_add_item(sub_tlv, hf_pcep_path_setup_type_capability_sub_tlv_length, tvb, offset + 2 + j, 2, ENC_BIG_ENDIAN);
1537 switch (sub_tlv_type)
1538 {
1539 case 1: /* PCECC-CAPABILITY */
1540 //TODO
1541 break;
1542
1543 case 26: /* SR PCE CAPABILITY */
1544 proto_tree_add_item(sub_tlv, hf_pcep_sr_pce_capability_sub_tlv_reserved, tvb, offset + 4 + j, 2, ENC_NA);
1545 proto_tree_add_bitmask(sub_tlv, tvb, offset+4+j+2, hf_pcep_sr_pce_capability_sub_tlv_flags, ett_pcep_obj, sr_pce_capability_sub_tlv_flags, ENC_NA);
1546 proto_tree_add_item(sub_tlv, hf_pcep_sr_pce_capability_sub_tlv_msd, tvb, offset + 4 + j + 3, 1, ENC_NA);
1547 break;
1548 }
1549 }
1550
1551 }
1552
1553 /*------------------------------------------------------------
1554 * PCEP TLVS
1555 *----------------------------------------------------------------*/
1556
1557 /* The content of Extended Association ID TLV, type = 31 is scoped
1558 * on the association type. The TLV dissection receives such
1559 * information to be able to decode properly the TLV
1560 * All the other TLVs do not need scope at the moment.
1561 */
1562 static void
dissect_pcep_tlvs_with_scope(proto_tree * pcep_obj,tvbuff_t * tvb,int offset,gint length,gint ett_pcep_obj,guint16 association_type)1563 dissect_pcep_tlvs_with_scope(proto_tree *pcep_obj, tvbuff_t *tvb, int offset, gint length, gint ett_pcep_obj, guint16 association_type)
1564 {
1565 proto_tree *tlv;
1566 guint16 tlv_length, tlv_type, of_code, assoc_type;
1567 guint32 psts;
1568 int i, j;
1569 int padding = 0;
1570
1571 static int * const tlv_stateful_pce_capability_flags[] = {
1572 &hf_pcep_lsp_update_capability,
1573 &hf_pcep_include_db_version,
1574 &hf_pcep_lsp_instantiation_capability,
1575 &hf_pcep_triggered_resync,
1576 &hf_pcep_delta_lsp_sync_capability,
1577 &hf_pcep_triggered_initial_sync,
1578 NULL
1579 };
1580
1581 static int * const tlv_sr_pce_capability_flags[] = {
1582 &hf_pcep_sr_pce_capability_flags_l,
1583 NULL
1584 };
1585
1586 for (j = 0; j < length; j += 4 + tlv_length + padding) {
1587 tlv_type = tvb_get_ntohs(tvb, offset+j);
1588 tlv_length = tvb_get_ntohs(tvb, offset + j + 2);
1589 tlv = proto_tree_add_subtree(pcep_obj, tvb, offset + j, tlv_length+4,
1590 ett_pcep_obj, NULL, val_to_str(tlv_type, pcep_tlvs_vals, "Unknown TLV (%u). "));
1591 proto_tree_add_item(tlv, hf_pcep_tlv_type, tvb, offset + j, 2, ENC_BIG_ENDIAN);
1592 proto_tree_add_item(tlv, hf_pcep_tlv_length, tvb, offset + 2 + j, 2, ENC_BIG_ENDIAN);
1593 switch (tlv_type)
1594 {
1595 case 1: /* NO-PATH TLV */
1596 proto_tree_add_item(tlv, hf_pcep_no_path_tlvs_pce, tvb, offset+4+j, tlv_length, ENC_BIG_ENDIAN); /* RFC 5440 */
1597 proto_tree_add_item(tlv, hf_pcep_no_path_tlvs_unk_dest, tvb, offset+4+j, tlv_length, ENC_BIG_ENDIAN); /* RFC 5440 */
1598 proto_tree_add_item(tlv, hf_pcep_no_path_tlvs_unk_src, tvb, offset+4+j, tlv_length, ENC_BIG_ENDIAN); /* RFC 5440 */
1599 proto_tree_add_item(tlv, hf_pcep_no_path_tlvs_brpc, tvb, offset+4+j, tlv_length, ENC_BIG_ENDIAN); /* RFC 5441 */
1600 proto_tree_add_item(tlv, hf_pcep_no_path_tlvs_pks, tvb, offset+4+j, tlv_length, ENC_BIG_ENDIAN); /* RFC 5520 */
1601 proto_tree_add_item(tlv, hf_pcep_no_path_tlvs_no_gco_migr, tvb, offset+4+j, tlv_length, ENC_BIG_ENDIAN); /* RFC 5557 */
1602 proto_tree_add_item(tlv, hf_pcep_no_path_tlvs_no_gco_soln, tvb, offset+4+j, tlv_length, ENC_BIG_ENDIAN); /* RFC 5557 */
1603 proto_tree_add_item(tlv, hf_pcep_no_path_tlvs_p2mp, tvb, offset+4+j, tlv_length, ENC_BIG_ENDIAN); /* RFC 6006 */
1604 break;
1605
1606 case 3: /* REQ-MISSING TLV */
1607 proto_tree_add_item(tlv, hf_pcep_request_id, tvb, offset+4+j, tlv_length, ENC_BIG_ENDIAN);
1608 break;
1609
1610 case 4: /* OF TLV */
1611 for (i=0; i<tlv_length/2; i++) {
1612 of_code = tvb_get_ntohs(tvb, offset+4+j+i*2);
1613 proto_tree_add_uint_format(tlv, hf_pcep_of_code, tvb, offset+4+j+i*2, 2, of_code, "OF-Code #%d: %s (%u)",
1614 i+1, val_to_str_const(of_code, pcep_of_vals, "Unknown"), of_code);
1615 }
1616 break;
1617
1618 case 7: /* VENDOR-INFORMATION-TLV (RFC7470)*/
1619 proto_tree_add_item(tlv, hf_pcep_tlv_enterprise_number, tvb, offset+4+j, 4, ENC_BIG_ENDIAN);
1620 proto_tree_add_item(tlv, hf_pcep_tlv_enterprise_specific_info, tvb, offset+4+j + 4, tlv_length - 4, ENC_STR_HEX);
1621 break;
1622
1623 case 16: /* STATEFUL-PCE-CAPABILITY TLV */
1624 proto_tree_add_bitmask(tlv, tvb, offset+4+j, hf_pcep_stateful_pce_capability_flags, ett_pcep_obj, tlv_stateful_pce_capability_flags, ENC_NA);
1625 break;
1626
1627 case 17: /* SYMBOLIC-PATH-NAME TLV */
1628 proto_tree_add_item(tlv, hf_pcep_symbolic_path_name, tvb, offset+4+j, tlv_length, ENC_ASCII|ENC_NA);
1629 break;
1630
1631 case 18: /* IPV4-LSP-IDENTIFIERS TLV */
1632 proto_tree_add_item(tlv, hf_pcep_ipv4_lsp_id_tunnel_sender_address, tvb, offset+4+j, 4, ENC_BIG_ENDIAN);
1633 proto_tree_add_item(tlv, hf_pcep_ipv4_lsp_id_lsp_id, tvb, offset+4+j + 4, 2, ENC_BIG_ENDIAN);
1634 proto_tree_add_item(tlv, hf_pcep_ipv4_lsp_id_tunnel_id, tvb, offset+4+j + 6, 2, ENC_BIG_ENDIAN);
1635 proto_tree_add_item(tlv, hf_pcep_ipv4_lsp_id_extended_tunnel_id, tvb, offset+4+j + 8, 4, ENC_BIG_ENDIAN);
1636 proto_tree_add_item(tlv, hf_pcep_ipv4_lsp_id_tunnel_endpoint_address, tvb, offset+4+j + 12, 4, ENC_BIG_ENDIAN);
1637 break;
1638
1639 case 19: /* IPV6-LSP-IDENTIFIERS TLV */
1640 proto_tree_add_item(tlv, hf_pcep_ipv6_lsp_id_tunnel_sender_address, tvb, offset+4+j, 16, ENC_NA);
1641 proto_tree_add_item(tlv, hf_pcep_ipv6_lsp_id_lsp_id, tvb, offset+4+j + 16, 2, ENC_BIG_ENDIAN);
1642 proto_tree_add_item(tlv, hf_pcep_ipv6_lsp_id_tunnel_id, tvb, offset+4+j + 18, 2, ENC_BIG_ENDIAN);
1643 proto_tree_add_item(tlv, hf_pcep_ipv6_lsp_id_extended_tunnel_id, tvb, offset+4+j + 20, 16, ENC_BIG_ENDIAN);
1644 proto_tree_add_item(tlv, hf_pcep_ipv6_lsp_id_tunnel_endpoint_address, tvb, offset+4+j + 36, 16, ENC_NA);
1645 break;
1646
1647 case 20: /* LSP-ERROR-CODE TLV */
1648 proto_tree_add_item(tlv, hf_pcep_lsp_error_code, tvb, offset+4+j, 4, ENC_BIG_ENDIAN);
1649 break;
1650
1651 case 21: /* RSVP-ERROR-SPEC TLV */
1652 proto_tree_add_item(tlv, hf_pcep_rsvp_user_error_spec, tvb, offset+4+j, tlv_length, ENC_ASCII|ENC_NA);
1653 break;
1654
1655 case 23: /* LSP-DB-VERSION TLV */
1656 proto_tree_add_item(tlv, hf_pcep_lsp_state_db_version_number, tvb, offset+4+j, 8, ENC_BIG_ENDIAN);
1657 break;
1658
1659 case 24: /* SPEAKER-ENTITY-ID TLV */
1660 proto_tree_add_item(tlv, hf_pcep_speaker_entity_id, tvb, offset+4+j, tlv_length, ENC_ASCII|ENC_NA);
1661 break;
1662
1663 case 26: /* SR-PCE-CAPABILITY TLV Deprecated */
1664 proto_tree_add_item(tlv, hf_pcep_sr_pce_capability_reserved, tvb, offset + 4 + j, 2, ENC_NA);
1665 proto_tree_add_bitmask(tlv, tvb, offset+4+j+2, hf_pcep_sr_pce_capability_flags, ett_pcep_obj, tlv_sr_pce_capability_flags, ENC_NA);
1666 proto_tree_add_item(tlv, hf_pcep_sr_pce_capability_msd, tvb, offset + 4 + j + 3, 1, ENC_NA);
1667 break;
1668
1669 case 27: /* PATH-SETUP-TYPE TLV (FF: squatted pre IANA assignment) */
1670 case 28: /* PATH-SETUP-TYPE TLV (FF: IANA code point) */
1671 proto_tree_add_item(tlv, hf_pcep_path_setup_type_reserved24, tvb, offset + 4 + j, 3, ENC_BIG_ENDIAN);
1672 proto_tree_add_item(tlv, hf_pcep_path_setup_type, tvb, offset + 4 + j + 3, 1, ENC_NA);
1673 break;
1674
1675 case 29: /* OP-CONF-ASSOC-RANGE */
1676 offset += 4 + j;
1677 while(tlv_length > 0) {
1678 proto_tree_add_item(tlv, hf_pcep_op_conf_assoc_range_reserved, tvb, offset, 2, ENC_NA);
1679 offset += 2;
1680 tlv_length -= 2;
1681 proto_tree_add_item(tlv, hf_pcep_op_conf_assoc_range_assoc_type, tvb, offset, 2, ENC_BIG_ENDIAN);
1682 offset += 2;
1683 tlv_length -= 2;
1684 proto_tree_add_item(tlv, hf_pcep_op_conf_assoc_range_start_assoc, tvb, offset, 2, ENC_BIG_ENDIAN);
1685 offset += 2;
1686 tlv_length -= 2;
1687 proto_tree_add_item(tlv, hf_pcep_op_conf_assoc_range_range, tvb, offset, 2, ENC_BIG_ENDIAN);
1688 offset += 2;
1689 tlv_length -= 2;
1690 }
1691 break;
1692
1693 case 30: /* GLOBAL-ASSOCIATION-SOURCE */
1694 proto_tree_add_item(tlv, hf_pcep_association_source_global, tvb, offset + 4 + j, 4, ENC_BIG_ENDIAN);
1695 break;
1696
1697 case 31: /* EXTENDED-ASSOCIATION-ID TLV */
1698 /* The extend association ID is scoped depending on the association type of the object
1699 in which the TLV is present */
1700 if (association_type==6) {
1701 if (tlv_length==8) {
1702 proto_tree_add_item(tlv, hf_pcep_association_id_extended_color, tvb, offset + 4 + j, 4, ENC_NA);
1703 proto_tree_add_item(tlv, hf_pcep_association_id_extended_ipv4_endpoint, tvb, offset + 8 + j, 4, ENC_NA);
1704 } else if (tlv_length==20) {
1705 proto_tree_add_item(tlv, hf_pcep_association_id_extended_color, tvb, offset + 4 + j, 4, ENC_NA);
1706 proto_tree_add_item(tlv, hf_pcep_association_id_extended_ipv6_endpoint, tvb, offset + 8 + j, 16, ENC_NA);
1707 } else {
1708 proto_tree_add_item(tlv, hf_pcep_association_id_extended, tvb, offset + 4 + j, tlv_length, ENC_NA);
1709 }
1710 } else {
1711 proto_tree_add_item(tlv, hf_pcep_association_id_extended, tvb, offset + 4 + j, tlv_length, ENC_NA);
1712 }
1713 break;
1714
1715 case 34: /* PATH-SETUP-TYPE-CAPABILITY TLV */
1716 proto_tree_add_item(tlv, hf_pcep_path_setup_type_capability_reserved24, tvb, offset + 4 + j, 3, ENC_BIG_ENDIAN);
1717 proto_tree_add_item_ret_uint(tlv, hf_pcep_path_setup_type_capability_psts, tvb, offset + 4 + j + 3, 1, ENC_NA, &psts);
1718 for (i = 0; i < (int)psts; i++) {
1719 proto_tree_add_item(tlv, hf_pcep_path_setup_type_capability_pst, tvb, offset + 4 + j + 4 + i, 1, ENC_NA);
1720 }
1721
1722 padding = (4 - (psts % 4)) % 4;
1723 if (padding != 0) {
1724 proto_tree_add_item(tlv, hf_pcep_tlv_padding, tvb, offset + 4 + j + 4 + psts, padding, ENC_NA);
1725 }
1726 if (tlv_length>8+psts+padding) {
1727 //There are sub-TLVs to decode
1728 dissect_pcep_path_setup_capabilities_sub_tlvs(tlv, tvb, offset+j+8+psts+padding, tlv_length -psts- padding-4, ett_pcep_obj);
1729 }
1730 break;
1731
1732 case 35: /* ASSOC-Type-List TLV */
1733 for (i=0; i<tlv_length/2; i++) {
1734 assoc_type = tvb_get_ntohs(tvb, offset+4+j+i*2);
1735 proto_tree_add_uint_format(tlv, hf_pcep_association_type, tvb, offset+4+j+i*2, 2, assoc_type, "Assoc-Type #%d: %s (%u)",
1736 i+1, val_to_str_const(assoc_type, pcep_association_type_field_vals, "Unknown"), assoc_type);
1737 }
1738 break;
1739
1740 case 40: /* SRCPAG-INFO TLV */
1741 proto_tree_add_item(tlv, hf_pcep_srcpag_info_color, tvb, offset + 4 + j, 4, ENC_BIG_ENDIAN);
1742 proto_tree_add_item(tlv, hf_pcep_srcpag_info_destination_endpoint, tvb, offset + 4 + j + 4, 4, ENC_NA);
1743 proto_tree_add_item(tlv, hf_pcep_srcpag_info_preference, tvb, offset + 4 + j + 8, 4, ENC_NA);
1744 break;
1745
1746 case 56: /* SRPOLICY-POL-NAME */
1747 proto_tree_add_item(tlv, hf_pcep_sr_policy_name, tvb, offset+4+j, tlv_length, ENC_ASCII|ENC_NA);
1748 break;
1749
1750 case 57: /* SRPOLICY-CPATH-ID */
1751 proto_tree_add_item(tlv, hf_pcep_sr_policy_cpath_id_proto_origin, tvb, offset + 4 + j, 1, ENC_BIG_ENDIAN);
1752 proto_tree_add_item(tlv, hf_pcep_sr_policy_cpath_id_originator_asn, tvb, offset + 8 + j, 4, ENC_BIG_ENDIAN);
1753 proto_tree_add_item(tlv, hf_pcep_sr_policy_cpath_id_originator_address, tvb, offset + 24+ j, 4, ENC_BIG_ENDIAN);
1754 proto_tree_add_item(tlv, hf_pcep_sr_policy_cpath_id_discriminator, tvb, offset + 28 + j, 4, ENC_BIG_ENDIAN);
1755 break;
1756
1757 case 58: /* SRPOLICY-CPATH-NAME */
1758 proto_tree_add_item(tlv, hf_pcep_sr_policy_cpath_name, tvb, offset+4+j, tlv_length, ENC_ASCII|ENC_NA);
1759 break;
1760
1761 case 59: /* SRPOLICY-CPATH-PREFERENCE */
1762 proto_tree_add_item(tlv, hf_pcep_sr_policy_cpath_preference, tvb, offset + 4 + j, 4, ENC_BIG_ENDIAN);
1763 break;
1764
1765 default:
1766 proto_tree_add_item(tlv, hf_pcep_tlv_data, tvb, offset+4+j, tlv_length, ENC_NA);
1767 }
1768
1769 padding = (4 - (tlv_length % 4)) % 4;
1770 if (padding != 0) {
1771 proto_tree_add_item(tlv, hf_pcep_tlv_padding, tvb, offset+4+j+tlv_length, padding, ENC_NA);
1772 }
1773 }
1774 }
1775
1776 static void
dissect_pcep_tlvs(proto_tree * pcep_obj,tvbuff_t * tvb,int offset,gint length,gint ett_pcep_obj)1777 dissect_pcep_tlvs(proto_tree *pcep_obj, tvbuff_t *tvb, int offset, gint length, gint ett_pcep_obj)
1778 {
1779 dissect_pcep_tlvs_with_scope(pcep_obj, tvb, offset, length, ett_pcep_obj,0);
1780 }
1781
1782 /*------------------------------------------------------------------------------
1783 *SUBOBJECTS
1784 *------------------------------------------------------------------------------*/
1785 static void
dissect_subobj_ipv4(proto_tree * pcep_subobj_tree,packet_info * pinfo,tvbuff_t * tvb,int offset,int obj_class,gint ett_pcep_obj,guint length)1786 dissect_subobj_ipv4(proto_tree *pcep_subobj_tree, packet_info *pinfo, tvbuff_t *tvb, int offset, int obj_class, gint ett_pcep_obj, guint length)
1787 {
1788 proto_tree *pcep_subobj_ipv4;
1789 proto_tree *pcep_subobj_ipv4_flags;
1790 proto_item *ti;
1791 guint8 prefix_length;
1792
1793 ti = proto_tree_add_item(pcep_subobj_tree, hf_PCEPF_SUBOBJ_IPv4, tvb, offset, length, ENC_NA);
1794 pcep_subobj_ipv4 = proto_item_add_subtree(ti, ett_pcep_obj);
1795
1796 if (length != 8) {
1797 expert_add_info_format(pinfo, ti, &ei_pcep_subobject_bad_length,
1798 "Bad IPv4 subobject: length %u != 8", length);
1799 return;
1800 }
1801
1802 prefix_length = tvb_get_guint8(tvb, offset+6);
1803 proto_item_append_text(ti, ": %s/%u", tvb_ip_to_str(pinfo->pool, tvb, offset+2),
1804 prefix_length);
1805
1806 switch (obj_class) {
1807
1808 case PCEP_EXPLICIT_ROUTE_OBJ:
1809 case PCEP_SERO_OBJ:
1810 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_l, tvb, offset, 1, ENC_NA);
1811 proto_tree_add_item(pcep_subobj_ipv4, hf_PCEPF_SUBOBJ_7F, tvb, offset, 1, ENC_NA);
1812 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_length, tvb, offset+1, 1, ENC_NA);
1813 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_ipv4, tvb, offset+2, 4, ENC_BIG_ENDIAN);
1814 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_prefix_length, tvb, offset+6, 1, ENC_NA);
1815 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_padding, tvb, offset+7, 1, ENC_NA);
1816 break;
1817
1818 case PCEP_RECORD_ROUTE_OBJ:
1819 case PCEP_SRRO_OBJ:
1820 proto_tree_add_item(pcep_subobj_ipv4, hf_PCEPF_SUBOBJ, tvb, offset, 1, ENC_NA);
1821 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_length, tvb, offset+1, 1, ENC_NA);
1822 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_ipv4, tvb, offset+2, 4, ENC_BIG_ENDIAN);
1823 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_prefix_length, tvb, offset+6, 1, ENC_NA);
1824 ti = proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_flags, tvb, offset+7, 1, ENC_NA);
1825 pcep_subobj_ipv4_flags = proto_item_add_subtree(ti, ett_pcep_obj);
1826 proto_tree_add_item(pcep_subobj_ipv4_flags, pcep_subobj_flags_lpa, tvb, offset+7, 1, ENC_NA);
1827 proto_tree_add_item(pcep_subobj_ipv4_flags, pcep_subobj_flags_lpu, tvb, offset+7, 1, ENC_NA);
1828 break;
1829
1830 case PCEP_IRO_OBJ:
1831 case PCEP_OBJ_BRANCH_NODE_CAPABILITY:
1832 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_iro_ipv4_l, tvb, offset, 1, ENC_NA);
1833 proto_tree_add_item(pcep_subobj_ipv4, hf_PCEPF_SUBOBJ_7F, tvb, offset, 1, ENC_NA);
1834 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_length, tvb, offset+1, 1, ENC_NA);
1835 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_ipv4, tvb, offset+2, 4, ENC_BIG_ENDIAN);
1836 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_prefix_length, tvb, offset+6, 1, ENC_NA);
1837 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_padding, tvb, offset+7, 1, ENC_NA);
1838 break;
1839
1840 case PCEP_XRO_OBJ:
1841 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_x, tvb, offset, 1, ENC_NA);
1842 proto_tree_add_item(pcep_subobj_ipv4, hf_PCEPF_SUBOBJ_XRO, tvb, offset, 1, ENC_NA);
1843 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_length, tvb, offset+1, 1, ENC_NA);
1844 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_ipv4, tvb, offset+2, 4, ENC_BIG_ENDIAN);
1845 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_prefix_length, tvb, offset+6, 1, ENC_NA);
1846 proto_tree_add_item(pcep_subobj_ipv4, hf_pcep_subobj_ipv4_attribute, tvb, offset+7, 1, ENC_NA);
1847 break;
1848
1849 default:
1850 expert_add_info_format(pinfo, ti, &ei_pcep_non_defined_subobject,
1851 "Non defined subobject for this object");
1852 break;
1853 }
1854 }
1855
1856 static void
dissect_subobj_ipv6(proto_tree * pcep_subobj_tree,packet_info * pinfo,tvbuff_t * tvb,int offset,int obj_class,gint ett_pcep_obj,guint length)1857 dissect_subobj_ipv6(proto_tree *pcep_subobj_tree, packet_info *pinfo, tvbuff_t *tvb, int offset, int obj_class, gint ett_pcep_obj, guint length)
1858 {
1859 proto_tree *pcep_subobj_ipv6;
1860 proto_tree *pcep_subobj_ipv6_flags;
1861 proto_item *ti;
1862 guint8 prefix_length;
1863
1864 ti = proto_tree_add_item(pcep_subobj_tree, hf_PCEPF_SUBOBJ_IPv6, tvb, offset, length, ENC_NA);
1865 pcep_subobj_ipv6 = proto_item_add_subtree(ti, ett_pcep_obj);
1866
1867 if (length != 20) {
1868 expert_add_info_format(pinfo, ti, &ei_pcep_subobject_bad_length,
1869 "Bad IPv6 subobject: length %u != 20", length);
1870 return;
1871 }
1872
1873 prefix_length = tvb_get_guint8(tvb, offset+18);
1874 proto_item_append_text(ti, ": %s/%u", tvb_ip6_to_str(pinfo->pool, tvb, offset+2),
1875 prefix_length);
1876
1877 switch (obj_class) {
1878 case PCEP_EXPLICIT_ROUTE_OBJ:
1879 case PCEP_SERO_OBJ:
1880 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_l, tvb, offset, 1, ENC_NA);
1881 proto_tree_add_item(pcep_subobj_ipv6, hf_PCEPF_SUBOBJ_7F, tvb, offset, 1, ENC_NA);
1882 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_length, tvb, offset+1, 1, ENC_NA);
1883 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_ipv6, tvb, offset+2, 16, ENC_NA);
1884 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_prefix_length, tvb, offset+18, 1, ENC_NA);
1885 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_padding, tvb, offset+19, 1, ENC_NA);
1886 break;
1887
1888 case PCEP_RECORD_ROUTE_OBJ:
1889 case PCEP_SRRO_OBJ:
1890 proto_tree_add_item(pcep_subobj_ipv6, hf_PCEPF_SUBOBJ, tvb, offset, 1, ENC_NA);
1891 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_length, tvb, offset+1, 1, ENC_NA);
1892 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_ipv6, tvb, offset+2, 16, ENC_NA);
1893 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_prefix_length, tvb, offset+18, 1, ENC_NA);
1894 ti = proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_flags, tvb, offset+19, 1, ENC_NA);
1895 pcep_subobj_ipv6_flags = proto_item_add_subtree(ti, ett_pcep_obj);
1896 proto_tree_add_item(pcep_subobj_ipv6_flags, pcep_subobj_flags_lpa, tvb, offset+19, 1, ENC_NA);
1897 proto_tree_add_item(pcep_subobj_ipv6_flags, pcep_subobj_flags_lpu, tvb, offset+19, 1, ENC_NA);
1898 break;
1899
1900 case PCEP_IRO_OBJ:
1901 case PCEP_OBJ_BRANCH_NODE_CAPABILITY:
1902 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_iro_ipv6_l, tvb, offset, 1, ENC_NA);
1903 proto_tree_add_item(pcep_subobj_ipv6, hf_PCEPF_SUBOBJ_7F, tvb, offset, 1, ENC_NA);
1904 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_length, tvb, offset+1, 1, ENC_NA);
1905 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_ipv6, tvb, offset+2, 16, ENC_NA);
1906 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_prefix_length, tvb, offset+18, 1, ENC_NA);
1907 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_padding, tvb, offset+19, 1, ENC_NA);
1908 break;
1909
1910 case PCEP_XRO_OBJ:
1911 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_x, tvb, offset, 1, ENC_NA);
1912 proto_tree_add_item(pcep_subobj_ipv6, hf_PCEPF_SUBOBJ_XRO, tvb, offset, 1, ENC_NA);
1913 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_length, tvb, offset+1, 1, ENC_NA);
1914 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_ipv6, tvb, offset+2, 16, ENC_NA);
1915 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_prefix_length, tvb, offset+18, 1, ENC_NA);
1916 proto_tree_add_item(pcep_subobj_ipv6, hf_pcep_subobj_ipv6_attribute, tvb, offset+19, 1, ENC_NA);
1917 break;
1918
1919 default:
1920 expert_add_info_format(pinfo, ti, &ei_pcep_non_defined_subobject,
1921 "Non defined subobject for this object");
1922 break;
1923 }
1924 }
1925
1926 static void
dissect_subobj_label_control(proto_tree * pcep_subobj_tree,packet_info * pinfo,tvbuff_t * tvb,int offset,int obj_class,gint ett_pcep_obj,guint length)1927 dissect_subobj_label_control(proto_tree *pcep_subobj_tree, packet_info *pinfo, tvbuff_t *tvb, int offset, int obj_class, gint ett_pcep_obj, guint length)
1928 {
1929 proto_tree *pcep_subobj_label_control;
1930 proto_tree *pcep_subobj_label_flags;
1931 proto_item *ti;
1932
1933 ti = proto_tree_add_item(pcep_subobj_tree, hf_PCEPF_SUBOBJ_LABEL_CONTROL, tvb, offset, length, ENC_NA);
1934 pcep_subobj_label_control = proto_item_add_subtree(ti, ett_pcep_obj);
1935
1936 if (length < 5) {
1937 expert_add_info_format(pinfo, ti, &ei_pcep_subobject_bad_length,
1938 "Bad label control subobject: length %u < 5", length);
1939 return;
1940 }
1941
1942 switch (obj_class) {
1943
1944 case PCEP_EXPLICIT_ROUTE_OBJ:
1945 case PCEP_SERO_OBJ:
1946 proto_tree_add_item(pcep_subobj_label_control, hf_pcep_subobj_label_control_l, tvb, offset, 1, ENC_NA);
1947 proto_tree_add_item(pcep_subobj_label_control, hf_PCEPF_SUBOBJ_7F, tvb, offset, 1, ENC_NA);
1948 proto_tree_add_item(pcep_subobj_label_control, hf_pcep_subobj_label_control_length, tvb, offset+1, 1, ENC_NA);
1949 proto_tree_add_item(pcep_subobj_label_control, hf_pcep_subobj_label_control_u, tvb, offset+2, 1, ENC_NA);
1950 proto_tree_add_item(pcep_subobj_label_control, hf_pcep_subobj_label_control_reserved, tvb, offset+2, 1, ENC_NA);
1951 proto_tree_add_item(pcep_subobj_label_control, hf_pcep_subobj_label_control_c_type, tvb, offset+3, 1, ENC_NA);
1952 proto_tree_add_item(pcep_subobj_label_control, hf_pcep_subobj_label_control_label, tvb, offset+4, length-4, ENC_NA);
1953 break;
1954
1955 case PCEP_RECORD_ROUTE_OBJ:
1956 case PCEP_SRRO_OBJ:
1957 proto_tree_add_item(pcep_subobj_label_control, hf_PCEPF_SUBOBJ, tvb, offset, 1, ENC_NA);
1958 proto_tree_add_item(pcep_subobj_label_control, hf_pcep_subobj_label_control_length, tvb, offset+1, 1, ENC_NA);
1959 proto_tree_add_item(pcep_subobj_label_control, hf_pcep_subobj_label_control_u, tvb, offset+2, 1, ENC_NA);
1960
1961 ti = proto_tree_add_item(pcep_subobj_label_control, hf_pcep_subobj_label_control_flags, tvb, offset+2, 1, ENC_NA);
1962 pcep_subobj_label_flags = proto_item_add_subtree(ti, ett_pcep_obj);
1963 proto_tree_add_item(pcep_subobj_label_flags, pcep_subobj_label_flags_gl, tvb, offset+2, 1, ENC_NA);
1964 proto_tree_add_item(pcep_subobj_label_control, hf_pcep_subobj_label_control_c_type, tvb, offset+3, 1, ENC_NA);
1965 proto_tree_add_item(pcep_subobj_label_control, hf_pcep_subobj_label_control_label, tvb, offset+4, length-4, ENC_NA);
1966 break;
1967
1968 default:
1969 expert_add_info_format(pinfo, ti, &ei_pcep_non_defined_subobject,
1970 "Non defined subobject for this object");
1971 break;
1972 }
1973 }
1974
1975 static void
dissect_subobj_sr(proto_tree * pcep_subobj_tree,packet_info * pinfo,tvbuff_t * tvb,int offset,int obj_class,gint ett_pcep_obj,guint length)1976 dissect_subobj_sr(proto_tree *pcep_subobj_tree, packet_info *pinfo, tvbuff_t *tvb, int offset, int obj_class, gint ett_pcep_obj, guint length)
1977 {
1978 proto_tree *pcep_subobj_sr_tree = NULL;
1979 proto_item *ti = NULL;
1980 proto_tree *sid_tree = NULL;
1981 proto_item *sid_item = NULL;
1982 guint16 flags;
1983 guint8 j = 0, nt = 0;
1984 guint8 octet0, octet1, octet2;
1985 guint32 label;
1986 guint8 tc, bos, ttl;
1987
1988 static int * const subobj_sr_flags[] = {
1989 &hf_pcep_subobj_sr_flags_m,
1990 &hf_pcep_subobj_sr_flags_c,
1991 &hf_pcep_subobj_sr_flags_s,
1992 &hf_pcep_subobj_sr_flags_f,
1993 NULL
1994 };
1995
1996 ti = proto_tree_add_item(pcep_subobj_tree, hf_PCEPF_SUBOBJ_SR, tvb, offset, length, ENC_NA);
1997 pcep_subobj_sr_tree = proto_item_add_subtree(ti, ett_pcep_obj);
1998
1999 if (length < 8) {
2000 expert_add_info_format(pinfo, ti, &ei_pcep_subobject_bad_length,
2001 "Bad SR subobject: length %u < 8", length);
2002 return;
2003 }
2004
2005 flags = tvb_get_guint16(tvb, offset+2, ENC_NA);
2006 nt = ((tvb_get_guint8(tvb, offset + 2)) >> 4);
2007
2008 if (obj_class == PCEP_EXPLICIT_ROUTE_OBJ || obj_class == PCEP_RECORD_ROUTE_OBJ) {
2009 if (obj_class == PCEP_EXPLICIT_ROUTE_OBJ) {
2010 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_l, tvb, offset, 1, ENC_NA);
2011 proto_tree_add_item(pcep_subobj_sr_tree, hf_PCEPF_SUBOBJ_7F, tvb, offset, 1, ENC_NA);
2012 }
2013 else {
2014 proto_tree_add_item(pcep_subobj_sr_tree, hf_PCEPF_SUBOBJ, tvb, offset, 1, ENC_NA);
2015 }
2016
2017 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_length, tvb, offset + 1, 1, ENC_NA);
2018 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_nt, tvb, offset + 2, 1, ENC_NA);
2019 proto_tree_add_bitmask(pcep_subobj_sr_tree, tvb, offset + 2, hf_pcep_subobj_sr_flags, ett_pcep_obj, subobj_sr_flags, ENC_NA);
2020
2021 if ( ! (flags & PCEP_SUBOBJ_SR_FLAGS_S) ) { /* S flag is not set, SID exists */
2022 j = 4;
2023 sid_item = proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_sid, tvb, offset + 4, 4, ENC_BIG_ENDIAN);
2024
2025 if (flags & PCEP_SUBOBJ_SR_FLAGS_M) { /* M flag is set, SID represents MPLS label stack */
2026 sid_tree = proto_item_add_subtree(sid_item, ett_pcep_obj);
2027 proto_tree_add_item(sid_tree, hf_pcep_subobj_sr_sid_label, tvb, offset+4, 4, ENC_BIG_ENDIAN);
2028 proto_tree_add_item(sid_tree, hf_pcep_subobj_sr_sid_tc, tvb, offset+4, 4, ENC_BIG_ENDIAN);
2029 proto_tree_add_item(sid_tree, hf_pcep_subobj_sr_sid_s , tvb, offset+4, 4, ENC_BIG_ENDIAN);
2030 proto_tree_add_item(sid_tree, hf_pcep_subobj_sr_sid_ttl, tvb, offset+4, 4, ENC_BIG_ENDIAN);
2031
2032 octet0 = tvb_get_guint8(tvb, offset+4);
2033 octet1 = tvb_get_guint8(tvb, offset+5);
2034 octet2 = tvb_get_guint8(tvb, offset+6);
2035 label = (octet0 << 12) + (octet1 << 4) + ((octet2 >> 4) & 0xff);
2036 tc = (octet2 >> 1) & 0x7;
2037 bos = (octet2 & 0x1);
2038 ttl = tvb_get_guint8(tvb, offset+7);
2039 proto_item_append_text(sid_tree, " (Label: %u, TC: %u, S: %u, TTL: %u)", label, tc, bos, ttl);
2040 }
2041 }
2042
2043 if ( ! (flags & PCEP_SUBOBJ_SR_FLAGS_F) ) { /* F flag is not set, NAI exists */
2044 switch (nt) {
2045 case 1: /* IPv4 Node ID */
2046 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_nai_ipv4_node, tvb, offset+j+4, 4, ENC_BIG_ENDIAN);
2047 break;
2048
2049 case 2: /* IPv6 Node ID */
2050 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_nai_ipv6_node, tvb, offset+j+4, 16, ENC_NA);
2051 break;
2052
2053 case 3: /* IPv4 Adjacency */
2054 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_nai_local_ipv4_addr, tvb, offset+j+4, 4, ENC_BIG_ENDIAN);
2055 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_nai_remote_ipv4_addr, tvb, offset+j+8, 4, ENC_BIG_ENDIAN);
2056 break;
2057
2058 case 4: /* IPv6 Adjacency with global IPv6 addresses */
2059 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_nai_local_ipv6_addr, tvb, offset+j+4, 16, ENC_NA);
2060 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_nai_remote_ipv6_addr, tvb, offset+j+20, 16, ENC_NA);
2061 break;
2062
2063 case 5: /* Unnumbered Adjacency with IPv4 Node IDs */
2064 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_nai_local_node_id, tvb, offset+j+4, 4, ENC_BIG_ENDIAN);
2065 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_nai_local_interface_id, tvb, offset+j+8, 4, ENC_BIG_ENDIAN);
2066 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_nai_remote_node_id, tvb, offset+j+12, 4, ENC_BIG_ENDIAN);
2067 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_nai_remote_interface_id, tvb, offset+j+16, 4, ENC_BIG_ENDIAN);
2068 break;
2069
2070 case 6: /* IPv6 Adjacency with link-local IPv6 addresses */
2071 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_nai_local_ipv6_addr, tvb, offset+j+4, 16, ENC_NA);
2072 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_nai_local_interface_id, tvb, offset+j+20, 4, ENC_BIG_ENDIAN);
2073 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_nai_remote_ipv6_addr, tvb, offset+j+24, 16, ENC_NA);
2074 proto_tree_add_item(pcep_subobj_sr_tree, hf_pcep_subobj_sr_nai_remote_interface_id, tvb, offset+j+40, 4, ENC_BIG_ENDIAN);
2075
2076 default:
2077 break;
2078 }
2079 }
2080 }
2081 else {
2082 expert_add_info_format(pinfo, ti, &ei_pcep_non_defined_subobject, "Non defined subobject for this object");
2083 }
2084 }
2085
2086 static void
dissect_subobj_unnumb_interfaceID(proto_tree * pcep_subobj_tree,packet_info * pinfo,tvbuff_t * tvb,int offset,int obj_class,gint ett_pcep_obj,guint length)2087 dissect_subobj_unnumb_interfaceID(proto_tree *pcep_subobj_tree, packet_info *pinfo, tvbuff_t *tvb, int offset, int obj_class, gint ett_pcep_obj, guint length)
2088 {
2089 proto_tree *pcep_subobj_unnumb_interfaceID;
2090 proto_item *ti;
2091 guint32 interface_ID;
2092
2093 ti = proto_tree_add_item(pcep_subobj_tree, hf_PCEPF_SUBOBJ_UNNUM_INTERFACEID, tvb, offset, length, ENC_NA);
2094 pcep_subobj_unnumb_interfaceID = proto_item_add_subtree(ti, ett_pcep_obj);
2095
2096 if (length != 12) {
2097 expert_add_info_format(pinfo, ti, &ei_pcep_subobject_bad_length,
2098 "Bad unnumbered interface ID subobject: length %u != 12", length);
2099 return;
2100 }
2101
2102 interface_ID = tvb_get_ntohl(tvb, offset+8);
2103 proto_item_append_text(ti, ": %s:%u", tvb_ip_to_str(pinfo->pool, tvb, offset+4),
2104 interface_ID);
2105
2106 switch (obj_class) {
2107
2108 case PCEP_EXPLICIT_ROUTE_OBJ:
2109 case PCEP_SERO_OBJ:
2110 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_pcep_subobj_unnumb_interfaceID_l, tvb, offset, 1, ENC_NA);
2111 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_PCEPF_SUBOBJ_7F, tvb, offset, 1, ENC_NA);
2112 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_pcep_subobj_unnumb_interfaceID_length, tvb, offset+1, 1, ENC_NA);
2113 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_pcep_subobj_unnumb_interfaceID_reserved, tvb, offset+2, 2, ENC_BIG_ENDIAN);
2114 break;
2115
2116 case PCEP_RECORD_ROUTE_OBJ:
2117 case PCEP_SRRO_OBJ:
2118 {
2119 static int * const flags[] = {
2120 &pcep_subobj_flags_lpa,
2121 &pcep_subobj_flags_lpu,
2122 NULL
2123 };
2124
2125 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_PCEPF_SUBOBJ, tvb, offset, 1, ENC_NA);
2126 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_pcep_subobj_unnumb_interfaceID_length, tvb, offset+1, 1, ENC_NA);
2127 proto_tree_add_bitmask(pcep_subobj_unnumb_interfaceID, tvb, offset+2, hf_pcep_subobj_unnumb_interfaceID_flags, ett_pcep_obj, flags, ENC_BIG_ENDIAN);
2128 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_pcep_subobj_unnumb_interfaceID_reserved_rrobj, tvb, offset+3, 1, ENC_NA);
2129 }
2130 break;
2131
2132 case PCEP_IRO_OBJ:
2133 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_pcep_subobj_iro_unnumb_interfaceID_l, tvb, offset, 1, ENC_NA);
2134 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_PCEPF_SUBOBJ_7F, tvb, offset, 1, ENC_NA);
2135 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_pcep_subobj_unnumb_interfaceID_length, tvb, offset+1, 1, ENC_NA);
2136 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_pcep_subobj_unnumb_interfaceID_reserved, tvb, offset+2, 2, ENC_BIG_ENDIAN);
2137 break;
2138
2139 case PCEP_XRO_OBJ:
2140 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_pcep_subobj_unnumb_interfaceID_x, tvb, offset, 1, ENC_NA);
2141 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_PCEPF_SUBOBJ_XRO, tvb, offset, 1, ENC_NA);
2142 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_pcep_subobj_unnumb_interfaceID_reserved_xroobj, tvb, offset+2, 1, ENC_NA);
2143 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_pcep_subobj_unnumb_interfaceID_attribute, tvb, offset+3, 1, ENC_NA);
2144 break;
2145
2146 default:
2147 expert_add_info_format(pinfo, ti, &ei_pcep_non_defined_subobject,
2148 "Non defined subobject for this object");
2149 break;
2150 }
2151
2152 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_pcep_subobj_unnumb_interfaceID_router_id, tvb, offset+4, 4, ENC_BIG_ENDIAN);
2153 proto_tree_add_item(pcep_subobj_unnumb_interfaceID, hf_pcep_subobj_unnumb_interfaceID_interface_id, tvb, offset+8, 4, ENC_BIG_ENDIAN);
2154 }
2155
2156 static void
dissect_subobj_autonomous_sys_num(proto_tree * pcep_subobj_tree,packet_info * pinfo,tvbuff_t * tvb,int offset,int obj_class,guint ett_pcep_obj,guint length)2157 dissect_subobj_autonomous_sys_num(proto_tree *pcep_subobj_tree, packet_info *pinfo, tvbuff_t *tvb, int offset, int obj_class, guint ett_pcep_obj, guint length)
2158 {
2159 proto_tree *pcep_subobj_autonomous_sys_num;
2160 proto_item *ti;
2161
2162 if (obj_class == PCEP_XRO_OBJ) {
2163 ti = proto_tree_add_item(pcep_subobj_tree, hf_PCEPF_SUBOBJ_AUTONOMOUS_SYS_NUM, tvb, offset, length, ENC_NA);
2164 pcep_subobj_autonomous_sys_num = proto_item_add_subtree(ti, ett_pcep_obj);
2165 if (length != 8) {
2166 expert_add_info_format(pinfo, ti, &ei_pcep_subobject_bad_length,
2167 "Bad autonomous system number subobject: length %u != 8", length);
2168 return;
2169 }
2170
2171 proto_tree_add_item(pcep_subobj_autonomous_sys_num, hf_pcep_subobj_autonomous_sys_num_x, tvb, offset, 1, ENC_NA);
2172 proto_tree_add_item(pcep_subobj_autonomous_sys_num, hf_PCEPF_SUBOBJ_XRO, tvb, offset, 1, ENC_NA);
2173 proto_tree_add_item(pcep_subobj_autonomous_sys_num, hf_pcep_subobj_autonomous_sys_num_length, tvb, offset+1, 1, ENC_NA);
2174
2175 proto_tree_add_item(pcep_subobj_autonomous_sys_num, hf_pcep_subobj_autonomous_sys_num_reserved, tvb, offset+2, 1, ENC_NA);
2176 proto_tree_add_item(pcep_subobj_autonomous_sys_num, hf_pcep_subobj_autonomous_sys_num_attribute, tvb, offset+3, 1, ENC_NA);
2177 proto_tree_add_item(pcep_subobj_autonomous_sys_num, hf_pcep_subobj_autonomous_sys_num_optional_as_number_high_octets, tvb, offset+4, 2, ENC_BIG_ENDIAN);
2178 proto_tree_add_item(pcep_subobj_autonomous_sys_num, hf_pcep_subobj_autonomous_sys_num_as_number, tvb, offset+6, 2, ENC_BIG_ENDIAN);
2179 } else {
2180 ti = proto_tree_add_item(pcep_subobj_tree, hf_PCEPF_SUBOBJ_AUTONOMOUS_SYS_NUM, tvb, offset, length, ENC_NA);
2181 pcep_subobj_autonomous_sys_num = proto_item_add_subtree(ti, ett_pcep_obj);
2182
2183 if (length != 4) {
2184 expert_add_info_format(pinfo, ti, &ei_pcep_subobject_bad_length,
2185 "Bad autonomous system number subobject: length %u != 4", length);
2186 return;
2187 }
2188
2189 if (obj_class == PCEP_IRO_OBJ)
2190 proto_tree_add_item(pcep_subobj_autonomous_sys_num, hf_pcep_subobj_iro_autonomous_sys_num_l, tvb, offset, 1, ENC_NA);
2191 else
2192 proto_tree_add_item(pcep_subobj_autonomous_sys_num, hf_pcep_subobj_autonomous_sys_num_l, tvb, offset, 1, ENC_NA);
2193 proto_tree_add_item(pcep_subobj_autonomous_sys_num, hf_PCEPF_SUBOBJ_7F, tvb, offset, 1, ENC_NA);
2194 proto_tree_add_item(pcep_subobj_autonomous_sys_num, hf_pcep_subobj_autonomous_sys_num_length, tvb, offset+1, 1, ENC_NA);
2195 proto_tree_add_item(pcep_subobj_autonomous_sys_num, hf_pcep_subobj_autonomous_sys_num_as_number, tvb, offset+2, 2, ENC_BIG_ENDIAN);
2196 }
2197 }
2198
2199 static void
dissect_subobj_srlg(proto_tree * pcep_subobj_tree,packet_info * pinfo,tvbuff_t * tvb,int offset,guint ett_pcep_obj,guint length)2200 dissect_subobj_srlg(proto_tree *pcep_subobj_tree, packet_info *pinfo, tvbuff_t *tvb, int offset, guint ett_pcep_obj, guint length)
2201 {
2202 proto_tree *pcep_subobj_srlg;
2203 proto_item *ti;
2204
2205 ti = proto_tree_add_item(pcep_subobj_tree, hf_PCEPF_SUBOBJ_SRLG, tvb, offset, length, ENC_NA);
2206 pcep_subobj_srlg = proto_item_add_subtree(ti, ett_pcep_obj);
2207
2208 if (length != 8) {
2209 expert_add_info_format(pinfo, ti, &ei_pcep_subobject_bad_length,
2210 "Bad SRLG subobject: length %u != 8", length);
2211 return;
2212 }
2213
2214 proto_tree_add_item(pcep_subobj_srlg, hf_pcep_subobj_srlg_x, tvb, offset, 1, ENC_NA);
2215 proto_tree_add_item(pcep_subobj_srlg, hf_PCEPF_SUBOBJ_XRO, tvb, offset, 1, ENC_NA);
2216 proto_tree_add_item(pcep_subobj_srlg, hf_pcep_subobj_srlg_length, tvb, offset+1, 1, ENC_NA);
2217
2218 proto_tree_add_item(pcep_subobj_srlg, hf_pcep_subobj_srlg_id, tvb, offset+2, 4, ENC_BIG_ENDIAN);
2219 proto_tree_add_item(pcep_subobj_srlg, hf_pcep_subobj_srlg_reserved, tvb, offset+6, 1, ENC_NA);
2220 proto_tree_add_item(pcep_subobj_srlg, hf_pcep_subobj_srlg_attribute, tvb, offset+7, 1, ENC_NA);
2221 }
2222
2223 static void
dissect_subobj_exrs(proto_tree * pcep_subobj_tree,packet_info * pinfo,tvbuff_t * tvb,int offset,int obj_class,guint ett_pcep_obj,guint type_iro,guint length)2224 dissect_subobj_exrs(proto_tree *pcep_subobj_tree, packet_info *pinfo, tvbuff_t *tvb, int offset, int obj_class, guint ett_pcep_obj, guint type_iro, guint length)
2225 {
2226 proto_tree *pcep_subobj_exrs;
2227 proto_item *ti;
2228 guint8 l_type;
2229 guint8 length2;
2230 guint type_exrs;
2231 guint offset_exrs = 0;
2232
2233 ti = proto_tree_add_item(pcep_subobj_tree, hf_PCEPF_SUBOBJ_EXRS, tvb, offset, length, ENC_NA);
2234 pcep_subobj_exrs = proto_item_add_subtree(ti, ett_pcep_obj);
2235
2236 if (length < 4) {
2237 expert_add_info_format(pinfo, ti, &ei_pcep_subobject_bad_length,
2238 "Bad EXRS subobject: length %u < 4", length);
2239 return;
2240 }
2241
2242 proto_tree_add_item(pcep_subobj_exrs, hf_pcep_subobj_exrs_l, tvb, offset, 1, ENC_NA);
2243 proto_tree_add_item(pcep_subobj_exrs, hf_pcep_subobj_exrs_type, tvb, offset, 1, ENC_NA);
2244 proto_tree_add_item(pcep_subobj_exrs, hf_pcep_subobj_exrs_length, tvb, offset+1, 1, ENC_NA);
2245
2246 proto_tree_add_item(pcep_subobj_exrs, hf_pcep_subobj_exrs_reserved, tvb, offset+2, 2, ENC_BIG_ENDIAN);
2247
2248 offset += 4;
2249
2250 while (offset_exrs<length-4) {
2251
2252 l_type = tvb_get_guint8(tvb, offset);
2253 length2 = tvb_get_guint8(tvb, offset+1);
2254
2255 if (length2 < 2) {
2256 expert_add_info_format(pinfo, ti, &ei_pcep_subobject_bad_length,
2257 "Bad packet: subobject length %u < 2", length2);
2258 break;
2259 }
2260
2261 type_exrs = (l_type & Mask_Type);
2262
2263 if (type_iro == PCEP_SUB_EXRS)
2264 obj_class = PCEP_XRO_OBJ;
2265
2266 switch (type_exrs) {
2267
2268 case PCEP_SUB_IPv4:
2269 dissect_subobj_ipv4(pcep_subobj_exrs, pinfo, tvb, offset, obj_class, ett_pcep_obj, length2);
2270 break;
2271 case PCEP_SUB_IPv6:
2272 dissect_subobj_ipv6(pcep_subobj_exrs, pinfo, tvb, offset, obj_class, ett_pcep_obj, length2);
2273 break;
2274 case PCEP_SUB_UNNUMB_INTERFACE_ID:
2275 dissect_subobj_unnumb_interfaceID(pcep_subobj_exrs, pinfo, tvb, offset, obj_class, ett_pcep_obj, length2);
2276 break;
2277 case PCEP_SUB_AUTONOMOUS_SYS_NUM:
2278 dissect_subobj_autonomous_sys_num(pcep_subobj_exrs, pinfo, tvb, offset, obj_class, ett_pcep_obj, length2);
2279 break;
2280 case PCEP_SUB_SRLG:
2281 dissect_subobj_srlg(pcep_subobj_exrs, pinfo, tvb, offset, ett_pcep_obj, length2);
2282 break;
2283 default:
2284 proto_tree_add_expert_format(pcep_subobj_exrs, pinfo, &ei_pcep_non_defined_subobject,
2285 tvb, offset+2, length-2,
2286 "Non defined subobject (%d)", type_exrs);
2287 break;
2288 }
2289 offset_exrs += length2;
2290 offset += length2;
2291 }
2292 }
2293
2294 static void
dissect_subobj_pksv4(proto_tree * pcep_subobj_tree,packet_info * pinfo,tvbuff_t * tvb,int offset,gint ett_pcep_obj,guint length)2295 dissect_subobj_pksv4(proto_tree *pcep_subobj_tree, packet_info *pinfo, tvbuff_t *tvb, int offset, gint ett_pcep_obj, guint length)
2296 {
2297 proto_tree *pcep_subobj_pksv4;
2298 proto_item *ti;
2299 guint16 path_key;
2300
2301 ti = proto_tree_add_item(pcep_subobj_tree, hf_PCEPF_SUBOBJ_PKSv4, tvb, offset, length, ENC_NA);
2302 pcep_subobj_pksv4 = proto_item_add_subtree(ti, ett_pcep_obj);
2303
2304 if (length != 8) {
2305 expert_add_info_format(pinfo, ti, &ei_pcep_subobject_bad_length,
2306 "Bad path key subobject: length %u != 8", length);
2307 return;
2308 }
2309
2310 path_key = tvb_get_ntohs(tvb, offset+2);
2311 proto_item_append_text(ti, ": %s, Path Key %u", tvb_ip_to_str(pinfo->pool, tvb, offset+4), path_key);
2312 proto_tree_add_item(pcep_subobj_pksv4, hf_pcep_subobj_pksv4_l, tvb, offset, 1, ENC_NA);
2313 proto_tree_add_item(pcep_subobj_pksv4, hf_PCEPF_SUBOBJ_7F, tvb, offset, 1, ENC_NA);
2314 proto_tree_add_item(pcep_subobj_pksv4, hf_pcep_subobj_pksv4_length, tvb, offset+1, 1, ENC_NA);
2315 proto_tree_add_item(pcep_subobj_pksv4, hf_pcep_subobj_pksv4_path_key, tvb, offset+2, 2, ENC_BIG_ENDIAN);
2316 proto_tree_add_item(pcep_subobj_pksv4, hf_pcep_subobj_pksv4_pce_id, tvb, offset+4, 4, ENC_BIG_ENDIAN);
2317 }
2318
2319 static void
dissect_subobj_pksv6(proto_tree * pcep_subobj_tree,packet_info * pinfo,tvbuff_t * tvb,int offset,gint ett_pcep_obj,guint length)2320 dissect_subobj_pksv6(proto_tree *pcep_subobj_tree, packet_info *pinfo, tvbuff_t *tvb, int offset, gint ett_pcep_obj, guint length)
2321 {
2322 proto_tree *pcep_subobj_pksv6;
2323 proto_item *ti;
2324 guint16 path_key;
2325
2326 ti = proto_tree_add_item(pcep_subobj_tree, hf_PCEPF_SUBOBJ_PKSv6, tvb, offset, length, ENC_NA);
2327 pcep_subobj_pksv6 = proto_item_add_subtree(ti, ett_pcep_obj);
2328
2329 if (length != 20) {
2330 expert_add_info_format(pinfo, ti, &ei_pcep_subobject_bad_length,
2331 "Bad path key subobject: length %u != 20", length);
2332 return;
2333 }
2334
2335 path_key = tvb_get_ntohs(tvb, offset+2);
2336 proto_item_append_text(ti, ": %s, Path Key %u", tvb_ip6_to_str(pinfo->pool, tvb, offset+4), path_key);
2337
2338 proto_tree_add_item(pcep_subobj_pksv6, hf_pcep_subobj_pksv6_l, tvb, offset, 1, ENC_NA);
2339 proto_tree_add_item(pcep_subobj_pksv6, hf_PCEPF_SUBOBJ_7F, tvb, offset, 1, ENC_NA);
2340 proto_tree_add_item(pcep_subobj_pksv6, hf_pcep_subobj_pksv6_length, tvb, offset+1, 1, ENC_NA);
2341 proto_tree_add_item(pcep_subobj_pksv6, hf_pcep_subobj_pksv6_path_key, tvb, offset+2, 2, ENC_BIG_ENDIAN);
2342 proto_tree_add_item(pcep_subobj_pksv6, hf_pcep_subobj_pksv6_pce_id, tvb, offset+4, 4, ENC_NA);
2343 }
2344
2345 /*------------------------------------------------------------------------------
2346 * OPEN OBJECT
2347 *------------------------------------------------------------------------------*/
2348 #define OPEN_OBJ_MIN_LEN 4
2349
2350 static void
dissect_pcep_open_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)2351 dissect_pcep_open_obj (proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length)
2352 {
2353 proto_tree *pcep_open_obj_flags;
2354 proto_item *ti;
2355
2356 if (obj_length < OBJ_HDR_LEN+OPEN_OBJ_MIN_LEN) {
2357 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
2358 tvb, offset2, obj_length,
2359 "Bad OPEN object length %u, should be >= %u",
2360 obj_length, OBJ_HDR_LEN+OPEN_OBJ_MIN_LEN);
2361 return;
2362 }
2363
2364 proto_tree_add_item(pcep_object_tree, hf_pcep_open_obj_pcep_version, tvb, offset2, 1, ENC_NA);
2365
2366 ti = proto_tree_add_item(pcep_object_tree, hf_pcep_open_obj_flags, tvb, offset2, 1, ENC_NA);
2367 pcep_open_obj_flags = proto_item_add_subtree(ti, ett_pcep_obj_open);
2368 proto_tree_add_item(pcep_open_obj_flags, hf_pcep_open_flags_res, tvb, offset2, 1, ENC_NA);
2369
2370 proto_tree_add_item(pcep_object_tree, hf_pcep_open_obj_keepalive, tvb, offset2+1, 1, ENC_NA);
2371 proto_tree_add_item(pcep_object_tree, hf_pcep_open_obj_deadtime, tvb, offset2+2, 1, ENC_NA);
2372 proto_tree_add_item(pcep_object_tree, hf_pcep_open_obj_sid, tvb, offset2+3, 1, ENC_NA);
2373
2374 /*it's suppose that obj_length is a valid date. The object can have optional TLV(s)*/
2375 offset2 += OPEN_OBJ_MIN_LEN;
2376 obj_length -= OBJ_HDR_LEN+OPEN_OBJ_MIN_LEN;
2377 dissect_pcep_tlvs(pcep_object_tree, tvb, offset2, obj_length, ett_pcep_obj_open);
2378 }
2379
2380 /*------------------------------------------------------------------------------
2381 * RP OBJECT
2382 *------------------------------------------------------------------------------*/
2383 #define RP_OBJ_MIN_LEN 8
2384
2385 static void
dissect_pcep_rp_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)2386 dissect_pcep_rp_obj(proto_tree *pcep_object_tree, packet_info *pinfo,
2387 tvbuff_t *tvb, int offset2, int obj_length)
2388 {
2389 proto_tree *pcep_rp_obj_flags;
2390 proto_item *ti;
2391
2392 if (obj_length < OBJ_HDR_LEN+RP_OBJ_MIN_LEN) {
2393 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
2394 tvb, offset2, obj_length,
2395 "Bad RP object length %u, should be >= %u",
2396 obj_length, OBJ_HDR_LEN+RP_OBJ_MIN_LEN);
2397 return;
2398 }
2399
2400 proto_tree_add_item(pcep_object_tree, hf_pcep_rp_obj_reserved, tvb, offset2, 1, ENC_NA);
2401
2402 ti = proto_tree_add_item(pcep_object_tree, hf_pcep_rp_obj_flags, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2403 pcep_rp_obj_flags = proto_item_add_subtree(ti, ett_pcep_obj_request_parameters);
2404
2405 proto_tree_add_item(pcep_rp_obj_flags, hf_pcep_rp_flags_reserved, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2406 proto_tree_add_item(pcep_rp_obj_flags, hf_pcep_rp_flags_c, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2407 proto_tree_add_item(pcep_rp_obj_flags, hf_pcep_rp_flags_f, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2408 proto_tree_add_item(pcep_rp_obj_flags, hf_pcep_rp_flags_n, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2409 proto_tree_add_item(pcep_rp_obj_flags, hf_pcep_rp_flags_e, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2410 proto_tree_add_item(pcep_rp_obj_flags, hf_pcep_rp_flags_m, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2411 proto_tree_add_item(pcep_rp_obj_flags, hf_pcep_rp_flags_d, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2412 proto_tree_add_item(pcep_rp_obj_flags, hf_pcep_rp_flags_p, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2413 proto_tree_add_item(pcep_rp_obj_flags, hf_pcep_rp_flags_s, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2414 proto_tree_add_item(pcep_rp_obj_flags, hf_pcep_rp_flags_v, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2415 proto_tree_add_item(pcep_rp_obj_flags, hf_pcep_rp_flags_o, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2416 proto_tree_add_item(pcep_rp_obj_flags, hf_pcep_rp_flags_b, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2417 proto_tree_add_item(pcep_rp_obj_flags, hf_pcep_rp_flags_r, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2418 proto_tree_add_item(pcep_rp_obj_flags, hf_pcep_rp_flags_pri, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2419
2420 proto_tree_add_item(pcep_object_tree, hf_pcep_rp_obj_requested_id_number, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
2421
2422 /*it's suppose that obj_length is a valid date. The object can have optional TLV(s)*/
2423
2424 }
2425
2426 /*------------------------------------------------------------------------------
2427 * NO PATH OBJECT
2428 *------------------------------------------------------------------------------*/
2429 #define NO_PATH_OBJ_MIN_LEN 4
2430
2431 static void
dissect_pcep_no_path_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)2432 dissect_pcep_no_path_obj(proto_tree *pcep_object_tree, packet_info *pinfo,
2433 tvbuff_t *tvb, int offset2, int obj_length)
2434 {
2435 proto_tree *pcep_no_path_obj_flags;
2436 proto_item *ti;
2437
2438 if (obj_length < OBJ_HDR_LEN+NO_PATH_OBJ_MIN_LEN) {
2439 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
2440 tvb, offset2, obj_length,
2441 "Bad NO-PATH object length %u, should be >= %u",
2442 obj_length, OBJ_HDR_LEN+NO_PATH_OBJ_MIN_LEN);
2443 return;
2444 }
2445
2446 proto_tree_add_item(pcep_object_tree, hf_pcep_no_path_obj_nature_of_issue, tvb, offset2, 1, ENC_NA);
2447
2448 ti = proto_tree_add_item(pcep_object_tree, hf_pcep_no_path_obj_flags, tvb, offset2+1, 2, ENC_BIG_ENDIAN);
2449 pcep_no_path_obj_flags = proto_item_add_subtree(ti, ett_pcep_obj_no_path);
2450 proto_tree_add_item(pcep_no_path_obj_flags, hf_pcep_no_path_flags_c, tvb, offset2+1, 2, ENC_BIG_ENDIAN);
2451
2452 proto_tree_add_item(pcep_object_tree, hf_pcep_no_path_obj_reserved, tvb, offset2+3, 1, ENC_NA);
2453
2454 /*it's suppose that obj_length is a valid date. The object can have optional TLV(s)*/
2455 offset2 += NO_PATH_OBJ_MIN_LEN;
2456 obj_length -= OBJ_HDR_LEN+NO_PATH_OBJ_MIN_LEN;
2457 dissect_pcep_tlvs(pcep_object_tree, tvb, offset2, obj_length, ett_pcep_obj_no_path);
2458 }
2459
2460 /*------------------------------------------------------------------------------
2461 * END POINT OBJECT
2462 *------------------------------------------------------------------------------*/
2463 #define END_POINT_IPV4_OBJ_LEN 8
2464 #define END_POINT_IPV6_OBJ_LEN 32
2465
2466 static void
dissect_pcep_end_point_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length,int type)2467 dissect_pcep_end_point_obj(proto_tree *pcep_object_tree, packet_info *pinfo,
2468 tvbuff_t *tvb, int offset2, int obj_length, int type)
2469 {
2470 int dest_leafs;
2471 int i=0;
2472 switch (type)
2473 {
2474 case IPv4:
2475 if (obj_length != OBJ_HDR_LEN+END_POINT_IPV4_OBJ_LEN) {
2476 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
2477 tvb, offset2, obj_length,
2478 "Bad IPv4 END-POINTS object length %u, should be %u",
2479 obj_length, OBJ_HDR_LEN+END_POINT_IPV4_OBJ_LEN);
2480 return;
2481 }
2482
2483 proto_tree_add_item(pcep_object_tree, hf_pcep_end_point_obj_source_ipv4_address, tvb, offset2, 4, ENC_BIG_ENDIAN);
2484 proto_tree_add_item(pcep_object_tree, hf_pcep_end_point_obj_destination_ipv4_address, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
2485 break;
2486
2487 case IPv6:
2488 if (obj_length != OBJ_HDR_LEN+END_POINT_IPV6_OBJ_LEN) {
2489 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
2490 tvb, offset2, obj_length,
2491 "Bad IPv6 END-POINTS object length %u, should be %u",
2492 obj_length, OBJ_HDR_LEN+END_POINT_IPV6_OBJ_LEN);
2493 return;
2494 }
2495
2496 proto_tree_add_item(pcep_object_tree, hf_pcep_end_point_obj_source_ipv6_address, tvb, offset2, 16, ENC_NA);
2497 proto_tree_add_item(pcep_object_tree, hf_pcep_end_point_obj_destination_ipv6_address, tvb, offset2+16, 16, ENC_NA);
2498 break;
2499
2500 case IPv4_P2MP:
2501 proto_tree_add_item(pcep_object_tree, hf_pcep_endpoint_p2mp_leaf, tvb, offset2, 4, ENC_BIG_ENDIAN);
2502 proto_tree_add_item(pcep_object_tree, hf_pcep_end_point_obj_source_ipv4_address, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
2503 dest_leafs = (obj_length - OBJ_HDR_LEN - 8)/4;
2504 for (i=0; i<dest_leafs; i++)
2505 proto_tree_add_item(pcep_object_tree, hf_pcep_end_point_obj_destination_ipv4_address, tvb, offset2+8+4*i, 4, ENC_BIG_ENDIAN);
2506 break;
2507
2508 case IPv6_P2MP:
2509 proto_tree_add_item(pcep_object_tree, hf_pcep_endpoint_p2mp_leaf, tvb, offset2, 4, ENC_BIG_ENDIAN);
2510 proto_tree_add_item(pcep_object_tree, hf_pcep_end_point_obj_source_ipv6_address, tvb, offset2+4, 16, ENC_NA);
2511 dest_leafs = (obj_length - OBJ_HDR_LEN - 20)/16;
2512 for (i=0; i<dest_leafs; i++)
2513 proto_tree_add_item(pcep_object_tree, hf_pcep_end_point_obj_destination_ipv6_address, tvb, (offset2+20+i*16), 16, ENC_NA);
2514 break;
2515
2516 default:
2517 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_unknown_type_object,
2518 tvb, offset2, obj_length-OBJ_HDR_LEN,
2519 "UNKNOWN Type Object (%u)", type);
2520 break;
2521 }
2522 }
2523
2524
2525
2526 /*------------------------------------------------------------------------------
2527 * BANDWIDTH OBJECT
2528 *------------------------------------------------------------------------------*/
2529 #define BANDWIDTH_OBJ_LEN 4
2530
2531 static void
dissect_pcep_bandwidth_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)2532 dissect_pcep_bandwidth_obj(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length)
2533 {
2534 if (obj_length != OBJ_HDR_LEN+BANDWIDTH_OBJ_LEN) {
2535 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
2536 tvb, offset2, obj_length,
2537 "Bad BANDWIDTH object length %u, should be %u",
2538 obj_length, OBJ_HDR_LEN+BANDWIDTH_OBJ_LEN);
2539 return;
2540 }
2541
2542 proto_tree_add_item(pcep_object_tree, hf_pcep_bandwidth, tvb, offset2, 4, ENC_BIG_ENDIAN);
2543 }
2544
2545 /*------------------------------------------------------------------------------
2546 * METRIC OBJECT
2547 *------------------------------------------------------------------------------*/
2548 #define METRIC_OBJ_LEN 8
2549
2550 static void
dissect_pcep_metric_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)2551 dissect_pcep_metric_obj(proto_tree *pcep_object_tree, packet_info *pinfo,
2552 tvbuff_t *tvb, int offset2, int obj_length)
2553 {
2554 proto_tree *pcep_metric_obj_flags;
2555 proto_item *ti;
2556
2557 if (obj_length != OBJ_HDR_LEN+METRIC_OBJ_LEN) {
2558 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
2559 tvb, offset2, obj_length,
2560 "Bad METRIC object length %u, should be %u",
2561 obj_length, OBJ_HDR_LEN+METRIC_OBJ_LEN);
2562 return;
2563 }
2564
2565 proto_tree_add_item(pcep_object_tree, hf_pcep_metric_obj_reserved, tvb, offset2, 2, ENC_BIG_ENDIAN);
2566
2567 ti = proto_tree_add_item(pcep_object_tree, hf_pcep_metric_obj_flags, tvb, offset2+2, 1, ENC_NA);
2568 pcep_metric_obj_flags = proto_item_add_subtree(ti, ett_pcep_obj_metric);
2569 proto_tree_add_item(pcep_metric_obj_flags, hf_pcep_metric_flags_c, tvb, offset2+2, 1, ENC_NA);
2570 proto_tree_add_item(pcep_metric_obj_flags, hf_pcep_metric_flags_b, tvb, offset2+2, 1, ENC_NA);
2571
2572 proto_tree_add_item(pcep_object_tree, hf_pcep_metric_obj_type, tvb, offset2+3, 1, ENC_NA);
2573 proto_tree_add_item(pcep_object_tree, hf_pcep_metric_obj_metric_value, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
2574 }
2575
2576 /*------------------------------------------------------------------------------
2577 * EXPLICIT ROUTE OBJECT (ERO)
2578 *------------------------------------------------------------------------------*/
2579 static void
dissect_pcep_explicit_route_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length,int obj_class)2580 dissect_pcep_explicit_route_obj(proto_tree *pcep_object_tree, packet_info *pinfo,
2581 tvbuff_t *tvb, int offset2, int obj_length, int obj_class)
2582 {
2583 guint8 l_type;
2584 guint8 length;
2585 guint type_exp_route;
2586 guint body_obj_len;
2587
2588 body_obj_len = obj_length - OBJ_HDR_LEN;
2589
2590 while (body_obj_len) {
2591 if (body_obj_len < 2) {
2592 expert_add_info_format(pinfo, pcep_object_tree, &ei_pcep_subobject_bad_length,
2593 "Bad ERO object: subobject goes past end of object");
2594 break;
2595 }
2596
2597 l_type = tvb_get_guint8(tvb, offset2);
2598 length = tvb_get_guint8(tvb, offset2+1);
2599
2600 if (length < 2) {
2601 expert_add_info_format(pinfo, pcep_object_tree, &ei_pcep_subobject_bad_length,
2602 "Bad ERO object: subobject length %u < 2", length);
2603 break;
2604 }
2605
2606 type_exp_route = (l_type & Mask_Type);
2607 if (body_obj_len <length) {
2608 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
2609 tvb, offset2, length,
2610 "Bad ERO object: subobject length %u > remaining length %u",
2611 length, body_obj_len);
2612 break;
2613 }
2614
2615 switch (type_exp_route) {
2616
2617 case PCEP_SUB_IPv4:
2618 dissect_subobj_ipv4(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_explicit_route, length);
2619 break;
2620 case PCEP_SUB_IPv6:
2621 dissect_subobj_ipv6(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_explicit_route, length);
2622 break;
2623 case PCEP_SUB_LABEL_CONTROL:
2624 dissect_subobj_label_control(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_explicit_route, length);
2625 break;
2626 case PCEP_SUB_UNNUMB_INTERFACE_ID:
2627 dissect_subobj_unnumb_interfaceID(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_explicit_route, length);
2628 break;
2629 case PCEP_SUB_AUTONOMOUS_SYS_NUM:
2630 dissect_subobj_autonomous_sys_num(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_explicit_route, length);
2631 break;
2632 case PCEP_SUB_PKSv4:
2633 dissect_subobj_pksv4(pcep_object_tree, pinfo, tvb, offset2, ett_pcep_obj_explicit_route, length);
2634 break;
2635 case PCEP_SUB_SR_PRE_IANA:
2636 case PCEP_SUB_SR:
2637 dissect_subobj_sr(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_explicit_route, length);
2638 break;
2639 default:
2640 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_non_defined_subobject,
2641 tvb, offset2, length,
2642 "Non defined subobject (%d)", type_exp_route);
2643 break;
2644 }
2645 offset2 += length;
2646 body_obj_len -= length;
2647 }
2648 }
2649
2650 /*------------------------------------------------------------------------------
2651 * RECORD ROUTE OBJECT (RRO)
2652 *------------------------------------------------------------------------------*/
2653 static void
dissect_pcep_record_route_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length,int obj_class)2654 dissect_pcep_record_route_obj(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length, int obj_class)
2655 {
2656 guint8 type;
2657 guint8 length;
2658 guint body_obj_len;
2659
2660 body_obj_len = obj_length - OBJ_HDR_LEN;
2661
2662 while (body_obj_len) {
2663 if (body_obj_len < 2) {
2664 expert_add_info_format(pinfo, pcep_object_tree, &ei_pcep_subobject_bad_length,
2665 "Bad RRO object: subobject goes past end of object");
2666 break;
2667 }
2668
2669 type = tvb_get_guint8(tvb, offset2);
2670 length = tvb_get_guint8(tvb, offset2+1);
2671
2672 if (length < 2) {
2673 expert_add_info_format(pinfo, pcep_object_tree, &ei_pcep_subobject_bad_length,
2674 "Bad RRO object: subobject length %u < 2", length);
2675 break;
2676 }
2677
2678 if (body_obj_len <length) {
2679 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
2680 tvb, offset2, length,
2681 "Bad RRO subobject: subobject length %u > remaining length %u",
2682 length, body_obj_len);
2683 break;
2684 }
2685
2686 switch (type) {
2687
2688 case PCEP_SUB_IPv4:
2689 dissect_subobj_ipv4(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_record_route, length);
2690 break;
2691 case PCEP_SUB_IPv6:
2692 dissect_subobj_ipv6(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_record_route, length);
2693 break;
2694 case PCEP_SUB_LABEL_CONTROL:
2695 dissect_subobj_label_control(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_record_route, length);
2696 break;
2697 case PCEP_SUB_UNNUMB_INTERFACE_ID:
2698 dissect_subobj_unnumb_interfaceID(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_record_route, length);
2699 break;
2700 case PCEP_SUB_SR_PRE_IANA:
2701 case PCEP_SUB_SR: /* draft-ietf-pce-segment-routing-08 section 5.4 */
2702 dissect_subobj_sr(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_record_route, length);
2703 break;
2704 default:
2705 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_non_defined_subobject,
2706 tvb, offset2, length,
2707 "Non defined subobject (%d)", type);
2708 break;
2709 }
2710 offset2 += length;
2711 body_obj_len -= length;
2712 }
2713 }
2714
2715 /*------------------------------------------------------------------------------
2716 * LSPA OBJECT
2717 *------------------------------------------------------------------------------*/
2718 #define LSPA_OBJ_MIN_LEN 16
2719
2720 static void
dissect_pcep_lspa_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)2721 dissect_pcep_lspa_obj(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length)
2722 {
2723 proto_tree *pcep_lspa_obj_flags;
2724 proto_item *ti;
2725
2726 if (obj_length < OBJ_HDR_LEN+LSPA_OBJ_MIN_LEN) {
2727 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
2728 tvb, offset2, obj_length,
2729 "Bad LSPA object length %u, should be >= %u",
2730 obj_length, OBJ_HDR_LEN+LSPA_OBJ_MIN_LEN);
2731 return;
2732 }
2733
2734 proto_tree_add_item(pcep_object_tree, hf_pcep_lspa_obj_exclude_any, tvb, offset2, 4, ENC_BIG_ENDIAN);
2735 proto_tree_add_item(pcep_object_tree, hf_pcep_lspa_obj_include_any, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
2736 proto_tree_add_item(pcep_object_tree, hf_pcep_lspa_obj_include_all, tvb, offset2+8, 4, ENC_BIG_ENDIAN);
2737 proto_tree_add_item(pcep_object_tree, hf_pcep_lspa_obj_setup_priority, tvb, offset2+12, 1, ENC_NA);
2738 proto_tree_add_item(pcep_object_tree, hf_pcep_lspa_obj_holding_priority, tvb, offset2+13, 1, ENC_NA);
2739
2740 ti = proto_tree_add_item(pcep_object_tree, hf_pcep_lspa_obj_flags, tvb, offset2+14, 1, ENC_NA);
2741 pcep_lspa_obj_flags = proto_item_add_subtree(ti, ett_pcep_obj_metric);
2742 proto_tree_add_item(pcep_lspa_obj_flags, hf_pcep_lspa_flags_l, tvb, offset2+14, 1, ENC_NA);
2743
2744 proto_tree_add_item(pcep_object_tree, hf_pcep_lspa_obj_reserved, tvb, offset2+15, 1, ENC_NA);
2745
2746 /*it's suppose that obj_length is a valid date. The object can have optional TLV(s)*/
2747 offset2 += LSPA_OBJ_MIN_LEN;
2748 obj_length -= OBJ_HDR_LEN+LSPA_OBJ_MIN_LEN;
2749 dissect_pcep_tlvs(pcep_object_tree, tvb, offset2, obj_length, ett_pcep_obj_lspa);
2750 }
2751
2752 /*------------------------------------------------------------------------------
2753 * INCLUDE ROUTE OBJECT (IRO)
2754 *------------------------------------------------------------------------------*/
2755 static void
dissect_pcep_iro_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length,int obj_class)2756 dissect_pcep_iro_obj(proto_tree *pcep_object_tree, packet_info *pinfo,
2757 tvbuff_t *tvb, int offset2, int obj_length, int obj_class)
2758 {
2759 guint8 l_type;
2760 guint8 length;
2761 int type_iro;
2762 guint body_obj_len;
2763
2764 body_obj_len = obj_length - OBJ_HDR_LEN;
2765
2766 while (body_obj_len) {
2767 if (body_obj_len < 2) {
2768 expert_add_info_format(pinfo, pcep_object_tree, &ei_pcep_subobject_bad_length,
2769 "Bad IRO object: subobject goes past end of object");
2770 break;
2771 }
2772
2773 l_type = tvb_get_guint8(tvb, offset2);
2774 length = tvb_get_guint8(tvb, offset2+1);
2775
2776 if (length < 2) {
2777 expert_add_info_format(pinfo, pcep_object_tree, &ei_pcep_subobject_bad_length,
2778 "Bad IRO object: subobject length %u < 2", length);
2779 break;
2780 }
2781
2782 type_iro = (l_type & Mask_Type);
2783
2784 if (body_obj_len <length) {
2785 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
2786 tvb, offset2, length,
2787 "Bad IRO object: subobject length %u > remaining length %u",
2788 length, body_obj_len);
2789 break;
2790 }
2791
2792 switch (type_iro) {
2793
2794 case PCEP_SUB_IPv4:
2795 dissect_subobj_ipv4(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_iro, length);
2796 break;
2797 case PCEP_SUB_IPv6:
2798 dissect_subobj_ipv6(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_iro, length);
2799 break;
2800 case PCEP_SUB_UNNUMB_INTERFACE_ID:
2801 dissect_subobj_unnumb_interfaceID(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_iro, length);
2802 break;
2803 case PCEP_SUB_AUTONOMOUS_SYS_NUM:
2804 dissect_subobj_autonomous_sys_num(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_iro, length);
2805 break;
2806 case PCEP_SUB_EXRS:
2807 dissect_subobj_exrs(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_iro, type_iro, length);
2808 break;
2809 default:
2810 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_non_defined_subobject,
2811 tvb, offset2, length,
2812 "Non defined subobject (%d)", type_iro);
2813 break;
2814 }
2815 offset2 += length;
2816 body_obj_len -= length;
2817 }
2818 }
2819
2820 /*------------------------------------------------------------------------------
2821 * SVEC OBJECT
2822 *------------------------------------------------------------------------------*/
2823 #define SVEC_OBJ_MIN_LEN 4
2824
2825 static void
dissect_pcep_svec_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)2826 dissect_pcep_svec_obj(proto_tree *pcep_object_tree, packet_info *pinfo,
2827 tvbuff_t *tvb, int offset2, int obj_length)
2828 {
2829 proto_item *ti;
2830 proto_tree *pcep_svec_flags_obj;
2831 int m;
2832 int i;
2833 guint32 requestID;
2834
2835 if (obj_length < OBJ_HDR_LEN+SVEC_OBJ_MIN_LEN) {
2836 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
2837 tvb, offset2, obj_length,
2838 "Bad SVEC object length %u, should be >= %u",
2839 obj_length, OBJ_HDR_LEN+SVEC_OBJ_MIN_LEN);
2840 return;
2841 }
2842
2843 proto_tree_add_item(pcep_object_tree, hf_pcep_svec_obj_reserved, tvb, offset2, 1, ENC_NA);
2844
2845 ti = proto_tree_add_item(pcep_object_tree, hf_pcep_svec_obj_flags, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
2846 pcep_svec_flags_obj = proto_item_add_subtree(ti, ett_pcep_obj_svec);
2847 proto_tree_add_item(pcep_svec_flags_obj, hf_pcep_svec_flags_l, tvb, offset2 + 1, 3, ENC_BIG_ENDIAN);
2848 proto_tree_add_item(pcep_svec_flags_obj, hf_pcep_svec_flags_n, tvb, offset2 + 1, 3, ENC_BIG_ENDIAN);
2849 proto_tree_add_item(pcep_svec_flags_obj, hf_pcep_svec_flags_s, tvb, offset2 + 1, 3, ENC_BIG_ENDIAN);
2850 proto_tree_add_item(pcep_svec_flags_obj, hf_pcep_svec_flags_d, tvb, offset2 + 1, 3, ENC_BIG_ENDIAN); /* RFC 6006 */
2851 proto_tree_add_item(pcep_svec_flags_obj, hf_pcep_svec_flags_p, tvb, offset2 + 1, 3, ENC_BIG_ENDIAN); /* RFC 6006 */
2852
2853 m = 1;
2854 for ( i=4 ; i<(obj_length-OBJ_HDR_LEN) ; ) {
2855 requestID = tvb_get_ntohl(tvb, offset2+i);
2856 proto_tree_add_uint_format(pcep_object_tree, hf_pcep_svec_obj_request_id_number, tvb, offset2+i, 4, requestID,
2857 "Request-ID-Number %u: 0x%x", m++, requestID);
2858 i += 4;
2859 }
2860 }
2861
2862 /*------------------------------------------------------------------------------
2863 * NOTIFICATION OBJECT
2864 *------------------------------------------------------------------------------*/
2865 #define NOTIFICATION_OBJ_MIN_LEN 4
2866
2867 static void
dissect_pcep_notification_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)2868 dissect_pcep_notification_obj(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length)
2869 {
2870 guint8 nt;
2871
2872 if (obj_length < OBJ_HDR_LEN+NOTIFICATION_OBJ_MIN_LEN) {
2873 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
2874 tvb, offset2, obj_length,
2875 "Bad NOTIFICATION object length %u, should be >= %u",
2876 obj_length, OBJ_HDR_LEN+NOTIFICATION_OBJ_MIN_LEN);
2877 return;
2878 }
2879
2880 proto_tree_add_item(pcep_object_tree, hf_pcep_notification_obj_reserved, tvb, offset2, 1, ENC_NA);
2881
2882 proto_tree_add_item(pcep_object_tree, hf_pcep_notification_obj_flags, tvb, offset2+1, 1, ENC_NA);
2883
2884 nt = tvb_get_guint8(tvb, offset2+2);
2885 proto_tree_add_item(pcep_object_tree, hf_PCEPF_NOTI_TYPE, tvb, offset2+2, 1, ENC_NA);
2886
2887 switch (nt) {
2888
2889 case 1:
2890 proto_tree_add_item(pcep_object_tree, hf_PCEPF_NOTI_VAL1, tvb, offset2+2, 1, ENC_NA);
2891 break;
2892
2893 case 2:
2894 proto_tree_add_item(pcep_object_tree, hf_PCEPF_NOTI_VAL2, tvb, offset2+2, 1, ENC_NA);
2895 break;
2896
2897 default:
2898 proto_tree_add_item(pcep_object_tree, hf_pcep_notification_obj_type, tvb, offset2+2, 1, ENC_NA);
2899 break;
2900 }
2901
2902 proto_tree_add_item(pcep_object_tree, hf_pcep_notification_obj_value, tvb, offset2+3, 1, ENC_NA);
2903
2904 /*it's suppose that obj_length is a valid date. The object can have optional TLV(s)*/
2905 offset2 += NOTIFICATION_OBJ_MIN_LEN;
2906 obj_length -= OBJ_HDR_LEN+NOTIFICATION_OBJ_MIN_LEN;
2907 dissect_pcep_tlvs(pcep_object_tree, tvb, offset2, obj_length, ett_pcep_obj_notification);
2908 }
2909
2910 /*------------------------------------------------------------------------------
2911 * ERROR OBJECT
2912 *------------------------------------------------------------------------------*/
2913 #define ERROR_OBJ_MIN_LEN 4
2914
2915 static void
dissect_pcep_error_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)2916 dissect_pcep_error_obj(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length)
2917 {
2918 guint8 error_type;
2919 guint8 error_value;
2920 proto_item* type_item;
2921 const gchar *err_str = "Unassigned";
2922
2923 if (obj_length < OBJ_HDR_LEN+ERROR_OBJ_MIN_LEN) {
2924 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
2925 tvb, offset2, obj_length,
2926 "Bad ERROR object length %u, should be >= %u",
2927 obj_length, OBJ_HDR_LEN+ERROR_OBJ_MIN_LEN);
2928 return;
2929 }
2930
2931 proto_tree_add_item(pcep_object_tree, hf_pcep_error_obj_reserved, tvb, offset2, 1, ENC_NA);
2932 proto_tree_add_item(pcep_object_tree, hf_pcep_error_obj_flags, tvb, offset2+1, 1, ENC_NA);
2933
2934 error_type = tvb_get_guint8(tvb, offset2+2);
2935 error_value = tvb_get_guint8(tvb, offset2+3);
2936 type_item = proto_tree_add_item(pcep_object_tree, hf_PCEPF_ERROR_TYPE, tvb, offset2+2, 1, ENC_NA);
2937
2938 switch (error_type) {
2939 case ESTABLISH_FAILURE:
2940 err_str = val_to_str_const(error_value, pcep_error_value_1_vals, "Unknown");
2941 break;
2942 case CAP_NOT_SUPPORTED:
2943 break;
2944 case UNKNOWN_OBJ:
2945 err_str = val_to_str_const(error_value, pcep_error_value_3_vals, "Unknown");
2946 break;
2947 case NOT_SUPP_OBJ:
2948 err_str = val_to_str_const(error_value, pcep_error_value_4_vals, "Unknown");
2949 break;
2950 case POLICY_VIOLATION:
2951 err_str = val_to_str_const(error_value, pcep_error_value_5_vals, "Unknown");
2952 break;
2953 case MANDATORY_OBJ_MIS:
2954 err_str = val_to_str_const(error_value, pcep_error_value_6_vals, "Unknown");
2955 break;
2956 case SYNCH_PCREQ_MIS:
2957 break;
2958 case UNKNOWN_REQ_REF:
2959 break;
2960 case ATTEMPT_2_SESSION:
2961 break;
2962 case INVALID_OBJ:
2963 err_str = val_to_str_const(error_value, pcep_error_value_10_vals, "Unknown");
2964 break;
2965 case UNRECO_EXRS_SUBOBJ:
2966 break;
2967 case DIFFSERV_TE_ERROR:
2968 err_str = val_to_str_const(error_value, pcep_error_value_12_vals, "Unknown");
2969 break;
2970 case BRPC_FAILURE:
2971 err_str = val_to_str_const(error_value, pcep_error_value_13_vals, "Unknown");
2972 break;
2973 case GCO_ERROR:
2974 err_str = val_to_str_const(error_value, pcep_error_value_15_vals, "Unknown");
2975 break;
2976 case P2MP_CAPABILITY_ERROR:
2977 err_str = val_to_str_const(error_value, pcep_error_value_16_vals, "Unknown");
2978 break;
2979 case P2MP_END_POINTS_ERROR:
2980 err_str = val_to_str_const(error_value, pcep_error_value_17_vals, "Unknown");
2981 break;
2982 case P2MP_FRAGMENT_ERROR:
2983 err_str = val_to_str_const(error_value, pcep_error_value_18_vals, "Unknown");
2984 break;
2985 case INVALID_OPERATION:
2986 err_str = val_to_str_const(error_value, pcep_error_value_19_vals, "Unknown");
2987 break;
2988 case LSP_STATE_SYNCHRONIZATION_ERROR:
2989 err_str = val_to_str_const(error_value, pcep_error_value_20_vals, "Unknown");
2990 break;
2991 case INVALID_PATH_SETUP_TYPE:
2992 err_str = val_to_str_const(error_value, pcep_error_value_21_vals, "Unknown");
2993 break;
2994 case BAD_PARAMETER_VALUE:
2995 err_str = val_to_str_const(error_value, pcep_error_value_23_vals, "Unknown");
2996 break;
2997 case LSP_INSTANTIATION_ERROR:
2998 err_str = val_to_str_const(error_value, pcep_error_value_24_vals, "Unknown");
2999 break;
3000 case ASSOCIATION_ERROR:
3001 err_str = val_to_str_const(error_value, pcep_error_value_26_vals, "Unknown");
3002 break;
3003 case WSON_RWA_ERROR:
3004 err_str = val_to_str_const(error_value, pcep_error_value_27_vals, "Unknown");
3005 break;
3006 case H_PCE_ERROR:
3007 err_str = val_to_str_const(error_value, pcep_error_value_28_vals, "Unknown");
3008 break;
3009 case PATH_COMPUTATION_FAILURE:
3010 err_str = val_to_str_const(error_value, pcep_error_value_29_vals, "Unknown");
3011 break;
3012 default:
3013 proto_item_append_text(type_item, " (%u Non defined Error-Value)", error_type);
3014 }
3015 proto_tree_add_uint_format_value(pcep_object_tree, hf_PCEPF_ERROR_VALUE, tvb, offset2+3, 1, error_value, "%s (%u)", err_str, error_value);
3016
3017 /*it's suppose that obj_length is a valid date. The object can have optional TLV(s)*/
3018 offset2 += ERROR_OBJ_MIN_LEN;
3019 obj_length -= OBJ_HDR_LEN+ERROR_OBJ_MIN_LEN;
3020 dissect_pcep_tlvs(pcep_object_tree, tvb, offset2, obj_length, ett_pcep_obj_error);
3021 }
3022
3023
3024 /*------------------------------------------------------------------------------
3025 * LOAD-BALANCING OBJECT
3026 *------------------------------------------------------------------------------*/
3027 #define LOAD_BALANCING_OBJ_LEN 8
3028
3029 static void
dissect_pcep_balancing_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)3030 dissect_pcep_balancing_obj(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length)
3031 {
3032 if (obj_length != OBJ_HDR_LEN+LOAD_BALANCING_OBJ_LEN) {
3033 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3034 tvb, offset2, obj_length,
3035 "Bad LOAD-BALANCING object length %u, should be %u",
3036 obj_length, OBJ_HDR_LEN+LOAD_BALANCING_OBJ_LEN);
3037 return;
3038 }
3039
3040 proto_tree_add_item(pcep_object_tree, hf_pcep_balancing_obj_reserved, tvb, offset2, 2, ENC_BIG_ENDIAN);
3041 proto_tree_add_item(pcep_object_tree, hf_pcep_balancing_obj_flags, tvb, offset2+2, 1, ENC_NA);
3042 proto_tree_add_item(pcep_object_tree, hf_pcep_balancing_obj_maximum_number_of_te_lsps, tvb, offset2+3, 1, ENC_NA);
3043 proto_tree_add_item(pcep_object_tree, hf_pcep_balancing_obj_minimum_bandwidth, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
3044 }
3045
3046 /*------------------------------------------------------------------------------
3047 * CLOSE OBJECT
3048 *------------------------------------------------------------------------------*/
3049 #define CLOSE_OBJ_MIN_LEN 4
3050
3051 static void
dissect_pcep_close_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)3052 dissect_pcep_close_obj(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length)
3053 {
3054 if (obj_length < OBJ_HDR_LEN+CLOSE_OBJ_MIN_LEN) {
3055 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3056 tvb, offset2, obj_length,
3057 "Bad CLOSE object length %u, should be >= %u",
3058 obj_length, OBJ_HDR_LEN+CLOSE_OBJ_MIN_LEN);
3059 return;
3060 }
3061
3062 proto_tree_add_item(pcep_object_tree, hf_pcep_close_obj_reserved, tvb, offset2, 2, ENC_BIG_ENDIAN);
3063 proto_tree_add_item(pcep_object_tree, hf_pcep_close_obj_flags, tvb, offset2+2, 1, ENC_NA);
3064 proto_tree_add_item(pcep_object_tree, hf_pcep_close_obj_reason, tvb, offset2+3, 1, ENC_NA);
3065
3066 /*it's suppose that obj_length is a valid date. The object can have optional TLV(s)*/
3067 offset2 += CLOSE_OBJ_MIN_LEN;
3068 obj_length -= OBJ_HDR_LEN+CLOSE_OBJ_MIN_LEN;
3069 dissect_pcep_tlvs(pcep_object_tree, tvb, offset2, obj_length, ett_pcep_obj_load_balancing);
3070 }
3071
3072 /*------------------------------------------------------------------------------
3073 * PATH-KEY OBJECT
3074 *------------------------------------------------------------------------------*/
3075 static void
dissect_pcep_path_key_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)3076 dissect_pcep_path_key_obj(proto_tree *pcep_object_tree, packet_info *pinfo,
3077 tvbuff_t *tvb, int offset2, int obj_length)
3078 {
3079 guint8 l_type;
3080 guint8 length;
3081 guint type_exp_route;
3082 guint body_obj_len;
3083
3084 body_obj_len = obj_length - OBJ_HDR_LEN;
3085
3086 while (body_obj_len) {
3087 if (body_obj_len < 2) {
3088 expert_add_info_format(pinfo, pcep_object_tree, &ei_pcep_subobject_bad_length,
3089 "Bad PATH-KEY object: subobject goes past end of object");
3090 break;
3091 }
3092
3093 l_type = tvb_get_guint8(tvb, offset2);
3094 length = tvb_get_guint8(tvb, offset2+1);
3095
3096 if (length < 2) {
3097 expert_add_info_format(pinfo, pcep_object_tree, &ei_pcep_subobject_bad_length,
3098 "Bad PATH-KEY object: subobject length %u < 2", length);
3099 break;
3100 }
3101
3102 type_exp_route = (l_type & Mask_Type);
3103 if (body_obj_len <length) {
3104 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3105 tvb, offset2, length,
3106 "Bad PATH-KEY object: subobject length %u > remaining length %u",
3107 length, body_obj_len);
3108 break;
3109 }
3110
3111 switch (type_exp_route) {
3112 case PCEP_SUB_PKSv4:
3113 dissect_subobj_pksv4(pcep_object_tree, pinfo, tvb, offset2, ett_pcep_obj_explicit_route, length);
3114 break;
3115 default:
3116 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_non_defined_subobject,
3117 tvb, offset2, length,
3118 "Non defined subobject (%d)", type_exp_route);
3119 break;
3120 }
3121 offset2 += length;
3122 body_obj_len -= length;
3123 }
3124 }
3125
3126 /*------------------------------------------------------------------------------
3127 * XRO OBJECT
3128 *------------------------------------------------------------------------------*/
3129 #define XRO_OBJ_MIN_LEN 4
3130
3131 static void
dissect_pcep_xro_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length,int obj_class)3132 dissect_pcep_xro_obj(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length, int obj_class)
3133 {
3134 proto_tree *pcep_xro_flags_obj;
3135 proto_item *ti;
3136 guint8 x_type;
3137 guint8 length;
3138 guint type_xro;
3139 guint body_obj_len;
3140
3141 body_obj_len = obj_length - OBJ_HDR_LEN;
3142
3143 if (obj_length < OBJ_HDR_LEN+XRO_OBJ_MIN_LEN) {
3144 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3145 tvb, offset2, obj_length,
3146 "Bad XRO object length %u, should be >= %u",
3147 obj_length, OBJ_HDR_LEN+XRO_OBJ_MIN_LEN);
3148 return;
3149 }
3150
3151 proto_tree_add_item(pcep_object_tree, hf_pcep_xro_obj_reserved, tvb, offset2, 2, ENC_BIG_ENDIAN);
3152
3153 ti = proto_tree_add_item(pcep_object_tree, hf_pcep_xro_obj_flags, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
3154 pcep_xro_flags_obj = proto_item_add_subtree(ti, ett_pcep_obj_xro);
3155 proto_tree_add_item(pcep_xro_flags_obj, hf_pcep_xro_flags_f, tvb, offset2 + 2, 2, ENC_BIG_ENDIAN);
3156
3157 offset2 += XRO_OBJ_MIN_LEN;
3158 body_obj_len -= XRO_OBJ_MIN_LEN;
3159
3160 if (body_obj_len < 2) {
3161 expert_add_info_format(pinfo, pcep_object_tree, &ei_pcep_subobject_bad_length,
3162 "Bad XRO object: subobject goes past end of object");
3163 return;
3164 }
3165
3166 while (body_obj_len >= 2) {
3167
3168 x_type = tvb_get_guint8(tvb, offset2);
3169 length = tvb_get_guint8(tvb, offset2+1);
3170
3171 if (length < 2) {
3172 expert_add_info_format(pinfo, pcep_object_tree, &ei_pcep_subobject_bad_length,
3173 "Bad XRO object: object length %u < 2", length);
3174 break;
3175 }
3176
3177 type_xro = (x_type & Mask_Type);
3178
3179 if (body_obj_len < length) {
3180 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3181 tvb, offset2, length,
3182 "Bad XRO object: object length %u > remaining length %u",
3183 length, body_obj_len);
3184 break;
3185 }
3186
3187 switch (type_xro) {
3188
3189 case PCEP_SUB_IPv4:
3190 dissect_subobj_ipv4(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_xro, length);
3191 break;
3192 case PCEP_SUB_IPv6:
3193 dissect_subobj_ipv6(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_xro, length);
3194 break;
3195 case PCEP_SUB_UNNUMB_INTERFACE_ID:
3196 dissect_subobj_unnumb_interfaceID(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_xro, length);
3197 break;
3198 case PCEP_SUB_AUTONOMOUS_SYS_NUM:
3199 dissect_subobj_autonomous_sys_num(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_xro, length);
3200 break;
3201 case PCEP_SUB_SRLG:
3202 dissect_subobj_srlg(pcep_object_tree, pinfo, tvb, offset2, ett_pcep_obj_xro, length);
3203 break;
3204 case PCEP_SUB_PKSv4:
3205 dissect_subobj_pksv4(pcep_object_tree, pinfo, tvb, offset2, ett_pcep_obj_xro, length);
3206 break;
3207 case PCEP_SUB_PKSv6:
3208 dissect_subobj_pksv6(pcep_object_tree, pinfo, tvb, offset2, ett_pcep_obj_xro, length);
3209 break;
3210 default:
3211 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_non_defined_subobject,
3212 tvb, offset2-4, length,
3213 "Non defined subobject (%d)", type_xro);
3214 break;
3215 }
3216 offset2 += length;
3217 body_obj_len -= length;
3218 }
3219 }
3220
3221 /*------------------------------------------------------------------------------
3222 * MONITORING OBJECT
3223 *------------------------------------------------------------------------------*/
3224 #define OBJ_MONITORING_MIN_LEN 8
3225
3226 static void
dissect_pcep_obj_monitoring(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)3227 dissect_pcep_obj_monitoring(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length)
3228 {
3229 proto_item *ti;
3230 proto_tree *monitoring_flags;
3231
3232 if (obj_length < OBJ_HDR_LEN + OBJ_MONITORING_MIN_LEN) {
3233 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3234 tvb, offset2, obj_length,
3235 "Bad MONITORING object length %u, should be >= %u",
3236 obj_length, OBJ_HDR_LEN + OBJ_MONITORING_MIN_LEN);
3237 return;
3238 }
3239
3240 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_monitoring_reserved, tvb, offset2, 1, ENC_NA);
3241 ti = proto_tree_add_item(pcep_object_tree, hf_pcep_obj_monitoring_flags, tvb, offset2+1, 3, ENC_BIG_ENDIAN);
3242 monitoring_flags = proto_item_add_subtree(ti, ett_pcep_obj_monitoring);
3243 proto_tree_add_item(monitoring_flags, hf_pcep_obj_monitoring_flags_reserved, tvb, offset2 + 1, 3, ENC_BIG_ENDIAN);
3244 proto_tree_add_item(monitoring_flags, hf_pcep_obj_monitoring_flags_i, tvb, offset2 + 1, 3, ENC_BIG_ENDIAN);
3245 proto_tree_add_item(monitoring_flags, hf_pcep_obj_monitoring_flags_c, tvb, offset2 + 1, 3, ENC_BIG_ENDIAN);
3246 proto_tree_add_item(monitoring_flags, hf_pcep_obj_monitoring_flags_p, tvb, offset2 + 1, 3, ENC_BIG_ENDIAN);
3247 proto_tree_add_item(monitoring_flags, hf_pcep_obj_monitoring_flags_g, tvb, offset2 + 1, 3, ENC_BIG_ENDIAN);
3248 proto_tree_add_item(monitoring_flags, hf_pcep_obj_monitoring_flags_l, tvb, offset2 + 1, 3, ENC_BIG_ENDIAN);
3249 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_monitoring_monitoring_id_number, tvb, offset2 + 4, 4, ENC_BIG_ENDIAN);
3250
3251 /* The object can have optional TLV(s)*/
3252 offset2 += OBJ_MONITORING_MIN_LEN;
3253 obj_length -= OBJ_HDR_LEN + OBJ_MONITORING_MIN_LEN;
3254 dissect_pcep_tlvs(pcep_object_tree, tvb, offset2, obj_length, ett_pcep_obj_monitoring);
3255 }
3256
3257 /*------------------------------------------------------------------------------
3258 * PCC-ID-REQ OBJECT
3259 *------------------------------------------------------------------------------*/
3260 #define OBJ_PCC_ID_REQ_IPV4_LEN 4
3261 #define OBJ_PCC_ID_REQ_IPV6_LEN 16
3262
3263 static void
dissect_pcep_obj_pcc_id_req(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length,int type)3264 dissect_pcep_obj_pcc_id_req(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length, int type)
3265 {
3266 switch (type)
3267 {
3268 case PCEP_OBJ_PCC_ID_REQ_IPv4:
3269 if (obj_length != OBJ_HDR_LEN + OBJ_PCC_ID_REQ_IPV4_LEN) {
3270 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3271 tvb, offset2, obj_length,
3272 "Bad IPv4 PCC-ID-REQ object length %u, should be %u",
3273 obj_length, OBJ_HDR_LEN + OBJ_PCC_ID_REQ_IPV4_LEN);
3274 return;
3275 }
3276 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_pcc_id_req_ipv4, tvb, offset2, 4, ENC_BIG_ENDIAN);
3277 break;
3278
3279 case PCEP_OBJ_PCC_ID_REQ_IPv6:
3280 if (obj_length != OBJ_HDR_LEN + OBJ_PCC_ID_REQ_IPV6_LEN) {
3281 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3282 tvb, offset2, obj_length,
3283 "Bad IPv6 PCC-ID-REQ object length %u, should be %u",
3284 obj_length, OBJ_HDR_LEN + OBJ_PCC_ID_REQ_IPV6_LEN);
3285 return;
3286 }
3287 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_pcc_id_req_ipv6, tvb, offset2, 16, ENC_NA);
3288 break;
3289
3290 default:
3291 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_non_defined_subobject,
3292 tvb, offset2, obj_length - OBJ_HDR_LEN,
3293 "UNKNOWN Type Object (%u)", type);
3294 break;
3295 }
3296 }
3297
3298 /*------------------------------------------------------------------------------
3299 * OF OBJECT
3300 *------------------------------------------------------------------------------*/
3301 #define OF_OBJ_MIN_LEN 4
3302
3303 static void
dissect_pcep_of_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)3304 dissect_pcep_of_obj(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length)
3305 {
3306 if (obj_length < OBJ_HDR_LEN+OF_OBJ_MIN_LEN) {
3307 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3308 tvb, offset2, obj_length,
3309 "Bad OF object length %u, should be >= %u",
3310 obj_length, OBJ_HDR_LEN+OF_OBJ_MIN_LEN);
3311 return;
3312 }
3313
3314 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_of_code, tvb, offset2, 2, ENC_BIG_ENDIAN);
3315
3316 /*The object can have optional TLV(s)*/
3317 offset2 += OPEN_OBJ_MIN_LEN;
3318 obj_length -= OBJ_HDR_LEN+OF_OBJ_MIN_LEN;
3319 dissect_pcep_tlvs(pcep_object_tree, tvb, offset2, obj_length, ett_pcep_obj_open);
3320 }
3321
3322 /*------------------------------------------------------------------------------
3323 * PCE-ID OBJECT
3324 *------------------------------------------------------------------------------*/
3325 #define OBJ_PCE_ID_IPV4_LEN 4
3326 #define OBJ_PCE_ID_IPV6_LEN 16
3327
3328 static void
dissect_pcep_obj_pce_id(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length,int type)3329 dissect_pcep_obj_pce_id(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length, int type)
3330 {
3331 switch (type)
3332 {
3333 case PCEP_OBJ_PCE_ID_IPv4:
3334 if (obj_length != OBJ_HDR_LEN + OBJ_PCE_ID_IPV4_LEN) {
3335 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3336 tvb, offset2, obj_length,
3337 "Bad IPv4 PCE-ID object length %u, should be %u",
3338 obj_length, OBJ_HDR_LEN + OBJ_PCE_ID_IPV4_LEN);
3339 return;
3340 }
3341 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_pce_id_ipv4, tvb, offset2, 4, ENC_BIG_ENDIAN);
3342 break;
3343
3344 case PCEP_OBJ_PCE_ID_IPv6:
3345 if (obj_length != OBJ_HDR_LEN + OBJ_PCE_ID_IPV6_LEN) {
3346 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3347 tvb, offset2, obj_length,
3348 "Bad IPv6 PCE-ID object length %u, should be %u",
3349 obj_length, OBJ_HDR_LEN + OBJ_PCE_ID_IPV6_LEN);
3350 return;
3351 }
3352 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_pce_id_ipv6, tvb, offset2, 16, ENC_NA);
3353 break;
3354
3355 default:
3356 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_non_defined_subobject,
3357 tvb, offset2, obj_length - OBJ_HDR_LEN,
3358 "UNKNOWN Type Object (%u)", type);
3359 break;
3360 }
3361 }
3362
3363 /*------------------------------------------------------------------------------
3364 * PROC-TIME OBJECT
3365 *------------------------------------------------------------------------------*/
3366 #define OBJ_PROC_TIME_LEN 24
3367
3368 static void
dissect_pcep_obj_proc_time(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)3369 dissect_pcep_obj_proc_time(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length)
3370 {
3371 proto_item *ti;
3372 proto_tree *proc_time_flags;
3373
3374 if (obj_length != OBJ_HDR_LEN + OBJ_PROC_TIME_LEN) {
3375 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3376 tvb, offset2, obj_length,
3377 "Bad PROC-TIME object length %u, should be %u",
3378 obj_length, OBJ_HDR_LEN + OBJ_PROC_TIME_LEN);
3379 return;
3380 }
3381
3382 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_proc_time_reserved, tvb, offset2, 2, ENC_BIG_ENDIAN);
3383 ti = proto_tree_add_item(pcep_object_tree, hf_pcep_obj_proc_time_flags, tvb, offset2 + 2, 2, ENC_BIG_ENDIAN);
3384 proc_time_flags = proto_item_add_subtree(ti, ett_pcep_obj_proc_time);
3385 proto_tree_add_item(proc_time_flags, hf_pcep_obj_proc_time_flags_reserved, tvb, offset2 + 2, 2, ENC_BIG_ENDIAN);
3386 proto_tree_add_item(proc_time_flags, hf_pcep_obj_proc_time_flags_e, tvb, offset2 + 2, 2, ENC_BIG_ENDIAN);
3387 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_proc_time_cur_proc_time, tvb, offset2 + 4, 4, ENC_BIG_ENDIAN);
3388 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_proc_time_min_proc_time, tvb, offset2 + 8, 4, ENC_BIG_ENDIAN);
3389 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_proc_time_max_proc_time, tvb, offset2 + 12, 4, ENC_BIG_ENDIAN);
3390 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_proc_time_ave_proc_time, tvb, offset2 + 16, 4, ENC_BIG_ENDIAN);
3391 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_proc_time_var_proc_time, tvb, offset2 + 20, 4, ENC_BIG_ENDIAN);
3392 }
3393
3394 /*------------------------------------------------------------------------------
3395 * OVERLOAD OBJECT
3396 *------------------------------------------------------------------------------*/
3397 #define OBJ_OVERLOAD_LEN 4
3398
3399 static void
dissect_pcep_obj_overload(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)3400 dissect_pcep_obj_overload(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length)
3401 {
3402 if (obj_length != OBJ_HDR_LEN + OBJ_OVERLOAD_LEN) {
3403 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3404 tvb, offset2, obj_length,
3405 "Bad OVERLOAD object length %u, should be %u",
3406 obj_length, OBJ_HDR_LEN + OBJ_OVERLOAD_LEN);
3407 return;
3408 }
3409 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_overload_flags, tvb, offset2, 1, ENC_NA);
3410 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_overload_reserved, tvb, offset2 + 1, 1, ENC_NA);
3411 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_overload_duration, tvb, offset2 + 2, 2, ENC_BIG_ENDIAN);
3412 }
3413
3414 /*------------------------------------------------------------------------------
3415 * UNREACH-DESTINATION OBJECT
3416 *-----------------------------------------------------------------------------*/
3417 static void
dissect_pcep_obj_unreach_destination(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length,int type)3418 dissect_pcep_obj_unreach_destination(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length, int type)
3419 {
3420 int address_length = 4;
3421
3422 int body_obj_len = obj_length-OBJ_HDR_LEN;
3423
3424 switch (type)
3425 {
3426 case IPv4:
3427 address_length = 4;
3428 break;
3429 case IPv6:
3430 address_length = 16;
3431 break;
3432 }
3433
3434 while (body_obj_len > 0) {
3435 switch (type) {
3436 case IPv4:
3437 if (body_obj_len < address_length) {
3438 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3439 tvb, offset2, body_obj_len,
3440 "Bad UNREACH-DESTINATION object IPv4 address length %u, should be %u",
3441 body_obj_len, address_length);
3442 return;
3443 }
3444 proto_tree_add_item(pcep_object_tree, hf_pcep_unreach_destination_obj_ipv4_address,
3445 tvb, offset2, address_length, ENC_BIG_ENDIAN);
3446 break;
3447 case IPv6:
3448 if (body_obj_len < address_length) {
3449 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3450 tvb, offset2, body_obj_len,
3451 "Bad UNREACH-DESTINATION object IPv6 address length %u, should be %u",
3452 body_obj_len, address_length);
3453 return;
3454 }
3455 proto_tree_add_item(pcep_object_tree, hf_pcep_unreach_destination_obj_ipv6_address,
3456 tvb, offset2, address_length, ENC_NA);
3457 break;
3458 }
3459 offset2 += address_length;
3460 body_obj_len -= address_length;
3461 }
3462 }
3463
3464 /*------------------------------------------------------------------------------
3465 * Branch Node Capability OBJECT
3466
3467 The BNC Object has the same format as the Include Route Object (IRO) defined
3468 in [RFC5440], except that it only supports IPv4 and IPv6 prefix sub-objects.
3469 *------------------------------------------------------------------------------*/
3470 static void
dissect_pcep_obj_branch_node_capability(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length,int obj_class)3471 dissect_pcep_obj_branch_node_capability(proto_tree *pcep_object_tree, packet_info *pinfo,
3472 tvbuff_t *tvb, int offset2, int obj_length, int obj_class)
3473 {
3474 guint8 l_type;
3475 guint8 length;
3476 int type_bnco;
3477 guint body_obj_len;
3478
3479 body_obj_len = obj_length - OBJ_HDR_LEN;
3480
3481 while (body_obj_len) {
3482 if (body_obj_len < 2) {
3483 expert_add_info_format(pinfo, pcep_object_tree, &ei_pcep_subobject_bad_length,
3484 "Bad Branch Node Capability Object: subobject goes past end of object");
3485 break;
3486 }
3487
3488 l_type = tvb_get_guint8(tvb, offset2);
3489 length = tvb_get_guint8(tvb, offset2+1);
3490
3491 if (length < 2) {
3492 expert_add_info_format(pinfo, pcep_object_tree, &ei_pcep_subobject_bad_length,
3493 "Bad Branch Node Capability Object: subobject length %u < 2", length);
3494 break;
3495 }
3496
3497 type_bnco = (l_type & Mask_Type);
3498
3499 if (body_obj_len <length) {
3500 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3501 tvb, offset2, length,
3502 "Bad Branch Node Capability Object: subobject length %u > remaining length %u",
3503 length, body_obj_len);
3504 break;
3505 }
3506
3507 switch (type_bnco) {
3508 case PCEP_SUB_IPv4:
3509 dissect_subobj_ipv4(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_branch_node_capability, length);
3510 break;
3511 case PCEP_SUB_IPv6:
3512 dissect_subobj_ipv6(pcep_object_tree, pinfo, tvb, offset2, obj_class, ett_pcep_obj_branch_node_capability, length);
3513 break;
3514 default:
3515 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_non_defined_subobject,
3516 tvb, offset2, length,
3517 "Non defined subobject (%d)", type_bnco);
3518 break;
3519 }
3520 offset2 += length;
3521 body_obj_len -= length;
3522 }
3523 }
3524
3525 /*------------------------------------------------------------------------------
3526 * LSP OBJECT
3527 *------------------------------------------------------------------------------*/
3528 #define OBJ_LSP_MIN_LEN 4
3529
3530 static void
dissect_pcep_obj_lsp(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)3531 dissect_pcep_obj_lsp(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length)
3532 {
3533 proto_item *ti;
3534 proto_tree *lsp_flags;
3535
3536 if (obj_length < OBJ_HDR_LEN + OBJ_LSP_MIN_LEN) {
3537 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3538 tvb, offset2, obj_length,
3539 "Bad LSP object length %u, should >= %u",
3540 obj_length, OBJ_HDR_LEN + OBJ_LSP_MIN_LEN);
3541 return;
3542 }
3543
3544 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_lsp_plsp_id, tvb, offset2, 3, ENC_BIG_ENDIAN);
3545 ti = proto_tree_add_item(pcep_object_tree, hf_pcep_obj_lsp_flags, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
3546 lsp_flags = proto_item_add_subtree(ti, ett_pcep_obj_lsp);
3547 proto_tree_add_item(lsp_flags, hf_pcep_obj_lsp_flags_d, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
3548 proto_tree_add_item(lsp_flags, hf_pcep_obj_lsp_flags_s, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
3549 proto_tree_add_item(lsp_flags, hf_pcep_obj_lsp_flags_r, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
3550 proto_tree_add_item(lsp_flags, hf_pcep_obj_lsp_flags_a, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
3551 proto_tree_add_item(lsp_flags, hf_pcep_obj_lsp_flags_o, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
3552 proto_tree_add_item(lsp_flags, hf_pcep_obj_lsp_flags_c, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
3553 proto_tree_add_item(lsp_flags, hf_pcep_obj_lsp_flags_reserved, tvb, offset2+2, 2, ENC_BIG_ENDIAN);
3554
3555 /* The object can have optional TLV(s)*/
3556 offset2 += OBJ_LSP_MIN_LEN;
3557 obj_length -= OBJ_HDR_LEN + OBJ_LSP_MIN_LEN;
3558 dissect_pcep_tlvs(pcep_object_tree, tvb, offset2, obj_length, ett_pcep_obj_lsp);
3559 }
3560
3561 /*------------------------------------------------------------------------------
3562 * SRP OBJECT
3563 *------------------------------------------------------------------------------*/
3564 #define OBJ_SRP_MIN_LEN 8
3565
3566 static void
dissect_pcep_obj_srp(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)3567 dissect_pcep_obj_srp(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2, int obj_length)
3568 {
3569 proto_item *ti;
3570 proto_tree *srp_flags;
3571
3572 if (obj_length < OBJ_HDR_LEN + OBJ_SRP_MIN_LEN) {
3573 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3574 tvb, offset2, obj_length,
3575 "Bad SRP object length %u, should >= %u",
3576 obj_length, OBJ_HDR_LEN + OBJ_SRP_MIN_LEN);
3577 return;
3578 }
3579 ti = proto_tree_add_item(pcep_object_tree, hf_pcep_obj_srp_flags, tvb, offset2, 4, ENC_BIG_ENDIAN);
3580 srp_flags = proto_item_add_subtree(ti, ett_pcep_obj_srp);
3581 proto_tree_add_item(srp_flags, hf_pcep_obj_srp_flags_r, tvb, offset2, 4, ENC_BIG_ENDIAN);
3582 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_srp_id_number, tvb, offset2 + 4, 4, ENC_BIG_ENDIAN);
3583
3584 /*The object can have optional TLV(s)*/
3585 offset2 += OBJ_SRP_MIN_LEN;
3586 obj_length -= OBJ_HDR_LEN + OBJ_SRP_MIN_LEN;
3587 dissect_pcep_tlvs(pcep_object_tree, tvb, offset2, obj_length, ett_pcep_obj_srp);
3588 }
3589
3590 /*------------------------------------------------------------------------------
3591 * VENDOR-INFORMATION OBJECT
3592 *------------------------------------------------------------------------------*/
3593 #define OBJ_VENDOR_INFORMATION_MIN_LEN 4
3594
3595 static void
dissect_pcep_obj_vendor_information(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)3596 dissect_pcep_obj_vendor_information(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2,
3597 int obj_length) {
3598
3599 if (obj_length < OBJ_HDR_LEN + OBJ_VENDOR_INFORMATION_MIN_LEN) {
3600 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3601 tvb, offset2, obj_length,
3602 "Bad VENDOR-INFORMATION object length %u, should >= %u",
3603 obj_length, OBJ_HDR_LEN + OBJ_VENDOR_INFORMATION_MIN_LEN);
3604 return;
3605 }
3606
3607 proto_tree_add_item(pcep_object_tree, hf_pcep_enterprise_number, tvb, offset2, 4, ENC_BIG_ENDIAN);
3608 proto_tree_add_item(pcep_object_tree, hf_pcep_enterprise_specific_info, tvb, offset2 + 4,
3609 obj_length - OBJ_HDR_LEN - 4, ENC_STR_HEX);
3610 }
3611
3612 /*------------------------------------------------------------------------------
3613 * BU OBJECT
3614 *------------------------------------------------------------------------------*/
3615 #define OBJ_BU_LEN 8 /* The BU object body has a fixed length of 8 bytes */
3616
3617 static void
dissect_pcep_obj_bu(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length)3618 dissect_pcep_obj_bu(proto_tree *pcep_object_tree, packet_info *pinfo, tvbuff_t *tvb, int offset2,
3619 int obj_length) {
3620
3621 if (obj_length != OBJ_HDR_LEN + OBJ_BU_LEN) {
3622 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_subobject_bad_length,
3623 tvb, offset2, obj_length,
3624 "Bad BU object length %u, should be %u",
3625 obj_length, OBJ_HDR_LEN + OBJ_BU_LEN);
3626 return;
3627 }
3628
3629 proto_tree_add_item(pcep_object_tree, hf_pcep_bu_reserved, tvb, offset2, 3, ENC_BIG_ENDIAN);
3630 proto_tree_add_item(pcep_object_tree, hf_pcep_bu_butype, tvb, offset2+3, 1, ENC_BIG_ENDIAN);
3631 proto_tree_add_item(pcep_object_tree, hf_pcep_bu_utilization, tvb, offset2+4, 4, ENC_BIG_ENDIAN);
3632 }
3633
3634 /*----------------------------------------------------------------------------
3635 * ASSOCIATION OBJECT
3636 *----------------------------------------------------------------------------*/
3637 #define ASSOCIATION_OBJ_v4_MIN_LEN 12
3638 #define ASSOCIATION_OBJ_v6_MIN_LEN 24
3639 static void
dissect_pcep_association_obj(proto_tree * pcep_object_tree,packet_info * pinfo,tvbuff_t * tvb,int offset2,int obj_length,int type)3640 dissect_pcep_association_obj(proto_tree *pcep_object_tree, packet_info *pinfo,
3641 tvbuff_t *tvb, int offset2, int obj_length, int type)
3642 {
3643 proto_tree *pcep_association_flags = NULL;
3644 proto_item *ti = NULL;
3645 guint16 association_type;
3646
3647 /* object length sanity checks */
3648 if ((type == 1) &&
3649 (obj_length < OBJ_HDR_LEN + ASSOCIATION_OBJ_v4_MIN_LEN)) {
3650 proto_tree_add_expert_format(pcep_object_tree, pinfo,
3651 &ei_pcep_subobject_bad_length,
3652 tvb, offset2, obj_length,
3653 "Bad ASSOCIATION IPv4 object length %u"
3654 ", should be >= %u",
3655 obj_length,
3656 OBJ_HDR_LEN + ASSOCIATION_OBJ_v4_MIN_LEN);
3657 return;
3658 }
3659 if ((type == 2) &&
3660 (obj_length < OBJ_HDR_LEN + ASSOCIATION_OBJ_v6_MIN_LEN)) {
3661 proto_tree_add_expert_format(pcep_object_tree, pinfo,
3662 &ei_pcep_subobject_bad_length,
3663 tvb, offset2, obj_length,
3664 "Bad ASSOCIATION IPv6 object length %u"
3665 ", should be >= %u",
3666 obj_length,
3667 OBJ_HDR_LEN + ASSOCIATION_OBJ_v4_MIN_LEN);
3668 return;
3669 }
3670
3671 proto_tree_add_item(pcep_object_tree, hf_pcep_association_reserved,
3672 tvb, offset2, 2, ENC_NA);
3673 offset2 += 2; /* consume reserved bytes */
3674 ti = proto_tree_add_item(pcep_object_tree, hf_pcep_association_flags,
3675 tvb, offset2, 2, ENC_NA);
3676 pcep_association_flags =
3677 proto_item_add_subtree(ti, ett_pcep_obj_association);
3678 proto_tree_add_item(pcep_association_flags, hf_pcep_association_flags_r,
3679 tvb, offset2, 2, ENC_NA);
3680 offset2 += 2; /* consume flags */
3681 proto_tree_add_item(pcep_object_tree, hf_pcep_association_type,
3682 tvb, offset2, 2, ENC_BIG_ENDIAN);
3683 association_type = tvb_get_ntohs(tvb, offset2);
3684 offset2 += 2; /* consume association type */
3685 proto_tree_add_item(pcep_object_tree, hf_pcep_association_id,
3686 tvb, offset2, 2, ENC_BIG_ENDIAN);
3687 offset2 += 2; /* consume association identifier */
3688 switch (type) {
3689 case 1:
3690 proto_tree_add_item(pcep_object_tree,
3691 hf_pcep_association_source_ipv4,
3692 tvb, offset2, 4, ENC_BIG_ENDIAN);
3693 offset2 += 4; /* consume association source */
3694 obj_length -= OBJ_HDR_LEN + ASSOCIATION_OBJ_v4_MIN_LEN;
3695 break;
3696 case 2:
3697 proto_tree_add_item(pcep_object_tree,
3698 hf_pcep_association_source_ipv6,
3699 tvb, offset2, 16, ENC_NA);
3700 offset2 += 16; /* consume association source */
3701 obj_length -= OBJ_HDR_LEN + ASSOCIATION_OBJ_v6_MIN_LEN;
3702 break;
3703 default:
3704 proto_tree_add_expert_format(pcep_object_tree, pinfo,
3705 &ei_pcep_non_defined_subobject,
3706 tvb, offset2, obj_length - OBJ_HDR_LEN,
3707 "Unknown Association Type (%u)", type);
3708 return;
3709 }
3710
3711 /* The ASSOCIATION object can have optional TLV(s) */
3712 /* The EXTENDED_ASSOCIATION_ID TLV is scoped to the ASSOCIATION TYPE*/
3713 dissect_pcep_tlvs_with_scope(pcep_object_tree, tvb,
3714 offset2, obj_length, ett_pcep_obj_association,association_type);
3715 }
3716
3717 /*------------------------------------------------------------------------------*/
3718 /* Dissect in Objects */
3719 /*------------------------------------------------------------------------------*/
3720 static void
dissect_pcep_obj_tree(proto_tree * pcep_tree,packet_info * pinfo,tvbuff_t * tvb,int len,int offset,int msg_length)3721 dissect_pcep_obj_tree(proto_tree *pcep_tree, packet_info *pinfo, tvbuff_t *tvb, int len, int offset, int msg_length)
3722 {
3723 guint8 obj_class;
3724 guint8 ot_res_p_i;
3725 guint16 obj_length;
3726 int type;
3727 proto_tree *pcep_object_tree;
3728 proto_item *pcep_object_item;
3729
3730 static int * const pcep_hdr_obj_flags[] = {
3731 &hf_pcep_hdr_obj_flags_i,
3732 &hf_pcep_hdr_obj_flags_p,
3733 &hf_pcep_hdr_obj_flags_reserved,
3734 NULL
3735 };
3736
3737 while (len < msg_length) {
3738 obj_class = tvb_get_guint8(tvb, offset);
3739 switch (obj_class) {
3740
3741 case PCEP_OPEN_OBJ:
3742 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_OPEN, tvb, offset, -1, ENC_NA);
3743 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_open);
3744 break;
3745
3746 case PCEP_RP_OBJ:
3747 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_RP, tvb, offset, -1, ENC_NA);
3748 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_request_parameters);
3749 break;
3750
3751 case PCEP_NO_PATH_OBJ:
3752 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_NO_PATH, tvb, offset, -1, ENC_NA);
3753 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_no_path);
3754 break;
3755
3756 case PCEP_END_POINT_OBJ:
3757 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_END_POINT, tvb, offset, -1, ENC_NA);
3758 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_end_point);
3759 break;
3760
3761 case PCEP_BANDWIDTH_OBJ:
3762 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_BANDWIDTH, tvb, offset, -1, ENC_NA);
3763 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_bandwidth);
3764 break;
3765
3766 case PCEP_METRIC_OBJ:
3767 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_METRIC, tvb, offset, -1, ENC_NA);
3768 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_metric);
3769 break;
3770
3771 case PCEP_EXPLICIT_ROUTE_OBJ:
3772 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_EXPLICIT_ROUTE, tvb, offset, -1, ENC_NA);
3773 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_explicit_route);
3774 break;
3775
3776 case PCEP_RECORD_ROUTE_OBJ:
3777 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_RECORD_ROUTE, tvb, offset, -1, ENC_NA);
3778 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_record_route);
3779 break;
3780
3781 case PCEP_LSPA_OBJ:
3782 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_LSPA, tvb, offset, -1, ENC_NA);
3783 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_lspa);
3784 break;
3785
3786 case PCEP_IRO_OBJ:
3787 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_IRO, tvb, offset, -1, ENC_NA);
3788 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_iro);
3789 break;
3790
3791 case PCEP_SVEC_OBJ:
3792 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_SVEC, tvb, offset, -1, ENC_NA);
3793 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_svec);
3794 break;
3795
3796 case PCEP_NOTIFICATION_OBJ:
3797 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_NOTIFICATION, tvb, offset, -1, ENC_NA);
3798 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_notification);
3799 break;
3800
3801 case PCEP_PCEP_ERROR_OBJ:
3802 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_PCEP_ERROR, tvb, offset, -1, ENC_NA);
3803 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_error);
3804 break;
3805
3806 case PCEP_LOAD_BALANCING_OBJ:
3807 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_LOAD_BALANCING, tvb, offset, -1, ENC_NA);
3808 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_load_balancing);
3809 break;
3810
3811 case PCEP_CLOSE_OBJ:
3812 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_CLOSE, tvb, offset, -1, ENC_NA);
3813 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_close);
3814 break;
3815
3816 case PCEP_PATH_KEY_OBJ:
3817 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_PATH_KEY, tvb, offset, -1, ENC_NA);
3818 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_path_key);
3819 break;
3820
3821 case PCEP_XRO_OBJ:
3822 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_XRO, tvb, offset, -1, ENC_NA);
3823 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_xro);
3824 break;
3825
3826 case PCEP_OBJ_MONITORING:
3827 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_MONITORING, tvb, offset, -1, ENC_NA);
3828 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_monitoring);
3829 break;
3830
3831 case PCEP_OBJ_PCC_ID_REQ:
3832 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_PCC_ID_REQ, tvb, offset, -1, ENC_NA);
3833 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_pcc_id_req);
3834 break;
3835
3836 case PCEP_OF_OBJ:
3837 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_OF, tvb, offset, -1, ENC_NA);
3838 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_of);
3839 break;
3840
3841 case PCEP_OBJ_PCE_ID:
3842 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_PCE_ID, tvb, offset, -1, ENC_NA);
3843 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_pce_id);
3844 break;
3845
3846 case PCEP_OBJ_PROC_TIME:
3847 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_PROC_TIME, tvb, offset, -1, ENC_NA);
3848 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_proc_time);
3849 break;
3850
3851 case PCEP_OBJ_OVERLOAD:
3852 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_OVERLOAD, tvb, offset, -1, ENC_NA);
3853 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_overload);
3854 break;
3855
3856 case PCEP_OBJ_UNREACH_DESTINATION:
3857 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_UNREACH_DESTINATION, tvb, offset, -1, ENC_NA);
3858 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_unreach_destination);
3859 break;
3860
3861 case PCEP_OBJ_BRANCH_NODE_CAPABILITY:
3862 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_BRANCH_NODE_CAPABILITY, tvb, offset, -1, ENC_NA);
3863 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_branch_node_capability);
3864 break;
3865
3866 case PCEP_OBJ_LSP:
3867 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_LSP, tvb, offset, -1, ENC_NA);
3868 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_lsp);
3869 break;
3870
3871 case PCEP_OBJ_SRP:
3872 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_SRP, tvb, offset, -1, ENC_NA);
3873 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_srp);
3874 break;
3875
3876 case PCEP_OBJ_VENDOR_INFORMATION:
3877 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_VENDOR_INFORMATION, tvb, offset, -1, ENC_NA);
3878 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_vendor_information);
3879 break;
3880
3881 case PCEP_OBJ_BU:
3882 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_BU, tvb, offset, -1, ENC_NA);
3883 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_bu);
3884 break;
3885
3886 case PCEP_SERO_OBJ:
3887 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_SERO, tvb, offset, -1, ENC_NA);
3888 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_sero);
3889 break;
3890
3891 case PCEP_SRRO_OBJ:
3892 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_SRRO, tvb, offset, -1, ENC_NA);
3893 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_srro);
3894 break;
3895
3896 case PCEP_ASSOCIATION_OBJ:
3897 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_ASSOCIATION, tvb, offset, -1, ENC_NA);
3898 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_association);
3899 break;
3900
3901 default:
3902 pcep_object_item = proto_tree_add_item(pcep_tree, hf_PCEPF_OBJ_UNKNOWN_TYPE, tvb, offset, -1, ENC_NA);
3903 pcep_object_tree = proto_item_add_subtree(pcep_object_item, ett_pcep_obj_unknown);
3904 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_non_defined_object,
3905 tvb, offset, -1,
3906 "Unknown object (%u)", obj_class);
3907 break;
3908 }
3909
3910 proto_tree_add_uint(pcep_object_tree, hf_PCEPF_OBJECT_CLASS, tvb, offset, 1, obj_class);
3911
3912 switch (obj_class) {
3913
3914 case PCEP_OPEN_OBJ:
3915 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_open_type, tvb, offset+1, 1, ENC_NA);
3916 break;
3917
3918 case PCEP_RP_OBJ:
3919 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_rp_type, tvb, offset+1, 1, ENC_NA);
3920 break;
3921
3922 case PCEP_NO_PATH_OBJ:
3923 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_no_path_type, tvb, offset+1, 1, ENC_NA);
3924 break;
3925
3926 case PCEP_END_POINT_OBJ:
3927 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_end_point_type, tvb, offset+1, 1, ENC_NA);
3928 break;
3929
3930 case PCEP_BANDWIDTH_OBJ:
3931 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_bandwidth_type, tvb, offset+1, 1, ENC_NA);
3932 break;
3933
3934 case PCEP_METRIC_OBJ:
3935 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_metric_type, tvb, offset+1, 1, ENC_NA);
3936 break;
3937
3938 case PCEP_EXPLICIT_ROUTE_OBJ:
3939 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_explicit_route_type, tvb, offset+1, 1, ENC_NA);
3940 break;
3941
3942 case PCEP_RECORD_ROUTE_OBJ:
3943 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_record_route_type, tvb, offset+1, 1, ENC_NA);
3944 break;
3945
3946 case PCEP_LSPA_OBJ:
3947 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_lspa_type, tvb, offset+1, 1, ENC_NA);
3948 break;
3949
3950 case PCEP_IRO_OBJ:
3951 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_iro_type, tvb, offset+1, 1, ENC_NA);
3952 break;
3953
3954 case PCEP_SVEC_OBJ:
3955 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_svec_type, tvb, offset+1, 1, ENC_NA);
3956 break;
3957
3958 case PCEP_NOTIFICATION_OBJ:
3959 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_notification_type, tvb, offset+1, 1, ENC_NA);
3960 break;
3961
3962 case PCEP_PCEP_ERROR_OBJ:
3963 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_pcep_error_type, tvb, offset+1, 1, ENC_NA);
3964 break;
3965
3966 case PCEP_LOAD_BALANCING_OBJ:
3967 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_load_balancing_type, tvb, offset+1, 1, ENC_NA);
3968 break;
3969
3970 case PCEP_CLOSE_OBJ:
3971 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_close_type, tvb, offset+1, 1, ENC_NA);
3972 break;
3973
3974 case PCEP_PATH_KEY_OBJ:
3975 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_path_key_type, tvb, offset+1, 1, ENC_NA);
3976 break;
3977
3978 case PCEP_XRO_OBJ:
3979 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_xro_type, tvb, offset+1, 1, ENC_NA);
3980 break;
3981
3982 case PCEP_OBJ_MONITORING:
3983 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_monitoring_type, tvb, offset+1, 1, ENC_NA);
3984 break;
3985
3986 case PCEP_OBJ_PCC_ID_REQ:
3987 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_pcc_id_req_type, tvb, offset+1, 1, ENC_NA);
3988 break;
3989
3990 case PCEP_OF_OBJ:
3991 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_of_type, tvb, offset+1, 1, ENC_NA);
3992 break;
3993
3994 case PCEP_OBJ_PCE_ID:
3995 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_pce_id_type, tvb, offset+1, 1, ENC_NA);
3996 break;
3997
3998 case PCEP_OBJ_PROC_TIME:
3999 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_proc_time_type, tvb, offset+1, 1, ENC_NA);
4000 break;
4001
4002 case PCEP_OBJ_OVERLOAD:
4003 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_overload_type, tvb, offset+1, 1, ENC_NA);
4004 break;
4005
4006 case PCEP_OBJ_UNREACH_DESTINATION:
4007 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_unreach_destination_type, tvb, offset+1, 1, ENC_NA);
4008 break;
4009
4010 case PCEP_SERO_OBJ:
4011 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_sero_type, tvb, offset+1, 1, ENC_NA);
4012 break;
4013
4014 case PCEP_SRRO_OBJ:
4015 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_srro_type, tvb, offset+1, 1, ENC_NA);
4016 break;
4017
4018 case PCEP_OBJ_BRANCH_NODE_CAPABILITY:
4019 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_branch_node_capability_type, tvb, offset+1, 1, ENC_NA);
4020 break;
4021
4022 case PCEP_OBJ_LSP:
4023 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_lsp_type, tvb, offset+1, 1, ENC_NA);
4024 break;
4025
4026 case PCEP_OBJ_SRP:
4027 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_srp_type, tvb, offset+1, 1, ENC_NA);
4028 break;
4029
4030 case PCEP_OBJ_VENDOR_INFORMATION:
4031 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_vendor_information_type, tvb, offset+1, 1, ENC_NA);
4032 break;
4033
4034 case PCEP_OBJ_BU:
4035 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_bu_type, tvb, offset+1, 1, ENC_NA);
4036 break;
4037
4038 case PCEP_ASSOCIATION_OBJ:
4039 proto_tree_add_item(pcep_object_tree, hf_pcep_obj_association_type, tvb, offset+1, 1, ENC_NA);
4040 break;
4041
4042 default:
4043 proto_tree_add_item(pcep_object_tree, hf_pcep_object_type, tvb, offset+1, 1, ENC_NA);
4044 break;
4045
4046 }
4047
4048 ot_res_p_i = tvb_get_guint8(tvb, offset+1);
4049 type = (ot_res_p_i & MASK_OBJ_TYPE)>>4;
4050
4051 proto_tree_add_bitmask(pcep_object_tree, tvb, offset+1, hf_pcep_hdr_obj_flags, ett_pcep_hdr, pcep_hdr_obj_flags, ENC_NA);
4052
4053 proto_tree_add_item(pcep_object_tree, hf_pcep_object_length, tvb, offset+2, 2, ENC_BIG_ENDIAN);
4054
4055 obj_length = tvb_get_ntohs(tvb, offset+2);
4056 proto_item_set_len(pcep_object_item, obj_length);
4057 if (obj_length < 4) {
4058 expert_add_info_format(pinfo, pcep_object_tree, &ei_pcep_object_length,
4059 "Object Length: %u (bogus, must be >= 4)", obj_length);
4060 break;
4061 }
4062
4063 switch (obj_class) {
4064
4065 case PCEP_OPEN_OBJ:
4066 dissect_pcep_open_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4067 break;
4068
4069 case PCEP_RP_OBJ:
4070 dissect_pcep_rp_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4071 break;
4072
4073 case PCEP_NO_PATH_OBJ:
4074 dissect_pcep_no_path_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4075 break;
4076
4077 case PCEP_END_POINT_OBJ:
4078 dissect_pcep_end_point_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length, type);
4079 break;
4080
4081 case PCEP_BANDWIDTH_OBJ:
4082 dissect_pcep_bandwidth_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4083 break;
4084
4085 case PCEP_METRIC_OBJ:
4086 dissect_pcep_metric_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4087 break;
4088
4089 case PCEP_EXPLICIT_ROUTE_OBJ:
4090 dissect_pcep_explicit_route_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length, obj_class);
4091 break;
4092
4093 case PCEP_RECORD_ROUTE_OBJ:
4094 dissect_pcep_record_route_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length, obj_class);
4095 break;
4096
4097 case PCEP_LSPA_OBJ:
4098 dissect_pcep_lspa_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4099 break;
4100
4101 case PCEP_IRO_OBJ:
4102 dissect_pcep_iro_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length, obj_class);
4103 break;
4104
4105 case PCEP_SVEC_OBJ:
4106 dissect_pcep_svec_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4107 break;
4108
4109 case PCEP_NOTIFICATION_OBJ:
4110 dissect_pcep_notification_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4111 break;
4112
4113 case PCEP_PCEP_ERROR_OBJ:
4114 dissect_pcep_error_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4115 break;
4116
4117 case PCEP_LOAD_BALANCING_OBJ:
4118 dissect_pcep_balancing_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4119 break;
4120
4121 case PCEP_CLOSE_OBJ:
4122 dissect_pcep_close_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4123 break;
4124
4125 case PCEP_PATH_KEY_OBJ:
4126 dissect_pcep_path_key_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4127 break;
4128
4129 case PCEP_XRO_OBJ:
4130 dissect_pcep_xro_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length, obj_class);
4131 break;
4132
4133 case PCEP_OBJ_MONITORING:
4134 dissect_pcep_obj_monitoring(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4135 break;
4136
4137 case PCEP_OBJ_PCC_ID_REQ:
4138 dissect_pcep_obj_pcc_id_req(pcep_object_tree, pinfo, tvb, offset+4, obj_length, type);
4139 break;
4140
4141 case PCEP_OF_OBJ:
4142 dissect_pcep_of_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4143 break;
4144
4145 case PCEP_OBJ_PCE_ID:
4146 dissect_pcep_obj_pce_id(pcep_object_tree, pinfo, tvb, offset+4, obj_length, type);
4147 break;
4148
4149 case PCEP_OBJ_PROC_TIME:
4150 dissect_pcep_obj_proc_time(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4151 break;
4152
4153 case PCEP_OBJ_OVERLOAD:
4154 dissect_pcep_obj_overload(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4155 break;
4156
4157 case PCEP_OBJ_UNREACH_DESTINATION:
4158 dissect_pcep_obj_unreach_destination(pcep_object_tree, pinfo, tvb, offset+4, obj_length, type);
4159 break;
4160
4161 case PCEP_OBJ_BRANCH_NODE_CAPABILITY:
4162 dissect_pcep_obj_branch_node_capability(pcep_object_tree, pinfo, tvb, offset+4, obj_length, obj_class);
4163 break;
4164
4165 case PCEP_OBJ_LSP:
4166 dissect_pcep_obj_lsp(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4167 break;
4168
4169 case PCEP_OBJ_SRP:
4170 dissect_pcep_obj_srp(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4171 break;
4172
4173 case PCEP_OBJ_VENDOR_INFORMATION:
4174 dissect_pcep_obj_vendor_information(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4175 break;
4176
4177 case PCEP_OBJ_BU:
4178 dissect_pcep_obj_bu(pcep_object_tree, pinfo, tvb, offset+4, obj_length);
4179 break;
4180
4181 case PCEP_SERO_OBJ:
4182 dissect_pcep_explicit_route_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length, obj_class);
4183 break;
4184
4185 case PCEP_SRRO_OBJ:
4186 dissect_pcep_record_route_obj(pcep_object_tree, pinfo, tvb, offset+4, obj_length, obj_class);
4187 break;
4188
4189 case PCEP_ASSOCIATION_OBJ:
4190 dissect_pcep_association_obj(pcep_object_tree, pinfo, tvb, offset + 4, obj_length, type);
4191 break;
4192
4193 default:
4194 proto_tree_add_expert_format(pcep_object_tree, pinfo, &ei_pcep_pcep_object_body_non_defined,
4195 tvb, offset+4, obj_length-OBJ_HDR_LEN,
4196 "PCEP Object BODY non defined (%u)", type);
4197 break;
4198 }
4199
4200 offset += obj_length;
4201 len += obj_length;
4202 }
4203 }
4204
4205
4206 /*------------------------------------------------------------------------------
4207 * Dissect a single PCEP message in a tree
4208 *------------------------------------------------------------------------------*/
4209 static void
dissect_pcep_msg_tree(tvbuff_t * tvb,proto_tree * tree,guint tree_mode,packet_info * pinfo)4210 dissect_pcep_msg_tree(tvbuff_t *tvb, proto_tree *tree, guint tree_mode, packet_info *pinfo)
4211 {
4212 proto_tree *pcep_tree, *pcep_header_tree, *pcep_header_msg_flags;
4213 proto_item *ti;
4214
4215 int offset = 0;
4216 int len = 0;
4217 guint8 message_type;
4218 guint16 msg_length;
4219
4220 message_type = tvb_get_guint8(tvb, 1);
4221 msg_length = tvb_get_ntohs(tvb, 2);
4222
4223 col_append_str(pinfo->cinfo, COL_INFO, val_to_str(message_type, message_type_vals, "Unknown Message (%u). "));
4224
4225 ti = proto_tree_add_item(tree, proto_pcep, tvb, offset, msg_length, ENC_NA);
4226 pcep_tree = proto_item_add_subtree(ti, tree_mode);
4227
4228 pcep_header_tree = proto_tree_add_subtree_format(pcep_tree, tvb, offset, 4, ett_pcep_hdr, NULL,
4229 "%s Header", val_to_str(message_type, message_type_vals, "Unknown Message (%u). "));
4230
4231 proto_tree_add_item(pcep_header_tree, hf_pcep_version, tvb, offset, 1, ENC_NA);
4232
4233 ti = proto_tree_add_item(pcep_header_tree, hf_pcep_flags, tvb, offset, 1, ENC_NA);
4234 pcep_header_msg_flags = proto_item_add_subtree(ti, ett_pcep_hdr);
4235 proto_tree_add_item(pcep_header_msg_flags, hf_pcep_hdr_msg_flags_reserved, tvb, offset, 1, ENC_NA);
4236 proto_tree_add_item(pcep_header_tree, hf_PCEPF_MSG, tvb, offset+1, 1, ENC_NA);
4237 proto_tree_add_item(pcep_header_tree, hf_pcep_message_length, tvb, offset+2, 2, ENC_BIG_ENDIAN);
4238
4239 offset = 4;
4240 len = 4;
4241
4242 dissect_pcep_obj_tree(pcep_tree, pinfo, tvb, len, offset, msg_length);
4243 }
4244
4245
4246 static guint
get_pcep_message_len(packet_info * pinfo _U_,tvbuff_t * tvb,int offset,void * data _U_)4247 get_pcep_message_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset, void *data _U_)
4248 {
4249 guint16 plen;
4250
4251 /* Get the length of the PCEP packet.*/
4252 plen = tvb_get_ntohs(tvb, offset+2);
4253
4254 return plen;
4255 }
4256
4257 static int
dissect_pcep_pdu(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,void * data _U_)4258 dissect_pcep_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
4259 {
4260 /* Set up structures needed to add the protocol subtree and manage it */
4261 col_set_str(pinfo->cinfo, COL_PROTOCOL, "PCEP");
4262
4263 /* Clear out stuff in the info column */
4264 col_clear(pinfo->cinfo, COL_INFO);
4265
4266 dissect_pcep_msg_tree(tvb, tree, ett_pcep, pinfo);
4267 return tvb_captured_length(tvb);
4268 }
4269
4270 static int
dissect_pcep(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree,void * data)4271 dissect_pcep(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
4272 {
4273 tcp_dissect_pdus(tvb, pinfo, tree, TRUE, 4, get_pcep_message_len,
4274 dissect_pcep_pdu, data);
4275 return tvb_captured_length(tvb);
4276 }
4277
4278 /*Register the protocol with wireshark*/
4279 void
proto_register_pcep(void)4280 proto_register_pcep(void)
4281 {
4282 static hf_register_info pcepf_info[] = {
4283
4284 /* Message type number */
4285 { &hf_PCEPF_MSG,
4286 { "Message Type", "pcep.msg",
4287 FT_UINT8, BASE_DEC, VALS(message_type_vals), 0x0,
4288 NULL, HFILL }
4289 },
4290 { &hf_pcep_hdr_msg_flags_reserved,
4291 { "Reserved Flags", "pcep.msg.hdr.flags.reserved",
4292 FT_BOOLEAN, 8, TFS(&tfs_set_notset), PCEP_HDR_MSG_RESERVED,
4293 NULL, HFILL }
4294 },
4295
4296 /*Object header*/
4297 { &hf_pcep_hdr_obj_flags,
4298 { "Object Header Flags", "pcep.obj.hdr.flags",
4299 FT_UINT8, BASE_HEX, NULL, 0x0F,
4300 NULL, HFILL }
4301 },
4302 { &hf_pcep_hdr_obj_flags_reserved,
4303 { "Reserved Flags", "pcep.obj.hdr.flags.reserved",
4304 FT_BOOLEAN, 4, TFS(&tfs_set_notset), PCEP_HDR_OBJ_RESERVED,
4305 NULL, HFILL }
4306 },
4307 { &hf_pcep_hdr_obj_flags_p,
4308 { "Processing-Rule (P)", "pcep.obj.hdr.flags.p",
4309 FT_BOOLEAN, 4, TFS(&tfs_set_notset), PCEP_HDR_OBJ_P,
4310 NULL, HFILL }
4311 },
4312 { &hf_pcep_hdr_obj_flags_i,
4313 { "Ignore (I)", "pcep.obj.hdr.flags.i",
4314 FT_BOOLEAN, 4, TFS(&tfs_set_notset), PCEP_HDR_OBJ_I,
4315 NULL, HFILL }
4316 },
4317 /* Object class */
4318 { &hf_PCEPF_OBJECT_CLASS,
4319 { "Object Class", "pcep.object",
4320 FT_UINT32, BASE_DEC | BASE_EXT_STRING, &pcep_class_vals_ext, 0x0,
4321 NULL, HFILL }
4322 },
4323
4324 /* Object types */
4325 { &hf_pcep_endpoint_p2mp_leaf,
4326 { "P2MP Leaf type", "pcep.obj.endpoint.p2mp.leaf",
4327 FT_UINT32, BASE_DEC, VALS(pcep_p2mp_leaf_type_vals), 0x0,
4328 NULL, HFILL }
4329 },
4330 { &hf_PCEPF_OBJ_OPEN,
4331 { "OPEN object", "pcep.obj.open",
4332 FT_NONE, BASE_NONE, NULL, 0x0,
4333 NULL, HFILL }
4334 },
4335 { &hf_pcep_open_flags_res,
4336 { "Reserved Flags", "pcep.open.flags.res",
4337 FT_BOOLEAN, 8, TFS(&tfs_set_notset), PCEP_OPEN_RES,
4338 NULL, HFILL }
4339 },
4340 { &hf_PCEPF_OBJ_RP,
4341 { "RP object", "pcep.obj.rp",
4342 FT_NONE, BASE_NONE, NULL, 0x0,
4343 NULL, HFILL }
4344 },
4345 { &hf_pcep_rp_flags_reserved,
4346 { "Reserved Flags", "pcep.rp.flags.reserved",
4347 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_RP_RESERVED,
4348 NULL, HFILL }
4349 },
4350 { &hf_pcep_rp_flags_pri,
4351 { "(PRI) Priority", "pcep.rp.flags.pri",
4352 FT_BOOLEAN, 24, TFS(&tfs_on_off), PCEP_RP_PRI,
4353 NULL, HFILL }
4354 },
4355 { &hf_pcep_rp_flags_r,
4356 { "(R) Reoptimization", "pcep.rp.flags.r",
4357 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_RP_R,
4358 NULL, HFILL }
4359 },
4360 { &hf_pcep_rp_flags_b,
4361 { "(B) Bi-directional", "pcep.rp.flags.b",
4362 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_RP_B,
4363 NULL, HFILL }
4364 },
4365 { &hf_pcep_rp_flags_o,
4366 { "(L) Strict/Loose", "pcep.rp.flags.o",
4367 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_RP_O,
4368 NULL, HFILL }
4369 },
4370 { &hf_pcep_rp_flags_v,
4371 { "(V) VSPT", "pcep.rp.flags.v",
4372 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_RP_V,
4373 NULL, HFILL }
4374 },
4375 { &hf_pcep_rp_flags_s,
4376 { "(S) Supply OF on response", "pcep.rp.flags.s",
4377 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_RP_S,
4378 NULL, HFILL }
4379 },
4380 { &hf_pcep_rp_flags_p,
4381 { "(P) Path Key", "pcep.rp.flags.p",
4382 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_RP_P,
4383 NULL, HFILL }
4384 },
4385 { &hf_pcep_rp_flags_d,
4386 { "(D) Report the request order", "pcep.rp.flags.d",
4387 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_RP_D,
4388 NULL, HFILL }
4389 },
4390 { &hf_pcep_rp_flags_m,
4391 { "(M) Make-before-break", "pcep.rp.flags.m",
4392 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_RP_M,
4393 NULL, HFILL }
4394 },
4395 { &hf_pcep_rp_flags_e,
4396 { "(E) ERO-compression", "pcep.rp.flags.e",
4397 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_RP_E,
4398 NULL, HFILL }
4399 },
4400 { &hf_pcep_rp_flags_n,
4401 { "(N) P2MP", "pcep.rp.flags.n",
4402 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_RP_N,
4403 NULL, HFILL }
4404 },
4405 { &hf_pcep_rp_flags_f,
4406 { "(F) Fragmentation", "pcep.rp.flags.f",
4407 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_RP_F,
4408 NULL, HFILL }
4409 },
4410 { &hf_pcep_rp_flags_c,
4411 { "(C) Core-tree computation", "pcep.rp.flags.c",
4412 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_RP_C,
4413 NULL, HFILL }
4414 },
4415 { &hf_PCEPF_OBJ_NO_PATH,
4416 { "NO-PATH object", "pcep.obj.nopath",
4417 FT_NONE, BASE_NONE, NULL, 0x0,
4418 NULL, HFILL }
4419 },
4420 { &hf_pcep_no_path_flags_c,
4421 { "C", "pcep.no.path.flags.c",
4422 FT_BOOLEAN, 16, TFS(&tfs_set_notset), PCEP_NO_PATH_C,
4423 NULL, HFILL }
4424 },
4425 { &hf_PCEPF_OBJ_END_POINT,
4426 { "END-POINT object", "pcep.obj.endpoint",
4427 FT_NONE, BASE_NONE, NULL, 0x0,
4428 NULL, HFILL }
4429 },
4430 { &hf_PCEPF_OBJ_BANDWIDTH,
4431 { "BANDWIDTH object", "pcep.obj.bandwidth",
4432 FT_NONE, BASE_NONE, NULL, 0x0,
4433 NULL, HFILL }
4434 },
4435 { &hf_PCEPF_OBJ_METRIC,
4436 { "METRIC object", "pcep.obj.metric",
4437 FT_NONE, BASE_NONE, NULL, 0x0,
4438 NULL, HFILL }
4439 },
4440 { &hf_pcep_metric_flags_c,
4441 { "(C) Cost", "pcep.metric.flags.c",
4442 FT_BOOLEAN, 8, TFS(&tfs_set_notset), PCEP_METRIC_C,
4443 NULL, HFILL }
4444 },
4445 { &hf_pcep_metric_flags_b,
4446 { "(B) Bound", "pcep.metric.flags.b",
4447 FT_BOOLEAN, 8, TFS(&tfs_set_notset), PCEP_METRIC_B,
4448 NULL, HFILL }
4449 },
4450 { &hf_PCEPF_OBJ_EXPLICIT_ROUTE,
4451 { "EXPLICIT ROUTE object (ERO)", "pcep.obj.ero",
4452 FT_NONE, BASE_NONE, NULL, 0x0,
4453 NULL, HFILL }
4454 },
4455 { &hf_PCEPF_OBJ_SERO,
4456 { "SECONDARY EXPLICIT ROUTE object (SERO)", "pcep.obj.sero",
4457 FT_NONE, BASE_NONE, NULL, 0x0,
4458 NULL, HFILL }
4459 },
4460 { &hf_PCEPF_OBJ_SRRO,
4461 { "SECONDARY RECORD ROUTE object (SRRO)", "pcep.obj.srro",
4462 FT_NONE, BASE_NONE, NULL, 0x0,
4463 NULL, HFILL }
4464 },
4465 { &hf_PCEPF_OBJ_RECORD_ROUTE,
4466 { "RECORD ROUTE object (RRO)", "pcep.obj.rro",
4467 FT_NONE, BASE_NONE, NULL, 0x0,
4468 NULL, HFILL }
4469 },
4470 { &hf_PCEPF_OBJ_LSPA,
4471 { "LSPA object", "pcep.obj.lspa",
4472 FT_NONE, BASE_NONE, NULL, 0x0,
4473 NULL, HFILL }
4474 },
4475 { &hf_pcep_lspa_flags_l,
4476 { "Local Protection Desired (L)", "pcep.lspa.flags.l",
4477 FT_BOOLEAN, 8, TFS(&tfs_set_notset), PCEP_LSPA_L,
4478 NULL, HFILL }
4479 },
4480 { &hf_PCEPF_OBJ_IRO,
4481 { "IRO object", "pcep.obj.iro",
4482 FT_NONE, BASE_NONE, NULL, 0x0,
4483 NULL, HFILL }
4484 },
4485 { &hf_PCEPF_OBJ_SVEC,
4486 { "SVEC object", "pcep.obj.svec",
4487 FT_NONE, BASE_NONE, NULL, 0x0,
4488 NULL, HFILL }
4489 },
4490
4491 { &hf_pcep_svec_flags_l,
4492 { "Link diverse (L)", "pcep.svec.flags.l",
4493 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_SVEC_L,
4494 NULL, HFILL }
4495 },
4496
4497 { &hf_pcep_svec_flags_n,
4498 { "Node diverse (N)", "pcep.svec.flags.n",
4499 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_SVEC_N,
4500 NULL, HFILL }
4501 },
4502
4503 { &hf_pcep_svec_flags_s,
4504 { "SRLG diverse (S)", "pcep.svec.flags.s",
4505 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_SVEC_S,
4506 NULL, HFILL }
4507 },
4508
4509 { &hf_pcep_svec_flags_d,
4510 { "Link Direction Diverse (D)", "pcep.svec.flags.d",
4511 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_SVEC_D,
4512 NULL, HFILL }
4513 },
4514
4515 { &hf_pcep_svec_flags_p,
4516 { "Partial Path Diverse (P)", "pcep.svec.flags.p",
4517 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_SVEC_P,
4518 NULL, HFILL }
4519 },
4520
4521 { &hf_PCEPF_OBJ_NOTIFICATION,
4522 { "NOTIFICATION object", "pcep.obj.notification",
4523 FT_NONE, BASE_NONE, NULL, 0x0,
4524 NULL, HFILL }
4525 },
4526
4527 { &hf_PCEPF_NOTI_TYPE,
4528 { "Notification Value", "pcep.notification.value1",
4529 FT_UINT32, BASE_DEC, VALS(pcep_notification_types_vals), 0x0,
4530 NULL, HFILL }
4531 },
4532 { &hf_PCEPF_NOTI_VAL1,
4533 { "Notification Type", "pcep.notification.type2",
4534 FT_UINT32, BASE_DEC, VALS(pcep_notification_values1_vals), 0x0,
4535 NULL, HFILL }
4536 },
4537 { &hf_PCEPF_NOTI_VAL2,
4538 { "Notification Type", "pcep.notification.type",
4539 FT_UINT32, BASE_DEC, VALS(pcep_notification_values2_vals), 0x0,
4540 NULL, HFILL }
4541 },
4542
4543 { &hf_PCEPF_OBJ_PCEP_ERROR,
4544 { "ERROR object", "pcep.obj.error",
4545 FT_NONE, BASE_NONE, NULL, 0x0,
4546 NULL, HFILL }
4547 },
4548 { &hf_PCEPF_ERROR_TYPE,
4549 { "Error-Type", "pcep.error.type",
4550 FT_UINT8, BASE_DEC | BASE_EXT_STRING, &pcep_error_types_obj_vals_ext, 0x0,
4551 NULL, HFILL }
4552 },
4553 { &hf_PCEPF_ERROR_VALUE,
4554 { "Error-Value", "pcep.error.value",
4555 FT_UINT8, BASE_DEC, NULL, 0x0,
4556 NULL, HFILL }
4557 },
4558 { &hf_PCEPF_OBJ_LOAD_BALANCING,
4559 { "LOAD BALANCING object", "pcep.obj.loadbalancing",
4560 FT_NONE, BASE_NONE, NULL, 0x0,
4561 NULL, HFILL }
4562 },
4563 { &hf_PCEPF_OBJ_CLOSE,
4564 { "CLOSE object", "pcep.obj.close",
4565 FT_NONE, BASE_NONE, NULL, 0x0,
4566 NULL, HFILL }
4567 },
4568 { &hf_PCEPF_OBJ_PATH_KEY,
4569 { "PATH-KEY object", "pcep.obj.path_key",
4570 FT_NONE, BASE_NONE, NULL, 0x0,
4571 NULL, HFILL }
4572 },
4573 { &hf_PCEPF_OBJ_XRO,
4574 { "EXCLUDE ROUTE object (XRO)", "pcep.obj.xro",
4575 FT_NONE, BASE_NONE, NULL, 0x0,
4576 NULL, HFILL }
4577 },
4578
4579 { &hf_PCEPF_OBJ_MONITORING,
4580 { "MONITORING object", "pcep.obj.monitoring",
4581 FT_NONE, BASE_NONE, NULL, 0x0,
4582 NULL, HFILL }
4583 },
4584 { &hf_pcep_obj_monitoring_flags_reserved,
4585 { "Reserved Flags", "pcep.obj.monitoring.flags.reserved",
4586 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_OBJ_MONITORING_FLAGS_RESERVED,
4587 NULL, HFILL }
4588 },
4589 { &hf_pcep_obj_monitoring_flags_l,
4590 { "Liveness (L)", "pcep.obj.monitoring.flags.l",
4591 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_OBJ_MONITORING_FLAGS_L,
4592 NULL, HFILL }
4593 },
4594 { &hf_pcep_obj_monitoring_flags_g,
4595 { "General (G)", "pcep.obj.monitoring.flags.g",
4596 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_OBJ_MONITORING_FLAGS_G,
4597 NULL, HFILL }
4598 },
4599 { &hf_pcep_obj_monitoring_flags_p,
4600 { "Processing Time (P)", "pcep.obj.monitoring.flags.p",
4601 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_OBJ_MONITORING_FLAGS_P,
4602 NULL, HFILL }
4603 },
4604 { &hf_pcep_obj_monitoring_flags_c,
4605 { "Overload (C)", "pcep.obj.monitoring.flags.c",
4606 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_OBJ_MONITORING_FLAGS_C,
4607 NULL, HFILL }
4608 },
4609 { &hf_pcep_obj_monitoring_flags_i,
4610 { "Incomplete (I)", "pcep.obj.monitoring.flags.i",
4611 FT_BOOLEAN, 24, TFS(&tfs_set_notset), PCEP_OBJ_MONITORING_FLAGS_I,
4612 NULL, HFILL }
4613 },
4614 { &hf_pcep_obj_monitoring_monitoring_id_number,
4615 { "Monitoring ID Number", "pcep.obj.monitoring.monidnumber",
4616 FT_UINT32, BASE_DEC, NULL, 0x0,
4617 NULL, HFILL }
4618 },
4619
4620 { &hf_PCEPF_OBJ_PCC_ID_REQ,
4621 { "PCC-ID-REQ object", "pcep.obj.pccidreq",
4622 FT_NONE, BASE_NONE, NULL, 0x0,
4623 NULL, HFILL }
4624 },
4625 { &hf_pcep_obj_pcc_id_req_ipv4,
4626 { "IPv4 address", "pcep.obj.pccidreq.ipv4",
4627 FT_IPv4, BASE_NONE, NULL, 0x0,
4628 NULL, HFILL }
4629 },
4630 { &hf_pcep_obj_pcc_id_req_ipv6,
4631 { "IPv6 address", "pcep.obj.pccidreq.ipv6",
4632 FT_IPv6, BASE_NONE, NULL, 0x0,
4633 NULL, HFILL }
4634 },
4635
4636 { &hf_PCEPF_OBJ_OF,
4637 { "OBJECTIVE FUNCTION object (OF)", "pcep.obj.of",
4638 FT_NONE, BASE_NONE, NULL, 0x0,
4639 NULL, HFILL }
4640 },
4641
4642 { &hf_PCEPF_OBJ_PCE_ID,
4643 { "PCE-ID object", "pcep.obj.pceid",
4644 FT_NONE, BASE_NONE, NULL, 0x0,
4645 NULL, HFILL }
4646 },
4647 { &hf_pcep_obj_pce_id_ipv4,
4648 { "IPv4 address", "pcep.obj.pceid.ipv4",
4649 FT_IPv4, BASE_NONE, NULL, 0x0,
4650 NULL, HFILL }
4651 },
4652 { &hf_pcep_obj_pce_id_ipv6,
4653 { "IPv6 address", "pcep.obj.pceid.ipv6",
4654 FT_IPv6, BASE_NONE, NULL, 0x0,
4655 NULL, HFILL }
4656 },
4657
4658 { &hf_PCEPF_OBJ_PROC_TIME,
4659 { "PROC-TIME object", "pcep.obj.proctime",
4660 FT_NONE, BASE_NONE, NULL, 0x0,
4661 NULL, HFILL }
4662 },
4663 { &hf_pcep_obj_proc_time_flags_reserved,
4664 { "Reserved Flags", "pcep.obj.proctime.flags.reserved",
4665 FT_BOOLEAN, 16, TFS(&tfs_set_notset), PCEP_OBJ_PROC_TIME_FLAGS_RESERVED,
4666 NULL, HFILL }
4667 },
4668 { &hf_pcep_obj_proc_time_flags_e,
4669 { "Estimated (E)", "pcep.obj.proctime.flags.e",
4670 FT_BOOLEAN, 16, TFS(&tfs_set_notset), PCEP_OBJ_PROC_TIME_FLAGS_E,
4671 NULL, HFILL }
4672 },
4673 { &hf_pcep_obj_proc_time_cur_proc_time,
4674 { "Current processing time", "pcep.obj.proctime.curproctime",
4675 FT_UINT32, BASE_DEC, NULL, 0x0,
4676 NULL, HFILL }
4677 },
4678 { &hf_pcep_obj_proc_time_min_proc_time,
4679 { "Minimum processing time", "pcep.obj.proctime.minproctime",
4680 FT_UINT32, BASE_DEC, NULL, 0x0,
4681 NULL, HFILL }
4682 },
4683 { &hf_pcep_obj_proc_time_max_proc_time,
4684 { "Maximum processing time", "pcep.obj.proctime.maxproctime",
4685 FT_UINT32, BASE_DEC, NULL, 0x0,
4686 NULL, HFILL }
4687 },
4688 { &hf_pcep_obj_proc_time_ave_proc_time,
4689 { "Average processing time", "pcep.obj.proctime.aveproctime",
4690 FT_UINT32, BASE_DEC, NULL, 0x0,
4691 NULL, HFILL }
4692 },
4693 { &hf_pcep_obj_proc_time_var_proc_time,
4694 { "Variance processing time", "pcep.obj.proctime.varproctime",
4695 FT_UINT32, BASE_DEC, NULL, 0x0,
4696 NULL, HFILL }
4697 },
4698
4699 { &hf_PCEPF_OBJ_OVERLOAD,
4700 { "OVERLOAD object", "pcep.obj.overload",
4701 FT_NONE, BASE_NONE, NULL, 0x0,
4702 NULL, HFILL }
4703 },
4704 { &hf_pcep_obj_overload_duration,
4705 { "Overload Duration", "pcep.obj.overload.duration",
4706 FT_UINT16, BASE_DEC, NULL, 0x0,
4707 NULL, HFILL }
4708 },
4709
4710 { &hf_PCEPF_OBJ_UNREACH_DESTINATION,
4711 { "UNREACH-DESTINATION object", "pcep.obj.unreach-destination",
4712 FT_NONE, BASE_NONE, NULL, 0x0,
4713 NULL, HFILL }
4714 },
4715
4716 { &hf_pcep_unreach_destination_obj_ipv4_address,
4717 { "Destination IPv4 Address", "pcep.obj.unreach-destination.ipv4-addr",
4718 FT_IPv4, BASE_NONE, NULL, 0x0,
4719 NULL, HFILL }
4720 },
4721
4722 { &hf_pcep_unreach_destination_obj_ipv6_address,
4723 { "Destination IPv6 address", "pcep.obj.unreach-destination.ipv6-addr",
4724 FT_IPv6, BASE_NONE, NULL, 0x0,
4725 NULL, HFILL }
4726 },
4727
4728 { &hf_PCEPF_OBJ_BRANCH_NODE_CAPABILITY,
4729 { "Branch Node Capability object", "pcep.obj.branch-node-capability",
4730 FT_NONE, BASE_NONE, NULL, 0x0,
4731 NULL, HFILL }
4732 },
4733
4734 { &hf_PCEPF_OBJ_LSP,
4735 { "LSP object", "pcep.obj.lsp",
4736 FT_NONE, BASE_NONE, NULL, 0x0,
4737 NULL, HFILL }
4738 },
4739
4740 { &hf_PCEPF_OBJ_SRP,
4741 { "SRP object", "pcep.obj.srp",
4742 FT_NONE, BASE_NONE, NULL, 0x0,
4743 NULL, HFILL }
4744 },
4745
4746 { &hf_PCEPF_OBJ_VENDOR_INFORMATION,
4747 { "VENDOR-INFORMATION object", "pcep.obj.vendor-information",
4748 FT_NONE, BASE_NONE, NULL, 0x0,
4749 NULL, HFILL }
4750 },
4751
4752 { &hf_PCEPF_OBJ_BU,
4753 { "BU object", "pcep.obj.bu",
4754 FT_NONE, BASE_NONE, NULL, 0x0,
4755 NULL, HFILL }
4756 },
4757
4758 { &hf_PCEPF_OBJ_ASSOCIATION,
4759 { "ASSOCIATION object", "pcep.obj.association",
4760 FT_NONE, BASE_NONE, NULL, 0x0,
4761 NULL, HFILL }
4762 },
4763
4764 { &hf_PCEPF_OBJ_UNKNOWN_TYPE,
4765 { "Unknown object", "pcep.obj.unknown",
4766 FT_NONE, BASE_NONE, NULL, 0x0,
4767 NULL, HFILL }
4768 },
4769
4770 /*Subobjects*/
4771 { &hf_PCEPF_SUBOBJ,
4772 { "Type", "pcep.subobj",
4773 FT_UINT8, BASE_DEC, VALS(pcep_subobj_vals), 0,
4774 NULL, HFILL }
4775 },
4776 { &hf_PCEPF_SUBOBJ_7F,
4777 { "Type", "pcep.subobj",
4778 FT_UINT8, BASE_DEC, VALS(pcep_subobj_vals), 0x7F,
4779 NULL, HFILL }
4780 },
4781
4782 { &hf_PCEPF_SUBOBJ_IPv4,
4783 { "SUBOBJECT: IPv4 Prefix", "pcep.subobj.ipv4",
4784 FT_NONE, BASE_NONE, NULL, 0x0,
4785 NULL, HFILL }
4786 },
4787 { &hf_PCEPF_SUBOBJ_IPv6,
4788 { "SUBOBJECT: IPv6 Prefix", "pcep.subobj.ipv6",
4789 FT_NONE, BASE_NONE, NULL, 0x0,
4790 NULL, HFILL }
4791 },
4792 { &hf_PCEPF_SUBOBJ_LABEL_CONTROL,
4793 { "SUBOBJECT: Label Control", "pcep.subobj.label.control",
4794 FT_NONE, BASE_NONE, NULL, 0x0,
4795 NULL, HFILL }
4796 },
4797 { &hf_PCEPF_SUBOBJ_UNNUM_INTERFACEID,
4798 { "SUBOBJECT: Unnumbered Interface ID", "pcep.subobj.unnum.interfaceid",
4799 FT_NONE, BASE_NONE, NULL, 0x0,
4800 NULL, HFILL }
4801 },
4802 { &hf_PCEPF_SUBOBJ_AUTONOMOUS_SYS_NUM,
4803 { "SUBOBJECT: Autonomous System Number", "pcep.subobj.autonomous.sys.num",
4804 FT_NONE, BASE_NONE, NULL, 0x0,
4805 NULL, HFILL }
4806 },
4807 { &hf_PCEPF_SUBOBJ_SRLG,
4808 { "SUBOBJECT: SRLG", "pcep.subobj.srlg",
4809 FT_NONE, BASE_NONE, NULL, 0x0,
4810 NULL, HFILL }
4811 },
4812 { &hf_PCEPF_SUBOBJ_EXRS,
4813 { "SUBOBJECT: EXRS", "pcep.subobj.exrs",
4814 FT_NONE, BASE_NONE, NULL, 0x0,
4815 NULL, HFILL }
4816 },
4817 { &hf_PCEPF_SUBOBJ_PKSv4,
4818 { "SUBOBJECT: Path Key (IPv4)", "pcep.subobj.path_key.ipv4",
4819 FT_NONE, BASE_NONE, NULL, 0x0,
4820 NULL, HFILL }
4821 },
4822 { &hf_PCEPF_SUBOBJ_PKSv6,
4823 { "SUBOBJECT: Path Key (IPv6)", "pcep.subobj.path_key.ipv6",
4824 FT_NONE, BASE_NONE, NULL, 0x0,
4825 NULL, HFILL }
4826 },
4827 { &hf_PCEPF_SUBOBJ_XRO,
4828 { "Type", "pcep.subobj.label",
4829 FT_UINT32, BASE_DEC, VALS(pcep_subobj_xro_vals), 0x7F,
4830 NULL, HFILL }
4831 },
4832 { &hf_pcep_xro_flags_f,
4833 { "Fail (F)", "pcep.xro.flags.f",
4834 FT_BOOLEAN, 16, TFS(&tfs_set_notset), PCEP_XRO_F,
4835 NULL, HFILL }
4836 },
4837 #if 0
4838 { &hf_PCEPF_SUB_XRO_ATTRIB,
4839 { "Attribute", "pcep.xro.sub.attribute",
4840 FT_UINT32, BASE_DEC, VALS(pcep_xro_attribute_obj_vals), 0x0,
4841 NULL, HFILL }
4842 },
4843 #endif
4844 { &pcep_subobj_flags_lpa,
4845 { "Local Protection Available", "pcep.subobj.flags.lpa",
4846 FT_BOOLEAN, 8, TFS(&tfs_set_notset), PCEP_SUB_LPA,
4847 NULL, HFILL }
4848 },
4849 { &pcep_subobj_flags_lpu,
4850 { "Local protection in Use", "pcep.subobj.flags.lpu",
4851 FT_BOOLEAN, 8, TFS(&tfs_set_notset), PCEP_SUB_LPU,
4852 NULL, HFILL }
4853 },
4854
4855 { &pcep_subobj_label_flags_gl,
4856 { "Global Label", "pcep.subobj.label.flags.gl",
4857 FT_BOOLEAN, 8, TFS(&tfs_set_notset), PCEP_SUB_LABEL_GL,
4858 NULL, HFILL }
4859 },
4860 { &hf_pcep_no_path_tlvs_pce,
4861 { "PCE currently unavailable", "pcep.no_path_tlvs.pce",
4862 FT_BOOLEAN, 32, TFS(&tfs_true_false), 0x0001,
4863 NULL, HFILL }
4864 },
4865 { &hf_pcep_no_path_tlvs_unk_dest,
4866 { "Unknown destination", "pcep.no_path_tlvs.unk_dest",
4867 FT_BOOLEAN, 32, TFS(&tfs_true_false), 0x0002,
4868 NULL, HFILL }
4869 },
4870 { &hf_pcep_no_path_tlvs_unk_src,
4871 { "Unknown source", "pcep.no_path_tlvs.unk_src",
4872 FT_BOOLEAN, 32, TFS(&tfs_true_false), 0x0004,
4873 NULL, HFILL }
4874 },
4875 { &hf_pcep_no_path_tlvs_brpc,
4876 { "BRPC Path computation chain unavailable", "pcep.no_path_tlvs.brpc",
4877 FT_BOOLEAN, 32, TFS(&tfs_true_false), 0x0008,
4878 NULL, HFILL }
4879 },
4880 { &hf_pcep_no_path_tlvs_pks,
4881 { "PKS expansion failure", "pcep.no_path_tlvs.pks",
4882 FT_BOOLEAN, 32, TFS(&tfs_true_false), 0x0010,
4883 NULL, HFILL }
4884 },
4885 { &hf_pcep_no_path_tlvs_no_gco_migr,
4886 { "No GCO migration path found", "pcep.no_path_tlvs.no_gco_migr",
4887 FT_BOOLEAN, 32, TFS(&tfs_true_false), 0x0020,
4888 NULL, HFILL }
4889 },
4890 { &hf_pcep_no_path_tlvs_no_gco_soln,
4891 { "No GCO solution found", "pcep.no_path_tlvs.no_gco_soln",
4892 FT_BOOLEAN, 32, TFS(&tfs_true_false), 0x0040,
4893 NULL, HFILL }
4894 },
4895 { &hf_pcep_no_path_tlvs_p2mp,
4896 { "P2MP Reachability Problem", "pcep.no_path_tlvs.p2mp",
4897 FT_BOOLEAN, 32, TFS(&tfs_true_false), 0x0080,
4898 NULL, HFILL }
4899 },
4900 { &hf_pcep_stateful_pce_capability_flags,
4901 { "Flags", "pcep.stateful-pce-capability.flags",
4902 FT_UINT32, BASE_HEX, NULL, 0x0,
4903 NULL, HFILL }
4904 },
4905
4906 { &hf_pcep_lsp_update_capability,
4907 { "LSP-UPDATE-CAPABILITY (U)", "pcep.stateful-pce-capability.lsp-update",
4908 FT_BOOLEAN, 32, TFS(&tfs_true_false), PCEP_TLV_STATEFUL_PCE_CAPABILITY_U,
4909 NULL, HFILL }
4910 },
4911 { &hf_pcep_include_db_version,
4912 { "INCLUDE-DB-VERSION (S)", "pcep.sync-capability.include-db-version",
4913 FT_BOOLEAN, 32, TFS(&tfs_true_false), PCEP_TLV_STATEFUL_PCE_CAPABILITY_S,
4914 NULL, HFILL }
4915 },
4916 { &hf_pcep_lsp_instantiation_capability,
4917 { "LSP-INSTANTIATION-CAPABILITY (I)", "pcep.stateful-pce-capability.lsp-instantiation",
4918 FT_BOOLEAN, 32, TFS(&tfs_true_false), PCEP_TLV_STATEFUL_PCE_CAPABILITY_I,
4919 NULL, HFILL }
4920 },
4921 { &hf_pcep_triggered_resync,
4922 { "TRIGGERED-RESYNC (T)", "pcep.stateful-pce-capability.triggered-resync",
4923 FT_BOOLEAN, 32, TFS(&tfs_true_false), PCEP_TLV_STATEFUL_PCE_CAPABILITY_T,
4924 NULL, HFILL }
4925 },
4926 { &hf_pcep_delta_lsp_sync_capability,
4927 { "DELTA-LSP-SYNC-CAPABILITY (D)", "pcep.stateful-pce-capability.delta-lsp-sync",
4928 FT_BOOLEAN, 32, TFS(&tfs_true_false), PCEP_TLV_STATEFUL_PCE_CAPABILITY_D,
4929 NULL, HFILL }
4930 },
4931 { &hf_pcep_triggered_initial_sync,
4932 { "TRIGGERED-INITIAL-SYNC (F)", "pcep.stateful-pce-capability.triggered-initial-sync",
4933 FT_BOOLEAN, 32, TFS(&tfs_true_false), PCEP_TLV_STATEFUL_PCE_CAPABILITY_F,
4934 NULL, HFILL }
4935 },
4936 { &hf_pcep_sr_pce_capability_reserved,
4937 { "Reserved", "pcep.tlv.sr-pce-capability.reserved",
4938 FT_UINT16, BASE_HEX, NULL, 0x0,
4939 NULL, HFILL }
4940 },
4941 { &hf_pcep_sr_pce_capability_sub_tlv_reserved,
4942 { "Reserved", "pcep.sub-tlv.sr-pce-capability.reserved",
4943 FT_UINT16, BASE_HEX, NULL, 0x0,
4944 NULL, HFILL }
4945 },
4946 // DEPRECATED
4947 { &hf_pcep_sr_pce_capability_flags,
4948 { "Flags", "pcep.tlv.sr-pce-capability.flags",
4949 FT_UINT8, BASE_HEX, NULL, 0x0,
4950 NULL, HFILL }
4951 },
4952 { &hf_pcep_sr_pce_capability_sub_tlv_flags,
4953 { "Flags", "pcep.sub-tlv.sr-pce-capability.flags",
4954 FT_UINT8, BASE_HEX, NULL, 0x0,
4955 NULL, HFILL }
4956 },
4957 // DEPRECATED
4958 // leave for backwards compatibility
4959 { &hf_pcep_sr_pce_capability_flags_l,
4960 { "L-flag", "pcep.tlv.sr-pce-capability.flags.l",
4961 FT_BOOLEAN, 8, TFS(&tfs_set_notset), PCEP_TLV_SR_PCE_CAPABILITY_L,
4962 NULL, HFILL }
4963 },
4964 { &hf_pcep_sr_pce_capability_sub_tlv_flags_n,
4965 { "Node or Adjacency Identifier (NAI) is supported (N)", "pcep.sub-tlv.sr-pce-capability.flags.n",
4966 FT_BOOLEAN, 7, TFS(&tfs_set_notset), PCEP_TLV_SR_PCE_CAPABILITY_L,
4967 NULL, HFILL }
4968 },
4969 { &hf_pcep_sr_pce_capability_sub_tlv_flags_x,
4970 { "Unlimited Maximum SID Depth (X)", "pcep.sub-tlv.sr-pce-capability.flags.x",
4971 FT_BOOLEAN, 8, TFS(&tfs_set_notset), PCEP_TLV_SR_PCE_CAPABILITY_L,
4972 NULL, HFILL }
4973 },
4974 // SR-PCE CAPABILITY TLV is deprecated
4975 // leave for backwards compatibility
4976 { &hf_pcep_sr_pce_capability_msd,
4977 { "MSD", "pcep.tlv.sr-pce-capability.msd",
4978 FT_UINT8, BASE_DEC, NULL, 0x0,
4979 "MSD (Maximum SID Depth)", HFILL }
4980 },
4981 { &hf_pcep_sr_pce_capability_sub_tlv_msd,
4982 { "MSD", "pcep.sub-tlv.sr-pce-capability.msd",
4983 FT_UINT8, BASE_DEC, NULL, 0x0,
4984 "MSD (Maximum SID Depth)", HFILL }
4985 },
4986 { &hf_pcep_path_setup_type_reserved24,
4987 { "Reserved", "pcep.pst.reserved",
4988 FT_UINT24, BASE_HEX, NULL, 0x0,
4989 NULL, HFILL }
4990 },
4991 { &hf_pcep_path_setup_type,
4992 { "Path Setup Type", "pcep.pst",
4993 FT_UINT8, BASE_DEC, VALS(pcep_pst_vals), 0x0,
4994 NULL, HFILL }
4995 },
4996 { &hf_pcep_path_setup_type_capability_reserved24,
4997 { "Reserved", "pcep.pst_capability.reserved",
4998 FT_UINT24, BASE_HEX, NULL, 0x0,
4999 NULL, HFILL }
5000 },
5001 { &hf_pcep_path_setup_type_capability_psts,
5002 { "Path Setup Types", "pcep.pst_capability.psts",
5003 FT_UINT8, BASE_DEC, NULL, 0x0,
5004 NULL, HFILL }
5005 },
5006 { &hf_pcep_path_setup_type_capability_pst,
5007 { "Path Setup Type", "pcep.pst_capability.pst",
5008 FT_UINT8, BASE_DEC, VALS(pcep_pst_vals), 0x0,
5009 NULL, HFILL }
5010 },
5011 { &hf_PCEPF_SUBOBJ_SR,
5012 { "SR", "pcep.subobj.sr",
5013 FT_NONE, BASE_NONE, NULL, 0x0,
5014 "Segment Routing (SR)", HFILL }
5015 },
5016 { &hf_pcep_subobj_sr_l,
5017 { "L", "pcep.subobj.sr.l",
5018 FT_UINT8, BASE_DEC, VALS(pcep_route_l_obj_vals), Mask_L,
5019 NULL, HFILL }
5020 },
5021 { &hf_pcep_subobj_sr_length,
5022 { "Length", "pcep.subobj.sr.length",
5023 FT_UINT8, BASE_DEC, NULL, 0x0,
5024 NULL, HFILL }
5025 },
5026 { &hf_pcep_subobj_sr_nt,
5027 { "NAI Type", "pcep.subobj.sr.st",
5028 FT_UINT8, BASE_DEC, VALS(pcep_sr_nt_vals), 0xF0,
5029 NULL, HFILL }
5030 },
5031 { &hf_pcep_subobj_sr_flags,
5032 { "Flags", "pcep.subobj.sr.flags",
5033 FT_UINT16, BASE_HEX, NULL, 0x0FFF,
5034 NULL, HFILL }
5035 },
5036 { &hf_pcep_subobj_sr_flags_m,
5037 { "SID specifies an MPLS label (M)", "pcep.subobj.sr.flags.m",
5038 FT_BOOLEAN, 12, TFS(&tfs_set_notset), PCEP_SUBOBJ_SR_FLAGS_M,
5039 NULL, HFILL }
5040 },
5041 { &hf_pcep_subobj_sr_flags_c,
5042 { "SID specifies TC, S, and TTL in addition to an MPLS label (C)", "pcep.subobj.sr.flags.c",
5043 FT_BOOLEAN, 12, TFS(&tfs_set_notset), PCEP_SUBOBJ_SR_FLAGS_C,
5044 NULL, HFILL }
5045 },
5046 { &hf_pcep_subobj_sr_flags_s,
5047 { "SID is absent (S)", "pcep.subobj.sr.flags.s",
5048 FT_BOOLEAN, 12, TFS(&tfs_set_notset), PCEP_SUBOBJ_SR_FLAGS_S,
5049 NULL, HFILL }
5050 },
5051 { &hf_pcep_subobj_sr_flags_f,
5052 { "NAI is absent (F)", "pcep.subobj.sr.flags.f",
5053 FT_BOOLEAN, 12, TFS(&tfs_set_notset), PCEP_SUBOBJ_SR_FLAGS_F,
5054 NULL, HFILL }
5055 },
5056 { &hf_pcep_subobj_sr_sid,
5057 { "SID", "pcep.subobj.sr.sid",
5058 FT_UINT32, BASE_DEC, NULL, 0x0,
5059 NULL, HFILL }
5060 },
5061 { &hf_pcep_subobj_sr_sid_label,
5062 { "SID/Label", "pcep.subobj.sr.sid.label",
5063 FT_UINT32, BASE_DEC, NULL, 0xfffff000,
5064 "SID represent MPLS Label stack: Label", HFILL }
5065 },
5066 { &hf_pcep_subobj_sr_sid_tc,
5067 {"SID/TC", "pcep.subobj.sr.sid.tc",
5068 FT_UINT32, BASE_DEC, NULL, 0x00000E00,
5069 "SID represent MPLS Label stack: Traffic Class field", HFILL }
5070 },
5071 { &hf_pcep_subobj_sr_sid_s,
5072 {"SID/S", "pcep.subobj.sr.sid.s",
5073 FT_UINT32, BASE_DEC, NULL, 0x00000100,
5074 "SID represent MPLS Label stack: Bottom of Stack", HFILL }
5075 },
5076 { &hf_pcep_subobj_sr_sid_ttl,
5077 {"SID/TTL", "pcep.subobj.sr.sid.ttl",
5078 FT_UINT32, BASE_DEC, NULL, 0x0000000FF,
5079 "SID represent MPLS Label stack: Time to Live", HFILL }
5080 },
5081 { &hf_pcep_subobj_sr_nai_ipv4_node,
5082 { "NAI (IPv4 Node ID)", "pcep.subobj.sr.nai.ipv4node",
5083 FT_IPv4, BASE_NONE, NULL, 0x0,
5084 NULL, HFILL }
5085 },
5086 { &hf_pcep_subobj_sr_nai_ipv6_node,
5087 { "NAI (IPv6 Node ID)", "pcep.subobj.sr.nai.ipv6node",
5088 FT_IPv6, BASE_NONE, NULL, 0x0,
5089 NULL, HFILL }
5090 },
5091 { &hf_pcep_subobj_sr_nai_local_ipv4_addr,
5092 { "Local IPv4 address", "pcep.subobj.sr.nai.localipv4addr",
5093 FT_IPv4, BASE_NONE,
5094 NULL, 0x0, NULL, HFILL }
5095 },
5096 { &hf_pcep_subobj_sr_nai_remote_ipv4_addr,
5097 { "Remote IPv4 address", "pcep.subobj.sr.nai.remoteipv4addr",
5098 FT_IPv4, BASE_NONE,
5099 NULL, 0x0, NULL, HFILL }
5100 },
5101 { &hf_pcep_subobj_sr_nai_local_ipv6_addr,
5102 { "Local IPv6 address", "pcep.subobj.sr.nai.localipv6addr",
5103 FT_IPv6, BASE_NONE,
5104 NULL, 0x0, NULL, HFILL }
5105 },
5106 { &hf_pcep_subobj_sr_nai_remote_ipv6_addr,
5107 { "Remote IPv6 address", "pcep.subobj.sr.nai.remoteipv6addr",
5108 FT_IPv6, BASE_NONE,
5109 NULL, 0x0, NULL, HFILL }
5110 },
5111 { &hf_pcep_subobj_sr_nai_local_node_id,
5112 { "Local Node-ID", "pcep.subobj.sr.nai.localnodeid",
5113 FT_UINT32, BASE_DEC,
5114 NULL, 0x0, NULL, HFILL }
5115 },
5116 { &hf_pcep_subobj_sr_nai_local_interface_id,
5117 { "Local Interface ID", "pcep.subobj.sr.nai.localinterfaceid",
5118 FT_UINT32, BASE_DEC,
5119 NULL, 0x0, NULL, HFILL }
5120 },
5121 { &hf_pcep_subobj_sr_nai_remote_node_id,
5122 { "Remote Node-ID", "pcep.subobj.sr.nai.remotenodeid",
5123 FT_UINT32, BASE_DEC,
5124 NULL, 0x0, NULL, HFILL }
5125 },
5126 { &hf_pcep_subobj_sr_nai_remote_interface_id,
5127 { "Remote Interface ID", "pcep.subobj.sr.nai.remoteinterfaceid",
5128 FT_UINT32, BASE_DEC,
5129 NULL, 0x0, NULL, HFILL }
5130 },
5131
5132 /* Generated from convert_proto_tree_add_text.pl */
5133 { &hf_pcep_tlv_type,
5134 { "Type", "pcep.tlv.type",
5135 FT_UINT16, BASE_DEC, VALS(pcep_tlvs_vals), 0x0,
5136 NULL, HFILL }
5137 },
5138 { &hf_pcep_tlv_length,
5139 { "Length", "pcep.tlv.length",
5140 FT_UINT16, BASE_DEC, NULL, 0x0,
5141 NULL, HFILL }
5142 },
5143 { &hf_pcep_request_id,
5144 { "Request-ID", "pcep.request_id",
5145 FT_UINT32, BASE_DEC, NULL, 0x0,
5146 NULL, HFILL }
5147 },
5148 { &hf_pcep_tlv_data,
5149 { "Data", "pcep.tlv.data",
5150 FT_BYTES, BASE_NONE, NULL, 0x0,
5151 NULL, HFILL }
5152 },
5153 { &hf_pcep_tlv_padding,
5154 { "Padding", "pcep.tlv.padding",
5155 FT_BYTES, BASE_NONE, NULL, 0x0,
5156 NULL, HFILL }
5157 },
5158 { &hf_pcep_subobj_ipv4_length,
5159 { "Length", "pcep.subobj.ipv4.length",
5160 FT_UINT8, BASE_DEC, NULL, 0x0,
5161 NULL, HFILL }
5162 },
5163 { &hf_pcep_subobj_ipv4_ipv4,
5164 { "IPv4 Address", "pcep.subobj.ipv4.ipv4",
5165 FT_IPv4, BASE_NONE, NULL, 0x0,
5166 NULL, HFILL }
5167 },
5168 { &hf_pcep_subobj_ipv4_prefix_length,
5169 { "Prefix Length", "pcep.subobj.ipv4.prefix_length",
5170 FT_UINT8, BASE_DEC, NULL, 0x0,
5171 NULL, HFILL }
5172 },
5173 { &hf_pcep_subobj_ipv4_padding,
5174 { "Padding", "pcep.subobj.ipv4.padding",
5175 FT_UINT8, BASE_HEX, NULL, 0x0,
5176 NULL, HFILL }
5177 },
5178 { &hf_pcep_subobj_ipv4_flags,
5179 { "Flags", "pcep.subobj.ipv4.flags",
5180 FT_UINT8, BASE_HEX, NULL, 0x0,
5181 NULL, HFILL }
5182 },
5183 { &hf_pcep_subobj_ipv4_attribute,
5184 { "Attribute", "pcep.subobj.ipv4.attribute",
5185 FT_UINT8, BASE_DEC, VALS(pcep_xro_attribute_obj_vals), 0x0,
5186 NULL, HFILL }
5187 },
5188 { &hf_pcep_subobj_ipv6_length,
5189 { "Length", "pcep.subobj.ipv6.length",
5190 FT_UINT8, BASE_DEC, NULL, 0x0,
5191 NULL, HFILL }
5192 },
5193 { &hf_pcep_subobj_ipv6_ipv6,
5194 { "IPv6 Address", "pcep.subobj.ipv6.ipv6",
5195 FT_IPv6, BASE_NONE, NULL, 0x0,
5196 NULL, HFILL }
5197 },
5198 { &hf_pcep_subobj_ipv6_prefix_length,
5199 { "Prefix Length", "pcep.subobj.ipv6.prefix_length",
5200 FT_UINT8, BASE_DEC, NULL, 0x0,
5201 NULL, HFILL }
5202 },
5203 { &hf_pcep_subobj_ipv6_padding,
5204 { "Padding", "pcep.subobj.ipv6.padding",
5205 FT_UINT8, BASE_HEX, NULL, 0x0,
5206 NULL, HFILL }
5207 },
5208 { &hf_pcep_subobj_ipv6_flags,
5209 { "Flags", "pcep.subobj.ipv6.flags",
5210 FT_UINT8, BASE_HEX, NULL, 0x0,
5211 NULL, HFILL }
5212 },
5213 { &hf_pcep_subobj_ipv6_attribute,
5214 { "Attribute", "pcep.attribute",
5215 FT_UINT8, BASE_DEC, VALS(pcep_xro_attribute_obj_vals), 0x0,
5216 NULL, HFILL }
5217 },
5218 { &hf_pcep_subobj_label_control_length,
5219 { "Length", "pcep.subobj.label_control.length",
5220 FT_UINT8, BASE_DEC, NULL, 0x0,
5221 NULL, HFILL }
5222 },
5223 { &hf_pcep_subobj_label_control_u,
5224 { "U", "pcep.subobj.label_control.u",
5225 FT_UINT8, BASE_DEC, VALS(pcep_route_u_obj_vals), 0x80,
5226 NULL, HFILL }
5227 },
5228 { &hf_pcep_subobj_label_control_reserved,
5229 { "Reserved", "pcep.subobj.label_control.reserved",
5230 FT_UINT8, BASE_DEC, NULL, 0x7F,
5231 NULL, HFILL }
5232 },
5233 { &hf_pcep_subobj_label_control_c_type,
5234 { "C-Type", "pcep.subobj.label_control.c_type",
5235 FT_UINT8, BASE_DEC, NULL, 0x0,
5236 NULL, HFILL }
5237 },
5238 { &hf_pcep_subobj_label_control_label,
5239 { "Label", "pcep.subobj.label_control.label",
5240 FT_BYTES, BASE_NONE, NULL, 0x0,
5241 NULL, HFILL }
5242 },
5243 { &hf_pcep_subobj_label_control_flags,
5244 { "Flags", "pcep.subobj.label_control.flags",
5245 FT_UINT8, BASE_HEX, NULL, 0x7F,
5246 NULL, HFILL }
5247 },
5248 { &hf_pcep_subobj_unnumb_interfaceID_length,
5249 { "Length", "pcep.subobj.unnumb_interfaceID.length",
5250 FT_UINT8, BASE_DEC, NULL, 0x0,
5251 NULL, HFILL }
5252 },
5253 { &hf_pcep_subobj_unnumb_interfaceID_reserved,
5254 { "Reserved", "pcep.subobj.unnumb_interfaceID.reserved",
5255 FT_UINT16, BASE_HEX, NULL, 0x0,
5256 NULL, HFILL }
5257 },
5258 { &hf_pcep_subobj_unnumb_interfaceID_flags,
5259 { "Flags", "pcep.subobj.unnumb_interfaceID.flags",
5260 FT_UINT16, BASE_HEX, NULL, 0xFF00,
5261 NULL, HFILL }
5262 },
5263 { &hf_pcep_subobj_unnumb_interfaceID_reserved_rrobj,
5264 { "Reserved", "pcep.subobj.unnumb_interfaceID.reserved",
5265 FT_UINT16, BASE_HEX, NULL, 0x00FF,
5266 NULL, HFILL }
5267 },
5268 { &hf_pcep_subobj_unnumb_interfaceID_reserved_xroobj,
5269 { "Reserved", "pcep.subobj.unnumb_interfaceID.reserved",
5270 FT_UINT8, BASE_HEX, NULL, 0x0,
5271 NULL, HFILL }
5272 },
5273 { &hf_pcep_subobj_unnumb_interfaceID_attribute,
5274 { "Attribute", "pcep.subobj.unnumb_interfaceID.attribute",
5275 FT_UINT8, BASE_DEC, VALS(pcep_xro_attribute_obj_vals), 0x0,
5276 NULL, HFILL }
5277 },
5278 { &hf_pcep_subobj_unnumb_interfaceID_router_id,
5279 { "Router ID", "pcep.subobj.unnumb_interfaceID.router_id",
5280 FT_IPv4, BASE_NONE, NULL, 0x0,
5281 NULL, HFILL }
5282 },
5283 { &hf_pcep_subobj_unnumb_interfaceID_interface_id,
5284 { "Interface ID", "pcep.subobj.unnumb_interfaceID.interface_id",
5285 FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
5286 NULL, HFILL }
5287 },
5288 { &hf_pcep_subobj_autonomous_sys_num_length,
5289 { "Length", "pcep.subobj.autonomous_sys_num.length",
5290 FT_UINT8, BASE_DEC, NULL, 0x0,
5291 NULL, HFILL }
5292 },
5293 { &hf_pcep_subobj_autonomous_sys_num_reserved,
5294 { "Reserved", "pcep.subobj.autonomous_sys_num.reserved",
5295 FT_UINT8, BASE_HEX, NULL, 0x0,
5296 NULL, HFILL }
5297 },
5298 { &hf_pcep_subobj_autonomous_sys_num_attribute,
5299 { "Attribute", "pcep.subobj.autonomous_sys_num.attribute",
5300 FT_UINT8, BASE_DEC, VALS(pcep_xro_attribute_obj_vals), 0x0,
5301 NULL, HFILL }
5302 },
5303 { &hf_pcep_subobj_autonomous_sys_num_optional_as_number_high_octets,
5304 { "Optional AS Number High Octets", "pcep.subobj.autonomous_sys_num.optional_as_number_high_octets",
5305 FT_UINT16, BASE_HEX, NULL, 0x0,
5306 NULL, HFILL }
5307 },
5308 { &hf_pcep_subobj_autonomous_sys_num_as_number,
5309 { "AS Number", "pcep.subobj.autonomous_sys_num.as_number",
5310 FT_UINT16, BASE_HEX, NULL, 0x0,
5311 NULL, HFILL }
5312 },
5313 { &hf_pcep_subobj_srlg_length,
5314 { "Length", "pcep.subobj.srlg.length",
5315 FT_UINT8, BASE_DEC, NULL, 0x0,
5316 NULL, HFILL }
5317 },
5318 { &hf_pcep_subobj_srlg_id,
5319 { "SRLG ID", "pcep.subobj.srlg.id",
5320 FT_UINT32, BASE_HEX, NULL, 0x0,
5321 NULL, HFILL }
5322 },
5323 { &hf_pcep_subobj_srlg_reserved,
5324 { "Reserved", "pcep.subobj.srlg.reserved",
5325 FT_UINT8, BASE_HEX, NULL, 0x0,
5326 NULL, HFILL }
5327 },
5328 { &hf_pcep_subobj_srlg_attribute,
5329 { "Attribute", "pcep.subobj.srlg.attribute",
5330 FT_UINT8, BASE_DEC, VALS(pcep_xro_attribute_obj_vals), 0x0,
5331 NULL, HFILL }
5332 },
5333 { &hf_pcep_subobj_exrs_length,
5334 { "Length", "pcep.subobj.exrs.length",
5335 FT_UINT8, BASE_DEC, NULL, 0x0,
5336 NULL, HFILL }
5337 },
5338 { &hf_pcep_subobj_exrs_reserved,
5339 { "Reserved", "pcep.subobj.exrs.reserved",
5340 FT_UINT16, BASE_HEX, NULL, 0x0,
5341 NULL, HFILL }
5342 },
5343 { &hf_pcep_subobj_pksv4_length,
5344 { "Length", "pcep.subobj.pksv4.length",
5345 FT_UINT8, BASE_DEC, NULL, 0x0,
5346 NULL, HFILL }
5347 },
5348 { &hf_pcep_subobj_pksv4_path_key,
5349 { "Path Key", "pcep.subobj.pksv4.path_key",
5350 FT_UINT16, BASE_DEC_HEX, NULL, 0x0,
5351 NULL, HFILL }
5352 },
5353 { &hf_pcep_subobj_pksv4_pce_id,
5354 { "PCE ID", "pcep.subobj.pksv4.pce_id",
5355 FT_IPv4, BASE_NONE, NULL, 0x0,
5356 NULL, HFILL }
5357 },
5358 { &hf_pcep_subobj_pksv6_length,
5359 { "Length", "pcep.subobj.pksv6.length",
5360 FT_UINT8, BASE_DEC, NULL, 0x0,
5361 NULL, HFILL }
5362 },
5363 { &hf_pcep_subobj_pksv6_path_key,
5364 { "Path Key", "pcep.subobj.pksv6.path_key",
5365 FT_UINT16, BASE_DEC_HEX, NULL, 0x0,
5366 NULL, HFILL }
5367 },
5368 { &hf_pcep_subobj_pksv6_pce_id,
5369 { "PCE ID", "pcep.subobj.pksv6.pce_id",
5370 FT_IPv6, BASE_NONE, NULL, 0x0,
5371 NULL, HFILL }
5372 },
5373 { &hf_pcep_open_obj_pcep_version,
5374 { "PCEP Version", "pcep.obj.open.pcep_version",
5375 FT_UINT8, BASE_DEC, NULL, 0xE0,
5376 NULL, HFILL }
5377 },
5378 { &hf_pcep_open_obj_flags,
5379 { "Flags", "pcep.obj.open.flags",
5380 FT_UINT8, BASE_HEX, NULL, 0x1F,
5381 NULL, HFILL }
5382 },
5383 { &hf_pcep_open_obj_keepalive,
5384 { "Keepalive", "pcep.obj.open.keepalive",
5385 FT_UINT8, BASE_DEC, NULL, 0x0,
5386 NULL, HFILL }
5387 },
5388 { &hf_pcep_open_obj_deadtime,
5389 { "Deadtime", "pcep.obj.open.deadtime",
5390 FT_UINT8, BASE_DEC, NULL, 0x0,
5391 NULL, HFILL }
5392 },
5393 { &hf_pcep_open_obj_sid,
5394 { "SID", "pcep.obj.open.sid",
5395 FT_UINT8, BASE_DEC, NULL, 0x0,
5396 NULL, HFILL }
5397 },
5398 { &hf_pcep_rp_obj_reserved,
5399 { "Reserved", "pcep.obj.rp.reserved",
5400 FT_UINT8, BASE_HEX, NULL, 0x0,
5401 NULL, HFILL }
5402 },
5403 { &hf_pcep_rp_obj_flags,
5404 { "Flags", "pcep.obj.rp.flags",
5405 FT_UINT24, BASE_HEX, NULL, 0x0,
5406 NULL, HFILL }
5407 },
5408 { &hf_pcep_rp_obj_requested_id_number,
5409 { "Requested ID Number", "pcep.obj.rp.requested_id_number",
5410 FT_UINT32, BASE_HEX, NULL, 0x0,
5411 NULL, HFILL }
5412 },
5413 { &hf_pcep_no_path_obj_flags,
5414 { "Flags", "pcep.obj.no_path.flags",
5415 FT_UINT16, BASE_HEX, NULL, 0x0,
5416 NULL, HFILL }
5417 },
5418 { &hf_pcep_no_path_obj_reserved,
5419 { "Reserved", "pcep.obj.no_path.reserved",
5420 FT_UINT8, BASE_HEX, NULL, 0x0,
5421 NULL, HFILL }
5422 },
5423 { &hf_pcep_end_point_obj_source_ipv4_address,
5424 { "Source IPv4 Address", "pcep.obj.end_point.source_ipv4_address",
5425 FT_IPv4, BASE_NONE, NULL, 0x0,
5426 NULL, HFILL }
5427 },
5428 { &hf_pcep_end_point_obj_destination_ipv4_address,
5429 { "Destination IPv4 Address", "pcep.obj.end_point.destination_ipv4_address",
5430 FT_IPv4, BASE_NONE, NULL, 0x0,
5431 NULL, HFILL }
5432 },
5433 { &hf_pcep_end_point_obj_source_ipv6_address,
5434 { "Source IPv6 Address", "pcep.obj.end_point.source_ipv6_address",
5435 FT_IPv6, BASE_NONE, NULL, 0x0,
5436 NULL, HFILL }
5437 },
5438 { &hf_pcep_end_point_obj_destination_ipv6_address,
5439 { "Destination IPv6 Address", "pcep.obj.end_point.destination_ipv6_address",
5440 FT_IPv6, BASE_NONE, NULL, 0x0,
5441 NULL, HFILL }
5442 },
5443 { &hf_pcep_bandwidth,
5444 { "Bandwidth", "pcep.bandwidth",
5445 FT_FLOAT, BASE_NONE, NULL, 0x0,
5446 NULL, HFILL }
5447 },
5448 { &hf_pcep_metric_obj_reserved,
5449 { "Reserved", "pcep.obj.metric.reserved",
5450 FT_UINT16, BASE_DEC, NULL, 0x0,
5451 NULL, HFILL }
5452 },
5453 { &hf_pcep_metric_obj_flags,
5454 { "Flags", "pcep.obj.metric.flags",
5455 FT_UINT8, BASE_HEX, NULL, 0x0,
5456 NULL, HFILL }
5457 },
5458 { &hf_pcep_metric_obj_type,
5459 { "Type", "pcep.obj.metric.type",
5460 FT_UINT8, BASE_DEC, VALS(pcep_metric_obj_vals), 0x0,
5461 NULL, HFILL }
5462 },
5463 { &hf_pcep_metric_obj_metric_value,
5464 { "Metric Value", "pcep.obj.metric.metric_value",
5465 FT_FLOAT, BASE_NONE, NULL, 0x0,
5466 NULL, HFILL }
5467 },
5468 { &hf_pcep_lspa_obj_exclude_any,
5469 { "Exclude-Any", "pcep.obj.lspa.exclude_any",
5470 FT_UINT32, BASE_HEX, NULL, 0x0,
5471 NULL, HFILL }
5472 },
5473 { &hf_pcep_lspa_obj_include_any,
5474 { "Include-Any", "pcep.obj.lspa.include_any",
5475 FT_UINT32, BASE_HEX, NULL, 0x0,
5476 NULL, HFILL }
5477 },
5478 { &hf_pcep_lspa_obj_include_all,
5479 { "Include-All", "pcep.obj.lspa.include_all",
5480 FT_UINT32, BASE_HEX, NULL, 0x0,
5481 NULL, HFILL }
5482 },
5483 { &hf_pcep_lspa_obj_setup_priority,
5484 { "Setup Priority", "pcep.obj.lspa.setup_priority",
5485 FT_UINT8, BASE_DEC, NULL, 0x0,
5486 NULL, HFILL }
5487 },
5488 { &hf_pcep_lspa_obj_holding_priority,
5489 { "Holding Priority", "pcep.obj.lspa.holding_priority",
5490 FT_UINT8, BASE_DEC, NULL, 0x0,
5491 NULL, HFILL }
5492 },
5493 { &hf_pcep_lspa_obj_flags,
5494 { "Flags", "pcep.obj.lspa.flags",
5495 FT_UINT8, BASE_HEX, NULL, 0x0,
5496 NULL, HFILL }
5497 },
5498 { &hf_pcep_lspa_obj_reserved,
5499 { "Reserved", "pcep.obj.lspa.reserved",
5500 FT_UINT8, BASE_HEX, NULL, 0x0,
5501 NULL, HFILL }
5502 },
5503 { &hf_pcep_svec_obj_reserved,
5504 { "Reserved", "pcep.obj.svec.reserved",
5505 FT_UINT8, BASE_HEX, NULL, 0x0,
5506 NULL, HFILL }
5507 },
5508 { &hf_pcep_svec_obj_flags,
5509 { "Flags", "pcep.obj.svec.flags",
5510 FT_UINT24, BASE_HEX, NULL, 0x0,
5511 NULL, HFILL }
5512 },
5513 { &hf_pcep_svec_obj_request_id_number,
5514 { "Request-ID-Number", "pcep.obj.svec.request_id_number",
5515 FT_UINT32, BASE_DEC, NULL, 0x0,
5516 NULL, HFILL }
5517 },
5518 { &hf_pcep_notification_obj_reserved,
5519 { "Reserved", "pcep.obj.notification.reserved",
5520 FT_UINT8, BASE_HEX, NULL, 0x0,
5521 NULL, HFILL }
5522 },
5523 { &hf_pcep_notification_obj_flags,
5524 { "Flags", "pcep.obj.notification.flags",
5525 FT_UINT8, BASE_HEX, NULL, 0x0,
5526 NULL, HFILL }
5527 },
5528 { &hf_pcep_notification_obj_type,
5529 { "Notification Type", "pcep.obj.notification.type",
5530 FT_UINT8, BASE_DEC, NULL, 0x0,
5531 NULL, HFILL }
5532 },
5533 { &hf_pcep_notification_obj_value,
5534 { "Notification Value", "pcep.obj.notification.value",
5535 FT_UINT8, BASE_HEX, NULL, 0x0,
5536 NULL, HFILL }
5537 },
5538 { &hf_pcep_error_obj_reserved,
5539 { "Reserved", "pcep.obj.error.reserved",
5540 FT_UINT8, BASE_HEX, NULL, 0x0,
5541 NULL, HFILL }
5542 },
5543 { &hf_pcep_error_obj_flags,
5544 { "Flags", "pcep.obj.error.flags",
5545 FT_UINT8, BASE_HEX, NULL, 0x0,
5546 NULL, HFILL }
5547 },
5548 { &hf_pcep_balancing_obj_reserved,
5549 { "Reserved", "pcep.obj.balancing.reserved",
5550 FT_UINT16, BASE_HEX, NULL, 0x0,
5551 NULL, HFILL }
5552 },
5553 { &hf_pcep_balancing_obj_flags,
5554 { "Flags", "pcep.obj.balancing.flags",
5555 FT_UINT8, BASE_HEX, NULL, 0x0,
5556 NULL, HFILL }
5557 },
5558 { &hf_pcep_balancing_obj_maximum_number_of_te_lsps,
5559 { "Maximum Number of TE LSPs", "pcep.obj.balancing.maximum_number_of_te_lsps",
5560 FT_UINT8, BASE_HEX, NULL, 0x0,
5561 NULL, HFILL }
5562 },
5563 { &hf_pcep_balancing_obj_minimum_bandwidth,
5564 { "Minimum Bandwidth", "pcep.obj.balancing.minimum_bandwidth",
5565 FT_UINT32, BASE_HEX, NULL, 0x0,
5566 NULL, HFILL }
5567 },
5568 { &hf_pcep_close_obj_reserved,
5569 { "Reserved", "pcep.obj.close.reserved",
5570 FT_UINT16, BASE_HEX, NULL, 0x0,
5571 NULL, HFILL }
5572 },
5573 { &hf_pcep_close_obj_flags,
5574 { "Flags", "pcep.obj.close.flags",
5575 FT_UINT8, BASE_HEX, NULL, 0x0,
5576 NULL, HFILL }
5577 },
5578 { &hf_pcep_close_obj_reason,
5579 { "Reason", "pcep.obj.close.reason",
5580 FT_UINT8, BASE_DEC, VALS(pcep_close_reason_obj_vals), 0x0,
5581 NULL, HFILL }
5582 },
5583 { &hf_pcep_xro_obj_reserved,
5584 { "Reserved", "pcep.obj.xro.reserved",
5585 FT_UINT16, BASE_HEX, NULL, 0x0,
5586 NULL, HFILL }
5587 },
5588 { &hf_pcep_xro_obj_flags,
5589 { "Flags", "pcep.obj.xro.flags",
5590 FT_UINT16, BASE_HEX, NULL, 0x0,
5591 NULL, HFILL }
5592 },
5593 { &hf_pcep_obj_monitoring_reserved,
5594 { "Reserved", "pcep.obj.monitoring.reserved",
5595 FT_UINT8, BASE_HEX, NULL, 0x0,
5596 NULL, HFILL }
5597 },
5598 { &hf_pcep_obj_monitoring_flags,
5599 { "Flags", "pcep.obj.monitoring.flags",
5600 FT_UINT24, BASE_HEX, NULL, 0x0,
5601 NULL, HFILL }
5602 },
5603 { &hf_pcep_obj_of_code,
5604 { "OF-Code", "pcep.obj.of.code",
5605 FT_UINT16, BASE_DEC, VALS(pcep_of_vals), 0x0,
5606 NULL, HFILL }
5607 },
5608 { &hf_pcep_obj_proc_time_reserved,
5609 { "Reserved", "pcep.obj.proc_time.reserved",
5610 FT_UINT16, BASE_HEX, NULL, 0x0,
5611 NULL, HFILL }
5612 },
5613 { &hf_pcep_obj_proc_time_flags,
5614 { "Flags", "pcep.obj.proc_time.flags",
5615 FT_UINT16, BASE_HEX, NULL, 0x0,
5616 NULL, HFILL }
5617 },
5618 { &hf_pcep_obj_overload_flags,
5619 { "Flags", "pcep.obj.overload.flags",
5620 FT_UINT8, BASE_HEX, NULL, 0x0,
5621 NULL, HFILL }
5622 },
5623 { &hf_pcep_obj_overload_reserved,
5624 { "Reserved", "pcep.obj.overload.reserved",
5625 FT_UINT8, BASE_HEX, NULL, 0x0,
5626 NULL, HFILL }
5627 },
5628 { &hf_pcep_object_type,
5629 { "Object Type", "pcep.object_type",
5630 FT_UINT8, BASE_DEC, NULL, MASK_OBJ_TYPE,
5631 NULL, HFILL }
5632 },
5633 { &hf_pcep_object_length,
5634 { "Object Length", "pcep.object_length",
5635 FT_UINT16, BASE_DEC, NULL, 0x0,
5636 NULL, HFILL }
5637 },
5638 { &hf_pcep_version,
5639 { "PCEP Version", "pcep.version",
5640 FT_UINT8, BASE_HEX, NULL, 0x20,
5641 NULL, HFILL }
5642 },
5643 { &hf_pcep_flags,
5644 { "Flags", "pcep.flags",
5645 FT_UINT8, BASE_HEX, NULL, 0x1F,
5646 NULL, HFILL }
5647 },
5648 { &hf_pcep_message_length,
5649 { "Message length", "pcep.msg_length",
5650 FT_UINT16, BASE_DEC, NULL, 0x0,
5651 NULL, HFILL }
5652 },
5653 { &hf_pcep_of_code,
5654 { "OF-Code", "pcep.of_code",
5655 FT_UINT16, BASE_DEC, VALS(pcep_of_vals), 0x0,
5656 NULL, HFILL }
5657 },
5658 { &hf_pcep_subobj_ipv4_l,
5659 { "L", "pcep.subobj.ipv4.l",
5660 FT_UINT8, BASE_DEC, VALS(pcep_route_l_obj_vals), Mask_L,
5661 NULL, HFILL }
5662 },
5663 { &hf_pcep_subobj_iro_ipv4_l,
5664 { "L", "pcep.iro.subobj.ipv4.l",
5665 FT_UINT8, BASE_HEX, NULL, Mask_L,
5666 NULL, HFILL }
5667 },
5668 { &hf_pcep_subobj_ipv4_x,
5669 { "X", "pcep.subobj.ipv4.x",
5670 FT_UINT8, BASE_HEX, NULL, 0x80,
5671 NULL, HFILL }
5672 },
5673 { &hf_pcep_subobj_ipv6_l,
5674 { "L", "pcep.subobj.ipv6.l",
5675 FT_UINT8, BASE_DEC, VALS(pcep_route_l_obj_vals), Mask_L,
5676 NULL, HFILL }
5677 },
5678 { &hf_pcep_subobj_iro_ipv6_l,
5679 { "L", "pcep.iro.subobj.ipv6.l",
5680 FT_UINT8, BASE_HEX, NULL, Mask_L,
5681 NULL, HFILL }
5682 },
5683 { &hf_pcep_subobj_ipv6_x,
5684 { "X", "pcep.subobj.ipv6.x",
5685 FT_UINT8, BASE_HEX, NULL, 0x80,
5686 NULL, HFILL }
5687 },
5688 { &hf_pcep_subobj_label_control_l,
5689 { "L", "pcep.subobj.label_control.l",
5690 FT_UINT8, BASE_DEC, VALS(pcep_route_l_obj_vals), Mask_L,
5691 NULL, HFILL }
5692 },
5693 { &hf_pcep_subobj_unnumb_interfaceID_l,
5694 { "L", "pcep.subobj.unnumb_interfaceID.l",
5695 FT_UINT8, BASE_DEC, VALS(pcep_route_l_obj_vals), Mask_L,
5696 NULL, HFILL }
5697 },
5698 { &hf_pcep_subobj_iro_unnumb_interfaceID_l,
5699 { "L", "pcep.iro.subobj.unnumb_interfaceID.l",
5700 FT_UINT8, BASE_HEX, NULL, Mask_L,
5701 NULL, HFILL }
5702 },
5703 { &hf_pcep_subobj_unnumb_interfaceID_x,
5704 { "X", "pcep.subobj.unnumb_interfaceID.x",
5705 FT_UINT8, BASE_HEX, NULL, 0x80,
5706 NULL, HFILL }
5707 },
5708 { &hf_pcep_subobj_autonomous_sys_num_x,
5709 { "X", "pcep.subobj.autonomous_sys_num.x",
5710 FT_UINT8, BASE_HEX, NULL, 0x80,
5711 NULL, HFILL }
5712 },
5713 { &hf_pcep_subobj_iro_autonomous_sys_num_l,
5714 { "L", "pcep.iro.subobj.autonomous_sys_num.l",
5715 FT_UINT8, BASE_HEX, NULL, Mask_L,
5716 NULL, HFILL }
5717 },
5718 { &hf_pcep_subobj_autonomous_sys_num_l,
5719 { "L", "pcep.subobj.autonomous_sys_num.l",
5720 FT_UINT8, BASE_DEC, VALS(pcep_route_l_obj_vals), Mask_L,
5721 NULL, HFILL }
5722 },
5723 { &hf_pcep_subobj_srlg_x,
5724 { "X", "pcep.subobj.srlg.x",
5725 FT_UINT8, BASE_HEX, NULL, 0x80,
5726 NULL, HFILL }
5727 },
5728 { &hf_pcep_subobj_exrs_l,
5729 { "L", "pcep.subobj.exrs.l",
5730 FT_UINT8, BASE_DEC, VALS(pcep_route_l_obj_vals), Mask_L,
5731 NULL, HFILL }
5732 },
5733 { &hf_pcep_subobj_exrs_type,
5734 { "Type", "pcep.subobj.exrs.type",
5735 FT_UINT8, BASE_DEC, NULL, 0x7F,
5736 NULL, HFILL }
5737 },
5738 { &hf_pcep_subobj_pksv4_l,
5739 { "L", "pcep.subobj.pksv4.l",
5740 FT_UINT8, BASE_DEC, VALS(pcep_route_l_obj_vals), Mask_L,
5741 NULL, HFILL }
5742 },
5743 { &hf_pcep_subobj_pksv6_l,
5744 { "L", "pcep.subobj.pksv6.l",
5745 FT_UINT8, BASE_DEC, VALS(pcep_route_l_obj_vals), Mask_L,
5746 NULL, HFILL }
5747 },
5748 { &hf_pcep_no_path_obj_nature_of_issue,
5749 { "Nature of Issue", "pcep.obj.no_path.nature_of_issue",
5750 FT_UINT8, BASE_DEC, VALS(pcep_no_path_obj_vals), 0x0,
5751 NULL, HFILL }
5752 },
5753 { &hf_pcep_obj_srp_id_number,
5754 { "SRP-ID-number", "pcep.obj.srp.id-number",
5755 FT_UINT32, BASE_DEC, NULL, 0x0,
5756 NULL, HFILL }
5757 },
5758 { &hf_pcep_obj_lsp_plsp_id,
5759 { "PLSP-ID", "pcep.obj.lsp.plsp-id",
5760 FT_UINT32, BASE_DEC, NULL, PCEP_OBJ_LSP_PLSP_ID,
5761 NULL, HFILL }
5762 },
5763 { &hf_pcep_obj_lsp_flags,
5764 { "Flags", "pcep.obj.lsp.flags",
5765 FT_UINT24, BASE_HEX, NULL, 0x0,
5766 NULL, HFILL }
5767 },
5768 { &hf_pcep_obj_lsp_flags_d,
5769 { "Delegate (D)", "pcep.obj.lsp.flags.delegate",
5770 FT_BOOLEAN, 16, TFS(&tfs_set_notset), PCEP_OBJ_LSP_FLAGS_D,
5771 NULL, HFILL }
5772 },
5773 { &hf_pcep_obj_lsp_flags_s,
5774 { "SYNC (S)", "pcep.obj.lsp.flags.sync",
5775 FT_BOOLEAN, 16, TFS(&tfs_set_notset), PCEP_OBJ_LSP_FLAGS_S,
5776 NULL, HFILL }
5777 },
5778 { &hf_pcep_obj_lsp_flags_r,
5779 { "Remove (R)", "pcep.obj.lsp.flags.remove",
5780 FT_BOOLEAN, 16, TFS(&tfs_set_notset), PCEP_OBJ_LSP_FLAGS_R,
5781 NULL, HFILL }
5782 },
5783 { &hf_pcep_obj_lsp_flags_a,
5784 { "Administrative (A)", "pcep.obj.lsp.flags.administrative",
5785 FT_BOOLEAN, 16, TFS(&tfs_set_notset), PCEP_OBJ_LSP_FLAGS_A,
5786 NULL, HFILL }
5787 },
5788 { &hf_pcep_obj_lsp_flags_o,
5789 { "Operational (O)", "pcep.obj.lsp.flags.operational",
5790 FT_UINT16, BASE_DEC, VALS(pcep_object_lsp_flags_operational_vals), PCEP_OBJ_LSP_FLAGS_O,
5791 NULL, HFILL }
5792 },
5793 { &hf_pcep_obj_lsp_flags_c,
5794 { "Create (C)", "pcep.obj.lsp.flags.create",
5795 FT_BOOLEAN, 16, TFS(&tfs_set_notset), PCEP_OBJ_LSP_FLAGS_C,
5796 NULL, HFILL }
5797 },
5798 { &hf_pcep_obj_lsp_flags_reserved,
5799 { "Reserved", "pcep.obj.lsp.flags.reserved",
5800 FT_BOOLEAN, 16, TFS(&tfs_set_notset), PCEP_OBJ_LSP_FLAGS_RESERVED,
5801 NULL, HFILL }
5802 },
5803 { &hf_pcep_obj_srp_flags,
5804 { "Flags", "pcep.obj.srp.flags",
5805 FT_UINT32, BASE_HEX, NULL, 0x0,
5806 NULL, HFILL }
5807 },
5808 { &hf_pcep_obj_srp_flags_r,
5809 { "Remove (R)", "pcep.obj.srp.flags.remove",
5810 FT_BOOLEAN, 32, TFS(&tfs_set_notset), PCEP_OBJ_SRP_FLAGS_R,
5811 NULL, HFILL }
5812 },
5813 { &hf_pcep_symbolic_path_name,
5814 { "SYMBOLIC-PATH-NAME", "pcep.tlv.symbolic-path-name",
5815 FT_STRING, BASE_NONE, NULL, 0x0,
5816 NULL, HFILL }
5817 },
5818 { &hf_pcep_ipv4_lsp_id_tunnel_sender_address,
5819 { "IPv4 Tunnel Sender Address", "pcep.tlv.ipv4-lsp-id.tunnel-sender-addr",
5820 FT_IPv4, BASE_NONE, NULL, 0x0,
5821 NULL, HFILL }
5822 },
5823 { &hf_pcep_ipv4_lsp_id_lsp_id,
5824 { "LSP ID", "pcep.tlv.ipv4-lsp-id.lsp-id",
5825 FT_UINT16, BASE_DEC, NULL, 0x0,
5826 NULL, HFILL }
5827 },
5828 { &hf_pcep_ipv4_lsp_id_tunnel_id,
5829 { "Tunnel ID", "pcep.tlv.ipv4-lsp-id.tunnel-id",
5830 FT_UINT16, BASE_DEC, NULL, 0x0,
5831 NULL, HFILL }
5832 },
5833 { &hf_pcep_ipv4_lsp_id_extended_tunnel_id,
5834 { "Extended Tunnel ID", "pcep.tlv.ipv4-lsp-id.extended-tunnel-id",
5835 FT_UINT32, BASE_DEC, NULL, 0x0,
5836 NULL, HFILL }
5837 },
5838 { &hf_pcep_ipv4_lsp_id_tunnel_endpoint_address,
5839 { "IPv4 Tunnel Endpoint Address", "pcep.tlv.ipv4-lsp-id.tunnel-endpoint-addr",
5840 FT_IPv4, BASE_NONE, NULL, 0x0,
5841 NULL, HFILL }
5842 },
5843 { &hf_pcep_ipv6_lsp_id_tunnel_sender_address,
5844 { "IPv6 Tunnel Sender Address", "pcep.tlv.ipv6-lsp-id.tunnel-sender-addr",
5845 FT_IPv6, BASE_NONE, NULL, 0x0,
5846 NULL, HFILL }
5847 },
5848 { &hf_pcep_ipv6_lsp_id_lsp_id,
5849 { "LSP ID", "pcep.tlv.ipv6-lsp-id.lsp-id",
5850 FT_UINT16, BASE_DEC, NULL, 0x0,
5851 NULL, HFILL }
5852 },
5853 { &hf_pcep_ipv6_lsp_id_tunnel_id,
5854 { "Tunnel ID", "pcep.tlv.ipv6-lsp-id.tunnel-id",
5855 FT_UINT16, BASE_DEC, NULL, 0x0,
5856 NULL, HFILL }
5857 },
5858 { &hf_pcep_ipv6_lsp_id_extended_tunnel_id,
5859 { "Extended Tunnel ID", "pcep.tlv.ipv6-lsp-id.extended-tunnel-id",
5860 FT_UINT64, BASE_DEC, NULL, 0x0,
5861 NULL, HFILL }
5862 },
5863 { &hf_pcep_ipv6_lsp_id_tunnel_endpoint_address,
5864 { "IPv6 Tunnel Endpoint Address", "pcep.tlv.ipv6-lsp-id.tunnel-endpoint-addr",
5865 FT_IPv6, BASE_NONE, NULL, 0x0,
5866 NULL, HFILL }
5867 },
5868 { &hf_pcep_lsp_error_code,
5869 { "LSP Error Code", "pcep.tlv.lsp-error-code",
5870 FT_UINT32, BASE_DEC, VALS(pcep_tlv_lsp_error_code_vals), 0x0,
5871 NULL, HFILL }
5872 },
5873 { &hf_pcep_rsvp_user_error_spec,
5874 { "RSVP/USER ERROR_SPEC", "pcep.tlv.rsvp-user-error-spec",
5875 FT_STRING, BASE_NONE, NULL, 0x0,
5876 NULL, HFILL }
5877 },
5878 { &hf_pcep_lsp_state_db_version_number,
5879 { "LSP State DB Version Number", "pcep.tlv.lsp-state-db-version-number",
5880 FT_UINT64, BASE_DEC, NULL, 0x0,
5881 NULL, HFILL }
5882 },
5883 { &hf_pcep_speaker_entity_id,
5884 { "Speaker Entity Identifier", "pcep.tlv.speaker-entity-id",
5885 FT_STRING, BASE_NONE, NULL, 0x0,
5886 NULL, HFILL }
5887 },
5888 { &hf_pcep_association_reserved,
5889 { "Reserved", "pcep.association.reserved",
5890 FT_UINT16, BASE_HEX, NULL, 0x0,
5891 NULL, HFILL }
5892 },
5893 { &hf_pcep_association_flags,
5894 { "Flags", "pcep.association.flags",
5895 FT_UINT16, BASE_HEX, NULL, 0x0,
5896 NULL, HFILL }
5897 },
5898 { &hf_pcep_association_flags_r,
5899 { "Remove (R)", "pcep.association.flags.r",
5900 FT_BOOLEAN, 16, TFS(&tfs_set_notset), PCEP_OBJ_ASSOCIATION_FLAGS_R,
5901 NULL, HFILL }
5902 },
5903 { &hf_pcep_association_type,
5904 { "Association Type", "pcep.association.type",
5905 FT_UINT16, BASE_DEC, VALS(pcep_association_type_field_vals), 0x0,
5906 NULL, HFILL }
5907 },
5908 { &hf_pcep_association_id,
5909 { "Association ID", "pcep.association.id",
5910 FT_UINT16, BASE_DEC, NULL, 0x0,
5911 NULL, HFILL }
5912 },
5913 { &hf_pcep_association_source_ipv4,
5914 { "IPv4 Association Source", "pcep.association.ipv4.source",
5915 FT_IPv4, BASE_NONE, NULL, 0x0,
5916 NULL, HFILL }
5917 },
5918 { &hf_pcep_association_source_ipv6,
5919 { "IPv6 Association Source", "pcep.association.ipv6.source",
5920 FT_IPv6, BASE_NONE, NULL, 0x0,
5921 NULL, HFILL }
5922 },
5923 { &hf_pcep_association_source_global,
5924 { "Global Association Source", "pcep.association.global.source",
5925 FT_UINT32, BASE_DEC, NULL, 0x0,
5926 NULL, HFILL }
5927 },
5928 { &hf_pcep_association_id_extended,
5929 { "Extended Association ID", "pcep.tlv.extended_association_id.id",
5930 FT_BYTES, BASE_NONE, NULL, 0x0,
5931 NULL, HFILL }
5932 },
5933 { &hf_pcep_association_id_extended_color,
5934 { "Color", "pcep.tlv.extended_association_id.color",
5935 FT_UINT16, BASE_DEC, NULL, 0x0,
5936 NULL, HFILL }
5937 },
5938 { &hf_pcep_association_id_extended_ipv4_endpoint,
5939 { "IPv4 Endpoint", "pcep.tlv.extended_association_id.ipv4_endpoint",
5940 FT_IPv4, BASE_NONE, NULL, 0x0,
5941 NULL, HFILL }
5942 },
5943 { &hf_pcep_association_id_extended_ipv6_endpoint,
5944 { "IPv6 Endpoint", "pcep.tlv.extended_association_id.ipv6_endpoint",
5945 FT_IPv6, BASE_NONE, NULL, 0x0,
5946 NULL, HFILL }
5947 },
5948 { &hf_pcep_op_conf_assoc_range_reserved,
5949 { "Reserved", "pcep.op_conf_assoc_range.reserved",
5950 FT_BYTES, BASE_NONE, NULL, 0x0,
5951 NULL, HFILL }
5952 },
5953 { &hf_pcep_op_conf_assoc_range_assoc_type,
5954 { "Assoc-Type", "pcep.op_conf_assoc_range.assoc_type",
5955 FT_UINT16, BASE_DEC, NULL, 0x0,
5956 NULL, HFILL }
5957 },
5958 { &hf_pcep_op_conf_assoc_range_start_assoc,
5959 { "Start-Assoc", "pcep.op_conf_assoc_range.start_assoc",
5960 FT_UINT16, BASE_DEC, NULL, 0x0,
5961 NULL, HFILL }
5962 },
5963 { &hf_pcep_op_conf_assoc_range_range,
5964 { "Range", "pcep.op_conf_assoc_range.range",
5965 FT_UINT16, BASE_DEC, NULL, 0x0,
5966 NULL, HFILL }
5967 },
5968 { &hf_pcep_srcpag_info_color,
5969 { "Color", "pcep.srcpag_info.color",
5970 FT_UINT32, BASE_DEC, NULL, 0x0,
5971 NULL, HFILL }
5972 },
5973 { &hf_pcep_srcpag_info_destination_endpoint,
5974 { "Destination End-point", "pcep.srcpag_info.destination_endpoint",
5975 FT_IPv4, BASE_NONE, NULL, 0x0,
5976 NULL, HFILL }
5977 },
5978 { &hf_pcep_srcpag_info_preference,
5979 { "Preference", "pcep.srcpag_info.preference",
5980 FT_UINT32, BASE_DEC, NULL, 0x0,
5981 NULL, HFILL }
5982 },
5983 { &hf_pcep_sr_policy_name,
5984 { "SR Policy Name", "pcep.tlv.sr_policy_name",
5985 FT_STRING, BASE_NONE, NULL, 0x0,
5986 NULL, HFILL }
5987 },
5988 { &hf_pcep_sr_policy_cpath_id_proto_origin,
5989 { "Proto origin", "pcep.tlv.sr_policy_cpath_id.proto_origin",
5990 FT_UINT8, BASE_DEC, VALS(pcep_sr_policy_id_proto_origin_vals), 0x0,
5991 NULL, HFILL }
5992 },
5993 { &hf_pcep_sr_policy_cpath_id_originator_asn,
5994 { "Originator ASN", "pcep.tlv.sr_policy_cpath_id.originator_asn",
5995 FT_UINT32, BASE_DEC, NULL, 0x0,
5996 NULL, HFILL }
5997 },
5998 { &hf_pcep_sr_policy_cpath_id_originator_address,
5999 { "IPv4 Originator Address", "pcep.tlv.sr_policy_cpath_id.originator_ipv4_address",
6000 FT_IPv4, BASE_NONE, NULL, 0x0,
6001 NULL, HFILL }
6002 },
6003 { &hf_pcep_sr_policy_cpath_id_discriminator,
6004 { "Discriminator", "pcep.tlv.sr_policy_cpath_id.proto_discriminator",
6005 FT_UINT32, BASE_DEC, NULL, 0x0,
6006 NULL, HFILL }
6007 },
6008 { &hf_pcep_sr_policy_cpath_name,
6009 { "SR Policy Candidate Path Name", "pcep.tlv.sr_policy_cpath_name",
6010 FT_STRING, BASE_NONE, NULL, 0x0,
6011 NULL, HFILL }
6012 },
6013 { &hf_pcep_sr_policy_cpath_preference,
6014 { "Preference", "pcep.tlv.sr_policy_cpath_preference",
6015 FT_UINT32, BASE_DEC, NULL, 0x0,
6016 NULL, HFILL }
6017 },
6018 { &hf_pcep_enterprise_number,
6019 { "Enterprise Number", "pcep.vendor-information.enterprise-number",
6020 FT_UINT32, BASE_ENTERPRISES, STRINGS_ENTERPRISES, 0x0,
6021 "IANA Private Enterprise Number", HFILL }
6022 },
6023 { &hf_pcep_enterprise_specific_info,
6024 { "Enterprise-Specific Information", "pcep.vendor-information.enterprise-specific-info",
6025 FT_BYTES, BASE_NONE, NULL, 0x0,
6026 NULL, HFILL }
6027 },
6028 { &hf_pcep_tlv_enterprise_number,
6029 { "Enterprise Number", "pcep.tlv.enterprise-number",
6030 FT_UINT32, BASE_ENTERPRISES, STRINGS_ENTERPRISES, 0x0,
6031 "IANA Private Enterprise Number", HFILL }
6032 },
6033 { &hf_pcep_tlv_enterprise_specific_info,
6034 { "Enterprise-Specific Information", "pcep.tlv.enterprise-specific-info",
6035 FT_BYTES, BASE_NONE, NULL, 0x0,
6036 NULL, HFILL }
6037 },
6038 { &hf_pcep_bu_reserved,
6039 { "Reserved", "pcep.obj.bu.reserved",
6040 FT_UINT32, BASE_HEX, NULL, 0x0,
6041 NULL, HFILL }
6042 },
6043 { &hf_pcep_bu_butype,
6044 { "Type", "pcep.obj.bu.butype",
6045 FT_UINT8, BASE_DEC, VALS(pcep_bu_butype_vals), 0x0,
6046 NULL, HFILL }
6047 },
6048 { &hf_pcep_bu_utilization,
6049 { "Bandwidth Utilization", "pcep.obj.bu.utilization",
6050 FT_FLOAT, BASE_NONE, NULL, 0x0,
6051 "The bandwidth utilization quantified as a percentage and encoded in IEEE floating point format", HFILL }
6052 },
6053 { &hf_pcep_obj_open_type,
6054 { "OPEN Object-Type", "pcep.obj.open.type",
6055 FT_UINT8, BASE_DEC, VALS(pcep_obj_open_type_vals), MASK_OBJ_TYPE,
6056 NULL, HFILL }
6057 },
6058
6059 { &hf_pcep_obj_rp_type,
6060 { "RP Object-Type", "pcep.obj.rp.type",
6061 FT_UINT8, BASE_DEC, VALS(pcep_obj_rp_type_vals), MASK_OBJ_TYPE,
6062 NULL, HFILL }
6063 },
6064
6065 { &hf_pcep_obj_no_path_type,
6066 { "NO-PATH Object-Type", "pcep.obj.nopath.type",
6067 FT_UINT8, BASE_DEC, VALS(pcep_obj_no_path_type_vals), MASK_OBJ_TYPE,
6068 NULL, HFILL }
6069 },
6070
6071 { &hf_pcep_obj_end_point_type,
6072 { "END-POINT Object-Type", "pcep.obj.endpoint.type",
6073 FT_UINT8, BASE_DEC, VALS(pcep_obj_end_point_type_vals), MASK_OBJ_TYPE,
6074 NULL, HFILL }
6075 },
6076
6077 { &hf_pcep_obj_bandwidth_type,
6078 { "BANDWIDTH Object-Type", "pcep.obj.bandwidth.type",
6079 FT_UINT8, BASE_DEC, VALS(pcep_obj_bandwidth_type_vals), MASK_OBJ_TYPE,
6080 NULL, HFILL }
6081 },
6082
6083 { &hf_pcep_obj_metric_type,
6084 { "METRIC Object-Type", "pcep.obj.metric.type",
6085 FT_UINT8, BASE_DEC, VALS(pcep_obj_metric_type_vals), MASK_OBJ_TYPE,
6086 NULL, HFILL }
6087 },
6088
6089 { &hf_pcep_obj_explicit_route_type,
6090 { "ERO Object-Type", "pcep.obj.ero.type",
6091 FT_UINT8, BASE_DEC, VALS(pcep_obj_explicit_route_type_vals), MASK_OBJ_TYPE,
6092 NULL, HFILL }
6093 },
6094
6095 { &hf_pcep_obj_record_route_type,
6096 { "RRO Object-Type", "pcep.obj.rro.type",
6097 FT_UINT8, BASE_DEC, VALS(pcep_obj_record_route_type_vals), MASK_OBJ_TYPE,
6098 NULL, HFILL }
6099 },
6100
6101 { &hf_pcep_obj_lspa_type,
6102 { "LSPA Object-Type", "pcep.obj.lspa.type",
6103 FT_UINT8, BASE_DEC, VALS(pcep_obj_lspa_type_vals), MASK_OBJ_TYPE,
6104 NULL, HFILL }
6105 },
6106
6107 { &hf_pcep_obj_iro_type,
6108 { "IRO Object-Type", "pcep.obj.iro.type",
6109 FT_UINT8, BASE_DEC, VALS(pcep_obj_iro_type_vals), MASK_OBJ_TYPE,
6110 NULL, HFILL }
6111 },
6112
6113 { &hf_pcep_obj_svec_type,
6114 { "SVEC Object-Type", "pcep.obj.svec.type",
6115 FT_UINT8, BASE_DEC, VALS(pcep_obj_svec_type_vals), MASK_OBJ_TYPE,
6116 NULL, HFILL }
6117 },
6118
6119 { &hf_pcep_obj_notification_type,
6120 { "NOTIFICATION Object-Type", "pcep.obj.notification.type",
6121 FT_UINT8, BASE_DEC, VALS(pcep_obj_notification_type_vals), MASK_OBJ_TYPE,
6122 NULL, HFILL }
6123 },
6124
6125 { &hf_pcep_obj_pcep_error_type,
6126 { "PCEP-ERROR Object-Type", "pcep.obj.error.type",
6127 FT_UINT8, BASE_DEC, VALS(pcep_obj_pcep_error_type_vals), MASK_OBJ_TYPE,
6128 NULL, HFILL }
6129 },
6130
6131 { &hf_pcep_obj_load_balancing_type,
6132 { "LOAD-BALANCING Object-Type", "pcep.obj.loadbalancing.type",
6133 FT_UINT8, BASE_DEC, VALS(pcep_obj_load_balancing_type_vals), MASK_OBJ_TYPE,
6134 NULL, HFILL }
6135 },
6136
6137 { &hf_pcep_obj_close_type,
6138 { "CLOSE Object-Type", "pcep.obj.close.type",
6139 FT_UINT8, BASE_DEC, VALS(pcep_obj_close_type_vals), MASK_OBJ_TYPE,
6140 NULL, HFILL }
6141 },
6142
6143 { &hf_pcep_obj_path_key_type,
6144 { "PATH-KEY Object-Type", "pcep.obj.path_key.type",
6145 FT_UINT8, BASE_DEC, VALS(pcep_obj_path_key_type_vals), MASK_OBJ_TYPE,
6146 NULL, HFILL }
6147 },
6148
6149 { &hf_pcep_obj_xro_type,
6150 { "XRO Object-Type", "pcep.obj.xro.type",
6151 FT_UINT8, BASE_DEC, VALS(pcep_obj_xro_type_vals), MASK_OBJ_TYPE,
6152 NULL, HFILL }
6153 },
6154
6155 { &hf_pcep_obj_monitoring_type,
6156 { "MONITORING Object-Type", "pcep.obj.monitoring.type",
6157 FT_UINT8, BASE_DEC, VALS(pcep_obj_monitoring_type_vals), MASK_OBJ_TYPE,
6158 NULL, HFILL }
6159 },
6160
6161 { &hf_pcep_obj_pcc_id_req_type,
6162 { "PCC-REQ-ID Object-Type", "pcep.obj.pccidreq.type",
6163 FT_UINT8, BASE_DEC, VALS(pcep_obj_pcc_id_req_type_vals), MASK_OBJ_TYPE,
6164 NULL, HFILL }
6165 },
6166
6167 { &hf_pcep_obj_of_type,
6168 { "OF Object-Type", "pcep.obj.of.type",
6169 FT_UINT8, BASE_DEC, VALS(pcep_obj_of_type_vals), MASK_OBJ_TYPE,
6170 NULL, HFILL }
6171 },
6172
6173 { &hf_pcep_obj_pce_id_type,
6174 { "PCE-ID Object-Type", "pcep.obj.pceid.type",
6175 FT_UINT8, BASE_DEC, VALS(pcep_obj_pce_id_type_vals), MASK_OBJ_TYPE,
6176 NULL, HFILL }
6177 },
6178
6179 { &hf_pcep_obj_proc_time_type,
6180 { "PROC-TIME Object-Type", "pcep.obj.proctime.type",
6181 FT_UINT8, BASE_DEC, VALS(pcep_obj_proc_time_type_vals), MASK_OBJ_TYPE,
6182 NULL, HFILL }
6183 },
6184
6185 { &hf_pcep_obj_overload_type,
6186 { "OVERLOAD Object-Type", "pcep.obj.overload.type",
6187 FT_UINT8, BASE_DEC, VALS(pcep_obj_overload_type_vals), MASK_OBJ_TYPE,
6188 NULL, HFILL }
6189 },
6190
6191 { &hf_pcep_obj_unreach_destination_type,
6192 { "UNREACH-DESTINATION Object-Type", "pcep.obj.unreach-destination.type",
6193 FT_UINT8, BASE_DEC, VALS(pcep_obj_unreach_destination_type_vals), MASK_OBJ_TYPE,
6194 NULL, HFILL }
6195 },
6196
6197 { &hf_pcep_obj_sero_type,
6198 { "SERO Object-Type", "pcep.obj.sero.type",
6199 FT_UINT8, BASE_DEC, VALS(pcep_obj_sero_type_vals), MASK_OBJ_TYPE,
6200 NULL, HFILL }
6201 },
6202
6203 { &hf_pcep_obj_srro_type,
6204 { "SRRO Object-Type", "pcep.obj.srro.type",
6205 FT_UINT8, BASE_DEC, VALS(pcep_obj_srro_type_vals), MASK_OBJ_TYPE,
6206 NULL, HFILL }
6207 },
6208
6209 { &hf_pcep_obj_branch_node_capability_type,
6210 { "Branch Node Capability Object-Type", "pcep.obj.branch-node-capability.type",
6211 FT_UINT8, BASE_DEC, VALS(pcep_obj_branch_node_capability_type_vals), MASK_OBJ_TYPE,
6212 NULL, HFILL }
6213 },
6214
6215 { &hf_pcep_obj_lsp_type,
6216 { "LSP Object-Type", "pcep.obj.lsp.type",
6217 FT_UINT8, BASE_DEC, VALS(pcep_obj_lsp_type_vals), MASK_OBJ_TYPE,
6218 NULL, HFILL }
6219 },
6220
6221 { &hf_pcep_obj_srp_type,
6222 { "SRP Object-Type", "pcep.obj.srp.type",
6223 FT_UINT8, BASE_DEC, VALS(pcep_obj_srp_type_vals), MASK_OBJ_TYPE,
6224 NULL, HFILL }
6225 },
6226
6227 { &hf_pcep_obj_vendor_information_type,
6228 { "VENDOR-INFORMATION Object-Type", "pcep.obj.vendor-information.type",
6229 FT_UINT8, BASE_DEC, VALS(pcep_obj_vendor_information_type_vals), MASK_OBJ_TYPE,
6230 NULL, HFILL }
6231 },
6232
6233 { &hf_pcep_obj_bu_type,
6234 { "BU Object-Type", "pcep.obj.bu.type",
6235 FT_UINT8, BASE_DEC, VALS(pcep_obj_bu_type_vals), MASK_OBJ_TYPE,
6236 NULL, HFILL }
6237 },
6238
6239 { &hf_pcep_obj_association_type,
6240 { "ASSOCIATION Object-Type", "pcep.obj.association.type",
6241 FT_UINT8, BASE_DEC, VALS(pcep_obj_association_type_vals), MASK_OBJ_TYPE,
6242 NULL, HFILL }
6243 },
6244 { &hf_pcep_path_setup_type_capability_sub_tlv_type,
6245 { "Type", "pcep.path-setup-type-capability-sub-tlv.type",
6246 FT_UINT16, BASE_DEC, VALS(pcep_path_setup_type_capability_sub_tlv_vals), 0x0,
6247 NULL, HFILL }
6248 },
6249 { &hf_pcep_path_setup_type_capability_sub_tlv_length,
6250 { "Length", "pcep.path-setup-type-capability-sub-tlv.length",
6251 FT_UINT16, BASE_DEC, NULL, 0x0,
6252 NULL, HFILL }
6253 },
6254 };
6255
6256 static gint *ett[] = {
6257 &ett_pcep,
6258 &ett_pcep_hdr,
6259 &ett_pcep_obj_open,
6260 &ett_pcep_obj_request_parameters,
6261 &ett_pcep_obj_no_path,
6262 &ett_pcep_obj_end_point,
6263 &ett_pcep_obj_bandwidth,
6264 &ett_pcep_obj_metric,
6265 &ett_pcep_obj_explicit_route,
6266 &ett_pcep_obj_record_route,
6267 &ett_pcep_obj_lspa,
6268 &ett_pcep_obj_iro,
6269 &ett_pcep_obj_svec,
6270 &ett_pcep_obj_notification,
6271 &ett_pcep_obj_error,
6272 &ett_pcep_obj_load_balancing,
6273 &ett_pcep_obj_close,
6274 &ett_pcep_obj_path_key,
6275 &ett_pcep_obj_xro,
6276 &ett_pcep_obj_monitoring,
6277 &ett_pcep_obj_pcc_id_req,
6278 &ett_pcep_obj_of,
6279 &ett_pcep_obj_pce_id,
6280 &ett_pcep_obj_proc_time,
6281 &ett_pcep_obj_overload,
6282 &ett_pcep_obj_unreach_destination,
6283 &ett_pcep_obj_branch_node_capability,
6284 &ett_pcep_obj_lsp,
6285 &ett_pcep_obj_srp,
6286 &ett_pcep_obj_vendor_information,
6287 &ett_pcep_obj_bu,
6288 &ett_pcep_obj_unknown,
6289 &ett_pcep_obj_sero,
6290 &ett_pcep_obj_srro,
6291 &ett_pcep_obj_association
6292 };
6293
6294 static ei_register_info ei[] = {
6295 /* Generated from convert_proto_tree_add_text.pl */
6296 { &ei_pcep_subobject_bad_length, { "pcep.subobject_bad_length", PI_MALFORMED, PI_WARN, "Bad subobject length", EXPFILL }},
6297 { &ei_pcep_non_defined_subobject, { "pcep.non_defined_subobject", PI_PROTOCOL, PI_WARN, "Non defined subobject for this object", EXPFILL }},
6298 { &ei_pcep_non_defined_object, { "pcep.unknown_object", PI_PROTOCOL, PI_WARN, "Unknown object", EXPFILL }},
6299 { &ei_pcep_object_length, { "pcep.object_length.bad", PI_MALFORMED, PI_WARN, "Object Length bogus", EXPFILL }},
6300 { &ei_pcep_pcep_object_body_non_defined, { "pcep.object_body_non_defined", PI_PROTOCOL, PI_WARN, "PCEP Object BODY non defined", EXPFILL }},
6301 { &ei_pcep_unknown_type_object, { "pcep.unknown_type_object", PI_PROTOCOL, PI_WARN, "UNKNOWN Type Object", EXPFILL }},
6302 };
6303
6304 expert_module_t* expert_pcep;
6305
6306 /*Register the protocol name and description*/
6307 proto_pcep = proto_register_protocol (
6308 "Path Computation Element communication Protocol", "PCEP", "pcep");
6309
6310 /* Required function calls to register the header fields and subtrees used */
6311 proto_register_field_array(proto_pcep, pcepf_info, array_length(pcepf_info));
6312 proto_register_subtree_array(ett, array_length(ett));
6313 expert_pcep = expert_register_protocol(proto_pcep);
6314 expert_register_field_array(expert_pcep, ei, array_length(ei));
6315 }
6316
6317 /*Dissector Handoff*/
6318 void
proto_reg_handoff_pcep(void)6319 proto_reg_handoff_pcep(void)
6320 {
6321 dissector_handle_t pcep_handle;
6322
6323 pcep_handle = create_dissector_handle(dissect_pcep, proto_pcep);
6324 dissector_add_uint_with_preference("tcp.port", TCP_PORT_PCEP, pcep_handle);
6325 }
6326
6327 /*
6328 * Editor modelines
6329 *
6330 * Local Variables:
6331 * c-basic-offset: 4
6332 * tab-width: 8
6333 * indent-tabs-mode: nil
6334 * End:
6335 *
6336 * ex: set shiftwidth=4 tabstop=8 expandtab:
6337 * :indentSize=4:tabSize=8:noTabs=true:
6338 */
6339