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

📄 ldp.cc

📁 LDP的 源代码
💻 CC
📖 第 1 页 / 共 2 页
字号:
			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 + -