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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * ls.h
  3.  * Copyright (C) 2000 by the University of Southern California
  4.  * $Id: ls.h,v 1.9 2006/02/21 15:20:18 mahrenho Exp $
  5.  *
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License,
  8.  * version 2, as published by the Free Software Foundation.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License along
  16.  * with this program; if not, write to the Free Software Foundation, Inc.,
  17.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  18.  *
  19.  *
  20.  * The copyright of this module includes the following
  21.  * linking-with-specific-other-licenses addition:
  22.  *
  23.  * In addition, as a special exception, the copyright holders of
  24.  * this module give you permission to combine (via static or
  25.  * dynamic linking) this module with free software programs or
  26.  * libraries that are released under the GNU LGPL and with code
  27.  * included in the standard release of ns-2 under the Apache 2.0
  28.  * license or under otherwise-compatible licenses with advertising
  29.  * requirements (or modified versions of such code, with unchanged
  30.  * license).  You may copy and distribute such a system following the
  31.  * terms of the GNU GPL for this module and the licenses of the
  32.  * other code concerned, provided that you include the source code of
  33.  * that other code when and as the GNU GPL requires distribution of
  34.  * source code.
  35.  *
  36.  * Note that people who make modified versions of this module
  37.  * are not obligated to grant this special exception for their
  38.  * modified versions; it is their choice whether to do so.  The GNU
  39.  * General Public License gives permission to release a modified
  40.  * version without this exception; this exception also makes it
  41.  * possible to release a modified version which carries forward this
  42.  * exception.
  43.  *
  44.  */
  45. // Other copyrights might apply to parts of this software and are so
  46. // noted when applicable.
  47. //
  48. //  Copyright (C) 1998 by Mingzhou Sun. All rights reserved.
  49. //  This software is developed at Rensselaer Polytechnic Institute under 
  50. //  DARPA grant No. F30602-97-C-0274
  51. //  Redistribution and use in source and binary forms are permitted
  52. //  provided that the above copyright notice and this paragraph are
  53. //  duplicated in all such forms and that any documentation, advertising
  54. //  materials, and other materials related to such distribution and use
  55. //  acknowledge that the software was developed by Mingzhou Sun at the
  56. //  Rensselaer  Polytechnic Institute.  The name of the University may not 
  57. //  be used to endorse or promote products derived from this software 
  58. //  without specific prior written permission.
  59. //
  60. // $Header: /cvsroot/nsnam/ns-2/linkstate/ls.h,v 1.9 2006/02/21 15:20:18 mahrenho Exp $
  61. #ifndef ns_ls_h
  62. #define ns_ls_h
  63. #include <sys/types.h> 
  64. #include <list>
  65. #include <map>
  66. #include <utility>
  67. #include "timer-handler.h"
  68. const int LS_INVALID_COUNT = -1;
  69. const int LS_INIT_ACCESS_COUNT = 3;
  70. const int LS_INVALID_NODE_ID = 65535;
  71. const int LS_INVALID_COST = 65535;
  72. const int LS_MIN_COST = 0;
  73. const int LS_MAX_COST = 65534;
  74. const int LS_MESSAGE_CENTER_SIZE_FACTOR = 4; // times the number of nodes 
  75. const int LS_DEFAULT_MESSAGE_SIZE = 100; // in bytes
  76. const int LS_LSA_MESSAGE_SIZE = 100; // in bytes
  77. const double LS_RTX_TIMEOUT = 0.002;  // default to 2ms to begin with
  78. const int LS_TIMEOUT_FACTOR = 3;   // x times of one-way total delay
  79. // Topo message is not too long due to incremental update
  80. const int LS_TOPO_MESSAGE_SIZE = 200; // in bytes
  81. const int LS_ACK_MESSAGE_SIZE = 20; // in bytes
  82. const unsigned int LS_INVALID_MESSAGE_ID = 0;
  83. const unsigned int LS_BIG_NUMBER = 1048576;
  84. const unsigned int LS_WRAPAROUND_THRESHOLD = 1073741824; // 2^30
  85. const unsigned int LS_MESSAGE_TYPES = 6;
  86. enum ls_status_t { 
  87. LS_STATUS_DOWN = 0, 
  88. LS_STATUS_UP = 1
  89. };
  90. enum ls_message_type_t { 
  91. LS_MSG_INVALID = 0, 
  92. LS_MSG_LSA = 1, // Link state advertisement
  93. LS_MSG_TPM = 2, // Topology map message
  94. LS_MSG_LSAACK = 3, // Link state advertisement ACK
  95. LS_MSG_TPMACK = 4, 
  96. LS_MSG_LSM = 5
  97. };
  98. template <class _Tp>
  99. class LsList : public list<_Tp> {
  100. public:
  101. typedef list<_Tp> baseList;
  102. LsList() : baseList() {}
  103. LsList(const _Tp& x) : baseList(1, x) {}
  104. void eraseAll() { 
  105. baseList::erase(baseList::begin(), baseList::end()); 
  106. }
  107. LsList<_Tp>& operator= (const LsList<_Tp> & x) {
  108. return (LsList<_Tp> &)baseList::operator= (x);
  109. }
  110. };
  111. template<class Key, class T>
  112. class LsMap : public map<Key, T, less<Key> > {
  113. public:
  114. typedef less<Key> less_key;
  115. typedef map<Key, T, less_key> baseMap;
  116. LsMap() : baseMap() {}
  117. // this next typedef of iterator seems extraneous but is required by gcc-2.96
  118. typedef typename map<Key, T, less<Key> >::iterator iterator;
  119. typedef pair<iterator, bool> pair_iterator_bool;
  120. iterator insert(const Key & key, const T & item) {
  121. typename baseMap::value_type v(key, item);
  122. pair_iterator_bool ib = baseMap::insert(v);
  123. return ib.second ? ib.first : baseMap::end();
  124. }
  125. void eraseAll() { erase(baseMap::begin(), baseMap::end()); }
  126. T* findPtr(Key key) {
  127. iterator it = baseMap::find(key);
  128. return (it == baseMap::end()) ? (T *)NULL : &((*it).second);
  129. }
  130. };
  131. /*
  132.   LsNodeIdList -- A list of int 's. It manages its own memory
  133. */
  134. class LsNodeIdList : public LsList<int> {
  135. public:
  136. int appendUnique (const LsNodeIdList& x);
  137. };  
  138. /* -------------------------------------------------------------------*/
  139. /* 
  140.    LsLinkState -- representing a link, contains neighborId, cost and status
  141. */
  142. struct LsLinkState {
  143. // public data
  144. int neighborId_;  
  145. ls_status_t status_;
  146. int cost_;
  147. u_int32_t sequenceNumber_;  
  148. // public methods
  149. LsLinkState() : neighborId_(LS_INVALID_NODE_ID),
  150. status_(LS_STATUS_DOWN), cost_(LS_INVALID_COST) {}
  151. LsLinkState(int id, ls_status_t s, int c) : neighborId_(id), 
  152. status_(s), cost_(c) {}
  153. void init (int nbId, ls_status_t s, int c){
  154. neighborId_ = nbId;
  155. status_ = s;
  156. cost_ =c;
  157. }
  158. } ;
  159. /* 
  160.    LsLinkStateList 
  161. */
  162. typedef LsList<LsLinkState> LsLinkStateList;
  163. /* -------------------------------------------------------------------*/
  164. /*
  165.   LsTopoMap
  166.   the Link State Database, the representation of the
  167.   topology within the protocol 
  168. */
  169. typedef LsMap<int, LsLinkStateList> LsLinkStateListMap;
  170. class LsTopoMap : public LsLinkStateListMap {
  171. public:
  172. // constructor / destructor 
  173. // the default ones 
  174. LsTopoMap() : LsLinkStateListMap() {}
  175.   
  176. //   // map oeration
  177. //   iterator begin() { return LsLinkStateListMap::begin();}
  178. //   iterator end() { return LsLinkStateListMap::end();}
  179. //  iterator begin() { return baseMap::begin();}
  180. //   const_iterator begin() const { return  baseMap::begin();}
  181. //   iterator end() { return baseMap::end();}
  182. //   const_iterator end() const { return baseMap::end();}
  183. // insert one link state each time 
  184. LsLinkStateList* insertLinkState(int nodeId, 
  185.  const LsLinkState& linkState);
  186. // update returns true if there's change
  187. bool update(int nodeId, const LsLinkStateList& linkStateList);
  188. //   friend ostream & operator << ( ostream & os, LsTopoMap & x) ;
  189. void setNodeId(int id) { myNodeId_ = id ;}
  190. private:
  191. int myNodeId_; // for update()
  192. };
  193. typedef LsTopoMap LsTopology;
  194. typedef LsTopoMap* LsTopoMapPtr;
  195. /*
  196.   LsPath - A struct with destination, cost, nextHop
  197. */
  198. struct LsPath {
  199. LsPath() : destination (LS_INVALID_NODE_ID) {}
  200. LsPath(int dest, int c, int nh)
  201. : destination (dest), cost(c), nextHop(nh) {}
  202. // methods
  203. bool isValid() { 
  204. return ((destination != LS_INVALID_NODE_ID) && 
  205. (cost != LS_INVALID_COST) && 
  206. (nextHop != LS_INVALID_COST));
  207. }
  208. // public data
  209. int destination;
  210. int cost;
  211. int nextHop;
  212. };
  213. /*
  214.   LsEqualPaths -- A struct with one cost and a list of multiple next hops
  215.   Used by LsPaths
  216. */
  217. struct LsEqualPaths {
  218. public:
  219. int  cost;
  220. LsNodeIdList nextHopList;
  221. // constructors
  222. LsEqualPaths() : cost(LS_INVALID_COST) {}
  223. LsEqualPaths(int c, int nh) : cost(c), nextHopList() {
  224. nextHopList.push_back(nh);
  225. }
  226. LsEqualPaths(const LsPath & path) : cost (path.cost), nextHopList() {
  227. nextHopList.push_back(path.nextHop);
  228. }
  229. LsEqualPaths(int c, const LsNodeIdList & nhList) 
  230. : cost(c), nextHopList(nhList) {}
  231.   
  232. LsEqualPaths& operator = (const LsEqualPaths & x ) {
  233. cost = x.cost;
  234. nextHopList = x.nextHopList;
  235. return *this;
  236. }
  237. // copy 
  238. LsEqualPaths& copy(const LsEqualPaths & x) { return operator = (x) ;}
  239. // appendNextHopList 
  240. int appendNextHopList(const LsNodeIdList & nhl) {
  241. return nextHopList.appendUnique (nhl);
  242. }
  243. };
  244. /* 
  245.    LsEqualPathsMap -- A map of LsEqualPaths
  246. */
  247. typedef LsMap< int, LsEqualPaths > LsEqualPathsMap;
  248. /*
  249.   LsPaths -- enhanced LsEqualPathsMap, used in LsRouting
  250. */
  251. class LsPaths : public LsEqualPathsMap {
  252. public:
  253. LsPaths(): LsEqualPathsMap() {}
  254.   
  255. // -- map operations 
  256. iterator begin() { return LsEqualPathsMap::begin();}
  257. iterator end() { return LsEqualPathsMap::end();}
  258. // -- specical methods that facilitates computeRoutes of LsRouting
  259. // lookupCost
  260. int lookupCost(int destId) {
  261. LsEqualPaths * pEP = findPtr (destId);
  262. if ( pEP == NULL ) return LS_MAX_COST + 1;
  263. // else
  264. return pEP->cost;
  265. }
  266. // lookupNextHopListPtr
  267. LsNodeIdList* lookupNextHopListPtr(int destId) {
  268. LsEqualPaths* pEP = findPtr(destId);
  269. if (pEP == NULL ) 
  270. return (LsNodeIdList *) NULL;
  271. // else
  272. return &(pEP->nextHopList);
  273. }
  274.   
  275. // insertPath without checking validity
  276. iterator insertPathNoChecking(int destId, int cost, int nextHop) {
  277. LsEqualPaths ep(cost, nextHop);
  278. iterator itr = insert(destId, ep);
  279. return itr; // for clarity
  280. }     
  281. // insertPathNoChekcing()
  282. iterator insertPathNoChecking (const LsPath & path) {
  283. return insertPathNoChecking(path.destination, path.cost, 
  284.     path.nextHop);
  285. }
  286. // insertPath(), returns end() if error, else return iterator 
  287. iterator insertPath(int destId, int cost, int nextHop);
  288. iterator insertPath(const LsPath& path) {
  289. return insertPath(path.destination, path.cost, path.nextHop);
  290. }
  291. // insertNextHopList 
  292. iterator insertNextHopList(int destId, int cost, 
  293.    const LsNodeIdList& nextHopList);
  294. };
  295. /*
  296.   LsPathsTentative -- Used in LsRouting, remembers min cost and location 
  297. */
  298. class LsPathsTentative : public LsPaths {
  299. public:
  300. LsPathsTentative() : LsPaths(), minCost(LS_MAX_COST+1) {
  301. minCostIterator = end();
  302. }
  303.   
  304. // combining get and remove min path
  305. LsPath popShortestPath();
  306.   
  307. private:
  308. int minCost; // remembers the min cost
  309. iterator minCostIterator; // remembers where it's stored
  310. iterator findMinEqualPaths();
  311. };
  312. /* 
  313.    LsMessage 
  314. */
  315. struct LsMessage {
  316. LsMessage() : type_(LS_MSG_INVALID), contentPtr_(NULL) {}
  317. LsMessage(u_int32_t id, int nodeId, ls_message_type_t t) :
  318. type_(t), messageId_(id),
  319. sequenceNumber_(id), originNodeId_(nodeId), 
  320. contentPtr_(NULL) {}
  321. ~LsMessage() {
  322. if ((type_ == LS_MSG_LSM) && (lslPtr_ != NULL)) {
  323. delete lslPtr_;
  324. lslPtr_ = NULL;
  325. }
  326. }
  327. ls_message_type_t type_;
  328. u_int32_t messageId_;
  329. u_int32_t sequenceNumber_; 
  330. int originNodeId_; 
  331. union {
  332. LsLinkStateList* lslPtr_;
  333. const LsTopoMap* topoPtr_;
  334. void* contentPtr_;
  335. };
  336. };
  337. // TODO -- not used, comment out
  338. // Some time we just want the header, since the message has a content
  339. // which will be destroyed with it goes out of scope, 
  340. // used by ack manager
  341. struct LsMessageInfo
  342. {
  343. ls_message_type_t type_;
  344. int destId_; 
  345. u_int32_t msgId_;
  346. u_int32_t sequenceNumber_;    
  347. union {
  348. // for LSA, the originator of the msg
  349. int originNodeId_;  
  350. // for LSA_ACK, the originator of the lsa being acked
  351. int originNodeIdAck_; 
  352. };
  353. // constructor 
  354. LsMessageInfo() {}
  355. LsMessageInfo(int d, const LsMessage& msg ) :
  356. type_(msg.type_), destId_(d),  msgId_(msg.messageId_),
  357. sequenceNumber_(msg.sequenceNumber_),
  358. originNodeId_(msg.originNodeId_)  {}
  359. LsMessageInfo(int d , ls_message_type_t t, int o, 
  360.       u_int32_t seq, u_int32_t mId) :
  361. type_(t), destId_(d), msgId_(mId), sequenceNumber_(seq), 
  362. originNodeId_(o) {}
  363. };
  364. /* 
  365.    LsMessageCenter -- Global storage of LsMessage's for retrieval
  366. */
  367. class LsMessageCenter {
  368. public:
  369. typedef LsMap <u_int32_t, LsMessage> baseMap;
  370. // constructor
  371. LsMessageCenter () 
  372. : current_lsa_id(LS_INVALID_MESSAGE_ID + 1), 
  373. current_other_id(LS_INVALID_MESSAGE_ID + 2),
  374. max_size(0), lsa_messages(), other_messages() {}
  375.   
  376. void setNodeNumber (int number_of_nodes) {
  377. max_size = number_of_nodes * LS_MESSAGE_CENTER_SIZE_FACTOR;
  378. }
  379. LsMessage* newMessage (int senderNodeId, ls_message_type_t type);
  380. u_int32_t duplicateMessage( u_int32_t msgId) {
  381. return msgId;
  382. }
  383. u_int32_t duplicateMessage(const LsMessage& msg) {
  384. return duplicateMessage(msg.messageId_);
  385. }
  386. bool deleteMessage(u_int32_t msgId) ;
  387. bool deleteMessage (const LsMessage& msg) {
  388. return deleteMessage(msg.messageId_);
  389. }
  390. LsMessage* retrieveMessagePtr(u_int32_t msgId){
  391. if (isLSA(msgId)) {
  392. return lsa_messages.findPtr(msgId);
  393. } else {
  394. return other_messages.findPtr(msgId);
  395. }
  396. }
  397. static LsMessageCenter& instance() { 
  398. return msgctr_;
  399. }
  400. private:
  401. static LsMessageCenter msgctr_; // Singleton class
  402. u_int32_t current_lsa_id ;
  403. u_int32_t current_other_id;
  404. unsigned int max_size; // if size() greater than this number, erase begin().
  405. typedef LsMap <u_int32_t, LsMessage > message_storage;
  406. message_storage lsa_messages;
  407. message_storage other_messages;
  408. void init();
  409. int isLSA (u_int32_t msgId) {
  410. // to see if msgId's last bit is different from 
  411. // LS_INVALID_MESSAGE_ID
  412. return (0x1 & (msgId ^ LS_INVALID_MESSAGE_ID));
  413. }
  414. };
  415. /* 
  416.    LsMessageHistory 
  417. */
  418. typedef LsList<u_int32_t> LsMessageIdList;
  419. typedef less<int> less_node_id;
  420. class LsMessageHistory : public LsMap<int, u_int32_t> {
  421. public:
  422. // isNewMessage, note: it saves this one in the history as well
  423. bool isNewMessage ( const LsMessage & msg ); 
  424. };
  425. class LsRetransmissionManager;
  426. class LsRetransTimer : public TimerHandler {
  427. public:
  428. LsRetransTimer() {}
  429. LsRetransTimer (LsRetransmissionManager *amp , int nbrId)
  430. : ackManagerPtr_(amp), neighborId_(nbrId) {}
  431. virtual void expire(Event *e);
  432. protected:
  433. LsRetransmissionManager* ackManagerPtr_;
  434. int neighborId_;
  435. };
  436. struct LsIdSeq {
  437. u_int32_t msgId_;
  438. u_int32_t seq_;
  439. LsIdSeq() {}
  440. LsIdSeq(u_int32_t id, u_int32_t s) : msgId_(id), seq_(s) {}
  441. };
  442. /* LsUnackPeer 
  443.    used in ackManager to keep record a peer who still haven't ack some of 
  444.    its LSA or Topo packets
  445. */
  446. struct LsUnackPeer {
  447. double rtxTimeout_; // time out value 
  448. LsRetransTimer timer_;
  449. u_int32_t tpmSeq_; // topo message Id
  450. LsMap<int, LsIdSeq> lsaMap_;
  451. // constructor
  452. LsUnackPeer() : tpmSeq_(LS_INVALID_MESSAGE_ID) {}
  453. LsUnackPeer(LsRetransmissionManager* amp, int nbrId, 
  454.     double timeout = LS_RTX_TIMEOUT) : 
  455. rtxTimeout_(timeout), timer_(amp, nbrId), 
  456. tpmSeq_(LS_INVALID_MESSAGE_ID) {}
  457. };
  458. /* 
  459.    LsDelayMap
  460.    store the estimated one-way total delay for eay neighbor, in second
  461. */
  462. typedef LsMap< int, double > LsDelayMap; 
  463. /* 
  464.    LsRetransmissionManager -- handles retransmission and acknowledgement
  465. */
  466. class LsRouting; 
  467. class LsRetransmissionManager : public LsMap<int, LsUnackPeer> {
  468. public:
  469. LsRetransmissionManager(LsRouting& lsr) : lsRouting_(lsr) {} 
  470. void initTimeout(LsDelayMap* delayMapPtr);
  471. void cancelTimer(int neighborId);
  472. // Called by LsRouting when a message is sent out 
  473. int messageOut(int peerId, const LsMessage& msg);
  474.   
  475. // Called by LsRouting when an ack is received
  476. int ackIn(int peerId,  const LsMessage& ack);
  477. // Called by retransmit timer
  478. int resendMessages(int peerId);
  479. private:
  480. // data
  481. LsRouting& lsRouting_;
  482. };
  483. inline void LsRetransTimer::expire(Event *e) 
  484. ackManagerPtr_->resendMessages(neighborId_); 
  485. }
  486.    
  487. /* 
  488.    LsNode -- represents the node environment interface 
  489.    It serves as the interface between the Routing class and the actual 
  490.    simulation enviroment 
  491.    rtProtoLS will derive from LsNode as well as Agent
  492. */
  493. class LsNode {
  494. public:
  495.         virtual ~LsNode () {}
  496. virtual bool sendMessage(int destId, u_int32_t msgId, 
  497.   int msgsz = LS_DEFAULT_MESSAGE_SIZE) = 0;
  498. virtual void receiveMessage(int sender, u_int32_t msgId) = 0;
  499. // TODO , maybe not, use one type of message, that's it. 
  500. // All go to message center.
  501. // sendAck 
  502. // receiveAck
  503. virtual int getNodeId() = 0;
  504. virtual LsLinkStateList* getLinkStateListPtr()= 0; 
  505. virtual LsNodeIdList* getPeerIdListPtr() = 0;
  506. virtual LsDelayMap* getDelayMapPtr() = 0;
  507. };
  508. /* 
  509.    LsRouting -- The implementation of the Link State Routing protocol
  510. */
  511. class LsRouting {
  512. public:
  513. static int msgSizes[ LS_MESSAGE_TYPES ];
  514. friend class LsRetransmissionManager;
  515. // constructor and distructor
  516. LsRouting() : myNodePtr_(NULL),  myNodeId_(LS_INVALID_NODE_ID), 
  517. peerIdListPtr_(NULL), linkStateListPtr_(NULL),
  518. routingTablePtr_(NULL),
  519. linkStateDatabase_(), lsaHistory_(), ackManager_(*this) {}
  520. ~LsRouting() {
  521. //delete pLinkStateDatabase;
  522. if (routingTablePtr_ != NULL)
  523. delete routingTablePtr_;
  524. }
  525. bool init(LsNode* nodePtr);
  526. void computeRoutes() {
  527.         if (routingTablePtr_ != NULL)
  528.                 delete routingTablePtr_;
  529.         routingTablePtr_ = _computeRoutes();
  530. }
  531. LsEqualPaths* lookup(int destId) {
  532. return (routingTablePtr_ == NULL) ? 
  533. (LsEqualPaths *)NULL : 
  534. routingTablePtr_->findPtr(destId);
  535. }
  536. // to propogate LSA, all Links, called by node and self
  537. bool sendLinkStates(bool buffer = false); 
  538. void linkStateChanged();
  539. void sendBufferedMessages() ;
  540. // called by node when messages arrive
  541. bool receiveMessage(int senderId , u_int32_t msgId);
  542. private:
  543. // most of these pointers should have been references, 
  544. // except routing table
  545. LsNode * myNodePtr_; // where I am residing in
  546. int myNodeId_; // who am I
  547. LsNodeIdList* peerIdListPtr_; // my peers
  548. LsLinkStateList* linkStateListPtr_; // My links
  549. LsMessageCenter* messageCenterPtr_; // points to static messageCenter
  550. LsPaths* routingTablePtr_; // the routing table
  551. LsTopoMap linkStateDatabase_; // topology;
  552. LsMessageHistory lsaHistory_; // Remember what we've seen
  553. LsMessageHistory tpmHistory_; 
  554. LsRetransmissionManager ackManager_; // Handles ack and retransmission
  555. struct IdMsgPtr {
  556. int peerId_;
  557. const LsMessage* msgPtr_;
  558. IdMsgPtr() {};
  559. IdMsgPtr(int id, const LsMessage* p) :
  560. peerId_(id), msgPtr_(p) {}
  561. };
  562. typedef LsList<IdMsgPtr> MessageBuffer;
  563. MessageBuffer messageBuffer_;
  564. private:
  565. LsMessageCenter& msgctr() { return LsMessageCenter::instance(); }
  566. LsPaths* _computeRoutes();
  567. bool isUp(int neighborId);
  568. bool receiveAck (int neighborId, LsMessage* msgPtr) {
  569. ackManager_.ackIn(neighborId, *msgPtr);
  570. return true;
  571. }
  572. bool receiveLSA (int neighborId, LsMessage* msgPtr);
  573. bool receiveTopo(int neighborId, LsMessage* msgPtr);
  574. // send the entire topomap
  575. // don't worry, in simulation only the pointer is sent
  576. // in ospf, only the descrpition of it is sent first, 
  577. void sendTopo(int neighborId);
  578. void regenAndSend(int exception, int origin, 
  579.   const LsLinkStateList& lsl);
  580. bool sendAck(int nbrId, ls_message_type_t type, 
  581.      int originNodeIdAcked, u_int32_t originMsgIdAcked);
  582. void resendMessage(int neighborId, u_int32_t msgId, 
  583.     ls_message_type_t type) {
  584. myNodePtr_->sendMessage(neighborId, msgId, msgSizes[type]);
  585. }
  586. // just store the outgoing messages, and wait for cmd flushBuffer to 
  587. // actually send out 
  588. void bufferedSend (int peerId, const LsMessage* mp) {
  589. messageBuffer_.push_back(IdMsgPtr(peerId, mp));
  590. }
  591. };
  592. #endif // ns_ls_h