⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lsr_cfg.c

📁 Linux平台下
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *  Copyright (C) James R. Leu 2002 *  jleu@mindspring.com * *  This software is covered under the LGPL, for more *  info check out http://www.gnu.org/copyleft/lgpl.html */#include "lsr_struct.h"#include "lsr_cfg.h"#include "lsr_global.h"#include "lsr_outsegment.h"#include "lsr_insegment.h"#include "lsr_xconnect.h"#include "lsr_if.h"#include "lsr_ftn.h"#include "mpls_mm_impl.h"#include "mpls_mpls_impl.h"#include "mpls_ifmgr_impl.h"#include "mpls_lock_impl.h"#include "mpls_trace_impl.h"mpls_cfg_handle lsr_cfg_open(mpls_instance_handle data){  lsr_global *g = NULL;  LDP_ENTER(data, "lsr_cfg_open");  g = lsr_global_create(data);  LDP_EXIT(data, "lsr_cfg_open");  return (mpls_cfg_handle) g;}void lsr_cfg_close(mpls_cfg_handle g){  LDP_ENTER((mpls_instance_handle) g->user_data, "lsr_cfg_close");  lsr_global_delete(g);  LDP_EXIT((mpls_instance_handle) g->user_data, "lsr_cfg_close");}/******************* GLOBAL **********************/mpls_return_enum lsr_cfg_global_get(mpls_cfg_handle handle, lsr_global * g,  uint32_t flag){  lsr_global *global = (lsr_global *) handle;  MPLS_ASSERT(global !=NULL);  LDP_ENTER(global->user_data, "lsr_cfg_global_get");  mpls_lock_get(global->global_lock); /* LOCK */  if (flag & LSR_GLOBAL_CFG_ADMIN_STATE) {    g->admin_state = global->admin_state;  }  mpls_lock_release(global->global_lock); /* UNLOCK */  LDP_EXIT(global->user_data, "lsr_cfg_global_get");  return MPLS_SUCCESS;}mpls_return_enum lsr_cfg_global_test(mpls_cfg_handle handle, lsr_global * g,  uint32_t flag){  lsr_global *global = (lsr_global *) handle;  mpls_return_enum retval = MPLS_SUCCESS;  MPLS_ASSERT(global !=NULL);  LDP_ENTER(global->user_data, "lsr_cfg_global_test");  mpls_lock_get(global->global_lock); /* LOCK */  if ((global->admin_state == MPLS_ADMIN_ENABLE) &&      (flag & LSR_GLOBAL_CFG_WHEN_DOWN))    retval = MPLS_FAILURE;  mpls_lock_release(global->global_lock); /* UNLOCK */  LDP_EXIT(global->user_data, "lsr_cfg_global_test");  return retval;}mpls_return_enum lsr_cfg_global_set(mpls_cfg_handle handle, lsr_global * g,  uint32_t flag){  lsr_global *global = (lsr_global *) handle;  mpls_return_enum retval = MPLS_FAILURE;  MPLS_ASSERT(global !=NULL);  LDP_ENTER(global->user_data, "lsr_cfg_global_set");  mpls_lock_get(global->global_lock); /* LOCK */  if ((global->admin_state == MPLS_ADMIN_ENABLE) &&      (flag & LSR_GLOBAL_CFG_WHEN_DOWN))    goto lsr_cfg_global_set_end;  if (flag & LSR_GLOBAL_CFG_ADMIN_STATE) {    if ((global->admin_state == MPLS_ADMIN_ENABLE) &&        (g->admin_state == MPLS_ADMIN_DISABLE)) {      lsr_global_shutdown(global);    } else if ((global->admin_state == MPLS_ADMIN_DISABLE) &&               (g->admin_state == MPLS_ADMIN_ENABLE)) {      lsr_global_startup(global);    }  }  retval = MPLS_SUCCESS;lsr_cfg_global_set_end:  mpls_lock_release(global->global_lock); /* UNLOCK */  LDP_EXIT(global->user_data, "lsr_cfg_global_set");  return retval;}/******************* OUTSEGMENT **********************/mpls_return_enum lsr_cfg_outsegment_get(mpls_cfg_handle handle, lsr_outsegment * o, uint32_t flag){  lsr_global *global = (lsr_global *) handle;  lsr_outsegment *oseg = NULL;  mpls_return_enum retval = MPLS_FAILURE;  MPLS_ASSERT(global !=NULL && o != NULL);  LDP_ENTER(global->user_data, "lsr_cfg_outsegment_get");  mpls_lock_get(global->global_lock); /* LOCK */  if (lsr_global_find_outsegment_index(global, o->index, &oseg) != MPLS_SUCCESS)      goto lsr_cfg_outsegment_get_end;  if (LSR_OUTSEGMENT_CFG_INDEX & flag) {    o->index = oseg->index;  }  if (LSR_OUTSEGMENT_CFG_PUSH_LABEL & flag) {    o->info.push_label = oseg->info.push_label;  }  if (LSR_OUTSEGMENT_CFG_OWNER & flag) {    o->info.owner = oseg->info.owner;  }  if (LSR_OUTSEGMENT_CFG_INTERFACE & flag) {    o->if_index = oseg->iff ? oseg->iff->index : 0;  }  if (LSR_OUTSEGMENT_CFG_LABEL & flag) {    memcpy(&o->info.label, &oseg->info.label, sizeof(mpls_label_struct));  }  if (LSR_OUTSEGMENT_CFG_NEXTHOP & flag) {    memcpy(&o->info.nexthop, &oseg->info.nexthop, sizeof(mpls_nexthop));  }  retval = MPLS_SUCCESS;lsr_cfg_outsegment_get_end:  mpls_lock_release(global->global_lock); /* UNLOCK */  LDP_EXIT(global->user_data, "lsr_cfg_outsegment_get");  return retval;}mpls_return_enum lsr_cfg_outsegment_getnext(mpls_cfg_handle handle, lsr_outsegment * i,  uint32_t flag){  lsr_global *g = (lsr_global *) handle;  lsr_outsegment *oseg = NULL;  mpls_return_enum r = MPLS_FAILURE;  mpls_bool done = MPLS_BOOL_FALSE;  int index;  LDP_ENTER(g->user_data, "lsr_cfg_outsegment_getnext");  if (i->index == 0) {    index = 1;  } else {    index = i->index + 1;  }  mpls_lock_get(g->global_lock); /* LOCK */  while (done == MPLS_BOOL_FALSE) {    switch ((r = lsr_global_find_outsegment_index(g, index, &oseg))) {      case MPLS_SUCCESS:      case MPLS_END_OF_LIST:        done = MPLS_BOOL_TRUE;        break;      case MPLS_FAILURE:        break;      default:        MPLS_ASSERT(0);    }    index++;  }  mpls_lock_release(g->global_lock); /* UNLOCK */  if (r == MPLS_SUCCESS) {    i->index = oseg->index;    LDP_EXIT(g->user_data, "lsr_cfg_outsegment_getnext");    return lsr_cfg_outsegment_get(g, i, flag);  }  LDP_EXIT(g->user_data, "lsr_cfg_outsegment_getnext");  return r;}mpls_return_enum lsr_cfg_outsegment_test(mpls_cfg_handle handle, lsr_outsegment * i,  uint32_t flag){  lsr_global *global = (lsr_global *) handle;  lsr_outsegment *oseg = NULL;  mpls_return_enum retval = MPLS_FAILURE;  MPLS_ASSERT(global !=NULL && i != NULL);  LDP_ENTER(global->user_data, "lsr_cfg_outsegment_test");  mpls_lock_get(global->global_lock); /* LOCK */  if (!(flag & LSR_CFG_ADD)) {    lsr_global_find_outsegment_index(global, i->index, &oseg);  } else {    retval = MPLS_SUCCESS;    goto lsr_cfg_outsegment_test_end;  }  retval = MPLS_SUCCESS;lsr_cfg_outsegment_test_end:  mpls_lock_release(global->global_lock); /* UNLOCK */  LDP_EXIT(global->user_data, "lsr_cfg_outsegment_test");  return retval;}mpls_return_enum lsr_cfg_outsegment_set(mpls_cfg_handle handle, lsr_outsegment * o, uint32_t flag){  lsr_global *global = (lsr_global*)handle;  lsr_outsegment *oseg = NULL;  mpls_return_enum retval = MPLS_FAILURE;  MPLS_ASSERT(global !=NULL && o != NULL);  LDP_ENTER(global->user_data, "lsr_cfg_outsegment_set");  mpls_lock_get(global->global_lock); /* LOCK */  if (flag & LSR_CFG_ADD) {    if ((oseg = lsr_outsegment_create()) == NULL) {      goto lsr_cfg_outsegment_set_end;    }    o->index = oseg->index;  } else {    lsr_global_find_outsegment_index(global, o->index, &oseg);  }  if (oseg == NULL)    goto lsr_cfg_outsegment_set_end;  if (flag & LSR_CFG_DEL) {    _lsr_global_del_outsegment(global, oseg);    mpls_mpls_outsegment_del(global->mpls_handle,&oseg->info);    retval = MPLS_SUCCESS;    goto lsr_cfg_outsegment_set_end;  }  if (LSR_OUTSEGMENT_CFG_PUSH_LABEL & flag) {    oseg->info.push_label = o->info.push_label;  }  if (LSR_OUTSEGMENT_CFG_OWNER & flag) {    oseg->info.owner = o->info.owner;  }  if (LSR_OUTSEGMENT_CFG_INTERFACE & flag) {    lsr_if *iff = NULL;    if (lsr_global_find_if_index(global, o->if_index, &iff) == MPLS_SUCCESS) {      lsr_if_add_outsegment(iff,oseg);    }  }  if (LSR_OUTSEGMENT_CFG_LABEL & flag) {    memcpy(&oseg->info.label, &o->info.label, sizeof(mpls_label_struct));  }  if (LSR_OUTSEGMENT_CFG_NEXTHOP & flag) {    memcpy(&oseg->info.nexthop, &o->info.nexthop, sizeof(mpls_nexthop));  }  retval = MPLS_SUCCESS;  if (flag & LSR_CFG_ADD) {    retval = mpls_mpls_outsegment_add(global->mpls_handle,&oseg->info);    if (retval == MPLS_SUCCESS) {      _lsr_global_add_outsegment(global, oseg);    }  }lsr_cfg_outsegment_set_end:  mpls_lock_release(global->global_lock); /* UNLOCK */  LDP_EXIT(global->user_data, "lsr_cfg_outsegment_set");  return retval;}/******************* INSEGMENT **********************/mpls_return_enum lsr_cfg_insegment_get(mpls_cfg_handle handle, lsr_insegment * i, uint32_t flag){  lsr_global *global = (lsr_global *) handle;  lsr_insegment *iseg = NULL;  mpls_return_enum retval = MPLS_FAILURE;  MPLS_ASSERT(global !=NULL && i != NULL);  LDP_ENTER(global->user_data, "lsr_cfg_insegment_get");  mpls_lock_get(global->global_lock); /* LOCK */  if (lsr_global_find_insegment_index(global, i->index, &iseg) != MPLS_SUCCESS)      goto lsr_cfg_insegment_get_end;  if (LSR_INSEGMENT_CFG_INDEX & flag) {    i->index = iseg->index;  }  if (LSR_INSEGMENT_CFG_NPOP & flag) {    i->info.npop = iseg->info.npop;  }  if (LSR_INSEGMENT_CFG_FAMILY & flag) {    i->info.family = iseg->info.family;  }  if (LSR_INSEGMENT_CFG_LABELSPACE & flag) {    i->info.labelspace = iseg->info.labelspace;  }  if (LSR_INSEGMENT_CFG_LABEL & flag) {    memcpy(&i->info.label, &iseg->info.label, sizeof(mpls_label_struct));  }  if (LSR_INSEGMENT_CFG_OWNER & flag) {    i->info.owner = iseg->info.owner;  }  retval = MPLS_SUCCESS;lsr_cfg_insegment_get_end:  mpls_lock_release(global->global_lock); /* UNLOCK */  LDP_EXIT(global->user_data, "lsr_cfg_insegment_get");  return retval;}mpls_return_enum lsr_cfg_insegment_getnext(mpls_cfg_handle handle, lsr_insegment * i,  uint32_t flag){  lsr_global *g = (lsr_global *) handle;  lsr_insegment *iseg = NULL;  mpls_return_enum r = MPLS_FAILURE;  mpls_bool done = MPLS_BOOL_FALSE;  int index;  LDP_ENTER(g->user_data, "lsr_cfg_insegment_getnext");  if (i->index == 0) {    index = 1;  } else {    index = i->index + 1;  }  mpls_lock_get(g->global_lock); /* LOCK */  while (done == MPLS_BOOL_FALSE) {    switch ((r = lsr_global_find_insegment_index(g, index, &iseg))) {      case MPLS_SUCCESS:      case MPLS_END_OF_LIST:        done = MPLS_BOOL_TRUE;        break;      case MPLS_FAILURE:        break;      default:        MPLS_ASSERT(0);    }    index++;  }  mpls_lock_release(g->global_lock); /* UNLOCK */  if (r == MPLS_SUCCESS) {    i->index = iseg->index;    LDP_EXIT(g->user_data, "lsr_cfg_insegment_getnext");    return lsr_cfg_insegment_get(g, i, flag);  }  LDP_EXIT(g->user_data, "lsr_cfg_insegment_getnext");  return r;}mpls_return_enum lsr_cfg_insegment_test(mpls_cfg_handle handle, lsr_insegment * i,  uint32_t flag){  lsr_global *global = (lsr_global *) handle;  lsr_insegment *iseg = NULL;  mpls_return_enum retval = MPLS_FAILURE;  MPLS_ASSERT(global !=NULL && i != NULL);  LDP_ENTER(global->user_data, "lsr_cfg_insegment_test");  mpls_lock_get(global->global_lock); /* LOCK */  if (!(flag & LSR_CFG_ADD)) {    lsr_global_find_insegment_index(global, i->index, &iseg);  } else {    retval = MPLS_SUCCESS;    goto lsr_cfg_insegment_test_end;  }  retval = MPLS_SUCCESS;lsr_cfg_insegment_test_end:  mpls_lock_release(global->global_lock); /* UNLOCK */  LDP_EXIT(global->user_data, "lsr_cfg_insegment_test");  return retval;}mpls_return_enum lsr_cfg_insegment_set(mpls_cfg_handle handle, lsr_insegment * i, uint32_t flag){  lsr_global *global = (lsr_global*)handle;  lsr_insegment *iseg = NULL;  mpls_return_enum retval = MPLS_FAILURE;  MPLS_ASSERT(global !=NULL && i != NULL);  LDP_ENTER(global->user_data, "lsr_cfg_insegment_set");  mpls_lock_get(global->global_lock); /* LOCK */  if (flag & LSR_CFG_ADD) {    if ((iseg = lsr_insegment_create()) == NULL) {      goto lsr_cfg_insegment_set_end;    }    i->index = iseg->index;  } else {    lsr_global_find_insegment_index(global, i->index, &iseg);  }  if (iseg == NULL)    goto lsr_cfg_insegment_set_end;  if (flag & LSR_CFG_DEL) {    mpls_mpls_insegment_del(global->mpls_handle,&iseg->info);    _lsr_global_del_insegment(global, iseg);    retval = MPLS_SUCCESS;    goto lsr_cfg_insegment_set_end;  }  if (LSR_INSEGMENT_CFG_NPOP & flag) {    iseg->info.npop = i->info.npop;  }  if (LSR_INSEGMENT_CFG_FAMILY & flag) {    iseg->info.family = i->info.family;  }  if (LSR_INSEGMENT_CFG_LABELSPACE & flag) {    iseg->info.labelspace = i->info.labelspace;  }  if (LSR_INSEGMENT_CFG_LABEL & flag) {    memcpy(&iseg->info.label, &i->info.label, sizeof(mpls_label_struct));  }  if (LSR_INSEGMENT_CFG_OWNER & flag) {    iseg->info.owner = i->info.owner;  }  retval = MPLS_SUCCESS;  if (flag & LSR_CFG_ADD) {    retval = mpls_mpls_insegment_add(global->mpls_handle,&iseg->info);    if (retval == MPLS_SUCCESS) {      memcpy(&i->info.label, &iseg->info.label, sizeof(mpls_label_struct));      _lsr_global_add_insegment(global, iseg);    }  }lsr_cfg_insegment_set_end:  mpls_lock_release(global->global_lock); /* UNLOCK */  LDP_EXIT(global->user_data, "lsr_cfg_insegment_set");  return retval;}/******************* XCONNECT **********************/void do_lsr_cfg_xconnect_get(lsr_xconnect * x, lsr_xconnect * xcon,  uint32_t flag){  if (LSR_XCONNECT_CFG_INDEX & flag) {    x->index = xcon->index;  }  if (LSR_XCONNECT_CFG_OUTSEGMENT & flag) {    x->outsegment_index = xcon->outsegment ? xcon->outsegment->index : 0;  }  if (LSR_XCONNECT_CFG_INSEGMENT & flag) {    x->insegment_index = xcon->insegment->index;  }  if (LSR_XCONNECT_CFG_LSPID & flag) {    x->info.lspid = xcon->info.lspid;  }  if (LSR_XCONNECT_CFG_LABELSTACK & flag) {    x->info.stack_size = xcon->info.stack_size;    memcpy(x->info.stack,xcon->info.stack,      sizeof(mpls_label_struct) * xcon->info.stack_size);  }  if (LSR_XCONNECT_CFG_OWNER & flag) {    x->info.owner = xcon->info.owner;  }}mpls_return_enum lsr_cfg_xconnect_get(mpls_cfg_handle handle, lsr_xconnect * x, uint32_t flag){  lsr_global *global = (lsr_global *) handle;  lsr_xconnect *xcon = NULL;  mpls_return_enum retval = MPLS_FAILURE;  MPLS_ASSERT(global !=NULL && x != NULL);  LDP_ENTER(global->user_data, "lsr_cfg_xconnect_get");  mpls_lock_get(global->global_lock); /* LOCK */  if (lsr_global_find_xconnect_index(global, x->index, &xcon) != MPLS_SUCCESS)      goto lsr_cfg_xconnect_get_end;  do_lsr_cfg_xconnect_get(x, xcon, flag);  retval = MPLS_SUCCESS;lsr_cfg_xconnect_get_end:  mpls_lock_release(global->global_lock); /* UNLOCK */  LDP_EXIT(global->user_data, "lsr_cfg_xconnect_get");  return retval;}mpls_return_enum lsr_cfg_xconnect_get2(mpls_cfg_handle handle, lsr_xconnect *x, uint32_t flag){  lsr_global *global = (lsr_global *) handle;  lsr_xconnect *xcon = NULL;  mpls_return_enum retval = MPLS_FAILURE;  MPLS_ASSERT(global !=NULL && x != NULL);  LDP_ENTER(global->user_data, "lsr_cfg_xconnect_get2");  mpls_lock_get(global->global_lock); /* LOCK */  if (lsr_global_find_xconnect_index2(global, x->insegment_index,    x->outsegment_index, &xcon) != MPLS_SUCCESS)      goto lsr_cfg_xconnect_get_end;  do_lsr_cfg_xconnect_get(x, xcon, flag);  retval = MPLS_SUCCESS;lsr_cfg_xconnect_get_end:  mpls_lock_release(global->global_lock); /* UNLOCK */  LDP_EXIT(global->user_data, "lsr_cfg_xconnect_get2");  return retval;}mpls_return_enum lsr_cfg_xconnect_getnext(mpls_cfg_handle handle, lsr_xconnect * i, uint32_t flag){  lsr_global *g = (lsr_global *) handle;  lsr_xconnect *xcon = NULL;  mpls_return_enum r = MPLS_FAILURE;  mpls_bool done = MPLS_BOOL_FALSE;  int index;  LDP_ENTER(g->user_data, "lsr_cfg_xconnect_getnext");  if (i->index == 0) {    index = 1;  } else {    index = i->index + 1;  }  mpls_lock_get(g->global_lock); /* LOCK */  while (done == MPLS_BOOL_FALSE) {    switch ((r = lsr_global_find_xconnect_index(g, index, &xcon))) {      case MPLS_SUCCESS:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -