Change inlabel outlabel/nexthop, and attr accounting. Specically
[mpls-ldp-portable.git] / ldp / ldp_nortel.h
blob26626ba79af8c6f5be27132471150c28f47defa3
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 "mpls_bitfield.h"
165 #include <sys/types.h>
166 #include <string.h>
168 #define MEM_COPY(X, Y, Z) memcpy(X, Y, Z)
170 /* macros used to decode the entire LDP; they declare local var for
171 different type of messages */
173 /* debug macros */
174 #define PRINT_OUT(args...) LDP_PRINT(NULL,args)
175 #define PRINT_ERR(args...) LDP_PRINT(NULL,args)
178 * MESSAGE TYPE CONSTANS & TLV CONSTANTS
181 #define MPLS_LDP_HDRSIZE 10 /* the size for mpls ldp hdr */
182 #define MPLS_TLVFIXLEN 4 /* type + len */
183 #define MPLS_MSGIDFIXLEN 4 /* type + len */
184 #define MPLS_LDPIDLEN 6
185 #define MPLS_PDUMAXLEN 4096 /* octets */
186 #define MPLS_VERSION 0x0001
187 #define MPLS_IPV4ADDRFAMILYN 0x0100 /* rfc 1700 (network order) */
188 #define MPLS_INIFINITE_TIMEVAL 0xfffff
190 /* for initialize message */
191 #define MPLS_INIT_MSGTYPE 0x0200 /* initialization msg */
192 #define MPLS_CSP_TLVTYPE 0x0500 /* common params for init msg */
193 #define MPLS_ASP_TLVTYPE 0x0501 /* atm session params */
194 #define MPLS_FSP_TLVTYPE 0x0502 /* frame relay session params */
195 #define MPLS_ASPFIXLEN 4 /* M + N + D + res */
196 #define MPLS_FSPFIXLEN 4 /* M + N + res */
197 #define MPLS_CSPFIXLEN 14 /* protocolV + ... + ldp ids */
198 #define MPLS_ATMLBLMAXLEN 10
199 #define MPLS_ATMLRGFIXLEN 8
200 #define MPLS_FRLRGFIXLEN 8
201 #define MPLS_ASP_NOMERGE 0
202 #define MPLS_ASP_VPMERGE 1
203 #define MPLS_ASP_VCMERGE 2
204 #define MPLS_ASP_VPVCMERGE 3
205 #define MPLS_FRLBLMAXLEN 10
206 #define MPLS_FRDLCI10BITS 0
207 #define MPLS_FRDLCI17BITS 1
208 #define MPLS_FRDLCI23BITS 2
210 /* for notification message */
211 #define MPLS_NOT_MSGTYPE 0x0001 /* notification msg */
212 #define MPLS_NOT_ST_TLVTYPE 0x0300 /* status tlv for not msg */
213 #define MPLS_NOT_ES_TLVTYPE 0x0301 /* extended status for not msg */
214 #define MPLS_NOT_RP_TLVTYPE 0x0302 /* returned PDU for not msg */
215 #define MPLS_NOT_RM_TLVTYPE 0x0303 /* returned msg for not msg */
216 #define MPLS_STATUSFIXLEN 10 /* status code + id + type */
217 #define MPLS_EXSTATUSLEN 4
218 #define MPLS_NOT_MAXSIZE MPLS_PDUMAXLEN - MPLS_TLVFIXLEN - \
219 MPLS_MSGIDFIXLEN
221 /* for hello message */
222 #define MPLS_HELLO_MSGTYPE 0x0100 /* hello msg */
223 #define MPLS_CHP_TLVTYPE 0x0400 /* Common Hello Param Tlv */
224 #define MPLS_TRADR_TLVTYPE 0x0401 /* Transport Address Param Tlv */
225 #define MPLS_CSN_TLVTYPE 0x0402 /* Conf Seq Number Param Tlv */
226 #define MPLS_CHPFIXLEN 4
227 #define MPLS_CSNFIXLEN 4
228 #define MPLS_TRADRFIXLEN 4
230 /* for keep alive message */
231 #define MPLS_KEEPAL_MSGTYPE 0x0201 /* keep alive msg */
233 /* for address messages */
234 #define MPLS_ADDR_MSGTYPE 0x0300 /* address msg */
235 #define MPLS_ADDRWITH_MSGTYPE 0x0301 /* address withdraw msg */
236 #define MPLS_ADDRLIST_TLVTYPE 0x0101 /* addrss list tlv type */
237 #define MPLS_IPv4LEN 4
238 #define MPLS_ADDFAMFIXLEN 2
239 #define MPLS_ADDLISTMAXLEN (MPLS_PDUMAXLEN - (2*MPLS_TLVFIXLEN) - \
240 MPLS_MSGIDFIXLEN - MPLS_ADDFAMFIXLEN)
241 #define MPLS_MAXNUMBERADR MPLS_ADDLISTMAXLEN / 4
243 /* for label mapping message */
244 #define MPLS_LBLMAP_MSGTYPE 0x0400 /* label mapping msg */
245 #define MPLS_FEC_TLVTYPE 0x0100 /* label mapping msg */
246 #define MPLS_GENLBL_TLVTYPE 0x0200 /* generic label tlv */
247 #define MPLS_ATMLBL_TLVTYPE 0x0201 /* atm label tlv */
248 #define MPLS_FRLBL_TLVTYPE 0x0202 /* frame relay label tlv */
249 #define MPLS_HOPCOUNT_TLVTYPE 0x0103 /* ho count tlv */
250 #define MPLS_PATH_TLVTYPE 0x0104 /* path vector tlv */
251 #define MPLS_REQMSGID_TLVTYPE 0x0600 /* lbl request msg id tlv */
252 #define MPLS_WC_FEC 0x01 /* wildcard fec element */
253 #define MPLS_PREFIX_FEC 0x02 /* prefix fec element */
254 #define MPLS_HOSTADR_FEC 0x03 /* host addr fec element */
255 #define MPLS_CRLSP_FEC 0x04 /* crlsp fec element */
256 #define MPLS_FECMAXLEN (MPLS_PDUMAXLEN - (2*MPLS_TLVFIXLEN) - \
257 MPLS_MSGIDFIXLEN)
258 #define MPLS_LBLFIXLEN 4 /* v + vpi + vci + res */
259 #define MPLS_HOPCOUNTFIXLEN 1 /* v + vpi + vci + res */
260 #define MPLS_FEC_ELEMTYPELEN 1
261 #define MPLS_FEC_PRELENLEN 1
262 #define MPLS_FEC_ADRFAMLEN 2
263 #define MPLS_FEC_CRLSPLEN 4 /* length of cr lsp fec */
264 #define MPLS_MAXHOPSNUMBER 20 /* max # hops in path vector */
265 #define MPLS_MAXNUMFECELEMENT 10 /* max # of fec elements */
267 /* for label request message */
268 #define MPLS_LBLREQ_MSGTYPE 0x0401 /* label request msg */
269 #define MPLS_LBLMSGID_TLVTYPE 0x0601 /* lbl return msg id tlv */
270 #define MPLS_ADR_FEC_FIXLEN (MPLS_FEC_ELEMTYPELEN + MPLS_FEC_PRELENLEN + MPLS_FEC_ADRFAMLEN)
272 /* for label withdraw and release messages */
273 #define MPLS_LBLWITH_MSGTYPE 0x0402 /* label withdraw msg */
274 #define MPLS_LBLREL_MSGTYPE 0x0403 /* label release msg */
276 /* for ER tlvs */
277 #define MPLS_ER_TLVTYPE 0x0800 /* constraint routing tlv */
278 #define MPLS_TRAFFIC_TLVTYPE 0x0810 /* traffic parameters tlv */
279 #define MPLS_PDR_TLVTYPE 0x0811 /* traffic peak data rate tlv */
280 #define MPLS_CDR_TLVTYPE 0x0812 /* committed data rate tlv */
281 #define MPLS_CBT_TLVTYPE 0x0813 /* committed burst tolerance */
282 #define MPLS_PREEMPT_TLVTYPE 0x0820 /* preemption tlv */
283 #define MPLS_LSPID_TLVTYPE 0x0821 /* lspid tlv */
284 #define MPLS_RESCLASS_TLVTYPE 0x0822 /* resource class tlv */
285 #define MPLS_PINNING_TLVTYPE 0x0823 /* route pinning tlv */
286 #define MPLS_ERHOP_IPV4_TLVTYPE 0x801 /* explicit routing ipv4 tlv */
287 #define MPLS_ERHOP_IPV6_TLVTYPE 0x802 /* explicit routing ipv6 tlv */
288 #define MPLS_ERHOP_AS_TLVTYPE 0x803 /* explicit routing autonomous
289 system number tlv */
290 #define MPLS_ERHOP_LSPID_TLVTYPE 0x804 /* explicit routing lspid tlv */
291 #define MPLS_ERHOP_IPV4_FIXLEN 8 /* fix length in bytes */
292 #define MPLS_ERHOP_IPV6_FIXLEN 20 /* fix length in bytes */
293 #define MPLS_ERHOP_AS_FIXLEN 4 /* fix length in bytes */
294 #define MPLS_ERHOP_LSPID_FIXLEN 8 /* fix length in bytes */
295 #define MPLS_IPV6ADRLENGTH 16
296 #define MPLS_MAX_ER_HOPS 20 /* decent number of hops;
297 change if required */
298 #define MPLS_PREEMPTTLV_FIXLEN 4 /* setPrio + holdPrio + res */
299 #define MPLS_LSPIDTLV_FIXLEN 8 /* res + crlspId + routerId */
300 #define MPLS_TRAFFICPARAMLENGTH 4 /* traffic parameters length */
302 /* for label abort request message */
303 #define MPLS_LBLABORT_MSGTYPE 0x0404 /* label abort request msg */
306 * Error codes
309 #define MPLS_ENC_BUFFTOOSMALL -1
310 #define MPLS_DEC_BUFFTOOSMALL -2
311 #define MPLS_ENC_TLVERROR -3
312 #define MPLS_DEC_TLVERROR -4
313 #define MPLS_ENC_ATMLBLERROR -5
314 #define MPLS_DEC_ATMLBLERROR -6
315 #define MPLS_ENC_BASEMSGERROR -7
316 #define MPLS_DEC_BASEMSGERROR -8
317 #define MPLS_ENC_CSPERROR -9
318 #define MPLS_DEC_CSPERROR -10
319 #define MPLS_ENC_ASPERROR -11
320 #define MPLS_DEC_ASPERROR -12
321 #define MPLS_ENC_FSPERROR -13
322 #define MPLS_DEC_FSPERROR -14
323 #define MPLS_ENC_STATUSERROR -16
324 #define MPLS_DEC_STATUSERROR -17
325 #define MPLS_ENC_EXSTATERROR -18
326 #define MPLS_DEC_EXSTATERROR -19
327 #define MPLS_ENC_RETPDUERROR -20
328 #define MPLS_DEC_RETPDUERROR -21
329 #define MPLS_ENC_RETMSGERROR -22
330 #define MPLS_DEC_RETMSGERROR -23
331 #define MPLS_PDU_LENGTH_ERROR -24
332 #define MPLS_ENC_CHPERROR -25
333 #define MPLS_DEC_CHPERROR -26
334 #define MPLS_ENC_CSNERROR -27
335 #define MPLS_DEC_CSNERROR -28
336 #define MPLS_ENC_TRADRERROR -29
337 #define MPLS_DEC_TRADRERROR -30
338 #define MPLS_ENC_ADRLISTERROR -31
339 #define MPLS_DEC_ADRLISTERROR -32
340 #define MPLS_WC_FECERROR -33
341 #define MPLS_PATHVECTORERROR -34
342 #define MPLS_ENC_FECERROR -35
343 #define MPLS_DEC_FECERROR -36
344 #define MPLS_ENC_GENLBLERROR -37
345 #define MPLS_DEC_GENLBLERROR -38
346 #define MPLS_ENC_MAPATMERROR -39
347 #define MPLS_DEC_MAPATMERROR -40
348 #define MPLS_ENC_FRLBLERROR -41
349 #define MPLS_DEC_FRLBLERROR -42
350 #define MPLS_ENC_COSERROR -43
351 #define MPLS_DEC_COSERROR -44
352 #define MPLS_ENC_HOPCOUNTERROR -45
353 #define MPLS_DEC_HOPCOUNTERROR -46
354 #define MPLS_ENC_PATHVECERROR -47
355 #define MPLS_DEC_PATHVECERROR -48
356 #define MPLS_ENC_LBLMSGIDERROR -49
357 #define MPLS_DEC_LBLMSGIDERROR -50
358 #define MPLS_ENC_HDRTLVERROR -51
359 #define MPLS_DEC_HDRTLVERROR -52
360 #define MPLS_ENC_FECELEMERROR -53
361 #define MPLS_DEC_FECELEMERROR -54
362 #define MPLS_ENC_FSPLBLERROR -55
363 #define MPLS_DEC_FSPLBLERROR -56
364 #define MPLS_ENC_ERHOPERROR -57
365 #define MPLS_DEC_ERHOPERROR -58
366 #define MPLS_ENC_ERTLVERROR -59
367 #define MPLS_DEC_ERTLVERROR -60
368 #define MPLS_ENC_ERHOPLENERROR -61
369 #define MPLS_DEC_ERHOPLENERROR -62
370 #define MPLS_TLVTYPEERROR -63
371 #define MPLS_MSGTYPEERROR -64
372 #define MPLS_FECERROR -65
373 #define MPLS_ENC_TRAFFICERROR -66
374 #define MPLS_DEC_TRAFFICERROR -67
375 #define MPLS_ENC_LSPIDERROR -68
376 #define MPLS_DEC_LSPIDERROR -69
377 #define MPLS_ENC_RESCLSERROR -70
378 #define MPLS_DEC_RESCLSERROR -71
379 #define MPLS_ENC_PREEMPTERROR -72
380 #define MPLS_DEC_PREEMPTERROR -73
381 #define MPLS_ENC_PINNINGERROR -74
382 #define MPLS_DEC_PINNINGERROR -75
383 #define MPLS_FLOATTYPEERROR -76
384 #define MPLS_FECTLVERROR -77
385 #define MPLS_IPV4LENGTHERROR -78
386 #define MPLS_ER_HOPSNUMERROR -79
388 /**********************************************************************
389 LDP header
391 0 1 2 3
392 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
393 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
394 | Version | PDU Length |
395 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
396 | LDP Identifier |
397 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
399 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
400 **********************************************************************/
402 typedef struct mplsLdpHeader_s {
403 u_short protocolVersion;
404 u_short pduLength; /* length excluding the version and length */
405 u_int lsrAddress; /* IP address assigned to LSR */
406 u_short labelSpace; /* within LSR */
408 } mplsLdpHeader_t;
410 /**********************************************************************
411 LDP Messages (All LDP messages have the following format:)
413 0 1 2 3
414 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
415 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
416 |U| Message Type | Message Length |
417 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
418 | Message ID |
419 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
422 | Mandatory Parameters |
425 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
428 | Optional Parameters |
431 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
432 Note: the U flag is ignored for now. There is not check for its value.
433 **********************************************************************/
435 typedef struct mplsLdpMsgFlag_s {
436 BITFIELDS_ASCENDING_2(u_short uBit:1, u_short msgType:15)
437 } mplsLdpMsgFlag_t;
439 typedef struct mplsLdpMsg_s {
440 union {
441 struct mplsLdpMsgFlag_s flags;
442 u_short mark;
443 } flags;
445 u_short msgLength; /* msgId + mandatory param + optional param */
446 u_int msgId; /* used to identify the notification msg */
448 } mplsLdpMsg_t;
450 typedef struct mplsLdpUnknownMsg_s {
451 struct mplsLdpMsg_s baseMsg;
452 u_char data[MPLS_NOT_MAXSIZE];
454 } mplsLdpUnknownMsg_t;
456 /**********************************************************************
457 Type-Length-Value Encoding
459 0 1 2 3
460 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
461 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
462 |U|F| Type | Length |
463 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
465 | Value |
468 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
470 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
471 Note: the decode functions for tlv do not check the values for
472 F flag. They check only the value of the U flag; if
473 it is set will ignore the tlv and keep processing the message;
474 otherwise will ignore the message and return error. Please note
475 that the unknown tlv which is skipped will not be stored anywhere.
476 **********************************************************************/
478 typedef struct mplsLdpTlvFlag_s {
479 BITFIELDS_ASCENDING_3(u_short uBit:1, u_short fBit:1, u_short tBit:14)
480 } mplsLdpTlvFlag_t;
482 typedef struct mplsLdpTlv_s {
483 union {
484 struct mplsLdpTlvFlag_s flags;
485 u_short mark;
486 } flags;
488 u_short length; /* length of the value field */
490 } mplsLdpTlv_t;
492 /**********************************************************************
493 Common Session Parameters TLV
495 0 1 2 3
496 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
497 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
498 |U|F| Common Sess Parms (0x0500)| Length |
499 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
500 | Protocol Version | Keep Alive Time |
501 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
502 |A|D| Reserved | PVLim | Max PDU Length |
503 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
504 | Receiver LDP Identifer |
505 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
507 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++
508 ***********************************************************************/
510 typedef struct mplsLdpCspFlag_s {
511 BITFIELDS_ASCENDING_4(u_short lad:1, /* 1 = downstream on demand */
512 u_short ld:1, /* loop detection */
513 u_short res:6, /* reserved */
514 u_short pvl:8 /* path vec limit */
516 } mplsLdpCspFlag_t;
518 typedef struct mplsLdpCspTlv_s {
519 struct mplsLdpTlv_s baseTlv;
520 u_short protocolVersion;
521 u_short holdTime; /* proposed keep alive interval */
523 union {
524 struct mplsLdpCspFlag_s flags;
525 u_short mark;
526 } flags;
528 u_short maxPduLen;
529 u_int rcvLsrAddress;
530 u_short rcvLsId;
532 } mplsLdpCspTlv_t;
534 /***********************************************************************
535 ATM Label Range Component
537 0 1 2 3
538 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
539 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
540 | Res | Minimum VPI | Minimum VCI |
541 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
542 | Res | Maximum VPI | Maximum VCI |
543 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
544 ***********************************************************************/
546 typedef struct mplsLdpAtmLblRngFlag_s {
547 BITFIELDS_ASCENDING_3(u_int res1:4, /* reserved : 0 on transmision */
548 u_int minVpi:12, /* if <12 bits right justified */
549 u_int minVci:16 /* if <16 bits right justified */
551 BITFIELDS_ASCENDING_3(u_int res2:4, /* reserved : 0 on transmision */
552 u_int maxVpi:12, /* if <12 bits right justified */
553 u_int maxVci:16 /* if <16 bits right justified */
555 } mplsLdpAtmLblRngFlag_t;
557 typedef struct mplsLdpAtmLblRng_s {
558 union {
559 struct mplsLdpAtmLblRngFlag_s flags;
560 u_int mark[2];
561 } flags;
562 } mplsLdpAtmLblRng_t;
564 /***********************************************************************
565 Flags for ATM Session Parameters TLV and
566 Frame Relay Session Parameters TLV
568 Note: both types of session parameters have the same type of flags;
569 use then the same struct
570 ***********************************************************************/
572 typedef struct mplsLdpSPFlag_s {
573 BITFIELDS_ASCENDING_4(u_int mergeType:2, /* merge typ */
574 u_int numLblRng:4, /* # of label range com */
575 u_int dir:1, /* 0 => bidirectional */
576 u_int res:25)
577 } mplsLdpSPFlag_t;
579 /***********************************************************************
580 ATM Session Parameters TLV
582 0 1 2 3
583 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
584 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
585 |U|F| ATM Sess Parms (0x0501) | Length |
586 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
587 | M | N |D| Reserved |
588 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
589 | ATM Label Range Component 1 |
590 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
594 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
595 | ATM Label Range Component N |
596 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
597 ***********************************************************************/
599 typedef struct mplsLdpAspTlv_s {
600 struct mplsLdpTlv_s baseTlv;
601 union {
602 struct mplsLdpSPFlag_s flags;
603 u_int mark;
604 } flags;
605 struct mplsLdpAtmLblRng_s lblRngList[MPLS_ATMLBLMAXLEN];
607 } mplsLdpAspTlv_t;
609 /***********************************************************************
610 Frame Relay Label Range Component
612 0 1 2 3
613 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
614 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
615 | Reserved |Len| Minimum DLCI |
616 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
617 | Reserved | Maximum DLCI |
618 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
619 ***********************************************************************/
621 typedef struct mplsLdpFrFlag_s {
622 BITFIELDS_ASCENDING_3(u_int res_min:7, u_int len:2, u_int minDlci:23)
623 BITFIELDS_ASCENDING_2(u_int res_max:9, u_int maxDlci:23)
624 } mplsLdpFrFlag_t;
626 typedef struct mplsLdpFrLblRng_s {
627 union {
628 struct mplsLdpFrFlag_s flags;
629 u_int mark[2];
630 } flags;
632 } mplsLdpFrLblRng_t;
634 /**********************************************************************
635 Frame Relay Session Parameters TLV
637 0 1 2 3
638 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
639 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
640 |U|F| FR Sess Parms (0x0502) | Length |
641 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
642 | M | N |D| Reserved |
643 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
644 | Frame Relay Label Range Component 1 |
645 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
649 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
650 | Frame Relay Label Range Component N |
651 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
652 ***********************************************************************/
654 typedef struct mplsLdpFspTlv_s {
655 struct mplsLdpTlv_s baseTlv;
656 union {
657 struct mplsLdpSPFlag_s flags;
658 u_int mark;
659 } flags;
660 struct mplsLdpFrLblRng_s lblRngList[MPLS_FRLBLMAXLEN];
662 } mplsLdpFspTlv_t;
664 /***********************************************************************
665 Initialization Message Encoding
667 0 1 2 3
668 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
669 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
670 |U| Initialization (0x0200) | Message Length |
671 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
672 | Message ID |
673 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
674 | Common Session Parameters TLV |
675 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
676 | Optional Parameters |
677 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
678 ***********************************************************************/
680 typedef struct mplsLdpInitMsg_s {
681 struct mplsLdpMsg_s baseMsg;
682 struct mplsLdpCspTlv_s csp;
683 struct mplsLdpAspTlv_s asp;
684 struct mplsLdpFspTlv_s fsp;
685 u_char cspExists:1;
686 u_char aspExists:1;
687 u_char fspExists:1;
689 } mplsLdpInitMsg_t;
691 /***********************************************************************
692 Status Code Encoding
694 0 1 2 3
695 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
696 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
697 |E|F| Status Data |
698 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
699 ***********************************************************************/
700 typedef struct mplsLdpStautsFlag_s {
701 BITFIELDS_ASCENDING_3(u_int error:1, /* E bit */
702 u_int forward:1, /* F bit */
703 u_int status:30)
704 } mplsLdpStautsFlag_t;
706 /***********************************************************************
707 Status (TLV) Encoding
709 0 1 2 3
710 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
711 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
712 |U|F| Status (0x0300) | Length |
713 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
714 | Status Code |
715 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
716 | Message ID |
717 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
718 | Message Type |
719 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
720 ***********************************************************************/
722 typedef struct mplsLdpStatusTlv_s {
723 struct mplsLdpTlv_s baseTlv;
724 union {
725 struct mplsLdpStautsFlag_s flags;
726 u_int mark;
727 } flags;
728 u_int msgId;
729 u_short msgType;
731 } mplsLdpStatusTlv_t;
733 /***********************************************************************
734 Extended Status (TLV) Encoding
735 ***********************************************************************/
737 typedef struct mplsLdpExStatusTlv_s {
738 struct mplsLdpTlv_s baseTlv;
739 u_int value; /* additional info for status */
741 } mplsLdpExStatusTlv_t;
743 /***********************************************************************
744 Returned PDU (TLV) Encoding
745 ***********************************************************************/
747 typedef struct mplsLdpRetPduTlv_s {
748 struct mplsLdpTlv_s baseTlv;
749 struct mplsLdpHeader_s headerTlv;
750 u_char data[MPLS_NOT_MAXSIZE];
752 } mplsLdpRetPduTlv_t;
754 /***********************************************************************
755 Returned MSG (TLV) Encoding
756 ***********************************************************************/
758 typedef struct mplsLdpRetMsgTlv_s {
759 struct mplsLdpTlv_s baseTlv;
760 u_short msgType;
761 u_short msgLength;
762 u_char data[MPLS_NOT_MAXSIZE];
764 } mplsLdpRetMsgTlv_t;
766 /***********************************************************************
767 LSPID Tlv encoding
769 0 1 2 3
770 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
771 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
772 |U|F| LSPID-TLV (0x0821) | Length |
773 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
774 | Reserved | Local CRLSP ID |
775 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
776 | Ingress LSR Router ID |
777 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
778 ***********************************************************************/
780 typedef struct mplsLdpLspIdTlv_s {
781 struct mplsLdpTlv_s baseTlv;
782 u_short res;
783 u_short localCrlspId;
784 u_int routerId; /* ingress lsr router id */
786 } mplsLdpLspIdTlv_t;
788 /***********************************************************************
789 Notification Message Encoding
791 0 1 2 3
792 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
793 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
794 |U| Notification (0x0001) | Message Length |
795 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
796 | Message ID |
797 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
798 | Status (TLV) |
799 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
800 | Optional Parameters |
801 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
802 | LSPID TLV (optional for CR-LDP) |
803 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
804 ***********************************************************************/
806 typedef struct mplsLdpNotifMsg_s {
807 struct mplsLdpMsg_s baseMsg;
808 struct mplsLdpStatusTlv_s status;
809 struct mplsLdpExStatusTlv_s exStatus; /* extended status tlv */
810 struct mplsLdpRetPduTlv_s retPdu; /* returned PDU tlv */
811 struct mplsLdpRetMsgTlv_s retMsg; /* returned MSG tlv */
812 struct mplsLdpLspIdTlv_s lspidTlv; /* lspid tlv */
814 u_char statusTlvExists:1;
815 u_char exStatusTlvExists:1;
816 u_char retPduTlvExists:1;
817 u_char retMsgTlvExists:1;
818 u_char lspidTlvExists:1;
820 } mplsLdpNotifMsg_t;
822 /***********************************************************************
823 Common Hello Parameters Tlv encoding
825 0 1 2 3
826 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
827 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
828 |U|F| Common Hello Parms(0x0400)| Length |
829 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
830 | Hold Time |T|R| Reserved |
831 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
832 ***********************************************************************/
833 typedef struct mplsLdpChpFlag_s {
834 BITFIELDS_ASCENDING_3(u_short target:1, /* T bit */
835 u_short request:1, /* R bit */
836 u_short res:14)
837 } mplsLdpChpFlag_t;
839 typedef struct mplsLdpChpTlv_s {
840 struct mplsLdpTlv_s baseTlv;
841 u_short holdTime;
842 union {
843 struct mplsLdpChpFlag_s flags;
844 u_short mark;
845 } flags;
847 } mplsLdpChpTlv_t;
849 /***********************************************************************
850 Transport Address (TLV) Encoding
851 ***********************************************************************/
853 typedef struct mplsLdpTrAdrTlv_s {
854 struct mplsLdpTlv_s baseTlv;
855 u_int address;
857 } mplsLdpTrAdrTlv_t;
859 /***********************************************************************
860 Configuration Sequence Number (TLV) Encoding
861 ***********************************************************************/
863 typedef struct mplsLdpCsnTlv_s {
864 struct mplsLdpTlv_s baseTlv;
865 u_int seqNumber;
867 } mplsLdpCsnTlv_t;
869 /***********************************************************************
870 Hello message encoding
872 0 1 2 3
873 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
874 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
875 |U| Hello (0x0100) | Message Length |
876 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
877 | Message ID |
878 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
879 | Common Hello Parameters TLV |
880 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
881 | Optional Parameters |
882 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
883 ***********************************************************************/
885 typedef struct mplsLdpHelloMsg_s {
886 struct mplsLdpMsg_s baseMsg;
887 struct mplsLdpChpTlv_s chp; /* common hello param tlv */
888 struct mplsLdpTrAdrTlv_s trAdr; /* transport address tlv */
889 struct mplsLdpCsnTlv_s csn; /* configuration seq # tlv */
890 u_char chpTlvExists:1;
891 u_char trAdrTlvExists:1;
892 u_char csnTlvExists:1;
894 } mplsLdpHelloMsg_t;
896 /***********************************************************************
897 KeepAlive Message encoding
899 0 1 2 3
900 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
901 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
902 |U| KeepAlive (0x0201) | Message Length |
903 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
904 | Message ID |
905 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
906 | Optional Parameters |
907 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
909 Note: there are no optional param defined for keep alive.
910 ***********************************************************************/
912 typedef struct mplsLdpKeepAlMsg_s {
913 struct mplsLdpMsg_s baseMsg;
915 } mplsLdpKeepAlMsg_t;
917 /***********************************************************************
918 Address List TLV encoding
920 0 1 2 3
921 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
922 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
923 |U|F| Address List (0x0101) | Length |
924 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
925 | Address Family | |
926 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
928 | Addresses |
931 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
932 ***********************************************************************/
934 typedef struct mplsLdpAdrTlv_s {
935 struct mplsLdpTlv_s baseTlv;
936 u_short addrFamily;
937 u_int address[MPLS_MAXNUMBERADR];
939 } mplsLdpAdrTlv_t;
941 /***********************************************************************
942 Address (0x0300) / Address Withdraw(0x0301) message encoding
944 0 1 2 3
945 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
946 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
947 |U| Address | Message Length |
948 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
949 | Message ID |
950 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
952 | Address List TLV |
954 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
955 | Optional Parameters |
956 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
958 Note: there are no optional param defined for address message.
959 ***********************************************************************/
961 typedef struct mplsLdpAdrMsg_s {
962 struct mplsLdpMsg_s baseMsg;
963 struct mplsLdpAdrTlv_s addressList;
964 u_char adrListTlvExists:1;
966 } mplsLdpAdrMsg_t;
968 /***********************************************************************
969 Wildcard FEC Element encoding
970 ***********************************************************************/
972 typedef struct mplsLdpWildFec_s {
973 u_char type;
975 } mplsLdpWildFec_t;
977 /***********************************************************************
978 Prefix FEC Element encoding
980 0 1 2 3
981 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
982 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
983 | Prefix (2) | Address Family | PreLen |
984 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
985 | Prefix |
986 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
988 Host Address FEC Element encoding
990 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
991 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
992 | Host Addr (3) | Address Family | Host Addr Len |
993 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
994 | Host Addr |
995 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
997 Note: the code handles prefixes and host addresses whose length is
998 less or equal to 4 bytes.
999 ***********************************************************************/
1001 typedef struct mplsLdpAddressFec_s {
1002 u_char type;
1003 u_short addressFam;
1004 u_char preLen; /* prefix FEC: length of the adr prefix (in bits)
1005 or host adr FEC: length of the host address (in
1006 bytes) */
1007 u_int address;
1009 } mplsLdpAddressFec_t;
1011 /***********************************************************************
1012 CRLSP FEC Element encoding
1014 0 1 2 3
1015 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
1016 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1017 | CR-LSP (4) | Reserved |
1018 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1019 ***********************************************************************/
1021 typedef struct mplsLdpCrlspFec_s {
1022 u_char type;
1023 u_char res1; /* reserved */
1024 u_short res2; /* reserved */
1026 } mplsLdpCrlspFec_t;
1028 /***********************************************************************
1029 FEC Tlv 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 |U|F| FEC (0x0100) | Length |
1035 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1036 | FEC Element 1 |
1037 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1041 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1042 | FEC Element n |
1043 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1044 ***********************************************************************/
1046 typedef union mplsFecElement_u {
1047 struct mplsLdpAddressFec_s addressEl; /* prefix | host adr */
1048 struct mplsLdpWildFec_s wildcardEl; /* for wilcard fec */
1049 struct mplsLdpCrlspFec_s crlspEl; /* CRLSP fec elem */
1051 } mplsFecElement_t;
1053 typedef struct mplsLdpFecTlv_s {
1054 struct mplsLdpTlv_s baseTlv;
1055 union mplsFecElement_u fecElArray[MPLS_MAXNUMFECELEMENT];
1056 u_short fecElemTypes[MPLS_MAXNUMFECELEMENT];
1057 u_char wcElemExists:1;
1058 u_short numberFecElements;
1060 } mplsLdpFecTlv_t;
1062 /***********************************************************************
1063 Generic Label Tlv encoding
1065 0 1 2 3
1066 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
1067 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1068 |U|F| Generic Label (0x0200) | Length |
1069 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1070 | Label |
1071 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1072 ***********************************************************************/
1074 typedef struct mplsLdpGenLblTlv_s {
1075 struct mplsLdpTlv_s baseTlv;
1076 u_int label; /* 20-bit number in 4 octet field */
1078 } mplsLdpGenLblTlv_t;
1080 /***********************************************************************
1081 Atm Label Tlv encoding
1083 0 1 2 3
1084 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
1085 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1086 |U|F| ATM Label (0x0201) | Length |
1087 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1088 |Res| V | VPI | VCI |
1089 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1090 ***********************************************************************/
1092 typedef struct mplsLdpAtmLblFlag_s {
1093 BITFIELDS_ASCENDING_3(u_short res:2, u_short v:2, u_short vpi:12)
1094 } mplsLdpAtmLblFlag_t;
1096 typedef struct mplsLdpAtmLblTlv_s {
1097 struct mplsLdpTlv_s baseTlv;
1099 union {
1100 struct mplsLdpAtmLblFlag_s flags;
1101 u_short mark;
1102 } flags;
1104 u_short vci;
1106 } mplsLdpAtmLblTlv_t;
1108 /***********************************************************************
1109 Frame Relay Label Tlv encoding
1111 0 1 2 3
1112 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
1113 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1114 |U|F| Frame Relay Label (0x0202)| Length |
1115 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1116 | Reserved |Len| DLCI |
1117 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1118 ***********************************************************************/
1120 typedef struct mplsLdpFrLblFlag_s {
1121 BITFIELDS_ASCENDING_3(u_int res:7, u_int len:2, u_int dlci:23)
1123 } mplsLdpFrLblFlag_t;
1125 typedef struct mplsLdpFrLblTlv_s {
1126 struct mplsLdpTlv_s baseTlv;
1128 union {
1129 struct mplsLdpFrLblFlag_s flags;
1130 u_int mark;
1131 } flags;
1133 } mplsLdpFrLblTlv_t;
1135 /***********************************************************************
1136 Hop Count Tlv encoding
1138 0 1 2 3
1139 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
1140 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1141 |U|F| Hop Count (0x0103) | Length |
1142 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1143 | HC Value |
1144 +-+-+-+-+-+-+-+-+
1145 ***********************************************************************/
1147 typedef struct mplsLdpHopTlv_s {
1148 struct mplsLdpTlv_s baseTlv;
1149 u_char hcValue; /* hop count value */
1151 } mplsLdpHopTlv_t;
1153 /***********************************************************************
1154 Path Vector Tlv encoding
1156 0 1 2 3
1157 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
1158 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1159 |U|F| Path Vector (0x0104) | Length |
1160 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1161 | LSR Id 1 |
1162 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1166 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1167 | LSR Id n |
1168 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1169 ***********************************************************************/
1171 typedef struct mplsLdpPathTlv_s {
1172 struct mplsLdpTlv_s baseTlv;
1173 u_int lsrId[MPLS_MAXHOPSNUMBER];
1175 } mplsLdpPathTlv_t;
1177 /***********************************************************************
1178 Lbl request message id Tlv encoding
1179 ***********************************************************************/
1181 typedef struct mplsLdpLblMsgIdTlv_s {
1182 struct mplsLdpTlv_s baseTlv;
1183 u_int msgId;
1185 } mplsLdpLblMsgIdTlv_t;
1187 /***********************************************************************
1188 Preemption Tlv encoding
1190 0 1 2 3
1191 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
1192 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1193 |U|F| Preemption-TLV (0x0820) | Length |
1194 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1195 | SetPrio | HoldPrio | Reserved |
1196 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1197 ***********************************************************************/
1199 typedef struct mplsLdpPreemptTlv_s {
1200 struct mplsLdpTlv_s baseTlv;
1201 u_char setPrio; /* 0 => most important path */
1202 u_char holdPrio; /* 0 => most important path */
1203 u_short res;
1205 } mplsLdpPreemptTlv_t;
1207 /***********************************************************************
1208 Resource class Tlv encoding
1210 0 1 2 3
1211 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
1212 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1213 |U|F| ResCls-TLV (0x0822) | Length |
1214 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1215 | RsCls |
1216 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1217 ***********************************************************************/
1219 typedef struct mplsLdpResClsTlv_s {
1220 struct mplsLdpTlv_s baseTlv;
1221 u_int rsCls; /* resource class bit mask */
1223 } mplsLdpResClsTlv_t;
1225 /***********************************************************************
1226 Lbl return message id Tlv encoding
1227 ***********************************************************************/
1229 typedef struct mplsLdpRetMsgIdTlv_s {
1230 struct mplsLdpTlv_s baseTlv;
1232 } mplsLdpLblRetMsgIdTlv_t;
1234 /***********************************************************************
1235 ER flag structure which is common to IPV4 and IPV6 ER TLV
1236 ***********************************************************************/
1238 typedef struct mplsLdpErIPFlag_s {
1239 BITFIELDS_ASCENDING_3(u_int l:1, /* 0 => loose hop */
1240 u_int res:23, u_int preLen:8)
1241 } mplsLdpErIPFlag_t;
1243 /***********************************************************************
1244 ER flag structure which is common to AS and LSPID ER TLV
1245 ***********************************************************************/
1246 typedef struct mplsLdpErFlag_s {
1247 BITFIELDS_ASCENDING_2(u_short l:1, /* 0 => loose hop */
1248 u_short res:15)
1249 } mplsLdpErFlag_t;
1251 /***********************************************************************
1252 Explicit Routing IPv4 Tlv encoding
1254 0 1 2 3
1255 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
1256 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1257 |U|F| 0x801 | Length |
1258 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1259 |L| Reserved | PreLen |
1260 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1261 | IPv4 Address (4 bytes) |
1262 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1263 ***********************************************************************/
1265 typedef struct mplsLdpErIpv4_s {
1266 struct mplsLdpTlv_s baseTlv;
1267 union {
1268 struct mplsLdpErIPFlag_s flags;
1269 u_int mark;
1270 } flags;
1271 u_int address;
1273 } mplsLdpErIpv4_t;
1275 /***********************************************************************
1276 Explicit Routing IPv6 Tlv encoding
1278 0 1 2 3
1279 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
1280 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1281 |U|F| 0x802 | Length |
1282 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1283 |L| Reserved | PreLen |
1284 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1285 | IPV6 address |
1286 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1287 | IPV6 address (continued) |
1288 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1289 | IPV6 address (continued) |
1290 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1291 | IPV6 address (continued) |
1292 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1293 ***********************************************************************/
1295 typedef struct mplsLdpErIpv6_s {
1296 struct mplsLdpTlv_s baseTlv;
1297 union {
1298 struct mplsLdpErIPFlag_s flags;
1299 u_int mark;
1300 } flags;
1301 u_char address[MPLS_IPV6ADRLENGTH];
1303 } mplsLdpErIpv6_t;
1305 /***********************************************************************
1306 Explicit Routing Autonomous systen number Tlv encoding
1308 0 1 2 3
1309 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
1310 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1311 |U|F| 0x803 | Length |
1312 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1313 |L| Reserved | AS Number |
1314 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1315 ***********************************************************************/
1317 typedef struct mplsLdpErAs_s {
1318 struct mplsLdpTlv_s baseTlv;
1319 union {
1320 struct mplsLdpErFlag_s flags;
1321 u_short mark;
1322 } flags;
1323 u_short asNumber;
1325 } mplsLdpErAs_t;
1327 /***********************************************************************
1328 Explicit Routing LSPID Tlv encoding
1330 0 1 2 3
1331 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
1332 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1333 |U|F| 0x804 | Length |
1334 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1335 |L| Reserved | Local LSPID |
1336 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1337 | Ingress LSR Router ID |
1338 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1339 ***********************************************************************/
1341 typedef struct mplsLdpErLspId_s {
1342 struct mplsLdpTlv_s baseTlv;
1343 union {
1344 struct mplsLdpErFlag_s flags;
1345 u_short mark;
1346 } flags;
1347 u_short lspid;
1348 u_int routerId;
1350 } mplsLdpErLspId_t;
1352 /***********************************************************************
1353 Constraint Routing Tlv encoding
1355 0 1 2 3
1356 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
1357 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1358 |U|F| ER-TLV (0x0800) | Length |
1359 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1360 | ER-Hop TLV 1 |
1361 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1362 | ER-Hop TLV 2 |
1363 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1364 ~ ............ ~
1365 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1366 | ER-Hop TLV n |
1367 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1368 ***********************************************************************/
1370 typedef union mplsLdpErHop_u {
1371 struct mplsLdpErIpv4_s erIpv4;
1372 struct mplsLdpErIpv6_s erIpv6;
1373 struct mplsLdpErAs_s erAs;
1374 struct mplsLdpErLspId_s erLspId;
1376 } mplsLdpErHop_t;
1378 typedef struct mplsLdpErTlv_s {
1379 struct mplsLdpTlv_s baseTlv;
1380 union mplsLdpErHop_u erHopArray[MPLS_MAX_ER_HOPS];
1381 u_short erHopTypes[MPLS_MAX_ER_HOPS]; /* need to know the
1382 types when handle
1383 the union */
1384 u_short numberErHops;
1386 } mplsLdpErTlv_t;
1388 /***********************************************************************
1389 Traffic parameters TLV
1391 0 1 2 3
1392 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
1393 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1394 |U|F| Traf. Param. TLV (0x0810)| Length |
1395 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1396 | Flags | Frequency | Reserved | Weight |
1397 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1398 | Peak Data Rate (PDR) |
1399 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1400 | Peak Burst Size (PBS) |
1401 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1402 | Committed Data Rate (CDR) |
1403 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1404 | Committed Burst Size (CBS) |
1405 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1406 | Excess Burst Size (EBS) |
1407 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1409 Flag field:
1410 +--+--+--+--+--+--+--+--+
1411 | Res |F6|F5|F4|F3|F2|F1|
1412 +--+--+--+--+--+--+--+--+
1413 ***********************************************************************/
1415 typedef struct mplsLdpTrafficFlag_s {
1416 BITFIELDS_ASCENDING_7(u_char res:2,
1417 u_char f6Bit:1,
1418 u_char f5Bit:1,
1419 u_char f4Bit:1, u_char f3Bit:1, u_char f2Bit:1, u_char f1Bit:1)
1420 } mplsLdpTrafficFlag_t;
1422 typedef struct mplsLdpTrafficTlv_s {
1423 struct mplsLdpTlv_s baseTlv;
1424 union {
1425 struct mplsLdpTrafficFlag_s flags;
1426 u_char mark;
1427 } flags;
1428 u_char freq;
1429 u_char res;
1430 u_char weight;
1431 union {
1432 float pdr;
1433 u_int mark;
1434 } pdr;
1435 union {
1436 float pbs;
1437 u_int mark;
1438 } pbs;
1439 union {
1440 float cdr;
1441 u_int mark;
1442 } cdr;
1443 union {
1444 float cbs;
1445 u_int mark;
1446 } cbs;
1447 union {
1448 float ebs;
1449 u_int mark;
1450 } ebs;
1452 } mplsLdpTrafficTlv_t;
1454 /***********************************************************************
1455 Route pinning TLV
1457 0 1 2 3
1458 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
1459 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1460 |U|F| 0x823 | Length |
1461 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1462 |P| Reserved |
1463 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1464 ***********************************************************************/
1466 typedef struct mplsLdpPinningTlvFlag_s {
1467 BITFIELDS_ASCENDING_2(u_int pBit:1, /* 1 => route pinning requested */
1468 u_int res:31)
1469 } mplsLdpPinningTlvFlag_t;
1471 typedef struct mplsLdpPinningTlv_s {
1472 struct mplsLdpTlv_s baseTlv;
1473 union {
1474 struct mplsLdpPinningTlvFlag_s flags;
1475 u_int mark;
1476 } flags;
1477 } mplsLdpPinningTlv_t;
1479 /***********************************************************************
1480 Label Mapping Message encoding
1482 0 1 2 3
1483 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
1484 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1485 |U| Label Mapping (0x0400) | Message Length |
1486 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1487 | Message ID |
1488 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1489 | FEC TLV |
1490 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1491 | Label TLV |
1492 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1493 | Label Request Message ID TLV (mandatory) |
1494 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1495 | LSPID TLV (CR-LDP, mandatory) |
1496 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1497 | Traffic TLV (CR-LDP, optional) |
1498 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1499 ***********************************************************************/
1501 typedef struct mplsLdpLblMapMsg_s {
1502 struct mplsLdpMsg_s baseMsg;
1504 /* FEC tlv */
1505 struct mplsLdpFecTlv_s fecTlv;
1507 /* Label TLV */
1508 struct mplsLdpGenLblTlv_s genLblTlv; /* generic label tlv */
1509 struct mplsLdpAtmLblTlv_s atmLblTlv; /* atm label tlv */
1510 struct mplsLdpFrLblTlv_s frLblTlv; /* fr label tlv */
1512 /* Optional parameters */
1513 struct mplsLdpHopTlv_s hopCountTlv; /* hop count tlv */
1514 struct mplsLdpPathTlv_s pathVecTlv; /* path vector tlv */
1515 struct mplsLdpLblMsgIdTlv_s lblMsgIdTlv; /* lbl msg id tlv */
1516 struct mplsLdpLspIdTlv_s lspidTlv; /* lspid tlv */
1517 struct mplsLdpTrafficTlv_s trafficTlv; /* traffic tlv */
1519 u_char fecTlvExists:1;
1520 u_char genLblTlvExists:1;
1521 u_char atmLblTlvExists:1;
1522 u_char frLblTlvExists:1;
1523 u_char hopCountTlvExists:1;
1524 u_char pathVecTlvExists:1;
1525 u_char lblMsgIdTlvExists:1;
1526 u_char lspidTlvExists:1;
1527 u_char trafficTlvExists:1;
1529 } mplsLdpLblMapMsg_t;
1531 /***********************************************************************
1532 Label Request Message encoding
1534 0 1 2 3
1535 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
1536 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1537 |U| Label Request (0x0401) | Message Length |
1538 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1539 | Message ID |
1540 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1541 | FEC TLV |
1542 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1543 | Return Message ID TLV (mandatory) |
1544 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1545 | LSPID TLV (CR-LDP, mandatory) |
1546 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1547 | ER-TLV (CR-LDP, optional) |
1548 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1549 | Traffic TLV (CR-LDP, optional) |
1550 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1551 | Pinning TLV (CR-LDP, optional) |
1552 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1553 | Resource Class TLV (CR-LDP, optional) |
1554 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1555 | Pre-emption TLV (CR-LDP, optional) |
1556 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1557 ***********************************************************************/
1559 typedef struct mplsLdpLblReqMsg_s {
1560 struct mplsLdpMsg_s baseMsg;
1562 /* FEC tlv */
1563 struct mplsLdpFecTlv_s fecTlv;
1565 /* Optional parameters */
1566 struct mplsLdpHopTlv_s hopCountTlv; /* hop count tlv */
1567 struct mplsLdpPathTlv_s pathVecTlv; /* path vector tlv */
1569 /* Optional parameters for CR */
1570 struct mplsLdpRetMsgIdTlv_s lblMsgIdTlv; /* lbl msg id tlv */
1571 struct mplsLdpErTlv_s erTlv; /* constraint rtg tlv */
1572 struct mplsLdpTrafficTlv_s trafficTlv; /* traffic tlv */
1573 struct mplsLdpLspIdTlv_s lspidTlv; /* lspid tlv */
1574 struct mplsLdpPinningTlv_s pinningTlv; /* pinning tlv */
1575 struct mplsLdpResClsTlv_s resClassTlv; /* resource class tlv */
1576 struct mplsLdpPreemptTlv_s preemptTlv; /* peemtion tlv */
1578 u_char fecTlvExists:1;
1579 u_char hopCountTlvExists:1;
1580 u_char pathVecTlvExists:1;
1581 u_char lblMsgIdTlvExists:1;
1582 u_char erTlvExists:1;
1583 u_char trafficTlvExists:1;
1584 u_char lspidTlvExists:1;
1585 u_char pinningTlvExists:1;
1586 u_char recClassTlvExists:1;
1587 u_char preemptTlvExists:1;
1589 } mplsLdpLblReqMsg_t;
1591 /***********************************************************************
1593 Label Withdraw Message encoding
1595 0 1 2 3
1596 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
1597 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1598 |U| Label Withdraw (0x0402) | Message Length |
1599 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1600 | Message ID |
1601 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1602 | FEC TLV |
1603 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1604 | Label TLV (optional) |
1605 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1606 | LSPID TLV (optional for CR-LDP) |
1607 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1609 Label Release Message encoding
1611 0 1 2 3
1612 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
1613 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1614 |U| Label Release (0x0403) | Message Length |
1615 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1616 | Message ID |
1617 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1618 | FEC TLV |
1619 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1620 | Label TLV (optional) |
1621 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1622 | LSPID TLV (optional for CR-LDP) |
1623 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1625 Note: the Label Withdraw Message encoding and the Label Release Message enc
1626 look very much the same. I will create only one type of struct for
1627 both message types.
1628 The Label Withdraw Message and Label Release Message can optionally
1629 carry LSPID TLV.
1630 ***********************************************************************/
1632 typedef struct mplsLdpLbl_W_R_Msg_s {
1633 struct mplsLdpMsg_s baseMsg;
1635 /* FEC tlv */
1636 struct mplsLdpFecTlv_s fecTlv;
1638 /* Label TLV */
1639 struct mplsLdpGenLblTlv_s genLblTlv; /* generic label tlv */
1640 struct mplsLdpAtmLblTlv_s atmLblTlv; /* atm label tlv */
1641 struct mplsLdpFrLblTlv_s frLblTlv; /* fr label tlv */
1642 struct mplsLdpLspIdTlv_s lspidTlv; /* lspid tlv */
1644 u_char fecTlvExists:1;
1645 u_char genLblTlvExists:1;
1646 u_char atmLblTlvExists:1;
1647 u_char frLblTlvExists:1;
1648 u_char lspidTlvExists:1;
1650 } mplsLdpLbl_W_R_Msg_t;
1652 /***********************************************************************
1653 Label Abort Request Message encoding
1655 0 1 2 3
1656 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
1657 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1658 |U| Label Abort Req (0x0404) | Message Length |
1659 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1660 | Message ID |
1661 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1662 | FEC TLV |
1663 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1664 | Label Request Message ID TLV |
1665 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1666 ***********************************************************************/
1668 typedef struct mplsLdpLblAbortMsg_s {
1669 struct mplsLdpMsg_s baseMsg;
1671 struct mplsLdpFecTlv_s fecTlv; /* fec tlv */
1672 struct mplsLdpLblMsgIdTlv_s lblMsgIdTlv; /* lbl msg id tlv */
1674 u_char fecTlvExists:1;
1675 u_char lblMsgIdTlvExists:1;
1677 } mplsLdpLblAbortMsg_t;
1679 /***********************************************************************
1681 * Function declarations
1683 * Note: Encode functions return the length of the data which was encoded.
1684 * The first argument (which is a pointer to the structure which
1685 * contains the data to be encoded) is not modified in the encode functions
1686 * which encode the messages and message headers. All the other encode
1687 * fuctions modify the content of the structures to be encoded (tlvs,
1688 * message parameters, etc).
1690 * Decode functions for tlv return the length of the value.
1693 int Mpls_encodeLdpMsgHeader(mplsLdpHeader_t *, u_char *, int);
1694 int Mpls_decodeLdpMsgHeader(mplsLdpHeader_t *, u_char *, int);
1695 int Mpls_encodeLdpAtmLblRng(mplsLdpAtmLblRng_t *, u_char *, int);
1696 int Mpls_decodeLdpAtmLblRng(mplsLdpAtmLblRng_t *, u_char *, int);
1697 int Mpls_encodeLdpAsp(mplsLdpAspTlv_t *, u_char *, int);
1698 int Mpls_decodeLdpAsp(mplsLdpAspTlv_t *, u_char *, int);
1699 int Mpls_encodeLdpTlv(mplsLdpTlv_t *, u_char *, int);
1700 int Mpls_decodeLdpTlv(mplsLdpTlv_t *, u_char *, int);
1701 int Mpls_encodeLdpInitMsg(mplsLdpInitMsg_t *, u_char *, int);
1702 int Mpls_decodeLdpInitMsg(mplsLdpInitMsg_t *, u_char *, int);
1703 int Mpls_encodeLdpCsp(mplsLdpCspTlv_t *, u_char *, int);
1704 int Mpls_decodeLdpCsp(mplsLdpCspTlv_t *, u_char *, int);
1705 int Mpls_encodeLdpBaseMsg(mplsLdpMsg_t *, u_char *, int);
1706 int Mpls_decodeLdpBaseMsg(mplsLdpMsg_t *, u_char *, int);
1707 int Mpls_encodeLdpFrLblRng(mplsLdpFrLblRng_t *, u_char *, int);
1708 int Mpls_decodeLdpFrLblRng(mplsLdpFrLblRng_t *, u_char *, int);
1709 int Mpls_encodeLdpFsp(mplsLdpFspTlv_t *, u_char *, int);
1710 int Mpls_decodeLdpFsp(mplsLdpFspTlv_t *, u_char *, int);
1711 int Mpls_encodeLdpNotMsg(mplsLdpNotifMsg_t *, u_char *, int);
1712 int Mpls_decodeLdpNotMsg(mplsLdpNotifMsg_t *, u_char *, int);
1713 int Mpls_encodeLdpStatus(mplsLdpStatusTlv_t *, u_char *, int);
1714 int Mpls_decodeLdpStatus(mplsLdpStatusTlv_t *, u_char *, int);
1715 int Mpls_encodeLdpExStatus(mplsLdpExStatusTlv_t *, u_char *, int);
1716 int Mpls_decodeLdpExStatus(mplsLdpExStatusTlv_t *, u_char *, int);
1717 int Mpls_encodeLdpRetPdu(mplsLdpRetPduTlv_t *, u_char *, int);
1718 int Mpls_decodeLdpRetPdu(mplsLdpRetPduTlv_t *, u_char *, int, u_short);
1719 int Mpls_encodeLdpRetMsg(mplsLdpRetMsgTlv_t *, u_char *, int);
1720 int Mpls_decodeLdpRetMsg(mplsLdpRetMsgTlv_t *, u_char *, int, u_short);
1721 int Mpls_encodeLdpHelloMsg(mplsLdpHelloMsg_t *, u_char *, int);
1722 int Mpls_decodeLdpHelloMsg(mplsLdpHelloMsg_t *, u_char *, int);
1723 int Mpls_encodeLdpChp(mplsLdpChpTlv_t *, u_char *, int);
1724 int Mpls_decodeLdpChp(mplsLdpChpTlv_t *, u_char *, int);
1725 int Mpls_encodeLdpCsn(mplsLdpCsnTlv_t *, u_char *, int);
1726 int Mpls_decodeLdpCsn(mplsLdpCsnTlv_t *, u_char *, int);
1727 int Mpls_encodeLdpTrAdr(mplsLdpTrAdrTlv_t *, u_char *, int);
1728 int Mpls_decodeLdpTrAdr(mplsLdpTrAdrTlv_t *, u_char *, int);
1729 int Mpls_encodeLdpKeepAliveMsg(mplsLdpKeepAlMsg_t *, u_char *, int);
1730 int Mpls_decodeLdpKeepAliveMsg(mplsLdpKeepAlMsg_t *, u_char *, int);
1731 int Mpls_encodeLdpAdrTlv(mplsLdpAdrTlv_t *, u_char *, int);
1732 int Mpls_decodeLdpAdrTlv(mplsLdpAdrTlv_t *, u_char *, int, u_short);
1733 int Mpls_encodeLdpAdrMsg(mplsLdpAdrMsg_t *, u_char *, int);
1734 int Mpls_decodeLdpAdrMsg(mplsLdpAdrMsg_t *, u_char *, int);
1735 int Mpls_encodeLdpFecTlv(mplsLdpFecTlv_t *, u_char *, int);
1736 int Mpls_decodeLdpFecTlv(mplsLdpFecTlv_t *, u_char *, int, u_short);
1737 int Mpls_encodeLdpGenLblTlv(mplsLdpGenLblTlv_t *, u_char *, int);
1738 int Mpls_decodeLdpGenLblTlv(mplsLdpGenLblTlv_t *, u_char *, int);
1739 int Mpls_encodeLdpAtmLblTlv(mplsLdpAtmLblTlv_t *, u_char *, int);
1740 int Mpls_decodeLdpAtmLblTlv(mplsLdpAtmLblTlv_t *, u_char *, int);
1741 int Mpls_encodeLdpFrLblTlv(mplsLdpFrLblTlv_t *, u_char *, int);
1742 int Mpls_decodeLdpFrLblTlv(mplsLdpFrLblTlv_t *, u_char *, int);
1743 int Mpls_encodeLdpHopTlv(mplsLdpHopTlv_t *, u_char *, int);
1744 int Mpls_decodeLdpHopTlv(mplsLdpHopTlv_t *, u_char *, int);
1745 int Mpls_encodeLdpLblMsgIdTlv(mplsLdpLblMsgIdTlv_t *, u_char *, int);
1746 int Mpls_decodeLdpLblMsgIdTlv(mplsLdpLblMsgIdTlv_t *, u_char *, int);
1747 int Mpls_encodeLdpPathVectorTlv(mplsLdpPathTlv_t *, u_char *, int);
1748 int Mpls_decodeLdpPathVectorTlv(mplsLdpPathTlv_t *, u_char *, int, u_short);
1749 int Mpls_encodeLdpLblMapMsg(mplsLdpLblMapMsg_t *, u_char *, int);
1750 int Mpls_decodeLdpLblMapMsg(mplsLdpLblMapMsg_t *, u_char *, int);
1751 int Mpls_encodeLdpFecAdrEl(mplsFecElement_t *, u_char *, int, u_char);
1752 int Mpls_decodeLdpFecAdrEl(mplsFecElement_t *, u_char *, int, u_char);
1753 int Mpls_encodeLdpLblRetMsgIdTlv(mplsLdpLblRetMsgIdTlv_t *, u_char *, int);
1754 int Mpls_decodeLdpLblRetMsgIdTlv(mplsLdpLblRetMsgIdTlv_t *, u_char *, int);
1755 int Mpls_encodeLdpLbl_W_R_Msg(mplsLdpLbl_W_R_Msg_t *, u_char *, int);
1756 int Mpls_decodeLdpLbl_W_R_Msg(mplsLdpLbl_W_R_Msg_t *, u_char *, int);
1757 int Mpls_encodeLdpERTlv(mplsLdpErTlv_t *, u_char *, int);
1758 int Mpls_decodeLdpERTlv(mplsLdpErTlv_t *, u_char *, int, u_short);
1759 int Mpls_encodeLdpErHop(mplsLdpErHop_t *, u_char *, int, u_short);
1760 int Mpls_decodeLdpErHop(mplsLdpErHop_t *, u_char *, int, u_short *);
1761 int Mpls_encodeLdpTrafficTlv(mplsLdpTrafficTlv_t *, u_char *, int);
1762 int Mpls_decodeLdpTrafficTlv(mplsLdpTrafficTlv_t *, u_char *, int, u_short);
1763 int Mpls_encodeLdpLblReqMsg(mplsLdpLblReqMsg_t *, u_char *, int);
1764 int Mpls_decodeLdpLblReqMsg(mplsLdpLblReqMsg_t *, u_char *, int);
1765 int Mpls_encodeLdpPreemptTlv(mplsLdpPreemptTlv_t *, u_char *, int);
1766 int Mpls_decodeLdpPreemptTlv(mplsLdpPreemptTlv_t *, u_char *, int);
1767 int Mpls_encodeLdpLspIdTlv(mplsLdpLspIdTlv_t *, u_char *, int);
1768 int Mpls_decodeLdpLspIdTlv(mplsLdpLspIdTlv_t *, u_char *, int);
1769 int Mpls_encodeLdpResClsTlv(mplsLdpResClsTlv_t *, u_char *, int);
1770 int Mpls_decodeLdpResClsTlv(mplsLdpResClsTlv_t *, u_char *, int);
1771 int Mpls_encodeLdpPinningTlv(mplsLdpPinningTlv_t *, u_char *, int);
1772 int Mpls_decodeLdpPinningTlv(mplsLdpPinningTlv_t *, u_char *, int);
1773 int Mpls_encodeLdpLblAbortMsg(mplsLdpLblAbortMsg_t *, u_char *, int);
1774 int Mpls_decodeLdpLblAbortMsg(mplsLdpLblAbortMsg_t *, u_char *, int);
1777 * DEBUG function declarations
1780 void printTlv(mpls_instance_handle handle, mplsLdpTlv_t *);
1781 void printHeader(mpls_instance_handle handle, mplsLdpHeader_t *);
1782 void printCspFlags(mpls_instance_handle handle, mplsLdpCspFlag_t *);
1783 void printCspFlagsPerByte(mpls_instance_handle handle, u_short *);
1784 void printCspTlv(mpls_instance_handle handle, mplsLdpCspTlv_t *);
1785 void printAspFlags(mpls_instance_handle handle, mplsLdpSPFlag_t *);
1786 void printAspFlagsPerByte(mpls_instance_handle handle, u_int *);
1787 void printAspTlv(mpls_instance_handle handle, mplsLdpAspTlv_t *);
1788 void printFspFlags(mpls_instance_handle handle, mplsLdpSPFlag_t *);
1789 void printFspTlv(mpls_instance_handle handle, mplsLdpFspTlv_t *);
1790 void printRetMsgTlv(mpls_instance_handle handle, mplsLdpRetMsgTlv_t *);
1791 void printRetPduTlv(mpls_instance_handle handle, mplsLdpRetPduTlv_t *);
1792 void printExStatusTlv(mpls_instance_handle handle, mplsLdpExStatusTlv_t *);
1793 void printStatusTlv(mpls_instance_handle handle, mplsLdpStatusTlv_t *);
1794 void printCsnTlv(mpls_instance_handle handle, mplsLdpCsnTlv_t *);
1795 void printTrAdrTlv(mpls_instance_handle handle, mplsLdpTrAdrTlv_t *);
1796 void printChpTlv(mpls_instance_handle handle, mplsLdpChpTlv_t *);
1797 void printAdrListTlv(mpls_instance_handle handle, mplsLdpAdrTlv_t *);
1798 void printFecListTlv(mpls_instance_handle handle, mplsLdpFecTlv_t *);
1799 void printLblMsgIdTlv(mpls_instance_handle handle, mplsLdpLblMsgIdTlv_t *);
1800 void printPathVecTlv(mpls_instance_handle handle, mplsLdpPathTlv_t *);
1801 void printHopTlv(mpls_instance_handle handle, mplsLdpHopTlv_t *);
1802 void printFrLblTlv(mpls_instance_handle handle, mplsLdpFrLblTlv_t *);
1803 void printAtmLblTlv(mpls_instance_handle handle, mplsLdpAtmLblTlv_t *);
1804 void printGenLblTlv(mpls_instance_handle handle, mplsLdpGenLblTlv_t *);
1805 void printErFlags(mpls_instance_handle handle, mplsLdpErFlag_t *);
1806 void printErIPFlags(mpls_instance_handle handle, mplsLdpErIPFlag_t *);
1807 void printErTlv(mpls_instance_handle handle, mplsLdpErTlv_t *);
1808 void printTrafficTlv(mpls_instance_handle handle, mplsLdpTrafficTlv_t *);
1809 void printAtmLabel(mpls_instance_handle handle, mplsLdpAtmLblRng_t *, int);
1810 void printFspLabel(mpls_instance_handle handle, mplsLdpFrLblRng_t *, int);
1811 void printErHop(mpls_instance_handle handle, mplsLdpErHop_t *, u_short);
1812 void printPreemptTlv(mpls_instance_handle handle, mplsLdpPreemptTlv_t *);
1813 void printLspIdTlv(mpls_instance_handle handle, mplsLdpLspIdTlv_t *);
1814 void printResClsTlv(mpls_instance_handle handle, mplsLdpResClsTlv_t *);
1815 void printPinningTlv(mpls_instance_handle handle, mplsLdpPinningTlv_t *);
1817 void printInitMsg(mpls_instance_handle handle, mplsLdpInitMsg_t *);
1818 void printHelloMsg(mpls_instance_handle handle, mplsLdpHelloMsg_t *);
1819 void printNotMsg(mpls_instance_handle handle, mplsLdpNotifMsg_t *);
1820 void printKeepAliveMsg(mpls_instance_handle handle, mplsLdpKeepAlMsg_t *);
1821 void printAddressMsg(mpls_instance_handle handle, mplsLdpAdrMsg_t *);
1822 void printLlbMapMsg(mpls_instance_handle handle, mplsLdpLblMapMsg_t *);
1823 void printLlbReqMsg(mpls_instance_handle handle, mplsLdpLblReqMsg_t *);
1824 void printLbl_W_R_Msg(mpls_instance_handle handle, mplsLdpLbl_W_R_Msg_t *);
1825 void printLlbAbortMsg(mpls_instance_handle handle, mplsLdpLblAbortMsg_t *);
1827 int converAsciiToHex(u_char *, int, u_char *);
1828 int converHexToAscii(u_char *, int, u_char *);
1830 #endif /* _LDP_MPLS_H_ */