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

📄 ldp_init.c

📁 Linux平台下
💻 C
字号:
/* *  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 "ldp_struct.h"#include "ldp_mesg.h"#include "ldp_entity.h"#include "ldp_nortel.h"#include "ldp_buf.h"#include "ldp_pdu_setup.h"#include "mpls_assert.h"#include "mpls_socket_impl.h"#include "mpls_trace_impl.h"#if MPLS_USE_LSR#include "lsr_cfg.h"#else#include "mpls_mpls_impl.h"#endifvoid ldp_init_prepare(ldp_mesg * msg, ldp_global * g, uint32_t msgid,  ldp_session * s){  mplsLdpInitMsg_t *init = NULL;  uint32_t remote_labelspace;  uint32_t path_vector_limit;  uint32_t remote_lsraddr;  uint8_t direction = 0;  ldp_adj *a = MPLS_LIST_HEAD(&s->adj_root);  uint32_t loop = 0;  uint8_t merge = 0;  mpls_range range;  uint8_t len = 0;  MPLS_ASSERT(s && a);  LDP_ENTER(g->user_data, "ldp_init_create");  ldp_mesg_prepare(msg, MPLS_INIT_MSGTYPE, msgid);  init = &msg->u.init;  remote_lsraddr = a->remote_lsr_address.u.ipv4;  remote_labelspace = a->remote_label_space;  loop = (s->cfg_loop_detection_mode == LDP_LOOP_NONE) ? (0) : (1);  if (loop == LDP_LOOP_NONE) {    path_vector_limit = 0;  } else {    path_vector_limit = s->cfg_path_vector_limit;  }  init->cspExists = 1;  init->baseMsg.msgLength += setupCspTlv(&(init->csp), s->cfg_keepalive,    s->cfg_distribution_mode, loop, path_vector_limit, s->cfg_max_pdu,    remote_lsraddr, remote_labelspace, 0);  init->aspExists = 0;  init->fspExists = 0;  range.label_space = s->cfg_label_space;#if MPLS_USE_LSR#else  mpls_mpls_get_label_space_range(g->mpls_handle,&range);#endif  switch (range.type) {    case MPLS_LABEL_RANGE_ATM_VP:      MPLS_ASSERT(0);    case MPLS_LABEL_RANGE_ATM_VC:    case MPLS_LABEL_RANGE_ATM_VP_VC:      init->aspExists = 1;      init->baseMsg.msgLength += setupAspTlv(&(init->asp), merge, direction);      init->baseMsg.msgLength += addLblRng2AspTlv(&(init->asp),        range.min.u.atm.vpi, range.min.u.atm.vci, range.max.u.atm.vpi,        range.max.u.atm.vci);      break;    case MPLS_LABEL_RANGE_FR_10:      len = 0;                /* Section 3.5.3 fspTlv */    case MPLS_LABEL_RANGE_FR_24:      init->fspExists = 1;      if (range.type == MPLS_LABEL_RANGE_FR_24) {        len = 2;              /* Section 3.5.3 fspTlv */      }      init->baseMsg.msgLength += setupFspTlv(&(init->fsp), merge, direction);      init->baseMsg.msgLength += addLblRng2FspTlv(&(init->fsp), 0, len,        range.min.u.fr.dlci, 0, range.max.u.fr.dlci);      break;    case MPLS_LABEL_RANGE_GENERIC:      break;  }  LDP_EXIT(g->user_data, "ldp_init_create");}mpls_return_enum ldp_init_send(ldp_global * g, ldp_session * s){  mpls_return_enum result = MPLS_FAILURE;  MPLS_ASSERT(s);  LDP_ENTER(g->user_data, "ldp_init_send");  ldp_init_prepare(s->tx_message, g, g->message_identifier++, s);  LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_SEND, LDP_TRACE_FLAG_INIT,    "Init Send: session(%d)\n", s->index);  result = ldp_mesg_send_tcp(g, s, s->tx_message);  LDP_EXIT(g->user_data, "ldp_init_send");  return result;}mpls_return_enum ldp_init_process(ldp_global * g, ldp_session * s,  ldp_mesg * msg){  mpls_range range;  MPLS_MSGPTR(Init);  MPLS_ASSERT(s);  LDP_ENTER(g->user_data, "ldp_init_process");  LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV, LDP_TRACE_FLAG_INIT,    "Init Recv: session(%d)\n", s->index);  MPLS_MSGPARAM(Init) = &msg->u.init;  range.label_space = s->cfg_label_space;#if MPLS_USE_LSR  range.type = MPLS_LABEL_RANGE_GENERIC;#else  mpls_mpls_get_label_space_range(g->mpls_handle, &range);#endif  if (MPLS_MSGPARAM(Init)->csp.rcvLsrAddress != g->lsr_identifier.u.ipv4 ||    MPLS_MSGPARAM(Init)->csp.rcvLsId != range.label_space) {    LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV, LDP_TRACE_FLAG_INIT,      "Init failed(%d): sending bad LDP-ID\n", s->index);    LDP_EXIT(g->user_data, "ldp_init_process-error");    s->shutdown_notif = LDP_NOTIF_BAD_LDP_ID;    s->shutdown_fatal = MPLS_BOOL_FALSE;    return MPLS_FAILURE;  }  if (MPLS_MSGPARAM(Init)->csp.holdTime == 0) {    LDP_EXIT(g->user_data, "ldp_init_process-error");    LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV, LDP_TRACE_FLAG_INIT,      "Init failed(%d): sending bad Keepalive Time\n", s->index);    s->shutdown_notif = LDP_NOTIF_SESSION_REJECTED_BAD_KEEPALIVE_TIME;    s->shutdown_fatal = MPLS_BOOL_FALSE;    return MPLS_FAILURE;  }  if (MPLS_MSGPARAM(Init)->csp.maxPduLen <= 255)    MPLS_MSGPARAM(Init)->csp.maxPduLen = 4096; /* Section 3.5.3. */  s->remote_max_pdu = MPLS_MSGPARAM(Init)->csp.maxPduLen;  s->remote_keepalive = MPLS_MSGPARAM(Init)->csp.holdTime;  s->remote_path_vector_limit = MPLS_MSGPARAM(Init)->csp.flags.flags.pvl;  s->remote_distribution_mode =    (ldp_distribution_mode) MPLS_MSGPARAM(Init)->csp.flags.flags.lad;  if (s->remote_keepalive < s->cfg_keepalive) {    s->oper_keepalive = s->remote_keepalive;  } else {    s->oper_keepalive = s->cfg_keepalive;  }  /* JLEU: eventually this should be configured by the user */  s->oper_keepalive_interval = s->oper_keepalive / 3;  if (MPLS_MSGPARAM(Init)->csp.flags.flags.ld == 0) {    s->remote_loop_detection = MPLS_BOOL_FALSE;  } else {    s->remote_loop_detection = MPLS_BOOL_TRUE;  }  if (s->remote_max_pdu < s->cfg_max_pdu) {    s->oper_max_pdu = s->remote_max_pdu;  }  if (s->remote_distribution_mode != s->cfg_distribution_mode) {    LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV, LDP_TRACE_FLAG_INIT,      "Init(%d): distribution modes do not match, using default\n", s->index);    if (range.type == MPLS_LABEL_RANGE_GENERIC) {      s->oper_distribution_mode = LDP_DISTRIBUTION_UNSOLICITED;    } else {      s->oper_distribution_mode = LDP_DISTRIBUTION_ONDEMAND;    }  }  if ((s->remote_loop_detection == MPLS_BOOL_TRUE) &&    (g->loop_detection_mode != LDP_LOOP_NONE)) {    s->oper_loop_detection = s->cfg_loop_detection_mode;  } else {    s->oper_loop_detection = LDP_LOOP_NONE;  }  if (MPLS_MSGPARAM(Init)->aspExists) {    if (range.type >= MPLS_LABEL_RANGE_ATM_VP && range.type <= MPLS_LABEL_RANGE_ATM_VP_VC) {      MPLS_ASSERT(0);    } else {      LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV, LDP_TRACE_FLAG_INIT,        "Init Failed(%d): sending bad Label Range (ATM)\n", s->index);      s->shutdown_notif = LDP_NOTIF_SESSION_REJECTED_PARAMETERS_LABEL_RANGE;      s->shutdown_fatal = MPLS_BOOL_FALSE;      return MPLS_FAILURE;    }  } else if (MPLS_MSGPARAM(Init)->fspExists) {    if (range.type >= MPLS_LABEL_RANGE_FR_10 && range.type <= MPLS_LABEL_RANGE_FR_24) {      MPLS_ASSERT(0);    } else {      LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV, LDP_TRACE_FLAG_INIT,        "Init Failed(%d): sending bad Label Range (FR)\n", s->index);      s->shutdown_notif = LDP_NOTIF_SESSION_REJECTED_PARAMETERS_LABEL_RANGE;      s->shutdown_fatal = MPLS_BOOL_FALSE;      return MPLS_FAILURE;    }  }  LDP_EXIT(g->user_data, "ldp_init_process");  return MPLS_SUCCESS;}

⌨️ 快捷键说明

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