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