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

📄 rsvpte_global.c

📁 Linux平台下
💻 C
字号:
/* *  Copyright (C) James R. Leu 2003 *  jleu@mindspring.com * *  This software is covered under the LGPL, for more *  info check out http://www.gnu.org/copyleft/lgpl.html */#include "rsvpte_struct.h"#include "rsvpte_global.h"#include "rsvpte_if.h"#include "mpls_socket_impl.h"#include "mpls_timer_impl.h"#include "mpls_ifmgr_impl.h"#include "mpls_tree_impl.h"#include "mpls_lock_impl.h"#include "mpls_fib_impl.h"#include "mpls_policy_impl.h"#include "mpls_mm_impl.h"#include "mpls_trace_impl.h"#if MPLS_USE_LSR#include "lsr_cfg.h"#else#include "mpls_mpls_impl.h"#endifvoid _rsvpte_global_fib_callback(mpls_cfg_handle handle, mpls_update_enum type,  mpls_fec * dest){  rsvpte_global *cfg = (rsvpte_global*)handle;  LDP_ENTER(cfg->user_data, "_rsvpte_global_fib_callback");  mpls_lock_get(cfg->global_lock);  mpls_lock_release(cfg->global_lock);  LDP_EXIT(cfg->user_data, "_rsvpte_global_fib_callback");}void _rsvpte_global_ifmgr_callback(mpls_cfg_handle handle, const mpls_update_enum type, mpls_inet_addr *addr){  rsvpte_global *cfg = (rsvpte_global*)handle;  LDP_ENTER(cfg->user_data, "_rsvpte_global_ifmgr_callback");  mpls_lock_get(cfg->global_lock);  mpls_lock_release(cfg->global_lock);  LDP_EXIT(cfg->user_data, "_rsvpte_global_ifmgr_callback");}rsvpte_global *rsvpte_global_create(mpls_instance_handle data){  rsvpte_global *g = (rsvpte_global *) mpls_malloc(sizeof(rsvpte_global));  if (g) {    memset(g, 0, sizeof(rsvpte_global));    LDP_ENTER(g->user_data, "rsvpte_global_create");    g->global_lock = mpls_lock_create("_rsvpte_global_lock_");    mpls_lock_get(g->global_lock);    MPLS_LIST_INIT(&g->iff, rsvpte_if);    g->admin_state = MPLS_ADMIN_DISABLE;    g->user_data = data;    mpls_lock_release(g->global_lock);    LDP_EXIT(g->user_data, "rsvpte_global_create");  }  return g;}mpls_return_enum rsvpte_global_startup(rsvpte_global * g){  MPLS_ASSERT(g != NULL);  LDP_ENTER(g->user_data, "rsvpte_global_startup");  if (g->lsr_identifier.type == MPLS_FAMILY_NONE) {/* * RSVPTE_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_ALL, RSVPTE_TRACE_FLAG_ERROR, *    "rsvpte_global_startup: invalid LSRID\n"); */    goto rsvpte_global_startup_cleanup;  }  g->timer_handle = mpls_timer_open(g->user_data);  if (mpls_timer_mgr_handle_verify(g->timer_handle) == MPLS_BOOL_FALSE) {    goto rsvpte_global_startup_cleanup;  }  g->socket_handle = mpls_socket_mgr_open(g->user_data);  if (mpls_socket_mgr_handle_verify(g->socket_handle) == MPLS_BOOL_FALSE) {    goto rsvpte_global_startup_cleanup;  }  g->ifmgr_handle = mpls_ifmgr_open(g->user_data, g);  if (mpls_ifmgr_handle_verify(g->ifmgr_handle) == MPLS_BOOL_FALSE) {    goto rsvpte_global_startup_cleanup;  }  g->fib_handle = mpls_fib_open(g->user_data, g);  if (mpls_fib_handle_verify(g->fib_handle) == MPLS_BOOL_FALSE) {    goto rsvpte_global_startup_cleanup;  }#if MPLS_USE_LSR  if (!g->lsr_handle) {    goto rsvpte_global_startup_cleanup;  }#else  g->mpls_handle = mpls_mpls_open(g->user_data);  if (mpls_mpls_handle_verify(g->mpls_handle) == MPLS_BOOL_FALSE) {    goto rsvpte_global_startup_cleanup;  }#endif  g->ra_socket = mpls_socket_create_raw(g->socket_handle, IPPROTO_RSVP);  if (mpls_socket_handle_verify(g->socket_handle, g->ra_socket) == MPLS_BOOL_FALSE) {  /*   *RSVPTE_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_ALL,   *  RSVPTE_TRACE_FLAG_DEBUG,   *  "rsvpte_global_startup: error creating UDP socket\n");   */    goto rsvpte_global_startup_cleanup;  }  if (mpls_socket_options(g->socket_handle, g->ra_socket,      MPLS_SOCKOP_NONBLOCK | MPLS_SOCKOP_REUSE |      MPLS_SOCKOP_ROUTERALERT | MPLS_SOCKOP_HDRINCL) == MPLS_FAILURE) {  /*   *RSVPTE_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_ALL,   *  RSVPTE_TRACE_FLAG_DEBUG,   *  "rsvpte_global_startup: error setting RAW socket options\n");   */    goto rsvpte_global_startup_cleanup;  }  mpls_socket_readlist_add(g->socket_handle, g->ra_socket, 0, MPLS_SOCKET_UDP_DATA);  g->admin_state = MPLS_ADMIN_ENABLE;  LDP_EXIT(g->user_data, "rsvpte_global_startup");  return MPLS_SUCCESS;rsvpte_global_startup_cleanup:  rsvpte_global_shutdown(g);  mpls_socket_close(g->socket_handle, g->ra_socket);  g->ra_socket = 0;  LDP_EXIT(g->user_data, "rsvpte_global_startup-error");  return MPLS_FAILURE;}mpls_return_enum rsvpte_global_shutdown(rsvpte_global * g){  MPLS_ASSERT(g);  LDP_ENTER(g->user_data, "rsvpte_global_shutdown");  g->admin_state = MPLS_ADMIN_DISABLE;  mpls_socket_readlist_del(g->socket_handle, g->ra_socket);  mpls_socket_close(g->socket_handle, g->ra_socket);  mpls_lock_release(g->global_lock);  mpls_timer_close(g->timer_handle);  mpls_lock_get(g->global_lock);  mpls_socket_mgr_close(g->socket_handle);  mpls_ifmgr_close(g->ifmgr_handle);  mpls_fib_close(g->fib_handle);#if MPLS_USE_LSR#else  mpls_mpls_close(g->mpls_handle);#endif  LDP_EXIT(g->user_data, "rsvpte_global_shutdown");  return MPLS_SUCCESS;}mpls_return_enum rsvpte_global_delete(rsvpte_global * g){  if (g) {    mpls_lock_delete(g->global_lock);    LDP_PRINT(g->user_data, "global delete\n");    mpls_free(g);  }  return MPLS_SUCCESS;}void _rsvpte_global_add_if(rsvpte_global * g, rsvpte_if * i){  rsvpte_if *ip = NULL;  MPLS_ASSERT(g && i);  MPLS_REFCNT_HOLD(i);  ip = MPLS_LIST_HEAD(&g->iff);  while (ip != NULL) {    if (ip->index > i->index) {      MPLS_LIST_INSERT_BEFORE(&g->iff, ip, i, _global);      return;    }    ip = MPLS_LIST_NEXT(&g->iff, ip, _global);  }  MPLS_LIST_ADD_TAIL(&g->iff, i, _global, rsvpte_if);}void _rsvpte_global_del_if(rsvpte_global * g, rsvpte_if * i){  MPLS_ASSERT(g && i);  MPLS_LIST_REMOVE(&g->iff, i, _global);  MPLS_REFCNT_RELEASE(i, rsvpte_if_delete);}mpls_return_enum rsvpte_global_find_if_index(rsvpte_global * g, uint32_t index,  rsvpte_if ** iff){  rsvpte_if *i = NULL;  if (g && index > 0) {    /* because we sort our inserts by index, this lets us know       if we've "walked" past the end of the list */    i = MPLS_LIST_TAIL(&g->iff);    if (i == NULL || i->index < index) {      *iff = NULL;      return MPLS_END_OF_LIST;    }    i = MPLS_LIST_HEAD(&g->iff);    while (i != NULL) {      if (i->index == index) {        *iff = i;        return MPLS_SUCCESS;      }      i = MPLS_LIST_NEXT(&g->iff, i, _global);    }  }  *iff = NULL;  return MPLS_FAILURE;}rsvpte_if *rsvpte_global_find_if_handle(rsvpte_global * g, mpls_if_handle handle){  rsvpte_if *i = MPLS_LIST_HEAD(&g->iff);  if (g) {    while (i != NULL) {      if (!mpls_if_handle_compare(i->handle, handle))        return i;      i = MPLS_LIST_NEXT(&g->iff, i, _global);    }  }  return NULL;}

⌨️ 快捷键说明

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