|  | 1 | #include "PingPong.h" | 
|---|
|  | 2 | #include "ariba/utility/configuration/Configuration.h" | 
|---|
|  | 3 |  | 
|---|
|  | 4 | using ariba::utility::Configuration; | 
|---|
|  | 5 | using namespace ariba; | 
|---|
|  | 6 |  | 
|---|
|  | 7 | namespace ariba { | 
|---|
|  | 8 | namespace application { | 
|---|
|  | 9 | namespace pingpong { | 
|---|
|  | 10 |  | 
|---|
|  | 11 | // logging | 
|---|
|  | 12 | use_logging_cpp( PingPong ); | 
|---|
|  | 13 |  | 
|---|
|  | 14 | // the service id of the ping pong service | 
|---|
|  | 15 | ServiceID PingPong::PINGPONG_ID = ServiceID( 111 ); | 
|---|
|  | 16 |  | 
|---|
|  | 17 | // construction | 
|---|
|  | 18 | PingPong::PingPong() : pingId( 0 ) { | 
|---|
|  | 19 | Timer::setInterval( 5000 ); | 
|---|
|  | 20 | } | 
|---|
|  | 21 |  | 
|---|
|  | 22 | // destruction | 
|---|
|  | 23 | PingPong::~PingPong() { | 
|---|
|  | 24 | } | 
|---|
|  | 25 |  | 
|---|
|  | 26 | // implementation of the startup interface | 
|---|
|  | 27 | void PingPong::startup() { | 
|---|
|  | 28 |  | 
|---|
|  | 29 | logging_info( "starting up PingPong service ... " ); | 
|---|
|  | 30 |  | 
|---|
|  | 31 | // create ariba module | 
|---|
|  | 32 | logging_debug( "creating ariba underlay module ... " ); | 
|---|
|  | 33 | ariba = new AribaModule(); | 
|---|
|  | 34 |  | 
|---|
|  | 35 | // get the configuration object | 
|---|
|  | 36 | Configuration& config = Configuration::instance(); | 
|---|
|  | 37 |  | 
|---|
|  | 38 | // generate spovnet name | 
|---|
|  | 39 | Name spovnetName("pingpong"); | 
|---|
|  | 40 |  | 
|---|
|  | 41 | // get initiator flag | 
|---|
|  | 42 | this->isInitiator = Configuration::instance().read<bool> ("node.initiator"); | 
|---|
|  | 43 |  | 
|---|
|  | 44 | // get node name | 
|---|
|  | 45 | Name nodeName = Name::UNSPECIFIED; | 
|---|
|  | 46 | if (config.exists("node.name")) nodeName | 
|---|
|  | 47 | = config.read<string> ("node.name"); | 
|---|
|  | 48 |  | 
|---|
|  | 49 | // configure ariba module | 
|---|
|  | 50 | if (config.exists("ariba.ip.addr")) ariba->setProperty("ip.addr", | 
|---|
|  | 51 | config.read<string> ("ariba.ip.addr")); | 
|---|
|  | 52 | if (config.exists("ariba.tcp.port")) ariba->setProperty("tcp.port", | 
|---|
|  | 53 | config.read<string> ("ariba.tcp.port")); | 
|---|
|  | 54 | if (config.exists("ariba.udp.port")) ariba->setProperty("udp.port", | 
|---|
|  | 55 | config.read<string> ("ariba.udp.port")); | 
|---|
|  | 56 | if (config.exists("ariba.bootstrap.hints")) ariba->setProperty("bootstrap.hints", | 
|---|
|  | 57 | config.read<string> ("ariba.bootstrap.hints")); | 
|---|
|  | 58 |  | 
|---|
|  | 59 | // start ariba module | 
|---|
|  | 60 | ariba->start(); | 
|---|
|  | 61 |  | 
|---|
|  | 62 | // create node and join | 
|---|
|  | 63 | node = new Node( *ariba, nodeName ); | 
|---|
|  | 64 |  | 
|---|
|  | 65 | // start node module | 
|---|
|  | 66 | node->start(); | 
|---|
|  | 67 |  | 
|---|
|  | 68 | // initiate or join the spovnet | 
|---|
|  | 69 | if (!isInitiator) node->join(spovnetName); | 
|---|
|  | 70 | else node->initiate(spovnetName); | 
|---|
|  | 71 |  | 
|---|
|  | 72 | // bind communication and node listener | 
|---|
|  | 73 | node->bind( this ); | 
|---|
|  | 74 | node->bind( this, PingPong::PINGPONG_ID); | 
|---|
|  | 75 |  | 
|---|
|  | 76 | // start the ping timer. if we are not | 
|---|
|  | 77 | // the initiator this will happen in onJoinCompleted | 
|---|
|  | 78 | if( isInitiator ) Timer::start(); | 
|---|
|  | 79 |  | 
|---|
|  | 80 | // ping pong started up... | 
|---|
|  | 81 | logging_info( "pingpong started up "); | 
|---|
|  | 82 | } | 
|---|
|  | 83 |  | 
|---|
|  | 84 | // implementation of the startup interface | 
|---|
|  | 85 | void PingPong::shutdown() { | 
|---|
|  | 86 |  | 
|---|
|  | 87 | logging_info( "pingpong service starting shutdown sequence ..." ); | 
|---|
|  | 88 |  | 
|---|
|  | 89 | // stop timer | 
|---|
|  | 90 | Timer::stop(); | 
|---|
|  | 91 |  | 
|---|
|  | 92 | // unbind communication and node listener | 
|---|
|  | 93 | node->unbind( this ); | 
|---|
|  | 94 | node->unbind( this, PingPong::PINGPONG_ID ); | 
|---|
|  | 95 |  | 
|---|
|  | 96 | // leave spovnet | 
|---|
|  | 97 | node->leave(); | 
|---|
|  | 98 |  | 
|---|
|  | 99 | // stop the ariba module | 
|---|
|  | 100 | ariba->stop(); | 
|---|
|  | 101 |  | 
|---|
|  | 102 | // delete node and ariba module | 
|---|
|  | 103 | delete node; | 
|---|
|  | 104 | delete ariba; | 
|---|
|  | 105 |  | 
|---|
|  | 106 | // now we are completely shut down | 
|---|
|  | 107 | logging_info( "pingpong service shut down" ); | 
|---|
|  | 108 | } | 
|---|
|  | 109 |  | 
|---|
|  | 110 | // node listener interface | 
|---|
|  | 111 | void PingPong::onJoinCompleted( const SpoVNetID& vid ) { | 
|---|
|  | 112 | logging_info( "pingpong node join completed, spovnetid=" << vid.toString() ); | 
|---|
|  | 113 |  | 
|---|
|  | 114 | // start the timer to ping every second | 
|---|
|  | 115 | Timer::start(); | 
|---|
|  | 116 | } | 
|---|
|  | 117 |  | 
|---|
|  | 118 | void PingPong::onJoinFailed( const SpoVNetID& vid ) { | 
|---|
|  | 119 | logging_error(" pingpong node join failed, spovnetid=" << vid.toString() ); | 
|---|
|  | 120 | } | 
|---|
|  | 121 |  | 
|---|
|  | 122 | // communication listener | 
|---|
|  | 123 | bool PingPong::onLinkRequest(const NodeID& remote, const DataMessage& msg) { | 
|---|
|  | 124 | return false; | 
|---|
|  | 125 | } | 
|---|
|  | 126 |  | 
|---|
|  | 127 | void PingPong::onMessage(const DataMessage& msg, const NodeID& remote, const LinkID& lnk) { | 
|---|
|  | 128 |  | 
|---|
|  | 129 | PingPongMessage* pingmsg = msg.getMessage()->decapsulate<PingPongMessage> (); | 
|---|
|  | 130 |  | 
|---|
|  | 131 | logging_info( "received ping message on link " << lnk.toString() | 
|---|
|  | 132 | << " from node " << remote.toString() | 
|---|
|  | 133 | << ": " << pingmsg->info() ); | 
|---|
|  | 134 | } | 
|---|
|  | 135 |  | 
|---|
|  | 136 | // timer event | 
|---|
|  | 137 | void PingPong::eventFunction() { | 
|---|
|  | 138 |  | 
|---|
|  | 139 | // we ping all nodes that are known in the overlay structure | 
|---|
|  | 140 | // this can be all nodes (OneHop) overlay or just some neighbors | 
|---|
|  | 141 | // in case of a Chord or Kademlia structure | 
|---|
|  | 142 |  | 
|---|
|  | 143 | logging_info( "pinging overlay neighbors with ping id " << ++pingId ); | 
|---|
|  | 144 |  | 
|---|
|  | 145 | PingPongMessage pingmsg( pingId ); | 
|---|
|  | 146 | node->sendBroadcastMessage( pingmsg, PingPong::PINGPONG_ID ); | 
|---|
|  | 147 | } | 
|---|
|  | 148 |  | 
|---|
|  | 149 | }}} // namespace ariba, application, pingpong | 
|---|