#include <BrooseBucket.h>
Public Member Functions | |
virtual int | numInitStages () const |
virtual void | initialize (int stage) |
virtual void | handleMessage (cMessage *msg) |
virtual bool | add (const NodeHandle &node, bool isAlive=false, simtime_t rtt=MAXTIME) |
adds a broose node handle to the bucket | |
virtual void | remove (const NodeHandle &node) |
removes a broose node handle from the bucket | |
virtual const BrooseHandle & | get (uint32_t pos=0) |
returns a specific broose handle | |
virtual const OverlayKey & | getDist (uint32_t pos=0) |
returns distance of a specific broose handle | |
virtual void | initializeBucket (int shiftingBits, uint32_t prefix, int size, Broose *overlay, bool isBBucket=false) |
initializes a bucket | |
virtual uint32_t | getSize () |
returns number of current entries | |
virtual uint32_t | getMaxSize () |
returns number of maximal entries | |
virtual void | fillVector (NodeVector *result) |
Fills a NodeVector with all bucket entries. | |
virtual bool | isEmpty () |
checks if the bucket is empty | |
virtual void | clear () |
removes all entries from the bucket | |
virtual int | longestPrefix (void) |
return the longest prefix of all entries | |
virtual bool | keyInRange (const OverlayKey &key) |
checks if the key close to the owner's id | |
virtual int | getPos (const NodeHandle &node) |
returns the position of a node in this bucket | |
virtual int | getFailedResponses (const NodeHandle &node) |
returns the number of failed responses to a specific broose handle | |
virtual void | increaseFailedResponses (const NodeHandle &node) |
increase the number of failed responses to a specific broose handle | |
virtual void | resetFailedResponses (const NodeHandle &node) |
resets the counter of failed responses to a specific broose handle | |
virtual void | setRTT (const NodeHandle &node, simtime_t rpcRTT) |
sets the round trip time to a specific broose handle | |
virtual simtime_t | getRTT (const NodeHandle &node) |
returns the round trip time to a specific broose handle | |
virtual void | setLastSeen (const NodeHandle &node, simtime_t lastSeen) |
updates the timestamp of a specific node | |
virtual simtime_t | getLastSeen (const NodeHandle &node) |
returns the timestamp of a specific node | |
void | output (int maxEntries=0) |
displays the content of the bucket on standard out | |
Protected Attributes | |
std::map< OverlayKey, BrooseHandle > | bucket |
data structure representing the bucket | |
std::map< OverlayKey, BrooseHandle >::iterator | bucketIter |
iterator to navigate through the bucket | |
unsigned int | maxSize |
maximal size of the bucket | |
OverlayKey | key |
the node's key shifted to fit the bucket and used to measure distance to other keys | |
Broose * | overlay |
pointer to the main Broose module | |
bool | isBBucket |
true, if this bucket is the node's BBucket |
Broose bucket module.
This modul contains the bucket of the Broose implementation.
Definition at line 43 of file BrooseBucket.h.
bool BrooseBucket::add | ( | const NodeHandle & | node, | |
bool | isAlive = false , |
|||
simtime_t | rtt = MAXTIME | |||
) | [virtual] |
adds a broose node handle to the bucket
node | the NodeHandle to add | |
isAlive | true, if it is known that the node is alive | |
rtt | measured round-trip-time to node |
Definition at line 70 of file BrooseBucket.cc.
Referenced by Broose::changeState(), and Broose::handleBucketTimerExpired().
00071 { 00072 OverlayKey tmp = key ^ node.getKey(); 00073 00074 bucketIter = bucket.find(tmp); 00075 00076 if (bucketIter == bucket.end()) { 00077 // new node 00078 if (bucket.size() < maxSize) { 00079 bucketIter = bucket.insert(make_pair(tmp,node)).first; 00080 } else { 00081 std::map<OverlayKey, BrooseHandle>::iterator back = --bucket.end(); 00082 00083 // is the new node closer than the one farthest away, 00084 // remove the one and add the other 00085 if (back->first > tmp) { 00086 if (isBBucket) { 00087 // call update() for removed sibling 00088 overlay->callUpdate(back->second, false); 00089 } 00090 00091 bucket.erase(back); 00092 bucketIter = bucket.insert(make_pair(tmp,node)).first; 00093 } else { 00094 // doesn't fit into bucket 00095 return false; 00096 } 00097 } 00098 00099 if (isBBucket) { 00100 // call update() for new sibling 00101 overlay->callUpdate(node, true); 00102 } 00103 } 00104 00105 if (isAlive) { 00106 bucketIter->second.failedResponses = 0; 00107 bucketIter->second.lastSeen = simTime(); 00108 } 00109 00110 if (rtt != MAXTIME) { 00111 bucketIter->second.rtt = rtt; 00112 } 00113 00114 return true; 00115 }
void BrooseBucket::clear | ( | ) | [virtual] |
removes all entries from the bucket
Definition at line 189 of file BrooseBucket.cc.
00190 { 00191 bucket.clear(); 00192 }
void BrooseBucket::fillVector | ( | NodeVector * | result | ) | [virtual] |
Fills a NodeVector with all bucket entries.
result | a pointer to an existing NodeVector, which gets filled with all bucket entries |
Definition at line 194 of file BrooseBucket.cc.
Referenced by Broose::findNode().
00195 { 00196 for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) { 00197 result->add(bucketIter->second); 00198 } 00199 }
const BrooseHandle & BrooseBucket::get | ( | uint32_t | pos = 0 |
) | [virtual] |
returns a specific broose handle
pos | position of the broose handle in the bucket |
Definition at line 137 of file BrooseBucket.cc.
Referenced by Broose::changeState(), Broose::handleBucketRequestRpc(), and Broose::handleBucketTimerExpired().
00138 { 00139 if (pos > bucket.size()) { 00140 error("Index out of bounds(BrooseBucket)."); 00141 } 00142 00143 uint32_t i = 0; 00144 std::map<OverlayKey, BrooseHandle>::iterator it; 00145 00146 for (it = bucket.begin(); it != bucket.end(); it++, i++) { 00147 if (pos == i) { 00148 return it->second; 00149 } 00150 } 00151 00152 return BrooseHandle::unspecifiedNode(); 00153 }
const OverlayKey & BrooseBucket::getDist | ( | uint32_t | pos = 0 |
) | [virtual] |
returns distance of a specific broose handle
pos | position of the broose handle in the bucket |
Definition at line 155 of file BrooseBucket.cc.
Referenced by keyInRange().
00156 { 00157 if (pos > bucket.size()) { 00158 error("Index out of bounds(BrooseBucket)."); 00159 } 00160 00161 uint32_t i = 0; 00162 std::map<OverlayKey, BrooseHandle>::iterator it; 00163 00164 for (it = bucket.begin(); it != bucket.end(); it++, i++) { 00165 if (pos == i) { 00166 return it->first; 00167 } 00168 } 00169 00170 return OverlayKey::UNSPECIFIED_KEY; 00171 }
int BrooseBucket::getFailedResponses | ( | const NodeHandle & | node | ) | [virtual] |
returns the number of failed responses to a specific broose handle
node | broose handle to check |
Definition at line 273 of file BrooseBucket.cc.
00274 { 00275 for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) { 00276 if (node.getAddress() == bucketIter->second.getAddress()) 00277 return bucketIter->second.failedResponses; 00278 } 00279 return -1; 00280 }
simtime_t BrooseBucket::getLastSeen | ( | const NodeHandle & | node | ) | [virtual] |
returns the timestamp of a specific node
node | broose handle to which the timestamp will be retrieved |
Definition at line 325 of file BrooseBucket.cc.
00326 { 00327 for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) { 00328 if (node.getAddress() == bucketIter->second.getAddress()) 00329 return bucketIter->second.lastSeen; 00330 } 00331 return -2; 00332 }
uint32_t BrooseBucket::getMaxSize | ( | ) | [virtual] |
returns number of maximal entries
Definition at line 179 of file BrooseBucket.cc.
00180 { 00181 return maxSize; 00182 }
int BrooseBucket::getPos | ( | const NodeHandle & | node | ) | [virtual] |
returns the position of a node in this bucket
node | broose handle to check |
Definition at line 262 of file BrooseBucket.cc.
00263 { 00264 int i = -1; 00265 std::map<OverlayKey, BrooseHandle>::iterator it; 00266 for (it = bucket.begin(); it != bucket.end(); it++, i++) { 00267 if (node.getAddress() == it->second.getAddress()) 00268 return i; 00269 } 00270 return i; 00271 }
simtime_t BrooseBucket::getRTT | ( | const NodeHandle & | node | ) | [virtual] |
returns the round trip time to a specific broose handle
node | broose handle to which the rtt will be retrieved |
Definition at line 308 of file BrooseBucket.cc.
00309 { 00310 for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) { 00311 if (node.getAddress() == bucketIter->second.getAddress()) 00312 return bucketIter->second.rtt; 00313 } 00314 return -2; 00315 }
uint32_t BrooseBucket::getSize | ( | ) | [virtual] |
returns number of current entries
Definition at line 174 of file BrooseBucket.cc.
Referenced by Broose::changeState(), Broose::handleBucketRequestRpc(), and Broose::handleBucketTimerExpired().
00175 { 00176 return bucket.size(); 00177 }
void BrooseBucket::handleMessage | ( | cMessage * | msg | ) | [virtual] |
Definition at line 44 of file BrooseBucket.cc.
00045 { 00046 error("BrooseBucket::handleMessage() shouldn't be called!"); 00047 }
void BrooseBucket::increaseFailedResponses | ( | const NodeHandle & | node | ) | [virtual] |
increase the number of failed responses to a specific broose handle
node | broose handle which counter will be increased |
Definition at line 282 of file BrooseBucket.cc.
00283 { 00284 for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) { 00285 if (node.getAddress() == bucketIter->second.getAddress()) 00286 bucketIter->second.failedResponses++; 00287 } 00288 }
void BrooseBucket::initialize | ( | int | stage | ) | [virtual] |
Definition at line 36 of file BrooseBucket.cc.
00037 { 00038 if(stage != MIN_STAGE_OVERLAY) 00039 return; 00040 00041 WATCH_MAP(bucket); 00042 }
void BrooseBucket::initializeBucket | ( | int | shiftingBits, | |
uint32_t | prefix, | |||
int | size, | |||
Broose * | overlay, | |||
bool | isBBucket = false | |||
) | [virtual] |
initializes a bucket
shiftingBits | specifies the kind of the bucket | |
prefix | in case of a R bucket specifies the prefix | |
size | maximal size of the bucket | |
overlay | pointer to the main Broose module | |
isBBucket | true, is this bucket is the node's BBucket |
Definition at line 49 of file BrooseBucket.cc.
Referenced by Broose::changeState(), and Broose::handleBucketTimerExpired().
00051 { 00052 maxSize = size; 00053 this->overlay = overlay; 00054 this->isBBucket = isBBucket; 00055 00056 if (shiftingBits < 0) { 00057 key = overlay->getThisNode().getKey() << -shiftingBits; 00058 } else { 00059 key = overlay->getThisNode().getKey() >> shiftingBits; 00060 } 00061 00062 if (prefix != 0) { 00063 OverlayKey tmp(prefix); // constraint 00064 tmp = tmp << (overlay->getThisNode().getKey().getLength() - shiftingBits); 00065 key = key + tmp; 00066 } 00067 bucket.clear(); 00068 }
bool BrooseBucket::isEmpty | ( | ) | [virtual] |
checks if the bucket is empty
Definition at line 184 of file BrooseBucket.cc.
00185 { 00186 return bucket.empty(); 00187 }
bool BrooseBucket::keyInRange | ( | const OverlayKey & | key | ) | [virtual] |
checks if the key close to the owner's id
key | key to check |
Definition at line 239 of file BrooseBucket.cc.
Referenced by Broose::isSiblingFor().
00240 { 00241 OverlayKey dist; 00242 00243 if (bucket.size() == 0) 00244 return false; 00245 00246 // check if the function was called to perform on a B bucket 00247 if (isBBucket) { 00248 if (bucket.size() <= (maxSize / 7)) 00249 return true; 00250 else 00251 dist = getDist((maxSize / 7) - 1); 00252 } else 00253 dist = getDist(bucket.size()-1); 00254 00255 if ((key ^ overlay->getThisNode().getKey()) <= dist) 00256 return true; 00257 else 00258 return false; 00259 00260 }
int BrooseBucket::longestPrefix | ( | void | ) | [virtual] |
return the longest prefix of all entries
Definition at line 202 of file BrooseBucket.cc.
virtual int BrooseBucket::numInitStages | ( | ) | const [inline, virtual] |
Definition at line 46 of file BrooseBucket.h.
00047 { 00048 return MAX_STAGE_OVERLAY + 1; 00049 }
void BrooseBucket::output | ( | int | maxEntries = 0 |
) |
displays the content of the bucket on standard out
maxEntries | the maximal number of entries which will be printed |
Definition at line 211 of file BrooseBucket.cc.
Referenced by Broose::displayBucketState().
00212 { 00213 BrooseHandle node; 00214 OverlayKey dist; 00215 00216 EV << "[BrooseBucket::output() @ " << overlay->getThisNode().getAddress() 00217 << " (" << overlay->getThisNode().getKey().toString(16) << ")]\n" 00218 << " BucketSize/MaxSize: " << bucket.size() << "/" << maxSize 00219 << endl; 00220 00221 int max; 00222 max = bucket.size(); 00223 00224 if (maxEntries != 0 && maxEntries < max) { 00225 max = maxEntries; 00226 } 00227 00228 int i; 00229 00230 for (bucketIter = bucket.begin(), i = 0; i < max; bucketIter++, i++) { 00231 dist = bucketIter->first; 00232 node = bucketIter->second; 00233 EV << " " << dist << " " << node.getKey() << " " << node.getAddress() << " RTT: " 00234 << node.rtt << " LS: " << node.lastSeen 00235 << endl; 00236 } 00237 }
void BrooseBucket::remove | ( | const NodeHandle & | node | ) | [virtual] |
removes a broose node handle from the bucket
node | broose handle which will be removed |
Definition at line 117 of file BrooseBucket.cc.
00118 { 00119 unsigned int i = 0; 00120 for (bucketIter = bucket.begin(); bucketIter != bucket.end(); i++) { 00121 if (bucketIter->second.getAddress() == node.getAddress()) { 00122 if (isBBucket && (i < (maxSize/7))) { 00123 // call update() for removed sibling 00124 overlay->callUpdate(node, false); 00125 if (bucket.size() > (maxSize/7)) { 00126 // new replacement sibling 00127 overlay->callUpdate(get(maxSize/7), true); 00128 } 00129 } 00130 bucket.erase(bucketIter++); 00131 } else { 00132 ++bucketIter; 00133 } 00134 } 00135 }
void BrooseBucket::resetFailedResponses | ( | const NodeHandle & | node | ) | [virtual] |
resets the counter of failed responses to a specific broose handle
node | broose handle which counter will be reset |
Definition at line 290 of file BrooseBucket.cc.
00291 { 00292 for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) { 00293 if (node.getAddress() == bucketIter->second.getAddress()) 00294 bucketIter->second.failedResponses = 0; 00295 } 00296 }
void BrooseBucket::setLastSeen | ( | const NodeHandle & | node, | |
simtime_t | lastSeen | |||
) | [virtual] |
updates the timestamp of a specific node
node | broose handle to which the timestamp will be updated | |
lastSeen | timestamp of the last message |
Definition at line 317 of file BrooseBucket.cc.
00318 { 00319 for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) { 00320 if (node.getAddress() == bucketIter->second.getAddress()) 00321 bucketIter->second.lastSeen = time; 00322 } 00323 }
void BrooseBucket::setRTT | ( | const NodeHandle & | node, | |
simtime_t | rpcRTT | |||
) | [virtual] |
sets the round trip time to a specific broose handle
node | broose handle to which the rtt will be stored | |
rpcRTT | rtt to the specific node |
Definition at line 299 of file BrooseBucket.cc.
00300 { 00301 for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) { 00302 if (node.getAddress() == bucketIter->second.getAddress()) { 00303 bucketIter->second.rtt = rpcRTT; 00304 } 00305 } 00306 }
std::map<OverlayKey, BrooseHandle> BrooseBucket::bucket [protected] |
data structure representing the bucket
Definition at line 221 of file BrooseBucket.h.
Referenced by add(), clear(), fillVector(), get(), getDist(), getFailedResponses(), getLastSeen(), getPos(), getRTT(), getSize(), increaseFailedResponses(), initialize(), initializeBucket(), isEmpty(), keyInRange(), longestPrefix(), output(), remove(), resetFailedResponses(), setLastSeen(), and setRTT().
std::map<OverlayKey, BrooseHandle>::iterator BrooseBucket::bucketIter [protected] |
iterator to navigate through the bucket
Definition at line 222 of file BrooseBucket.h.
Referenced by add(), fillVector(), getFailedResponses(), getLastSeen(), getRTT(), increaseFailedResponses(), output(), remove(), resetFailedResponses(), setLastSeen(), and setRTT().
bool BrooseBucket::isBBucket [protected] |
true, if this bucket is the node's BBucket
Definition at line 227 of file BrooseBucket.h.
Referenced by add(), keyInRange(), and remove().
OverlayKey BrooseBucket::key [protected] |
the node's key shifted to fit the bucket and used to measure distance to other keys
Definition at line 225 of file BrooseBucket.h.
Referenced by add(), and initializeBucket().
unsigned int BrooseBucket::maxSize [protected] |
maximal size of the bucket
Definition at line 224 of file BrooseBucket.h.
Referenced by add(), getMaxSize(), initializeBucket(), keyInRange(), output(), and remove().
Broose* BrooseBucket::overlay [protected] |
pointer to the main Broose module
Definition at line 226 of file BrooseBucket.h.
Referenced by add(), keyInRange(), output(), and remove().