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 #include "ldp_struct.h"
12 #include "ldp_global.h"
13 #include "ldp_entity.h"
19 #include "ldp_nexthop.h"
20 #include "ldp_tunnel.h"
21 #include "ldp_resource.h"
22 #include "mpls_ifmgr_impl.h"
23 #include "ldp_label_mapping.h"
25 #include "ldp_hop_list.h"
26 #include "mpls_lock_impl.h"
27 #include "mpls_socket_impl.h"
28 #include "mpls_trace_impl.h"
29 #include "mpls_tree_impl.h"
31 mpls_cfg_handle
ldp_cfg_open(mpls_instance_handle data
)
33 ldp_global
*g
= ldp_global_create(data
);
35 LDP_ENTER(data
, "ldp_cfg_open");
36 LDP_EXIT(data
, "ldp_cfg_open");
38 return (mpls_cfg_handle
) g
;
41 void ldp_cfg_close(mpls_cfg_handle g
)
43 LDP_ENTER((mpls_instance_handle
) g
->user_data
, "ldp_cfg_close");
45 LDP_EXIT((mpls_instance_handle
) g
->user_data
, "ldp_cfg_close");
48 /******************* GLOBAL **********************/
50 void ldp_cfg_global_attr(mpls_cfg_handle handle
) {
51 ldp_global
*global
= (ldp_global
*) handle
;
52 ldp_attr
*attr
= MPLS_LIST_HEAD(&global
->attr
);
54 if (attr
->state
== LDP_LSP_STATE_MAP_SENT
&& attr
->ds_attr
) {
55 LDP_PRINT(global
->user_data
, "%p(%s) xc to %p(%s)", attr
,
56 attr
->session
->session_name
, attr
->ds_attr
,
57 attr
->ds_attr
->session
->session_name
);
59 attr
= MPLS_LIST_NEXT(&global
->attr
, attr
, _global
);
63 mpls_return_enum
ldp_cfg_global_get(mpls_cfg_handle handle
, ldp_global
* g
,
66 ldp_global
*global
= (ldp_global
*) handle
;
68 MPLS_ASSERT(global
!=NULL
);
70 LDP_ENTER(global
->user_data
, "ldp_cfg_global_get");
72 mpls_lock_get(global
->global_lock
); /* LOCK */
74 if (flag
& LDP_GLOBAL_CFG_LSR_IDENTIFIER
) {
75 memcpy(&(g
->lsr_identifier
), &(global
->lsr_identifier
),
76 sizeof(mpls_inet_addr
));
78 if (flag
& LDP_GLOBAL_CFG_ADMIN_STATE
) {
79 g
->admin_state
= global
->admin_state
;
81 if (flag
& LDP_GLOBAL_CFG_CONTROL_MODE
) {
82 g
->lsp_control_mode
= global
->lsp_control_mode
;
84 if (flag
& LDP_GLOBAL_CFG_RETENTION_MODE
) {
85 g
->label_retention_mode
= global
->label_retention_mode
;
87 if (flag
& LDP_GLOBAL_CFG_REPAIR_MODE
) {
88 g
->lsp_repair_mode
= global
->lsp_repair_mode
;
90 if (flag
& LDP_GLOBAL_CFG_PROPOGATE_RELEASE
) {
91 g
->propagate_release
= global
->propagate_release
;
93 if (flag
& LDP_GLOBAL_CFG_LABEL_MERGE
) {
94 g
->label_merge
= global
->label_merge
;
96 if (flag
& LDP_GLOBAL_CFG_LOOP_DETECTION_MODE
) {
97 g
->loop_detection_mode
= global
->loop_detection_mode
;
99 if (flag
& LDP_GLOBAL_CFG_TTLLESS_DOMAIN
) {
100 g
->ttl_less_domain
= global
->ttl_less_domain
;
102 if (flag
& LDP_GLOBAL_CFG_LOCAL_TCP_PORT
) {
103 g
->local_tcp_port
= global
->local_tcp_port
;
105 if (flag
& LDP_GLOBAL_CFG_LOCAL_UDP_PORT
) {
106 g
->local_udp_port
= global
->local_udp_port
;
108 if (flag
& LDP_GLOBAL_CFG_TRANS_ADDR
) {
109 memcpy(&(g
->transport_address
), &(global
->transport_address
),
110 sizeof(mpls_inet_addr
));
112 if (flag
& LDP_GLOBAL_CFG_KEEPALIVE_TIMER
) {
113 g
->keepalive_timer
= global
->keepalive_timer
;
115 if (flag
& LDP_GLOBAL_CFG_KEEPALIVE_INTERVAL
) {
116 g
->keepalive_interval
= global
->keepalive_interval
;
118 if (flag
& LDP_GLOBAL_CFG_HELLOTIME_TIMER
) {
119 g
->hellotime_timer
= global
->hellotime_timer
;
121 if (flag
& LDP_GLOBAL_CFG_HELLOTIME_INTERVAL
) {
122 g
->hellotime_interval
= global
->hellotime_interval
;
125 if (flag
& LDP_GLOBAL_CFG_LSR_HANDLE
) {
126 g
->lsr_handle
= global
->lsr_handle
;
130 mpls_lock_release(global
->global_lock
); /* UNLOCK */
132 LDP_EXIT(global
->user_data
, "ldp_cfg_global_get");
137 mpls_return_enum
ldp_cfg_global_test(mpls_cfg_handle handle
, ldp_global
* g
,
140 ldp_global
*global
= (ldp_global
*) handle
;
141 mpls_return_enum retval
= MPLS_SUCCESS
;
143 MPLS_ASSERT(global
!=NULL
);
145 LDP_ENTER(global
->user_data
, "ldp_cfg_global_test");
147 mpls_lock_get(global
->global_lock
); /* LOCK */
149 if (global
->admin_state
== MPLS_ADMIN_ENABLE
&& (flag
& LDP_GLOBAL_CFG_WHEN_DOWN
))
150 retval
= MPLS_FAILURE
;
152 mpls_lock_release(global
->global_lock
); /* UNLOCK */
154 LDP_EXIT(global
->user_data
, "ldp_cfg_global_test");
159 mpls_return_enum
ldp_cfg_global_set(mpls_cfg_handle handle
, ldp_global
* g
,
162 ldp_global
*global
= (ldp_global
*) handle
;
163 mpls_return_enum retval
= MPLS_FAILURE
;
165 MPLS_ASSERT(global
!=NULL
);
167 LDP_ENTER(global
->user_data
, "ldp_cfg_global_set");
169 mpls_lock_get(global
->global_lock
); /* LOCK */
171 if ((global
->admin_state
== MPLS_ADMIN_ENABLE
&& (flag
& LDP_GLOBAL_CFG_WHEN_DOWN
)))
172 goto ldp_cfg_global_set_end
;
174 if (flag
& LDP_GLOBAL_CFG_CONTROL_MODE
) {
175 global
->lsp_control_mode
= g
->lsp_control_mode
;
177 if (flag
& LDP_GLOBAL_CFG_RETENTION_MODE
) {
178 global
->label_retention_mode
= g
->label_retention_mode
;
180 if (flag
& LDP_GLOBAL_CFG_REPAIR_MODE
) {
181 global
->lsp_repair_mode
= g
->lsp_repair_mode
;
183 if (flag
& LDP_GLOBAL_CFG_PROPOGATE_RELEASE
) {
184 global
->propagate_release
= g
->propagate_release
;
186 if (flag
& LDP_GLOBAL_CFG_LABEL_MERGE
) {
187 global
->label_merge
= g
->label_merge
;
189 if (flag
& LDP_GLOBAL_CFG_LOOP_DETECTION_MODE
) {
190 global
->loop_detection_mode
= g
->loop_detection_mode
;
192 if (flag
& LDP_GLOBAL_CFG_TTLLESS_DOMAIN
) {
193 global
->ttl_less_domain
= g
->ttl_less_domain
;
195 if (flag
& LDP_GLOBAL_CFG_LOCAL_TCP_PORT
) {
196 global
->local_tcp_port
= g
->local_tcp_port
;
198 if (flag
& LDP_GLOBAL_CFG_LOCAL_UDP_PORT
) {
199 global
->local_udp_port
= g
->local_udp_port
;
201 if (flag
& LDP_GLOBAL_CFG_LSR_IDENTIFIER
) {
202 memcpy(&(global
->lsr_identifier
), &(g
->lsr_identifier
),
203 sizeof(mpls_inet_addr
));
206 if (flag
& LDP_GLOBAL_CFG_LSR_HANDLE
) {
207 global
->lsr_handle
= g
->lsr_handle
;
210 if (flag
& LDP_GLOBAL_CFG_ADMIN_STATE
) {
211 if (global
->admin_state
== MPLS_ADMIN_ENABLE
&& g
->admin_state
== MPLS_ADMIN_DISABLE
) {
212 ldp_global_shutdown(global
);
213 } else if (global
->admin_state
== MPLS_ADMIN_DISABLE
&& g
->admin_state
==
215 ldp_global_startup(global
);
218 if (flag
& LDP_GLOBAL_CFG_TRANS_ADDR
) {
219 memcpy(&(global
->transport_address
), &(g
->transport_address
),
220 sizeof(mpls_inet_addr
));
222 if (flag
& LDP_GLOBAL_CFG_KEEPALIVE_TIMER
) {
223 if (g
->keepalive_timer
== 0) {
224 global
->keepalive_timer
= LDP_ENTITY_DEF_KEEPALIVE_TIMER
;
226 global
->keepalive_timer
= g
->keepalive_timer
;
229 if (flag
& LDP_GLOBAL_CFG_KEEPALIVE_INTERVAL
) {
230 if (g
->keepalive_interval
== 0) {
231 global
->keepalive_interval
= LDP_ENTITY_DEF_KEEPALIVE_INTERVAL
;
233 global
->keepalive_interval
= g
->keepalive_interval
;
236 if (flag
& LDP_GLOBAL_CFG_HELLOTIME_TIMER
) {
237 if (g
->hellotime_timer
== 0) {
238 global
->hellotime_timer
= LDP_ENTITY_DEF_HELLOTIME_TIMER
;
240 global
->hellotime_timer
= g
->hellotime_timer
;
243 if (flag
& LDP_GLOBAL_CFG_HELLOTIME_INTERVAL
) {
244 if (g
->hellotime_interval
== 0) {
245 global
->hellotime_interval
= LDP_ENTITY_DEF_HELLOTIME_INTERVAL
;
247 global
->hellotime_interval
= g
->hellotime_interval
;
251 if (flag
& LDP_GLOBAL_CFG_LSR_HANDLE
) {
252 global
->lsr_handle
= g
->lsr_handle
;
255 global
->configuration_sequence_number
++;
257 retval
= MPLS_SUCCESS
;
259 ldp_cfg_global_set_end
:
261 mpls_lock_release(global
->global_lock
); /* UNLOCK */
263 LDP_EXIT(global
->user_data
, "ldp_cfg_global_set");
268 /******************* ENTITY **********************/
270 /* must set ldp_entity->index */
271 mpls_return_enum
ldp_cfg_entity_get(mpls_cfg_handle handle
, ldp_entity
* e
,
274 ldp_global
*global
= (ldp_global
*) handle
;
275 ldp_entity
*entity
= NULL
;
276 mpls_return_enum retval
= MPLS_FAILURE
;
278 MPLS_ASSERT(global
!=NULL
&& e
!= NULL
);
280 LDP_ENTER(global
->user_data
, "ldp_cfg_entity_get");
282 mpls_lock_get(global
->global_lock
); /* LOCK */
284 if (ldp_global_find_entity_index(global
, e
->index
, &entity
) != MPLS_SUCCESS
)
285 goto ldp_cfg_entity_get_end
;
287 if (flag
& LDP_ENTITY_CFG_ADMIN_STATE
) {
288 e
->admin_state
= entity
->admin_state
;
290 if (flag
& LDP_ENTITY_CFG_TRANS_ADDR
) {
291 e
->transport_address
= entity
->transport_address
;
293 if (flag
& LDP_ENTITY_CFG_PROTO_VER
) {
294 e
->protocol_version
= entity
->protocol_version
;
296 if (flag
& LDP_ENTITY_CFG_REMOTE_TCP
) {
297 e
->remote_tcp_port
= entity
->remote_tcp_port
;
299 if (flag
& LDP_ENTITY_CFG_REMOTE_UDP
) {
300 e
->remote_udp_port
= entity
->remote_udp_port
;
302 if (flag
& LDP_ENTITY_CFG_MAX_PDU
) {
303 e
->max_pdu
= entity
->max_pdu
;
305 if (flag
& LDP_ENTITY_CFG_KEEPALIVE_TIMER
) {
306 e
->keepalive_timer
= entity
->keepalive_timer
;
308 if (flag
& LDP_ENTITY_CFG_KEEPALIVE_INTERVAL
) {
309 e
->keepalive_interval
= entity
->keepalive_interval
;
311 if (flag
& LDP_ENTITY_CFG_HELLOTIME_TIMER
) {
312 e
->hellotime_timer
= entity
->hellotime_timer
;
314 if (flag
& LDP_ENTITY_CFG_HELLOTIME_INTERVAL
) {
315 e
->hellotime_interval
= entity
->hellotime_interval
;
317 if (flag
& LDP_ENTITY_CFG_SESSION_SETUP_COUNT
) {
318 e
->session_setup_count
= entity
->session_setup_count
;
320 if (flag
& LDP_ENTITY_CFG_SESSION_BACKOFF_TIMER
) {
321 e
->session_backoff_timer
= entity
->session_backoff_timer
;
323 if (flag
& LDP_ENTITY_CFG_DISTRIBUTION_MODE
) {
324 e
->label_distribution_mode
= entity
->label_distribution_mode
;
326 if (flag
& LDP_ENTITY_CFG_PATHVECTOR_LIMIT
) {
327 e
->path_vector_limit
= entity
->path_vector_limit
;
329 if (flag
& LDP_ENTITY_CFG_HOPCOUNT_LIMIT
) {
330 e
->hop_count_limit
= entity
->hop_count_limit
;
332 if (flag
& LDP_ENTITY_CFG_REQUEST_COUNT
) {
333 e
->label_request_count
= entity
->label_request_count
;
335 if (flag
& LDP_ENTITY_CFG_REQUEST_TIMER
) {
336 e
->label_request_timer
= entity
->label_request_timer
;
338 if (flag
& LDP_ENTITY_CFG_TYPE
) {
339 e
->entity_type
= entity
->entity_type
;
341 if (flag
& LDP_ENTITY_CFG_SUB_INDEX
) {
342 e
->sub_index
= entity
->sub_index
;
344 if (flag
& LDP_ENTITY_CFG_MESG_TX
) {
345 e
->mesg_tx
= entity
->mesg_tx
;
347 if (flag
& LDP_ENTITY_CFG_MESG_RX
) {
348 e
->mesg_rx
= entity
->mesg_rx
;
350 if (flag
& LDP_ENTITY_CFG_ADJ_COUNT
) {
351 e
->adj_count
= entity
->adj_root
.count
;
353 if (flag
& LDP_ENTITY_CFG_ADJ_INDEX
) {
354 ldp_adj
*a
= MPLS_LIST_HEAD(&entity
->adj_root
);
355 e
->adj_index
= a
? a
->index
: 0;
357 if (flag
& LDP_ENTITY_CFG_INHERIT_FLAG
) {
358 e
->inherit_flag
= entity
->inherit_flag
;
360 retval
= MPLS_SUCCESS
;
362 ldp_cfg_entity_get_end
:
364 mpls_lock_release(global
->global_lock
); /* UNLOCK */
366 LDP_EXIT(global
->user_data
, "ldp_cfg_entity_get");
371 mpls_return_enum
ldp_cfg_entity_getnext(mpls_cfg_handle handle
, ldp_entity
* e
,
374 ldp_global
*g
= (ldp_global
*) handle
;
375 ldp_entity
*entity
= NULL
;
376 mpls_return_enum r
= MPLS_FAILURE
;
377 mpls_bool done
= MPLS_BOOL_FALSE
;
380 LDP_ENTER(g
->user_data
, "ldp_cfg_entity_getnext");
385 index
= e
->index
+ 1;
388 mpls_lock_get(g
->global_lock
); /* LOCK */
389 while (done
== MPLS_BOOL_FALSE
) {
390 switch ((r
= ldp_global_find_entity_index(g
, index
, &entity
))) {
392 case MPLS_END_OF_LIST
:
393 done
= MPLS_BOOL_TRUE
;
402 mpls_lock_release(g
->global_lock
); /* UNLOCK */
404 if (r
== MPLS_SUCCESS
) {
405 e
->index
= entity
->index
;
406 LDP_EXIT(g
->user_data
, "ldp_cfg_entity_getnext");
407 return ldp_cfg_entity_get(g
, e
, flag
);
409 LDP_EXIT(g
->user_data
, "ldp_cfg_entity_getnext");
413 mpls_return_enum
ldp_cfg_entity_test(mpls_cfg_handle handle
, ldp_entity
* e
,
416 ldp_global
*global
= (ldp_global
*) handle
;
417 ldp_entity
*entity
= NULL
;
418 mpls_return_enum retval
= MPLS_FAILURE
;
420 MPLS_ASSERT(global
!=NULL
);
422 LDP_ENTER(global
->user_data
, "ldp_cfg_entity_test");
424 mpls_lock_get(global
->global_lock
); /* LOCK */
426 if (!(flag
& LDP_CFG_ADD
)) {
428 goto ldp_cfg_entity_test_end
;
430 ldp_global_find_entity_index(global
, e
->index
, &entity
);
432 retval
= MPLS_SUCCESS
;
433 goto ldp_cfg_entity_test_end
;
436 if (entity
== NULL
) {
437 goto ldp_cfg_entity_test_end
;
440 if ((ldp_entity_is_active(entity
) == MPLS_BOOL_TRUE
) &&
441 (flag
& LDP_ENTITY_CFG_WHEN_DOWN
)) {
442 goto ldp_cfg_entity_test_end
;
445 retval
= MPLS_SUCCESS
;
447 ldp_cfg_entity_test_end
:
448 mpls_lock_release(global
->global_lock
); /* UNLOCK */
450 LDP_EXIT(global
->user_data
, "ldp_cfg_entity_test");
455 /* must set ldp_entity->index if not an add */
456 mpls_return_enum
ldp_cfg_entity_set(mpls_cfg_handle handle
, ldp_entity
* e
,
459 ldp_global
*global
= (ldp_global
*) handle
;
460 ldp_entity
*entity
= NULL
;
461 mpls_return_enum retval
= MPLS_FAILURE
;
463 MPLS_ASSERT(global
!=NULL
&& e
!= NULL
);
465 LDP_ENTER(global
->user_data
, "ldp_cfg_entity_set");
467 mpls_lock_get(global
->global_lock
); /* LOCK */
469 if (flag
& LDP_CFG_ADD
) {
470 entity
= ldp_entity_create();
471 _ldp_global_add_entity(global
, entity
);
473 e
->index
= entity
->index
;
475 ldp_global_find_entity_index(global
, e
->index
, &entity
);
478 if (entity
== NULL
) {
479 LDP_PRINT(global
->user_data
, "ldp_cfg_entity_set: can't find entity\n");
480 goto ldp_cfg_entity_set_end
;
483 if ((ldp_entity_is_active(entity
) == MPLS_BOOL_TRUE
) &&
484 (flag
& LDP_ENTITY_CFG_WHEN_DOWN
)) {
485 LDP_PRINT(global
->user_data
, "ldp_cfg_entity_set: entity is active\n");
486 goto ldp_cfg_entity_set_end
;
489 if (flag
& LDP_CFG_DEL
) {
490 switch (entity
->entity_type
) {
492 ldp_entity_del_if(global
, entity
);
495 ldp_entity_del_peer(entity
);
500 _ldp_global_del_entity(global
, entity
);
502 retval
= MPLS_SUCCESS
;
503 goto ldp_cfg_entity_set_end
;
506 if (flag
& LDP_ENTITY_CFG_SUB_INDEX
) {
507 if (entity
->sub_index
!= 0) {
508 /* unlink the old sub object */
509 switch (entity
->entity_type
) {
511 ldp_entity_del_if(global
, entity
);
514 ldp_entity_del_peer(entity
);
521 /* link the new sub object */
522 switch (e
->entity_type
) {
526 if (ldp_global_find_if_index(global
, e
->sub_index
,
527 &iff
) != MPLS_SUCCESS
) {
528 LDP_PRINT(global
->user_data
,
529 "ldp_cfg_entity_set: no such interface\n");
531 if (flag
& LDP_CFG_ADD
) {
532 _ldp_global_del_entity(global
, entity
);
534 goto ldp_cfg_entity_set_end
;
536 ldp_entity_add_if(entity
, iff
);
541 ldp_peer
*peer
= NULL
;
543 if (ldp_global_find_peer_index(global
, e
->sub_index
, &peer
) !=
545 LDP_PRINT(global
->user_data
, "ldp_cfg_entity_set: no such peer\n");
547 if (flag
& LDP_CFG_ADD
) {
548 _ldp_global_del_entity(global
, entity
);
550 goto ldp_cfg_entity_set_end
;
552 ldp_entity_add_peer(entity
, peer
);
560 if (flag
& LDP_ENTITY_CFG_TRANS_ADDR
) {
561 if (e
->transport_address
.type
== MPLS_FAMILY_NONE
) {
562 entity
->inherit_flag
|= LDP_ENTITY_CFG_TRANS_ADDR
;
564 entity
->inherit_flag
&= ~LDP_ENTITY_CFG_TRANS_ADDR
;
566 memcpy(&entity
->transport_address
, &e
->transport_address
,
567 sizeof(mpls_inet_addr
));;
569 if (flag
& LDP_ENTITY_CFG_PROTO_VER
) {
570 entity
->protocol_version
= e
->protocol_version
;
572 if (flag
& LDP_ENTITY_CFG_REMOTE_TCP
) {
573 entity
->remote_tcp_port
= e
->remote_tcp_port
;
575 if (flag
& LDP_ENTITY_CFG_REMOTE_UDP
) {
576 entity
->remote_udp_port
= e
->remote_udp_port
;
578 if (flag
& LDP_ENTITY_CFG_MAX_PDU
) {
579 entity
->max_pdu
= e
->max_pdu
;
581 if (flag
& LDP_ENTITY_CFG_KEEPALIVE_TIMER
) {
582 if (e
->transport_address
.type
== MPLS_FAMILY_NONE
) {
583 entity
->inherit_flag
|= LDP_ENTITY_CFG_KEEPALIVE_TIMER
;
585 entity
->inherit_flag
&= ~LDP_ENTITY_CFG_KEEPALIVE_TIMER
;
587 entity
->keepalive_timer
= e
->keepalive_timer
;
589 if (flag
& LDP_ENTITY_CFG_KEEPALIVE_INTERVAL
) {
590 if (e
->transport_address
.type
== MPLS_FAMILY_NONE
) {
591 entity
->inherit_flag
|= LDP_ENTITY_CFG_KEEPALIVE_INTERVAL
;
593 entity
->inherit_flag
&= ~LDP_ENTITY_CFG_KEEPALIVE_INTERVAL
;
595 entity
->keepalive_interval
= e
->keepalive_interval
;
597 if (flag
& LDP_ENTITY_CFG_HELLOTIME_TIMER
) {
598 if (e
->transport_address
.type
== MPLS_FAMILY_NONE
) {
599 entity
->inherit_flag
|= LDP_ENTITY_CFG_HELLOTIME_TIMER
;
601 entity
->inherit_flag
&= ~LDP_ENTITY_CFG_HELLOTIME_TIMER
;
603 entity
->hellotime_timer
= e
->hellotime_timer
;
605 if (flag
& LDP_ENTITY_CFG_HELLOTIME_INTERVAL
) {
606 if (e
->transport_address
.type
== MPLS_FAMILY_NONE
) {
607 entity
->inherit_flag
|= LDP_ENTITY_CFG_HELLOTIME_INTERVAL
;
609 entity
->inherit_flag
&= ~LDP_ENTITY_CFG_HELLOTIME_INTERVAL
;
611 entity
->hellotime_interval
= e
->hellotime_interval
;
613 if (flag
& LDP_ENTITY_CFG_SESSION_SETUP_COUNT
) {
614 entity
->session_setup_count
= e
->session_setup_count
;
616 if (flag
& LDP_ENTITY_CFG_SESSION_BACKOFF_TIMER
) {
617 entity
->session_backoff_timer
= e
->session_backoff_timer
;
619 if (flag
& LDP_ENTITY_CFG_DISTRIBUTION_MODE
) {
620 entity
->label_distribution_mode
= e
->label_distribution_mode
;
622 if (flag
& LDP_ENTITY_CFG_PATHVECTOR_LIMIT
) {
623 entity
->path_vector_limit
= e
->path_vector_limit
;
625 if (flag
& LDP_ENTITY_CFG_HOPCOUNT_LIMIT
) {
626 entity
->hop_count_limit
= e
->hop_count_limit
;
628 if (flag
& LDP_ENTITY_CFG_REQUEST_COUNT
) {
629 entity
->label_request_count
= e
->label_request_count
;
631 if (flag
& LDP_ENTITY_CFG_REQUEST_TIMER
) {
632 entity
->label_request_timer
= e
->label_request_timer
;
634 if (flag
& LDP_ENTITY_CFG_TYPE
) {
635 entity
->entity_type
= e
->entity_type
;
637 if (flag
& LDP_ENTITY_CFG_ADMIN_STATE
) {
638 if (ldp_entity_is_active(entity
) == MPLS_BOOL_TRUE
&&
639 e
->admin_state
== MPLS_ADMIN_DISABLE
) {
640 if (ldp_entity_shutdown(global
, entity
, 0) == MPLS_FAILURE
) {
641 goto ldp_cfg_entity_set_end
;
643 } else if (ldp_entity_is_active(entity
) == MPLS_BOOL_FALSE
&&
644 e
->admin_state
== MPLS_ADMIN_ENABLE
&& ldp_entity_is_ready(entity
) == MPLS_BOOL_TRUE
) {
645 if (ldp_entity_startup(global
, entity
) == MPLS_FAILURE
) {
646 goto ldp_cfg_entity_set_end
;
649 LDP_PRINT(global
->user_data
, "ldp_cfg_entity_set: entity not ready\n");
651 goto ldp_cfg_entity_set_end
;
654 if (flag
& LDP_ENTITY_CFG_INHERIT_FLAG
) {
655 entity
->inherit_flag
= e
->inherit_flag
;
657 global
->configuration_sequence_number
++;
659 retval
= MPLS_SUCCESS
;
661 ldp_cfg_entity_set_end
:
662 mpls_lock_release(global
->global_lock
); /* UNLOCK */
664 LDP_EXIT(global
->user_data
, "ldp_cfg_entity_set");
669 mpls_return_enum
ldp_cfg_entity_adj_getnext(mpls_cfg_handle handle
,
672 ldp_global
*g
= (ldp_global
*) handle
;
673 mpls_bool this_one
= MPLS_BOOL_FALSE
;
674 mpls_return_enum r
= MPLS_FAILURE
;
675 ldp_adj
*adj_next
= NULL
;
677 ldp_entity
*entity
= NULL
;
679 LDP_ENTER(g
->user_data
, "ldp_cfg_entity_adj_getnext");
681 /* if an adj_index of zero is sent, get the index of
682 * the first adj in the list
685 this_one
= MPLS_BOOL_TRUE
;
688 mpls_lock_get(g
->global_lock
); /* LOCK */
690 if (ldp_global_find_entity_index(g
, e
->index
, &entity
) == MPLS_SUCCESS
) {
691 adj
= MPLS_LIST_HEAD(&entity
->adj_root
);
693 if (this_one
== MPLS_BOOL_TRUE
) {
698 /* since the entities are sort in the list ... */
699 if (adj
->index
> e
->adj_index
) {
701 } else if (adj
->index
== e
->adj_index
) {
702 this_one
= MPLS_BOOL_TRUE
;
704 adj
= MPLS_LIST_NEXT(&entity
->adj_root
, adj
, _entity
);
707 mpls_lock_release(g
->global_lock
); /* UNLOCK */
710 e
->adj_index
= adj_next
->index
;
714 LDP_EXIT(g
->user_data
, "ldp_cfg_entity_adj_getnext");
718 /******************* INTERFACE **********************/
720 mpls_return_enum
ldp_cfg_if_get(mpls_cfg_handle handle
, ldp_if
* i
, uint32_t flag
)
722 ldp_global
*global
= (ldp_global
*) handle
;
724 mpls_return_enum retval
= MPLS_FAILURE
;
726 MPLS_ASSERT(global
!=NULL
&& i
!= NULL
);
728 LDP_ENTER(global
->user_data
, "ldp_cfg_if_get");
730 mpls_lock_get(global
->global_lock
); /* LOCK */
732 if (flag
& LDP_IF_CFG_BY_INDEX
) {
733 ldp_global_find_if_index(global
, i
->index
, &iff
);
735 iff
= ldp_global_find_if_handle(global
, i
->handle
);
738 goto ldp_cfg_if_get_end
;
740 if (flag
& LDP_IF_CFG_LABEL_SPACE
) {
741 i
->label_space
= iff
->label_space
;
743 if (flag
& LDP_IF_CFG_ENTITY_INDEX
) {
744 i
->entity_index
= iff
->entity
? iff
->entity
->index
: 0;
746 if (flag
& LDP_IF_CFG_OPER_STATE
) {
747 i
->oper_state
= iff
->oper_state
;
749 if (flag
& LDP_IF_CFG_HANDLE
) {
750 memcpy(&i
->handle
, &iff
->handle
, sizeof(mpls_if_handle
));
752 retval
= MPLS_SUCCESS
;
755 mpls_lock_release(global
->global_lock
); /* UNLOCK */
757 LDP_EXIT(global
->user_data
, "ldp_cfg_if_get");
762 mpls_return_enum
ldp_cfg_if_getnext(mpls_cfg_handle handle
, ldp_if
* i
,
765 ldp_global
*g
= (ldp_global
*) handle
;
767 mpls_return_enum r
= MPLS_FAILURE
;
768 mpls_bool done
= MPLS_BOOL_FALSE
;
771 LDP_ENTER(g
->user_data
, "ldp_cfg_if_getnext");
776 index
= i
->index
+ 1;
779 mpls_lock_get(g
->global_lock
); /* LOCK */
780 while (done
== MPLS_BOOL_FALSE
) {
781 switch ((r
= ldp_global_find_if_index(g
, index
, &iff
))) {
783 case MPLS_END_OF_LIST
:
784 done
= MPLS_BOOL_TRUE
;
793 mpls_lock_release(g
->global_lock
); /* UNLOCK */
795 if (r
== MPLS_SUCCESS
) {
796 i
->index
= iff
->index
;
797 LDP_EXIT(g
->user_data
, "ldp_cfg_if_getnext");
798 return ldp_cfg_if_get(g
, i
, flag
);
800 LDP_EXIT(g
->user_data
, "ldp_cfg_if_getnext");
804 mpls_return_enum
ldp_cfg_if_test(mpls_cfg_handle handle
, ldp_if
* i
,
807 ldp_global
*global
= (ldp_global
*) handle
;
809 mpls_return_enum retval
= MPLS_FAILURE
;
811 MPLS_ASSERT(global
!=NULL
&& i
!= NULL
);
813 LDP_ENTER(global
->user_data
, "ldp_cfg_if_test");
815 mpls_lock_get(global
->global_lock
); /* LOCK */
817 if (!(flag
& LDP_CFG_ADD
)) {
818 ldp_global_find_if_index(global
, i
->index
, &iff
);
820 retval
= MPLS_SUCCESS
;
821 goto ldp_cfg_if_test_end
;
824 if ((!iff
) || ((ldp_if_is_active(iff
) == MPLS_BOOL_TRUE
) &&
825 (flag
& LDP_IF_CFG_WHEN_DOWN
))) {
826 goto ldp_cfg_if_test_end
;
829 if (flag
& LDP_CFG_DEL
) {
830 if (iff
->entity
!= NULL
) {
831 goto ldp_cfg_if_test_end
;
834 retval
= MPLS_SUCCESS
;
837 mpls_lock_release(global
->global_lock
); /* UNLOCK */
839 LDP_EXIT(global
->user_data
, "ldp_cfg_if_test");
844 mpls_return_enum
ldp_cfg_if_set(mpls_cfg_handle handle
, ldp_if
* i
, uint32_t flag
)
846 ldp_global
*global
= (ldp_global
*)handle
;
850 mpls_return_enum retval
= MPLS_FAILURE
;
852 MPLS_ASSERT(global
!=NULL
&& i
!= NULL
);
854 LDP_ENTER(global
->user_data
, "ldp_cfg_if_set");
856 mpls_lock_get(global
->global_lock
); /* LOCK */
858 if (flag
& LDP_CFG_ADD
) {
859 /* duplicate interface handles are not allowed */
860 /* ADDs require a valid interface handle */
861 if ((iff
= ldp_global_find_if_handle(global
, i
->handle
)) != NULL
) {
862 LDP_PRINT(global
->user_data
, "Duplicate interface exists");
863 goto ldp_cfg_if_set_end
;
865 if (mpls_if_handle_verify(global
->ifmgr_handle
, i
->handle
) ==
867 LDP_PRINT(global
->user_data
, "Invalid interface handle");
868 goto ldp_cfg_if_set_end
;
870 if ((iff
= ldp_if_create(global
)) == NULL
) {
871 LDP_PRINT(global
->user_data
, "Failure creating interface");
872 goto ldp_cfg_if_set_end
;
875 /* copy the handle from the user */
876 iff
->handle
= i
->handle
;
878 /* search for addrs and nexthops that are waiting for this interface */
879 ap
= MPLS_LIST_HEAD(&global
->addr
);
881 if (ap
->if_handle
== iff
->handle
&& (!MPLS_LIST_IN_LIST(ap
, _if
))) {
882 ldp_if_add_addr(iff
, ap
);
884 ap
= MPLS_LIST_NEXT(&global
->addr
, ap
, _global
);
887 np
= MPLS_LIST_HEAD(&global
->nexthop
);
889 if ((np
->info
.type
& MPLS_NH_IF
) &&
890 (np
->info
.if_handle
== iff
->handle
) && (!MPLS_LIST_IN_LIST(np
, _if
))) {
891 ldp_if_add_nexthop(iff
, np
);
893 np
= MPLS_LIST_NEXT(&global
->nexthop
, np
, _global
);
896 /* send the newly created index back to the user */
897 i
->index
= iff
->index
;
898 MPLS_REFCNT_HOLD(iff
);
901 if (flag
& LDP_IF_CFG_BY_INDEX
) {
902 ldp_global_find_if_index(global
, i
->index
, &iff
);
904 iff
= ldp_global_find_if_handle(global
, i
->handle
);
909 * if we can't find this interface or if the interface is active and
910 * we are trying to change propertises that can not be changed on a
913 if ((!iff
) || ((ldp_if_is_active(iff
) == MPLS_BOOL_TRUE
) &&
914 (flag
& LDP_IF_CFG_WHEN_DOWN
))) {
915 goto ldp_cfg_if_set_end
;
918 if (flag
& LDP_IF_CFG_LABEL_SPACE
) {
919 iff
->label_space
= i
->label_space
;
922 if (flag
& LDP_CFG_DEL
) {
924 * if this interface is still attached to a entity that it is not ready
927 if (iff
->entity
!= NULL
) {
928 goto ldp_cfg_if_set_end
;
931 np
= MPLS_LIST_HEAD(&iff
->nh_root
);
932 while ((np
= MPLS_LIST_HEAD(&iff
->nh_root
))) {
933 ldp_if_del_nexthop(global
, iff
, np
);
936 ap
= MPLS_LIST_HEAD(&iff
->addr_root
);
937 while ((ap
= MPLS_LIST_HEAD(&iff
->addr_root
))) {
938 ldp_if_del_addr(global
, iff
, ap
);
941 MPLS_REFCNT_RELEASE2(global
, iff
, ldp_if_delete
);
944 global
->configuration_sequence_number
++;
946 retval
= MPLS_SUCCESS
;
949 mpls_lock_release(global
->global_lock
); /* UNLOCK */
951 LDP_EXIT(global
->user_data
, "ldp_cfg_if_set");
956 /******************* ATTR **********************/
958 mpls_return_enum
ldp_cfg_attr_get(mpls_cfg_handle handle
, ldp_attr
* a
,
961 ldp_global
*global
= (ldp_global
*) handle
;
962 ldp_attr
*attr
= NULL
;
963 mpls_return_enum retval
= MPLS_FAILURE
;
965 MPLS_ASSERT(global
!=NULL
&& a
!= NULL
);
967 LDP_ENTER(global
->user_data
, "ldp_cfg_attr_get");
969 mpls_lock_get(global
->global_lock
); /* LOCK */
971 if (ldp_global_find_attr_index(global
, a
->index
, &attr
) != MPLS_SUCCESS
)
972 goto ldp_cfg_attr_get_end
;
974 if (flag
& LDP_ATTR_CFG_STATE
) {
975 a
->state
= attr
->state
;
977 if (flag
& LDP_ATTR_CFG_FEC
) {
978 ldp_attr2ldp_attr(attr
, a
, LDP_ATTR_FEC
);
980 if (flag
& LDP_ATTR_CFG_LABEL
) {
981 ldp_attr2ldp_attr(attr
, a
, LDP_ATTR_LABEL
);
983 if (flag
& LDP_ATTR_CFG_HOP_COUNT
) {
984 ldp_attr2ldp_attr(attr
, a
, LDP_ATTR_HOPCOUNT
);
986 if (flag
& LDP_ATTR_CFG_PATH
) {
987 ldp_attr2ldp_attr(attr
, a
, LDP_ATTR_PATH
);
989 if (flag
& LDP_ATTR_CFG_SESSION_INDEX
) {
990 a
->session_index
= (attr
->session
) ? (attr
->session
->index
) : 0;
992 if (flag
& LDP_ATTR_CFG_INLABEL_INDEX
) {
993 a
->inlabel_index
= (attr
->inlabel
) ? (attr
->inlabel
->index
) : 0;
995 if (flag
& LDP_ATTR_CFG_OUTLABEL_INDEX
) {
996 a
->outlabel_index
= (attr
->outlabel
) ? (attr
->outlabel
->index
) : 0;
998 if (flag
& LDP_ATTR_CFG_INGRESS
) {
999 a
->ingress
= attr
->ingress
;
1001 retval
= MPLS_SUCCESS
;
1003 ldp_cfg_attr_get_end
:
1004 mpls_lock_release(global
->global_lock
); /* UNLOCK */
1006 LDP_EXIT(global
->user_data
, "ldp_cfg_attr_get");
1011 mpls_return_enum
ldp_cfg_attr_getnext(mpls_cfg_handle handle
, ldp_attr
* a
,
1014 ldp_global
*g
= (ldp_global
*) handle
;
1015 ldp_attr
*attr
= NULL
;
1016 mpls_return_enum r
= MPLS_FAILURE
;
1017 mpls_bool done
= MPLS_BOOL_FALSE
;
1020 LDP_ENTER(g
->user_data
, "ldp_cfg_attr_getnext");
1022 if (a
->index
== 0) {
1025 index
= a
->index
+ 1;
1028 mpls_lock_get(g
->global_lock
); /* LOCK */
1029 while (done
== MPLS_BOOL_FALSE
) {
1030 switch ((r
= ldp_global_find_attr_index(g
, index
, &attr
))) {
1032 case MPLS_END_OF_LIST
:
1033 done
= MPLS_BOOL_TRUE
;
1042 mpls_lock_release(g
->global_lock
); /* UNLOCK */
1044 if (r
== MPLS_SUCCESS
) {
1045 a
->index
= attr
->index
;
1046 LDP_EXIT(g
->user_data
, "ldp_cfg_attr_getnext");
1047 return ldp_cfg_attr_get(g
, a
, flag
);
1049 LDP_EXIT(g
->user_data
, "ldp_cfg_attr_getnext");
1053 /******************* PEER **********************/
1055 mpls_return_enum
ldp_cfg_peer_get(mpls_cfg_handle handle
, ldp_peer
* p
,
1058 ldp_global
*global
= (ldp_global
*) handle
;
1059 ldp_peer
*peer
= NULL
;
1060 mpls_return_enum retval
= MPLS_FAILURE
;
1062 MPLS_ASSERT(global
!=NULL
&& p
!= NULL
);
1064 LDP_ENTER(global
->user_data
, "ldp_cfg_peer_get");
1066 mpls_lock_get(global
->global_lock
); /* LOCK */
1068 if (ldp_global_find_peer_index(global
, p
->index
, &peer
) != MPLS_SUCCESS
)
1069 goto ldp_cfg_peer_get_end
;
1071 if (flag
& LDP_PEER_CFG_LABEL_SPACE
) {
1072 p
->label_space
= peer
->label_space
;
1074 if (flag
& LDP_PEER_CFG_TARGET_ROLE
) {
1075 p
->target_role
= peer
->target_role
;
1077 if (flag
& LDP_PEER_CFG_DEST_ADDR
) {
1078 memcpy(&p
->dest
.addr
, &peer
->dest
.addr
, sizeof(mpls_inet_addr
));
1080 if (flag
& LDP_PEER_CFG_ENTITY_INDEX
) {
1081 p
->entity_index
= peer
->entity
->index
;
1083 if (flag
& LDP_PEER_CFG_OPER_STATE
) {
1084 p
->oper_state
= peer
->oper_state
;
1086 if (flag
& LDP_PEER_CFG_PEER_NAME
) {
1087 strncpy(p
->peer_name
, peer
->peer_name
, MPLS_MAX_IF_NAME
);
1089 retval
= MPLS_SUCCESS
;
1091 ldp_cfg_peer_get_end
:
1092 mpls_lock_release(global
->global_lock
); /* UNLOCK */
1094 LDP_EXIT(global
->user_data
, "ldp_cfg_peer_get");
1099 mpls_return_enum
ldp_cfg_peer_getnext(mpls_cfg_handle handle
, ldp_peer
* p
,
1102 ldp_global
*g
= (ldp_global
*) handle
;
1103 ldp_peer
*peer
= NULL
;
1104 mpls_return_enum r
= MPLS_FAILURE
;
1105 mpls_bool done
= MPLS_BOOL_FALSE
;
1108 LDP_ENTER(g
->user_data
, "ldp_cfg_peer_getnext");
1110 if (p
->index
== 0) {
1113 index
= p
->index
+ 1;
1116 mpls_lock_get(g
->global_lock
); /* LOCK */
1117 while (done
== MPLS_BOOL_FALSE
) {
1118 switch ((r
= ldp_global_find_peer_index(g
, index
, &peer
))) {
1120 case MPLS_END_OF_LIST
:
1121 done
= MPLS_BOOL_TRUE
;
1130 mpls_lock_release(g
->global_lock
); /* UNLOCK */
1132 if (r
== MPLS_SUCCESS
) {
1133 p
->index
= peer
->index
;
1134 LDP_EXIT(g
->user_data
, "ldp_cfg_peer_getnext");
1135 return ldp_cfg_peer_get(g
, p
, flag
);
1137 LDP_EXIT(g
->user_data
, "ldp_cfg_peer_getnext");
1141 mpls_return_enum
ldp_cfg_peer_test(mpls_cfg_handle handle
, ldp_peer
* p
,
1144 // ldp_global* g = (ldp_global*)handle;
1145 return MPLS_SUCCESS
;
1148 mpls_return_enum
ldp_cfg_peer_set(mpls_cfg_handle handle
, ldp_peer
* p
,
1151 ldp_global
*global
= (ldp_global
*) handle
;
1152 ldp_peer
*peer
= NULL
;
1153 mpls_return_enum retval
= MPLS_FAILURE
;
1155 MPLS_ASSERT(global
!=NULL
&& p
!= NULL
);
1157 LDP_ENTER(global
->user_data
, "ldp_cfg_peer_set");
1159 mpls_lock_get(global
->global_lock
); /* LOCK */
1161 if (flag
& LDP_CFG_ADD
) {
1162 if ((peer
= ldp_peer_create()) == NULL
) {
1163 goto ldp_cfg_peer_set_end
;
1165 p
->index
= peer
->index
;
1166 _ldp_global_add_peer(global
, peer
);
1168 ldp_global_find_peer_index(global
, p
->index
, &peer
);
1172 LDP_PRINT(global
->user_data
, "ldp_cfg_peer_set: no such peer\n");
1174 goto ldp_cfg_peer_set_end
;
1176 if ((ldp_peer_is_active(peer
) == MPLS_BOOL_TRUE
) && (flag
& LDP_PEER_CFG_WHEN_DOWN
)) {
1177 LDP_PRINT(global
->user_data
, "ldp_cfg_peer_set: peer is activer\n");
1179 goto ldp_cfg_peer_set_end
;
1182 if (flag
& LDP_CFG_DEL
) {
1183 if (peer
->entity
!= NULL
) {
1184 LDP_PRINT(global
->user_data
,
1185 "ldp_cfg_peer_set: not cleanup correctly is activer\n");
1187 goto ldp_cfg_peer_set_end
;
1190 _ldp_global_del_peer(global
, peer
);
1192 retval
= MPLS_SUCCESS
;
1193 goto ldp_cfg_peer_set_end
;
1195 if (flag
& LDP_PEER_CFG_LABEL_SPACE
) {
1196 peer
->label_space
= p
->label_space
;
1198 if (flag
& LDP_PEER_CFG_TARGET_ROLE
) {
1199 peer
->target_role
= p
->target_role
;
1201 if (flag
& LDP_PEER_CFG_DEST_ADDR
) {
1202 memcpy(&peer
->dest
.addr
, &p
->dest
.addr
, sizeof(mpls_inet_addr
));
1204 if (flag
& LDP_PEER_CFG_PEER_NAME
) {
1205 LDP_PRINT(global
->user_data
, "ldp_cfg_peer_set: peer_name = %s\n",
1208 strncpy(peer
->peer_name
, p
->peer_name
, MPLS_MAX_IF_NAME
);
1210 global
->configuration_sequence_number
++;
1212 retval
= MPLS_SUCCESS
;
1214 ldp_cfg_peer_set_end
:
1215 mpls_lock_release(global
->global_lock
); /* UNLOCK */
1217 LDP_EXIT(global
->user_data
, "ldp_cfg_peer_set");
1221 /******************* FEC **********************/
1223 mpls_return_enum
ldp_cfg_fec_get(mpls_cfg_handle handle
, mpls_fec
* f
,
1226 ldp_global
*global
= (ldp_global
*) handle
;
1227 ldp_fec
*fec
= NULL
;
1228 mpls_return_enum retval
= MPLS_FAILURE
;
1230 MPLS_ASSERT(global
!=NULL
&& f
!= NULL
);
1232 LDP_ENTER(global
->user_data
, "ldp_cfg_fec_get");
1234 mpls_lock_get(global
->global_lock
); /* LOCK */
1236 if (flag
& LDP_FEC_CFG_BY_INDEX
) {
1237 ldp_global_find_fec_index(global
, f
->index
, &fec
);
1239 fec
= ldp_fec_find(global
, f
);
1242 goto ldp_cfg_fec_get_end
;
1244 memcpy(f
, &fec
->info
, sizeof(mpls_fec
));
1245 f
->index
= fec
->index
;
1246 f
->is_route
= fec
->is_route
;
1247 retval
= MPLS_SUCCESS
;
1249 ldp_cfg_fec_get_end
:
1250 mpls_lock_release(global
->global_lock
); /* UNLOCK */
1252 LDP_EXIT(global
->user_data
, "ldp_cfg_fec_get");
1257 mpls_return_enum
ldp_cfg_fec_getnext(mpls_cfg_handle handle
, mpls_fec
* f
,
1260 ldp_global
*g
= (ldp_global
*) handle
;
1261 ldp_fec
*fec
= NULL
;
1262 mpls_return_enum r
= MPLS_FAILURE
;
1263 mpls_bool done
= MPLS_BOOL_FALSE
;
1266 LDP_ENTER(g
->user_data
, "ldp_cfg_fec_getnext");
1268 if (f
->index
== 0) {
1271 index
= f
->index
+ 1;
1274 mpls_lock_get(g
->global_lock
); /* LOCK */
1275 while (done
== MPLS_BOOL_FALSE
) {
1276 switch ((r
= ldp_global_find_fec_index(g
, index
, &fec
))) {
1278 case MPLS_END_OF_LIST
:
1279 done
= MPLS_BOOL_TRUE
;
1288 mpls_lock_release(g
->global_lock
); /* UNLOCK */
1290 if (r
== MPLS_SUCCESS
) {
1291 f
->index
= fec
->index
;
1292 LDP_EXIT(g
->user_data
, "ldp_cfg_fec_getnext");
1293 return ldp_cfg_fec_get(g
, f
, flag
);
1295 LDP_EXIT(g
->user_data
, "ldp_cfg_fec_getnext");
1299 mpls_return_enum
ldp_cfg_fec_test(mpls_cfg_handle handle
, mpls_fec
* f
,
1302 // ldp_global* g = (ldp_global*)handle;
1303 return MPLS_SUCCESS
;
1306 mpls_return_enum
ldp_cfg_fec_set(mpls_cfg_handle handle
, mpls_fec
* f
,
1309 ldp_global
*global
= (ldp_global
*) handle
;
1310 ldp_fec
*fec
= NULL
;
1311 mpls_return_enum retval
= MPLS_FAILURE
;
1313 MPLS_ASSERT(global
!= NULL
&& f
!= NULL
);
1315 LDP_ENTER(global
->user_data
, "ldp_cfg_fec_set");
1317 mpls_lock_get(global
->global_lock
); /* LOCK */
1319 if (flag
& LDP_CFG_ADD
) {
1320 if ((fec
= ldp_fec_find(global
, f
))) {
1321 if (fec
->is_route
== MPLS_BOOL_TRUE
) {
1322 goto ldp_cfg_fec_set_end
;
1325 if ((fec
= ldp_fec_create(global
, f
)) == NULL
) {
1326 goto ldp_cfg_fec_set_end
;
1329 fec
->is_route
= MPLS_BOOL_TRUE
;
1330 MPLS_REFCNT_HOLD(fec
);
1331 f
->index
= fec
->index
;
1333 if (flag
& LDP_FEC_CFG_BY_INDEX
) {
1334 ldp_global_find_fec_index(global
, f
->index
, &fec
);
1336 fec
= ldp_fec_find(global
, f
);
1341 LDP_PRINT(global
->user_data
, "ldp_cfg_fec_set: no such fec\n");
1342 goto ldp_cfg_fec_set_end
;
1345 if (flag
& LDP_CFG_DEL
) {
1347 * we can only delete the fec if all of the nexthops have been removed
1349 if (!MPLS_LIST_EMPTY(&fec
->nh_root
)) {
1350 goto ldp_cfg_fec_set_end
;
1353 fec
->is_route
= MPLS_BOOL_FALSE
;
1356 * we hold the last refcnt, this should result in a call to
1359 MPLS_REFCNT_RELEASE2(global
, fec
, ldp_fec_delete
);
1362 retval
= MPLS_SUCCESS
;
1364 ldp_cfg_fec_set_end
:
1365 mpls_lock_release(global
->global_lock
); /* UNLOCK */
1367 LDP_EXIT(global
->user_data
, "ldp_cfg_fec_set");
1371 mpls_return_enum
ldp_cfg_fec_nexthop_get(mpls_cfg_handle handle
, mpls_fec
* f
,
1372 mpls_nexthop
*n
, uint32_t flag
)
1374 ldp_global
*global
= (ldp_global
*) handle
;
1375 ldp_fec
*fec
= NULL
;
1376 ldp_nexthop
*nh
= NULL
;
1377 mpls_return_enum retval
= MPLS_FAILURE
;
1379 MPLS_ASSERT(global
!=NULL
&& f
!= NULL
);
1381 LDP_ENTER(global
->user_data
, "ldp_cfg_fec_nexthop_get");
1383 mpls_lock_get(global
->global_lock
); /* LOCK */
1385 if (flag
& LDP_FEC_CFG_BY_INDEX
) {
1386 ldp_global_find_fec_index(global
, f
->index
, &fec
);
1388 fec
= ldp_fec_find(global
, f
);
1391 goto ldp_cfg_fec_nexthop_get_end
;
1393 if (flag
& LDP_FEC_NEXTHOP_CFG_BY_INDEX
) {
1394 ldp_fec_find_nexthop_index(fec
, n
->index
, &nh
);
1396 nh
= ldp_fec_nexthop_find(fec
, n
);
1399 goto ldp_cfg_fec_nexthop_get_end
;
1401 memcpy(n
, &nh
->info
, sizeof(mpls_nexthop
));
1402 n
->index
= nh
->index
;
1403 retval
= MPLS_SUCCESS
;
1405 ldp_cfg_fec_nexthop_get_end
:
1406 mpls_lock_release(global
->global_lock
); /* UNLOCK */
1408 LDP_EXIT(global
->user_data
, "ldp_cfg_fec_nexthop_get");
1413 mpls_return_enum
ldp_cfg_fec_nexthop_getnext(mpls_cfg_handle handle
,
1414 mpls_fec
* f
, mpls_nexthop
*n
, uint32_t flag
)
1416 ldp_global
*global
= (ldp_global
*) handle
;
1417 ldp_fec
*fec
= NULL
;
1418 ldp_nexthop
*nh
= NULL
;
1419 mpls_return_enum r
= MPLS_FAILURE
;
1420 mpls_bool done
= MPLS_BOOL_FALSE
;
1423 LDP_ENTER(global
->user_data
, "ldp_cfg_fec_nexthop_getnext");
1425 if (n
->index
== 0) {
1428 index
= n
->index
+ 1;
1431 mpls_lock_get(global
->global_lock
); /* LOCK */
1433 if (flag
& LDP_FEC_CFG_BY_INDEX
) {
1434 ldp_global_find_fec_index(global
, f
->index
, &fec
);
1436 fec
= ldp_fec_find(global
, f
);
1439 goto ldp_cfg_fec_nexthop_getnext_end
;
1441 while (done
== MPLS_BOOL_FALSE
) {
1442 switch ((r
= ldp_fec_find_nexthop_index(fec
, index
, &nh
))) {
1444 case MPLS_END_OF_LIST
:
1445 done
= MPLS_BOOL_TRUE
;
1454 mpls_lock_release(global
->global_lock
); /* UNLOCK */
1456 if (r
== MPLS_SUCCESS
) {
1457 n
->index
= nh
->index
;
1458 LDP_EXIT(global
->user_data
, "ldp_cfg_fec_nexthop_getnext");
1459 return ldp_cfg_fec_nexthop_get(global
, f
, n
, flag
);
1462 ldp_cfg_fec_nexthop_getnext_end
:
1464 LDP_EXIT(global
->user_data
, "ldp_cfg_fec_nexthop_getnext");
1468 mpls_return_enum
ldp_cfg_fec_nexthop_test(mpls_cfg_handle handle
, mpls_fec
* f
,
1469 mpls_nexthop
*n
, uint32_t flag
)
1471 // ldp_global* g = (ldp_global*)handle;
1472 return MPLS_SUCCESS
;
1475 mpls_return_enum
ldp_cfg_fec_nexthop_set(mpls_cfg_handle handle
, mpls_fec
* f
,
1476 mpls_nexthop
*n
, uint32_t flag
)
1478 ldp_global
*global
= (ldp_global
*) handle
;
1479 ldp_fec
*fec
= NULL
;
1480 ldp_nexthop
*nh
= NULL
;
1481 mpls_return_enum retval
= MPLS_FAILURE
;
1483 MPLS_ASSERT(global
!= NULL
&& f
!= NULL
&& n
!= NULL
);
1485 LDP_ENTER(global
->user_data
, "ldp_cfg_fec_nexthop_set");
1487 mpls_lock_get(global
->global_lock
); /* LOCK */
1489 if (flag
& LDP_FEC_CFG_BY_INDEX
) {
1490 ldp_global_find_fec_index(global
, f
->index
, &fec
);
1492 fec
= ldp_fec_find(global
, f
);
1495 goto ldp_cfg_fec_nexthop_set_end
;
1497 if (flag
& LDP_CFG_ADD
) {
1498 if (ldp_fec_nexthop_find(fec
, n
) ||
1499 (nh
= ldp_nexthop_create(global
, n
)) == NULL
) {
1500 goto ldp_cfg_fec_nexthop_set_end
;
1502 n
->index
= nh
->index
;
1503 ldp_fec_add_nexthop(global
, fec
, nh
);
1504 ldp_fec_process_add(global
, fec
, nh
, NULL
);
1506 if (flag
& LDP_FEC_NEXTHOP_CFG_BY_INDEX
) {
1507 ldp_fec_find_nexthop_index(fec
, n
->index
, &nh
);
1509 nh
= ldp_fec_nexthop_find(fec
, n
);
1514 LDP_PRINT(global
->user_data
, "ldp_cfg_fec_nexthop_set: no such nh\n");
1515 goto ldp_cfg_fec_nexthop_set_end
;
1518 if (flag
& LDP_CFG_DEL
) {
1519 MPLS_REFCNT_HOLD(nh
);
1520 ldp_fec_del_nexthop(global
, fec
, nh
);
1521 if (ldp_fec_process_change(global
, fec
, MPLS_LIST_HEAD(&fec
->nh_root
),
1522 nh
, NULL
) != MPLS_SUCCESS
) {
1525 MPLS_REFCNT_RELEASE2(global
, nh
, ldp_nexthop_delete
);
1528 retval
= MPLS_SUCCESS
;
1530 ldp_cfg_fec_nexthop_set_end
:
1531 mpls_lock_release(global
->global_lock
); /* UNLOCK */
1533 LDP_EXIT(global
->user_data
, "ldp_cfg_fec_nexthop_set");
1538 /******************* ADDR **********************/
1540 mpls_return_enum
ldp_cfg_addr_get(mpls_cfg_handle handle
, ldp_addr
* a
,
1543 ldp_global
*global
= (ldp_global
*) handle
;
1544 ldp_session
*session
= NULL
;
1545 ldp_nexthop
*nexthop
= NULL
;
1546 ldp_addr
*addr
= NULL
;
1547 mpls_return_enum retval
= MPLS_FAILURE
;
1549 MPLS_ASSERT(global
!=NULL
&& a
!= NULL
);
1551 LDP_ENTER(global
->user_data
, "ldp_cfg_addr_get");
1553 mpls_lock_get(global
->global_lock
); /* LOCK */
1555 ldp_global_find_addr_index(global
, a
->index
, &addr
);
1558 goto ldp_cfg_addr_get_end
;
1560 memcpy(&a
->address
, &addr
->address
, sizeof(mpls_inet_addr
));
1561 a
->index
= addr
->index
;
1563 if (addr
->session
) {
1564 a
->session_index
= addr
->session
->index
;
1567 if ((nexthop
= MPLS_LIST_HEAD(&addr
->nh_root
))) {
1568 a
->nexthop_index
= nexthop
->index
;
1572 a
->if_index
= addr
->iff
->index
;
1575 retval
= MPLS_SUCCESS
;
1577 ldp_cfg_addr_get_end
:
1578 mpls_lock_release(global
->global_lock
); /* UNLOCK */
1580 LDP_EXIT(global
->user_data
, "ldp_cfg_addr_get");
1585 mpls_return_enum
ldp_cfg_addr_getnext(mpls_cfg_handle handle
, ldp_addr
*a
,
1588 ldp_global
*global
= (ldp_global
*) handle
;
1589 ldp_addr
*addr
= NULL
;
1590 mpls_return_enum r
= MPLS_FAILURE
;
1591 mpls_bool done
= MPLS_BOOL_FALSE
;
1594 LDP_ENTER(global
->user_data
, "ldp_cfg_addr_getnext");
1596 if (a
->index
== 0) {
1599 index
= a
->index
+ 1;
1602 mpls_lock_get(global
->global_lock
); /* LOCK */
1604 while (done
== MPLS_BOOL_FALSE
) {
1605 switch ((r
= ldp_global_find_addr_index(global
, index
, &addr
))) {
1607 case MPLS_END_OF_LIST
:
1608 done
= MPLS_BOOL_TRUE
;
1617 mpls_lock_release(global
->global_lock
); /* UNLOCK */
1619 if (r
== MPLS_SUCCESS
) {
1620 a
->index
= addr
->index
;
1621 LDP_EXIT(global
->user_data
, "ldp_cfg_addr_getnext");
1622 return ldp_cfg_addr_get(global
, a
, flag
);
1625 LDP_EXIT(global
->user_data
, "ldp_cfg_addr_getnext");
1629 /******************* IF ADDR **********************/
1631 mpls_return_enum
ldp_cfg_if_addr_get(mpls_cfg_handle handle
, ldp_if
* i
,
1632 ldp_addr
* a
, uint32_t flag
)
1634 ldp_global
*global
= (ldp_global
*) handle
;
1635 ldp_addr
*addr
= NULL
;
1637 mpls_return_enum retval
= MPLS_FAILURE
;
1639 MPLS_ASSERT(global
!=NULL
&& i
!= NULL
&& a
!= NULL
);
1641 LDP_ENTER(global
->user_data
, "ldp_cfg_if_addr_get");
1643 mpls_lock_get(global
->global_lock
); /* LOCK */
1645 if (flag
& LDP_IF_CFG_BY_INDEX
) {
1646 ldp_global_find_if_index(global
, i
->index
, &iff
);
1648 iff
= ldp_global_find_if_handle(global
, i
->handle
);
1651 goto ldp_cfg_if_addr_get_end
;
1653 if (flag
& LDP_IF_ADDR_CFG_BY_INDEX
) {
1654 ldp_if_find_addr_index(iff
, a
->index
, &addr
);
1656 addr
= ldp_if_addr_find(iff
, &a
->address
);
1659 goto ldp_cfg_if_addr_get_end
;
1661 memcpy(&a
->address
, &addr
->address
, sizeof(mpls_inet_addr
));
1662 a
->index
= addr
->index
;
1664 retval
= MPLS_SUCCESS
;
1666 ldp_cfg_if_addr_get_end
:
1667 mpls_lock_release(global
->global_lock
); /* UNLOCK */
1669 LDP_EXIT(global
->user_data
, "ldp_cfg_if_addr_get");
1674 mpls_return_enum
ldp_cfg_if_addr_getnext(mpls_cfg_handle handle
,
1675 ldp_if
* i
, ldp_addr
*a
, uint32_t flag
)
1677 ldp_global
*global
= (ldp_global
*) handle
;
1679 ldp_addr
*addr
= NULL
;
1680 mpls_return_enum r
= MPLS_FAILURE
;
1681 mpls_bool done
= MPLS_BOOL_FALSE
;
1684 LDP_ENTER(global
->user_data
, "ldp_cfg_if_addr_getnext");
1686 if (a
->index
== 0) {
1689 index
= a
->index
+ 1;
1692 mpls_lock_get(global
->global_lock
); /* LOCK */
1694 if (flag
& LDP_IF_CFG_BY_INDEX
) {
1695 ldp_global_find_if_index(global
, i
->index
, &iff
);
1697 iff
= ldp_global_find_if_handle(global
, i
->handle
);
1700 goto ldp_cfg_if_addr_getnext_end
;
1702 while (done
== MPLS_BOOL_FALSE
) {
1703 switch ((r
= ldp_if_find_addr_index(iff
, index
, &addr
))) {
1705 case MPLS_END_OF_LIST
:
1706 done
= MPLS_BOOL_TRUE
;
1715 mpls_lock_release(global
->global_lock
); /* UNLOCK */
1717 if (r
== MPLS_SUCCESS
) {
1718 a
->index
= addr
->index
;
1719 LDP_EXIT(global
->user_data
, "ldp_cfg_if_addr_getnext");
1720 return ldp_cfg_if_addr_get(global
, i
, a
, flag
);
1723 ldp_cfg_if_addr_getnext_end
:
1725 LDP_EXIT(global
->user_data
, "ldp_cfg_if_addr_getnext");
1729 mpls_return_enum
ldp_cfg_if_addr_set(mpls_cfg_handle handle
, ldp_if
* i
,
1730 ldp_addr
*a
, uint32_t flag
)
1732 ldp_global
*global
= (ldp_global
*) handle
;
1734 ldp_addr
*addr
= NULL
;
1735 mpls_return_enum retval
= MPLS_FAILURE
;
1737 MPLS_ASSERT(global
!= NULL
&& i
!= NULL
&& a
!= NULL
);
1739 LDP_ENTER(global
->user_data
, "ldp_cfg_if_addr_set");
1741 mpls_lock_get(global
->global_lock
); /* LOCK */
1743 if (flag
& LDP_IF_CFG_BY_INDEX
) {
1744 ldp_global_find_if_index(global
, i
->index
, &iff
);
1746 iff
= ldp_global_find_if_handle(global
, i
->handle
);
1749 LDP_PRINT(global
->user_data
, "ldp_cfg_if_addr_set: no such iff\n");
1750 goto ldp_cfg_if_addr_set_end
;
1753 if (flag
& LDP_CFG_ADD
) {
1754 if (ldp_if_addr_find(iff
, &a
->address
) || ((addr
= ldp_addr_create(global
,
1755 &a
->address
)) == NULL
)) {
1756 goto ldp_cfg_if_addr_set_end
;
1758 a
->index
= addr
->index
;
1759 ldp_if_add_addr(iff
, addr
);
1760 ldp_addr_process_add(global
, addr
);
1762 if (flag
& LDP_IF_ADDR_CFG_BY_INDEX
) {
1763 ldp_if_find_addr_index(iff
, a
->index
, &addr
);
1765 addr
= ldp_if_addr_find(iff
, &a
->address
);
1770 LDP_PRINT(global
->user_data
, "ldp_cfg_if_addr_set: no such addr\n");
1771 goto ldp_cfg_if_addr_set_end
;
1774 if (flag
& LDP_CFG_DEL
) {
1775 ldp_addr_process_remove(global
, addr
);
1776 ldp_if_del_addr(global
, iff
, addr
);
1779 retval
= MPLS_SUCCESS
;
1781 ldp_cfg_if_addr_set_end
:
1782 mpls_lock_release(global
->global_lock
); /* UNLOCK */
1784 LDP_EXIT(global
->user_data
, "ldp_cfg_if_addr_set");
1789 /******************* ADJACENCY **********************/
1791 mpls_return_enum
ldp_cfg_adj_get(mpls_cfg_handle handle
, ldp_adj
* a
,
1794 ldp_global
*global
= (ldp_global
*) handle
;
1795 ldp_adj
*adj
= NULL
;
1796 mpls_return_enum retval
= MPLS_FAILURE
;
1798 MPLS_ASSERT(global
!= NULL
&& a
!= NULL
);
1800 LDP_ENTER(global
->user_data
, "ldp_cfg_adj_get");
1802 mpls_lock_get(global
->global_lock
); /* LOCK */
1804 if (ldp_global_find_adj_index(global
, a
->index
, &adj
) != MPLS_SUCCESS
)
1805 goto ldp_cfg_adj_get_end
;
1807 if (flag
& LDP_ADJ_CFG_REMOTE_TRADDR
) {
1808 memcpy(&a
->remote_transport_address
, &adj
->remote_transport_address
,
1809 sizeof(mpls_inet_addr
));
1811 if (flag
& LDP_ADJ_CFG_REMOTE_SRCADDR
) {
1812 memcpy(&a
->remote_source_address
, &adj
->remote_source_address
,
1813 sizeof(mpls_inet_addr
));
1815 if (flag
& LDP_ADJ_CFG_REMOTE_LSRADDR
) {
1816 memcpy(&a
->remote_lsr_address
, &adj
->remote_lsr_address
,
1817 sizeof(mpls_inet_addr
));
1819 if (flag
& LDP_ADJ_CFG_REMOTE_CSN
) {
1820 a
->remote_csn
= adj
->remote_csn
;
1822 if (flag
& LDP_ADJ_CFG_REMOTE_LABELSPACE
) {
1823 a
->remote_label_space
= adj
->remote_label_space
;
1825 if (flag
& LDP_ADJ_CFG_REMOTE_HELLOTIME
) {
1826 a
->remote_hellotime
= adj
->remote_hellotime
;
1828 if (flag
& LDP_ADJ_CFG_ENTITY_INDEX
) {
1829 a
->entity_index
= adj
->entity
? adj
->entity
->index
: 0;
1831 if (flag
& LDP_ADJ_CFG_REMOTE_SESSION_INDEX
) {
1832 a
->session_index
= (adj
->session
) ? (adj
->session
->index
) : 0;
1834 if (flag
& LDP_ADJ_CFG_ROLE
) {
1835 a
->role
= adj
->role
;
1837 retval
= MPLS_SUCCESS
;
1839 ldp_cfg_adj_get_end
:
1841 mpls_lock_release(global
->global_lock
); /* UNLOCK */
1843 LDP_EXIT(global
->user_data
, "ldp_cfg_adj_get");
1848 mpls_return_enum
ldp_cfg_adj_getnext(mpls_cfg_handle handle
, ldp_adj
* a
,
1851 ldp_global
*g
= (ldp_global
*) handle
;
1852 ldp_adj
*adj
= NULL
;
1853 mpls_return_enum r
= MPLS_FAILURE
;
1854 mpls_bool done
= MPLS_BOOL_FALSE
;
1857 LDP_ENTER(g
->user_data
, "ldp_cfg_adj_getnext");
1859 if (a
->index
== 0) {
1862 index
= a
->index
+ 1;
1865 mpls_lock_get(g
->global_lock
); /* LOCK */
1866 while (done
== MPLS_BOOL_FALSE
) {
1867 switch ((r
= ldp_global_find_adj_index(g
, index
, &adj
))) {
1869 case MPLS_END_OF_LIST
:
1870 done
= MPLS_BOOL_TRUE
;
1879 mpls_lock_release(g
->global_lock
); /* UNLOCK */
1881 if (r
== MPLS_SUCCESS
) {
1882 a
->index
= adj
->index
;
1883 LDP_EXIT(g
->user_data
, "ldp_cfg_adj_getnext");
1884 return ldp_cfg_adj_get(g
, a
, flag
);
1886 LDP_EXIT(g
->user_data
, "ldp_cfg_adj_getnext");
1890 /******************* SESSION **********************/
1892 mpls_return_enum
ldp_cfg_session_get(mpls_cfg_handle handle
, ldp_session
* s
,
1895 ldp_global
*global
= (ldp_global
*) handle
;
1896 ldp_session
*session
= NULL
;
1897 mpls_return_enum retval
= MPLS_FAILURE
;
1899 MPLS_ASSERT(global
!=NULL
&& s
!= NULL
);
1901 LDP_ENTER(global
->user_data
, "ldp_cfg_session_get");
1903 mpls_lock_get(global
->global_lock
); /* LOCK */
1905 if (ldp_global_find_session_index(global
, s
->index
, &session
) != MPLS_SUCCESS
)
1906 goto ldp_cfg_session_get_end
;
1908 if (flag
& LDP_SESSION_CFG_STATE
) {
1909 s
->state
= session
->state
;
1911 if (flag
& LDP_SESSION_CFG_OPER_UP
) {
1912 s
->oper_up
= session
->oper_up
;
1914 if (flag
& LDP_SESSION_CFG_MAX_PDU
) {
1915 s
->oper_max_pdu
= session
->oper_max_pdu
;
1917 if (flag
& LDP_SESSION_CFG_KEEPALIVE
) {
1918 s
->oper_keepalive
= session
->oper_keepalive
;
1920 if (flag
& LDP_SESSION_CFG_PATH_LIMIT
) {
1921 s
->oper_path_vector_limit
= session
->oper_path_vector_limit
;
1923 if (flag
& LDP_SESSION_CFG_DIST_MODE
) {
1924 s
->oper_distribution_mode
= session
->oper_distribution_mode
;
1926 if (flag
& LDP_SESSION_CFG_LOOP_DETECTION
) {
1927 s
->oper_loop_detection
= session
->oper_loop_detection
;
1929 if (flag
& LDP_SESSION_CFG_REMOTE_MAX_PDU
) {
1930 s
->remote_max_pdu
= session
->remote_max_pdu
;
1932 if (flag
& LDP_SESSION_CFG_REMOTE_KEEPALIVE
) {
1933 s
->remote_keepalive
= session
->remote_keepalive
;
1935 if (flag
& LDP_SESSION_CFG_REMOTE_PATH_LIMIT
) {
1936 s
->remote_path_vector_limit
= session
->remote_path_vector_limit
;
1938 if (flag
& LDP_SESSION_CFG_REMOTE_DIST_MODE
) {
1939 s
->remote_distribution_mode
= session
->remote_distribution_mode
;
1941 if (flag
& LDP_SESSION_CFG_REMOTE_LOOP_DETECTION
) {
1942 s
->remote_loop_detection
= session
->remote_loop_detection
;
1944 if (flag
& LDP_SESSION_CFG_REMOTE_ADDR
) {
1945 s
->remote_dest
.addr
.type
= session
->remote_dest
.addr
.type
;
1946 s
->remote_dest
.addr
.u
.ipv4
= session
->remote_dest
.addr
.u
.ipv4
;
1948 if (flag
& LDP_SESSION_CFG_REMOTE_PORT
) {
1949 s
->remote_dest
.port
= session
->remote_dest
.port
;
1951 if (flag
& LDP_SESSION_CFG_LABEL_RESOURCE_STATE_LOCAL
) {
1952 s
->no_label_resource_sent
= session
->no_label_resource_sent
;
1954 if (flag
& LDP_SESSION_CFG_LABEL_RESOURCE_STATE_REMOTE
) {
1955 s
->no_label_resource_recv
= session
->no_label_resource_recv
;
1957 if (flag
& LDP_SESSION_CFG_ADJ_INDEX
) {
1958 ldp_adj
*a
= MPLS_LIST_HEAD(&session
->adj_root
);
1959 s
->adj_index
= a
? a
->index
: 0;
1961 if (flag
& LDP_SESSION_CFG_MESG_TX
) {
1962 s
->mesg_tx
= session
->mesg_tx
;
1964 if (flag
& LDP_SESSION_CFG_MESG_RX
) {
1965 s
->mesg_rx
= session
->mesg_rx
;
1967 if (flag
& LDP_SESSION_CFG_LOCAL_NAME
) {
1968 if (mpls_socket_handle_verify(global
->socket_handle
,
1969 session
->socket
) == MPLS_BOOL_TRUE
) {
1970 mpls_socket_get_local_name(global
->socket_handle
, session
->socket
,
1974 if (flag
& LDP_SESSION_CFG_REMOTE_NAME
) {
1975 if (mpls_socket_handle_verify(global
->socket_handle
,
1976 session
->socket
) == MPLS_BOOL_TRUE
) {
1977 mpls_socket_get_remote_name(global
->socket_handle
, session
->socket
,
1981 retval
= MPLS_SUCCESS
;
1983 ldp_cfg_session_get_end
:
1984 mpls_lock_release(global
->global_lock
); /* UNLOCK */
1986 LDP_EXIT(global
->user_data
, "ldp_cfg_session_get");
1991 mpls_return_enum
ldp_cfg_session_getnext(mpls_cfg_handle handle
, ldp_session
* s
,
1994 ldp_global
*g
= (ldp_global
*) handle
;
1995 ldp_session
*ses
= NULL
;
1996 mpls_return_enum r
= MPLS_FAILURE
;
1997 mpls_bool done
= MPLS_BOOL_FALSE
;
2000 LDP_ENTER(g
->user_data
, "ldp_cfg_session_getnext");
2002 if (s
->index
== 0) {
2005 index
= s
->index
+ 1;
2008 mpls_lock_get(g
->global_lock
); /* LOCK */
2009 while (done
== MPLS_BOOL_FALSE
) {
2010 switch ((r
= ldp_global_find_session_index(g
, index
, &ses
))) {
2012 case MPLS_END_OF_LIST
:
2013 done
= MPLS_BOOL_TRUE
;
2022 mpls_lock_release(g
->global_lock
); /* UNLOCK */
2024 if (r
== MPLS_SUCCESS
) {
2025 s
->index
= ses
->index
;
2027 LDP_EXIT(g
->user_data
, "ldp_cfg_session_getnext");
2028 return ldp_cfg_session_get(g
, s
, flag
);
2031 LDP_EXIT(g
->user_data
, "ldp_cfg_session_getnext");
2036 mpls_return_enum
ldp_cfg_session_adj_getnext(mpls_cfg_handle handle
,
2039 ldp_global
*g
= (ldp_global
*) handle
;
2040 mpls_bool this_one
= MPLS_BOOL_FALSE
;
2041 mpls_return_enum r
= MPLS_FAILURE
;
2042 ldp_adj
*adj_next
= NULL
;
2043 ldp_adj
*adj
= NULL
;
2044 ldp_session
*session
= NULL
;
2046 LDP_ENTER(g
->user_data
, "ldp_cfg_session_adj_getnext");
2048 /* if an adj_index of zero is sent, get the index of
2049 * the first adj in the list
2051 if (!s
->adj_index
) {
2052 this_one
= MPLS_BOOL_TRUE
;
2055 mpls_lock_get(g
->global_lock
); /* LOCK */
2057 if (ldp_global_find_session_index(g
, s
->index
, &session
) == MPLS_SUCCESS
) {
2058 adj
= MPLS_LIST_HEAD(&session
->adj_root
);
2060 if (this_one
== MPLS_BOOL_TRUE
) {
2065 /* since the entities are sort in the list ... */
2066 if (adj
->index
> s
->adj_index
) {
2068 } else if (adj
->index
== s
->adj_index
) {
2069 this_one
= MPLS_BOOL_TRUE
;
2071 adj
= MPLS_LIST_NEXT(&session
->adj_root
, adj
, _session
);
2074 mpls_lock_release(g
->global_lock
); /* UNLOCK */
2077 s
->adj_index
= adj_next
->index
;
2081 LDP_EXIT(g
->user_data
, "ldp_cfg_session_adj_getnext");
2085 mpls_return_enum
ldp_cfg_session_raddr_get(mpls_cfg_handle handle
,
2086 ldp_session
* s
, ldp_addr
* a
, uint32_t flag
)
2088 ldp_global
*global
= (ldp_global
*) handle
;
2089 ldp_session
*session
= NULL
;
2090 ldp_addr
*addr
= NULL
;
2091 mpls_return_enum retval
= MPLS_FAILURE
;
2093 MPLS_ASSERT(global
!=NULL
&& s
!= NULL
&& a
!= NULL
);
2095 LDP_ENTER(global
->user_data
, "ldp_cfg_session_raddr_get");
2097 mpls_lock_get(global
->global_lock
); /* LOCK */
2099 if (ldp_global_find_session_index(global
, s
->index
, &session
) != MPLS_SUCCESS
)
2100 goto ldp_cfg_session_raddr_get_end
;
2102 if (ldp_session_find_raddr_index(session
, a
->index
, &addr
) != MPLS_SUCCESS
)
2103 goto ldp_cfg_session_raddr_get_end
;
2105 if (flag
& LDP_SESSION_RADDR_CFG_ADDR
) {
2106 memcpy(&a
->address
,&addr
->address
,sizeof(struct mpls_inet_addr
));
2108 if (flag
& LDP_SESSION_RADDR_CFG_INDEX
) {
2109 a
->index
= addr
->index
;
2111 retval
= MPLS_SUCCESS
;
2113 ldp_cfg_session_raddr_get_end
:
2114 mpls_lock_release(global
->global_lock
); /* UNLOCK */
2116 LDP_EXIT(global
->user_data
, "ldp_cfg_session_raddr_get");
2121 mpls_return_enum
ldp_cfg_session_raddr_getnext(mpls_cfg_handle handle
,
2122 ldp_session
* s
, ldp_addr
* a
, uint32_t flag
)
2124 ldp_global
*g
= (ldp_global
*) handle
;
2125 ldp_addr
*addr
= NULL
;
2126 mpls_return_enum r
= MPLS_FAILURE
;
2127 mpls_bool done
= MPLS_BOOL_FALSE
;
2128 ldp_session
*sp
= NULL
;
2131 LDP_ENTER(g
->user_data
, "ldp_cfg_session_raddr_getnext");
2133 if (a
->index
== 0) {
2136 index
= a
->index
+ 1;
2139 r
= ldp_global_find_session_index(g
, s
->index
, &sp
);
2140 if (r
!= MPLS_SUCCESS
) {
2144 mpls_lock_get(g
->global_lock
); /* LOCK */
2145 while (done
== MPLS_BOOL_FALSE
) {
2146 switch ((r
= ldp_session_find_raddr_index(sp
, index
, &addr
))) {
2148 case MPLS_END_OF_LIST
:
2149 done
= MPLS_BOOL_TRUE
;
2158 mpls_lock_release(g
->global_lock
); /* UNLOCK */
2160 if (r
== MPLS_SUCCESS
) {
2161 a
->index
= addr
->index
;
2162 r
= ldp_cfg_session_raddr_get(handle
, sp
, a
, flag
);
2165 LDP_EXIT(g
->user_data
, "ldp_cfg_session_getnext");
2169 /******************* IN LABEL **********************/
2171 mpls_return_enum
ldp_cfg_inlabel_get(mpls_cfg_handle handle
, ldp_inlabel
* i
,
2174 ldp_global
*global
= (ldp_global
*) handle
;
2175 ldp_inlabel
*inlabel
= NULL
;
2176 mpls_return_enum retval
= MPLS_FAILURE
;
2178 MPLS_ASSERT(global
!=NULL
&& i
!= NULL
);
2180 LDP_ENTER(global
->user_data
, "ldp_cfg_inlabel_get");
2182 mpls_lock_get(global
->global_lock
); /* LOCK */
2184 if (ldp_global_find_inlabel_index(global
, i
->index
, &inlabel
) != MPLS_SUCCESS
)
2185 goto ldp_cfg_inlabel_get_end
;
2187 if (flag
& LDP_INLABEL_CFG_LABELSPACE
) {
2188 i
->info
.labelspace
= inlabel
->info
.labelspace
;
2190 if (flag
& LDP_INLABEL_CFG_LABEL
) {
2191 memcpy(&i
->info
.label
, &inlabel
->info
.label
, sizeof(mpls_label_struct
));
2193 if (flag
& LDP_INLABEL_CFG_OUTLABEL_INDEX
) {
2194 i
->outlabel_index
= (inlabel
->outlabel
) ? (inlabel
->outlabel
->index
) : 0;
2197 retval
= MPLS_SUCCESS
;
2199 ldp_cfg_inlabel_get_end
:
2200 mpls_lock_release(global
->global_lock
); /* UNLOCK */
2202 LDP_EXIT(global
->user_data
, "ldp_cfg_inlabel_get");
2207 mpls_return_enum
ldp_cfg_inlabel_getnext(mpls_cfg_handle handle
, ldp_inlabel
* i
,
2210 ldp_global
*g
= (ldp_global
*) handle
;
2211 ldp_inlabel
*inlabel
= NULL
;
2212 mpls_return_enum r
= MPLS_FAILURE
;
2213 mpls_bool done
= MPLS_BOOL_FALSE
;
2216 LDP_ENTER(g
->user_data
, "ldp_cfg_inlabel_getnext");
2218 if (i
->index
== 0) {
2221 index
= i
->index
+ 1;
2224 mpls_lock_get(g
->global_lock
); /* LOCK */
2225 while (done
== MPLS_BOOL_FALSE
) {
2226 switch ((r
= ldp_global_find_inlabel_index(g
, index
, &inlabel
))) {
2228 case MPLS_END_OF_LIST
:
2229 done
= MPLS_BOOL_TRUE
;
2238 mpls_lock_release(g
->global_lock
); /* UNLOCK */
2240 if (r
== MPLS_SUCCESS
) {
2241 i
->index
= inlabel
->index
;
2243 LDP_EXIT(g
->user_data
, "ldp_cfg_inlabel_getnext");
2244 return ldp_cfg_inlabel_get(g
, i
, flag
);
2247 LDP_EXIT(g
->user_data
, "ldp_cfg_inlabel_getnext");
2252 /******************* OUT LABEL **********************/
2254 mpls_return_enum
ldp_cfg_outlabel_get(mpls_cfg_handle handle
, ldp_outlabel
* o
,
2257 ldp_global
*global
= (ldp_global
*) handle
;
2258 ldp_outlabel
*outlabel
= NULL
;
2259 mpls_return_enum retval
= MPLS_FAILURE
;
2261 MPLS_ASSERT(global
!=NULL
&& o
!= NULL
);
2263 LDP_ENTER(global
->user_data
, "ldp_cfg_outlabel_get");
2265 mpls_lock_get(global
->global_lock
); /* LOCK */
2267 if (ldp_global_find_outlabel_index(global
, o
->index
,
2268 &outlabel
) != MPLS_SUCCESS
) goto ldp_cfg_outlabel_get_end
;
2270 if (flag
& LDP_OUTLABEL_CFG_NH_INDEX
) {
2272 o
->nh_index
= outlabel
->nh
->index
;
2277 if (flag
& LDP_OUTLABEL_CFG_SESSION_INDEX
) {
2278 o
->session_index
= (outlabel
->session
) ? (outlabel
->session
->index
) : 0;
2280 if (flag
& LDP_OUTLABEL_CFG_LABEL
) {
2281 memcpy(&o
->info
.label
, &outlabel
->info
.label
, sizeof(mpls_label_struct
));
2283 if (flag
& LDP_OUTLABEL_CFG_MERGE_COUNT
) {
2284 o
->merge_count
= outlabel
->merge_count
;
2287 retval
= MPLS_SUCCESS
;
2289 ldp_cfg_outlabel_get_end
:
2290 mpls_lock_release(global
->global_lock
); /* UNLOCK */
2292 LDP_EXIT(global
->user_data
, "ldp_cfg_outlabel_get");
2297 mpls_return_enum
ldp_cfg_outlabel_getnext(mpls_cfg_handle handle
,
2298 ldp_outlabel
* o
, uint32_t flag
)
2300 ldp_global
*g
= (ldp_global
*) handle
;
2301 ldp_outlabel
*outlabel
= NULL
;
2302 mpls_return_enum r
= MPLS_FAILURE
;
2303 mpls_bool done
= MPLS_BOOL_FALSE
;
2306 LDP_ENTER(g
->user_data
, "ldp_cfg_outlabel_getnext");
2308 if (o
->index
== 0) {
2311 index
= o
->index
+ 1;
2314 mpls_lock_get(g
->global_lock
); /* LOCK */
2315 while (done
== MPLS_BOOL_FALSE
) {
2316 switch ((r
= ldp_global_find_outlabel_index(g
, index
, &outlabel
))) {
2318 case MPLS_END_OF_LIST
:
2319 done
= MPLS_BOOL_TRUE
;
2328 mpls_lock_release(g
->global_lock
); /* UNLOCK */
2330 if (r
== MPLS_SUCCESS
) {
2331 o
->index
= outlabel
->index
;
2333 LDP_EXIT(g
->user_data
, "ldp_cfg_outlabel_getnext");
2334 return ldp_cfg_outlabel_get(g
, o
, flag
);
2337 LDP_EXIT(g
->user_data
, "ldp_cfg_outlabel_getnext");
2342 /******************* TUNNEL **********************/
2344 mpls_return_enum
ldp_cfg_tunnel_set(mpls_cfg_handle handle
, ldp_tunnel
* t
,
2347 ldp_global
*global
= (ldp_global
*) handle
;
2348 mpls_return_enum retval
= MPLS_FAILURE
;
2349 ldp_tunnel
*tunnel
= NULL
;
2351 MPLS_ASSERT(global
!=NULL
);
2353 LDP_ENTER(global
->user_data
, "ldp_cfg_tunnel_set");
2355 mpls_lock_get(global
->global_lock
); /* LOCK */
2357 if (flag
& LDP_CFG_ADD
) {
2358 if (!(tunnel
= ldp_tunnel_create())) {
2359 goto ldp_cfg_tunnel_set_end
;
2361 _ldp_global_add_tunnel(global
, tunnel
);
2363 t
->index
= tunnel
->index
;
2365 ldp_global_find_tunnel_index(global
, t
->index
, &tunnel
);
2369 LDP_PRINT(global
->user_data
,
2371 "ldp_cfg_tunnel_set:could not create tunnel\n");
2372 goto ldp_cfg_tunnel_set_end
;
2375 if ((ldp_tunnel_is_active(tunnel
) == MPLS_BOOL_TRUE
) &&
2376 (flag
& LDP_TUNNEL_CFG_WHEN_DOWN
)) {
2377 LDP_PRINT(global
->user_data
, "ldp_cfg_tunnel_set: tunnel is active\n");
2379 goto ldp_cfg_tunnel_set_end
;
2382 if (flag
& LDP_CFG_DEL
) {
2383 if (tunnel
->outlabel
)
2384 ldp_tunnel_del_outlabel(global
, tunnel
);
2385 if (tunnel
->resource
)
2386 ldp_tunnel_del_resource(tunnel
);
2387 if (tunnel
->hop_list
)
2388 ldp_tunnel_del_hop_list(tunnel
);
2389 _ldp_global_del_tunnel(global
, tunnel
);
2391 retval
= MPLS_SUCCESS
;
2392 goto ldp_cfg_tunnel_set_end
;
2395 if (flag
& LDP_TUNNEL_CFG_INGRESS
) {
2396 memcpy(&tunnel
->ingress_lsrid
, &t
->ingress_lsrid
, sizeof(ldp_addr
));
2398 if (flag
& LDP_TUNNEL_CFG_EGRESS
) {
2399 memcpy(&tunnel
->egress_lsrid
, &t
->egress_lsrid
, sizeof(ldp_addr
));
2401 if (flag
& LDP_TUNNEL_CFG_NAME
) {
2402 memcpy(&tunnel
->name
, &t
->name
, MPLS_MAX_IF_NAME
);
2404 if (flag
& LDP_TUNNEL_CFG_IS_IF
) {
2405 tunnel
->is_interface
= t
->is_interface
;
2407 if (flag
& LDP_TUNNEL_CFG_OUTLABEL
) {
2408 ldp_outlabel
*outlabel
= NULL
;
2410 if (t
->outlabel_index
) {
2411 ldp_global_find_outlabel_index(global
, t
->outlabel_index
, &outlabel
);
2414 goto ldp_cfg_tunnel_set_end
;
2416 ldp_tunnel_add_outlabel(tunnel
, outlabel
);
2418 ldp_tunnel_del_outlabel(global
, tunnel
);
2421 if (flag
& LDP_TUNNEL_CFG_SETUP_PRIO
) {
2422 tunnel
->setup_prio
= t
->setup_prio
;
2424 if (flag
& LDP_TUNNEL_CFG_HOLD_PRIO
) {
2425 tunnel
->hold_prio
= t
->hold_prio
;
2427 if (flag
& LDP_TUNNEL_CFG_INSTANCE_PRIO
) {
2428 tunnel
->instance_prio
= t
->instance_prio
;
2430 if (flag
& LDP_TUNNEL_CFG_LOCAL_PROTECT
) {
2431 tunnel
->local_protect
= t
->local_protect
;
2433 if (flag
& LDP_TUNNEL_CFG_RESOURCE_INDEX
) {
2434 ldp_resource
*resource
= NULL
;
2436 if (t
->resource_index
) {
2437 ldp_global_find_resource_index(global
, t
->resource_index
, &resource
);
2440 goto ldp_cfg_tunnel_set_end
;
2442 ldp_tunnel_add_resource(tunnel
, resource
);
2444 ldp_tunnel_del_resource(tunnel
);
2447 if (flag
& LDP_TUNNEL_CFG_HOP_LIST_INDEX
) {
2448 ldp_hop_list
*hop_list
= NULL
;
2450 if (t
->hop_list_index
) {
2451 ldp_global_find_hop_list_index(global
, t
->hop_list_index
, &hop_list
);
2454 goto ldp_cfg_tunnel_set_end
;
2456 ldp_tunnel_add_hop_list(tunnel
, hop_list
);
2458 ldp_tunnel_del_hop_list(tunnel
);
2461 if (flag
& LDP_TUNNEL_CFG_FEC
) {
2462 memcpy(&tunnel
->fec
, &t
->fec
, sizeof(ldp_fec
));
2464 if (flag
& LDP_TUNNEL_CFG_ADMIN_STATE
) {
2465 if (ldp_tunnel_is_active(tunnel
) == MPLS_BOOL_TRUE
) {
2466 if (t
->admin_state
== MPLS_ADMIN_DISABLE
) {
2467 if (ldp_tunnel_shutdown(global
, tunnel
, 0) == MPLS_FAILURE
) {
2468 goto ldp_cfg_tunnel_set_end
;
2472 if (t
->admin_state
== MPLS_ADMIN_ENABLE
) {
2473 if (ldp_tunnel_is_ready(tunnel
) == MPLS_BOOL_TRUE
) {
2474 if (ldp_tunnel_startup(global
, tunnel
) == MPLS_FAILURE
) {
2475 goto ldp_cfg_tunnel_set_end
;
2478 LDP_PRINT(global
->user_data
,
2480 "ldp_cfg_tunnel_set: tunnel not ready\n");
2481 goto ldp_cfg_tunnel_set_end
;
2486 retval
= MPLS_SUCCESS
;
2488 ldp_cfg_tunnel_set_end
:
2490 mpls_lock_release(global
->global_lock
); /* UNLOCK */
2492 LDP_EXIT(global
->user_data
, "ldp_cfg_tunnel_set");
2497 mpls_return_enum
ldp_cfg_tunnel_test(mpls_cfg_handle handle
, ldp_tunnel
* t
,
2500 ldp_global
*global
= (ldp_global
*) handle
;
2501 mpls_return_enum retval
= MPLS_FAILURE
;
2502 ldp_tunnel
*tunnel
= NULL
;
2504 MPLS_ASSERT(global
!=NULL
);
2506 LDP_ENTER(global
->user_data
, "ldp_cfg_tunnel_test");
2508 mpls_lock_get(global
->global_lock
); /* LOCK */
2510 if (flag
& LDP_CFG_ADD
) {
2511 retval
= MPLS_SUCCESS
;
2512 goto ldp_cfg_tunnel_test_end
;
2515 ldp_global_find_tunnel_index(global
, t
->index
, &tunnel
);
2518 goto ldp_cfg_tunnel_test_end
;
2521 if (flag
& LDP_TUNNEL_CFG_RESOURCE_INDEX
) {
2522 ldp_resource
*resource
= NULL
;
2524 if (t
->resource_index
) {
2525 ldp_global_find_resource_index(global
, t
->resource_index
, &resource
);
2528 goto ldp_cfg_tunnel_test_end
;
2532 if (flag
& LDP_TUNNEL_CFG_HOP_LIST_INDEX
) {
2533 ldp_hop_list
*hop_list
= NULL
;
2535 if (t
->hop_list_index
) {
2536 ldp_global_find_hop_list_index(global
, t
->hop_list_index
, &hop_list
);
2539 goto ldp_cfg_tunnel_test_end
;
2543 if (flag
& LDP_TUNNEL_CFG_OUTLABEL
) {
2544 ldp_outlabel
*outlabel
= NULL
;
2546 if (t
->outlabel_index
) {
2547 ldp_global_find_outlabel_index(global
, t
->outlabel_index
, &outlabel
);
2550 goto ldp_cfg_tunnel_test_end
;
2554 if ((flag
& LDP_TUNNEL_CFG_ADMIN_STATE
) &&
2555 (ldp_tunnel_is_active(tunnel
) == MPLS_BOOL_FALSE
) &&
2556 (t
->admin_state
== MPLS_ADMIN_ENABLE
) && (ldp_tunnel_is_ready(tunnel
) != MPLS_BOOL_TRUE
)) {
2557 goto ldp_cfg_tunnel_test_end
;
2559 retval
= MPLS_SUCCESS
;
2561 ldp_cfg_tunnel_test_end
:
2563 mpls_lock_release(global
->global_lock
); /* UNLOCK */
2565 LDP_EXIT(global
->user_data
, "ldp_cfg_tunnel_test");
2570 mpls_return_enum
ldp_cfg_tunnel_get(mpls_cfg_handle handle
, ldp_tunnel
* t
,
2573 ldp_global
*global
= (ldp_global
*) handle
;
2574 mpls_return_enum retval
= MPLS_FAILURE
;
2575 ldp_tunnel
*tunnel
= NULL
;
2577 MPLS_ASSERT(global
!=NULL
);
2579 LDP_ENTER(global
->user_data
, "ldp_cfg_tunnel_get");
2581 mpls_lock_get(global
->global_lock
); /* LOCK */
2583 ldp_global_find_tunnel_index(global
, t
->index
, &tunnel
);
2586 goto ldp_cfg_tunnel_get_end
;
2588 if (flag
& LDP_TUNNEL_CFG_INGRESS
) {
2589 memcpy(&t
->ingress_lsrid
, &tunnel
->ingress_lsrid
, sizeof(ldp_addr
));
2591 if (flag
& LDP_TUNNEL_CFG_EGRESS
) {
2592 memcpy(&t
->egress_lsrid
, &tunnel
->egress_lsrid
, sizeof(ldp_addr
));
2594 if (flag
& LDP_TUNNEL_CFG_NAME
) {
2595 memcpy(&t
->name
, &tunnel
->name
, MPLS_MAX_IF_NAME
);
2597 if (flag
& LDP_TUNNEL_CFG_IS_IF
) {
2598 t
->is_interface
= tunnel
->is_interface
;
2600 if (flag
& LDP_TUNNEL_CFG_OUTLABEL
) {
2601 if (tunnel
->outlabel
) {
2602 t
->outlabel_index
= tunnel
->outlabel
->index
;
2604 t
->outlabel_index
= 0;
2607 if (flag
& LDP_TUNNEL_CFG_SETUP_PRIO
) {
2608 t
->setup_prio
= tunnel
->setup_prio
;
2610 if (flag
& LDP_TUNNEL_CFG_HOLD_PRIO
) {
2611 t
->hold_prio
= tunnel
->hold_prio
;
2613 if (flag
& LDP_TUNNEL_CFG_INSTANCE_PRIO
) {
2614 tunnel
->instance_prio
= t
->instance_prio
;
2616 if (flag
& LDP_TUNNEL_CFG_LOCAL_PROTECT
) {
2617 tunnel
->local_protect
= t
->local_protect
;
2619 if (flag
& LDP_TUNNEL_CFG_RESOURCE_INDEX
) {
2620 if (tunnel
->resource
) {
2621 t
->resource_index
= tunnel
->resource
->index
;
2623 t
->resource_index
= 0;
2626 if (flag
& LDP_TUNNEL_CFG_HOP_LIST_INDEX
) {
2627 if (tunnel
->hop_list
) {
2628 t
->hop_list_index
= tunnel
->hop_list
->index
;
2630 t
->hop_list_index
= 0;
2633 if (flag
& LDP_TUNNEL_CFG_FEC
) {
2634 memcpy(&t
->fec
, &tunnel
->fec
, sizeof(ldp_fec
));
2636 if (flag
& LDP_TUNNEL_CFG_ADMIN_STATE
) {
2637 t
->admin_state
= tunnel
->admin_state
;
2639 retval
= MPLS_SUCCESS
;
2641 ldp_cfg_tunnel_get_end
:
2643 mpls_lock_release(global
->global_lock
); /* UNLOCK */
2645 LDP_EXIT(global
->user_data
, "ldp_cfg_tunnel_get");
2650 mpls_return_enum
ldp_cfg_tunnel_getnext(mpls_cfg_handle handle
,
2651 ldp_tunnel
* r
, uint32_t flag
)
2653 ldp_global
*g
= (ldp_global
*) handle
;
2654 ldp_tunnel
*tunnel
= NULL
;
2655 mpls_return_enum ret
= MPLS_FAILURE
;
2656 mpls_bool done
= MPLS_BOOL_FALSE
;
2659 LDP_ENTER(g
->user_data
, "ldp_cfg_tunnel_getnext");
2661 if (r
->index
== 0) {
2664 index
= r
->index
+ 1;
2667 mpls_lock_get(g
->global_lock
); /* LOCK */
2668 while (done
== MPLS_BOOL_FALSE
) {
2669 switch ((ret
= ldp_global_find_tunnel_index(g
, index
, &tunnel
))) {
2671 case MPLS_END_OF_LIST
:
2672 done
= MPLS_BOOL_TRUE
;
2681 mpls_lock_release(g
->global_lock
); /* UNLOCK */
2683 if (ret
== MPLS_SUCCESS
) {
2684 r
->index
= tunnel
->index
;
2686 LDP_EXIT(g
->user_data
, "ldp_cfg_tunnel_getnext");
2687 return ldp_cfg_tunnel_get(g
, r
, flag
);
2690 LDP_EXIT(g
->user_data
, "ldp_cfg_tunnel_getnext");
2695 /******************* RESOURCE **********************/
2697 mpls_return_enum
ldp_cfg_resource_set(mpls_cfg_handle handle
, ldp_resource
* r
,
2700 ldp_global
*global
= (ldp_global
*) handle
;
2701 mpls_return_enum retval
= MPLS_FAILURE
;
2702 ldp_resource
*resource
= NULL
;
2704 MPLS_ASSERT(global
!=NULL
);
2706 LDP_ENTER(global
->user_data
, "ldp_cfg_resource_set");
2708 mpls_lock_get(global
->global_lock
); /* LOCK */
2710 if (flag
& LDP_CFG_ADD
) {
2711 resource
= ldp_resource_create();
2712 _ldp_global_add_resource(global
, resource
);
2714 r
->index
= resource
->index
;
2716 ldp_global_find_resource_index(global
, r
->index
, &resource
);
2720 goto ldp_cfg_resource_set_end
;
2723 if (flag
& LDP_RESOURCE_CFG_MAXBPS
) {
2724 resource
->max_rate
= r
->max_rate
;
2726 if (flag
& LDP_RESOURCE_CFG_MEANBPS
) {
2727 resource
->mean_rate
= r
->mean_rate
;
2729 if (flag
& LDP_RESOURCE_CFG_BURSTSIZE
) {
2730 resource
->burst_size
= r
->burst_size
;
2732 retval
= MPLS_SUCCESS
;
2734 ldp_cfg_resource_set_end
:
2736 mpls_lock_release(global
->global_lock
); /* UNLOCK */
2738 LDP_EXIT(global
->user_data
, "ldp_cfg_resource_set");
2743 mpls_return_enum
ldp_cfg_resource_test(mpls_cfg_handle handle
, ldp_resource
* r
,
2746 ldp_global
*global
= (ldp_global
*) handle
;
2747 mpls_return_enum retval
= MPLS_FAILURE
;
2748 ldp_resource
*resource
= NULL
;
2750 MPLS_ASSERT(global
!=NULL
);
2752 LDP_ENTER(global
->user_data
, "ldp_cfg_resource_test");
2754 mpls_lock_get(global
->global_lock
); /* LOCK */
2756 if (flag
& LDP_CFG_ADD
) {
2757 retval
= MPLS_SUCCESS
;
2758 goto ldp_cfg_resource_test_end
;
2761 ldp_global_find_resource_index(global
, r
->index
, &resource
);
2764 goto ldp_cfg_resource_test_end
;
2767 if (ldp_resource_in_use(resource
) == MPLS_BOOL_TRUE
) {
2768 goto ldp_cfg_resource_test_end
;
2770 retval
= MPLS_SUCCESS
;
2772 ldp_cfg_resource_test_end
:
2774 mpls_lock_release(global
->global_lock
); /* UNLOCK */
2776 LDP_EXIT(global
->user_data
, "ldp_cfg_resource_test");
2781 mpls_return_enum
ldp_cfg_resource_get(mpls_cfg_handle handle
, ldp_resource
* r
,
2784 ldp_global
*global
= (ldp_global
*) handle
;
2785 mpls_return_enum retval
= MPLS_FAILURE
;
2786 ldp_resource
*resource
= NULL
;
2788 MPLS_ASSERT(global
!=NULL
);
2790 LDP_ENTER(global
->user_data
, "ldp_cfg_resource_get");
2792 mpls_lock_get(global
->global_lock
); /* LOCK */
2794 ldp_global_find_resource_index(global
, r
->index
, &resource
);
2797 goto ldp_cfg_resource_get_end
;
2800 if (flag
& LDP_RESOURCE_CFG_MAXBPS
) {
2801 r
->max_rate
= resource
->max_rate
;
2803 if (flag
& LDP_RESOURCE_CFG_MEANBPS
) {
2804 r
->mean_rate
= resource
->mean_rate
;
2806 if (flag
& LDP_RESOURCE_CFG_BURSTSIZE
) {
2807 r
->burst_size
= resource
->burst_size
;
2809 retval
= MPLS_SUCCESS
;
2811 ldp_cfg_resource_get_end
:
2813 mpls_lock_release(global
->global_lock
); /* UNLOCK */
2815 LDP_EXIT(global
->user_data
, "ldp_cfg_resource_get");
2820 mpls_return_enum
ldp_cfg_resource_getnext(mpls_cfg_handle handle
,
2821 ldp_resource
* r
, uint32_t flag
)
2823 ldp_global
*g
= (ldp_global
*) handle
;
2824 ldp_resource
*resource
= NULL
;
2825 mpls_return_enum ret
= MPLS_FAILURE
;
2826 mpls_bool done
= MPLS_BOOL_FALSE
;
2829 LDP_ENTER(g
->user_data
, "ldp_cfg_resource_getnext");
2831 if (r
->index
== 0) {
2834 index
= r
->index
+ 1;
2837 mpls_lock_get(g
->global_lock
); /* LOCK */
2838 while (done
== MPLS_BOOL_FALSE
) {
2839 switch ((ret
= ldp_global_find_resource_index(g
, index
, &resource
))) {
2841 case MPLS_END_OF_LIST
:
2842 done
= MPLS_BOOL_TRUE
;
2851 mpls_lock_release(g
->global_lock
); /* UNLOCK */
2853 if (ret
== MPLS_SUCCESS
) {
2854 r
->index
= resource
->index
;
2856 LDP_EXIT(g
->user_data
, "ldp_cfg_resource_getnext");
2857 return ldp_cfg_resource_get(g
, r
, flag
);
2860 LDP_EXIT(g
->user_data
, "ldp_cfg_resource_getnext");
2865 /******************* HOP **********************/
2867 mpls_return_enum
ldp_cfg_hop_set(mpls_cfg_handle handle
, ldp_hop
* h
,
2870 ldp_global
*global
= (ldp_global
*) handle
;
2871 mpls_return_enum retval
= MPLS_FAILURE
;
2872 ldp_hop_list
*hop_list
= NULL
;
2873 ldp_hop
*hop
= NULL
;
2875 MPLS_ASSERT(global
!=NULL
);
2877 LDP_ENTER(global
->user_data
, "ldp_cfg_hop_set");
2879 if (!h
->hop_list_index
&& !h
->index
) {
2883 mpls_lock_get(global
->global_lock
); /* LOCK */
2885 ldp_global_find_hop_list_index(global
, h
->hop_list_index
, &hop_list
);
2888 if (flag
& LDP_CFG_ADD
) {
2889 if (!(hop_list
= ldp_hop_list_create())) {
2890 goto ldp_cfg_hop_set_end
;
2892 _ldp_global_add_hop_list(global
, hop_list
);
2894 h
->hop_list_index
= hop_list
->index
;
2896 goto ldp_cfg_hop_set_end
;
2900 ldp_hop_list_find_hop_index(hop_list
, h
->index
, &hop
);
2902 if (h
->index
&& (flag
& LDP_CFG_ADD
)) {
2903 if (!(hop
= ldp_hop_create())) {
2904 goto ldp_cfg_hop_set_end
;
2906 hop
->index
= h
->index
;
2907 ldp_hop_list_add_hop(hop_list
, hop
);
2909 goto ldp_cfg_hop_set_end
;
2913 if (flag
& LDP_HOP_CFG_PATH_OPTION
) {
2914 hop
->path_option
= h
->path_option
;
2916 if (flag
& LDP_HOP_CFG_ADDR
) {
2917 memcpy(&hop
->addr
, &h
->addr
, sizeof(ldp_addr
));
2919 if (flag
& LDP_HOP_CFG_TYPE
) {
2920 hop
->type
= h
->type
;
2922 retval
= MPLS_SUCCESS
;
2924 ldp_cfg_hop_set_end
:
2926 mpls_lock_release(global
->global_lock
); /* UNLOCK */
2928 LDP_EXIT(global
->user_data
, "ldp_cfg_hop_set");
2933 mpls_return_enum
ldp_cfg_hop_test(mpls_cfg_handle handle
, ldp_hop
* h
,
2936 ldp_global
*global
= (ldp_global
*) handle
;
2937 mpls_return_enum retval
= MPLS_FAILURE
;
2938 ldp_hop_list
*hop_list
= NULL
;
2939 ldp_hop
*hop
= NULL
;
2941 MPLS_ASSERT(global
!=NULL
);
2943 LDP_ENTER(global
->user_data
, "ldp_cfg_hop_test");
2945 mpls_lock_get(global
->global_lock
); /* LOCK */
2947 if (flag
& LDP_CFG_ADD
) {
2948 retval
= MPLS_SUCCESS
;
2949 goto ldp_cfg_hop_test_end
;
2952 ldp_global_find_hop_list_index(global
, h
->hop_list_index
, &hop_list
);
2955 goto ldp_cfg_hop_test_end
;
2958 ldp_hop_list_find_hop_index(hop_list
, h
->index
, &hop
);
2960 goto ldp_cfg_hop_test_end
;
2963 if (ldp_hop_in_use(hop
) == MPLS_BOOL_TRUE
) {
2964 goto ldp_cfg_hop_test_end
;
2966 retval
= MPLS_SUCCESS
;
2968 ldp_cfg_hop_test_end
:
2970 mpls_lock_release(global
->global_lock
); /* UNLOCK */
2972 LDP_EXIT(global
->user_data
, "ldp_cfg_hop_test");
2977 mpls_return_enum
ldp_cfg_hop_get(mpls_cfg_handle handle
, ldp_hop
* h
,
2980 ldp_global
*global
= (ldp_global
*) handle
;
2981 mpls_return_enum retval
= MPLS_FAILURE
;
2982 ldp_hop_list
*hop_list
= NULL
;
2983 ldp_hop
*hop
= NULL
;
2985 MPLS_ASSERT(global
!=NULL
);
2987 LDP_ENTER(global
->user_data
, "ldp_cfg_hop_get");
2989 mpls_lock_get(global
->global_lock
); /* LOCK */
2991 ldp_global_find_hop_list_index(global
, h
->hop_list_index
, &hop_list
);
2994 goto ldp_cfg_hop_get_end
;
2997 ldp_hop_list_find_hop_index(hop_list
, h
->index
, &hop
);
2999 goto ldp_cfg_hop_get_end
;
3002 if (flag
& LDP_HOP_CFG_PATH_OPTION
) {
3003 h
->path_option
= hop
->path_option
;
3005 if (flag
& LDP_HOP_CFG_ADDR
) {
3006 memcpy(&h
->addr
, &hop
->addr
, sizeof(ldp_addr
));
3008 if (flag
& LDP_HOP_CFG_TYPE
) {
3009 h
->type
= hop
->type
;
3011 retval
= MPLS_SUCCESS
;
3013 ldp_cfg_hop_get_end
:
3015 mpls_lock_release(global
->global_lock
); /* UNLOCK */
3017 LDP_EXIT(global
->user_data
, "ldp_cfg_hop_get");
3022 /******************* NEXTHOP **********************/
3023 mpls_return_enum
ldp_cfg_nexthop_get(mpls_cfg_handle handle
, ldp_nexthop
* n
,
3026 ldp_global
*global
= (ldp_global
*) handle
;
3027 ldp_nexthop
*nexthop
= NULL
;
3028 mpls_return_enum retval
= MPLS_FAILURE
;
3030 MPLS_ASSERT(global
!=NULL
&& n
!= NULL
);
3032 LDP_ENTER(global
->user_data
, "ldp_cfg_nexthop_get");
3034 mpls_lock_get(global
->global_lock
); /* LOCK */
3036 if (ldp_global_find_nexthop_index(global
, n
->index
, &nexthop
) != MPLS_SUCCESS
)
3037 goto ldp_cfg_nexthop_get_end
;
3040 n
->fec_index
= nexthop
->fec
->index
;
3042 n
->addr_index
= nexthop
->addr
->index
;
3043 if (nexthop
->outlabel
)
3044 n
->outlabel_index
= nexthop
->outlabel
->index
;
3046 n
->if_index
= nexthop
->iff
->index
;
3048 memcpy (&n
->info
, &nexthop
->info
, sizeof(nexthop
->info
));
3050 retval
= MPLS_SUCCESS
;
3052 ldp_cfg_nexthop_get_end
:
3053 mpls_lock_release(global
->global_lock
); /* UNLOCK */
3055 LDP_EXIT(global
->user_data
, "ldp_cfg_nexthop_get");
3060 mpls_return_enum
ldp_cfg_nexthop_getnext(mpls_cfg_handle handle
, ldp_nexthop
* n
,
3063 ldp_global
*g
= (ldp_global
*) handle
;
3064 ldp_nexthop
*ses
= NULL
;
3065 mpls_return_enum r
= MPLS_FAILURE
;
3066 mpls_bool done
= MPLS_BOOL_FALSE
;
3069 LDP_ENTER(g
->user_data
, "ldp_cfg_nexthop_getnext");
3071 if (n
->index
== 0) {
3074 index
= n
->index
+ 1;
3077 mpls_lock_get(g
->global_lock
); /* LOCK */
3078 while (done
== MPLS_BOOL_FALSE
) {
3079 switch ((r
= ldp_global_find_nexthop_index(g
, index
, &ses
))) {
3081 case MPLS_END_OF_LIST
:
3082 done
= MPLS_BOOL_TRUE
;
3091 mpls_lock_release(g
->global_lock
); /* UNLOCK */
3093 if (r
== MPLS_SUCCESS
) {
3094 n
->index
= ses
->index
;
3096 LDP_EXIT(g
->user_data
, "ldp_cfg_nexthop_getnext");
3097 return ldp_cfg_nexthop_get(g
, n
, flag
);
3100 LDP_EXIT(g
->user_data
, "ldp_cfg_nexthop_getnext");