/* * 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_addr.h" #include "ldp_attr.h" #include "ldp_outlabel.h" #include "ldp_inlabel.h" #include "ldp_session.h" #include "ldp_global.h" #include "ldp_mm_impl.h" #include "ldp_trace_impl.h" static uint32_t _ldp_outlabel_next_index = 1; ldp_outlabel* ldp_outlabel_create() { ldp_outlabel* o = (ldp_outlabel*)ldp_malloc(sizeof(ldp_outlabel)); if(o) { memset(o,0,sizeof(ldp_outlabel)); LDP_REFCNT_INIT(o,0); LDP_LIST_INIT(&o->inlabel_root,ldp_inlabel); LDP_LIST_ELEM_INIT(o,_global); LDP_LIST_ELEM_INIT(o,_session); o->index = _ldp_outlabel_get_next_index(); o->l.type = LDP_LABEL_NONE; } return o; } ldp_outlabel* ldp_outlabel_create_complete(ldp_global* g,ldp_session* s, ldp_addr* nh,ldp_attr* a) { ldp_outlabel* out = ldp_outlabel_create(); if(out != NULL) { ldp_outlabel_add_nexthop(out,nh); ldp_attr2ldp_label(a,&out->l); _ldp_global_add_outlabel(g,out); ldp_session_add_outlabel(s,out); ldp_attr_add_outlabel(a,out); } return out; } void ldp_outlabel_delete(ldp_outlabel* o) { // LDP_PRINT(g->user_data,"outlabel delete\n"); LDP_REFCNT_ASSERT(o,0); ldp_free(o); } void ldp_outlabel_delete_complete(ldp_global* g, ldp_outlabel* out) { ldp_attr_del_outlabel(out->attr); if(out->session) { ldp_session_del_outlabel(out->session,out); } _ldp_global_del_outlabel(g,out); ldp_outlabel_del_nexthop(out); } ldp_return_enum _ldp_outlabel_add_inlabel(ldp_outlabel* o,ldp_inlabel* i) { if(o && i) { LDP_REFCNT_HOLD(i); o->merge_count++; LDP_LIST_ADD_HEAD(&o->inlabel_root,i,_outlabel,ldp_inlabel); return LDP_SUCCESS; } return LDP_FAILURE; } ldp_return_enum _ldp_outlabel_del_inlabel(ldp_outlabel* o,ldp_inlabel* i) { if(o && i) { LDP_LIST_REMOVE(&o->inlabel_root,i,_outlabel); o->merge_count--; LDP_REFCNT_RELEASE(i,ldp_inlabel_delete); return LDP_SUCCESS; } return LDP_FAILURE; } ldp_return_enum _ldp_outlabel_add_attr(ldp_outlabel* o,ldp_attr* a) { if(o && a) { LDP_REFCNT_HOLD(a); o->attr = a; return LDP_SUCCESS; } return LDP_FAILURE; } ldp_return_enum _ldp_outlabel_del_attr(ldp_outlabel* o) { if(o && o->attr) { LDP_REFCNT_RELEASE(o->attr,ldp_attr_delete); o->attr = NULL; return LDP_SUCCESS; } return LDP_FAILURE; } ldp_return_enum ldp_outlabel_add_nexthop(ldp_outlabel* o,ldp_addr* nh) { if(o && nh) { LDP_REFCNT_HOLD(nh); o->next_hop = nh; return LDP_SUCCESS; } return LDP_FAILURE; } ldp_return_enum ldp_outlabel_del_nexthop(ldp_outlabel* o) { if(o && o->next_hop) { LDP_REFCNT_RELEASE(o->next_hop,ldp_addr_delete); o->next_hop = 0; return LDP_SUCCESS; } return LDP_FAILURE; } ldp_return_enum _ldp_outlabel_add_session(ldp_outlabel* o,ldp_session* s) { if(o && s) { LDP_REFCNT_HOLD(s); o->session = s; return LDP_SUCCESS; } return LDP_FAILURE; } ldp_return_enum _ldp_outlabel_del_session(ldp_outlabel* o) { if(o && o->session) { LDP_REFCNT_RELEASE(o->session,ldp_session_delete); o->session = NULL; return LDP_SUCCESS; } return LDP_FAILURE; } uint32_t _ldp_outlabel_get_next_index() { uint32_t retval = _ldp_outlabel_next_index; _ldp_outlabel_next_index++; if(retval > _ldp_outlabel_next_index++) { _ldp_outlabel_next_index = 1; } return retval; }