ldp.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:17k
源码类别:

通讯编程

开发平台:

Visual C++

  1. // -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*-
  2. /*
  3.  * ldp.cc
  4.  * Copyright (C) 2000 by the University of Southern California
  5.  * $Id: ldp.cc,v 1.9 2005/08/25 18:58:09 johnh Exp $
  6.  *
  7.  * This program is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License,
  9.  * version 2, as published by the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License along
  17.  * with this program; if not, write to the Free Software Foundation, Inc.,
  18.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  19.  *
  20.  *
  21.  * The copyright of this module includes the following
  22.  * linking-with-specific-other-licenses addition:
  23.  *
  24.  * In addition, as a special exception, the copyright holders of
  25.  * this module give you permission to combine (via static or
  26.  * dynamic linking) this module with free software programs or
  27.  * libraries that are released under the GNU LGPL and with code
  28.  * included in the standard release of ns-2 under the Apache 2.0
  29.  * license or under otherwise-compatible licenses with advertising
  30.  * requirements (or modified versions of such code, with unchanged
  31.  * license).  You may copy and distribute such a system following the
  32.  * terms of the GNU GPL for this module and the licenses of the
  33.  * other code concerned, provided that you include the source code of
  34.  * that other code when and as the GNU GPL requires distribution of
  35.  * source code.
  36.  *
  37.  * Note that people who make modified versions of this module
  38.  * are not obligated to grant this special exception for their
  39.  * modified versions; it is their choice whether to do so.  The GNU
  40.  * General Public License gives permission to release a modified
  41.  * version without this exception; this exception also makes it
  42.  * possible to release a modified version which carries forward this
  43.  * exception.
  44.  *
  45.  */
  46. //
  47. // Original source contributed by Gaeil Ahn. See below.
  48. //
  49. // $Header: /cvsroot/nsnam/ns-2/mpls/ldp.cc,v 1.9 2005/08/25 18:58:09 johnh Exp $
  50. /**************************************************************************
  51. * Copyright (c) 2000 by Gaeil Ahn                                      *
  52. * Everyone is permitted to copy and distribute this software.   *
  53. * Please send mail to fog1@ce.cnu.ac.kr when you modify or distribute     *
  54. * this sources.   *
  55. **************************************************************************/
  56. /***********************************************************
  57. *                                                          *
  58. *    File: File for LDP & CR-LDP protocol                   *
  59. *    Author: Gaeil Ahn (fog1@ce.cnu.ac.kr), Jan. 2000      *
  60. *                                                          *
  61. ***********************************************************/
  62. #include "config.h"
  63. #include <iostream>
  64. #include "ldp.h"
  65. int hdr_ldp::offset_;
  66. static class LDPHeaderClass : public PacketHeaderClass {
  67. public:
  68. LDPHeaderClass() : PacketHeaderClass("PacketHeader/LDP", 
  69.      sizeof(hdr_ldp)) {
  70. bind_offset(&hdr_ldp::offset_);
  71. }
  72. } class_ldphdr;
  73. static class LDPClass : public TclClass {
  74. public:
  75. LDPClass() : TclClass("Agent/LDP") {}
  76. TclObject* create(int, const char*const*) {
  77. return (new LDPAgent());
  78. }
  79. } class_agentldp;
  80. LDPAgent::LDPAgent() : Agent(PT_LDP), 
  81. new_msgid_(0), trace_ldp_(0), peer_(0)
  82. {
  83. MSGT_.NB      = 0;
  84. }
  85. void LDPAgent::delay_bind_init_all()
  86. {
  87. delay_bind_init_one("trace_ldp_");
  88. Agent::delay_bind_init_all();
  89. }
  90. int LDPAgent::delay_bind_dispatch(const char *varName, const char *localName, 
  91.   TclObject *tracer)
  92. {
  93. if (delay_bind_bool(varName,localName,"trace_ldp_",&trace_ldp_,tracer))
  94. return TCL_OK;
  95. return Agent::delay_bind_dispatch(varName, localName, tracer);
  96. }
  97. int LDPAgent::PKTsize(const char *pathvec, const char *er)
  98. {
  99. // header size for Version, PDU Length, and LDP Identifier
  100. int psize = 10; 
  101. // size for message type and message id
  102. psize += 8; 
  103.     
  104. int len = strlen(pathvec);
  105. if (len > 1) {
  106. psize += 4;   // size for path vector header
  107. for (int i=0; i<len; i++)
  108. if ( *(pathvec+i) == ' ' ) {
  109. psize += 4;   // size for path vector data
  110. }  
  111. }     
  112. len = strlen(er);
  113. if (len > 1) { 
  114. psize += 4;   // size for explicit route header
  115. for (int i=0; i<len; i++)
  116. if (*(er+i) == ' ')
  117. psize += 4;   // size for explicit route data 
  118. }
  119. return (psize);
  120. }
  121. void LDPAgent::PKTinit(hdr_ldp *hdrldp, int msgtype, 
  122.        const char *pathvec, const char *er)
  123. {
  124. hdrldp->msgtype = msgtype;
  125. hdrldp->msgid   = new_msgid_;
  126. hdrldp->fec     = -1;
  127. hdrldp->label   = -1;
  128. hdrldp->reqmsgid= -1;
  129. hdrldp->status  = -1;
  130. int i;
  131. int len = strlen(pathvec);
  132. hdrldp->pathvec = (char *) malloc(len+1);
  133. for (i=0; i<len; i++) { 
  134. if ( *(pathvec+i) == ' ' )
  135. *(hdrldp->pathvec+i) = '_';
  136. else
  137. *(hdrldp->pathvec+i) = *(pathvec+i);
  138. }
  139. *(hdrldp->pathvec+len) = '';
  140. len = strlen(er);
  141. hdrldp->er = (char *) malloc(len+1);
  142. for (i=0; i<len; i++) { 
  143. if ( *(er+i) == ' ' )
  144. *(hdrldp->er+i) = '_';
  145. else
  146. *(hdrldp->er+i) = *(er+i);
  147. }
  148. *(hdrldp->er+len) = '';
  149. hdrldp->lspid = -1;
  150. hdrldp->rc    = -1;
  151. }
  152. int LDPAgent::command(int argc, const char*const* argv)
  153. {
  154. Tcl& tcl = Tcl::instance();
  155. if (argc == 2) {      
  156. if (strcmp(argv[1], "msgtbl-dump") == 0) {              
  157. MSGTdump();
  158. return (TCL_OK);
  159. } else if (strcmp(argv[1], "new-msgid") == 0) {
  160. tcl.resultf("%d", ++new_msgid_);
  161. return (TCL_OK);
  162. } else if (strcmp(argv[1], "peer-ldpnode") == 0) {
  163. tcl.resultf("%d", peer_);
  164. return (TCL_OK);
  165. }
  166. } else if (argc == 3) {
  167. if (strcmp(argv[1], "set-peer") == 0) {
  168. peer_ = atoi(argv[2]);
  169. return (TCL_OK);
  170. }
  171. // The following is shared by all if-s in this branch
  172. int MsgID = atoi(argv[2]);
  173. int msgid,fec,lspid,src,pmsgid,labelop;
  174. int entrynb = MSGTlocate(MsgID);
  175. MSGTlookup(entrynb,msgid,fec,lspid,src,pmsgid,labelop);
  176. if (strcmp(argv[1], "msgtbl-clear") == 0) {
  177. /* <agent> MSGTdelete MsgID */
  178. if (entrynb > -1)  
  179. MSGTdelete(entrynb);
  180. return (TCL_OK);
  181. } else if (strcmp(argv[1], "msgtbl-get-src") == 0) {
  182. /* <agent> GetMSGTsrc MsgID */
  183. tcl.resultf("%d", src);
  184. return (TCL_OK);
  185. } else if (strcmp(argv[1], "msgtbl-get-reqmsgid") == 0) {
  186. /* <agent> GetMSGTpmsgid msgid */
  187. tcl.resultf("%d",pmsgid);
  188. return (TCL_OK);
  189. } else if (strcmp(argv[1], "msgtbl-get-labelop") == 0) {
  190. /* <agent> GetMSGTlabelpass msgid */
  191. tcl.resultf("%d", labelop);
  192. return (TCL_OK);
  193. } else if (strcmp(argv[1], "msgtbl-get-erlspid") == 0) {
  194. /* 
  195.  * <agent> msgtbl-get-erlspid <msgid>
  196.  */
  197. tcl.resultf("%d",MSGT_.Entry[entrynb].ERLspID);
  198. return (TCL_OK);
  199. } else if (strcmp(argv[1], "msgtbl-set-labelpass") == 0) {
  200. /* 
  201.  * <agent> msgtbl-set-labelpass <msgid>
  202.  */
  203. MSGT_.Entry[entrynb].LabelOp = LDP_LabelPASS;
  204. return (TCL_OK);
  205. } else if (argc == 4) {      
  206. if (strcmp(argv[1], "notification-msg") == 0) {
  207. /* 
  208.  * <agent> notification-msg <status> <lspid>
  209.  */
  210. size_ = PKTsize("*", "*");
  211. if ( atoi(argv[3]) > -1 )  /* packet size adjustment */
  212. size_ += 16;
  213. else
  214. size_ += 8;
  215. Packet* pkt = allocpkt();
  216. hdr_ldp *hdrldp = hdr_ldp::access(pkt);
  217. PKTinit(hdrldp, LDP_NotificationMSG, "*", "*");
  218. if (strcmp(argv[2], "LoopDetected") == 0)
  219. hdrldp->status = LDP_LoopDetected;
  220. else if (strcmp(argv[2], "NoRoute") == 0)
  221. hdrldp->status  = LDP_NoRoute;
  222.        
  223. hdrldp->lspid   = atoi(argv[3]);
  224. send(pkt, 0);
  225. return (TCL_OK);
  226. } else if (strcmp(argv[1], "withdraw-msg") == 0) {
  227. /* 
  228.  * <agent> withdraw-msg <fec> <lspid>
  229.  */
  230. size_ = PKTsize("*","*");
  231. if ( atoi(argv[3]) > -1 )  /* packet size adjustment */
  232. size_ += 16;
  233. else
  234. size_ += 8;
  235. Packet* pkt = allocpkt();
  236. hdr_ldp *hdrldp = hdr_ldp::access(pkt);
  237. PKTinit(hdrldp, LDP_WithdrawMSG, "*", "*");
  238. hdrldp->fec    = atoi(argv[2]);
  239. hdrldp->lspid  = atoi(argv[3]);
  240. send(pkt, 0);
  241. return (TCL_OK);
  242. } else if (strcmp(argv[1], "release-msg") == 0) {
  243. /* 
  244.  * <agent> release-msg <fec> <lspid>
  245.  */
  246. size_ = PKTsize("*","*");
  247. if ( atoi(argv[3]) > -1 )  /* packet size adjustment */
  248. size_ += 16;
  249. else
  250. size_ += 8;
  251. Packet* pkt = allocpkt();
  252. hdr_ldp *hdrldp = hdr_ldp::access(pkt);
  253. PKTinit(hdrldp, LDP_ReleaseMSG,"*","*");
  254. hdrldp->fec     = atoi(argv[2]);
  255. hdrldp->lspid   = atoi(argv[3]);
  256. send(pkt, 0);
  257. return (TCL_OK);
  258. } else if (strcmp(argv[1], "request-msg") == 0) {
  259. /* 
  260.  * <agent> request-msg <fec> <pathvec>
  261.  */
  262. size_ = PKTsize(argv[3],"*");
  263. size_ += 8;      /* packet size adjustment */
  264. Packet* pkt = allocpkt();
  265. hdr_ldp *hdrldp = hdr_ldp::access(pkt);
  266. PKTinit(hdrldp, LDP_RequestMSG, argv[3], "*");
  267. hdrldp->fec     = atoi(argv[2]);
  268. send(pkt, 0);
  269. return (TCL_OK);
  270. } else if (strcmp(argv[1], "msgtbl-set-labelstack") == 0) {
  271. /*
  272.  * <agent> msgtbl-set-labelstack <msgid> <erlspid>
  273.  */
  274. int MsgID   = atoi(argv[2]);
  275. int ERLspID = atoi(argv[3]);
  276. int entrynb = MSGTlocate(MsgID);
  277. MSGT_.Entry[entrynb].LabelOp = LDP_LabelSTACK;
  278. MSGT_.Entry[entrynb].ERLspID = ERLspID;
  279. return (TCL_OK);
  280. } else if (argc == 5) {      
  281. if (strcmp(argv[1], "msgtbl-get-msgid") == 0) {
  282. /* 
  283.  * <classifier> msgtbl-get-msgid <FEC> <LspID> <Src>
  284.  */
  285. int msgid,tmp;
  286. int fec    = atoi(argv[2]);
  287. int LspID  = atoi(argv[3]);
  288. int src    = atoi(argv[4]);     
  289. int entrynb = MSGTlocate(fec,LspID,src);
  290. MSGTlookup(entrynb,msgid,tmp,tmp,tmp,tmp,tmp);
  291. tcl.resultf("%d", msgid);
  292. return (TCL_OK);
  293. }
  294. } else if (argc == 6) {
  295. if (strcmp(argv[1], "mapping-msg") == 0) {
  296. /* 
  297.  * <agent> mapping <fec> <label> <pathvec> <premsgid>
  298.  */
  299. size_ = PKTsize(argv[4],"*");
  300. if ( atoi(argv[5]) > -1 )  /* packet size adjustment*/
  301. size_ += 24;
  302. else
  303. size_ += 16;
  304.           Packet* pkt = allocpkt();
  305. hdr_ldp *hdrldp = hdr_ldp::access(pkt);
  306. PKTinit(hdrldp, LDP_MappingMSG, argv[4], "*");
  307. hdrldp->fec     = atoi(argv[2]);
  308. hdrldp->label   = atoi(argv[3]);
  309. hdrldp->reqmsgid= atoi(argv[5]);
  310. send(pkt, 0);
  311. return (TCL_OK);
  312. } else if (strcmp(argv[1], "cr-mapping-msg") == 0) {
  313. /* 
  314.  * <agent> cr-mapping-msg <fec> <label> <lspid>
  315.  *         <premsgid>
  316.  */
  317. size_ = PKTsize("*","*");
  318. size_ += 32;      /* packet size adjustment */
  319. Packet* pkt = allocpkt();
  320. hdr_ldp *hdrldp = hdr_ldp::access(pkt);
  321. PKTinit(hdrldp, LDP_MappingMSG, "*", "*");
  322. hdrldp->fec     = atoi(argv[2]);
  323. hdrldp->label   = atoi(argv[3]);
  324. hdrldp->lspid   = atoi(argv[4]);
  325. hdrldp->reqmsgid= atoi(argv[5]);
  326. send(pkt, 0);
  327. return (TCL_OK);
  328. }
  329. } else if (argc == 7) {      
  330. if (strcmp(argv[1], "cr-request-msg") == 0) {
  331. /* 
  332.  * <agent> cr-request <fec> <pathvec> <er> <lspid> <rc>
  333.  */
  334. size_ = PKTsize(argv[3],argv[4]);
  335. if (atoi(argv[6]) > -1)  /* packet size adjustment */
  336. size_ += 24;
  337. else
  338. size_ += 16;
  339. Packet* pkt = allocpkt();
  340. hdr_ldp *hdrldp = hdr_ldp::access(pkt);
  341. PKTinit(hdrldp, LDP_RequestMSG, argv[3], argv[4]);
  342. hdrldp->fec     = atoi(argv[2]);
  343. hdrldp->lspid   = atoi(argv[5]);
  344. hdrldp->rc      = atoi(argv[6]);
  345. send(pkt, 0);
  346. return (TCL_OK);
  347. } else if (strcmp(argv[1], "msgtbl-install") == 0) {
  348. /* 
  349.  * <agent> msgtbl-install <msgid> <FEC> <LspID> 
  350.  *         <Src> <Pmsgid>
  351.  */
  352. int msgid  = atoi(argv[2]);
  353. int fec    = atoi(argv[3]);
  354. int LspID  = atoi(argv[4]);
  355. int src    = atoi(argv[5]);     
  356. int PMsgID = atoi(argv[6]);     
  357. int entrynb = MSGTinsert(msgid,fec,LspID,src,PMsgID);
  358. tcl.resultf("%d", entrynb);
  359. return (TCL_OK);
  360. }
  361. }
  362. return (Agent::command(argc, argv));
  363. }
  364. void LDPAgent::recv(Packet* pkt, Handler*)
  365. {
  366. char out[400];  
  367. Tcl& tcl = Tcl::instance();
  368. hdr_ldp *hdrldp = hdr_ldp::access(pkt);
  369. int msgtype = hdrldp->msgtype;
  370. int msgid   = hdrldp->msgid;
  371. int fec     = hdrldp->fec;
  372. int label   = hdrldp->label;
  373. int reqmsgid= hdrldp->reqmsgid;
  374. int status  = hdrldp->status;
  375. int lspid   = hdrldp->lspid;
  376. int rc      = hdrldp->rc;
  377.   
  378. char pathvec[400];
  379. char er[400];
  380. strcpy(pathvec, hdrldp->pathvec);
  381. strcpy(er, hdrldp->er);
  382. ns_addr_t src = hdr_ip::access(pkt)->src_;
  383. trace(src, hdrldp);
  384. free(hdrldp->pathvec);
  385. free(hdrldp->er);
  386. Packet::free(pkt);
  387. switch (msgtype) {
  388. case LDP_NotificationMSG:    /* Notification   */
  389. char code[30];
  390. strcpy(code, parse_status(status));
  391. sprintf(out, "%s get-notification-msg %d %s %d", 
  392. name(), src.addr_, code, lspid);
  393. tcl.eval(out);
  394. break;
  395. case LDP_MappingMSG:    /* Label Mapping  */
  396. if (lspid >= 0) {
  397. /* CR-LDP */
  398. sprintf(out, "%s get-cr-mapping-msg %d %d %d %d %d %d",
  399. name(), msgid, src.addr_, fec, 
  400. label, lspid, reqmsgid);
  401. } else { 
  402. sprintf(out, "%s get-mapping-msg %d %d %d %d %s %d", 
  403. name(), msgid, src.addr_, fec, 
  404. label, pathvec, reqmsgid);
  405. }
  406. tcl.eval(out);
  407. break;
  408. case LDP_RequestMSG:    /* Label Request  */
  409. if (lspid >= 0) { 
  410. sprintf(out,
  411. "%s get-cr-request-msg %d %d %d %s %s %d %d", 
  412. name(), msgid, src.addr_, fec, pathvec,
  413. er, lspid, rc);
  414. } else { 
  415. sprintf(out, "%s get-request-msg %d %d %d %s", 
  416. name(), msgid, src.addr_, fec, pathvec);
  417. }
  418. tcl.eval(out);
  419. break;
  420. case LDP_WithdrawMSG:    /* Label Withdraw */
  421. sprintf(out, "%s get-withdraw-msg %d %d %d", 
  422. name(), src.addr_, fec, lspid);
  423. tcl.eval(out);
  424. break;
  425. case LDP_ReleaseMSG:    /* Label Release */
  426. sprintf(out, "%s get-release-msg %d %d %d", 
  427. name(), src.addr_, fec, lspid);
  428. tcl.eval(out);
  429. break;
  430. }
  431. }
  432. int LDPAgent::MSGTinsert(int MsgID, int FEC, int LspID, int Src, int PMsgID)
  433. {
  434. if (MSGT_.NB == LDP_MaxMSGTEntryNB - 1)
  435. return(-1);
  436. if (MSGTlocate(FEC, LspID, Src) > -1)
  437. return(-1);
  438.     
  439. MSGT_.Entry[MSGT_.NB].MsgID     = MsgID;
  440. MSGT_.Entry[MSGT_.NB].FEC       = FEC;
  441. MSGT_.Entry[MSGT_.NB].LspID     = LspID;
  442. MSGT_.Entry[MSGT_.NB].Src       = Src;
  443. MSGT_.Entry[MSGT_.NB].PMsgID    = PMsgID;
  444. MSGT_.Entry[MSGT_.NB].LabelOp   = LDP_LabelALLOC;
  445. MSGT_.Entry[MSGT_.NB].ERLspID   = -1;
  446.     
  447. MSGT_.NB++;
  448. return(MSGT_.NB-1);
  449. }
  450. void LDPAgent::MSGTdelete(int entrynb)
  451. {
  452. if ( (entrynb > -1) && (entrynb < MSGT_.NB) ) {
  453. MSGT_.Entry[entrynb].MsgID = -1;
  454. MSGT_.Entry[entrynb].FEC   = MSGT_.Entry[entrynb].LspID  = -1;
  455. MSGT_.Entry[entrynb].Src   = MSGT_.Entry[entrynb].PMsgID = -1;
  456. MSGT_.Entry[entrynb].LabelOp = -1;
  457. MSGT_.Entry[entrynb].ERLspID = -1;
  458. }   
  459. }
  460. int LDPAgent::MSGTlocate(int MsgID)
  461. {
  462. if ( MsgID < 0 )
  463. return(-1);
  464.     
  465. for (int i=0; i<MSGT_.NB; i++) {
  466. if ( MSGT_.Entry[i].MsgID == MsgID )
  467. return(i);
  468. }
  469. return(-1);
  470. }
  471. int LDPAgent::MSGTlocate(int FEC, int LspID, int Src)
  472. {
  473. int i;
  474. if ( (FEC < 0) && (Src < 0) ) {
  475. if ( LspID > -1) {
  476. for (i=0; i<MSGT_.NB; i++)
  477. if ( MSGT_.Entry[i].LspID  == LspID )
  478. return(i);
  479. }
  480. return(-1);
  481. }
  482.        
  483. for (i=0; i<MSGT_.NB; i++) {
  484. if ( (MSGT_.Entry[i].FEC   == FEC  ) &&
  485.      (MSGT_.Entry[i].LspID == LspID) &&
  486.      (MSGT_.Entry[i].Src   == Src  ) )
  487. return(i);
  488. }
  489. return(-1);
  490. }
  491. void LDPAgent::MSGTlookup(int entrynb, int &MsgID, int &FEC, int &LspID, 
  492.   int &Src, int &PMsgID, int &LabelOp)
  493. {
  494. if ( (entrynb > -1) && (entrynb < MSGT_.NB) ) {  
  495. MsgID    = MSGT_.Entry[entrynb].MsgID;
  496. FEC      = MSGT_.Entry[entrynb].FEC;
  497. LspID    = MSGT_.Entry[entrynb].LspID;
  498. Src      = MSGT_.Entry[entrynb].Src;
  499. PMsgID   = MSGT_.Entry[entrynb].PMsgID;
  500. LabelOp= MSGT_.Entry[entrynb].LabelOp;
  501. } else {  
  502. MsgID = FEC = LspID = Src = PMsgID = LabelOp = -1;
  503. }
  504. }
  505. void LDPAgent::MSGTdump()
  506. {
  507. for (int i = 0; i < MSGT_.NB; i++) {
  508. cerr << "  # MsgID =" << MSGT_.Entry[i].MsgID << "  ";
  509. cerr << "  # FEC   =" << MSGT_.Entry[i].FEC   << "  ";
  510. cerr << "  # LspID =" << MSGT_.Entry[i].LspID << "  ";
  511. cerr << "  # Src   =" << MSGT_.Entry[i].Src   << "  ";
  512. cerr << "  # PMsgID=" << MSGT_.Entry[i].PMsgID<< "  ";
  513. cerr << "  # LabelOp=" << MSGT_.Entry[i].LabelOp << "n";
  514. }
  515. }
  516. void LDPAgent::trace(ns_addr_t src, hdr_ldp *hdrldp)
  517. {
  518. // XXX will be changed later to directly write to a output channel
  519. // instead of sending stuff to otcl
  520. if (trace_ldp_ == 1) { 
  521. const char *msgtype = parse_msgtype(hdrldp->msgtype,
  522.     hdrldp->lspid);
  523. const char *status = (hdrldp->msgtype == 0x0001) ? 
  524. parse_status(hdrldp->status) : "*";
  525. Tcl::instance().evalf("%s trace-ldp-packet %d %d %s %d %d %d "
  526.       "%s %d %s %d %d %s %7f",
  527.       name(),
  528.       src.addr_,
  529.       src.port_,
  530.       msgtype, 
  531.       hdrldp->msgid, 
  532.       hdrldp->fec, 
  533.       hdrldp->label, 
  534.       hdrldp->pathvec, 
  535.       hdrldp->lspid, 
  536.       hdrldp->er, 
  537.       hdrldp->rc, 
  538.       hdrldp->reqmsgid,
  539.       status,
  540.       Scheduler::instance().clock());  
  541. }
  542. }
  543. char* LDPAgent::parse_msgtype(int msgtype, int lspid)
  544. {
  545. switch (msgtype) {
  546. case LDP_NotificationMSG:    /* Notification   */
  547. return("Notification");
  548. case LDP_MappingMSG:    /* Label Mapping  */
  549. if (lspid >= 0)          /* CR-LDP */
  550. return("CR-Mapping");
  551. else
  552. return("Mapping");
  553. case LDP_RequestMSG:    /* Label Request  */
  554. if (lspid >= 0)
  555. return("CR-Request");
  556. else
  557. return("Request");
  558. case LDP_WithdrawMSG:    /* Label Withdraw */
  559. return("Withdraw");
  560. case LDP_ReleaseMSG:    /* Label Release */
  561. return("Release");
  562. }
  563. return ("Error");
  564. }
  565. char* LDPAgent::parse_status(int status)
  566. {
  567. switch (status) {
  568. case LDP_LoopDetected:
  569. return "LoopDetected";
  570. case LDP_NoRoute:
  571. return "NoRoute";
  572. default:
  573. return "Unknown";
  574. }
  575. }