📄 ldp.cc
字号:
return (TCL_OK); } } else if (argc == 6) { if (strcmp(argv[1], "mapping-msg") == 0) { /* * <agent> mapping <fec> <label> <pathvec> <premsgid> */ size_ = PKTsize(argv[4],"*"); if ( atoi(argv[5]) > -1 ) /* packet size adjustment*/ size_ += 24; else size_ += 16; Packet* pkt = allocpkt(); hdr_ldp *hdrldp = hdr_ldp::access(pkt); PKTinit(hdrldp, LDP_MappingMSG, argv[4], "*"); hdrldp->fec = atoi(argv[2]); hdrldp->label = atoi(argv[3]); hdrldp->reqmsgid= atoi(argv[5]); send(pkt, 0); return (TCL_OK); } else if (strcmp(argv[1], "cr-mapping-msg") == 0) { /* * <agent> cr-mapping-msg <fec> <label> <lspid> * <premsgid> */ size_ = PKTsize("*","*"); size_ += 32; /* packet size adjustment */ Packet* pkt = allocpkt(); hdr_ldp *hdrldp = hdr_ldp::access(pkt); PKTinit(hdrldp, LDP_MappingMSG, "*", "*"); hdrldp->fec = atoi(argv[2]); hdrldp->label = atoi(argv[3]); hdrldp->lspid = atoi(argv[4]); hdrldp->reqmsgid= atoi(argv[5]); send(pkt, 0); return (TCL_OK); } } else if (argc == 7) { if (strcmp(argv[1], "cr-request-msg") == 0) { /* * <agent> cr-request <fec> <pathvec> <er> <lspid> <rc> */ size_ = PKTsize(argv[3],argv[4]); if (atoi(argv[6]) > -1) /* packet size adjustment */ size_ += 24; else size_ += 16; Packet* pkt = allocpkt(); hdr_ldp *hdrldp = hdr_ldp::access(pkt); PKTinit(hdrldp, LDP_RequestMSG, argv[3], argv[4]); hdrldp->fec = atoi(argv[2]); hdrldp->lspid = atoi(argv[5]); hdrldp->rc = atoi(argv[6]); send(pkt, 0); return (TCL_OK); } else if (strcmp(argv[1], "msgtbl-install") == 0) { /* * <agent> msgtbl-install <msgid> <FEC> <LspID> * <Src> <Pmsgid> */ int msgid = atoi(argv[2]); int fec = atoi(argv[3]); int LspID = atoi(argv[4]); int src = atoi(argv[5]); int PMsgID = atoi(argv[6]); int entrynb = MSGTinsert(msgid,fec,LspID,src,PMsgID); tcl.resultf("%d", entrynb); return (TCL_OK); } } return (Agent::command(argc, argv));}void LDPAgent::recv(Packet* pkt, Handler*){ char out[400]; Tcl& tcl = Tcl::instance(); hdr_ldp *hdrldp = hdr_ldp::access(pkt); int msgtype = hdrldp->msgtype; int msgid = hdrldp->msgid; int fec = hdrldp->fec; int label = hdrldp->label; int reqmsgid= hdrldp->reqmsgid; int status = hdrldp->status; int lspid = hdrldp->lspid; int rc = hdrldp->rc; char pathvec[400]; char er[400]; strcpy(pathvec, hdrldp->pathvec); strcpy(er, hdrldp->er); ns_addr_t src = hdr_ip::access(pkt)->src_; trace(src, hdrldp); free(hdrldp->pathvec); free(hdrldp->er); Packet::free(pkt); switch (msgtype) { case LDP_NotificationMSG: /* Notification */ char code[30]; strcpy(code, parse_status(status)); sprintf(out, "%s get-notification-msg %d %s %d", name(), src.addr_, code, lspid); tcl.eval(out); break; case LDP_MappingMSG: /* Label Mapping */ if (lspid >= 0) { /* CR-LDP */ sprintf(out, "%s get-cr-mapping-msg %d %d %d %d %d %d", name(), msgid, src.addr_, fec, label, lspid, reqmsgid); } else { sprintf(out, "%s get-mapping-msg %d %d %d %d %s %d", name(), msgid, src.addr_, fec, label, pathvec, reqmsgid); } tcl.eval(out); break; case LDP_RequestMSG: /* Label Request */ if (lspid >= 0) { sprintf(out, "%s get-cr-request-msg %d %d %d %s %s %d %d", name(), msgid, src.addr_, fec, pathvec, er, lspid, rc); } else { sprintf(out, "%s get-request-msg %d %d %d %s", name(), msgid, src.addr_, fec, pathvec); } tcl.eval(out); break; case LDP_WithdrawMSG: /* Label Withdraw */ sprintf(out, "%s get-withdraw-msg %d %d %d", name(), src.addr_, fec, lspid); tcl.eval(out); break; case LDP_ReleaseMSG: /* Label Release */ sprintf(out, "%s get-release-msg %d %d %d", name(), src.addr_, fec, lspid); tcl.eval(out); break; }}int LDPAgent::MSGTinsert(int MsgID, int FEC, int LspID, int Src, int PMsgID){ if (MSGT_.NB == LDP_MaxMSGTEntryNB - 1) return(-1); if (MSGTlocate(FEC, LspID, Src) > -1) return(-1); MSGT_.Entry[MSGT_.NB].MsgID = MsgID; MSGT_.Entry[MSGT_.NB].FEC = FEC; MSGT_.Entry[MSGT_.NB].LspID = LspID; MSGT_.Entry[MSGT_.NB].Src = Src; MSGT_.Entry[MSGT_.NB].PMsgID = PMsgID; MSGT_.Entry[MSGT_.NB].LabelOp = LDP_LabelALLOC; MSGT_.Entry[MSGT_.NB].ERLspID = -1; MSGT_.NB++; return(MSGT_.NB-1);}void LDPAgent::MSGTdelete(int entrynb){ if ( (entrynb > -1) && (entrynb < MSGT_.NB) ) { MSGT_.Entry[entrynb].MsgID = -1; MSGT_.Entry[entrynb].FEC = MSGT_.Entry[entrynb].LspID = -1; MSGT_.Entry[entrynb].Src = MSGT_.Entry[entrynb].PMsgID = -1; MSGT_.Entry[entrynb].LabelOp = -1; MSGT_.Entry[entrynb].ERLspID = -1; } }int LDPAgent::MSGTlocate(int MsgID){ if ( MsgID < 0 ) return(-1); for (int i=0; i<MSGT_.NB; i++) { if ( MSGT_.Entry[i].MsgID == MsgID ) return(i); } return(-1);}int LDPAgent::MSGTlocate(int FEC, int LspID, int Src){ int i; if ( (FEC < 0) && (Src < 0) ) { if ( LspID > -1) { for (i=0; i<MSGT_.NB; i++) if ( MSGT_.Entry[i].LspID == LspID ) return(i); } return(-1); } for (i=0; i<MSGT_.NB; i++) { if ( (MSGT_.Entry[i].FEC == FEC ) && (MSGT_.Entry[i].LspID == LspID) && (MSGT_.Entry[i].Src == Src ) ) return(i); } return(-1);}void LDPAgent::MSGTlookup(int entrynb, int &MsgID, int &FEC, int &LspID, int &Src, int &PMsgID, int &LabelOp){ if ( (entrynb > -1) && (entrynb < MSGT_.NB) ) { MsgID = MSGT_.Entry[entrynb].MsgID; FEC = MSGT_.Entry[entrynb].FEC; LspID = MSGT_.Entry[entrynb].LspID; Src = MSGT_.Entry[entrynb].Src; PMsgID = MSGT_.Entry[entrynb].PMsgID; LabelOp= MSGT_.Entry[entrynb].LabelOp; } else { MsgID = FEC = LspID = Src = PMsgID = LabelOp = -1; }}void LDPAgent::MSGTdump(){ for (int i = 0; i < MSGT_.NB; i++) { cerr << " # MsgID =" << MSGT_.Entry[i].MsgID << " "; cerr << " # FEC =" << MSGT_.Entry[i].FEC << " "; cerr << " # LspID =" << MSGT_.Entry[i].LspID << " "; cerr << " # Src =" << MSGT_.Entry[i].Src << " "; cerr << " # PMsgID=" << MSGT_.Entry[i].PMsgID<< " "; cerr << " # LabelOp=" << MSGT_.Entry[i].LabelOp << "\n"; }}void LDPAgent::trace(ns_addr_t src, hdr_ldp *hdrldp){ // XXX will be changed later to directly write to a output channel // instead of sending stuff to otcl if (trace_ldp_ == 1) { const char *msgtype = parse_msgtype(hdrldp->msgtype, hdrldp->lspid); const char *status = (hdrldp->msgtype == 0x0001) ? parse_status(hdrldp->status) : "*"; Tcl::instance().evalf("%s trace-ldp-packet %d %d %s %d %d %d " "%s %d %s %d %d %s %7f", name(), src.addr_, src.port_, msgtype, hdrldp->msgid, hdrldp->fec, hdrldp->label, hdrldp->pathvec, hdrldp->lspid, hdrldp->er, hdrldp->rc, hdrldp->reqmsgid, status, Scheduler::instance().clock()); } }char* LDPAgent::parse_msgtype(int msgtype, int lspid){ switch (msgtype) { case LDP_NotificationMSG: /* Notification */ return("Notification"); case LDP_MappingMSG: /* Label Mapping */ if (lspid >= 0) /* CR-LDP */ return("CR-Mapping"); else return("Mapping"); case LDP_RequestMSG: /* Label Request */ if (lspid >= 0) return("CR-Request"); else return("Request"); case LDP_WithdrawMSG: /* Label Withdraw */ return("Withdraw"); case LDP_ReleaseMSG: /* Label Release */ return("Release"); } return ("Error");}char* LDPAgent::parse_status(int status){ switch (status) { case LDP_LoopDetected: return "LoopDetected"; case LDP_NoRoute: return "NoRoute"; default: return "Unknown"; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -