📄 ldp_buf.c
字号:
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 + -