00001 00002 /* 00003 * rtProtoLS.h 00004 * Copyright (C) 2000 by the University of Southern California 00005 * $Id: rtProtoLS.h,v 1.4 2005/08/25 18:58:06 johnh Exp $ 00006 * 00007 * This program is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU General Public License, 00009 * version 2, as published by the Free Software Foundation. 00010 * 00011 * This program is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 * GNU General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU General Public License along 00017 * with this program; if not, write to the Free Software Foundation, Inc., 00018 * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. 00019 * 00020 * 00021 * The copyright of this module includes the following 00022 * linking-with-specific-other-licenses addition: 00023 * 00024 * In addition, as a special exception, the copyright holders of 00025 * this module give you permission to combine (via static or 00026 * dynamic linking) this module with free software programs or 00027 * libraries that are released under the GNU LGPL and with code 00028 * included in the standard release of ns-2 under the Apache 2.0 00029 * license or under otherwise-compatible licenses with advertising 00030 * requirements (or modified versions of such code, with unchanged 00031 * license). You may copy and distribute such a system following the 00032 * terms of the GNU GPL for this module and the licenses of the 00033 * other code concerned, provided that you include the source code of 00034 * that other code when and as the GNU GPL requires distribution of 00035 * source code. 00036 * 00037 * Note that people who make modified versions of this module 00038 * are not obligated to grant this special exception for their 00039 * modified versions; it is their choice whether to do so. The GNU 00040 * General Public License gives permission to release a modified 00041 * version without this exception; this exception also makes it 00042 * possible to release a modified version which carries forward this 00043 * exception. 00044 * 00045 */ 00046 // Other copyrights might apply to parts of this software and are so 00047 // noted when applicable. 00048 // 00049 // Copyright (C) 1998 by Mingzhou Sun. All rights reserved. 00050 // This software is developed at Rensselaer Polytechnic Institute under 00051 // DARPA grant No. F30602-97-C-0274 00052 // Redistribution and use in source and binary forms are permitted 00053 // provided that the above copyright notice and this paragraph are 00054 // duplicated in all such forms and that any documentation, advertising 00055 // materials, and other materials related to such distribution and use 00056 // acknowledge that the software was developed by Mingzhou Sun at the 00057 // Rensselaer Polytechnic Institute. The name of the University may not 00058 // be used to endorse or promote products derived from this software 00059 // without specific prior written permission. 00060 // 00061 // $Header: /cvsroot/nsnam/ns-2/linkstate/rtProtoLS.h,v 1.4 2005/08/25 18:58:06 johnh Exp $ 00062 00063 #ifndef ns_rtprotols_h 00064 #define ns_rtprotols_h 00065 00066 #include "packet.h" 00067 #include "agent.h" 00068 #include "ip.h" 00069 #include "ls.h" 00070 #include "hdr-ls.h" 00071 00072 extern LsMessageCenter messageCenter; 00073 00074 class rtProtoLS : public Agent , public LsNode { 00075 public: 00076 rtProtoLS() : Agent(PT_RTPROTO_LS) { 00077 LS_ready_ = 0; 00078 } 00079 int command(int argc, const char*const* argv); 00080 void sendpkt(ns_addr_t dst, u_int32_t z, u_int32_t mtvar); 00081 void recv(Packet* p, Handler*); 00082 00083 protected: 00084 void initialize(); // init nodeState_ and routing_ 00085 void setDelay(int nbrId, double delay) { 00086 delayMap_.insert(nbrId, delay); 00087 } 00088 void sendBufferedMessages() { routing_.sendBufferedMessages(); } 00089 void computeRoutes() { routing_.computeRoutes(); } 00090 void intfChanged(); 00091 void sendUpdates() { routing_.sendLinkStates(); } 00092 void lookup(int destinationNodeId); 00093 00094 public: 00095 bool sendMessage(int destId, u_int32_t messageId, int size); 00096 void receiveMessage(int sender, u_int32_t msgId); 00097 00098 int getNodeId() { return nodeId_; } 00099 LsLinkStateList* getLinkStateListPtr() { return &linkStateList_; } 00100 LsNodeIdList* getPeerIdListPtr() { return &peerIdList_; } 00101 LsDelayMap* getDelayMapPtr() { 00102 return delayMap_.empty() ? (LsDelayMap *)NULL : &delayMap_; 00103 } 00104 void installRoutes() { 00105 Tcl::instance().evalf("%s route-changed", name()); 00106 } 00107 00108 private: 00109 typedef LsMap<int, ns_addr_t> PeerAddrMap; // addr for peer Id 00110 PeerAddrMap peerAddrMap_; 00111 int nodeId_; 00112 int LS_ready_; // to differentiate fake and real LS, debug, 0 == no 00113 // needed in recv and sendMessage; 00114 00115 LsLinkStateList linkStateList_; 00116 LsNodeIdList peerIdList_; 00117 LsDelayMap delayMap_; 00118 LsRouting routing_; 00119 00120 int findPeerNodeId(ns_addr_t agentAddr); 00121 }; 00122 00123 #endif // ns_rtprotols_h