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 "Node.h"
00040
00041 #include "ariba/overlay/BaseOverlay.h"
00042 #include "ariba/utility/types/OverlayParameterSet.h"
00043 #include "ariba/communication/EndpointDescriptor.h"
00044
00045 using ariba::communication::EndpointDescriptor;
00046
00047 namespace ariba {
00048
00049 Node::Node(AribaModule& ariba_mod, const Name& node_name) :
00050 name(node_name), ariba_mod(ariba_mod) {
00051 base_overlay = new BaseOverlay();
00052 }
00053
00054 Node::~Node() {
00055 delete base_overlay;
00056 base_overlay = NULL;
00057 }
00058
00059 void Node::join(const Name& vnetname) {
00060 spovnetId = vnetname.toSpoVNetId();
00061 nodeId = generateNodeId(name);
00062
00063
00064 if( !ariba_mod.base_comm->isStarted() )
00065 ariba_mod.base_comm->start();
00066
00067
00068
00069 if( !base_overlay->isStarted() )
00070 base_overlay->start( *ariba_mod.base_comm, nodeId );
00071 base_overlay->joinSpoVNet( spovnetId );
00072
00073
00074
00075 vector<AribaModule::BootstrapMechanism> mechanisms
00076 = ariba_mod.getBootstrapMechanisms(vnetname);
00077
00078 vector<pair<BootstrapManager::BootstrapType,string> > internalmodules;
00079
00080 BOOST_FOREACH(AribaModule::BootstrapMechanism m, mechanisms){
00081 switch(m){
00082 case AribaModule::BootstrapMechanismStatic:
00083 {
00084 const communication::EndpointDescriptor* ep =
00085 ariba_mod.getBootstrapNode(vnetname, m);
00086 if( ep != NULL && ep->isUnspecified() == false )
00087 base_overlay->joinSpoVNet( spovnetId, *ep);
00088 break;
00089 }
00090 case AribaModule::BootstrapMechanismBroadcast:
00091 internalmodules.push_back(make_pair(
00092 BootstrapManager::BootstrapTypePeriodicBroadcast,
00093 ariba_mod.getBootstrapInfo(vnetname, m)));
00094 break;
00095 case AribaModule::BootstrapMechanismMulticastDNS:
00096 internalmodules.push_back(make_pair(
00097 BootstrapManager::BootstrapTypeMulticastDns,
00098 ariba_mod.getBootstrapInfo(vnetname, m)));
00099 break;
00100 case AribaModule::BootstrapMechanismSDP:
00101 internalmodules.push_back(make_pair(
00102 BootstrapManager::BootstrapTypeBluetoothSdp,
00103 ariba_mod.getBootstrapInfo(vnetname, m)));
00104 break;
00105 default:
00106 break;
00107 }
00108 }
00109
00110
00111 base_overlay->startBootstrapModules(internalmodules);
00112
00113
00114 }
00115
00116 void Node::initiate(const Name& vnetname, const SpoVNetProperties& parm) {
00117 utility::OverlayParameterSet ovrpset;
00118 ovrpset.setOverlayStructure(
00119 (utility::OverlayParameterSet::_OverlayStructure)
00120 parm.getBaseOverlayType()
00121 );
00122
00123 spovnetId = vnetname.toSpoVNetId();
00124 nodeId = generateNodeId(name);
00125
00126
00127 if( !ariba_mod.base_comm->isStarted() )
00128 ariba_mod.base_comm->start();
00129
00130
00131 if( !base_overlay->isStarted() )
00132 base_overlay->start( *ariba_mod.base_comm, nodeId );
00133
00134 base_overlay->createSpoVNet( spovnetId, ovrpset );
00135 }
00136
00137 void Node::leave() {
00138 base_overlay->stopBootstrapModules();
00139 base_overlay->leaveSpoVNet();
00140 ariba_mod.base_comm->stop();
00141 base_overlay->stop();
00142 }
00143
00144 const SpoVNetProperties& Node::getSpoVNetProperties() const {
00145 return SpoVNetProperties::DEFAULT;
00146 }
00147
00148 const SpoVNetID& Node::getSpoVNetId() const {
00149 return spovnetId;
00150 }
00151
00152 const NodeID& Node::getNodeId(const LinkID& lid) const {
00153 if( lid == LinkID::UNSPECIFIED ) return nodeId;
00154 else return base_overlay->getNodeID( lid );
00155 }
00156
00157 NodeID Node::generateNodeId(const Name& name) const {
00158 if (name == Name::UNSPECIFIED) return Name::random().toNodeId();
00159 else return name.toNodeId();
00160 }
00161
00162 vector<NodeID> Node::getNeighborNodes() const {
00163 return base_overlay->getOverlayNeighbors();
00164 }
00165
00166 LinkID Node::establishLink(const NodeID& nid, const ServiceID& sid) {
00167 return base_overlay->establishLink(nid, sid);
00168 }
00169
00170 void Node::dropLink(const LinkID& lnk) {
00171 base_overlay->dropLink(lnk);
00172 }
00173
00174 seqnum_t Node::sendMessage(const DataMessage& msg, const NodeID& nid,
00175 const ServiceID& sid, const LinkProperties& req) {
00176 return base_overlay->sendMessage((Message*) msg, nid, sid);
00177 }
00178
00179 seqnum_t Node::sendMessage(const DataMessage& msg, const LinkID& lnk) {
00180 return base_overlay->sendMessage((Message*) msg, lnk);
00181 }
00182
00183 void Node::sendBroadcastMessage(const DataMessage& msg, const ServiceID& sid) {
00184 return base_overlay->broadcastMessage((Message*)msg, sid);
00185 }
00186
00187 bool Node::bind(NodeListener* listener) {
00188 return base_overlay->bind(listener);
00189 }
00190
00191 bool Node::unbind(NodeListener* listener) {
00192 return base_overlay->unbind(listener);
00193 }
00194
00195 bool Node::bind(CommunicationListener* listener, const ServiceID& sid) {
00196
00197 bool ret = base_overlay->bind(listener, sid);
00198
00199
00200 if( ariba_mod.sideport_sniffer != NULL ){
00201 base_overlay->registerSidePort(ariba_mod.sideport_sniffer);
00202 }
00203
00204 return ret;
00205 }
00206
00207 bool Node::unbind(CommunicationListener* listener, const ServiceID& sid) {
00208 return base_overlay->unbind(listener, sid);
00209 }
00210
00211
00212
00213 void Node::put( const Data& key, const Data& value, uint16_t ttl, bool replace ) {
00214 base_overlay->dhtPut(key,value,ttl,replace);
00215 }
00216
00217 void Node::get( const Data& key, const ServiceID& sid ) {
00218 base_overlay->dhtGet(key,sid);
00219 }
00220
00221
00222 string Node::getName() const {
00223 return name.toString();
00224 }
00225
00226 }