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

📄 ldp_buf.c

📁 实现了MPLS中的标签分发协议(LDP 3036 )的基本功能
💻 C
📖 第 1 页 / 共 2 页
字号:
  int max_mesg_size;  int encodedSize = 0;  u_short type = 0;  int mesgSize = 0;  MPLS_ASSERT(b);  LDP_ENTER(g->user_data, "ldp_decode_one_mesg");  if (msg->header.pduLength > (b->size - 4)) {    LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV,      LDP_TRACE_FLAG_PACKET, "Buffer too small. Decoding failed\n");    LDP_EXIT(g->user_data, "ldp_decode_one_mesg - failure");    return MPLS_FAILURE;  }  max_mesg_size = b->current_size;  /* found the message type */  memcpy((u_char *) & type, b->current, 2);  type = ntohs(type) & 0x7fff;  /* ignore the U bit for now */  LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV, LDP_TRACE_FLAG_PACKET,    "Found type %x\n", type);  switch (type) {    case MPLS_INIT_MSGTYPE:      {        MPLS_MSGPTR(Init) = &msg->u.init;        encodedSize = Mpls_decodeLdpInitMsg(MPLS_MSGPARAM(Init),          b->current, max_mesg_size);        LDP_DUMP_PKT(g->user_data, LDP_TRACE_FLAG_INIT, MPLS_TRACE_STATE_RECV,          ldp_buf_dump(g->user_data, b, encodedSize));        LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_INIT, "decodedSize for Init msg = %d\n", encodedSize);        if (encodedSize < 0) {          goto ldp_decode_one_mesg;        }        LDP_TRACE_PKT(g->user_data, MPLS_TRACE_STATE_RECV, LDP_TRACE_FLAG_INIT,          printHeader(g->user_data, &msg->header),          printInitMsg(g->user_data, MPLS_MSGPARAM(Init)));        b->current += encodedSize;        mesgSize += encodedSize;        break;      }    case MPLS_NOT_MSGTYPE:      {        MPLS_MSGPTR(Notif) = &msg->u.notif;        encodedSize = Mpls_decodeLdpNotMsg(MPLS_MSGPARAM(Notif),          b->current, max_mesg_size);        LDP_DUMP_PKT(g->user_data, LDP_TRACE_FLAG_NOTIF, MPLS_TRACE_STATE_RECV,          ldp_buf_dump(g->user_data, b,            (encodedSize < 0) ? max_mesg_size : encodedSize));        LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV, LDP_TRACE_FLAG_NOTIF,          "decodedSize for Notif msg = %d\n", encodedSize);        if (encodedSize < 0) {          goto ldp_decode_one_mesg;        }        LDP_TRACE_PKT(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_NOTIF,          printHeader(g->user_data, &msg->header),          printNotMsg(g->user_data, MPLS_MSGPARAM(Notif)));        b->current += encodedSize;        mesgSize += encodedSize;        break;      }    case MPLS_KEEPAL_MSGTYPE:      {        MPLS_MSGPTR(KeepAl) = &msg->u.keep;        encodedSize = Mpls_decodeLdpKeepAliveMsg(MPLS_MSGPARAM(KeepAl),          b->current, max_mesg_size);        LDP_DUMP_PKT(g->user_data, LDP_TRACE_FLAG_PERIODIC,          MPLS_TRACE_STATE_RECV, ldp_buf_dump(g->user_data, b, encodedSize));        LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_PERIODIC,          "decodedSize for KeepAlive msg = %d\n", encodedSize);        if (encodedSize < 0) {          goto ldp_decode_one_mesg;        }        LDP_TRACE_PKT(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_PERIODIC,          printHeader(g->user_data, &msg->header),          printKeepAliveMsg(g->user_data, MPLS_MSGPARAM(KeepAl)));        b->current += encodedSize;        mesgSize += encodedSize;        break;      }    case MPLS_HELLO_MSGTYPE:      {        MPLS_MSGPTR(Hello) = &msg->u.hello;        encodedSize = Mpls_decodeLdpHelloMsg(MPLS_MSGPARAM(Hello),          b->current, max_mesg_size);        LDP_DUMP_PKT(g->user_data, LDP_TRACE_FLAG_PERIODIC,          MPLS_TRACE_STATE_RECV, ldp_buf_dump(g->user_data, b, encodedSize));        LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_PERIODIC, "decodedSize for Hello msg = %d\n",          encodedSize);        if (encodedSize < 0) {          goto ldp_decode_one_mesg;        }        LDP_TRACE_PKT(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_PERIODIC,          printHeader(g->user_data, &msg->header),          printHelloMsg(g->user_data, MPLS_MSGPARAM(Hello)));        b->current += encodedSize;        mesgSize += encodedSize;        break;      }    case MPLS_LBLREQ_MSGTYPE:      {        MPLS_MSGPTR(LblReq) = &msg->u.request;        encodedSize = Mpls_decodeLdpLblReqMsg(MPLS_MSGPARAM(LblReq),          b->current, max_mesg_size);        LDP_DUMP_PKT(g->user_data, LDP_TRACE_FLAG_LABEL, MPLS_TRACE_STATE_RECV,          ldp_buf_dump(g->user_data, b, encodedSize));        LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_LABEL, "decodedSize for Req msg = %d\n", encodedSize);        if (encodedSize < 0) {          goto ldp_decode_one_mesg;        }        LDP_TRACE_PKT(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_LABEL,          printHeader(g->user_data, &msg->header),          printLlbReqMsg(g->user_data, MPLS_MSGPARAM(LblReq)));        b->current += encodedSize;        mesgSize += encodedSize;        break;      }    case MPLS_LBLMAP_MSGTYPE:      {        MPLS_MSGPTR(LblMap) = &msg->u.map;        encodedSize = Mpls_decodeLdpLblMapMsg(MPLS_MSGPARAM(LblMap),          b->current, max_mesg_size);        LDP_DUMP_PKT(g->user_data, LDP_TRACE_FLAG_LABEL, MPLS_TRACE_STATE_RECV,          ldp_buf_dump(g->user_data, b, encodedSize));        LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_LABEL, "decodedSize for Map msg = %d\n", encodedSize);        if (encodedSize < 0) {          goto ldp_decode_one_mesg;        }        LDP_TRACE_PKT(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_LABEL,          printHeader(g->user_data, &msg->header),          printLlbMapMsg(g->user_data, MPLS_MSGPARAM(LblMap)));        b->current += encodedSize;        mesgSize += encodedSize;        break;      }    case MPLS_ADDR_MSGTYPE:    case MPLS_ADDRWITH_MSGTYPE:      {        MPLS_MSGPTR(Adr) = &msg->u.addr;        encodedSize = Mpls_decodeLdpAdrMsg(MPLS_MSGPARAM(Adr),          b->current, max_mesg_size);        LDP_DUMP_PKT(g->user_data, LDP_TRACE_FLAG_ADDRESS,          MPLS_TRACE_STATE_RECV, ldp_buf_dump(g->user_data, b, encodedSize));        LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_ADDRESS, "decodedSize for Adr msg = %d\n",          encodedSize);        if (encodedSize < 0) {          goto ldp_decode_one_mesg;        }        LDP_TRACE_PKT(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_ADDRESS,          printHeader(g->user_data, &msg->header),          printAddressMsg(g->user_data, MPLS_MSGPARAM(Adr)));        b->current += encodedSize;        mesgSize += encodedSize;        break;      }    case MPLS_LBLWITH_MSGTYPE:    case MPLS_LBLREL_MSGTYPE:      {        MPLS_MSGPTR(Lbl_W_R_) = &msg->u.release;        encodedSize = Mpls_decodeLdpLbl_W_R_Msg(MPLS_MSGPARAM(Lbl_W_R_),          b->current, max_mesg_size);        LDP_DUMP_PKT(g->user_data, LDP_TRACE_FLAG_LABEL, MPLS_TRACE_STATE_RECV,          ldp_buf_dump(g->user_data, b, encodedSize));        LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_LABEL,          "decodedSize for Lbl Release/Mapping msg = %d\n", encodedSize);        if (encodedSize < 0) {          goto ldp_decode_one_mesg;        }        LDP_TRACE_PKT(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_LABEL,          printHeader(g->user_data, &msg->header),          printLbl_W_R_Msg(g->user_data, MPLS_MSGPARAM(Lbl_W_R_)));        b->current += encodedSize;        mesgSize += encodedSize;        break;      }    case MPLS_LBLABORT_MSGTYPE:      {        MPLS_MSGPTR(LblAbort) = &msg->u.abort;        encodedSize = Mpls_decodeLdpLblAbortMsg(MPLS_MSGPARAM(LblAbort),          b->current, max_mesg_size);        LDP_DUMP_PKT(g->user_data, LDP_TRACE_FLAG_LABEL, MPLS_TRACE_STATE_RECV,          ldp_buf_dump(g->user_data, b, encodedSize));        LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_LABEL, "decodedSize for Abort msg = %d\n",          encodedSize);        if (encodedSize < 0) {          goto ldp_decode_one_mesg;        }        LDP_TRACE_PKT(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_LABEL,          printHeader(g->user_data, &msg->header),          printLlbAbortMsg(g->user_data, MPLS_MSGPARAM(LblAbort)));        b->current += encodedSize;        mesgSize += encodedSize;        break;      }    default:      {        LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV,          LDP_TRACE_FLAG_PACKET, "Unknown message type = %x\n", type);        goto ldp_decode_one_mesg;      }  }                             /* switch */  LDP_TRACE_LOG(g->user_data, MPLS_TRACE_STATE_RECV,    LDP_TRACE_FLAG_PACKET, "Mesg size: %d (%d)\n", mesgSize, b->size);  b->current_size -= mesgSize;  LDP_EXIT(g->user_data, "ldp_decode_one_mesg");  return MPLS_SUCCESS;ldp_decode_one_mesg:  LDP_EXIT(g->user_data, "ldp_decode_one_mesg - failure");  return MPLS_FAILURE;}

⌨️ 快捷键说明

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