You cannot possible compile the LSR (or the LDP) lib without a porting
[mpls-ldp-portable.git] / ldp / ldp_nortel.h
blob278b6733155689e2f9915e49ba015a9424be05d1
1 #ifndef _LDP_MPLS_H_
2 #define _LDP_MPLS_H_
4 /******************************************************************************
5 * Nortel Networks Software License *
6 * *
7 * READ THE TERMS OF THIS LICENSE CAREFULLY. BY USING, MODIFYING, OR *
8 * DISTRIBUTING THIS SOFTWARE AND ANY ACCOMPANYING DOCUMENTATION (COLLECTIVELY,*
9 * "SOFTWARE") YOU ARE AGREEING TO ALL OF THE TERMS OF THIS LICENSE. *
10 * *
11 * 1. Nortel Telecom Limited, on behalf of itself and its subsidiaries *
12 * (collectively "Nortel Networks") grants to you a non-exclusive, perpetual, *
13 * world-wide right to use, copy, modify, and distribute the Software at no *
14 * charge. *
15 * *
16 * 2. You may sublicense recipients of redistributed Software to use, *
17 * copy, modify, and distribute the Software on substantially the same terms as*
18 * this License. You may not impose any further restrictions on the *
19 * recipient's exercise of the rights in the Software granted under this *
20 * License. Software distributed to other parties must be accompanied by a *
21 * License containing a grant, disclaimer and limitation of liability *
22 * substantially in the form of 3, 4, and 5 below provided that references to *
23 * "Nortel Networks" may be changed to "Supplier". *
24 * *
25 * 3. Nortel Networks reserves the right to modify and release new *
26 * versions of the Software from time to time which may include modifications *
27 * made by third parties like you. Accordingly, you agree that you shall *
28 * automatically grant a license to Nortel Networks to include, at its option, *
29 * in any new version of the Software any modifications to the Software made by*
30 * you and made available directly or indirectly to Nortel Networks. Nortel *
31 * Networks shall have the right to use, copy, modify, and distribute any such *
32 * modified Software on substantially the same terms as this License. *
33 * *
34 * 4. THE SOFTWARE IS PROVIDED ON AN "AS IS" BASIS. NORTEL NETWORKS AND *
35 * ITS AGENTS AND SUPPLIERS DISCLAIM ALL REPRESENTATIONS, WARRANTIES AND *
36 * CONDITIONS RELATING TO THE SOFTWARE, INCLUDING, BUT NOT LIMITED TO, IMPLIED *
37 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND *
38 * NON-INFRINGEMENT OF THIRD-PARTY INTELLECTUAL PROPERTY RIGHTS. NORTEL *
39 * NETWORKS AND ITS AGENTS AND SUPPLIERS DO NOT WARRANT, GUARANTEE, OR MAKE ANY*
40 * REPRESENTATIONS REGARDING THE USE, OR THE RESULTS OF THE USE, OF THE *
41 * SOFTWARE IN TERMS OR CORRECTNESS, ACCURACY, RELIABILITY, CURRENTNESS, OR *
42 * OTHERWISE. *
43 * *
44 * 5. NEITHER NORTEL NETWORKS NOR ANY OF ITS AGENTS OR SUPPLIERS SHALL BE *
45 * LIABLE FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, INCIDENTAL OR EXEMPLARY *
46 * DAMAGES, OR ECONOMIC LOSSES (INCLUDING DAMAGES FOR LOSS OF BUSINESS PROFITS,*
47 * BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION AND THE LIKE), ARISING *
48 * FROM THE SOFTWARE OR THIS LICENSE AGREEMENT, EVEN IF NORTEL NETWORKS OR SUCH*
49 * AGENT OR SUPPLIER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES OR *
50 * LOSSES, AND WHETHER ANY SUCH DAMAGE OR LOSS ARISES OUT OF CONTRACT, TORT, OR*
51 * OTHERWISE. *
52 * *
53 * 6. This License shall be governed by the laws of the Province of *
54 * Ontario, Canada. *
55 *******************************************************************************/
57 /******************************************************************************
58 * This file contains the C implementation for encode/decode functions *
59 * for the following types of messages: notification, hello, initialization, *
60 * keepAlive, address, address Withdraw, label Mapping, label Request, label *
61 * Withdraw and label Release. There are also encode/decode methods for all *
62 * tlv types required by the previously enumerated messages. *
63 * Please remember that the pdu will always contain the header followed by 1 *
64 * or more LDP messages. The file contains functions to encode/decode the LDP *
65 * header as well. *
66 * All the messages, header message and the tlvs are in conformity with the *
67 * draft-ietf-mpls-ldp-04 (May 1999) and with draft-ietf-mpls-cr-ldp-01 *
68 * (Jan 1999). *
69 * *
70 * Please note that the U bit in the message and the F bit in the tlv are *
71 * ignored in this version of the code. *
72 * *
73 * Please note that the traffic parameters for traffic TLV have to be IEEE *
74 * single precision floating point numbers. *
75 * *
76 * Please note that there might be a small chance for bit field manipulation *
77 * portability inconsistency. If such problems occure, the code requires *
78 * changes for a suitable bit-field manipulation. The code for encoding and *
79 * decoding makes the assumption that the compiler packs the bit fields in a *
80 * structure into adjacent bits of the same unit. *
81 * *
82 * The usage of the encode/decode functions is described below. *
83 * *
84 * The encode functions take as arguments: a pointer to the structure which *
85 * implements msg/tlv, a buffer (where the encoding is done) and the buffer *
86 * length. *
87 * If the encode is successfull, the function returns the total encoded *
88 * length. *
89 * If the encode fails, the function returns an error code. *
90 * The encode functions for messages and message headers do not modify the *
91 * content of the struct which is to be encoded. All the other encode *
92 * functions will change the content of the structure. The pointer which *
93 * points to the beginning of the buffer is not changed. *
94 * *
95 * The decode functions take as arguments: a pointer to the structure which *
96 * is going to be populated after decoding, a pointer to a buffer and the *
97 * buffer length. *
98 * If the decode is successful, the function returns the total decoded length *
99 * If the decode fails, the function returns an error code. The decode *
100 * functions do not modify the pointer to the buffer which contains the data *
101 * to be decoded. *
103 * Example on how to use the encode/decode functions for a keepAlive message: *
105 * Encode the keep alive message: *
106 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ *
107 * u_char buffer[500]; *
108 * int returnCode; *
109 * struct mplsLdpKeepAlMsg_s keepAliveMsg; *
110 * keepAliveMsg.baseMsg.msgType = MPLS_KEEPAL_MSGTYPE; *
111 * keepAliveMsg.baseMsg.msgLength = MPLS_MSGIDFIXLEN; *
112 * keepAliveMsg.baseMsg.msgId = 123; *
113 * bzero(buffer, 500); *
114 * returnCode = Mpls_encodeLdpKeepAliveMsg(&keepAliveMsg, *
115 * buffer, *
116 * 500); *
117 * if (returnCode < 0) *
118 * check the error code *
119 * else *
120 * write(fd, buffer, returnCode); *
123 * Decode the keep alive meesage: *
124 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ *
125 * u_char buffer[500]; *
126 * int returnCode; *
127 * struct mplsLdpKeepAlMsg_s keepAliveMsg; *
128 * read(fd, buffer, length); *
129 * returnCode = Mpls_decodeLdpKeepAliveMsg(&keepAliveMsg, *
130 * buffer, *
131 * 500); *
132 * if (returnCode < 0) *
133 * check the error code *
134 * else *
135 * { *
136 * printKeepAliveMsg(&keepAliveMsg); *
137 * } *
139 * An example on how to use the decode functions for the header and the *
140 * messages can be found in the main function. *
142 * The code was tested for big endian and little endian for sparc5, linux *
143 * and i960. *
145 * In order to compile for little endian, the LITTLE_ENDIAN_BYTE_ORDER should *
146 * be defined. *
148 * At the end of this file there is an examples of a hex buffers and its *
149 * corresponding values. *
152 * Version History *
153 * Version Date Authors Description *
154 * =========== ======== ========= ====================== *
155 * mpls_encdec_01.c 99/03/15 Antonela Paraschiv draft-ietf-mpls-ldp-03 and *
156 * draft-ietf-mpls-cr-ldp-01 *
158 * mpls_encdec_02.c 99/05/19 Antonela Paraschiv draft-ietf-mpls-ldp-04 and *
159 * draft-ietf-mpls-cr-ldp-01 *
161 ******************************************************************************/
163 #include "ldp_struct.h"
164 #include <sys/types.h>
165 #include <string.h>
166 #include <endian.h>
168 #if (__BYTE_ORDER == __LITTLE_ENDIAN)
169 #define LITTLE_ENDIAN_BYTE_ORDER 1
170 #endif
172 #define MEM_COPY(X, Y, Z) memcpy(X, Y, Z)
174 /* macros to handle different byte orders (little endian or big endian) */
175 #ifdef LITTLE_ENDIAN_BYTE_ORDER
176 #define BITFIELDS_ASCENDING_2(X, Y) Y; X;
177 #define BITFIELDS_ASCENDING_3(X, Y, Z) Z; Y; X;
178 #define BITFIELDS_ASCENDING_4(X, Y, Z, W) W; Z; Y; X;
179 #define BITFIELDS_ASCENDING_7(X, Y, Z, W, U, A, B) B; A; U; W; Z; Y; X;
180 # else
181 #define BITFIELDS_ASCENDING_2(X, Y) X; Y;
182 #define BITFIELDS_ASCENDING_3(X, Y, Z) X; Y; Z;
183 #define BITFIELDS_ASCENDING_4(X, Y, Z, W) X; Y; Z; W;
184 #define BITFIELDS_ASCENDING_7(X, Y, Z, W, U, A, B) X; Y; Z; W; U; A; B;
185 #endif /* LITTLE_ENDIAN_BYTE_ORDER */
187 /* macros used to decode the entire LDP; they declare local var for
188 different type of messages */
190 /* debug macros */
191 #define PRINT_OUT(args...)
192 #define PRINT_ERR(args...)
195 * MESSAGE TYPE CONSTANS & TLV CONSTANTS
198 #define MPLS_LDP_HDRSIZE 10 /* the size for mpls ldp hdr */
199 #define MPLS_TLVFIXLEN 4 /* type + len */
200 #define MPLS_MSGIDFIXLEN 4 /* type + len */
201 #define MPLS_LDPIDLEN 6
202 #define MPLS_PDUMAXLEN 4096 /* octets */
203 #define MPLS_VERSION 0x0001
204 #define MPLS_IPV4ADDRFAMILYN 0x0100 /* rfc 1700 (network order) */
205 #define MPLS_INIFINITE_TIMEVAL 0xfffff
207 /* for initialize message */
208 #define MPLS_INIT_MSGTYPE 0x0200 /* initialization msg */
209 #define MPLS_CSP_TLVTYPE 0x0500 /* common params for init msg */
210 #define MPLS_ASP_TLVTYPE 0x0501 /* atm session params */
211 #define MPLS_FSP_TLVTYPE 0x0502 /* frame relay session params */
212 #define MPLS_ASPFIXLEN 4 /* M + N + D + res */
213 #define MPLS_FSPFIXLEN 4 /* M + N + res */
214 #define MPLS_CSPFIXLEN 14 /* protocolV + ... + ldp ids */
215 #define MPLS_ATMLBLMAXLEN 10
216 #define MPLS_ATMLRGFIXLEN 8
217 #define MPLS_FRLRGFIXLEN 8
218 #define MPLS_ASP_NOMERGE 0
219 #define MPLS_ASP_VPMERGE 1
220 #define MPLS_ASP_VCMERGE 2
221 #define MPLS_ASP_VPVCMERGE 3
222 #define MPLS_FRLBLMAXLEN 10
223 #define MPLS_FRDLCI10BITS 0
224 #define MPLS_FRDLCI17BITS 1
225 #define MPLS_FRDLCI23BITS 2
227 /* for notification message */
228 #define MPLS_NOT_MSGTYPE 0x0001 /* notification msg */
229 #define MPLS_NOT_ST_TLVTYPE 0x0300 /* status tlv for not msg */
230 #define MPLS_NOT_ES_TLVTYPE 0x0301 /* extended status for not msg */
231 #define MPLS_NOT_RP_TLVTYPE 0x0302 /* returned PDU for not msg */
232 #define MPLS_NOT_RM_TLVTYPE 0x0303 /* returned msg for not msg */
233 #define MPLS_STATUSFIXLEN 10 /* status code + id + type */
234 #define MPLS_EXSTATUSLEN 4
235 #define MPLS_NOT_MAXSIZE MPLS_PDUMAXLEN - MPLS_TLVFIXLEN - \
236 MPLS_MSGIDFIXLEN
238 /* for hello message */
239 #define MPLS_HELLO_MSGTYPE 0x0100 /* hello msg */
240 #define MPLS_CHP_TLVTYPE 0x0400 /* Common Hello Param Tlv */
241 #define MPLS_TRADR_TLVTYPE 0x0401 /* Transport Address Param Tlv */
242 #define MPLS_CSN_TLVTYPE 0x0402 /* Conf Seq Number Param Tlv */
243 #define MPLS_CHPFIXLEN 4
244 #define MPLS_CSNFIXLEN 4
245 #define MPLS_TRADRFIXLEN 4
247 /* for keep alive message */
248 #define MPLS_KEEPAL_MSGTYPE 0x0201 /* keep alive msg */
250 /* for address messages */
251 #define MPLS_ADDR_MSGTYPE 0x0300 /* address msg */
252 #define MPLS_ADDRWITH_MSGTYPE 0x0301 /* address withdraw msg */
253 #define MPLS_ADDRLIST_TLVTYPE 0x0101 /* addrss list tlv type */
254 #define MPLS_IPv4LEN 4
255 #define MPLS_ADDFAMFIXLEN 2
256 #define MPLS_ADDLISTMAXLEN (MPLS_PDUMAXLEN - (2*MPLS_TLVFIXLEN) - \
257 MPLS_MSGIDFIXLEN - MPLS_ADDFAMFIXLEN)
258 #define MPLS_MAXNUMBERADR MPLS_ADDLISTMAXLEN / 4
260 /* for label mapping message */
261 #define MPLS_LBLMAP_MSGTYPE 0x0400 /* label mapping msg */
262 #define MPLS_FEC_TLVTYPE 0x0100 /* label mapping msg */
263 #define MPLS_GENLBL_TLVTYPE 0x0200 /* generic label tlv */
264 #define MPLS_ATMLBL_TLVTYPE 0x0201 /* atm label tlv */
265 #define MPLS_FRLBL_TLVTYPE 0x0202 /* frame relay label tlv */
266 #define MPLS_HOPCOUNT_TLVTYPE 0x0103 /* ho count tlv */
267 #define MPLS_PATH_TLVTYPE 0x0104 /* path vector tlv */
268 #define MPLS_REQMSGID_TLVTYPE 0x0600 /* lbl request msg id tlv */
269 #define MPLS_WC_FEC 0x01 /* wildcard fec element */
270 #define MPLS_PREFIX_FEC 0x02 /* prefix fec element */
271 #define MPLS_HOSTADR_FEC 0x03 /* host addr fec element */
272 #define MPLS_CRLSP_FEC 0x04 /* crlsp fec element */
273 #define MPLS_FECMAXLEN (MPLS_PDUMAXLEN - (2*MPLS_TLVFIXLEN) - \
274 MPLS_MSGIDFIXLEN)
275 #define MPLS_LBLFIXLEN 4 /* v + vpi + vci + res */
276 #define MPLS_HOPCOUNTFIXLEN 1 /* v + vpi + vci + res */
277 #define MPLS_FEC_ELEMTYPELEN 1
278 #define MPLS_FEC_PRELENLEN 1
279 #define MPLS_FEC_ADRFAMLEN 2
280 #define MPLS_FEC_CRLSPLEN 4 /* length of cr lsp fec */
281 #define MPLS_MAXHOPSNUMBER 20 /* max # hops in path vector */
282 #define MPLS_MAXNUMFECELEMENT 10 /* max # of fec elements */
284 /* for label request message */
285 #define MPLS_LBLREQ_MSGTYPE 0x0401 /* label request msg */
286 #define MPLS_LBLMSGID_TLVTYPE 0x0601 /* lbl return msg id tlv */
287 #define MPLS_ADR_FEC_FIXLEN (MPLS_FEC_ELEMTYPELEN + MPLS_FEC_PRELENLEN + MPLS_FEC_ADRFAMLEN)
289 /* for label withdraw and release messages */
290 #define MPLS_LBLWITH_MSGTYPE 0x0402 /* label withdraw msg */
291 #define MPLS_LBLREL_MSGTYPE 0x0403 /* label release msg */
293 /* for ER tlvs */
294 #define MPLS_ER_TLVTYPE 0x0800 /* constraint routing tlv */
295 #define MPLS_TRAFFIC_TLVTYPE 0x0810 /* traffic parameters tlv */
296 #define MPLS_PDR_TLVTYPE 0x0811 /* traffic peak data rate tlv */
297 #define MPLS_CDR_TLVTYPE 0x0812 /* committed data rate tlv */
298 #define MPLS_CBT_TLVTYPE 0x0813 /* committed burst tolerance */
299 #define MPLS_PREEMPT_TLVTYPE 0x0820 /* preemption tlv */
300 #define MPLS_LSPID_TLVTYPE 0x0821 /* lspid tlv */
301 #define MPLS_RESCLASS_TLVTYPE 0x0822 /* resource class tlv */
302 #define MPLS_PINNING_TLVTYPE 0x0823 /* route pinning tlv */
303 #define MPLS_ERHOP_IPV4_TLVTYPE 0x801 /* explicit routing ipv4 tlv */
304 #define MPLS_ERHOP_IPV6_TLVTYPE 0x802 /* explicit routing ipv6 tlv */
305 #define MPLS_ERHOP_AS_TLVTYPE 0x803 /* explicit routing autonomous
306 system number tlv */
307 #define MPLS_ERHOP_LSPID_TLVTYPE 0x804 /* explicit routing lspid tlv */
308 #define MPLS_ERHOP_IPV4_FIXLEN 8 /* fix length in bytes */
309 #define MPLS_ERHOP_IPV6_FIXLEN 20 /* fix length in bytes */
310 #define MPLS_ERHOP_AS_FIXLEN 4 /* fix length in bytes */
311 #define MPLS_ERHOP_LSPID_FIXLEN 8 /* fix length in bytes */
312 #define MPLS_IPV6ADRLENGTH 16
313 #define MPLS_MAX_ER_HOPS 20 /* decent number of hops;
314 change if required */
315 #define MPLS_PREEMPTTLV_FIXLEN 4 /* setPrio + holdPrio + res */
316 #define MPLS_LSPIDTLV_FIXLEN 8 /* res + crlspId + routerId */
317 #define MPLS_TRAFFICPARAMLENGTH 4 /* traffic parameters length */
319 /* for label abort request message */
320 #define MPLS_LBLABORT_MSGTYPE 0x0404 /* label abort request msg */
323 * Error codes
326 #define MPLS_ENC_BUFFTOOSMALL -1
327 #define MPLS_DEC_BUFFTOOSMALL -2
328 #define MPLS_ENC_TLVERROR -3
329 #define MPLS_DEC_TLVERROR -4
330 #define MPLS_ENC_ATMLBLERROR -5
331 #define MPLS_DEC_ATMLBLERROR -6
332 #define MPLS_ENC_BASEMSGERROR -7
333 #define MPLS_DEC_BASEMSGERROR -8
334 #define MPLS_ENC_CSPERROR -9
335 #define MPLS_DEC_CSPERROR -10
336 #define MPLS_ENC_ASPERROR -11
337 #define MPLS_DEC_ASPERROR -12
338 #define MPLS_ENC_FSPERROR -13
339 #define MPLS_DEC_FSPERROR -14
340 #define MPLS_ENC_STATUSERROR -16
341 #define MPLS_DEC_STATUSERROR -17
342 #define MPLS_ENC_EXSTATERROR -18
343 #define MPLS_DEC_EXSTATERROR -19
344 #define MPLS_ENC_RETPDUERROR -20
345 #define MPLS_DEC_RETPDUERROR -21
346 #define MPLS_ENC_RETMSGERROR -22
347 #define MPLS_DEC_RETMSGERROR -23
348 #define MPLS_PDU_LENGTH_ERROR -24
349 #define MPLS_ENC_CHPERROR -25
350 #define MPLS_DEC_CHPERROR -26
351 #define MPLS_ENC_CSNERROR -27
352 #define MPLS_DEC_CSNERROR -28
353 #define MPLS_ENC_TRADRERROR -29
354 #define MPLS_DEC_TRADRERROR -30
355 #define MPLS_ENC_ADRLISTERROR -31
356 #define MPLS_DEC_ADRLISTERROR -32
357 #define MPLS_WC_FECERROR -33
358 #define MPLS_PATHVECTORERROR -34
359 #define MPLS_ENC_FECERROR -35
360 #define MPLS_DEC_FECERROR -36
361 #define MPLS_ENC_GENLBLERROR -37
362 #define MPLS_DEC_GENLBLERROR -38
363 #define MPLS_ENC_MAPATMERROR -39
364 #define MPLS_DEC_MAPATMERROR -40
365 #define MPLS_ENC_FRLBLERROR -41
366 #define MPLS_DEC_FRLBLERROR -42
367 #define MPLS_ENC_COSERROR -43
368 #define MPLS_DEC_COSERROR -44
369 #define MPLS_ENC_HOPCOUNTERROR -45
370 #define MPLS_DEC_HOPCOUNTERROR -46
371 #define MPLS_ENC_PATHVECERROR -47
372 #define MPLS_DEC_PATHVECERROR -48
373 #define MPLS_ENC_LBLMSGIDERROR -49
374 #define MPLS_DEC_LBLMSGIDERROR -50
375 #define MPLS_ENC_HDRTLVERROR -51
376 #define MPLS_DEC_HDRTLVERROR -52
377 #define MPLS_ENC_FECELEMERROR -53
378 #define MPLS_DEC_FECELEMERROR -54
379 #define MPLS_ENC_FSPLBLERROR -55
380 #define MPLS_DEC_FSPLBLERROR -56
381 #define MPLS_ENC_ERHOPERROR -57
382 #define MPLS_DEC_ERHOPERROR -58
383 #define MPLS_ENC_ERTLVERROR -59
384 #define MPLS_DEC_ERTLVERROR -60
385 #define MPLS_ENC_ERHOPLENERROR -61
386 #define MPLS_DEC_ERHOPLENERROR -62
387 #define MPLS_TLVTYPEERROR -63
388 #define MPLS_MSGTYPEERROR -64
389 #define MPLS_FECERROR -65
390 #define MPLS_ENC_TRAFFICERROR -66
391 #define MPLS_DEC_TRAFFICERROR -67
392 #define MPLS_ENC_LSPIDERROR -68
393 #define MPLS_DEC_LSPIDERROR -69
394 #define MPLS_ENC_RESCLSERROR -70
395 #define MPLS_DEC_RESCLSERROR -71
396 #define MPLS_ENC_PREEMPTERROR -72
397 #define MPLS_DEC_PREEMPTERROR -73
398 #define MPLS_ENC_PINNINGERROR -74
399 #define MPLS_DEC_PINNINGERROR -75
400 #define MPLS_FLOATTYPEERROR -76
401 #define MPLS_FECTLVERROR -77
402 #define MPLS_IPV4LENGTHERROR -78
403 #define MPLS_ER_HOPSNUMERROR -79
405 /**********************************************************************
406 LDP header
408 0 1 2 3
409 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
410 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
411 | Version | PDU Length |
412 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
413 | LDP Identifier |
414 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
416 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
417 **********************************************************************/
419 typedef struct mplsLdpHeader_s {
420 u_short protocolVersion;
421 u_short pduLength; /* length excluding the version and length */
422 u_int lsrAddress; /* IP address assigned to LSR */
423 u_short labelSpace; /* within LSR */
425 } mplsLdpHeader_t;
427 /**********************************************************************
428 LDP Messages (All LDP messages have the following format:)
430 0 1 2 3
431 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
432 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
433 |U| Message Type | Message Length |
434 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
435 | Message ID |
436 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
439 | Mandatory Parameters |
442 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
445 | Optional Parameters |
448 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
449 Note: the U flag is ignored for now. There is not check for its value.
450 **********************************************************************/
452 typedef struct mplsLdpMsgFlag_s {
453 BITFIELDS_ASCENDING_2(u_short uBit:1, u_short msgType:15)
454 } mplsLdpMsgFlag_t;
456 typedef struct mplsLdpMsg_s {
457 union {
458 struct mplsLdpMsgFlag_s flags;
459 u_short mark;
460 } flags;
462 u_short msgLength; /* msgId + mandatory param + optional param */
463 u_int msgId; /* used to identify the notification msg */
465 } mplsLdpMsg_t;
467 typedef struct mplsLdpUnknownMsg_s {
468 struct mplsLdpMsg_s baseMsg;
469 u_char data[MPLS_NOT_MAXSIZE];
471 } mplsLdpUnknownMsg_t;
473 /**********************************************************************
474 Type-Length-Value Encoding
476 0 1 2 3
477 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
478 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
479 |U|F| Type | Length |
480 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
482 | Value |
485 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
487 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
488 Note: the decode functions for tlv do not check the values for
489 F flag. They check only the value of the U flag; if
490 it is set will ignore the tlv and keep processing the message;
491 otherwise will ignore the message and return error. Please note
492 that the unknown tlv which is skipped will not be stored anywhere.
493 **********************************************************************/
495 typedef struct mplsLdpTlvFlag_s {
496 BITFIELDS_ASCENDING_3(u_short uBit:1, u_short fBit:1, u_short tBit:14)
497 } mplsLdpTlvFlag_t;
499 typedef struct mplsLdpTlv_s {
500 union {
501 struct mplsLdpTlvFlag_s flags;
502 u_short mark;
503 } flags;
505 u_short length; /* length of the value field */
507 } mplsLdpTlv_t;
509 /**********************************************************************
510 Common Session Parameters TLV
512 0 1 2 3
513 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
514 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
515 |U|F| Common Sess Parms (0x0500)| Length |
516 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
517 | Protocol Version | Keep Alive Time |
518 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
519 |A|D| Reserved | PVLim | Max PDU Length |
520 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
521 | Receiver LDP Identifer |
522 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
524 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++
525 ***********************************************************************/
527 typedef struct mplsLdpCspFlag_s {
528 BITFIELDS_ASCENDING_4(u_short lad:1, /* 1 = downstream on demand */
529 u_short ld:1, /* loop detection */
530 u_short res:6, /* reserved */
531 u_short pvl:8 /* path vec limit */
533 } mplsLdpCspFlag_t;
535 typedef struct mplsLdpCspTlv_s {
536 struct mplsLdpTlv_s baseTlv;
537 u_short protocolVersion;
538 u_short holdTime; /* proposed keep alive interval */
540 union {
541 struct mplsLdpCspFlag_s flags;
542 u_short mark;
543 } flags;
545 u_short maxPduLen;
546 u_int rcvLsrAddress;
547 u_short rcvLsId;
549 } mplsLdpCspTlv_t;
551 /***********************************************************************
552 ATM Label Range Component
554 0 1 2 3
555 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
556 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
557 | Res | Minimum VPI | Minimum VCI |
558 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
559 | Res | Maximum VPI | Maximum VCI |
560 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
561 ***********************************************************************/
563 typedef struct mplsLdpAtmLblRngFlag_s {
564 BITFIELDS_ASCENDING_3(u_int res1:4, /* reserved : 0 on transmision */
565 u_int minVpi:12, /* if <12 bits right justified */
566 u_int minVci:16 /* if <16 bits right justified */
568 BITFIELDS_ASCENDING_3(u_int res2:4, /* reserved : 0 on transmision */
569 u_int maxVpi:12, /* if <12 bits right justified */
570 u_int maxVci:16 /* if <16 bits right justified */
572 } mplsLdpAtmLblRngFlag_t;
574 typedef struct mplsLdpAtmLblRng_s {
575 union {
576 struct mplsLdpAtmLblRngFlag_s flags;
577 u_int mark[2];
578 } flags;
579 } mplsLdpAtmLblRng_t;
581 /***********************************************************************
582 Flags for ATM Session Parameters TLV and
583 Frame Relay Session Parameters TLV
585 Note: both types of session parameters have the same type of flags;
586 use then the same struct
587 ***********************************************************************/
589 typedef struct mplsLdpSPFlag_s {
590 BITFIELDS_ASCENDING_4(u_int mergeType:2, /* merge typ */
591 u_int numLblRng:4, /* # of label range com */
592 u_int dir:1, /* 0 => bidirectional */
593 u_int res:25)
594 } mplsLdpSPFlag_t;
596 /***********************************************************************
597 ATM Session Parameters TLV
599 0 1 2 3
600 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
601 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
602 |U|F| ATM Sess Parms (0x0501) | Length |
603 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
604 | M | N |D| Reserved |
605 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
606 | ATM Label Range Component 1 |
607 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
611 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
612 | ATM Label Range Component N |
613 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
614 ***********************************************************************/
616 typedef struct mplsLdpAspTlv_s {
617 struct mplsLdpTlv_s baseTlv;
618 union {
619 struct mplsLdpSPFlag_s flags;
620 u_int mark;
621 } flags;
622 struct mplsLdpAtmLblRng_s lblRngList[MPLS_ATMLBLMAXLEN];
624 } mplsLdpAspTlv_t;
626 /***********************************************************************
627 Frame Relay Label Range Component
629 0 1 2 3
630 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
631 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
632 | Reserved |Len| Minimum DLCI |
633 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
634 | Reserved | Maximum DLCI |
635 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
636 ***********************************************************************/
638 typedef struct mplsLdpFrFlag_s {
639 BITFIELDS_ASCENDING_3(u_int res_min:7, u_int len:2, u_int minDlci:23)
640 BITFIELDS_ASCENDING_2(u_int res_max:9, u_int maxDlci:23)
641 } mplsLdpFrFlag_t;
643 typedef struct mplsLdpFrLblRng_s {
644 union {
645 struct mplsLdpFrFlag_s flags;
646 u_int mark[2];
647 } flags;
649 } mplsLdpFrLblRng_t;
651 /**********************************************************************
652 Frame Relay Session Parameters TLV
654 0 1 2 3
655 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
656 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
657 |U|F| FR Sess Parms (0x0502) | Length |
658 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
659 | M | N |D| Reserved |
660 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
661 | Frame Relay Label Range Component 1 |
662 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
666 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
667 | Frame Relay Label Range Component N |
668 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
669 ***********************************************************************/
671 typedef struct mplsLdpFspTlv_s {
672 struct mplsLdpTlv_s baseTlv;
673 union {
674 struct mplsLdpSPFlag_s flags;
675 u_int mark;
676 } flags;
677 struct mplsLdpFrLblRng_s lblRngList[MPLS_FRLBLMAXLEN];
679 } mplsLdpFspTlv_t;
681 /***********************************************************************
682 Initialization Message Encoding
684 0 1 2 3
685 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
686 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
687 |U| Initialization (0x0200) | Message Length |
688 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
689 | Message ID |
690 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
691 | Common Session Parameters TLV |
692 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
693 | Optional Parameters |
694 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
695 ***********************************************************************/
697 typedef struct mplsLdpInitMsg_s {
698 struct mplsLdpMsg_s baseMsg;
699 struct mplsLdpCspTlv_s csp;
700 struct mplsLdpAspTlv_s asp;
701 struct mplsLdpFspTlv_s fsp;
702 u_char cspExists:1;
703 u_char aspExists:1;
704 u_char fspExists:1;
706 } mplsLdpInitMsg_t;
708 /***********************************************************************
709 Status Code Encoding
711 0 1 2 3
712 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
713 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
714 |E|F| Status Data |
715 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
716 ***********************************************************************/
717 typedef struct mplsLdpStautsFlag_s {
718 BITFIELDS_ASCENDING_3(u_int error:1, /* E bit */
719 u_int forward:1, /* F bit */
720 u_int status:30)
721 } mplsLdpStautsFlag_t;
723 /***********************************************************************
724 Status (TLV) Encoding
726 0 1 2 3
727 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
728 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
729 |U|F| Status (0x0300) | Length |
730 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
731 | Status Code |
732 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
733 | Message ID |
734 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
735 | Message Type |
736 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
737 ***********************************************************************/
739 typedef struct mplsLdpStatusTlv_s {
740 struct mplsLdpTlv_s baseTlv;
741 union {
742 struct mplsLdpStautsFlag_s flags;
743 u_int mark;
744 } flags;
745 u_int msgId;
746 u_short msgType;
748 } mplsLdpStatusTlv_t;
750 /***********************************************************************
751 Extended Status (TLV) Encoding
752 ***********************************************************************/
754 typedef struct mplsLdpExStatusTlv_s {
755 struct mplsLdpTlv_s baseTlv;
756 u_int value; /* additional info for status */
758 } mplsLdpExStatusTlv_t;
760 /***********************************************************************
761 Returned PDU (TLV) Encoding
762 ***********************************************************************/
764 typedef struct mplsLdpRetPduTlv_s {
765 struct mplsLdpTlv_s baseTlv;
766 struct mplsLdpHeader_s headerTlv;
767 u_char data[MPLS_NOT_MAXSIZE];
769 } mplsLdpRetPduTlv_t;
771 /***********************************************************************
772 Returned MSG (TLV) Encoding
773 ***********************************************************************/
775 typedef struct mplsLdpRetMsgTlv_s {
776 struct mplsLdpTlv_s baseTlv;
777 u_short msgType;
778 u_short msgLength;
779 u_char data[MPLS_NOT_MAXSIZE];
781 } mplsLdpRetMsgTlv_t;
783 /***********************************************************************
784 LSPID Tlv encoding
786 0 1 2 3
787 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
788 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
789 |U|F| LSPID-TLV (0x0821) | Length |
790 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
791 | Reserved | Local CRLSP ID |
792 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
793 | Ingress LSR Router ID |
794 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
795 ***********************************************************************/
797 typedef struct mplsLdpLspIdTlv_s {
798 struct mplsLdpTlv_s baseTlv;
799 u_short res;
800 u_short localCrlspId;
801 u_int routerId; /* ingress lsr router id */
803 } mplsLdpLspIdTlv_t;
805 /***********************************************************************
806 Notification Message Encoding
808 0 1 2 3
809 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
810 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
811 |U| Notification (0x0001) | Message Length |
812 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
813 | Message ID |
814 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
815 | Status (TLV) |
816 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
817 | Optional Parameters |
818 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
819 | LSPID TLV (optional for CR-LDP) |
820 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
821 ***********************************************************************/
823 typedef struct mplsLdpNotifMsg_s {
824 struct mplsLdpMsg_s baseMsg;
825 struct mplsLdpStatusTlv_s status;
826 struct mplsLdpExStatusTlv_s exStatus; /* extended status tlv */
827 struct mplsLdpRetPduTlv_s retPdu; /* returned PDU tlv */
828 struct mplsLdpRetMsgTlv_s retMsg; /* returned MSG tlv */
829 struct mplsLdpLspIdTlv_s lspidTlv; /* lspid tlv */
831 u_char statusTlvExists:1;
832 u_char exStatusTlvExists:1;
833 u_char retPduTlvExists:1;
834 u_char retMsgTlvExists:1;
835 u_char lspidTlvExists:1;
837 } mplsLdpNotifMsg_t;
839 /***********************************************************************
840 Common Hello Parameters Tlv encoding
842 0 1 2 3
843 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
844 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
845 |U|F| Common Hello Parms(0x0400)| Length |
846 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
847 | Hold Time |T|R| Reserved |
848 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
849 ***********************************************************************/
850 typedef struct mplsLdpChpFlag_s {
851 BITFIELDS_ASCENDING_3(u_short target:1, /* T bit */
852 u_short request:1, /* R bit */
853 u_short res:14)
854 } mplsLdpChpFlag_t;
856 typedef struct mplsLdpChpTlv_s {
857 struct mplsLdpTlv_s baseTlv;
858 u_short holdTime;
859 union {
860 struct mplsLdpChpFlag_s flags;
861 u_short mark;
862 } flags;
864 } mplsLdpChpTlv_t;
866 /***********************************************************************
867 Transport Address (TLV) Encoding
868 ***********************************************************************/
870 typedef struct mplsLdpTrAdrTlv_s {
871 struct mplsLdpTlv_s baseTlv;
872 u_int address;
874 } mplsLdpTrAdrTlv_t;
876 /***********************************************************************
877 Configuration Sequence Number (TLV) Encoding
878 ***********************************************************************/
880 typedef struct mplsLdpCsnTlv_s {
881 struct mplsLdpTlv_s baseTlv;
882 u_int seqNumber;
884 } mplsLdpCsnTlv_t;
886 /***********************************************************************
887 Hello message encoding
889 0 1 2 3
890 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
891 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
892 |U| Hello (0x0100) | Message Length |
893 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
894 | Message ID |
895 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
896 | Common Hello Parameters TLV |
897 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
898 | Optional Parameters |
899 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
900 ***********************************************************************/
902 typedef struct mplsLdpHelloMsg_s {
903 struct mplsLdpMsg_s baseMsg;
904 struct mplsLdpChpTlv_s chp; /* common hello param tlv */
905 struct mplsLdpTrAdrTlv_s trAdr; /* transport address tlv */
906 struct mplsLdpCsnTlv_s csn; /* configuration seq # tlv */
907 u_char chpTlvExists:1;
908 u_char trAdrTlvExists:1;
909 u_char csnTlvExists:1;
911 } mplsLdpHelloMsg_t;
913 /***********************************************************************
914 KeepAlive Message encoding
916 0 1 2 3
917 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
918 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
919 |U| KeepAlive (0x0201) | Message Length |
920 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
921 | Message ID |
922 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
923 | Optional Parameters |
924 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
926 Note: there are no optional param defined for keep alive.
927 ***********************************************************************/
929 typedef struct mplsLdpKeepAlMsg_s {
930 struct mplsLdpMsg_s baseMsg;
932 } mplsLdpKeepAlMsg_t;
934 /***********************************************************************
935 Address List TLV encoding
937 0 1 2 3
938 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
939 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
940 |U|F| Address List (0x0101) | Length |
941 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
942 | Address Family | |
943 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
945 | Addresses |
948 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
949 ***********************************************************************/
951 typedef struct mplsLdpAdrTlv_s {
952 struct mplsLdpTlv_s baseTlv;
953 u_short addrFamily;
954 u_int address[MPLS_MAXNUMBERADR];
956 } mplsLdpAdrTlv_t;
958 /***********************************************************************
959 Address (0x0300) / Address Withdraw(0x0301) message encoding
961 0 1 2 3
962 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
963 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
964 |U| Address | Message Length |
965 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
966 | Message ID |
967 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
969 | Address List TLV |
971 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
972 | Optional Parameters |
973 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
975 Note: there are no optional param defined for address message.
976 ***********************************************************************/
978 typedef struct mplsLdpAdrMsg_s {
979 struct mplsLdpMsg_s baseMsg;
980 struct mplsLdpAdrTlv_s addressList;
981 u_char adrListTlvExists:1;
983 } mplsLdpAdrMsg_t;
985 /***********************************************************************
986 Wildcard FEC Element encoding
987 ***********************************************************************/
989 typedef struct mplsLdpWildFec_s {
990 u_char type;
992 } mplsLdpWildFec_t;
994 /***********************************************************************
995 Prefix FEC Element encoding
997 0 1 2 3
998 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
999 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1000 | Prefix (2) | Address Family | PreLen |
1001 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1002 | Prefix |
1003 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1005 Host Address FEC Element encoding
1007 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1008 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1009 | Host Addr (3) | Address Family | Host Addr Len |
1010 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1011 | Host Addr |
1012 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1014 Note: the code handles prefixes and host addresses whose length is
1015 less or equal to 4 bytes.
1016 ***********************************************************************/
1018 typedef struct mplsLdpAddressFec_s {
1019 u_char type;
1020 u_short addressFam;
1021 u_char preLen; /* prefix FEC: length of the adr prefix (in bits)
1022 or host adr FEC: length of the host address (in
1023 bytes) */
1024 u_int address;
1026 } mplsLdpAddressFec_t;
1028 /***********************************************************************
1029 CRLSP FEC Element encoding
1031 0 1 2 3
1032 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1033 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1034 | CR-LSP (4) | Reserved |
1035 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1036 ***********************************************************************/
1038 typedef struct mplsLdpCrlspFec_s {
1039 u_char type;
1040 u_char res1; /* reserved */
1041 u_short res2; /* reserved */
1043 } mplsLdpCrlspFec_t;
1045 /***********************************************************************
1046 FEC Tlv encoding
1048 0 1 2 3
1049 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1050 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1051 |U|F| FEC (0x0100) | Length |
1052 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1053 | FEC Element 1 |
1054 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1058 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1059 | FEC Element n |
1060 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1061 ***********************************************************************/
1063 typedef union mplsFecElement_u {
1064 struct mplsLdpAddressFec_s addressEl; /* prefix | host adr */
1065 struct mplsLdpWildFec_s wildcardEl; /* for wilcard fec */
1066 struct mplsLdpCrlspFec_s crlspEl; /* CRLSP fec elem */
1068 } mplsFecElement_t;
1070 typedef struct mplsLdpFecTlv_s {
1071 struct mplsLdpTlv_s baseTlv;
1072 union mplsFecElement_u fecElArray[MPLS_MAXNUMFECELEMENT];
1073 u_short fecElemTypes[MPLS_MAXNUMFECELEMENT];
1074 u_char wcElemExists:1;
1075 u_short numberFecElements;
1077 } mplsLdpFecTlv_t;
1079 /***********************************************************************
1080 Generic Label Tlv encoding
1082 0 1 2 3
1083 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1084 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1085 |U|F| Generic Label (0x0200) | Length |
1086 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1087 | Label |
1088 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1089 ***********************************************************************/
1091 typedef struct mplsLdpGenLblTlv_s {
1092 struct mplsLdpTlv_s baseTlv;
1093 u_int label; /* 20-bit number in 4 octet field */
1095 } mplsLdpGenLblTlv_t;
1097 /***********************************************************************
1098 Atm Label Tlv encoding
1100 0 1 2 3
1101 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1102 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1103 |U|F| ATM Label (0x0201) | Length |
1104 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1105 |Res| V | VPI | VCI |
1106 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1107 ***********************************************************************/
1109 typedef struct mplsLdpAtmLblFlag_s {
1110 BITFIELDS_ASCENDING_3(u_short res:2, u_short v:2, u_short vpi:12)
1111 } mplsLdpAtmLblFlag_t;
1113 typedef struct mplsLdpAtmLblTlv_s {
1114 struct mplsLdpTlv_s baseTlv;
1116 union {
1117 struct mplsLdpAtmLblFlag_s flags;
1118 u_short mark;
1119 } flags;
1121 u_short vci;
1123 } mplsLdpAtmLblTlv_t;
1125 /***********************************************************************
1126 Frame Relay Label Tlv encoding
1128 0 1 2 3
1129 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1130 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1131 |U|F| Frame Relay Label (0x0202)| Length |
1132 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1133 | Reserved |Len| DLCI |
1134 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1135 ***********************************************************************/
1137 typedef struct mplsLdpFrLblFlag_s {
1138 BITFIELDS_ASCENDING_3(u_int res:7, u_int len:2, u_int dlci:23)
1140 } mplsLdpFrLblFlag_t;
1142 typedef struct mplsLdpFrLblTlv_s {
1143 struct mplsLdpTlv_s baseTlv;
1145 union {
1146 struct mplsLdpFrLblFlag_s flags;
1147 u_int mark;
1148 } flags;
1150 } mplsLdpFrLblTlv_t;
1152 /***********************************************************************
1153 Hop Count Tlv encoding
1155 0 1 2 3
1156 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1157 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1158 |U|F| Hop Count (0x0103) | Length |
1159 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1160 | HC Value |
1161 +-+-+-+-+-+-+-+-+
1162 ***********************************************************************/
1164 typedef struct mplsLdpHopTlv_s {
1165 struct mplsLdpTlv_s baseTlv;
1166 u_char hcValue; /* hop count value */
1168 } mplsLdpHopTlv_t;
1170 /***********************************************************************
1171 Path Vector Tlv encoding
1173 0 1 2 3
1174 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1175 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1176 |U|F| Path Vector (0x0104) | Length |
1177 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1178 | LSR Id 1 |
1179 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1183 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1184 | LSR Id n |
1185 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1186 ***********************************************************************/
1188 typedef struct mplsLdpPathTlv_s {
1189 struct mplsLdpTlv_s baseTlv;
1190 u_int lsrId[MPLS_MAXHOPSNUMBER];
1192 } mplsLdpPathTlv_t;
1194 /***********************************************************************
1195 Lbl request message id Tlv encoding
1196 ***********************************************************************/
1198 typedef struct mplsLdpLblMsgIdTlv_s {
1199 struct mplsLdpTlv_s baseTlv;
1200 u_int msgId;
1202 } mplsLdpLblMsgIdTlv_t;
1204 /***********************************************************************
1205 Preemption Tlv encoding
1207 0 1 2 3
1208 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1209 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1210 |U|F| Preemption-TLV (0x0820) | Length |
1211 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1212 | SetPrio | HoldPrio | Reserved |
1213 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1214 ***********************************************************************/
1216 typedef struct mplsLdpPreemptTlv_s {
1217 struct mplsLdpTlv_s baseTlv;
1218 u_char setPrio; /* 0 => most important path */
1219 u_char holdPrio; /* 0 => most important path */
1220 u_short res;
1222 } mplsLdpPreemptTlv_t;
1224 /***********************************************************************
1225 Resource class Tlv encoding
1227 0 1 2 3
1228 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1229 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1230 |U|F| ResCls-TLV (0x0822) | Length |
1231 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1232 | RsCls |
1233 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1234 ***********************************************************************/
1236 typedef struct mplsLdpResClsTlv_s {
1237 struct mplsLdpTlv_s baseTlv;
1238 u_int rsCls; /* resource class bit mask */
1240 } mplsLdpResClsTlv_t;
1242 /***********************************************************************
1243 Lbl return message id Tlv encoding
1244 ***********************************************************************/
1246 typedef struct mplsLdpRetMsgIdTlv_s {
1247 struct mplsLdpTlv_s baseTlv;
1249 } mplsLdpLblRetMsgIdTlv_t;
1251 /***********************************************************************
1252 ER flag structure which is common to IPV4 and IPV6 ER TLV
1253 ***********************************************************************/
1255 typedef struct mplsLdpErIPFlag_s {
1256 BITFIELDS_ASCENDING_3(u_int l:1, /* 0 => loose hop */
1257 u_int res:23, u_int preLen:8)
1258 } mplsLdpErIPFlag_t;
1260 /***********************************************************************
1261 ER flag structure which is common to AS and LSPID ER TLV
1262 ***********************************************************************/
1263 typedef struct mplsLdpErFlag_s {
1264 BITFIELDS_ASCENDING_2(u_short l:1, /* 0 => loose hop */
1265 u_short res:15)
1266 } mplsLdpErFlag_t;
1268 /***********************************************************************
1269 Explicit Routing IPv4 Tlv encoding
1271 0 1 2 3
1272 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1273 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1274 |U|F| 0x801 | Length |
1275 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1276 |L| Reserved | PreLen |
1277 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1278 | IPv4 Address (4 bytes) |
1279 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1280 ***********************************************************************/
1282 typedef struct mplsLdpErIpv4_s {
1283 struct mplsLdpTlv_s baseTlv;
1284 union {
1285 struct mplsLdpErIPFlag_s flags;
1286 u_int mark;
1287 } flags;
1288 u_int address;
1290 } mplsLdpErIpv4_t;
1292 /***********************************************************************
1293 Explicit Routing IPv6 Tlv encoding
1295 0 1 2 3
1296 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1297 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1298 |U|F| 0x802 | Length |
1299 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1300 |L| Reserved | PreLen |
1301 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1302 | IPV6 address |
1303 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1304 | IPV6 address (continued) |
1305 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1306 | IPV6 address (continued) |
1307 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1308 | IPV6 address (continued) |
1309 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1310 ***********************************************************************/
1312 typedef struct mplsLdpErIpv6_s {
1313 struct mplsLdpTlv_s baseTlv;
1314 union {
1315 struct mplsLdpErIPFlag_s flags;
1316 u_int mark;
1317 } flags;
1318 u_char address[MPLS_IPV6ADRLENGTH];
1320 } mplsLdpErIpv6_t;
1322 /***********************************************************************
1323 Explicit Routing Autonomous systen number Tlv encoding
1325 0 1 2 3
1326 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1327 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1328 |U|F| 0x803 | Length |
1329 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1330 |L| Reserved | AS Number |
1331 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1332 ***********************************************************************/
1334 typedef struct mplsLdpErAs_s {
1335 struct mplsLdpTlv_s baseTlv;
1336 union {
1337 struct mplsLdpErFlag_s flags;
1338 u_short mark;
1339 } flags;
1340 u_short asNumber;
1342 } mplsLdpErAs_t;
1344 /***********************************************************************
1345 Explicit Routing LSPID Tlv encoding
1347 0 1 2 3
1348 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1349 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1350 |U|F| 0x804 | Length |
1351 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1352 |L| Reserved | Local LSPID |
1353 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1354 | Ingress LSR Router ID |
1355 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1356 ***********************************************************************/
1358 typedef struct mplsLdpErLspId_s {
1359 struct mplsLdpTlv_s baseTlv;
1360 union {
1361 struct mplsLdpErFlag_s flags;
1362 u_short mark;
1363 } flags;
1364 u_short lspid;
1365 u_int routerId;
1367 } mplsLdpErLspId_t;
1369 /***********************************************************************
1370 Constraint Routing Tlv encoding
1372 0 1 2 3
1373 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1374 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1375 |U|F| ER-TLV (0x0800) | Length |
1376 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1377 | ER-Hop TLV 1 |
1378 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1379 | ER-Hop TLV 2 |
1380 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1381 ~ ............ ~
1382 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1383 | ER-Hop TLV n |
1384 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1385 ***********************************************************************/
1387 typedef union mplsLdpErHop_u {
1388 struct mplsLdpErIpv4_s erIpv4;
1389 struct mplsLdpErIpv6_s erIpv6;
1390 struct mplsLdpErAs_s erAs;
1391 struct mplsLdpErLspId_s erLspId;
1393 } mplsLdpErHop_t;
1395 typedef struct mplsLdpErTlv_s {
1396 struct mplsLdpTlv_s baseTlv;
1397 union mplsLdpErHop_u erHopArray[MPLS_MAX_ER_HOPS];
1398 u_short erHopTypes[MPLS_MAX_ER_HOPS]; /* need to know the
1399 types when handle
1400 the union */
1401 u_short numberErHops;
1403 } mplsLdpErTlv_t;
1405 /***********************************************************************
1406 Traffic parameters TLV
1408 0 1 2 3
1409 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1410 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1411 |U|F| Traf. Param. TLV (0x0810)| Length |
1412 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1413 | Flags | Frequency | Reserved | Weight |
1414 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1415 | Peak Data Rate (PDR) |
1416 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1417 | Peak Burst Size (PBS) |
1418 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1419 | Committed Data Rate (CDR) |
1420 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1421 | Committed Burst Size (CBS) |
1422 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1423 | Excess Burst Size (EBS) |
1424 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1426 Flag field:
1427 +--+--+--+--+--+--+--+--+
1428 | Res |F6|F5|F4|F3|F2|F1|
1429 +--+--+--+--+--+--+--+--+
1430 ***********************************************************************/
1432 typedef struct mplsLdpTrafficFlag_s {
1433 BITFIELDS_ASCENDING_7(u_char res:2,
1434 u_char f6Bit:1,
1435 u_char f5Bit:1,
1436 u_char f4Bit:1, u_char f3Bit:1, u_char f2Bit:1, u_char f1Bit:1)
1437 } mplsLdpTrafficFlag_t;
1439 typedef struct mplsLdpTrafficTlv_s {
1440 struct mplsLdpTlv_s baseTlv;
1441 union {
1442 struct mplsLdpTrafficFlag_s flags;
1443 u_char mark;
1444 } flags;
1445 u_char freq;
1446 u_char res;
1447 u_char weight;
1448 union {
1449 float pdr;
1450 u_int mark;
1451 } pdr;
1452 union {
1453 float pbs;
1454 u_int mark;
1455 } pbs;
1456 union {
1457 float cdr;
1458 u_int mark;
1459 } cdr;
1460 union {
1461 float cbs;
1462 u_int mark;
1463 } cbs;
1464 union {
1465 float ebs;
1466 u_int mark;
1467 } ebs;
1469 } mplsLdpTrafficTlv_t;
1471 /***********************************************************************
1472 Route pinning TLV
1474 0 1 2 3
1475 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1476 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1477 |U|F| 0x823 | Length |
1478 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1479 |P| Reserved |
1480 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1481 ***********************************************************************/
1483 typedef struct mplsLdpPinningTlvFlag_s {
1484 BITFIELDS_ASCENDING_2(u_int pBit:1, /* 1 => route pinning requested */
1485 u_int res:31)
1486 } mplsLdpPinningTlvFlag_t;
1488 typedef struct mplsLdpPinningTlv_s {
1489 struct mplsLdpTlv_s baseTlv;
1490 union {
1491 struct mplsLdpPinningTlvFlag_s flags;
1492 u_int mark;
1493 } flags;
1494 } mplsLdpPinningTlv_t;
1496 /***********************************************************************
1497 Label Mapping Message encoding
1499 0 1 2 3
1500 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1501 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1502 |U| Label Mapping (0x0400) | Message Length |
1503 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1504 | Message ID |
1505 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1506 | FEC TLV |
1507 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1508 | Label TLV |
1509 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1510 | Label Request Message ID TLV (mandatory) |
1511 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1512 | LSPID TLV (CR-LDP, mandatory) |
1513 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1514 | Traffic TLV (CR-LDP, optional) |
1515 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1516 ***********************************************************************/
1518 typedef struct mplsLdpLblMapMsg_s {
1519 struct mplsLdpMsg_s baseMsg;
1521 /* FEC tlv */
1522 struct mplsLdpFecTlv_s fecTlv;
1524 /* Label TLV */
1525 struct mplsLdpGenLblTlv_s genLblTlv; /* generic label tlv */
1526 struct mplsLdpAtmLblTlv_s atmLblTlv; /* atm label tlv */
1527 struct mplsLdpFrLblTlv_s frLblTlv; /* fr label tlv */
1529 /* Optional parameters */
1530 struct mplsLdpHopTlv_s hopCountTlv; /* hop count tlv */
1531 struct mplsLdpPathTlv_s pathVecTlv; /* path vector tlv */
1532 struct mplsLdpLblMsgIdTlv_s lblMsgIdTlv; /* lbl msg id tlv */
1533 struct mplsLdpLspIdTlv_s lspidTlv; /* lspid tlv */
1534 struct mplsLdpTrafficTlv_s trafficTlv; /* traffic tlv */
1536 u_char fecTlvExists:1;
1537 u_char genLblTlvExists:1;
1538 u_char atmLblTlvExists:1;
1539 u_char frLblTlvExists:1;
1540 u_char hopCountTlvExists:1;
1541 u_char pathVecTlvExists:1;
1542 u_char lblMsgIdTlvExists:1;
1543 u_char lspidTlvExists:1;
1544 u_char trafficTlvExists:1;
1546 } mplsLdpLblMapMsg_t;
1548 /***********************************************************************
1549 Label Request Message encoding
1551 0 1 2 3
1552 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1553 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1554 |U| Label Request (0x0401) | Message Length |
1555 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1556 | Message ID |
1557 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1558 | FEC TLV |
1559 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1560 | Return Message ID TLV (mandatory) |
1561 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1562 | LSPID TLV (CR-LDP, mandatory) |
1563 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1564 | ER-TLV (CR-LDP, optional) |
1565 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1566 | Traffic TLV (CR-LDP, optional) |
1567 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1568 | Pinning TLV (CR-LDP, optional) |
1569 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1570 | Resource Class TLV (CR-LDP, optional) |
1571 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1572 | Pre-emption TLV (CR-LDP, optional) |
1573 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1574 ***********************************************************************/
1576 typedef struct mplsLdpLblReqMsg_s {
1577 struct mplsLdpMsg_s baseMsg;
1579 /* FEC tlv */
1580 struct mplsLdpFecTlv_s fecTlv;
1582 /* Optional parameters */
1583 struct mplsLdpHopTlv_s hopCountTlv; /* hop count tlv */
1584 struct mplsLdpPathTlv_s pathVecTlv; /* path vector tlv */
1586 /* Optional parameters for CR */
1587 struct mplsLdpRetMsgIdTlv_s lblMsgIdTlv; /* lbl msg id tlv */
1588 struct mplsLdpErTlv_s erTlv; /* constraint rtg tlv */
1589 struct mplsLdpTrafficTlv_s trafficTlv; /* traffic tlv */
1590 struct mplsLdpLspIdTlv_s lspidTlv; /* lspid tlv */
1591 struct mplsLdpPinningTlv_s pinningTlv; /* pinning tlv */
1592 struct mplsLdpResClsTlv_s resClassTlv; /* resource class tlv */
1593 struct mplsLdpPreemptTlv_s preemptTlv; /* peemtion tlv */
1595 u_char fecTlvExists:1;
1596 u_char hopCountTlvExists:1;
1597 u_char pathVecTlvExists:1;
1598 u_char lblMsgIdTlvExists:1;
1599 u_char erTlvExists:1;
1600 u_char trafficTlvExists:1;
1601 u_char lspidTlvExists:1;
1602 u_char pinningTlvExists:1;
1603 u_char recClassTlvExists:1;
1604 u_char preemptTlvExists:1;
1606 } mplsLdpLblReqMsg_t;
1608 /***********************************************************************
1610 Label Withdraw Message encoding
1612 0 1 2 3
1613 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1614 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1615 |U| Label Withdraw (0x0402) | Message Length |
1616 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1617 | Message ID |
1618 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1619 | FEC TLV |
1620 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1621 | Label TLV (optional) |
1622 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1623 | LSPID TLV (optional for CR-LDP) |
1624 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1626 Label Release Message encoding
1628 0 1 2 3
1629 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1630 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1631 |U| Label Release (0x0403) | Message Length |
1632 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1633 | Message ID |
1634 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1635 | FEC TLV |
1636 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1637 | Label TLV (optional) |
1638 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1639 | LSPID TLV (optional for CR-LDP) |
1640 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1642 Note: the Label Withdraw Message encoding and the Label Release Message enc
1643 look very much the same. I will create only one type of struct for
1644 both message types.
1645 The Label Withdraw Message and Label Release Message can optionally
1646 carry LSPID TLV.
1647 ***********************************************************************/
1649 typedef struct mplsLdpLbl_W_R_Msg_s {
1650 struct mplsLdpMsg_s baseMsg;
1652 /* FEC tlv */
1653 struct mplsLdpFecTlv_s fecTlv;
1655 /* Label TLV */
1656 struct mplsLdpGenLblTlv_s genLblTlv; /* generic label tlv */
1657 struct mplsLdpAtmLblTlv_s atmLblTlv; /* atm label tlv */
1658 struct mplsLdpFrLblTlv_s frLblTlv; /* fr label tlv */
1659 struct mplsLdpLspIdTlv_s lspidTlv; /* lspid tlv */
1661 u_char fecTlvExists:1;
1662 u_char genLblTlvExists:1;
1663 u_char atmLblTlvExists:1;
1664 u_char frLblTlvExists:1;
1665 u_char lspidTlvExists:1;
1667 } mplsLdpLbl_W_R_Msg_t;
1669 /***********************************************************************
1670 Label Abort Request Message encoding
1672 0 1 2 3
1673 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1674 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1675 |U| Label Abort Req (0x0404) | Message Length |
1676 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1677 | Message ID |
1678 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1679 | FEC TLV |
1680 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1681 | Label Request Message ID TLV |
1682 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1683 ***********************************************************************/
1685 typedef struct mplsLdpLblAbortMsg_s {
1686 struct mplsLdpMsg_s baseMsg;
1688 struct mplsLdpFecTlv_s fecTlv; /* fec tlv */
1689 struct mplsLdpLblMsgIdTlv_s lblMsgIdTlv; /* lbl msg id tlv */
1691 u_char fecTlvExists:1;
1692 u_char lblMsgIdTlvExists:1;
1694 } mplsLdpLblAbortMsg_t;
1696 /***********************************************************************
1698 * Function declarations
1700 * Note: Encode functions return the length of the data which was encoded.
1701 * The first argument (which is a pointer to the structure which
1702 * contains the data to be encoded) is not modified in the encode functions
1703 * which encode the messages and message headers. All the other encode
1704 * fuctions modify the content of the structures to be encoded (tlvs,
1705 * message parameters, etc).
1707 * Decode functions for tlv return the length of the value.
1710 int Mpls_encodeLdpMsgHeader(mplsLdpHeader_t *, u_char *, int);
1711 int Mpls_decodeLdpMsgHeader(mplsLdpHeader_t *, u_char *, int);
1712 int Mpls_encodeLdpAtmLblRng(mplsLdpAtmLblRng_t *, u_char *, int);
1713 int Mpls_decodeLdpAtmLblRng(mplsLdpAtmLblRng_t *, u_char *, int);
1714 int Mpls_encodeLdpAsp(mplsLdpAspTlv_t *, u_char *, int);
1715 int Mpls_decodeLdpAsp(mplsLdpAspTlv_t *, u_char *, int);
1716 int Mpls_encodeLdpTlv(mplsLdpTlv_t *, u_char *, int);
1717 int Mpls_decodeLdpTlv(mplsLdpTlv_t *, u_char *, int);
1718 int Mpls_encodeLdpInitMsg(mplsLdpInitMsg_t *, u_char *, int);
1719 int Mpls_decodeLdpInitMsg(mplsLdpInitMsg_t *, u_char *, int);
1720 int Mpls_encodeLdpCsp(mplsLdpCspTlv_t *, u_char *, int);
1721 int Mpls_decodeLdpCsp(mplsLdpCspTlv_t *, u_char *, int);
1722 int Mpls_encodeLdpBaseMsg(mplsLdpMsg_t *, u_char *, int);
1723 int Mpls_decodeLdpBaseMsg(mplsLdpMsg_t *, u_char *, int);
1724 int Mpls_encodeLdpFrLblRng(mplsLdpFrLblRng_t *, u_char *, int);
1725 int Mpls_decodeLdpFrLblRng(mplsLdpFrLblRng_t *, u_char *, int);
1726 int Mpls_encodeLdpFsp(mplsLdpFspTlv_t *, u_char *, int);
1727 int Mpls_decodeLdpFsp(mplsLdpFspTlv_t *, u_char *, int);
1728 int Mpls_encodeLdpNotMsg(mplsLdpNotifMsg_t *, u_char *, int);
1729 int Mpls_decodeLdpNotMsg(mplsLdpNotifMsg_t *, u_char *, int);
1730 int Mpls_encodeLdpStatus(mplsLdpStatusTlv_t *, u_char *, int);
1731 int Mpls_decodeLdpStatus(mplsLdpStatusTlv_t *, u_char *, int);
1732 int Mpls_encodeLdpExStatus(mplsLdpExStatusTlv_t *, u_char *, int);
1733 int Mpls_decodeLdpExStatus(mplsLdpExStatusTlv_t *, u_char *, int);
1734 int Mpls_encodeLdpRetPdu(mplsLdpRetPduTlv_t *, u_char *, int);
1735 int Mpls_decodeLdpRetPdu(mplsLdpRetPduTlv_t *, u_char *, int, u_short);
1736 int Mpls_encodeLdpRetMsg(mplsLdpRetMsgTlv_t *, u_char *, int);
1737 int Mpls_decodeLdpRetMsg(mplsLdpRetMsgTlv_t *, u_char *, int, u_short);
1738 int Mpls_encodeLdpHelloMsg(mplsLdpHelloMsg_t *, u_char *, int);
1739 int Mpls_decodeLdpHelloMsg(mplsLdpHelloMsg_t *, u_char *, int);
1740 int Mpls_encodeLdpChp(mplsLdpChpTlv_t *, u_char *, int);
1741 int Mpls_decodeLdpChp(mplsLdpChpTlv_t *, u_char *, int);
1742 int Mpls_encodeLdpCsn(mplsLdpCsnTlv_t *, u_char *, int);
1743 int Mpls_decodeLdpCsn(mplsLdpCsnTlv_t *, u_char *, int);
1744 int Mpls_encodeLdpTrAdr(mplsLdpTrAdrTlv_t *, u_char *, int);
1745 int Mpls_decodeLdpTrAdr(mplsLdpTrAdrTlv_t *, u_char *, int);
1746 int Mpls_encodeLdpKeepAliveMsg(mplsLdpKeepAlMsg_t *, u_char *, int);
1747 int Mpls_decodeLdpKeepAliveMsg(mplsLdpKeepAlMsg_t *, u_char *, int);
1748 int Mpls_encodeLdpAdrTlv(mplsLdpAdrTlv_t *, u_char *, int);
1749 int Mpls_decodeLdpAdrTlv(mplsLdpAdrTlv_t *, u_char *, int, u_short);
1750 int Mpls_encodeLdpAdrMsg(mplsLdpAdrMsg_t *, u_char *, int);
1751 int Mpls_decodeLdpAdrMsg(mplsLdpAdrMsg_t *, u_char *, int);
1752 int Mpls_encodeLdpFecTlv(mplsLdpFecTlv_t *, u_char *, int);
1753 int Mpls_decodeLdpFecTlv(mplsLdpFecTlv_t *, u_char *, int, u_short);
1754 int Mpls_encodeLdpGenLblTlv(mplsLdpGenLblTlv_t *, u_char *, int);
1755 int Mpls_decodeLdpGenLblTlv(mplsLdpGenLblTlv_t *, u_char *, int);
1756 int Mpls_encodeLdpAtmLblTlv(mplsLdpAtmLblTlv_t *, u_char *, int);
1757 int Mpls_decodeLdpAtmLblTlv(mplsLdpAtmLblTlv_t *, u_char *, int);
1758 int Mpls_encodeLdpFrLblTlv(mplsLdpFrLblTlv_t *, u_char *, int);
1759 int Mpls_decodeLdpFrLblTlv(mplsLdpFrLblTlv_t *, u_char *, int);
1760 int Mpls_encodeLdpHopTlv(mplsLdpHopTlv_t *, u_char *, int);
1761 int Mpls_decodeLdpHopTlv(mplsLdpHopTlv_t *, u_char *, int);
1762 int Mpls_encodeLdpLblMsgIdTlv(mplsLdpLblMsgIdTlv_t *, u_char *, int);
1763 int Mpls_decodeLdpLblMsgIdTlv(mplsLdpLblMsgIdTlv_t *, u_char *, int);
1764 int Mpls_encodeLdpPathVectorTlv(mplsLdpPathTlv_t *, u_char *, int);
1765 int Mpls_decodeLdpPathVectorTlv(mplsLdpPathTlv_t *, u_char *, int, u_short);
1766 int Mpls_encodeLdpLblMapMsg(mplsLdpLblMapMsg_t *, u_char *, int);
1767 int Mpls_decodeLdpLblMapMsg(mplsLdpLblMapMsg_t *, u_char *, int);
1768 int Mpls_encodeLdpFecAdrEl(mplsFecElement_t *, u_char *, int, u_char);
1769 int Mpls_decodeLdpFecAdrEl(mplsFecElement_t *, u_char *, int, u_char);
1770 int Mpls_encodeLdpLblRetMsgIdTlv(mplsLdpLblRetMsgIdTlv_t *, u_char *, int);
1771 int Mpls_decodeLdpLblRetMsgIdTlv(mplsLdpLblRetMsgIdTlv_t *, u_char *, int);
1772 int Mpls_encodeLdpLbl_W_R_Msg(mplsLdpLbl_W_R_Msg_t *, u_char *, int);
1773 int Mpls_decodeLdpLbl_W_R_Msg(mplsLdpLbl_W_R_Msg_t *, u_char *, int);
1774 int Mpls_encodeLdpERTlv(mplsLdpErTlv_t *, u_char *, int);
1775 int Mpls_decodeLdpERTlv(mplsLdpErTlv_t *, u_char *, int, u_short);
1776 int Mpls_encodeLdpErHop(mplsLdpErHop_t *, u_char *, int, u_short);
1777 int Mpls_decodeLdpErHop(mplsLdpErHop_t *, u_char *, int, u_short *);
1778 int Mpls_encodeLdpTrafficTlv(mplsLdpTrafficTlv_t *, u_char *, int);
1779 int Mpls_decodeLdpTrafficTlv(mplsLdpTrafficTlv_t *, u_char *, int, u_short);
1780 int Mpls_encodeLdpLblReqMsg(mplsLdpLblReqMsg_t *, u_char *, int);
1781 int Mpls_decodeLdpLblReqMsg(mplsLdpLblReqMsg_t *, u_char *, int);
1782 int Mpls_encodeLdpPreemptTlv(mplsLdpPreemptTlv_t *, u_char *, int);
1783 int Mpls_decodeLdpPreemptTlv(mplsLdpPreemptTlv_t *, u_char *, int);
1784 int Mpls_encodeLdpLspIdTlv(mplsLdpLspIdTlv_t *, u_char *, int);
1785 int Mpls_decodeLdpLspIdTlv(mplsLdpLspIdTlv_t *, u_char *, int);
1786 int Mpls_encodeLdpResClsTlv(mplsLdpResClsTlv_t *, u_char *, int);
1787 int Mpls_decodeLdpResClsTlv(mplsLdpResClsTlv_t *, u_char *, int);
1788 int Mpls_encodeLdpPinningTlv(mplsLdpPinningTlv_t *, u_char *, int);
1789 int Mpls_decodeLdpPinningTlv(mplsLdpPinningTlv_t *, u_char *, int);
1790 int Mpls_encodeLdpLblAbortMsg(mplsLdpLblAbortMsg_t *, u_char *, int);
1791 int Mpls_decodeLdpLblAbortMsg(mplsLdpLblAbortMsg_t *, u_char *, int);
1794 * DEBUG function declarations
1797 void printTlv(mpls_instance_handle handle, mplsLdpTlv_t *);
1798 void printHeader(mpls_instance_handle handle, mplsLdpHeader_t *);
1799 void printCspFlags(mpls_instance_handle handle, mplsLdpCspFlag_t *);
1800 void printCspFlagsPerByte(mpls_instance_handle handle, u_short *);
1801 void printCspTlv(mpls_instance_handle handle, mplsLdpCspTlv_t *);
1802 void printAspFlags(mpls_instance_handle handle, mplsLdpSPFlag_t *);
1803 void printAspFlagsPerByte(mpls_instance_handle handle, u_int *);
1804 void printAspTlv(mpls_instance_handle handle, mplsLdpAspTlv_t *);
1805 void printFspFlags(mpls_instance_handle handle, mplsLdpSPFlag_t *);
1806 void printFspTlv(mpls_instance_handle handle, mplsLdpFspTlv_t *);
1807 void printRetMsgTlv(mpls_instance_handle handle, mplsLdpRetMsgTlv_t *);
1808 void printRetPduTlv(mpls_instance_handle handle, mplsLdpRetPduTlv_t *);
1809 void printExStatusTlv(mpls_instance_handle handle, mplsLdpExStatusTlv_t *);
1810 void printStatusTlv(mpls_instance_handle handle, mplsLdpStatusTlv_t *);
1811 void printCsnTlv(mpls_instance_handle handle, mplsLdpCsnTlv_t *);
1812 void printTrAdrTlv(mpls_instance_handle handle, mplsLdpTrAdrTlv_t *);
1813 void printChpTlv(mpls_instance_handle handle, mplsLdpChpTlv_t *);
1814 void printAdrListTlv(mpls_instance_handle handle, mplsLdpAdrTlv_t *);
1815 void printFecListTlv(mpls_instance_handle handle, mplsLdpFecTlv_t *);
1816 void printLblMsgIdTlv(mpls_instance_handle handle, mplsLdpLblMsgIdTlv_t *);
1817 void printPathVecTlv(mpls_instance_handle handle, mplsLdpPathTlv_t *);
1818 void printHopTlv(mpls_instance_handle handle, mplsLdpHopTlv_t *);
1819 void printFrLblTlv(mpls_instance_handle handle, mplsLdpFrLblTlv_t *);
1820 void printAtmLblTlv(mpls_instance_handle handle, mplsLdpAtmLblTlv_t *);
1821 void printGenLblTlv(mpls_instance_handle handle, mplsLdpGenLblTlv_t *);
1822 void printErFlags(mpls_instance_handle handle, mplsLdpErFlag_t *);
1823 void printErIPFlags(mpls_instance_handle handle, mplsLdpErIPFlag_t *);
1824 void printErTlv(mpls_instance_handle handle, mplsLdpErTlv_t *);
1825 void printTrafficTlv(mpls_instance_handle handle, mplsLdpTrafficTlv_t *);
1826 void printAtmLabel(mpls_instance_handle handle, mplsLdpAtmLblRng_t *, int);
1827 void printFspLabel(mpls_instance_handle handle, mplsLdpFrLblRng_t *, int);
1828 void printErHop(mpls_instance_handle handle, mplsLdpErHop_t *, u_short);
1829 void printPreemptTlv(mpls_instance_handle handle, mplsLdpPreemptTlv_t *);
1830 void printLspIdTlv(mpls_instance_handle handle, mplsLdpLspIdTlv_t *);
1831 void printResClsTlv(mpls_instance_handle handle, mplsLdpResClsTlv_t *);
1832 void printPinningTlv(mpls_instance_handle handle, mplsLdpPinningTlv_t *);
1834 void printInitMsg(mpls_instance_handle handle, mplsLdpInitMsg_t *);
1835 void printHelloMsg(mpls_instance_handle handle, mplsLdpHelloMsg_t *);
1836 void printNotMsg(mpls_instance_handle handle, mplsLdpNotifMsg_t *);
1837 void printKeepAliveMsg(mpls_instance_handle handle, mplsLdpKeepAlMsg_t *);
1838 void printAddressMsg(mpls_instance_handle handle, mplsLdpAdrMsg_t *);
1839 void printLlbMapMsg(mpls_instance_handle handle, mplsLdpLblMapMsg_t *);
1840 void printLlbReqMsg(mpls_instance_handle handle, mplsLdpLblReqMsg_t *);
1841 void printLbl_W_R_Msg(mpls_instance_handle handle, mplsLdpLbl_W_R_Msg_t *);
1842 void printLlbAbortMsg(mpls_instance_handle handle, mplsLdpLblAbortMsg_t *);
1844 int converAsciiToHex(u_char *, int, u_char *);
1845 int converHexToAscii(u_char *, int, u_char *);
1847 #endif /* _LDP_MPLS_H_ */