Coverage Report

Created: 2025-02-15 06:25

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