From: Vasu Dasari <vdasari@gmail.com>
[mpls-ldp-portable.git] / ldp / ldp_cfg.c
blobdf65b9c48a7df6c81fcb5698a3c92409d8feb8ba
2 /*
3 * Copyright (C) James R. Leu 2000
4 * jleu@mindspring.com
6 * This software is covered under the LGPL, for more
7 * info check out http://www.gnu.org/copyleft/lgpl.html
8 */
10 #include "ldp_struct.h"
11 #include "ldp_cfg.h"
12 #include "ldp_global.h"
13 #include "ldp_entity.h"
14 #include "ldp_attr.h"
15 #include "ldp_if.h"
16 #include "ldp_peer.h"
17 #include "ldp_fec.h"
18 #include "ldp_addr.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"
24 #include "ldp_hop.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");
44 ldp_global_delete(g);
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);
53 while (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,
64 uint32_t flag)
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;
124 #if MPLS_USE_LSR
125 if (flag & LDP_GLOBAL_CFG_LSR_HANDLE) {
126 g->lsr_handle = global->lsr_handle;
128 #endif
130 mpls_lock_release(global->global_lock); /* UNLOCK */
132 LDP_EXIT(global->user_data, "ldp_cfg_global_get");
134 return MPLS_SUCCESS;
137 mpls_return_enum ldp_cfg_global_test(mpls_cfg_handle handle, ldp_global * g,
138 uint32_t flag)
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");
156 return retval;
159 mpls_return_enum ldp_cfg_global_set(mpls_cfg_handle handle, ldp_global * g,
160 uint32_t flag)
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));
205 #if MPLS_USE_LSR
206 if (flag & LDP_GLOBAL_CFG_LSR_HANDLE) {
207 global->lsr_handle = g->lsr_handle;
209 #endif
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 ==
214 MPLS_ADMIN_ENABLE) {
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;
225 } else {
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;
232 } else {
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;
239 } else {
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;
246 } else {
247 global->hellotime_interval = g->hellotime_interval;
250 #if MPLS_USE_LSR
251 if (flag & LDP_GLOBAL_CFG_LSR_HANDLE) {
252 global->lsr_handle = g->lsr_handle ;
254 #endif
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");
265 return retval;
268 /******************* ENTITY **********************/
270 /* must set ldp_entity->index */
271 mpls_return_enum ldp_cfg_entity_get(mpls_cfg_handle handle, ldp_entity * e,
272 uint32_t flag)
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");
368 return retval;
371 mpls_return_enum ldp_cfg_entity_getnext(mpls_cfg_handle handle, ldp_entity * e,
372 uint32_t flag)
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;
378 int index;
380 LDP_ENTER(g->user_data, "ldp_cfg_entity_getnext");
382 if (e->index == 0) {
383 index = 1;
384 } else {
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))) {
391 case MPLS_SUCCESS:
392 case MPLS_END_OF_LIST:
393 done = MPLS_BOOL_TRUE;
394 break;
395 case MPLS_FAILURE:
396 break;
397 default:
398 MPLS_ASSERT(0);
400 index++;
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");
410 return r;
413 mpls_return_enum ldp_cfg_entity_test(mpls_cfg_handle handle, ldp_entity * e,
414 uint32_t flag)
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)) {
427 if (e == NULL)
428 goto ldp_cfg_entity_test_end;
430 ldp_global_find_entity_index(global, e->index, &entity);
431 } else {
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");
452 return retval;
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,
457 uint32_t flag)
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;
474 } else {
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) {
491 case LDP_DIRECT:
492 ldp_entity_del_if(global, entity);
493 break;
494 case LDP_INDIRECT:
495 ldp_entity_del_peer(entity);
496 break;
497 default:
498 MPLS_ASSERT(0);
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) {
510 case LDP_DIRECT:
511 ldp_entity_del_if(global, entity);
512 break;
513 case LDP_INDIRECT:
514 ldp_entity_del_peer(entity);
515 break;
516 default:
517 MPLS_ASSERT(0);
521 /* link the new sub object */
522 switch (e->entity_type) {
523 case LDP_DIRECT:
525 ldp_if *iff = NULL;
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);
537 break;
539 case LDP_INDIRECT:
541 ldp_peer *peer = NULL;
543 if (ldp_global_find_peer_index(global, e->sub_index, &peer) !=
544 MPLS_SUCCESS) {
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);
553 break;
555 default:
556 MPLS_ASSERT(0);
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;
563 } else {
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;
584 } else {
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;
592 } else {
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;
600 } else {
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;
608 } else {
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;
648 } else {
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");
666 return retval;
669 mpls_return_enum ldp_cfg_entity_adj_getnext(mpls_cfg_handle handle,
670 ldp_entity * e)
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;
676 ldp_adj *adj = 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
684 if (!e->adj_index) {
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);
692 while (adj) {
693 if (this_one == MPLS_BOOL_TRUE) {
694 adj_next = adj;
695 break;
698 /* since the entities are sort in the list ... */
699 if (adj->index > e->adj_index) {
700 break;
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 */
709 if (adj_next) {
710 e->adj_index = adj_next->index;
711 r = MPLS_SUCCESS;
714 LDP_EXIT(g->user_data, "ldp_cfg_entity_adj_getnext");
715 return r;
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;
723 ldp_if *iff = NULL;
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);
734 } else {
735 iff = ldp_global_find_if_handle(global, i->handle);
737 if (!iff)
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;
754 ldp_cfg_if_get_end:
755 mpls_lock_release(global->global_lock); /* UNLOCK */
757 LDP_EXIT(global->user_data, "ldp_cfg_if_get");
759 return retval;
762 mpls_return_enum ldp_cfg_if_getnext(mpls_cfg_handle handle, ldp_if * i,
763 uint32_t flag)
765 ldp_global *g = (ldp_global *) handle;
766 ldp_if *iff = NULL;
767 mpls_return_enum r = MPLS_FAILURE;
768 mpls_bool done = MPLS_BOOL_FALSE;
769 int index;
771 LDP_ENTER(g->user_data, "ldp_cfg_if_getnext");
773 if (i->index == 0) {
774 index = 1;
775 } else {
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))) {
782 case MPLS_SUCCESS:
783 case MPLS_END_OF_LIST:
784 done = MPLS_BOOL_TRUE;
785 break;
786 case MPLS_FAILURE:
787 break;
788 default:
789 MPLS_ASSERT(0);
791 index++;
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");
801 return r;
804 mpls_return_enum ldp_cfg_if_test(mpls_cfg_handle handle, ldp_if * i,
805 uint32_t flag)
807 ldp_global *global = (ldp_global *) handle;
808 ldp_if *iff = NULL;
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);
819 } else {
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;
836 ldp_cfg_if_test_end:
837 mpls_lock_release(global->global_lock); /* UNLOCK */
839 LDP_EXIT(global->user_data, "ldp_cfg_if_test");
841 return retval;
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;
847 ldp_if *iff = NULL;
848 ldp_addr *ap;
849 ldp_nexthop *np;
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) ==
866 MPLS_BOOL_FALSE) {
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);
880 while (ap) {
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);
888 while (np) {
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);
900 } else {
901 if (flag & LDP_IF_CFG_BY_INDEX) {
902 ldp_global_find_if_index(global, i->index, &iff);
903 } else {
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
911 * active interface
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
925 * to be removed
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;
948 ldp_cfg_if_set_end:
949 mpls_lock_release(global->global_lock); /* UNLOCK */
951 LDP_EXIT(global->user_data, "ldp_cfg_if_set");
953 return retval;
956 /******************* ATTR **********************/
958 mpls_return_enum ldp_cfg_attr_get(mpls_cfg_handle handle, ldp_attr * a,
959 uint32_t flag)
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");
1008 return retval;
1011 mpls_return_enum ldp_cfg_attr_getnext(mpls_cfg_handle handle, ldp_attr * a,
1012 uint32_t flag)
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;
1018 int index;
1020 LDP_ENTER(g->user_data, "ldp_cfg_attr_getnext");
1022 if (a->index == 0) {
1023 index = 1;
1024 } else {
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))) {
1031 case MPLS_SUCCESS:
1032 case MPLS_END_OF_LIST:
1033 done = MPLS_BOOL_TRUE;
1034 break;
1035 case MPLS_FAILURE:
1036 break;
1037 default:
1038 MPLS_ASSERT(0);
1040 index++;
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");
1050 return r;
1053 /******************* PEER **********************/
1055 mpls_return_enum ldp_cfg_peer_get(mpls_cfg_handle handle, ldp_peer * p,
1056 uint32_t flag)
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");
1096 return retval;
1099 mpls_return_enum ldp_cfg_peer_getnext(mpls_cfg_handle handle, ldp_peer * p,
1100 uint32_t flag)
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;
1106 int index;
1108 LDP_ENTER(g->user_data, "ldp_cfg_peer_getnext");
1110 if (p->index == 0) {
1111 index = 1;
1112 } else {
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))) {
1119 case MPLS_SUCCESS:
1120 case MPLS_END_OF_LIST:
1121 done = MPLS_BOOL_TRUE;
1122 break;
1123 case MPLS_FAILURE:
1124 break;
1125 default:
1126 MPLS_ASSERT(0);
1128 index++;
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");
1138 return r;
1141 mpls_return_enum ldp_cfg_peer_test(mpls_cfg_handle handle, ldp_peer * p,
1142 uint32_t flag)
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,
1149 uint32_t flag)
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);
1167 } else {
1168 ldp_global_find_peer_index(global, p->index, &peer);
1171 if (peer == NULL) {
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",
1207 p->peer_name);
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");
1219 return retval;
1221 /******************* FEC **********************/
1223 mpls_return_enum ldp_cfg_fec_get(mpls_cfg_handle handle, mpls_fec * f,
1224 uint32_t flag)
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);
1238 } else {
1239 fec = ldp_fec_find(global, f);
1241 if (!fec)
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");
1254 return retval;
1257 mpls_return_enum ldp_cfg_fec_getnext(mpls_cfg_handle handle, mpls_fec * f,
1258 uint32_t flag)
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;
1264 int index;
1266 LDP_ENTER(g->user_data, "ldp_cfg_fec_getnext");
1268 if (f->index == 0) {
1269 index = 1;
1270 } else {
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))) {
1277 case MPLS_SUCCESS:
1278 case MPLS_END_OF_LIST:
1279 done = MPLS_BOOL_TRUE;
1280 break;
1281 case MPLS_FAILURE:
1282 break;
1283 default:
1284 MPLS_ASSERT(0);
1286 index++;
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");
1296 return r;
1299 mpls_return_enum ldp_cfg_fec_test(mpls_cfg_handle handle, mpls_fec * f,
1300 uint32_t flag)
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,
1307 uint32_t flag)
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;
1324 } else {
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;
1332 } else {
1333 if (flag & LDP_FEC_CFG_BY_INDEX) {
1334 ldp_global_find_fec_index(global, f->index, &fec);
1335 } else {
1336 fec = ldp_fec_find(global, f);
1340 if (fec == NULL) {
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
1357 * ldp_fec_delete
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");
1368 return retval;
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);
1387 } else {
1388 fec = ldp_fec_find(global, f);
1390 if (!fec)
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);
1395 } else {
1396 nh = ldp_fec_nexthop_find(fec, n);
1398 if (!nh)
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");
1410 return retval;
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;
1421 int index;
1423 LDP_ENTER(global->user_data, "ldp_cfg_fec_nexthop_getnext");
1425 if (n->index == 0) {
1426 index = 1;
1427 } else {
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);
1435 } else {
1436 fec = ldp_fec_find(global, f);
1438 if (!fec)
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))) {
1443 case MPLS_SUCCESS:
1444 case MPLS_END_OF_LIST:
1445 done = MPLS_BOOL_TRUE;
1446 break;
1447 case MPLS_FAILURE:
1448 break;
1449 default:
1450 MPLS_ASSERT(0);
1452 index++;
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");
1465 return r;
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);
1491 } else {
1492 fec = ldp_fec_find(global, f);
1494 if (!fec)
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);
1505 } else {
1506 if (flag & LDP_FEC_NEXTHOP_CFG_BY_INDEX) {
1507 ldp_fec_find_nexthop_index(fec, n->index, &nh);
1508 } else {
1509 nh = ldp_fec_nexthop_find(fec, n);
1513 if (nh == NULL) {
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) {
1523 MPLS_ASSERT(0);
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");
1535 return retval;
1538 /******************* ADDR **********************/
1540 mpls_return_enum ldp_cfg_addr_get(mpls_cfg_handle handle, ldp_addr * a,
1541 uint32_t flag)
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);
1557 if (!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;
1571 if (addr->iff) {
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");
1582 return retval;
1585 mpls_return_enum ldp_cfg_addr_getnext(mpls_cfg_handle handle, ldp_addr *a,
1586 uint32_t flag)
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;
1592 int index;
1594 LDP_ENTER(global->user_data, "ldp_cfg_addr_getnext");
1596 if (a->index == 0) {
1597 index = 1;
1598 } else {
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))) {
1606 case MPLS_SUCCESS:
1607 case MPLS_END_OF_LIST:
1608 done = MPLS_BOOL_TRUE;
1609 break;
1610 case MPLS_FAILURE:
1611 break;
1612 default:
1613 MPLS_ASSERT(0);
1615 index++;
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");
1626 return r;
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;
1636 ldp_if *iff = 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);
1647 } else {
1648 iff = ldp_global_find_if_handle(global, i->handle);
1650 if (!iff)
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);
1655 } else {
1656 addr = ldp_if_addr_find(iff, &a->address);
1658 if (!addr)
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");
1671 return retval;
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;
1678 ldp_if *iff = NULL;
1679 ldp_addr *addr = NULL;
1680 mpls_return_enum r = MPLS_FAILURE;
1681 mpls_bool done = MPLS_BOOL_FALSE;
1682 int index;
1684 LDP_ENTER(global->user_data, "ldp_cfg_if_addr_getnext");
1686 if (a->index == 0) {
1687 index = 1;
1688 } else {
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);
1696 } else {
1697 iff = ldp_global_find_if_handle(global, i->handle);
1699 if (!iff)
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))) {
1704 case MPLS_SUCCESS:
1705 case MPLS_END_OF_LIST:
1706 done = MPLS_BOOL_TRUE;
1707 break;
1708 case MPLS_FAILURE:
1709 break;
1710 default:
1711 MPLS_ASSERT(0);
1713 index++;
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");
1726 return r;
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;
1733 ldp_if *iff = NULL;
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);
1745 } else {
1746 iff = ldp_global_find_if_handle(global, i->handle);
1748 if (!iff) {
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);
1761 } else {
1762 if (flag & LDP_IF_ADDR_CFG_BY_INDEX) {
1763 ldp_if_find_addr_index(iff, a->index, &addr);
1764 } else {
1765 addr = ldp_if_addr_find(iff, &a->address);
1769 if (addr == NULL) {
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");
1786 return retval;
1789 /******************* ADJACENCY **********************/
1791 mpls_return_enum ldp_cfg_adj_get(mpls_cfg_handle handle, ldp_adj * a,
1792 uint32_t flag)
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");
1845 return retval;
1848 mpls_return_enum ldp_cfg_adj_getnext(mpls_cfg_handle handle, ldp_adj * a,
1849 uint32_t flag)
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;
1855 int index;
1857 LDP_ENTER(g->user_data, "ldp_cfg_adj_getnext");
1859 if (a->index == 0) {
1860 index = 1;
1861 } else {
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))) {
1868 case MPLS_SUCCESS:
1869 case MPLS_END_OF_LIST:
1870 done = MPLS_BOOL_TRUE;
1871 break;
1872 case MPLS_FAILURE:
1873 break;
1874 default:
1875 MPLS_ASSERT(0);
1877 index++;
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");
1887 return r;
1890 /******************* SESSION **********************/
1892 mpls_return_enum ldp_cfg_session_get(mpls_cfg_handle handle, ldp_session * s,
1893 uint32_t flag)
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,
1971 &s->local_name);
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,
1978 &s->remote_name);
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");
1988 return retval;
1991 mpls_return_enum ldp_cfg_session_getnext(mpls_cfg_handle handle, ldp_session * s,
1992 uint32_t flag)
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;
1998 int index;
2000 LDP_ENTER(g->user_data, "ldp_cfg_session_getnext");
2002 if (s->index == 0) {
2003 index = 1;
2004 } else {
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))) {
2011 case MPLS_SUCCESS:
2012 case MPLS_END_OF_LIST:
2013 done = MPLS_BOOL_TRUE;
2014 break;
2015 case MPLS_FAILURE:
2016 break;
2017 default:
2018 MPLS_ASSERT(0);
2020 index++;
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");
2033 return r;
2036 mpls_return_enum ldp_cfg_session_adj_getnext(mpls_cfg_handle handle,
2037 ldp_session * s)
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);
2059 while (adj) {
2060 if (this_one == MPLS_BOOL_TRUE) {
2061 adj_next = adj;
2062 break;
2065 /* since the entities are sort in the list ... */
2066 if (adj->index > s->adj_index) {
2067 break;
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 */
2076 if (adj_next) {
2077 s->adj_index = adj_next->index;
2078 r = MPLS_SUCCESS;
2081 LDP_EXIT(g->user_data, "ldp_cfg_session_adj_getnext");
2082 return r;
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");
2118 return retval;
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;
2129 int index;
2131 LDP_ENTER(g->user_data, "ldp_cfg_session_raddr_getnext");
2133 if (a->index == 0) {
2134 index = 1;
2135 } else {
2136 index = a->index + 1;
2139 r = ldp_global_find_session_index(g, s->index, &sp);
2140 if (r != MPLS_SUCCESS) {
2141 return r;
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))) {
2147 case MPLS_SUCCESS:
2148 case MPLS_END_OF_LIST:
2149 done = MPLS_BOOL_TRUE;
2150 break;
2151 case MPLS_FAILURE:
2152 break;
2153 default:
2154 MPLS_ASSERT(0);
2156 index++;
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");
2166 return r;
2169 /******************* IN LABEL **********************/
2171 mpls_return_enum ldp_cfg_inlabel_get(mpls_cfg_handle handle, ldp_inlabel * i,
2172 uint32_t flag)
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");
2204 return retval;
2207 mpls_return_enum ldp_cfg_inlabel_getnext(mpls_cfg_handle handle, ldp_inlabel * i,
2208 uint32_t flag)
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;
2214 int index;
2216 LDP_ENTER(g->user_data, "ldp_cfg_inlabel_getnext");
2218 if (i->index == 0) {
2219 index = 1;
2220 } else {
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))) {
2227 case MPLS_SUCCESS:
2228 case MPLS_END_OF_LIST:
2229 done = MPLS_BOOL_TRUE;
2230 break;
2231 case MPLS_FAILURE:
2232 break;
2233 default:
2234 MPLS_ASSERT(0);
2236 index++;
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");
2249 return r;
2252 /******************* OUT LABEL **********************/
2254 mpls_return_enum ldp_cfg_outlabel_get(mpls_cfg_handle handle, ldp_outlabel * o,
2255 uint32_t flag)
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) {
2271 if (outlabel->nh) {
2272 o->nh_index = outlabel->nh->index;
2273 } else {
2274 o->nh_index = 0;
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");
2294 return retval;
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;
2304 int index;
2306 LDP_ENTER(g->user_data, "ldp_cfg_outlabel_getnext");
2308 if (o->index == 0) {
2309 index = 1;
2310 } else {
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))) {
2317 case MPLS_SUCCESS:
2318 case MPLS_END_OF_LIST:
2319 done = MPLS_BOOL_TRUE;
2320 break;
2321 case MPLS_FAILURE:
2322 break;
2323 default:
2324 MPLS_ASSERT(0);
2326 index++;
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");
2339 return r;
2342 /******************* TUNNEL **********************/
2344 mpls_return_enum ldp_cfg_tunnel_set(mpls_cfg_handle handle, ldp_tunnel * t,
2345 uint32_t flag)
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;
2364 } else {
2365 ldp_global_find_tunnel_index(global, t->index, &tunnel);
2368 if (!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);
2413 if (!outlabel) {
2414 goto ldp_cfg_tunnel_set_end;
2416 ldp_tunnel_add_outlabel(tunnel, outlabel);
2417 } else {
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);
2439 if (!resource) {
2440 goto ldp_cfg_tunnel_set_end;
2442 ldp_tunnel_add_resource(tunnel, resource);
2443 } else {
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);
2453 if (!hop_list) {
2454 goto ldp_cfg_tunnel_set_end;
2456 ldp_tunnel_add_hop_list(tunnel, hop_list);
2457 } else {
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;
2471 } else {
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;
2477 } else {
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");
2494 return retval;
2497 mpls_return_enum ldp_cfg_tunnel_test(mpls_cfg_handle handle, ldp_tunnel * t,
2498 uint32_t flag)
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);
2517 if (!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);
2527 if (!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);
2538 if (!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);
2549 if (!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");
2567 return retval;
2570 mpls_return_enum ldp_cfg_tunnel_get(mpls_cfg_handle handle, ldp_tunnel * t,
2571 uint32_t flag)
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);
2585 if (!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;
2603 } else {
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;
2622 } else {
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;
2629 } else {
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");
2647 return retval;
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;
2657 int index;
2659 LDP_ENTER(g->user_data, "ldp_cfg_tunnel_getnext");
2661 if (r->index == 0) {
2662 index = 1;
2663 } else {
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))) {
2670 case MPLS_SUCCESS:
2671 case MPLS_END_OF_LIST:
2672 done = MPLS_BOOL_TRUE;
2673 break;
2674 case MPLS_FAILURE:
2675 break;
2676 default:
2677 MPLS_ASSERT(0);
2679 index++;
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");
2692 return ret;
2695 /******************* RESOURCE **********************/
2697 mpls_return_enum ldp_cfg_resource_set(mpls_cfg_handle handle, ldp_resource * r,
2698 uint32_t flag)
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;
2715 } else {
2716 ldp_global_find_resource_index(global, r->index, &resource);
2719 if (!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");
2740 return retval;
2743 mpls_return_enum ldp_cfg_resource_test(mpls_cfg_handle handle, ldp_resource * r,
2744 uint32_t flag)
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);
2763 if (!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");
2778 return retval;
2781 mpls_return_enum ldp_cfg_resource_get(mpls_cfg_handle handle, ldp_resource * r,
2782 uint32_t flag)
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);
2796 if (!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");
2817 return retval;
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;
2827 int index;
2829 LDP_ENTER(g->user_data, "ldp_cfg_resource_getnext");
2831 if (r->index == 0) {
2832 index = 1;
2833 } else {
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))) {
2840 case MPLS_SUCCESS:
2841 case MPLS_END_OF_LIST:
2842 done = MPLS_BOOL_TRUE;
2843 break;
2844 case MPLS_FAILURE:
2845 break;
2846 default:
2847 MPLS_ASSERT(0);
2849 index++;
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");
2862 return ret;
2865 /******************* HOP **********************/
2867 mpls_return_enum ldp_cfg_hop_set(mpls_cfg_handle handle, ldp_hop * h,
2868 uint32_t flag)
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) {
2880 return retval;
2883 mpls_lock_get(global->global_lock); /* LOCK */
2885 ldp_global_find_hop_list_index(global, h->hop_list_index, &hop_list);
2887 if (!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;
2895 } else {
2896 goto ldp_cfg_hop_set_end;
2900 ldp_hop_list_find_hop_index(hop_list, h->index, &hop);
2901 if (!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);
2908 } else {
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");
2930 return retval;
2933 mpls_return_enum ldp_cfg_hop_test(mpls_cfg_handle handle, ldp_hop * h,
2934 uint32_t flag)
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);
2954 if (!hop_list) {
2955 goto ldp_cfg_hop_test_end;
2958 ldp_hop_list_find_hop_index(hop_list, h->index, &hop);
2959 if (!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");
2974 return retval;
2977 mpls_return_enum ldp_cfg_hop_get(mpls_cfg_handle handle, ldp_hop * h,
2978 uint32_t flag)
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);
2993 if (!hop_list) {
2994 goto ldp_cfg_hop_get_end;
2997 ldp_hop_list_find_hop_index(hop_list, h->index, &hop);
2998 if (!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");
3019 return retval;
3022 /******************* NEXTHOP **********************/
3023 mpls_return_enum ldp_cfg_nexthop_get(mpls_cfg_handle handle, ldp_nexthop * n,
3024 uint32_t flag)
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;
3039 if (nexthop->fec)
3040 n->fec_index = nexthop->fec->index;
3041 if (nexthop->addr)
3042 n->addr_index = nexthop->addr->index;
3043 if (nexthop->outlabel)
3044 n->outlabel_index = nexthop->outlabel->index;
3045 if (nexthop->iff)
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");
3057 return retval;
3060 mpls_return_enum ldp_cfg_nexthop_getnext(mpls_cfg_handle handle, ldp_nexthop * n,
3061 uint32_t flag)
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;
3067 int index;
3069 LDP_ENTER(g->user_data, "ldp_cfg_nexthop_getnext");
3071 if (n->index == 0) {
3072 index = 1;
3073 } else {
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))) {
3080 case MPLS_SUCCESS:
3081 case MPLS_END_OF_LIST:
3082 done = MPLS_BOOL_TRUE;
3083 break;
3084 case MPLS_FAILURE:
3085 break;
3086 default:
3087 MPLS_ASSERT(0);
3089 index++;
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");
3102 return r;