00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include "config.h"
00040 #ifdef HAVE_STL
00041
00042 #include "hdr-ls.h"
00043 #include "rtProtoLS.h"
00044 #include "agent.h"
00045 #include "string.h"
00046
00047
00048 class LsTokenList : public LsList<char *> {
00049 public:
00050 LsTokenList (char * str, const char * delim )
00051 : LsList<char*> () {
00052 for ( char * token = strtok (str, delim);
00053 token != NULL; token = strtok(NULL, delim) ) {
00054 push_back (token);
00055 }
00056 }
00057 };
00058
00059 class LsIntList : public LsList<int> {
00060 public:
00061 LsIntList (char * str, const char * delim)
00062 : LsList<int> () {
00063 for ( char * token = strtok (str, delim);
00064 token != NULL; token = strtok(NULL, delim) ) {
00065 push_back ( atoi(token) );
00066 }
00067 }
00068 };
00069
00070 static class rtProtoLSclass : public TclClass {
00071 public:
00072 rtProtoLSclass() : TclClass("Agent/rtProto/LS") {}
00073 TclObject* create(int, const char*const*) {
00074 return (new rtProtoLS);
00075 }
00076 } class_rtProtoLS;
00077
00078
00079 int rtProtoLS::command(int argc, const char*const* argv)
00080 {
00081 if (strcmp(argv[1], "send-update") == 0) {
00082 ns_addr_t dst;
00083 dst.addr_ = atoi(argv[2]);
00084 dst.port_ = atoi(argv[3]);
00085 u_int32_t mtvar = atoi(argv[4]);
00086 u_int32_t size = atoi(argv[5]);
00087 sendpkt(dst, mtvar, size);
00088 return TCL_OK;
00089 }
00090
00091 if (strcmp(argv[1], "lookup") == 0) {
00092 if (argc == 3) {
00093 int dst = atoi(argv[2]);
00094 lookup (dst);
00095
00096 return TCL_OK;
00097 }
00098 }
00099 if (strcmp(argv[1], "initialize") == 0) {
00100 initialize ();
00101 return TCL_OK;
00102 }
00103 if (strcmp(argv[1], "setDelay" ) == 0 ) {
00104 if ( argc == 4) {
00105 int nbrId = atoi(argv[2]);
00106 double delay = strtod ( argv[3], NULL);
00107 setDelay(nbrId, delay);
00108 return TCL_OK;
00109 }
00110 }
00111 if (strcmp(argv[1], "setNodeNumber" ) == 0 ) {
00112 if ( argc == 3 ) {
00113 int number_of_nodes = atoi(argv[2]);
00114 LsMessageCenter::instance().setNodeNumber(number_of_nodes);
00115 }
00116 return TCL_OK;
00117 }
00118 if (strcmp(argv[1], "computeRoutes") == 0) {
00119 computeRoutes();
00120 return TCL_OK;
00121 }
00122 if (strcmp(argv[1], "intfChanged") == 0) {
00123 intfChanged();
00124 return TCL_OK;
00125 }
00126 if (strcmp (argv[1], "send-buffered-messages") == 0) {
00127 sendBufferedMessages();
00128 return TCL_OK;
00129 }
00130 if (strcmp(argv[1], "sendUpdates") == 0) {
00131 sendUpdates ();
00132 return TCL_OK;
00133 }
00134 return Agent::command(argc, argv);
00135 }
00136
00137 void rtProtoLS::sendpkt(ns_addr_t dst, u_int32_t mtvar, u_int32_t size)
00138 {
00139 dst_ = dst;
00140 size_ = size;
00141
00142 Packet* p = Agent::allocpkt();
00143 hdr_LS *rh = hdr_LS::access(p);
00144 rh->metricsVar() = mtvar;
00145
00146 target_->recv(p);
00147 }
00148
00149 void rtProtoLS::recv(Packet* p, Handler*)
00150 {
00151 hdr_LS* rh = hdr_LS::access(p);
00152 hdr_ip* ih = hdr_ip::access(p);
00153
00154 if (LS_ready_ || (rh->metricsVar() == LS_BIG_NUMBER))
00155 receiveMessage(findPeerNodeId(ih->src()), rh->msgId());
00156 else
00157 Tcl::instance().evalf("%s recv-update %d %d", name(),
00158 ih->saddr(), rh->metricsVar());
00159 Packet::free(p);
00160 }
00161
00162
00163
00164
00165
00166 int rtProtoLS::findPeerNodeId (ns_addr_t agentAddr)
00167 {
00168
00169 for (PeerAddrMap::iterator itr = peerAddrMap_.begin();
00170 itr != peerAddrMap_.end(); itr++) {
00171 if ((*itr).second == agentAddr) {
00172 return (*itr).first;
00173 }
00174 }
00175 return LS_INVALID_NODE_ID;
00176 }
00177
00178 void rtProtoLS::initialize()
00179 {
00180 Tcl & tcl = Tcl::instance();
00181
00182 tcl.evalf("%s get-node-id", name());
00183 char * resultString = tcl.result();
00184 nodeId_ = atoi(resultString);
00185
00186
00187 tcl.evalf("%s get-peers", name());
00188 resultString = tcl.result();
00189
00190 int nodeId, neighborId;
00191 ns_addr_t peer;
00192 ls_status_t status;
00193 int cost;
00194
00195
00196 for ( LsIntList intList(resultString, " \t\n");
00197 !intList.empty(); ) {
00198 nodeId = intList.front();
00199 intList.pop_front();
00200
00201 peer.addr_ = intList.front();
00202 intList.pop_front();
00203 peer.port_ = intList.front();
00204 intList.pop_front();
00205 peerAddrMap_.insert(nodeId, peer);
00206 peerIdList_.push_back(nodeId);
00207 }
00208
00209
00210 tcl.evalf("%s get-links-status", name());
00211 resultString = tcl.result();
00212
00213
00214 for ( LsIntList intList2(resultString, " \t\n");
00215 !intList2.empty(); ) {
00216 neighborId = intList2.front();
00217 intList2.pop_front();
00218 status = (ls_status_t) intList2.front();
00219 intList2.pop_front();
00220 cost = (int) intList2.front();
00221 intList2.pop_front();
00222 linkStateList_.push_back(LsLinkState(neighborId,status,cost));
00223 }
00224
00225
00226 tcl.evalf ("%s get-delay-estimates", name());
00227
00228
00229 routing_.init(this);
00230 routing_.computeRoutes();
00231
00232 tcl.evalf("%s set LS_ready", name());
00233 char* token = strtok(tcl.result(), " \t\n");
00234 if (token == NULL)
00235 LS_ready_ = 0;
00236 else
00237 LS_ready_ = atoi(token);
00238 }
00239
00240 void rtProtoLS::intfChanged ()
00241 {
00242
00243 Tcl & tcl = Tcl::instance();
00244
00245 tcl.evalf("%s get-links-status", name());
00246 char * resultString = tcl.result();
00247
00248
00249 linkStateList_.eraseAll();
00250
00251
00252 for (LsIntList intList2(resultString, " \t\n");
00253 !intList2.empty(); ) {
00254 int neighborId = intList2.front();
00255 intList2.pop_front();
00256 ls_status_t status = ( ls_status_t ) intList2.front();
00257 intList2.pop_front();
00258 int cost = (int) intList2.front();
00259 intList2.pop_front();
00260
00261
00262 linkStateList_.push_back(LsLinkState(neighborId,status,cost));
00263 }
00264
00265
00266 routing_.linkStateChanged();
00267 }
00268
00269 void rtProtoLS::lookup(int destId)
00270 {
00271
00272 LsEqualPaths* EPptr = routing_.lookup(destId);
00273
00274
00275 if (EPptr == NULL) {
00276 Tcl::instance().resultf( "%s", "");
00277 return;
00278 }
00279 char resultBuf[64];
00280 sprintf(resultBuf, "%d" , EPptr->cost);
00281 char tmpBuf[16];
00282
00283 for (LsNodeIdList::iterator itr = (EPptr->nextHopList).begin();
00284 itr != (EPptr->nextHopList).end(); itr++) {
00285 sprintf(tmpBuf, " %d", (*itr) );
00286 strcat (resultBuf, tmpBuf);
00287 }
00288
00289 Tcl::instance().resultf("%s", resultBuf);
00290 }
00291
00292 void rtProtoLS::receiveMessage(int sender, u_int32_t msgId)
00293 {
00294 if (routing_.receiveMessage(sender, msgId))
00295 installRoutes();
00296 }
00297
00298
00299 bool rtProtoLS::sendMessage(int destId, u_int32_t messageId, int size)
00300 {
00301 ns_addr_t* agentAddrPtr = peerAddrMap_.findPtr(destId);
00302 if (agentAddrPtr == NULL)
00303 return false;
00304 dst_ = *agentAddrPtr;
00305 size_ = size;
00306
00307 Packet* p = Agent::allocpkt();
00308 hdr_LS *rh = hdr_LS::access(p);
00309 rh->msgId() = messageId;
00310 rh->metricsVar() = LS_BIG_NUMBER;
00311 target_->recv(p);
00312
00313 return true;
00314 }
00315
00316 #endif // HAVE_STL