Changeset 5902 for source/ariba/overlay/BaseOverlay.cpp
- Timestamp:
- Aug 13, 2009, 2:51:52 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
source/ariba/overlay/BaseOverlay.cpp
r5901 r5902 132 132 OverlayMsg msg( OverlayMsg::typeLinkAlive, 133 133 OverlayInterface::OVERLAY_SERVICE_ID, nodeId, ld->remoteNode ); 134 msg.setRelayed(true);135 134 if (ld->relayed) msg.setRouteRecord(true); 136 135 send_link( &msg, ld->overlayId ); … … 235 234 // exceeded time-to-live? yes-> drop message 236 235 if (message->getNumHops() > message->getTimeToLive()) { 237 logging_warn("Message exceeded TTL -> drop message!"); 236 logging_warn("Message exceeded TTL. Dropping message and relay routes" 237 "for recovery."); 238 relay_routes.clear(); 238 239 return; 240 } 239 241 240 242 // no-> forward message 241 }else {243 else { 242 244 // destinastion myself? yes-> handle message 243 245 if (message->getDestinationNode() == nodeId) { … … 269 271 } 270 272 271 // relay path known? yes-> send over relay link 272 next_link = getRelayLinkTo( destination ); 273 if (next_link != NULL) { 274 if (message->isRelayed()) next_link->setRelaying(); 275 return send(message, next_link); 276 } 277 278 // no-> relay path! route over overlay path 279 LinkID next_id = overlayInterface->getNextLinkId( destination ); 280 if (next_id.isUnspecified()) { 281 logging_error("Could not send message. No next hop found to " << destination ); 282 return -1; 283 } 284 285 // get link descriptor, up and running? yes-> send message 286 next_link = getDescriptor(next_id); 287 if (next_link != NULL && next_link->up) 288 return send(message, next_link); 289 290 // no-> error, dropping message 273 // use relay path? 274 if (message->isRelayed()) { 275 next_link = getRelayLinkTo( destination ); 276 if (next_link != NULL) { 277 next_link->setRelaying(); 278 return bc->sendMessage(next_link->communicationId, message); 279 } else { 280 logging_error("Could not send message. No relay hop found to " 281 << destination) 282 return -1; 283 } 284 } 285 286 // routed message 291 287 else { 292 logging_error("Could not send message. Link not known or up"); 293 return -1; 288 // no-> relay path! route over overlay path 289 LinkID next_id = overlayInterface->getNextLinkId( destination ); 290 if (next_id.isUnspecified()) { 291 logging_error("Could not send message. No next hop found to " << 292 destination ); 293 return -1; 294 } 295 296 // get link descriptor, up and running? yes-> send message 297 next_link = getDescriptor(next_id); 298 if (next_link != NULL && next_link->up) { 299 // send message over relayed link 300 return send(message, next_link); 301 } 302 303 // no-> error, dropping message 304 else { 305 logging_error("Could not send message. Link not known or up"); 306 return -1; 307 } 294 308 } 295 309 … … 317 331 logging_debug("Resolving direct link for relayed link to " 318 332 << ldr->remoteNode); 319 message->setRelayed(); 320 return send(message, ldr->remoteNode); 333 ld = getRelayLinkTo( ldr->remoteNode ); 334 ld->setRelaying(); 335 message->setRelayed(true); 321 336 } else 322 337 ld = ldr; … … 355 370 356 371 message->setService(ld->service); 372 message->setRelayed(ld->relayed); 357 373 return send( message, ld, ignore_down ); 358 374 } … … 401 417 if (ld == NULL 402 418 || ld->relayed 403 || !message->isRelayed()404 // || !(message->getService() == OverlayInterface::OVERLAY_SERVICE_ID)405 419 || message->getSourceNode()==nodeId ) return; 406 420 407 // check wheter this node is already part of the routing table 408 LinkID next_link = overlayInterface->getNextLinkId(message->getSourceNode()); 409 if (next_link == ld->overlayId) return; 410 ld->setRelaying(); 411 412 // try to find source node 413 BOOST_FOREACH( relay_route& route, relay_routes ) { 414 415 // relay route found? yes-> 416 if ( route.node == message->getSourceNode() ) { 417 418 // refresh timer 419 route.used = time(NULL); 420 421 // route has a shorter hop count? yes-> replace 422 if (route.hops > message->getNumHops() ) { 423 logging_info("Updating relay information to node " 424 << route.node.toString() 425 << " reducing to " << message->getNumHops() << " hops."); 426 route.hops = message->getNumHops(); 427 route.link = ld->overlayId; 421 // update usage information 422 if (message->isRelayed()) { 423 // try to find source node 424 BOOST_FOREACH( relay_route& route, relay_routes ) { 425 // relay route found? yes-> 426 if ( route.node == message->getDestinationNode() ) { 427 ld->setRelaying(); 428 route.used = time(NULL); 428 429 } 429 return; 430 } 431 } 432 433 // not found-> add new entry 434 relay_route route; 435 route.hops = message->getNumHops(); 436 route.link = ld->overlayId; 437 route.node = message->getSourceNode(); 438 route.used = time(NULL); 439 logging_info("Remembering relay information to node " << route.node.toString()); 440 relay_routes.push_back(route); 430 } 431 432 } 433 434 // register relay path 435 if (message->isRegisterRelay()) { 436 // set relaying 437 ld->setRelaying(); 438 439 // try to find source node 440 BOOST_FOREACH( relay_route& route, relay_routes ) { 441 442 // relay route found? yes-> 443 if ( route.node == message->getSourceNode() ) { 444 445 // refresh timer 446 route.used = time(NULL); 447 448 // route has a shorter hop count? yes-> replace 449 if (route.hops > message->getNumHops() ) { 450 logging_info("Updating relay information to node " 451 << route.node.toString() 452 << " reducing to " << message->getNumHops() << " hops."); 453 route.hops = message->getNumHops(); 454 route.link = ld->overlayId; 455 } 456 return; 457 } 458 } 459 460 // not found-> add new entry 461 relay_route route; 462 route.hops = message->getNumHops(); 463 route.link = ld->overlayId; 464 route.node = message->getSourceNode(); 465 route.used = time(NULL); 466 logging_info("Remembering relay information to node " 467 << route.node.toString()); 468 relay_routes.push_back(route); 469 } 441 470 } 442 471 … … 447 476 if (route.node == remote ) { 448 477 LinkDescriptor* ld = getDescriptor( route.link ); 449 if (ld==NULL || !ld->up ) return NULL; else {478 if (ld==NULL || !ld->up || !ld->communicationUp) return NULL; else { 450 479 route.used = time(NULL); 451 480 return ld;
Note:
See TracChangeset
for help on using the changeset viewer.