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 "OneHop.h"
00040 #include "ariba/overlay/BaseOverlay.h"
00041
00042 #include "ariba/overlay/modules/onehop/messages/OneHopMessage.h"
00043 #include "ariba/overlay/modules/onehop/messages/NodeListingRequest.h"
00044 #include "ariba/overlay/modules/onehop/messages/NodeListingReply.h"
00045
00046 namespace ariba {
00047 namespace overlay {
00048
00049 use_logging_cpp( OneHop );
00050
00051 OneHop::OneHop(BaseOverlay& _baseoverlay, const NodeID& _nodeid,
00052 OverlayStructureEvents* _eventsReceiver, const OverlayParameterSet& param)
00053 : OverlayInterface( _baseoverlay, _nodeid, _eventsReceiver, param ),
00054 state( OneHopStateInvalid ) {
00055
00056
00057
00058
00059 overlayNodes.insert( make_pair(_nodeid, LinkID::UNSPECIFIED) );
00060
00061 Timer::setInterval(5000);
00062 Timer::start();
00063 }
00064
00065 OneHop::~OneHop(){
00066 Timer::stop();
00067 deleteOverlay();
00068 }
00069
00070 const EndpointDescriptor& OneHop::resolveNode(const NodeID& node){
00071
00072 OverlayNodeMapping::const_iterator i = overlayNodes.find( node );
00073 if (i == overlayNodes.end()) return EndpointDescriptor::UNSPECIFIED();
00074
00075 const EndpointDescriptor& ep = baseoverlay.getEndpointDescriptor( i->second );
00076
00077 logging_debug( "resolved node " << node.toString() << " to endpoint " << ep.toString() );
00078 return ep;
00079 }
00080
00081
00083 bool OneHop::isClosestNodeTo( const NodeID& node ) {
00084 throw "NOT IMPLEMENTED!";
00085 return false;
00086 }
00087
00088 void OneHop::routeMessage(const NodeID& destnode, Message* msg){
00089
00090
00091
00092
00093 logging_debug( "routing message to node " << destnode.toString() );
00094
00095
00096 if(destnode == nodeid)
00097 baseoverlay.incomingRouteMessage( msg, LinkID::UNSPECIFIED, nodeid );
00098
00099
00100 OverlayNodeMapping::const_iterator i = overlayNodes.find( destnode );
00101 if (i == overlayNodes.end()) {
00102 logging_error( "not able to route message to node " << destnode.toString() );
00103 return;
00104 }
00105 OneHopMessage onehopRoute( OneHopMessage::OneHopMessageTypeRoute );
00106 onehopRoute.encapsulate(msg);
00107
00108 baseoverlay.sendMessage( &onehopRoute, i->second );
00109 }
00110
00111 void OneHop::routeMessage(const NodeID& node, const LinkID& link, Message* msg) {
00112 OneHopMessage onehopRoute( OneHopMessage::OneHopMessageTypeRoute );
00113 onehopRoute.encapsulate(msg);
00114 baseoverlay.sendMessage( &onehopRoute, link );
00115 }
00116
00118 const LinkID& OneHop::getNextLinkId( const NodeID& id ) const {
00119 OverlayNodeMapping::const_iterator i = overlayNodes.find( id );
00120 if (i == overlayNodes.end()) return LinkID::UNSPECIFIED;
00121 return i->second;
00122 }
00123
00124 void OneHop::createOverlay() {
00125
00126
00127 logging_info( "creating onehop overlay structure" );
00128 }
00129
00130 void OneHop::deleteOverlay(){
00131
00132 logging_info( "deleting onehop overlay structure" );
00133 state = OneHopStateInvalid;
00134 }
00135
00136 OverlayInterface::NodeList OneHop::getKnownNodes(bool deep) const {
00137
00138 OverlayInterface::NodeList retlist;
00139
00140 OverlayNodeMapping::const_iterator i = overlayNodes.begin();
00141 OverlayNodeMapping::const_iterator iend = overlayNodes.end();
00142
00143 for( ; i != iend; i++ )
00144 retlist.push_back( i->first );
00145
00146 return retlist;
00147 }
00148
00149 void OneHop::joinOverlay(const EndpointDescriptor& bootstrapEp){
00150
00151 logging_info( "joining onehop overlay structure through end-point " <<
00152 (bootstrapEp.isUnspecified() ? "local" : bootstrapEp.toString()) );
00153
00154 if( bootstrapEp.isUnspecified() ){
00155
00156
00157
00158
00159
00160 state = OneHopStateCompleted;
00161 } else {
00162 bootstrapLinks.push_back(
00163 baseoverlay.establishDirectLink( bootstrapEp,
00164 OverlayInterface::OVERLAY_SERVICE_ID )
00165 );
00166 }
00167 }
00168
00169 void OneHop::leaveOverlay(){
00170
00171 logging_info( "leaving onehop overlay structure" );
00172
00173
00174
00175
00176
00177
00178 state = OneHopStateInvalid;
00179
00180
00181
00182
00183
00184
00185 OverlayNodeMapping::iterator i = overlayNodes.begin();
00186 OverlayNodeMapping::iterator iend = overlayNodes.end();
00187
00188 for( ; i != iend; i++){
00189 if( i->first != nodeid && i->second != LinkID::UNSPECIFIED ){
00190
00191 OneHopMessage msg (OneHopMessage::OneHopMessageTypeLeave);
00192 baseoverlay.sendMessage( &msg, i->second );
00193 }
00194 }
00195 }
00196
00197
00198 void OneHop::onLinkDown(const LinkID& lnk, const NodeID& remote){
00199
00200
00201
00202 if( state == OneHopStateInvalid ) return;
00203
00204
00205 logging_debug( "link " << lnk.toString() << " to node " << remote.toString() << " went down, removing node" );
00206
00207 OverlayNodeMapping::iterator i = overlayNodes.begin();
00208 OverlayNodeMapping::iterator iend = overlayNodes.end();
00209
00210 for( ; i != iend; i++ ){
00211 if( i->second == lnk ){
00212 overlayNodes.erase( i );
00213 break;
00214 }
00215 }
00216
00217 vector<LinkID>::iterator it = std::find( bootstrapLinks.begin(), bootstrapLinks.end(), lnk );
00218 if( it != bootstrapLinks.end() ) bootstrapLinks.erase( it );
00219 }
00220
00221 void OneHop::onLinkUp(const LinkID& lnk, const NodeID& remote){
00222
00223 logging_debug( "link is up, sending out node listing request" );
00224
00225 NodeListingRequest requestmsg;
00226 OneHopMessage onemsg( OneHopMessage::OneHopMessageTypeListingRequest );
00227 onemsg.encapsulate( &requestmsg );
00228
00229 baseoverlay.sendMessage( &onemsg, lnk );
00230 }
00231
00232 void OneHop::onMessage(const DataMessage& msg, const NodeID& remote, const LinkID& lnk){
00233
00234 OneHopMessage* onemsg = msg.getMessage()->convert<OneHopMessage>();
00235 if( onemsg == NULL ) return;
00236
00237
00238
00239
00240
00241 if( onemsg->isType( OneHopMessage::OneHopMessageTypeListingRequest ) ){
00242
00243
00244
00245 logging_info( "onehop received node listing request from node " << remote.toString() );
00246
00247
00248
00249
00250
00251 overlayNodes.insert( make_pair(remote, lnk) );
00252
00253
00254
00255
00256
00257
00258 OneHopMessage onehopReply( OneHopMessage::OneHopMessageTypeListingReply );
00259 NodeListingReply listingReply;
00260
00261 OverlayNodeMapping::iterator i = overlayNodes.begin();
00262 OverlayNodeMapping::iterator iend = overlayNodes.end();
00263
00264 logging_debug( "sending out node listing reply with the following items" );
00265
00266 for( ; i != iend; i++ ){
00267
00268 const NodeID node = i->first;
00269 const LinkID link = i->second;
00270 const EndpointDescriptor& endpoint = baseoverlay.getEndpointDescriptor( link );
00271
00272 logging_debug( "node: " + node.toString() + ", endp: " + endpoint.toString());
00273 listingReply.add( node, const_cast<EndpointDescriptor*>(new EndpointDescriptor(endpoint)) );
00274 }
00275
00276 onehopReply.encapsulate( &listingReply );
00277 baseoverlay.sendMessage( &onehopReply, lnk );
00278
00279
00280
00281
00282
00283
00284 eventsReceiver->onNodeJoin( remote );
00285
00286 }
00287
00288
00289
00290
00291
00292 if( onemsg->isType( OneHopMessage::OneHopMessageTypeListingReply) ){
00293
00294 NodeListingReply* reply = onemsg->decapsulate<NodeListingReply>();
00295
00296 logging_debug( "received node listing reply from node " << remote.toString()
00297 << " with all overlay nodes. connecting to all of them" );
00298
00299
00300
00301
00302
00303
00304
00305 const NodeListingReply::NodeEndpointList& endpoints = reply->getList();
00306 logging_debug( "received " << endpoints.size() << " nodes in listing" );
00307
00308 NodeListingReply::NodeEndpointList::const_iterator i = endpoints.begin();
00309 NodeListingReply::NodeEndpointList::const_iterator iend = endpoints.end();
00310
00311 for( ; i != iend; i++ ){
00312
00313
00314
00315
00316
00317
00318 const NodeID& node = (*i).first;
00319 if( overlayNodes.find(node) != overlayNodes.end() ) continue;
00320 if( node == nodeid ) continue;
00321
00322 logging_debug( "building up link to node in overlay " << node.toString() );
00323 const LinkID link = baseoverlay.establishDirectLink( *((*i).second),
00324 OverlayInterface::OVERLAY_SERVICE_ID );
00325
00326 overlayNodes.insert( make_pair(node, link) );
00327
00328 }
00329
00330 delete reply;
00331 }
00332
00333
00334
00335
00336
00337 if( onemsg->isType(OneHopMessage::OneHopMessageTypeLeave) ){
00338
00339 logging_debug("received leave message from " <<
00340 remote.toString() << " on link " << lnk.toString());
00341
00342
00343 baseoverlay.dropLink( lnk );
00344
00345 }
00346
00347
00348
00349
00350
00351 if( onemsg->isType( OneHopMessage::OneHopMessageTypeRoute) ){
00352 logging_debug( "Route message arrived at destination node -> delegate to BaseOverlay" );
00353 baseoverlay.incomingRouteMessage( onemsg, lnk, remote);
00354 }
00355
00356 delete onemsg;
00357 }
00358
00359 void OneHop::eventFunction(){
00360
00361 logging_debug("<<<<<<<<<<<<<<<<onehop-table<<<<<<<<<<<<<<<<<<<");
00362
00363 OverlayNodeMapping::iterator i = overlayNodes.begin();
00364 OverlayNodeMapping::iterator iend = overlayNodes.end();
00365
00366 for( ; i != iend; i++ ){
00367
00368 const NodeID node = i->first;
00369 const LinkID link = i->second;
00370 const EndpointDescriptor& endpoint = baseoverlay.getEndpointDescriptor( link );
00371
00372 logging_debug( "node: " << node.toString() <<
00373 ", link_: " << link.toString() << ", endp: " << endpoint.toString());
00374 }
00375
00376 logging_debug(">>>>>>>>>>>>>>>>>onehop-table>>>>>>>>>>>>>>>>>>>>>");
00377
00378 }
00379
00380 }}