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

📄 ldp_label_abort.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_attr.h"#include "ldp_fec.h"#include "ldp_mesg.h"#include "ldp_pdu_setup.h"#include "ldp_entity.h"#include "ldp_session.h"#include "ldp_notif.h"#include "ldp_label_abort.h"#include "ldp_label_rel_with.h"#include "ldp_label_mapping.h"#include "mpls_trace_impl.h"void ldp_label_abort_prepare_msg(ldp_mesg * msg, uint32_t msgid,  ldp_attr * s_attr){  mplsLdpLblAbortMsg_t *abrt = NULL;  ldp_mesg_prepare(msg, MPLS_LBLABORT_MSGTYPE, msgid);  abrt = &msg->u.abort;  if (s_attr->fecTlvExists) {    abrt->fecTlvExists = 1;    abrt->baseMsg.msgLength += setupFecTlv(&abrt->fecTlv);    abrt->baseMsg.msgLength +=      addFecElem2FecTlv(&abrt->fecTlv, &s_attr->fecTlv.fecElArray[0]);  }  if (s_attr->lblMsgIdTlvExists) {    abrt->lblMsgIdTlvExists = 1;    abrt->baseMsg.msgLength +=      setupLblMsgIdTlv(&abrt->lblMsgIdTlv, s_attr->msg_id);  }}mpls_return_enum ldp_label_abort_send(ldp_global * g, ldp_session * s,  ldp_attr * s_attr){  mpls_fec fec;  ldp_attr *ds_attr = NULL;  LDP_ENTER(g->user_data, "ldp_label_abort_send");  fec_tlv2mpls_fec(&s_attr->fecTlv, 0, &fec);  if ((ds_attr = ldp_attr_find_downstream_state(g, s, &fec,        LDP_LSP_STATE_ABORT_SENT)) != NULL) {    return MPLS_SUCCESS;  }  ldp_label_abort_prepare_msg(s->tx_message, g->message_identifier++, s_attr);  LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_SEND, LDP_TRACE_FLAG_LABEL,    "Label Abort Sent: session (%d) \n", s->index);  s_attr->state = LDP_LSP_STATE_ABORT_SENT;  if (ldp_mesg_send_tcp(g, s, s->tx_message) == MPLS_FAILURE) {    LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_SEND, LDP_TRACE_FLAG_ERROR,      "Label Abort Sent Failed .\n");    goto ldp_label_abort_send_error;  }  LDP_EXIT(g->user_data, "ldp_label_abort_send");  return MPLS_SUCCESS;ldp_label_abort_send_error:  if (s_attr) {    ldp_attr_remove_complete(g, s_attr, MPLS_BOOL_FALSE);  }  LDP_EXIT(g->user_data, "ldp_label_abort_send-error");  return MPLS_FAILURE;}mpls_return_enum ldp_label_abort_process(ldp_global * g, ldp_session * s,  ldp_adj * a, ldp_entity * e, ldp_attr * r_attr, ldp_fec * f){  ldp_attr_list *us_list = NULL;  ldp_attr *us_temp = NULL;  ldp_attr *us_attr = NULL;  ldp_attr *ds_req_attr = NULL;  ldp_attr *ds_map_attr = NULL;  mpls_return_enum retval = MPLS_SUCCESS;  if ((us_list = ldp_attr_find_upstream_all2(g, s, f))) {    us_temp = MPLS_LIST_HEAD(us_list);    while (us_temp) {      if (((us_temp->state == LDP_LSP_STATE_REQ_RECV) &&          (us_temp->msg_id == r_attr->msg_id)) ||        (us_temp->state == LDP_LSP_STATE_MAP_SENT)) {        us_attr = us_temp;        break;      }      us_temp = MPLS_LIST_NEXT(us_list, us_temp, _fs);    }  }  if ((!us_attr) || (us_attr->state == LDP_LSP_STATE_MAP_SENT)) { /* LAbR.1,2 */    retval = MPLS_FAILURE;    goto LAbR_12;  }  /* LAbR.3 */  if (ldp_notif_send(g, s, us_attr, LDP_NOTIF_LABEL_ABORT) != MPLS_SUCCESS) {    retval = MPLS_FAILURE;    goto LAbR_12;  }  /* LAbR.4 */  if (us_attr->ds_attr && (us_attr->ds_attr->state == LDP_LSP_STATE_REQ_SENT)) {    ds_req_attr = us_attr->ds_attr;    goto LAbR_7;  }  /* LAbR.5 */  if (us_attr->ds_attr && (us_attr->ds_attr->state == LDP_LSP_STATE_MAP_RECV)) {    ds_map_attr = us_attr->ds_attr;  } else {    goto LAbR_11;  }  /* this may results in us sending a label withdraw to s and possibly     propogating a release */  if (ldp_label_release_process(g, s, NULL, e, us_attr, f) != MPLS_SUCCESS) { /* LAbR.6 */    retval = MPLS_FAILURE;  }  goto LAbR_11;LAbR_7:  if (g->label_merge == MPLS_BOOL_TRUE) { /* LAbR.7 */    /* by now us_attr has been removed from the downstream us_attr_root       so any left overs (reflect by count > 0) are from other peers */    if (ds_req_attr && ldp_attr_num_us2ds(ds_req_attr)) { /* LAbR.8 */      goto LAbR_11;    }  }  if (ldp_label_abort_send(g, ds_req_attr->session, ds_req_attr) != MPLS_SUCCESS) { /* LAbR.9,10 */    retval = MPLS_FAILURE;  }LAbR_11:  if (us_attr) {    ldp_attr_remove_complete(g, us_attr, MPLS_BOOL_FALSE);  }LAbR_12:  LDP_EXIT(g->user_data, "ldp_label_abort_processed");  return retval;}void abort2attr(mplsLdpLblAbortMsg_t * abrt, ldp_attr * a, uint32_t flag){}

⌨️ 快捷键说明

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