/* * Copyright (C) James R. Leu 2000 * jleu@mindspring.com * * This software is covered under the LGPL, for more * info check out http://www.gnu.org/copyleft/lgpl.html */ #include #include "ldp_struct.h" #include "ldp_entity.h" #include "ldp_range.h" #include "ldp_peer.h" #include "ldp_if.h" #include "ldp_mm_impl.h" #include "ldp_trace_impl.h" ldp_range* ldp_range_create(int32_t label_space,ldp_label_range_type type) { ldp_range* r = (ldp_range*)ldp_malloc(sizeof(ldp_range)); if(r) { LDP_LIST_INIT(&r->peer_root,ldp_peer); LDP_LIST_INIT(&r->if_root,ldp_if); LDP_REFCNT_INIT(r,0); r->label_space = label_space; r->type = type; switch(type) { case LDP_GENERIC: r->min.gen = LDP_RANGE_DEF_GEN_MIN; r->max.gen = LDP_RANGE_DEF_GEN_MIN; break; case LDP_ATM_VP: r->min.atm.vpi = LDP_RANGE_DEF_ATM_VPI_MIN; r->max.atm.vpi = LDP_RANGE_DEF_ATM_VPI_MAX; break; case LDP_ATM_VC: r->min.atm.vci = LDP_RANGE_DEF_ATM_VCI_MIN; r->max.atm.vci = LDP_RANGE_DEF_ATM_VCI_MAX; break; case LDP_ATM_VP_VC: r->min.atm.vpi = LDP_RANGE_DEF_ATM_VPI_MIN; r->max.atm.vpi = LDP_RANGE_DEF_ATM_VPI_MAX; r->min.atm.vci = LDP_RANGE_DEF_ATM_VCI_MIN; r->max.atm.vci = LDP_RANGE_DEF_ATM_VCI_MAX; break; case LDP_FR_10: r->min.fr = LDP_RANGE_DEF_FR_MIN; r->max.fr = LDP_RANGE_DEF_FR_10_MAX; break; case LDP_FR_24: r->min.fr = LDP_RANGE_DEF_FR_MIN; r->max.fr = LDP_RANGE_DEF_FR_24_MAX; break; default: ldp_free(r); return NULL; } } return r; } void ldp_range_delete(ldp_range* r) { // LDP_PRINT(g->user_data,"range delete\n"); LDP_REFCNT_ASSERT(r,0); ldp_free(r); } ldp_bool ldp_range_is_active(ldp_range* r) { ldp_peer* peer = LDP_LIST_HEAD(&r->peer_root); ldp_if* iff = LDP_LIST_HEAD(&r->if_root); /* search through all of my peers and if's for one that is attached to an entity that is LDP_ENABLE, return LDP_TRUE right away */ while(peer != NULL) { if(peer->entity && peer->entity->admin_state == LDP_ENABLE) return LDP_TRUE; peer = LDP_LIST_NEXT(&r->peer_root,peer,_range); } while(iff != NULL) { if(iff->entity && iff->entity->admin_state == LDP_ENABLE) return LDP_TRUE; iff = LDP_LIST_NEXT(&r->if_root,iff,_range); } return LDP_FALSE; } ldp_return_enum _ldp_range_add_if(ldp_range* r,ldp_if* i) { if(r && i) { LDP_REFCNT_HOLD(i); LDP_LIST_ADD_HEAD(&r->if_root,i,_range,ldp_if); return LDP_SUCCESS; } return LDP_FAILURE; } ldp_return_enum _ldp_range_del_if(ldp_range *r,ldp_if* i) { if(r && i) { LDP_LIST_REMOVE(&r->if_root,i,_range); LDP_REFCNT_RELEASE(i,ldp_if_delete); return LDP_SUCCESS; } return LDP_FAILURE; } ldp_return_enum _ldp_range_add_peer(ldp_range* r,ldp_peer* p) { if(r && p) { LDP_REFCNT_HOLD(p); LDP_LIST_ADD_HEAD(&r->peer_root,p,_range,ldp_peer); return LDP_SUCCESS; } return LDP_FAILURE; } ldp_return_enum _ldp_range_del_peer(ldp_range *r,ldp_peer* p) { if(r && p) { LDP_LIST_REMOVE(&r->peer_root,p,_range); LDP_REFCNT_RELEASE(p,ldp_peer_delete); return LDP_SUCCESS; } return LDP_FAILURE; }