3 * Copyright (C) James R. Leu 2000
6 * This software is covered under the LGPL, for more
7 * info check out http://www.gnu.org/copyleft/lgpl.html
10 #ifndef _LDP_STRUCT_H_
11 #define _LDP_STRUCT_H_
13 #include "mpls_struct.h"
14 #include "mpls_list.h"
15 #include "mpls_refcnt.h"
17 MPLS_LIST_ROOT(ldp_outlabel_list
, ldp_outlabel
);
18 MPLS_LIST_ROOT(ldp_resource_list
, ldp_resource
);
19 MPLS_LIST_ROOT(ldp_hop_list_list
, ldp_hop_list
);
20 MPLS_LIST_ROOT(ldp_inlabel_list
, ldp_inlabel
);
21 MPLS_LIST_ROOT(ldp_session_list
, ldp_session
);
22 MPLS_LIST_ROOT(ldp_nexthop_list
, ldp_nexthop
);
23 MPLS_LIST_ROOT(ldp_entity_list
, ldp_entity
);
24 MPLS_LIST_ROOT(ldp_tunnel_list
, ldp_tunnel
);
25 MPLS_LIST_ROOT(ldp_addr_list
, ldp_addr
);
26 MPLS_LIST_ROOT(ldp_attr_list
, ldp_attr
);
27 MPLS_LIST_ROOT(ldp_peer_list
, ldp_peer
);
28 MPLS_LIST_ROOT(_ldp_hop_list
, ldp_hop
);
29 MPLS_LIST_ROOT(ldp_adj_list
, ldp_adj
);
30 MPLS_LIST_ROOT(ldp_fec_list
, ldp_fec
);
31 MPLS_LIST_ROOT(ldp_fs_list
, ldp_fs
);
32 MPLS_LIST_ROOT(ldp_if_list
, ldp_if
);
34 typedef struct ldp_attr_list ldp_attr_list
;
40 } ldp_entity_type_enum
;
43 LDP_CONTROL_INDEPENDENT
= 1,
48 LDP_RETENTION_LIBERAL
= 1,
49 LDP_RETENTION_CONSERVATIVE
61 LDP_LOOP_HOPCOUNT_PATHVECTOR
,
63 } ldp_loop_detection_mode
;
66 LDP_TRANS_ADDR_NONE
= 0,
67 LDP_TRANS_ADDR_INTERFACE
,
69 } ldp_trans_addr_mode
;
72 LDP_DISTRIBUTION_UNSOLICITED
= 0,
73 LDP_DISTRIBUTION_ONDEMAND
= 1,
74 } ldp_distribution_mode
;
98 LDP_EVENT_TCP_CONNECT
,
106 LDP_STATE_INITIALIZED
,
109 LDP_STATE_OPERATIONAL
113 LDP_KEEPALIVE_RECV
= 1,
115 } ldp_keepalive_type
;
118 LDP_LSP_STATE_REQ_RECV
,
119 LDP_LSP_STATE_REQ_SENT
,
120 LDP_LSP_STATE_MAP_RECV
,
121 LDP_LSP_STATE_MAP_SENT
,
122 LDP_LSP_STATE_WITH_SENT
,
123 LDP_LSP_STATE_WITH_RECV
,
124 LDP_LSP_STATE_NO_LABEL_RESOURCE_SENT
,
125 LDP_LSP_STATE_NO_LABEL_RESOURCE_RECV
,
126 LDP_LSP_STATE_ABORT_SENT
,
127 LDP_LSP_STATE_ABORT_RECV
,
128 LDP_LSP_STATE_NOTIF_SENT
,
129 LDP_LSP_STATE_NOTIF_RECV
133 LDP_TRACE_FLAG_ADDRESS
= 0x00000001,
134 LDP_TRACE_FLAG_BINDING
= 0x00000002,
135 LDP_TRACE_FLAG_DEBUG
= 0x00000004,
136 LDP_TRACE_FLAG_ERROR
= 0x00000008,
137 LDP_TRACE_FLAG_EVENT
= 0x00000010,
138 LDP_TRACE_FLAG_GENERAL
= 0x00000020,
139 LDP_TRACE_FLAG_INIT
= 0x00000040,
140 LDP_TRACE_FLAG_LABEL
= 0x00000080,
141 LDP_TRACE_FLAG_NORMAL
= 0x00000100,
142 LDP_TRACE_FLAG_NOTIF
= 0x00000200,
143 LDP_TRACE_FLAG_PACKET_DUMP
= 0x00000400,
144 LDP_TRACE_FLAG_PACKET
= 0x00000800,
145 LDP_TRACE_FLAG_PATH
= 0x00001000,
146 LDP_TRACE_FLAG_PERIODIC
= 0x00002000,
147 LDP_TRACE_FLAG_POLICY
= 0x00004000,
148 LDP_TRACE_FLAG_ROUTE
= 0x00008000,
149 LDP_TRACE_FLAG_STATE
= 0x00010000,
150 LDP_TRACE_FLAG_TASK
= 0x00020000,
151 LDP_TRACE_FLAG_TIMER
= 0x00040000,
152 LDP_TRACE_FLAG_ALL
= 0xFFFFFFFF
158 LDP_NOTIF_BAD_LDP_ID
,
160 LDP_NOTIF_BAD_PDU_LEN
,
161 LDP_NOTIF_UNKNOWN_MESG
,
162 LDP_NOTIF_BAD_MESG_LEN
,
163 LDP_NOTIF_UNKNOWN_TVL
,
164 LDP_NOTIF_BAD_TLV_LEN
,
165 LDP_NOTIF_MALFORMED_TLV
,
166 LDP_NOTIF_HOLD_TIMER_EXPIRED
,
168 LDP_NOTIF_LOOP_DETECTED
,
169 LDP_NOTIF_UNKNOWN_FEC
,
171 LDP_NOTIF_NO_LABEL_RESOURCES_AVAILABLE
,
172 LDP_NOTIF_LABEL_RESOURCES_AVAILABLE
,
173 LDP_NOTIF_SESSION_REJECTED_NO_HELLO
,
174 LDP_NOTIF_SESSION_REJECTED_PARAMETERS_ADVERTISEMENT_MODE
,
175 LDP_NOTIF_SESSION_REJECTED_PARAMETERS_MAX_PDU_LEN
,
176 LDP_NOTIF_SESSION_REJECTED_PARAMETERS_LABEL_RANGE
,
177 LDP_NOTIF_KEEPALIVE_TIMER_EXPIRED
,
178 LDP_NOTIF_LABEL_ABORT
,
179 LDP_NOTIF_MISSING_MSG_PARAMS
,
180 LDP_NOTIF_UNSUPORTED_AF
,
181 LDP_NOTIF_SESSION_REJECTED_BAD_KEEPALIVE_TIME
,
182 LDP_NOTIF_INTERNAL_ERROR
185 #define LDP_STATE_NUM 6
186 #define LDP_EVENT_NUM 10
187 #define LDP_FUNC_NUM 10
189 #include "ldp_defaults.h"
190 #include "mpls_handle_type.h"
191 #include "ldp_nortel.h"
193 typedef struct ldp_mesg
{
194 mplsLdpHeader_t header
;
196 mplsLdpMsg_t generic
;
197 mplsLdpInitMsg_t init
;
198 mplsLdpNotifMsg_t notif
;
199 mplsLdpHelloMsg_t hello
;
200 mplsLdpKeepAlMsg_t keep
;
201 mplsLdpAdrMsg_t addr
;
202 mplsLdpLblMapMsg_t map
;
203 mplsLdpLblReqMsg_t request
;
204 mplsLdpLbl_W_R_Msg_t release
;
205 mplsLdpLblAbortMsg_t abort
;
209 typedef struct ldp_buf
{
218 typedef struct ldp_global
{
219 struct ldp_outlabel_list outlabel
;
220 struct ldp_resource_list resource
;
221 struct ldp_hop_list_list hop_list
;
222 struct ldp_inlabel_list inlabel
;
223 struct ldp_nexthop_list nexthop
;
224 struct ldp_session_list session
;
225 struct ldp_tunnel_list tunnel
;
226 struct ldp_entity_list entity
;
227 struct ldp_peer_list peer
;
228 struct ldp_attr_list attr
;
229 struct ldp_addr_list addr
;
230 struct ldp_adj_list adj
;
231 struct ldp_if_list iff
;
232 struct ldp_fec_list fec
;
234 mpls_lock_handle global_lock
;
235 mpls_instance_handle user_data
;
237 mpls_tree_handle addr_tree
;
238 mpls_tree_handle fec_tree
;
240 mpls_socket_handle hello_socket
;
241 mpls_socket_handle listen_socket
;
243 mpls_timer_mgr_handle timer_handle
;
244 mpls_socket_mgr_handle socket_handle
;
245 mpls_fib_handle fib_handle
;
246 mpls_ifmgr_handle ifmgr_handle
;
249 mpls_cfg_handle lsr_handle
;
251 mpls_mpls_handle mpls_handle
;
255 * CSN changes with every MIB set, BUT only when a entity goes through
256 * shutdown/startup cycle will it grab the new CSN and use it in hellos
258 uint32_t configuration_sequence_number
;
261 * Message ID increaments with EVERY message, this means it will roll over
263 uint32_t message_identifier
;
265 struct mpls_inet_addr lsr_identifier
;
266 mpls_bool send_address_messages
;
267 mpls_bool send_lsrid_mapping
;
268 ldp_control_mode lsp_control_mode
;
269 ldp_retention_mode label_retention_mode
;
270 ldp_repaire_mode lsp_repair_mode
;
271 mpls_bool propagate_release
;
272 mpls_bool label_merge
;
273 ldp_loop_detection_mode loop_detection_mode
;
274 mpls_bool ttl_less_domain
;
275 uint16_t local_tcp_port
;
276 uint16_t local_udp_port
;
277 uint16_t backoff_step
;
278 int no_route_to_peer_time
;
281 * some global defaults, entities will inherit these values unless
282 * instructed otherwise
284 struct mpls_inet_addr transport_address
;
285 uint16_t keepalive_timer
;
286 uint16_t keepalive_interval
;
287 uint16_t hellotime_timer
;
288 uint16_t hellotime_interval
;
290 mpls_admin_state_enum admin_state
;
293 typedef struct ldp_entity
{
295 MPLS_LIST_ELEM(ldp_entity
) _global
;
296 struct ldp_adj_list adj_root
;
298 ldp_entity_type_enum entity_type
;
300 struct ldp_peer
*peer
;
304 ldp_state_enum state
;
305 uint32_t inherit_flag
;
308 struct mpls_inet_addr transport_address
;
309 uint8_t protocol_version
;
310 uint16_t remote_tcp_port
;
311 uint16_t remote_udp_port
;
313 uint16_t keepalive_timer
;
314 uint16_t keepalive_interval
;
315 uint16_t hellotime_timer
;
316 uint16_t hellotime_interval
;
317 uint16_t session_setup_count
;
318 uint16_t session_backoff_timer
;
319 ldp_distribution_mode label_distribution_mode
;
320 uint8_t path_vector_limit
;
321 uint8_t hop_count_limit
;
322 uint8_t label_request_count
;
323 uint16_t label_request_timer
;
324 ldp_loop_detection_mode loop_detection_mode
;
325 mpls_admin_state_enum admin_state
;
326 mpls_bool remote_in_ttl_less_domain
;
327 mpls_bool request_retry
;
333 /* only used for cfg gets */
338 typedef struct ldp_if
{
340 MPLS_LIST_ELEM(ldp_if
) _global
;
341 struct mpls_link_list session_root
;
342 struct ldp_nexthop_list nh_root
;
343 struct ldp_entity
*entity
;
344 mpls_timer_handle hellotime_send_timer
;
345 int hellotime_send_timer_duration
;
348 struct mpls_inet_addr local_source_address
;
349 mpls_if_handle handle
;
351 struct ldp_mesg
*tx_message
;
352 struct ldp_buf
*tx_buffer
;
353 struct ldp_mesg
*hello
;
355 /* YES this is a dest, it is what we use for sendto */
356 struct mpls_dest dest
;
358 char name
[MPLS_MAX_IF_NAME
];
359 mpls_oper_state_enum oper_state
;
360 mpls_bool used_by_ldp
;
361 mpls_bool used_by_fec
;
364 /* only used for cfg gets */
365 uint32_t entity_index
;
368 typedef struct ldp_peer
{
370 MPLS_LIST_ELEM(ldp_peer
) _global
;
371 struct ldp_entity
*entity
;
372 mpls_timer_handle no_route_to_peer_timer
;
373 mpls_timer_handle hellotime_send_timer
;
374 int hellotime_send_timer_duration
;
377 struct mpls_inet_addr local_source_address
;
379 struct ldp_mesg
*tx_message
;
380 struct ldp_buf
*tx_buffer
;
381 struct ldp_mesg
*hello
;
383 /* YES this is a dest, it is what we use for sendto */
384 struct mpls_dest dest
;
385 ldp_role_enum target_role
;
387 char peer_name
[MPLS_MAX_IF_NAME
];
388 mpls_oper_state_enum oper_state
;
390 /* only used for cfg gets */
391 uint32_t entity_index
;
394 typedef struct ldp_session
{
396 MPLS_LIST_ELEM(ldp_session
) _global
;
397 struct ldp_outlabel_list outlabel_root
;
398 struct mpls_link_list inlabel_root
;
399 struct mpls_link_list addr_root
;
400 struct ldp_attr_list attr_root
;
401 struct ldp_adj_list adj_root
;
402 mpls_timer_handle initial_distribution_timer
;
403 mpls_timer_handle keepalive_recv_timer
;
404 mpls_timer_handle keepalive_send_timer
;
406 ldp_state_enum state
;
408 ldp_notif_status shutdown_notif
;
409 mpls_bool shutdown_fatal
;
410 mpls_socket_handle socket
;
411 mpls_timer_handle backoff_timer
;
414 /* operational values learned from initialization */
417 int oper_keepalive_interval
;
418 int oper_path_vector_limit
;
419 ldp_distribution_mode oper_distribution_mode
;
420 ldp_loop_detection_mode oper_loop_detection
;
422 /* these values are learned form the remote peer */
423 ldp_distribution_mode remote_distribution_mode
;
424 mpls_bool remote_loop_detection
;
425 int remote_path_vector_limit
;
426 int remote_keepalive
;
428 mpls_dest remote_dest
;
429 uint8_t session_name
[20]; /* xxx.xxx.xxx.xxx:yyy\0 */
431 mpls_bool no_label_resource_sent
;
432 mpls_bool no_label_resource_recv
;
435 /* various message and buffers used for tx and rx */
436 struct ldp_mesg
*keepalive
;
437 struct ldp_mesg
*tx_message
;
438 struct ldp_buf
*tx_buffer
;
440 /* cached from adj's */
441 ldp_role_enum oper_role
;
443 /* these are config values come from entity */
444 ldp_loop_detection_mode cfg_loop_detection_mode
;
445 ldp_distribution_mode cfg_distribution_mode
;
446 mpls_bool cfg_remote_in_ttl_less_domain
;
447 int cfg_label_request_count
;
448 int cfg_label_request_timer
;
449 uint16_t cfg_peer_tcp_port
;
450 int cfg_path_vector_limit
;
451 int cfg_hop_count_limit
;
460 /* only used by cfg gets */
464 typedef struct ldp_adj
{
466 MPLS_LIST_ELEM(ldp_adj
) _global
;
467 MPLS_LIST_ELEM(ldp_adj
) _session
;
468 MPLS_LIST_ELEM(ldp_adj
) _entity
;
469 struct ldp_session
*session
;
470 struct ldp_entity
*entity
;
471 mpls_timer_handle hellotime_recv_timer
;
472 mpls_oper_state_enum state
;
476 /* these values are learned form the remote peer */
477 struct mpls_inet_addr remote_transport_address
;
478 struct mpls_inet_addr remote_source_address
;
479 struct mpls_inet_addr remote_lsr_address
;
480 int remote_label_space
;
481 int remote_hellotime
;
484 /* only used by cfg gets */
485 uint32_t session_index
;
486 uint32_t entity_index
;
489 typedef struct ldp_addr
{
491 MPLS_LIST_ELEM(ldp_addr
) _global
;
492 MPLS_LIST_ELEM(ldp_addr
) _addr
;
493 struct mpls_link_list session_root
;
494 struct ldp_nexthop_list nh_root
;
495 struct mpls_inet_addr address
;
501 typedef struct ldp_nexthop
{
503 MPLS_LIST_ELEM(ldp_nexthop
) _global
;
504 MPLS_LIST_ELEM(ldp_nexthop
) _fec
;
505 MPLS_LIST_ELEM(ldp_nexthop
) _addr
;
506 MPLS_LIST_ELEM(ldp_nexthop
) _if
;
507 MPLS_LIST_ELEM(ldp_nexthop
) _outlabel
;
508 struct ldp_outlabel_list outlabel_root
;
509 enum mpls_nexthop_enum type
;
511 struct ldp_addr
*addr
;
513 struct ldp_outlabel
*outlabel
;
514 struct mpls_nexthop info
;
518 typedef struct ldp_outlabel
{
520 MPLS_LIST_ELEM(ldp_outlabel
) _global
;
521 MPLS_LIST_ELEM(ldp_outlabel
) _session
;
522 MPLS_LIST_ELEM(ldp_outlabel
) _nexthop
;
523 struct ldp_inlabel_list inlabel_root
;
524 struct ldp_tunnel_list tunnel_root
;
525 struct ldp_nexthop_list nh_root
;
526 uint32_t merge_count
;
527 struct ldp_attr
*attr
;
528 struct ldp_session
*session
;
529 struct ldp_nexthop
*nh
;
530 struct mpls_outsegment info
;
534 /* only used by get() */
535 uint32_t session_index
;
540 typedef struct ldp_inlabel
{
542 MPLS_LIST_ELEM(ldp_inlabel
) _global
;
543 MPLS_LIST_ELEM(ldp_inlabel
) _outlabel
;
544 struct mpls_link_list session_root
;
545 struct mpls_link_list attr_root
;
546 struct ldp_outlabel
*outlabel
;
547 uint32_t reuse_count
;
549 struct mpls_insegment info
;
551 /* only used by get() */
552 uint32_t outlabel_index
;
555 typedef struct ldp_fec
{
557 MPLS_LIST_ELEM(ldp_fec
) _global
;
558 MPLS_LIST_ELEM(ldp_fec
) _inlabel
;
559 MPLS_LIST_ELEM(ldp_fec
) _outlabel
;
560 MPLS_LIST_ELEM(ldp_fec
) _tree
;
561 MPLS_LIST_ELEM(ldp_fec
) _addr
;
562 MPLS_LIST_ELEM(ldp_fec
) _fec
;
563 MPLS_LIST_ELEM(ldp_fec
) _if
;
564 struct ldp_fs_list fs_root_us
;
565 struct ldp_fs_list fs_root_ds
;
567 struct ldp_nexthop_list nh_root
;
568 struct mpls_fec info
;
572 typedef struct ldp_fs
{
573 struct ldp_attr_list attr_root
;
574 MPLS_LIST_ELEM(ldp_fs
) _fec
;
575 struct ldp_session
*session
;
578 typedef struct ldp_attr
{
582 struct ldp_attr_list us_attr_root
;
583 struct ldp_attr
*ds_attr
;
588 struct ldp_session
*session
;
589 uint32_t attempt_count
;
590 mpls_timer_handle action_timer
;
591 ldp_lsp_state action
;
594 MPLS_LIST_ELEM(ldp_attr
) _session
;
595 MPLS_LIST_ELEM(ldp_attr
) _global
;
596 MPLS_LIST_ELEM(ldp_attr
) _ds_attr
;
597 MPLS_LIST_ELEM(ldp_attr
) _fs
;
599 mplsLdpFecTlv_t fecTlv
;
600 mplsLdpGenLblTlv_t genLblTlv
;
601 mplsLdpAtmLblTlv_t atmLblTlv
;
602 mplsLdpFrLblTlv_t frLblTlv
;
603 mplsLdpHopTlv_t hopCountTlv
;
604 mplsLdpPathTlv_t pathVecTlv
;
605 mplsLdpLblMsgIdTlv_t lblMsgIdTlv
;
606 mplsLdpLspIdTlv_t lspidTlv
;
607 mplsLdpTrafficTlv_t trafficTlv
;
608 mplsLdpStatusTlv_t statusTlv
;
609 mplsLdpRetMsgTlv_t retMsgTlv
;
611 uint8_t fecTlvExists
:1;
612 uint8_t genLblTlvExists
:1;
613 uint8_t atmLblTlvExists
:1;
614 uint8_t frLblTlvExists
:1;
615 uint8_t hopCountTlvExists
:1;
616 uint8_t pathVecTlvExists
:1;
617 uint8_t lblMsgIdTlvExists
:1;
618 uint8_t lspidTlvExists
:1;
619 uint8_t trafficTlvExists
:1;
620 uint8_t statusTlvExists
:1;
621 uint8_t retMsgTlvExists
:1;
623 struct ldp_outlabel
*outlabel
;
624 struct ldp_inlabel
*inlabel
;
626 /* only used for get() */
627 uint32_t inlabel_index
;
628 uint32_t outlabel_index
;
629 uint32_t session_index
;
632 typedef struct ldp_resource
{
634 MPLS_LIST_ELEM(ldp_resource
) _global
;
635 struct ldp_tunnel
*tunnel
;
642 typedef struct ldp_hop
{
644 MPLS_LIST_ELEM(ldp_hop
) _hop_list
;
645 struct ldp_hop_list
*hop_list
;
647 uint32_t hop_list_index
;
648 uint32_t path_option
;
653 typedef struct ldp_hop_list
{
655 MPLS_LIST_ELEM(ldp_hop_list
) _global
;
656 struct _ldp_hop_list hop
;
657 struct ldp_tunnel
*tunnel
;
661 typedef struct ldp_tunnel
{
663 MPLS_LIST_ELEM(ldp_tunnel
) _global
;
664 MPLS_LIST_ELEM(ldp_tunnel
) _outlabel
;
666 mpls_inet_addr ingress_lsrid
;
667 ldp_addr egress_lsrid
;
668 char name
[MPLS_MAX_IF_NAME
];
669 mpls_bool is_interface
;
670 uint32_t outlabel_index
;
671 struct ldp_outlabel
*outlabel
;
674 uint32_t instance_prio
;
675 uint32_t resource_index
;
676 struct ldp_resource
*resource
;
677 uint32_t hop_list_index
;
678 struct ldp_hop_list
*hop_list
;
680 mpls_admin_state_enum admin_state
;
682 uint32_t primary_instance
;
683 uint32_t any_affinity
;
684 uint32_t all_affinity
;
685 uint32_t no_all_affinity
;
686 uint32_t path_in_use
;
688 mpls_bool local_protect
;
689 uint32_t session_attr
;
693 typedef void (*ldp_fib_callback
) (mpls_cfg_handle cfg
, mpls_update_enum type
,
695 typedef void (*ldp_ifmgr_callback
) (mpls_cfg_handle cfg
, mpls_update_enum type
,
696 mpls_inet_addr
*addr
);
697 typedef void (*ldp_tree_callback
) (void *);