diff --git a/libbitdht/src/bitdht/bdiface.h b/libbitdht/src/bitdht/bdiface.h index 49fbb8809..103d254fe 100644 --- a/libbitdht/src/bitdht/bdiface.h +++ b/libbitdht/src/bitdht/bdiface.h @@ -322,6 +322,8 @@ virtual void ConnectionAuth(bdId *srcId, bdId *proxyId, bdId *destId, uint32_t m uint32_t bandwidth, uint32_t delay, uint32_t answer) = 0; virtual void ConnectionOptions(uint32_t allowedModes, uint32_t flags) = 0; +virtual bool setAttachMode(bool on) = 0; + /***** Add / Remove Callback Clients *****/ virtual void addCallback(BitDhtCallback *cb) = 0; diff --git a/libbitdht/src/bitdht/bdmanager.cc b/libbitdht/src/bitdht/bdmanager.cc index a7640da2c..50c8c6e16 100644 --- a/libbitdht/src/bitdht/bdmanager.cc +++ b/libbitdht/src/bitdht/bdmanager.cc @@ -144,6 +144,21 @@ uint32_t bdNodeManager::statsBDVersionSize() return mBdNetworkSize; } +bool bdNodeManager::setAttachMode(bool on) +{ + if (on) + { + setNodeOptions(BITDHT_OPTIONS_MAINTAIN_UNSTABLE_PORT); + } + else + { + setNodeOptions(0); + } + return on; +} + + + void bdNodeManager::addFindNode(bdNodeId *id, uint32_t qflags) { diff --git a/libbitdht/src/bitdht/bdmanager.h b/libbitdht/src/bitdht/bdmanager.h index 505c960d4..cfb308693 100644 --- a/libbitdht/src/bitdht/bdmanager.h +++ b/libbitdht/src/bitdht/bdmanager.h @@ -126,6 +126,7 @@ virtual void ConnectionAuth(bdId *srcId, bdId *proxyId, bdId *destId, uint32_t mode, uint32_t loc, uint32_t bandwidth, uint32_t delay, uint32_t answer); virtual void ConnectionOptions(uint32_t allowedModes, uint32_t flags); +virtual bool setAttachMode(bool on); /* stats and Dht state */ virtual int startDht(); diff --git a/libbitdht/src/bitdht/bdnode.cc b/libbitdht/src/bitdht/bdnode.cc index 80779c157..5abdf439d 100644 --- a/libbitdht/src/bitdht/bdnode.cc +++ b/libbitdht/src/bitdht/bdnode.cc @@ -92,11 +92,11 @@ void bdNode::setNodeOptions(uint32_t optFlags) mNodeOptionFlags = optFlags; if (optFlags & BITDHT_OPTIONS_MAINTAIN_UNSTABLE_PORT) { - mNodeSpace.setAttachedFlag(BITDHT_PEER_STATUS_DHT_ENGINE, ATTACH_NUMBER); + mNodeSpace.setAttachedFlag(BITDHT_PEER_STATUS_DHT_ENGINE | BITDHT_PEER_STATUS_DHT_ENGINE_VERSION, ATTACH_NUMBER); } else { - mNodeSpace.setAttachedFlag(BITDHT_PEER_STATUS_DHT_ENGINE, 0); + mNodeSpace.setAttachedFlag(BITDHT_PEER_STATUS_DHT_ENGINE | BITDHT_PEER_STATUS_DHT_ENGINE_VERSION, 0); } } diff --git a/libbitdht/src/bitdht/bdpeer.cc b/libbitdht/src/bitdht/bdpeer.cc index de2432926..910f041e3 100644 --- a/libbitdht/src/bitdht/bdpeer.cc +++ b/libbitdht/src/bitdht/bdpeer.cc @@ -547,10 +547,14 @@ int bdSpace::updateAttachedPeers() bool doAttached = (mAttachedCount > 0); int attachedCount = 0; + // Must scan through - otherwise we can never remove Attached state. + // It is only once every 10 minutes or so! +#if 0 if (!doAttached) { return 0; } +#endif std::map closest; std::map::iterator mit; diff --git a/libbitdht/src/udp/udpbitdht.cc b/libbitdht/src/udp/udpbitdht.cc index ed8da74dd..60ec526b0 100644 --- a/libbitdht/src/udp/udpbitdht.cc +++ b/libbitdht/src/udp/udpbitdht.cc @@ -150,6 +150,13 @@ void UdpBitDht::ConnectionOptions(uint32_t allowedModes, uint32_t flags) mBitDhtManager->ConnectionOptions(allowedModes, flags); } +bool UdpBitDht::setAttachMode(bool on) +{ + bdStackMutex stack(dhtMtx); /********** MUTEX LOCKED *************/ + + return mBitDhtManager->setAttachMode(on); +} + int UdpBitDht::getDhtPeerAddress(const bdNodeId *id, struct sockaddr_in &from) { diff --git a/libbitdht/src/udp/udpbitdht.h b/libbitdht/src/udp/udpbitdht.h index 510b2b8df..712979551 100644 --- a/libbitdht/src/udp/udpbitdht.h +++ b/libbitdht/src/udp/udpbitdht.h @@ -72,6 +72,7 @@ virtual bool ConnectionRequest(struct sockaddr_in *laddr, bdNodeId *target, uint virtual void ConnectionAuth(bdId *srcId, bdId *proxyId, bdId *destId, uint32_t mode, uint32_t loc, uint32_t bandwidth, uint32_t delay, uint32_t answer); virtual void ConnectionOptions(uint32_t allowedModes, uint32_t flags); +virtual bool setAttachMode(bool on); /***** Get Results Details *****/ virtual int getDhtPeerAddress(const bdNodeId *id, struct sockaddr_in &from);