diff --git a/libbitdht/src/bitdht/bdaccount.cc b/libbitdht/src/bitdht/bdaccount.cc index c1a91ecc9..1f49ba0a0 100644 --- a/libbitdht/src/bitdht/bdaccount.cc +++ b/libbitdht/src/bitdht/bdaccount.cc @@ -50,6 +50,9 @@ bdAccount::bdAccount() mLabel[BDACCOUNT_MSG_REPLYFINDNODE] = "REPLYFINDNODE "; mLabel[BDACCOUNT_MSG_REPLYQUERYHASH] = "REPLYQUERYHASH "; + mLabel[BDACCOUNT_MSG_POSTHASH] = "POSTHASH "; + mLabel[BDACCOUNT_MSG_REPLYPOSTHASH] = "REPLYPOSTHASH "; + mLabel[BDACCOUNT_MSG_CONNECTREQUEST] = "CONNECTREQUEST "; mLabel[BDACCOUNT_MSG_CONNECTREPLY] = "CONNECTREPLY "; mLabel[BDACCOUNT_MSG_CONNECTSTART] = "CONNECTSTART "; diff --git a/libbitdht/src/bitdht/bdaccount.h b/libbitdht/src/bitdht/bdaccount.h index 5813b75ba..5e9b6cc61 100644 --- a/libbitdht/src/bitdht/bdaccount.h +++ b/libbitdht/src/bitdht/bdaccount.h @@ -38,12 +38,15 @@ #define BDACCOUNT_MSG_REPLYFINDNODE 5 #define BDACCOUNT_MSG_REPLYQUERYHASH 6 -#define BDACCOUNT_MSG_CONNECTREQUEST 7 -#define BDACCOUNT_MSG_CONNECTREPLY 8 -#define BDACCOUNT_MSG_CONNECTSTART 9 -#define BDACCOUNT_MSG_CONNECTACK 10 +#define BDACCOUNT_MSG_POSTHASH 7 +#define BDACCOUNT_MSG_REPLYPOSTHASH 8 -#define BDACCOUNT_NUM_ENTRIES 11 +#define BDACCOUNT_MSG_CONNECTREQUEST 9 +#define BDACCOUNT_MSG_CONNECTREPLY 10 +#define BDACCOUNT_MSG_CONNECTSTART 11 +#define BDACCOUNT_MSG_CONNECTACK 12 + +#define BDACCOUNT_NUM_ENTRIES 13 class bdAccount { diff --git a/libbitdht/src/bitdht/bdconnection.cc b/libbitdht/src/bitdht/bdconnection.cc index ba8b0c898..b41130212 100644 --- a/libbitdht/src/bitdht/bdconnection.cc +++ b/libbitdht/src/bitdht/bdconnection.cc @@ -27,6 +27,7 @@ #include "bitdht/bdiface.h" #include "bitdht/bdnode.h" +#include "bitdht/bdquerymgr.h" #include "bitdht/bdconnection.h" #include "bitdht/bdmsgs.h" #include "bitdht/bdstddht.h" @@ -48,7 +49,16 @@ uint32_t createConnectionErrorCode(uint32_t userProvided, uint32_t fallback, uin ******************************************** Connection Config ********************************************** ************************************************************************************************************/ -void bdNode::defaultConnectionOptions() +bdConnectManager::bdConnectManager(bdNodeId *ownId, bdSpace *space, bdQueryManager *qmgr, bdDhtFunctions *fns, bdNodePublisher *pub) + :mOwnId(*ownId), mNodeSpace(space), mQueryMgr(qmgr), mFns(fns), mPub(pub) +{ + defaultConnectionOptions(); +} + + + + +void bdConnectManager::defaultConnectionOptions() { /* by default we want to help people proxy connections. * As this involves no interaction at higher levels, @@ -59,7 +69,7 @@ void bdNode::defaultConnectionOptions() BITDHT_CONNECT_OPTION_AUTOPROXY); } -void bdNode::setConnectionOptions(uint32_t allowedModes, uint32_t flags) +void bdConnectManager::setConnectionOptions(uint32_t allowedModes, uint32_t flags) { mConfigAllowedModes = allowedModes; mConfigAutoProxy = false; @@ -71,125 +81,45 @@ void bdNode::setConnectionOptions(uint32_t allowedModes, uint32_t flags) } - -/************************************************************************************************************ -******************************************** Message Interface ********************************************** -************************************************************************************************************/ - -/* Outgoing Messages */ -std::string getConnectMsgType(int msgtype) +void bdConnectManager::shutdownConnections() { - switch(msgtype) + std::cerr << "bdConnectManager::shutdownConnections() Brutal Shutdown of the following connections: "; + std::cerr << std::endl; + + printConnections(); + + mConnectionRequests.clear(); + mConnections.clear(); + +} + +void bdConnectManager::printConnections() +{ + std::cerr << "bdConnectManager::printConnections()"; + std::cerr << std::endl; + + std::map::iterator it; + for(it = mConnectionRequests.begin(); it != mConnectionRequests.end(); it++) { - case BITDHT_MSG_TYPE_CONNECT_REQUEST: - return "ConnectRequest"; - break; - case BITDHT_MSG_TYPE_CONNECT_REPLY: - return "ConnectReply"; - break; - case BITDHT_MSG_TYPE_CONNECT_START: - return "ConnectStart"; - break; - case BITDHT_MSG_TYPE_CONNECT_ACK: - return "ConnectAck"; - break; - default: - return "ConnectUnknown"; - break; + std::cerr << "bdConnectManager::printConnections() Connect Request:"; + std::cerr << std::endl; + std::cerr << it->second; + std::cerr << std::endl; + } + + std::map::iterator tit; + for(tit = mConnections.begin(); tit != mConnections.end(); tit++) + { + std::cerr << "bdConnectManager::printConnections() ConnectAttempt:"; + std::cerr << std::endl; + std::cerr << tit->second; + std::cerr << std::endl; } } -void bdNode::msgout_connect_genmsg(bdId *id, bdToken *transId, int msgtype, bdId *srcAddr, bdId *destAddr, int mode, int status) -{ - std::cerr << "bdNode::msgout_connect_genmsg() Type: " << getConnectMsgType(msgtype); - std::cerr << " TransId: "; - bdPrintTransId(std::cerr, transId); - std::cerr << " To: "; - mFns->bdPrintId(std::cerr, id); - std::cerr << " SrcAddr: "; - mFns->bdPrintId(std::cerr, srcAddr); - std::cerr << " DestAddr: "; - mFns->bdPrintId(std::cerr, destAddr); - std::cerr << " Mode: " << mode; - std::cerr << " Status: " << status; - std::cerr << std::endl; -#ifdef DEBUG_NODE_MSGOUT -#endif - - registerOutgoingMsg(id, transId, msgtype); - - /* create string */ - char msg[10240]; - int avail = 10240; - - int blen = bitdht_connect_genmsg(transId, &(mOwnId), msgtype, srcAddr, destAddr, mode, status, msg, avail-1); - sendPkt(msg, blen, id->addr); -} -void bdNode::msgin_connect_genmsg(bdId *id, bdToken *transId, int msgtype, - bdId *srcAddr, bdId *destAddr, int mode, int status) -{ - std::list::iterator it; - - std::cerr << "bdNode::msgin_connect_genmsg() Type: " << getConnectMsgType(msgtype); - std::cerr << " TransId: "; - bdPrintTransId(std::cerr, transId); - std::cerr << " From: "; - mFns->bdPrintId(std::cerr, id); - std::cerr << " SrcAddr: "; - mFns->bdPrintId(std::cerr, srcAddr); - std::cerr << " DestAddr: "; - mFns->bdPrintId(std::cerr, destAddr); - std::cerr << " Mode: " << mode; - std::cerr << " Status: " << status; - std::cerr << std::endl; -#ifdef DEBUG_NODE_MSGS -#else - (void) transId; -#endif - - /* switch to actual work functions */ - uint32_t peerflags = 0; - switch(msgtype) - { - case BITDHT_MSG_TYPE_CONNECT_REQUEST: - peerflags = BITDHT_PEER_STATUS_RECV_CONNECT_MSG; - mCounterRecvConnectRequest++; - - recvedConnectionRequest(id, srcAddr, destAddr, mode); - - break; - case BITDHT_MSG_TYPE_CONNECT_REPLY: - peerflags = BITDHT_PEER_STATUS_RECV_CONNECT_MSG; - mCounterRecvConnectReply++; - - recvedConnectionReply(id, srcAddr, destAddr, mode, status); - - break; - case BITDHT_MSG_TYPE_CONNECT_START: - peerflags = BITDHT_PEER_STATUS_RECV_CONNECT_MSG; - mCounterRecvConnectStart++; - - recvedConnectionStart(id, srcAddr, destAddr, mode, status); - - break; - case BITDHT_MSG_TYPE_CONNECT_ACK: - peerflags = BITDHT_PEER_STATUS_RECV_CONNECT_MSG; - mCounterRecvConnectAck++; - - recvedConnectionAck(id, srcAddr, destAddr, mode); - - break; - default: - break; - } - - /* received message - so peer must be good */ - addPeer(id, peerflags); - -} /************************************************************************************************************ @@ -208,11 +138,11 @@ void bdNode::msgin_connect_genmsg(bdId *id, bdToken *transId, int msgtype, * 2) Using a Proxy. */ -int bdNode::requestConnection(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode, uint32_t start) +int bdConnectManager::requestConnection(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode, uint32_t start) { /* check if connection obj already exists */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::requestConnection() Mode: " << mode; + std::cerr << "bdConnectManager::requestConnection() Mode: " << mode; std::cerr << " Start: " << start; std::cerr << " Target: "; mFns->bdPrintNodeId(std::cerr, target); @@ -230,7 +160,7 @@ int bdNode::requestConnection(struct sockaddr_in *laddr, bdNodeId *target, uint3 { /* MODE not supported */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::requestConnection() Mode Not Supported"; + std::cerr << "bdConnectManager::requestConnection() Mode Not Supported"; std::cerr << std::endl; #endif return 0; @@ -241,7 +171,7 @@ int bdNode::requestConnection(struct sockaddr_in *laddr, bdNodeId *target, uint3 { /* MODE not supported */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::requestConnection() WARNING Not allowing connection to self"; + std::cerr << "bdConnectManager::requestConnection() WARNING Not allowing connection to self"; std::cerr << std::endl; #endif return 0; @@ -257,14 +187,14 @@ int bdNode::requestConnection(struct sockaddr_in *laddr, bdNodeId *target, uint3 } } -int bdNode::checkExistingConnectionAttempt(bdNodeId *target) +int bdConnectManager::checkExistingConnectionAttempt(bdNodeId *target) { std::map::iterator it; it = mConnectionRequests.find(*target); if (it != mConnectionRequests.end()) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::checkExistingConnectAttempt() Found Existing Connection!"; + std::cerr << "bdConnectManager::checkExistingConnectAttempt() Found Existing Connection!"; std::cerr << std::endl; #endif return 1; @@ -273,11 +203,11 @@ int bdNode::checkExistingConnectionAttempt(bdNodeId *target) } -int bdNode::killConnectionRequest(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode) +int bdConnectManager::killConnectionRequest(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode) { /* check if connection obj already exists */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::killConnectionRequest() Mode: " << mode; + std::cerr << "bdConnectManager::killConnectionRequest() Mode: " << mode; std::cerr << " Target: "; mFns->bdPrintNodeId(std::cerr, target); std::cerr << " Local NetAddress: " << inet_ntoa(laddr->sin_addr); @@ -290,13 +220,13 @@ int bdNode::killConnectionRequest(struct sockaddr_in *laddr, bdNodeId *target, u if (it == mConnectionRequests.end()) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::killConnectionRequest() ERROR Request not there!"; + std::cerr << "bdConnectManager::killConnectionRequest() ERROR Request not there!"; std::cerr << std::endl; #endif return 0; } - std::cerr << "bdNode::killConnectionRequest() Flagging Connection Request as DONE"; + std::cerr << "bdConnectManager::killConnectionRequest() Flagging Connection Request as DONE"; std::cerr << std::endl; time_t now = time(NULL); @@ -318,11 +248,11 @@ int bdNode::killConnectionRequest(struct sockaddr_in *laddr, bdNodeId *target, u #define CONNECT_NUM_PROXY_ATTEMPTS 10 -int bdNode::requestConnection_direct(struct sockaddr_in *laddr, bdNodeId *target) +int bdConnectManager::requestConnection_direct(struct sockaddr_in *laddr, bdNodeId *target) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::requestConnection_direct()"; + std::cerr << "bdConnectManager::requestConnection_direct()"; std::cerr << std::endl; #endif /* create a bdConnect, and put into the queue */ @@ -336,28 +266,8 @@ int bdNode::requestConnection_direct(struct sockaddr_in *laddr, bdNodeId *target connreq.setupDirectConnection(laddr, target); - /* grab any peers from any existing query */ - std::list::iterator qit; - for(qit = mLocalQueries.begin(); qit != mLocalQueries.end(); qit++) - { - if (!((*qit)->mId == (*target))) - { - continue; - } + mQueryMgr->result(target, connreq.mGoodProxies); -#ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::requestConnection_direct() Found Matching Query"; - std::cerr << std::endl; -#endif - /* matching query */ - /* find any potential proxies (must be same DHT type XXX TODO) */ - (*qit)->result(connreq.mGoodProxies); - - /* will only be one matching query.. so end loop */ - break; - } - - /* now look in the bdSpace as well */ if (connreq.mGoodProxies.size() < MIN_START_DIRECT_COUNT) { @@ -366,7 +276,7 @@ int bdNode::requestConnection_direct(struct sockaddr_in *laddr, bdNodeId *target std::list matchIds; std::list::iterator it; std::list::iterator pit; - mNodeSpace.find_node(target, number, matchIds, with_flag); + mNodeSpace->find_node(target, number, matchIds, with_flag); /* merge lists (costly should use sets or something) */ for(it = matchIds.begin(); it != matchIds.end(); it++) @@ -384,12 +294,12 @@ int bdNode::requestConnection_direct(struct sockaddr_in *laddr, bdNodeId *target if (connreq.mGoodProxies.size() > 1) { - std::cerr << "bdNode::requestConnection_direct() ERROR Multiple Peers for DIRECT connection"; + std::cerr << "bdConnectManager::requestConnection_direct() ERROR Multiple Peers for DIRECT connection"; std::cerr << std::endl; } #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::requestConnection_direct() CRINITSTATE Init Connection State"; + std::cerr << "bdConnectManager::requestConnection_direct() CRINITSTATE Init Connection State"; std::cerr << std::endl; std::cerr << connreq; std::cerr << std::endl; @@ -404,11 +314,11 @@ int bdNode::requestConnection_direct(struct sockaddr_in *laddr, bdNodeId *target } -int bdNode::requestConnection_proxy(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode) +int bdConnectManager::requestConnection_proxy(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::requestConnection_proxy()"; + std::cerr << "bdConnectManager::requestConnection_proxy()"; std::cerr << std::endl; #endif @@ -418,31 +328,10 @@ int bdNode::requestConnection_proxy(struct sockaddr_in *laddr, bdNodeId *target, connreq.setupProxyConnection(laddr, target, mode); /* grab any peers from any existing query */ - std::list::iterator qit; - std::list potentialProxies; std::list::iterator pit; - - for(qit = mLocalQueries.begin(); qit != mLocalQueries.end(); qit++) - { - if (!((*qit)->mId == (*target))) - { - continue; - } - -#ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::requestConnection_proxy() Found Matching Query"; - std::cerr << std::endl; -#endif - /* matching query */ - // Extract the proxies, that the query has gathered. - // The good ones go straight over. - // The potentials must be further checked. - (*qit)->proxies(connreq.mGoodProxies); - (*qit)->potentialProxies(potentialProxies); - - /* will only be one matching query.. so end loop */ - break; - } + std::list potentialProxies; + mQueryMgr->proxies(target, connreq.mGoodProxies); + mQueryMgr->potentialProxies(target, potentialProxies); /* check any potential proxies, must be same DHT Type */ for(pit = potentialProxies.begin(); pit != potentialProxies.end(); ) @@ -472,17 +361,11 @@ int bdNode::requestConnection_proxy(struct sockaddr_in *laddr, bdNodeId *target, // If the pings come back will be handled by // updatePotentialConnectionProxy() - /* push out ping */ - bdToken transId; - genNewTransId(&transId); - //registerOutgoingMsg(&(*pit), &transId, BITDHT_MSG_TYPE_PING); - msgout_ping(&(*pit), &transId); - - std::cerr << "bdNode::requestConnection_proxy() Pinging Potential Proxy"; + mPub->send_ping(&(*pit)); + + std::cerr << "bdConnectManager::requestConnection_proxy() Pinging Potential Proxy"; mFns->bdPrintId(std::cerr, &(*pit)); std::cerr << std::endl; - - mCounterPings++; } } @@ -500,13 +383,13 @@ int bdNode::requestConnection_proxy(struct sockaddr_in *laddr, bdNodeId *target, int number = CONNECT_NUM_PROXY_ATTEMPTS; - mNodeSpace.find_nearest_nodes_with_flags(target, number, excluding, nearest, + mNodeSpace->find_nearest_nodes_with_flags(target, number, excluding, nearest, BITDHT_PEER_STATUS_DHT_FOF | BITDHT_PEER_STATUS_DHT_FRIEND); number = CONNECT_NUM_PROXY_ATTEMPTS - number; - mNodeSpace.find_nearest_nodes_with_flags(target, number, excluding, nearest, + mNodeSpace->find_nearest_nodes_with_flags(target, number, excluding, nearest, BITDHT_PEER_STATUS_DHT_ENGINE_VERSION ); std::multimap::iterator it; @@ -515,20 +398,20 @@ int bdNode::requestConnection_proxy(struct sockaddr_in *laddr, bdNodeId *target, bdNodeId midId; mFns->bdRandomMidId(target, &(it->second.id), &midId); /* trigger search */ - send_query(&(it->second), &midId); + mPub->send_query(&(it->second), &midId); } } if (connreq.mGoodProxies.size() < 1) { - std::cerr << "bdNode::requestConnection_proxy() ERROR initial proxyList.size() == 0"; + std::cerr << "bdConnectManager::requestConnection_proxy() ERROR initial proxyList.size() == 0"; std::cerr << std::endl; } if (connreq.mGoodProxies.size() < MIN_START_PROXY_COUNT) { - std::cerr << "bdNode::requestConnection_proxy() WARNING initial proxyList.size() == SMALL PAUSING"; + std::cerr << "bdConnectManager::requestConnection_proxy() WARNING initial proxyList.size() == SMALL PAUSING"; std::cerr << std::endl; time_t now = time(NULL); @@ -539,7 +422,7 @@ int bdNode::requestConnection_proxy(struct sockaddr_in *laddr, bdNodeId *target, } #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::requestConnection_proxy() CRINITSTATE Init Connection State"; + std::cerr << "bdConnectManager::requestConnection_proxy() CRINITSTATE Init Connection State"; std::cerr << std::endl; std::cerr << connreq; std::cerr << std::endl; @@ -552,22 +435,22 @@ int bdNode::requestConnection_proxy(struct sockaddr_in *laddr, bdNodeId *target, return 1; } -void bdNode::addPotentialConnectionProxy(const bdId *srcId, const bdId *target) +void bdConnectManager::addPotentialConnectionProxy(const bdId *srcId, const bdId *target) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::addPotentialConnectionProxy() "; - std::cerr << " srcId: "; - bdStdPrintId(std::cerr, srcId); - std::cerr << " target: "; - bdStdPrintId(std::cerr, target); - std::cerr << std::endl; + //std::cerr << "bdConnectManager::addPotentialConnectionProxy() "; + //std::cerr << " srcId: "; + //bdStdPrintId(std::cerr, srcId); + //std::cerr << " target: "; + //bdStdPrintId(std::cerr, target); + //std::cerr << std::endl; #endif if (!srcId) { /* not one of our targets... drop it */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::addPotentialConnectionProxy() srcID = NULL, useless to us"; + std::cerr << "bdConnectManager::addPotentialConnectionProxy() srcID = NULL, useless to us"; std::cerr << std::endl; #endif return; @@ -579,8 +462,8 @@ void bdNode::addPotentialConnectionProxy(const bdId *srcId, const bdId *target) { /* not one of our targets... drop it */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::addPotentialConnectionProxy() Dropping Not one of Our Targets"; - std::cerr << std::endl; + //std::cerr << "bdConnectManager::addPotentialConnectionProxy() Dropping Not one of Our Targets"; + //std::cerr << std::endl; #endif return; } @@ -588,7 +471,7 @@ void bdNode::addPotentialConnectionProxy(const bdId *srcId, const bdId *target) if (it->second.mMode == BITDHT_CONNECT_MODE_DIRECT) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::addPotentialConnectionProxy() Dropping Target is DIRECT"; + std::cerr << "bdConnectManager::addPotentialConnectionProxy() Dropping Target is DIRECT"; std::cerr << std::endl; #endif return; @@ -601,11 +484,11 @@ void bdNode::addPotentialConnectionProxy(const bdId *srcId, const bdId *target) if (srcId->id == target->id) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::addPotentialConnectionProxy() ERROR srcId.id == target.id (more of a WARNING)"; + std::cerr << "bdConnectManager::addPotentialConnectionProxy() ERROR srcId.id == target.id (more of a WARNING)"; std::cerr << std::endl; - std::cerr << "bdNode::addPotentialConnectionProxy() NB: This means peer is actually reachable...."; + std::cerr << "bdConnectManager::addPotentialConnectionProxy() NB: This means peer is actually reachable...."; std::cerr << std::endl; - std::cerr << "bdNode::addPotentialConnectionProxy() and we should be connecting directly. Oh Well!"; + std::cerr << "bdConnectManager::addPotentialConnectionProxy() and we should be connecting directly. Oh Well!"; std::cerr << std::endl; #endif return; @@ -614,7 +497,7 @@ void bdNode::addPotentialConnectionProxy(const bdId *srcId, const bdId *target) if (checkPeerForFlag(srcId, BITDHT_PEER_STATUS_DHT_ENGINE_VERSION)) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::addPotentialConnectionProxy() Src passes FLAG test"; + std::cerr << "bdConnectManager::addPotentialConnectionProxy() Src passes FLAG test"; std::cerr << std::endl; #endif it->second.addGoodProxy(srcId); @@ -622,18 +505,18 @@ void bdNode::addPotentialConnectionProxy(const bdId *srcId, const bdId *target) else { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::addPotentialConnectionProxy() Dropping SrcId failed FLAG test"; + std::cerr << "bdConnectManager::addPotentialConnectionProxy() Dropping SrcId failed FLAG test"; std::cerr << std::endl; #endif } } -int bdNode::checkPeerForFlag(const bdId *id, uint32_t with_flag) +int bdConnectManager::checkPeerForFlag(const bdId *id, uint32_t with_flag) { /* check the type in bdSpace */ bdPeer peer; - if (mNodeSpace.find_exactnode(id, peer)) + if (mNodeSpace->find_exactnode(id, peer)) { if (peer.mPeerFlags & with_flag) { @@ -650,12 +533,12 @@ int bdNode::checkPeerForFlag(const bdId *id, uint32_t with_flag) } -void bdNode::updatePotentialConnectionProxy(const bdId *id, uint32_t mode) +void bdConnectManager::updatePotentialConnectionProxy(const bdId *id, uint32_t mode) { if (mode & BITDHT_PEER_STATUS_DHT_ENGINE_VERSION) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::updatePotentialConnectionProxy() Peer is GOOD, checking Connection Requests"; + std::cerr << "bdConnectManager::updatePotentialConnectionProxy() Peer is GOOD, checking Connection Requests"; std::cerr << std::endl; #endif /* good peer, see if any of our connectionrequests can use it */ @@ -668,7 +551,7 @@ void bdNode::updatePotentialConnectionProxy(const bdId *id, uint32_t mode) } -int bdNode::tickConnections() +int bdConnectManager::tickConnections() { iterateConnectionRequests(); iterateConnections(); @@ -677,7 +560,7 @@ int bdNode::tickConnections() } -void bdNode::iterateConnectionRequests() +void bdConnectManager::iterateConnectionRequests() { time_t now = time(NULL); @@ -688,7 +571,7 @@ void bdNode::iterateConnectionRequests() for(it = mConnectionRequests.begin(); it != mConnectionRequests.end(); it++) { bool erase = false; - std::cerr << "bdNode::iterateConnectionAttempt() Request is:"; + std::cerr << "bdConnectManager::iterateConnectionAttempt() Request is:"; std::cerr << std::endl; std::cerr << it->second; std::cerr << std::endl; @@ -697,7 +580,7 @@ void bdNode::iterateConnectionRequests() /* check status of connection */ if (it->second.mState == BITDHT_CONNREQUEST_READY) { - std::cerr << "bdNode::iterateConnectionAttempt() Request is READY, starting"; + std::cerr << "bdConnectManager::iterateConnectionAttempt() Request is READY, starting"; std::cerr << std::endl; @@ -707,7 +590,7 @@ void bdNode::iterateConnectionRequests() if (!startConnectionAttempt(&(it->second))) { // FAILS if proxy is bad / nonexistent - std::cerr << "bdNode::iterateConnectionAttempt() Failed startup => PAUSED"; + std::cerr << "bdConnectManager::iterateConnectionAttempt() Failed startup => PAUSED"; std::cerr << std::endl; std::cerr << it->second; std::cerr << std::endl; @@ -725,13 +608,13 @@ void bdNode::iterateConnectionRequests() /* forced pause, with period specified at PAUSE point */ if (now > it->second.mPauseTS) { - std::cerr << "bdNode::iterateConnectionAttempt() PAUSED has reached timout -> READY"; + std::cerr << "bdConnectManager::iterateConnectionAttempt() PAUSED has reached timout -> READY"; std::cerr << std::endl; /* if we have run out of proxies, or recycled too many times. kill it */ if (it->second.mGoodProxies.size() == 0) { - std::cerr << "bdNode::iterateConnectionAttempt() no more proxies => DONE"; + std::cerr << "bdConnectManager::iterateConnectionAttempt() no more proxies => DONE"; std::cerr << std::endl; it->second.mErrCode = BITDHT_CONNECT_ERROR_SOURCE_START | @@ -741,7 +624,7 @@ void bdNode::iterateConnectionRequests() } else if (it->second.mRecycled > it->second.mGoodProxies.size() * MAX_NUM_RETRIES) { - std::cerr << "bdNode::iterateConnectionAttempt() to many retries => DONE"; + std::cerr << "bdConnectManager::iterateConnectionAttempt() to many retries => DONE"; std::cerr << std::endl; it->second.mErrCode = BITDHT_CONNECT_ERROR_SOURCE_START | @@ -762,7 +645,7 @@ void bdNode::iterateConnectionRequests() /* single connection attempt */ if (now - it->second.mStateTS > BITDHT_CONNREQUEST_TIMEOUT_INPROGRESS) { - std::cerr << "bdNode::iterateConnectionAttempt() INPROGRESS has reached timout -> READY"; + std::cerr << "bdConnectManager::iterateConnectionAttempt() INPROGRESS has reached timout -> READY"; std::cerr << std::endl; std::cerr << it->second; std::cerr << std::endl; @@ -779,7 +662,7 @@ void bdNode::iterateConnectionRequests() /* connection completed, doing UDP connection */ if (now - it->second.mStateTS > BITDHT_CONNREQUEST_TIMEOUT_CONNECT) { - std::cerr << "bdNode::iterateConnectionAttempt() EXTCONNECT has reached timout ->????"; + std::cerr << "bdConnectManager::iterateConnectionAttempt() EXTCONNECT has reached timout ->????"; std::cerr << std::endl; std::cerr << it->second; std::cerr << std::endl; @@ -793,7 +676,7 @@ void bdNode::iterateConnectionRequests() } else if (it->second.mState == BITDHT_CONNREQUEST_DONE) { - std::cerr << "bdNode::iterateConnectionAttempt() DONE -> erase"; + std::cerr << "bdConnectManager::iterateConnectionAttempt() DONE -> erase"; std::cerr << std::endl; std::cerr << it->second; std::cerr << std::endl; @@ -805,7 +688,7 @@ void bdNode::iterateConnectionRequests() // Cleanup if (now - it->second.mStateTS > BITDHT_CONNREQUEST_MAX_AGE) { - std::cerr << "bdNode::iterateConnectionAttempt() Cleaning Old ConnReq: "; + std::cerr << "bdConnectManager::iterateConnectionAttempt() Cleaning Old ConnReq: "; std::cerr << std::endl; std::cerr << it->second; std::cerr << std::endl; @@ -840,16 +723,16 @@ void bdNode::iterateConnectionRequests() -int bdNode::startConnectionAttempt(bdConnectionRequest *req) +int bdConnectManager::startConnectionAttempt(bdConnectionRequest *req) { - std::cerr << "bdNode::startConnectionAttempt() ConnReq: "; + std::cerr << "bdConnectManager::startConnectionAttempt() ConnReq: "; std::cerr << std::endl; std::cerr << *req; std::cerr << std::endl; if (req->mGoodProxies.size() < 1) { - std::cerr << "bdNode::startConnectionAttempt() No Potential Proxies... delaying attempt"; + std::cerr << "bdConnectManager::startConnectionAttempt() No Potential Proxies... delaying attempt"; std::cerr << std::endl; return 0; } @@ -881,7 +764,7 @@ int bdNode::startConnectionAttempt(bdConnectionRequest *req) // ONE BUG I HAVE SEEN. if (!(req->mTarget == proxyId.id)) { - std::cerr << "bdNode::startConnectionAttempt() ERROR Trying to use a Proxy for DIRECT"; + std::cerr << "bdConnectManager::startConnectionAttempt() ERROR Trying to use a Proxy for DIRECT"; std::cerr << std::endl; return 0; @@ -891,7 +774,7 @@ int bdNode::startConnectionAttempt(bdConnectionRequest *req) { if (req->mTarget == proxyId.id) { - std::cerr << "bdNode::startConnectionAttempt() ERROR Trying connect direct for PROXY|RELAY"; + std::cerr << "bdConnectManager::startConnectionAttempt() ERROR Trying connect direct for PROXY|RELAY"; std::cerr << std::endl; return 0; @@ -920,12 +803,12 @@ int bdNode::startConnectionAttempt(bdConnectionRequest *req) * get passed on up if necessary. */ -void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, +void bdConnectManager::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, int mode, int point, int cbtype, int errcode) { /* Check if we are the originator of the Connect Request. If so, then we do stuff to the CR. */ - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "mode: " << mode; std::cerr << " point: " << point; std::cerr << " cbtype: " << cbtype; @@ -948,7 +831,7 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, /* ONLY ONE CASE THAT GOES HERE -> for sanity testing */ if ((cbtype == BITDHT_CONNECT_CB_START) && (point == BD_PROXY_CONNECTION_END_POINT)) { - std::cerr << "bdNode::callbackConnectRequest() END & START checking ConnectRequest state"; + std::cerr << "bdConnectManager::callbackConnectRequest() END & START checking ConnectRequest state"; std::cerr << std::endl; // Reverse lookup (srcId). @@ -957,7 +840,7 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, { if (it->second.mState == BITDHT_CONNREQUEST_INPROGRESS) { - std::cerr << "bdNode::callbackConnectRequest() ERROR alt CR also in progress!"; + std::cerr << "bdConnectManager::callbackConnectRequest() ERROR alt CR also in progress!"; std::cerr << std::endl; } } @@ -965,7 +848,7 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, return; } - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "ERROR point != START, should not be receiving this callback, ignoring"; std::cerr << std::endl; return; @@ -975,7 +858,7 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, std::map::iterator it = mConnectionRequests.find(destId->id); if (it == mConnectionRequests.end()) { - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "ERROR no associated Connection Request, ignoring"; std::cerr << std::endl; return; @@ -998,7 +881,7 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, case BITDHT_CONNECT_CB_PENDING: case BITDHT_CONNECT_CB_PROXY: { - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "ERROR unexpected CBTYPE: AUTH/PENDING/PROXY/other. ignoring"; std::cerr << std::endl; return; @@ -1006,7 +889,7 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, case BITDHT_CONNECT_CB_FAILED: { - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "Connection FAILED.... determining if fatal/recycle/next"; std::cerr << std::endl; @@ -1026,7 +909,7 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, case BITDHT_CONNECT_ERROR_PROTOCOL: case BITDHT_CONNECT_ERROR_TIMEOUT: // SHould never receive. { - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "ERROR unexpected errcode: " << errcode; std::cerr << std::endl; } @@ -1041,14 +924,14 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, // fatal. fatal = true; - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "END says UNREACHABLE. FATAL ;("; std::cerr << std::endl; } else { // error. - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "ERROR, UNREACHABLE, but !END"; std::cerr << std::endl; } @@ -1061,21 +944,21 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, // fatal. fatal = true; - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "END says AUTH_DENIED, fatal"; std::cerr << std::endl; } else if (errsrc == BITDHT_CONNECT_ERROR_SOURCE_MID) { // next. (unlikely). - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "WARNING MID says AUTH_DENIED"; std::cerr << std::endl; } else { // error. - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "ERROR strange AUTH_DENIED"; std::cerr << std::endl; } @@ -1088,14 +971,14 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, // fatal. fatal = true; - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "END says UNSUPPORTED, fatal"; std::cerr << std::endl; } else if (errsrc == BITDHT_CONNECT_ERROR_SOURCE_MID) { // next. - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "MID says UNSUPPORTED"; std::cerr << std::endl; @@ -1103,7 +986,7 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, else { // error. - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "ERROR strange UNSUPPORTED"; std::cerr << std::endl; @@ -1118,14 +1001,14 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, { recycle = true; - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "END says TEMPUNAVAIL, recycle"; std::cerr << std::endl; } else { // next. - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "ERROR strange TEMPUNAVAIL"; std::cerr << std::endl; @@ -1134,7 +1017,7 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, case BITDHT_CONNECT_ERROR_DUPLICATE: // similar attempt. delay/recycle (ANY/ANY) { - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << " DUPLICATE, recycle"; std::cerr << std::endl; @@ -1148,7 +1031,7 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, { recycle = true; - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "MID says OVERLOADED, recycle"; std::cerr << std::endl; @@ -1156,7 +1039,7 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, else { //ERROR. - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "ERROR strange OVERLOADED"; std::cerr << std::endl; } @@ -1169,14 +1052,14 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, if (errsrc == BITDHT_CONNECT_ERROR_SOURCE_MID) { // could recycle? probably still won't work. - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "MID says NOADDRESS"; std::cerr << std::endl; } else { //ERROR. - std::cerr << "bdNode::callbackConnectRequest() "; + std::cerr << "bdConnectManager::callbackConnectRequest() "; std::cerr << "ERROR strange NOADDRESS"; std::cerr << std::endl; } @@ -1256,10 +1139,10 @@ void bdNode::callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, * In all cases, destConnAddr doesn't need to contain a valid address. */ -int bdNode::startConnectionAttempt(bdId *proxyId, bdId *srcConnAddr, bdId *destConnAddr, int mode) +int bdConnectManager::startConnectionAttempt(bdId *proxyId, bdId *srcConnAddr, bdId *destConnAddr, int mode) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::startConnectionAttempt()"; + std::cerr << "bdConnectManager::startConnectionAttempt()"; std::cerr << std::endl; #endif @@ -1267,7 +1150,7 @@ int bdNode::startConnectionAttempt(bdId *proxyId, bdId *srcConnAddr, bdId *destC { /* MODE not supported */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::startConnectionAttempt() ERROR Mode Not Supported"; + std::cerr << "bdConnectManager::startConnectionAttempt() ERROR Mode Not Supported"; std::cerr << std::endl; #endif return 0; @@ -1279,7 +1162,7 @@ int bdNode::startConnectionAttempt(bdId *proxyId, bdId *srcConnAddr, bdId *destC { /* ERROR */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::startConnectAttempt() ERROR EXISTING CONNECTION"; + std::cerr << "bdConnectManager::startConnectAttempt() ERROR EXISTING CONNECTION"; std::cerr << std::endl; #endif return 0; @@ -1307,14 +1190,11 @@ int bdNode::startConnectionAttempt(bdId *proxyId, bdId *srcConnAddr, bdId *destC conn->ConnectionSetup(proxyId, srcConnAddr, destConnAddr, mode); } - /* push off message */ - bdToken transId; - genNewTransId(&transId); int msgtype = BITDHT_MSG_TYPE_CONNECT_REQUEST; int status = BITDHT_CONNECT_ANSWER_OKAY; - - msgout_connect_genmsg(&(conn->mProxyId), &transId, msgtype, &(conn->mSrcConnAddr), &(conn->mDestConnAddr), conn->mMode, status); + mPub->send_connect_msg(&(conn->mProxyId), msgtype, + &(conn->mSrcConnAddr), &(conn->mDestConnAddr), conn->mMode, status); return 1; } @@ -1332,11 +1212,11 @@ int bdNode::startConnectionAttempt(bdId *proxyId, bdId *srcConnAddr, bdId *destC * */ -void bdNode::AuthConnectionOk(bdId *srcId, bdId *proxyId, bdId *destId, int mode, int loc) +void bdConnectManager::AuthConnectionOk(bdId *srcId, bdId *proxyId, bdId *destId, int mode, int loc) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::AuthConnectionOk()"; + std::cerr << "bdConnectManager::AuthConnectionOk()"; std::cerr << std::endl; #endif @@ -1346,7 +1226,7 @@ void bdNode::AuthConnectionOk(bdId *srcId, bdId *proxyId, bdId *destId, int mode { /* ERROR */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::AuthConnectionOk() ERROR NO EXISTING CONNECTION"; + std::cerr << "bdConnectManager::AuthConnectionOk() ERROR NO EXISTING CONNECTION"; std::cerr << std::endl; #endif return; @@ -1358,7 +1238,7 @@ void bdNode::AuthConnectionOk(bdId *srcId, bdId *proxyId, bdId *destId, int mode if (conn->mState == BITDHT_CONNECTION_WAITING_AUTH) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::AuthConnectionOk() Direct Connection, in WAITING_AUTH state... Authorising Direct Connect"; + std::cerr << "bdConnectManager::AuthConnectionOk() Direct Connection, in WAITING_AUTH state... Authorising Direct Connect"; std::cerr << std::endl; #endif /* This pushes it into the START/ACK cycle, @@ -1370,7 +1250,7 @@ void bdNode::AuthConnectionOk(bdId *srcId, bdId *proxyId, bdId *destId, int mode { /* ERROR */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::AuthConnectionOk() ERROR Direct Connection, !WAITING_AUTH state... Ignoring"; + std::cerr << "bdConnectManager::AuthConnectionOk() ERROR Direct Connection, !WAITING_AUTH state... Ignoring"; std::cerr << std::endl; #endif @@ -1383,19 +1263,17 @@ void bdNode::AuthConnectionOk(bdId *srcId, bdId *proxyId, bdId *destId, int mode if (conn->mState == BITDHT_CONNECTION_WAITING_AUTH) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::AuthConnectionOk() Proxy End Connection, in WAITING_AUTH state... Authorising"; + std::cerr << "bdConnectManager::AuthConnectionOk() Proxy End Connection, in WAITING_AUTH state... Authorising"; std::cerr << std::endl; #endif /*** XXX MUST RECEIVE THE ADDRESS FROM DEST for connection */ conn->AuthoriseEndConnection(srcId, proxyId, destId, mode, loc); /* we respond to the proxy which will finalise connection */ - bdToken transId; - genNewTransId(&transId); - int msgtype = BITDHT_MSG_TYPE_CONNECT_REPLY; int status = BITDHT_CONNECT_ANSWER_OKAY; - msgout_connect_genmsg(&(conn->mProxyId), &transId, msgtype, &(conn->mSrcConnAddr), &(conn->mDestConnAddr), conn->mMode, status); + mPub->send_connect_msg(&(conn->mProxyId), msgtype, + &(conn->mSrcConnAddr), &(conn->mDestConnAddr), conn->mMode, status); return; } @@ -1404,7 +1282,7 @@ void bdNode::AuthConnectionOk(bdId *srcId, bdId *proxyId, bdId *destId, int mode /* ERROR */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::AuthConnectionOk() ERROR Proxy End Connection, !WAITING_AUTH state... Ignoring"; + std::cerr << "bdConnectManager::AuthConnectionOk() ERROR Proxy End Connection, !WAITING_AUTH state... Ignoring"; std::cerr << std::endl; #endif } @@ -1414,7 +1292,7 @@ void bdNode::AuthConnectionOk(bdId *srcId, bdId *proxyId, bdId *destId, int mode { /* otherwise we are the proxy (for either), pass on the request */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::AuthConnectionOk() Proxy Mid Connection, in WAITING_AUTH state... Authorising"; + std::cerr << "bdConnectManager::AuthConnectionOk() Proxy Mid Connection, in WAITING_AUTH state... Authorising"; std::cerr << std::endl; #endif @@ -1422,18 +1300,16 @@ void bdNode::AuthConnectionOk(bdId *srcId, bdId *proxyId, bdId *destId, int mode conn->AuthoriseProxyConnection(srcId, proxyId, destId, mode, loc); - bdToken transId; - genNewTransId(&transId); - int msgtype = BITDHT_MSG_TYPE_CONNECT_REQUEST; int status = BITDHT_CONNECT_ANSWER_OKAY; - msgout_connect_genmsg(&(conn->mDestId), &transId, msgtype, &(conn->mSrcConnAddr), &(conn->mDestConnAddr), conn->mMode, status); + mPub->send_connect_msg(&(conn->mDestId), msgtype, + &(conn->mSrcConnAddr), &(conn->mDestConnAddr), conn->mMode, status); } else { /* ERROR */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::AuthConnectionOk() ERROR Proxy Mid Connection, !WAITING_AUTH state... Ignoring"; + std::cerr << "bdConnectManager::AuthConnectionOk() ERROR Proxy Mid Connection, !WAITING_AUTH state... Ignoring"; std::cerr << std::endl; #endif } @@ -1444,11 +1320,11 @@ void bdNode::AuthConnectionOk(bdId *srcId, bdId *proxyId, bdId *destId, int mode -void bdNode::AuthConnectionNo(bdId *srcId, bdId *proxyId, bdId *destId, int mode, int loc, int errCode) +void bdConnectManager::AuthConnectionNo(bdId *srcId, bdId *proxyId, bdId *destId, int mode, int loc, int errCode) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::AuthConnectionNo()"; + std::cerr << "bdConnectManager::AuthConnectionNo()"; std::cerr << std::endl; #endif @@ -1458,7 +1334,7 @@ void bdNode::AuthConnectionNo(bdId *srcId, bdId *proxyId, bdId *destId, int mode { /* ERROR */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::AuthConnectionNo() ERROR NO EXISTING CONNECTION"; + std::cerr << "bdConnectManager::AuthConnectionNo() ERROR NO EXISTING CONNECTION"; std::cerr << std::endl; #endif return; @@ -1472,14 +1348,11 @@ void bdNode::AuthConnectionNo(bdId *srcId, bdId *proxyId, bdId *destId, int mode { /* we respond to the proxy which will finalise connection */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::AuthConnectionNo() Direct End Connection Cleaning up"; + std::cerr << "bdConnectManager::AuthConnectionNo() Direct End Connection Cleaning up"; std::cerr << std::endl; #endif - bdToken transId; - genNewTransId(&transId); - - msgout_connect_genmsg(&(conn->mSrcId), &transId, msgtype, - &(conn->mSrcConnAddr), &(conn->mDestConnAddr), mode, status); + mPub->send_connect_msg(&(conn->mSrcId), msgtype, + &(conn->mSrcConnAddr), &(conn->mDestConnAddr), mode, status); cleanConnection(&(srcId->id), &(proxyId->id), &(destId->id)); return; @@ -1489,14 +1362,11 @@ void bdNode::AuthConnectionNo(bdId *srcId, bdId *proxyId, bdId *destId, int mode { /* we respond to the proxy which will finalise connection */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::AuthConnectionNo() Proxy End Connection Cleaning up"; + std::cerr << "bdConnectManager::AuthConnectionNo() Proxy End Connection Cleaning up"; std::cerr << std::endl; #endif - bdToken transId; - genNewTransId(&transId); - - msgout_connect_genmsg(&(conn->mProxyId), &transId, msgtype, - &(conn->mSrcConnAddr), &(conn->mDestConnAddr), mode, status); + mPub->send_connect_msg(&(conn->mProxyId), msgtype, + &(conn->mSrcConnAddr), &(conn->mDestConnAddr), mode, status); cleanConnection(&(srcId->id), &(proxyId->id), &(destId->id)); @@ -1505,14 +1375,11 @@ void bdNode::AuthConnectionNo(bdId *srcId, bdId *proxyId, bdId *destId, int mode /* otherwise we are the proxy (for either), reply FAIL */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::AuthConnectionNo() Proxy Mid Connection Cleaning up"; + std::cerr << "bdConnectManager::AuthConnectionNo() Proxy Mid Connection Cleaning up"; std::cerr << std::endl; #endif - bdToken transId; - genNewTransId(&transId); - - msgout_connect_genmsg(&(conn->mSrcId), &transId, msgtype, - &(conn->mSrcConnAddr), &(conn->mDestConnAddr), mode, status); + mPub->send_connect_msg(&(conn->mSrcId), msgtype, + &(conn->mSrcConnAddr), &(conn->mDestConnAddr), mode, status); cleanConnection(&(srcId->id), &(proxyId->id), &(destId->id)); @@ -1523,7 +1390,7 @@ void bdNode::AuthConnectionNo(bdId *srcId, bdId *proxyId, bdId *destId, int mode -void bdNode::iterateConnections() +void bdConnectManager::iterateConnections() { std::map::iterator it; std::list eraseList; @@ -1535,7 +1402,7 @@ void bdNode::iterateConnections() { /* cleanup event */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::iterateConnections() Connection Timed Out: " << (it->first); + std::cerr << "bdConnectManager::iterateConnections() Connection Timed Out: " << (it->first); std::cerr << std::endl; #endif eraseList.push_back(it->first); @@ -1548,7 +1415,7 @@ void bdNode::iterateConnections() if (it->second.mRetryCount > BD_CONNECTION_START_MAX_RETRY) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::iterateConnections() Start/ACK cycle, Too many iterations: " << it->first; + std::cerr << "bdConnectManager::iterateConnections() Start/ACK cycle, Too many iterations: " << it->first; std::cerr << std::endl; #endif /* connection failed! cleanup */ @@ -1567,28 +1434,22 @@ void bdNode::iterateConnections() else { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::iterateConnections() Start/ACK cycle, Retransmitting START: " << it->first; + std::cerr << "bdConnectManager::iterateConnections() Start/ACK cycle, Retransmitting START: " << it->first; std::cerr << std::endl; #endif it->second.mLastStart = now; it->second.mRetryCount++; if (!it->second.mSrcAck) { - bdToken transId; - genNewTransId(&transId); - int msgtype = BITDHT_MSG_TYPE_CONNECT_START; - msgout_connect_genmsg(&(it->second.mSrcId), &transId, msgtype, + mPub->send_connect_msg(&(it->second.mSrcId), msgtype, &(it->second.mSrcConnAddr), &(it->second.mDestConnAddr), it->second.mMode, it->second.mBandwidth); } if (!it->second.mDestAck) { - bdToken transId; - genNewTransId(&transId); - int msgtype = BITDHT_MSG_TYPE_CONNECT_START; - msgout_connect_genmsg(&(it->second.mDestId), &transId, msgtype, + mPub->send_connect_msg(&(it->second.mDestId), msgtype, &(it->second.mSrcConnAddr), &(it->second.mDestConnAddr), it->second.mMode, it->second.mBandwidth); } @@ -1615,10 +1476,11 @@ void bdNode::iterateConnections() ************************************************************************************************************/ -void bdNode::callbackConnect(bdId *srcId, bdId *proxyId, bdId *destId, +void bdConnectManager::callbackConnect(bdId *srcId, bdId *proxyId, bdId *destId, int mode, int point, int cbtype, int errcode) { /* This is overloaded at a higher level */ + mPub->callbackConnect(srcId, proxyId, destId, mode, point, cbtype, errcode); } @@ -1713,7 +1575,7 @@ bdConnection::bdConnection() /* heavy check, used to check for alternative connections, coming from other direction * Caller must switch src/dest to use it properly (otherwise it'll find your connection!) */ -bdConnection *bdNode::findSimilarConnection(bdNodeId *srcId, bdNodeId *destId) +bdConnection *bdConnectManager::findSimilarConnection(bdNodeId *srcId, bdNodeId *destId) { std::map::iterator it; for(it = mConnections.begin(); it != mConnections.end(); it++) @@ -1727,51 +1589,51 @@ bdConnection *bdNode::findSimilarConnection(bdNodeId *srcId, bdNodeId *destId) return NULL; } -bdConnection *bdNode::findExistingConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId) +bdConnection *bdConnectManager::findExistingConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId) { bdProxyTuple tuple(srcId, proxyId, destId); - std::cerr << "bdNode::findExistingConnection() Looking For: " << tuple << std::endl; + std::cerr << "bdConnectManager::findExistingConnection() Looking For: " << tuple << std::endl; std::map::iterator it = mConnections.find(tuple); if (it == mConnections.end()) { - std::cerr << "bdNode::findExistingConnection() Failed to Find: " << tuple << std::endl; + std::cerr << "bdConnectManager::findExistingConnection() Failed to Find: " << tuple << std::endl; return NULL; } - std::cerr << "bdNode::findExistingConnection() Found: " << tuple << std::endl; + std::cerr << "bdConnectManager::findExistingConnection() Found: " << tuple << std::endl; return &(it->second); } -bdConnection *bdNode::newConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId) +bdConnection *bdConnectManager::newConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId) { bdProxyTuple tuple(srcId, proxyId, destId); bdConnection conn; - std::cerr << "bdNode::newConnection() Installing: " << tuple << std::endl; + std::cerr << "bdConnectManager::newConnection() Installing: " << tuple << std::endl; mConnections[tuple] = conn; std::map::iterator it = mConnections.find(tuple); if (it == mConnections.end()) { - std::cerr << "bdNode::newConnection() ERROR Installing: " << tuple << std::endl; + std::cerr << "bdConnectManager::newConnection() ERROR Installing: " << tuple << std::endl; return NULL; } return &(it->second); } -int bdNode::cleanConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId) +int bdConnectManager::cleanConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId) { bdProxyTuple tuple(srcId, proxyId, destId); bdConnection conn; - std::cerr << "bdNode::cleanConnection() Removing: " << tuple << std::endl; + std::cerr << "bdConnectManager::cleanConnection() Removing: " << tuple << std::endl; std::map::iterator it = mConnections.find(tuple); if (it == mConnections.end()) { - std::cerr << "bdNode::cleanConnection() ERROR Removing: " << tuple << std::endl; + std::cerr << "bdConnectManager::cleanConnection() ERROR Removing: " << tuple << std::endl; return 0; } mConnections.erase(it); @@ -1780,7 +1642,7 @@ int bdNode::cleanConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId } -int bdNode::determinePosition(bdNodeId *sender, bdNodeId *src, bdNodeId *dest) +int bdConnectManager::determinePosition(bdNodeId *sender, bdNodeId *src, bdNodeId *dest) { int pos = BD_PROXY_CONNECTION_UNKNOWN_POINT; if (mOwnId == *src) @@ -1798,7 +1660,7 @@ int bdNode::determinePosition(bdNodeId *sender, bdNodeId *src, bdNodeId *dest) return pos; } -int bdNode::determineProxyId(bdNodeId *sender, bdNodeId *src, bdNodeId *dest, bdNodeId *proxyId) +int bdConnectManager::determineProxyId(bdNodeId *sender, bdNodeId *src, bdNodeId *dest, bdNodeId *proxyId) { int pos = determinePosition(sender, src, dest); switch(pos) @@ -1819,7 +1681,7 @@ int bdNode::determineProxyId(bdNodeId *sender, bdNodeId *src, bdNodeId *dest, bd -bdConnection *bdNode::findExistingConnectionBySender(bdId *sender, bdId *src, bdId *dest) +bdConnection *bdConnectManager::findExistingConnectionBySender(bdId *sender, bdId *src, bdId *dest) { bdNodeId proxyId; bdNodeId *senderId = &(sender->id); @@ -1830,7 +1692,7 @@ bdConnection *bdNode::findExistingConnectionBySender(bdId *sender, bdId *src, bd return findExistingConnection(srcId, &proxyId, destId); } -bdConnection *bdNode::newConnectionBySender(bdId *sender, bdId *src, bdId *dest) +bdConnection *bdConnectManager::newConnectionBySender(bdId *sender, bdId *src, bdId *dest) { bdNodeId proxyId; bdNodeId *senderId = &(sender->id); @@ -1842,7 +1704,7 @@ bdConnection *bdNode::newConnectionBySender(bdId *sender, bdId *src, bdId *dest) } -int bdNode::cleanConnectionBySender(bdId *sender, bdId *src, bdId *dest) +int bdConnectManager::cleanConnectionBySender(bdId *sender, bdId *src, bdId *dest) { bdNodeId proxyId; bdNodeId *senderId = &(sender->id); @@ -1868,10 +1730,10 @@ int bdNode::cleanConnectionBySender(bdId *sender, bdId *src, bdId *dest) -int bdNode::recvedConnectionRequest(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode) +int bdConnectManager::recvedConnectionRequest(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::recvedConnectionRequest()"; + std::cerr << "bdConnectManager::recvedConnectionRequest()"; std::cerr << std::endl; #endif @@ -1879,17 +1741,15 @@ int bdNode::recvedConnectionRequest(bdId *id, bdId *srcConnAddr, bdId *destConnA { /* MODE not supported */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::recvedConnectionRequest() WARNING Mode Not Supported"; + std::cerr << "bdConnectManager::recvedConnectionRequest() WARNING Mode Not Supported"; std::cerr << std::endl; #endif /* reply existing connection */ - bdToken transId; - genNewTransId(&transId); - int pos = determinePosition(&(id->id), &(srcConnAddr->id), &(destConnAddr->id)); uint32_t status = createConnectionErrorCode(0, BITDHT_CONNECT_ERROR_UNSUPPORTED, pos); + int msgtype = BITDHT_MSG_TYPE_CONNECT_REPLY; - msgout_connect_genmsg(id, &transId, msgtype, srcConnAddr, destConnAddr, mode, status); + mPub->send_connect_msg(id, msgtype, srcConnAddr, destConnAddr, mode, status); return 0; } @@ -1900,16 +1760,14 @@ int bdNode::recvedConnectionRequest(bdId *id, bdId *srcConnAddr, bdId *destConnA { /* ERROR */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::recvedConnectionRequest() ERROR EXISTING CONNECTION"; + std::cerr << "bdConnectManager::recvedConnectionRequest() ERROR EXISTING CONNECTION"; std::cerr << std::endl; #endif /* reply existing connection */ - bdToken transId; - genNewTransId(&transId); - uint32_t status = createConnectionErrorCode(0, BITDHT_CONNECT_ERROR_DUPLICATE, conn->mPoint); + int msgtype = BITDHT_MSG_TYPE_CONNECT_REPLY; - msgout_connect_genmsg(id, &transId, msgtype, srcConnAddr, destConnAddr, mode, status); + mPub->send_connect_msg(id, msgtype, srcConnAddr, destConnAddr, mode, status); return 0; } @@ -1918,27 +1776,26 @@ int bdNode::recvedConnectionRequest(bdId *id, bdId *srcConnAddr, bdId *destConnA /* Switch the order of peers around to test for "opposite connections" */ if (NULL != findSimilarConnection(&(destConnAddr->id), &(srcConnAddr->id))) { - std::cerr << "bdNode::recvedConnectionRequest() WARNING Found Similar Connection. Replying NO"; + std::cerr << "bdConnectManager::recvedConnectionRequest() WARNING Found Similar Connection. Replying NO"; std::cerr << std::endl; /* reply existing connection */ - bdToken transId; - genNewTransId(&transId); int pos = determinePosition(&(id->id), &(srcConnAddr->id), &(destConnAddr->id)); uint32_t status = createConnectionErrorCode(0, BITDHT_CONNECT_ERROR_DUPLICATE, pos); + int msgtype = BITDHT_MSG_TYPE_CONNECT_REPLY; - msgout_connect_genmsg(id, &transId, msgtype, srcConnAddr, destConnAddr, mode, status); + mPub->send_connect_msg(id, msgtype, srcConnAddr, destConnAddr, mode, status); return 0; } /* INSTALL a NEW CONNECTION */ - conn = bdNode::newConnectionBySender(id, srcConnAddr, destConnAddr); + conn = bdConnectManager::newConnectionBySender(id, srcConnAddr, destConnAddr); int point = 0; if (mode == BITDHT_CONNECT_MODE_DIRECT) { #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::recvedConnectionRequest() Installing DIRECT CONNECTION"; + std::cerr << "bdConnectManager::recvedConnectionRequest() Installing DIRECT CONNECTION"; std::cerr << std::endl; #endif @@ -1948,7 +1805,7 @@ int bdNode::recvedConnectionRequest(bdId *id, bdId *srcConnAddr, bdId *destConnA conn->ConnectionRequestDirect(id, srcConnAddr, destConnAddr); #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::recvedConnectionRequest() Connection State:"; + std::cerr << "bdConnectManager::recvedConnectionRequest() Connection State:"; std::cerr << std::endl; std::cerr << *conn; std::cerr << std::endl; @@ -1963,7 +1820,7 @@ int bdNode::recvedConnectionRequest(bdId *id, bdId *srcConnAddr, bdId *destConnA bool areProxy = (srcConnAddr->id == id->id); if (areProxy) { - std::cerr << "bdNode::recvedConnectionRequest() We are MID Point for Proxy / Relay Connection."; + std::cerr << "bdConnectManager::recvedConnectionRequest() We are MID Point for Proxy / Relay Connection."; std::cerr << std::endl; point = BD_PROXY_CONNECTION_MID_POINT; @@ -1972,7 +1829,7 @@ int bdNode::recvedConnectionRequest(bdId *id, bdId *srcConnAddr, bdId *destConnA int numNodes = 10; std::list matchingIds; - std::cerr << "bdNode::recvedConnectionRequest() WARNING searching for \"VERSION\" flag... TO FIX LATER"; + std::cerr << "bdConnectManager::recvedConnectionRequest() WARNING searching for \"VERSION\" flag... TO FIX LATER"; std::cerr << std::endl; uint32_t with_flag = BITDHT_PEER_STATUS_DHT_ENGINE_VERSION; @@ -1981,15 +1838,15 @@ int bdNode::recvedConnectionRequest(bdId *id, bdId *srcConnAddr, bdId *destConnA bool proxyOk = false; bdId destId; - if (mNodeSpace.find_node(&(destConnAddr->id), numNodes, matchingIds, with_flag)) + if (mNodeSpace->find_node(&(destConnAddr->id), numNodes, matchingIds, with_flag)) { - std::cerr << "bdNode::recvedConnectionRequest() Found Suitable Destination Addr"; + std::cerr << "bdConnectManager::recvedConnectionRequest() Found Suitable Destination Addr"; std::cerr << std::endl; if (matchingIds.size() > 1) { /* WARNING multiple matches */ - std::cerr << "bdNode::recvedConnectionRequest() WARNING Found Multiple Matching Destination Addr"; + std::cerr << "bdConnectManager::recvedConnectionRequest() WARNING Found Multiple Matching Destination Addr"; std::cerr << std::endl; } @@ -1999,7 +1856,7 @@ int bdNode::recvedConnectionRequest(bdId *id, bdId *srcConnAddr, bdId *destConnA if (proxyOk) { - std::cerr << "bdNode::recvedConnectionRequest() Proxy Addr Ok: "; + std::cerr << "bdConnectManager::recvedConnectionRequest() Proxy Addr Ok: "; bdStdPrintId(std::cerr, destConnAddr); std::cerr << "asking for AUTH to continue"; std::cerr << std::endl; @@ -2023,26 +1880,23 @@ int bdNode::recvedConnectionRequest(bdId *id, bdId *srcConnAddr, bdId *destConnA else { /* clean up connection... its not going to work */ - std::cerr << "bdNode::recvedConnectionRequest() WARNING No Proxy Addr, Shutting Connect Attempt"; + std::cerr << "bdConnectManager::recvedConnectionRequest() WARNING No Proxy Addr, Shutting Connect Attempt"; std::cerr << std::endl; /* send FAIL message to SRC */ - bdToken transId; - genNewTransId(&transId); - int msgtype = BITDHT_MSG_TYPE_CONNECT_REPLY; uint32_t status = createConnectionErrorCode(0, BITDHT_CONNECT_ERROR_NOADDRESS, point); - msgout_connect_genmsg(id, &transId, msgtype, srcConnAddr, destConnAddr, mode, status); + mPub->send_connect_msg(id, msgtype, srcConnAddr, destConnAddr, mode, status); /* remove connection */ - bdNode::cleanConnectionBySender(id, srcConnAddr, destConnAddr); + bdConnectManager::cleanConnectionBySender(id, srcConnAddr, destConnAddr); } } else { - std::cerr << "bdNode::recvedConnectionRequest() END Proxy/Relay Connection, asking for AUTH to continue"; + std::cerr << "bdConnectManager::recvedConnectionRequest() END Proxy/Relay Connection, asking for AUTH to continue"; std::cerr << std::endl; point = BD_PROXY_CONNECTION_END_POINT; @@ -2064,7 +1918,7 @@ int bdNode::recvedConnectionRequest(bdId *id, bdId *srcConnAddr, bdId *destConnA * */ -int bdNode::recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode, int status) +int bdConnectManager::recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode, int status) { /* retrieve existing connection data */ bdConnection *conn = findExistingConnectionBySender(id, srcConnAddr, destConnAddr); @@ -2072,7 +1926,7 @@ int bdNode::recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAdd { /* ERROR */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::recvedConnectionReply() ERROR NO EXISTING CONNECTION"; + std::cerr << "bdConnectManager::recvedConnectionReply() ERROR NO EXISTING CONNECTION"; std::cerr << std::endl; #endif return 0; @@ -2094,7 +1948,7 @@ int bdNode::recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAdd if ((status != BITDHT_CONNECT_ANSWER_OKAY) && (conn->mPoint == BD_PROXY_CONNECTION_START_POINT)) { /* connection is killed */ - std::cerr << "bdNode::recvedConnectionReply() WARNING Connection Rejected. Error: "; + std::cerr << "bdConnectManager::recvedConnectionReply() WARNING Connection Rejected. Error: "; std::cerr << decodeConnectionError(status); std::cerr << ", Killing It: "; std::cerr << std::endl; @@ -2106,7 +1960,7 @@ int bdNode::recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAdd else { /* ERROR in protocol */ - std::cerr << "bdNode::recvedConnectionReply() ERROR Unexpected Message, Killing It: "; + std::cerr << "bdConnectManager::recvedConnectionReply() ERROR Unexpected Message, Killing It: "; std::cerr << std::endl; std::cerr << *conn; std::cerr << std::endl; @@ -2141,7 +1995,7 @@ int bdNode::recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAdd if ((status == BITDHT_CONNECT_ANSWER_OKAY) && (conn->mState == BITDHT_CONNECTION_WAITING_REPLY)) { /* OK, continue connection! */ - std::cerr << "bdNode::recvedConnectionReply() @MIDPOINT. Reply + State OK, continuing connection"; + std::cerr << "bdConnectManager::recvedConnectionReply() @MIDPOINT. Reply + State OK, continuing connection"; std::cerr << std::endl; /* Upgrade Connection to Finishing Mode */ @@ -2162,7 +2016,7 @@ int bdNode::recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAdd { - std::cerr << "bdNode::recvedConnectionReply() WARNING @MIDPOINT recved Error: "; + std::cerr << "bdConnectManager::recvedConnectionReply() WARNING @MIDPOINT recved Error: "; std::cerr << decodeConnectionError(status); std::cerr << " Killing It: "; std::cerr << std::endl; @@ -2186,11 +2040,8 @@ int bdNode::recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAdd /* send on message to SRC */ - bdToken transId; - genNewTransId(&transId); - int msgtype = BITDHT_MSG_TYPE_CONNECT_REPLY; - msgout_connect_genmsg(&(conn->mSrcId), &transId, msgtype, &(conn->mSrcConnAddr), &(conn->mDestConnAddr), mode, errCode); + mPub->send_connect_msg(&(conn->mSrcId), msgtype, &(conn->mSrcConnAddr), &(conn->mDestConnAddr), mode, errCode); /* connection is killed */ cleanConnectionBySender(id, srcConnAddr, destConnAddr); @@ -2210,9 +2061,9 @@ int bdNode::recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAdd * Acks are set, and connections completed if possible (including callback!). */ -int bdNode::recvedConnectionStart(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode, int bandwidth) +int bdConnectManager::recvedConnectionStart(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode, int bandwidth) { - std::cerr << "bdNode::recvedConnectionStart()"; + std::cerr << "bdConnectManager::recvedConnectionStart()"; std::cerr << std::endl; /* retrieve existing connection data */ @@ -2221,7 +2072,7 @@ int bdNode::recvedConnectionStart(bdId *id, bdId *srcConnAddr, bdId *destConnAdd { /* ERROR */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::recvedConnectionStart() ERROR NO EXISTING CONNECTION"; + std::cerr << "bdConnectManager::recvedConnectionStart() ERROR NO EXISTING CONNECTION"; std::cerr << std::endl; #endif return 0; @@ -2230,7 +2081,7 @@ int bdNode::recvedConnectionStart(bdId *id, bdId *srcConnAddr, bdId *destConnAdd if (conn->mPoint == BD_PROXY_CONNECTION_MID_POINT) { - std::cerr << "bdNode::recvedConnectionStart() ERROR We Are Connection MID Point"; + std::cerr << "bdConnectManager::recvedConnectionStart() ERROR We Are Connection MID Point"; std::cerr << std::endl; /* ERROR */ } @@ -2239,34 +2090,31 @@ int bdNode::recvedConnectionStart(bdId *id, bdId *srcConnAddr, bdId *destConnAdd if ((conn->mState != BITDHT_CONNECTION_WAITING_START) && (conn->mState != BITDHT_CONNECTION_COMPLETED)) { /* ERROR */ - std::cerr << "bdNode::recvedConnectionStart() ERROR State != WAITING_START && != COMPLETED"; + std::cerr << "bdConnectManager::recvedConnectionStart() ERROR State != WAITING_START && != COMPLETED"; std::cerr << std::endl; return 0; } /* ALL Okay, Send ACK */ - std::cerr << "bdNode::recvedConnectionStart() Passed basic tests, Okay to send ACK"; + std::cerr << "bdConnectManager::recvedConnectionStart() Passed basic tests, Okay to send ACK"; std::cerr << std::endl; - bdToken transId; - genNewTransId(&transId); - int msgtype = BITDHT_MSG_TYPE_CONNECT_ACK; int status = BITDHT_CONNECT_ANSWER_OKAY; - msgout_connect_genmsg(id, &transId, msgtype, &(conn->mSrcId), &(conn->mDestId), mode, status); + mPub->send_connect_msg(id, msgtype, &(conn->mSrcId), &(conn->mDestId), mode, status); /* do complete Callback */ /* flag as completed */ if (conn->mState != BITDHT_CONNECTION_COMPLETED) { - std::cerr << "bdNode::recvedConnectionStart() Switching State to COMPLETED, doing callback"; + std::cerr << "bdConnectManager::recvedConnectionStart() Switching State to COMPLETED, doing callback"; std::cerr << std::endl; conn->CompleteConnection(id, srcConnAddr, destConnAddr); - std::cerr << "bdNode::recvedConnectionStart() Connection State: "; + std::cerr << "bdConnectManager::recvedConnectionStart() Connection State: "; std::cerr << *conn; std::cerr << std::endl; @@ -2290,7 +2138,7 @@ int bdNode::recvedConnectionStart(bdId *id, bdId *srcConnAddr, bdId *destConnAdd } else { - std::cerr << "bdNode::recvedConnectionStart() Just sent duplicate ACK"; + std::cerr << "bdConnectManager::recvedConnectionStart() Just sent duplicate ACK"; std::cerr << std::endl; } /* don't delete, if ACK is lost, we want to be able to re-respond */ @@ -2306,7 +2154,7 @@ int bdNode::recvedConnectionStart(bdId *id, bdId *srcConnAddr, bdId *destConnAdd * Acks are set, and connections completed if possible (including callback!). */ -int bdNode::recvedConnectionAck(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode) +int bdConnectManager::recvedConnectionAck(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode) { /* retrieve existing connection data */ bdConnection *conn = findExistingConnectionBySender(id, srcConnAddr, destConnAddr); @@ -2314,7 +2162,7 @@ int bdNode::recvedConnectionAck(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, { /* ERROR */ #ifdef DEBUG_NODE_CONNECTION - std::cerr << "bdNode::recvedConnectionAck() ERROR NO EXISTING CONNECTION"; + std::cerr << "bdConnectManager::recvedConnectionAck() ERROR NO EXISTING CONNECTION"; std::cerr << std::endl; #endif return 0; @@ -2323,7 +2171,7 @@ int bdNode::recvedConnectionAck(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, if (conn->mPoint == BD_PROXY_CONNECTION_START_POINT) { /* ERROR */ - std::cerr << "bdNode::recvedConnectionAck() ERROR ACK received at START POINT"; + std::cerr << "bdConnectManager::recvedConnectionAck() ERROR ACK received at START POINT"; std::cerr << std::endl; return 0; @@ -2333,7 +2181,7 @@ int bdNode::recvedConnectionAck(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, if (conn->mState != BITDHT_CONNECTION_WAITING_ACK) { /* ERROR */ - std::cerr << "bdNode::recvedConnectionAck() conn->mState != WAITING_ACK, actual State: " << conn->mState; + std::cerr << "bdConnectManager::recvedConnectionAck() conn->mState != WAITING_ACK, actual State: " << conn->mState; std::cerr << std::endl; return 0; @@ -2341,7 +2189,7 @@ int bdNode::recvedConnectionAck(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, if (id->id == srcConnAddr->id) { - std::cerr << "bdNode::recvedConnectionAck() from Src, marking So"; + std::cerr << "bdConnectManager::recvedConnectionAck() from Src, marking So"; std::cerr << std::endl; /* recved Ack from source */ @@ -2349,7 +2197,7 @@ int bdNode::recvedConnectionAck(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, } else if (id->id == destConnAddr->id) { - std::cerr << "bdNode::recvedConnectionAck() from Dest, marking So"; + std::cerr << "bdConnectManager::recvedConnectionAck() from Dest, marking So"; std::cerr << std::endl; /* recved Ack from dest */ conn->mDestAck = true; @@ -2357,7 +2205,7 @@ int bdNode::recvedConnectionAck(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, if (conn->mSrcAck && conn->mDestAck) { - std::cerr << "bdNode::recvedConnectionAck() ACKs from Both Src & Dest, Connection Complete: callback & cleanup"; + std::cerr << "bdConnectManager::recvedConnectionAck() ACKs from Both Src & Dest, Connection Complete: callback & cleanup"; std::cerr << std::endl; /* connection complete! cleanup */ @@ -2682,7 +2530,7 @@ int bdConnection::checkForDefaultConnectAddress() if (mSrcConnAddr.addr.sin_addr.s_addr == 0) { - std::cerr << "bdNode::checkForDefaultConnectAddress() SrcConnAddr.addr is BLANK, installing Dht Node Address"; + std::cerr << "bdConnectManager::checkForDefaultConnectAddress() SrcConnAddr.addr is BLANK, installing Dht Node Address"; std::cerr << std::endl; mSrcConnAddr.addr = mSrcId.addr; @@ -2690,7 +2538,7 @@ int bdConnection::checkForDefaultConnectAddress() if (mDestConnAddr.addr.sin_addr.s_addr == 0) { - std::cerr << "bdNode::checkForDefaultConnectAddress() DestConnAddr.addr is BLANK, installing Dht Node Address"; + std::cerr << "bdConnectManager::checkForDefaultConnectAddress() DestConnAddr.addr is BLANK, installing Dht Node Address"; std::cerr << std::endl; mDestConnAddr.addr = mDestId.addr; diff --git a/libbitdht/src/bitdht/bdconnection.h b/libbitdht/src/bitdht/bdconnection.h index 947a9ba25..3e3f1cbc3 100644 --- a/libbitdht/src/bitdht/bdconnection.h +++ b/libbitdht/src/bitdht/bdconnection.h @@ -29,6 +29,8 @@ #include "bitdht/bdiface.h" +class bdQueryManager; +class bdNodePublisher; /************************************************************************************************************ ************************************** ProxyTuple + Connection State **************************************** @@ -167,5 +169,106 @@ class bdConnectionRequest std::ostream &operator<<(std::ostream &out, const bdConnectionRequest &req); std::ostream &operator<<(std::ostream &out, const bdConnection &conn); -#endif +/********* + * The Connection Management Class. + * this encapsulates all of the functionality.. + * except for a couple of message in/outs + callback. + */ + +class bdConnectManager +{ + public: + + bdConnectManager(bdNodeId *ownid, bdSpace *space, bdQueryManager *qmgr, bdDhtFunctions *fns, bdNodePublisher *pub); + + + /* connection functions */ + void requestConnection(bdNodeId *id, uint32_t modes); + void allowConnection(bdNodeId *id, uint32_t modes); + + + /* high level */ + + void shutdownConnections(); + void printConnections(); + + /* Connections: Configuration */ + void defaultConnectionOptions(); + virtual void setConnectionOptions(uint32_t allowedModes, uint32_t flags); + + /* Connections: Initiation */ + + int requestConnection(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode, uint32_t start); + int requestConnection_direct(struct sockaddr_in *laddr, bdNodeId *target); + int requestConnection_proxy(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode); + + int killConnectionRequest(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode); + + int checkExistingConnectionAttempt(bdNodeId *target); + void addPotentialConnectionProxy(const bdId *srcId, const bdId *target); + void updatePotentialConnectionProxy(const bdId *id, uint32_t mode); + + int checkPeerForFlag(const bdId *id, uint32_t with_flag); + + int tickConnections(); + void iterateConnectionRequests(); + int startConnectionAttempt(bdConnectionRequest *req); + + // internal Callback -> normally continues to callbackConnect(). + void callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, + int mode, int point, int cbtype, int errcode); + + /* Connections: Outgoing */ + + int startConnectionAttempt(bdId *proxyId, bdId *srcConnAddr, bdId *destConnAddr, int mode); + void AuthConnectionOk(bdId *srcId, bdId *proxyId, bdId *destId, int mode, int loc); + void AuthConnectionNo(bdId *srcId, bdId *proxyId, bdId *destId, int mode, int loc, int errcode); + void iterateConnections(); + + + /* Connections: Utility State */ + + bdConnection *findExistingConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId); + bdConnection *newConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId); + int cleanConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId); + + int determinePosition(bdNodeId *sender, bdNodeId *src, bdNodeId *dest); + int determineProxyId(bdNodeId *sender, bdNodeId *src, bdNodeId *dest, bdNodeId *proxyId); + + bdConnection *findSimilarConnection(bdNodeId *srcId, bdNodeId *destId); + bdConnection *findExistingConnectionBySender(bdId *sender, bdId *src, bdId *dest); + bdConnection *newConnectionBySender(bdId *sender, bdId *src, bdId *dest); + int cleanConnectionBySender(bdId *sender, bdId *src, bdId *dest); + + // Overloaded Generalised Connection Callback. + virtual void callbackConnect(bdId *srcId, bdId *proxyId, bdId *destId, + int mode, int point, int cbtype, int errcode); + + /* Connections: */ + int recvedConnectionRequest(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode); + int recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode, int status); + int recvedConnectionStart(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode, int bandwidth); + int recvedConnectionAck(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode); + + private: + + std::map mConnections; + std::map mConnectionRequests; + + uint32_t mConfigAllowedModes; + bool mConfigAutoProxy; + + /****************************** Connection Code (in bdconnection.cc) ****************************/ + + private: + + bdNodeId mOwnId; + bdSpace *mNodeSpace; + bdQueryManager *mQueryMgr; + bdDhtFunctions *mFns; + bdNodePublisher *mPub; +}; + + +#endif // BITDHT_CONNECTION_H diff --git a/libbitdht/src/bitdht/bdfilter.cc b/libbitdht/src/bitdht/bdfilter.cc index 1e7b57019..1cd595cce 100644 --- a/libbitdht/src/bitdht/bdfilter.cc +++ b/libbitdht/src/bitdht/bdfilter.cc @@ -60,6 +60,15 @@ bool bdFilter::filtered(std::list &answer) return (answer.size() > 0); } +bool bdFilter::filteredIPs(std::list &answer) +{ + std::list::iterator it; + for(it = mFiltered.begin(); it != mFiltered.end(); it++) + { + answer.push_back(it->mAddr); + } + return (answer.size() > 0); +} int bdFilter::checkPeer(const bdId *id, uint32_t mode) { @@ -111,11 +120,30 @@ int bdFilter::addPeerToFilter(const bdId *id, uint32_t flags) fp.mLastSeen = now; mFiltered.push_back(fp); - } - return found; + uint32_t saddr = id->addr.sin_addr.s_addr; + mIpsBanned.insert(saddr); + + std::cerr << "Adding New Banned Ip Address: " << inet_ntoa(id->addr.sin_addr); + std::cerr << std::endl; + + return true; + } + return false; } +/* fast check if the addr is in the structure */ +int bdFilter::addrOkay(struct sockaddr_in *addr) +{ + std::set::const_iterator it = mIpsBanned.find(addr->sin_addr.s_addr); + if (it == mIpsBanned.end()) + { + return 1; // Address is Okay! + } + std::cerr << "Detected Packet From Banned Ip Address: " << inet_ntoa(addr->sin_addr); + std::cerr << std::endl; + return 0; +} bool bdFilter::isOwnIdWithoutBitDhtFlags(const bdId *id, uint32_t peerFlags) diff --git a/libbitdht/src/bitdht/bdfilter.h b/libbitdht/src/bitdht/bdfilter.h index fcd414882..b18f64ad7 100644 --- a/libbitdht/src/bitdht/bdfilter.h +++ b/libbitdht/src/bitdht/bdfilter.h @@ -32,6 +32,7 @@ #include "bitdht/bdiface.h" +#include /* Query result flags are in bdiface.h */ @@ -54,8 +55,12 @@ class bdFilter // get the answer. bool filtered(std::list &answer); +bool filteredIPs(std::list &answer); + int checkPeer(const bdId *id, uint32_t peerFlags); +int addrOkay(struct sockaddr_in *addr); + private: int addPeerToFilter(const bdId *id, uint32_t flags); @@ -67,6 +72,9 @@ bool isOwnIdWithoutBitDhtFlags(const bdId *id, uint32_t peerFlags); std::list mFiltered; bdDhtFunctions *mFns; + + // = addr.sin_addr.s_addr (uint32_t) stored in network order. + std::set mIpsBanned; }; diff --git a/libbitdht/src/bitdht/bdiface.h b/libbitdht/src/bitdht/bdiface.h index 56a8e5e9d..fca4f62f7 100644 --- a/libbitdht/src/bitdht/bdiface.h +++ b/libbitdht/src/bitdht/bdiface.h @@ -95,8 +95,8 @@ virtual int bdDistance(const bdNodeId *n1, const bdNodeId *n2, bdMetric *metric) virtual int bdBucketDistance(const bdNodeId *n1, const bdNodeId *n2) = 0; virtual int bdBucketDistance(const bdMetric *metric) = 0; -virtual uint32_t bdSimilarId(const bdId *id1, const bdId *id2) = 0; -virtual void bdUpdateSimilarId(bdId *dest, const bdId *src) = 0; +virtual bool bdSimilarId(const bdId *id1, const bdId *id2) = 0; +virtual bool bdUpdateSimilarId(bdId *dest, const bdId *src) = 0; virtual void bdRandomMidId(const bdNodeId *target, const bdNodeId *other, bdNodeId *mid) = 0; @@ -107,11 +107,15 @@ virtual void bdPrintNodeId(std::ostream &out, const bdNodeId *a) = 0; +/* NODE OPTIONS */ +#define BITDHT_OPTIONS_MAINTAIN_UNSTABLE_PORT 0x00000001 + /* peer flags * order is important! * higher bits = more priority. + * BITDHT_PEER_STATUS_RECVPING * BITDHT_PEER_STATUS_RECVPONG * BITDHT_PEER_STATUS_RECVNODES * BITDHT_PEER_STATUS_RECVHASHES @@ -125,10 +129,11 @@ virtual void bdPrintNodeId(std::ostream &out, const bdNodeId *a) = 0; #define BITDHT_PEER_STATUS_MASK_DHT 0x0000ff00 #define BITDHT_PEER_STATUS_MASK_KNOWN 0x00ff0000 -#define BITDHT_PEER_STATUS_RECV_PONG 0x00000001 -#define BITDHT_PEER_STATUS_RECV_NODES 0x00000002 -#define BITDHT_PEER_STATUS_RECV_HASHES 0x00000004 -#define BITDHT_PEER_STATUS_RECV_CONNECT_MSG 0x00000008 +#define BITDHT_PEER_STATUS_RECV_PING 0x00000001 +#define BITDHT_PEER_STATUS_RECV_PONG 0x00000002 +#define BITDHT_PEER_STATUS_RECV_NODES 0x00000004 +#define BITDHT_PEER_STATUS_RECV_HASHES 0x00000008 +#define BITDHT_PEER_STATUS_RECV_CONNECT_MSG 0x00000010 #define BITDHT_PEER_STATUS_DHT_ENGINE 0x00000100 #define BITDHT_PEER_STATUS_DHT_ENGINE_VERSION 0x00000200 @@ -140,6 +145,15 @@ virtual void bdPrintNodeId(std::ostream &out, const bdNodeId *a) = 0; #define BITDHT_PEER_STATUS_DHT_FRIEND 0x00040000 +// EXTRA FLAGS are our internal thoughts about the peer. +#define BITDHT_PEER_EXFLAG_MASK_BASIC 0x000000ff +#define BITDHT_PEER_EXFLAG_UNSTABLE 0x00000001 // Port changes. +#define BITDHT_PEER_EXFLAG_ATTACHED 0x00000002 // We will ping in heavily. (if unstable) + + + + + #define BITDHT_CONNECT_MODE_DIRECT 0x00000001 #define BITDHT_CONNECT_MODE_PROXY 0x00000002 @@ -195,11 +209,15 @@ virtual void bdPrintNodeId(std::ostream &out, const bdNodeId *a) = 0; class bdPeer { public: + bdPeer():mPeerFlags(0), mLastSendTime(0), mLastRecvTime(0), mFoundTime(0), mExtraFlags(0) { return; } + bdId mPeerId; uint32_t mPeerFlags; time_t mLastSendTime; time_t mLastRecvTime; time_t mFoundTime; /* time stamp that peer was found */ + + uint32_t mExtraFlags; }; class bdBucket diff --git a/libbitdht/src/bitdht/bdmanager.cc b/libbitdht/src/bitdht/bdmanager.cc index d3f30102b..36a39b434 100644 --- a/libbitdht/src/bitdht/bdmanager.cc +++ b/libbitdht/src/bitdht/bdmanager.cc @@ -42,6 +42,8 @@ #include "bitdht/bdmanager.h" #include "bitdht/bdmsgs.h" #include "bitdht/bencode.h" +#include "bitdht/bdquerymgr.h" + #include #include @@ -72,7 +74,6 @@ bdNodeManager::bdNodeManager(bdNodeId *id, std::string dhtVersion, std::string b mNetworkSize = 0; mBdNetworkSize = 0; - /* setup a query for self */ #ifdef DEBUG_MGR std::cerr << "bdNodeManager::bdNodeManager() ID: "; mFns->bdPrintNodeId(std::cerr, id); @@ -190,7 +191,7 @@ void bdNodeManager::startQueries() it->second.mStatus = BITDHT_QUERY_QUERYING; uint32_t qflags = it->second.mQFlags | BITDHT_QFLAGS_DISGUISE; - addQuery(&(it->first), qflags); + mQueryMgr->addQuery(&(it->first), qflags); // add all queries at the same time! //return; @@ -215,7 +216,7 @@ void bdNodeManager::removeFindNode(bdNodeId *id) } /* cleanup any actions */ - clearQuery(&(it->first)); + mQueryMgr->clearQuery(&(it->first)); //clearPing(&(it->first)); /* remove from map */ @@ -250,7 +251,7 @@ void bdNodeManager::iteration() #endif bdNodeId id; getOwnId(&id); - addQuery(&id, BITDHT_QFLAGS_DO_IDLE | BITDHT_QFLAGS_DISGUISE); + mQueryMgr->addQuery(&id, BITDHT_QFLAGS_DO_IDLE | BITDHT_QFLAGS_DISGUISE); mMode = BITDHT_MGR_STATE_FINDSELF; mModeTS = now; @@ -407,24 +408,22 @@ void bdNodeManager::QueryRandomLocalNet() /* do standard find_peer message */ - bdToken transId; - genNewTransId(&transId); - msgout_find_node(&id, &transId, &targetNodeId); + send_query(&id, &targetNodeId); -//#ifdef DEBUG_NODE_MSGS +#ifdef DEBUG_NODE_MSGS std::cerr << "bdNodeManager::QueryRandomLocalNet() Querying : "; mFns->bdPrintId(std::cerr, &id); std::cerr << " searching for : "; mFns->bdPrintNodeId(std::cerr, &targetNodeId); std::cerr << std::endl; -//#endif +#endif } else { -//#ifdef DEBUG_NODE_MSGS +#ifdef DEBUG_NODE_MSGS std::cerr << "bdNodeManager::QueryRandomLocalNet() No LocalNet Peer Found"; std::cerr << std::endl; -//#endif +#endif } } @@ -464,7 +463,7 @@ int bdNodeManager::checkStatus() std::map queryStatus; - QueryStatus(queryStatus); + mQueryMgr->QueryStatus(queryStatus); for(it = queryStatus.begin(); it != queryStatus.end(); it++) { @@ -561,7 +560,7 @@ int bdNodeManager::checkStatus() mFns->bdPrintNodeId(std::cerr, &(it->first)); std::cerr << std::endl; #endif - clearQuery(&(it->first)); + mQueryMgr->clearQuery(&(it->first)); } /* FIND in activePeers */ @@ -810,13 +809,13 @@ int bdNodeManager::getDhtBucket(const int idx, bdBucket &bucket) int bdNodeManager::getDhtQueries(std::map &queries) { - bdNode::QueryStatus(queries); + mQueryMgr->QueryStatus(queries); return 1; } int bdNodeManager::getDhtQueryStatus(const bdNodeId *id, bdQuerySummary &query) { - return bdNode::QuerySummary(id, query); + return mQueryMgr->QuerySummary(id, query); } @@ -1071,7 +1070,7 @@ void bdNodeManager::ConnectionRequest(struct sockaddr_in *laddr, bdNodeId *targe std::cerr << "bdNodeManager::ConnectionRequest()"; std::cerr << std::endl; - bdNode::requestConnection(laddr, target, mode, start); + mConnMgr->requestConnection(laddr, target, mode, start); } void bdNodeManager::ConnectionAuth(bdId *srcId, bdId *proxyId, bdId *destId, uint32_t mode, uint32_t loc, uint32_t answer) @@ -1081,17 +1080,17 @@ void bdNodeManager::ConnectionAuth(bdId *srcId, bdId *proxyId, bdId *destId, uin if (answer == BITDHT_CONNECT_ANSWER_OKAY) { - AuthConnectionOk(srcId, proxyId, destId, mode, loc); + mConnMgr->AuthConnectionOk(srcId, proxyId, destId, mode, loc); } else { - AuthConnectionNo(srcId, proxyId, destId, mode, loc, answer); + mConnMgr->AuthConnectionNo(srcId, proxyId, destId, mode, loc, answer); } } void bdNodeManager::ConnectionOptions(uint32_t allowedModes, uint32_t flags) { - bdNode::setConnectionOptions(allowedModes, flags); + mConnMgr->setConnectionOptions(allowedModes, flags); } diff --git a/libbitdht/src/bitdht/bdnode.cc b/libbitdht/src/bitdht/bdnode.cc index 6366cf204..a1a610a45 100644 --- a/libbitdht/src/bitdht/bdnode.cc +++ b/libbitdht/src/bitdht/bdnode.cc @@ -28,9 +28,13 @@ #include "bitdht/bencode.h" #include "bitdht/bdmsgs.h" +#include "bitdht/bdquerymgr.h" +#include "bitdht/bdfilter.h" + #include "util/bdnet.h" #include "util/bdrandom.h" + #include #include @@ -60,12 +64,40 @@ bdNode::bdNode(bdNodeId *ownId, std::string dhtVersion, std::string bootfile, bdDhtFunctions *fns) - :mOwnId(*ownId), mNodeSpace(ownId, fns), mStore(bootfile, fns), mDhtVersion(dhtVersion), mFns(fns) + :mOwnId(*ownId), mNodeSpace(ownId, fns), mStore(bootfile, fns), mDhtVersion(dhtVersion), mFns(fns), + mQueryMgr(NULL), mConnMgr(NULL), mFilterPeers(NULL) { - resetStats(); - defaultConnectionOptions(); + + init(); /* (uses this pointers) stuff it - do it here! */ } +void bdNode::init() +{ + mQueryMgr = new bdQueryManager(&mNodeSpace, mFns, this); + mConnMgr = new bdConnectManager(&mOwnId, &mNodeSpace, mQueryMgr, mFns, this); + + std::list emptyList; + mFilterPeers = new bdFilter(&mOwnId, emptyList, BITDHT_FILTER_REASON_OWNID, mFns); + + setNodeOptions(BITDHT_OPTIONS_MAINTAIN_UNSTABLE_PORT); + +} + +#define ATTACH_NUMBER 10 +void bdNode::setNodeOptions(uint32_t optFlags) +{ + mNodeOptionFlags = optFlags; + if (optFlags & BITDHT_OPTIONS_MAINTAIN_UNSTABLE_PORT) + { + mNodeSpace.setAttachedFlag(BITDHT_PEER_STATUS_DHT_ENGINE, ATTACH_NUMBER); + } + else + { + mNodeSpace.setAttachedFlag(BITDHT_PEER_STATUS_DHT_ENGINE, 0); + } +} + + void bdNode::getOwnId(bdNodeId *id) { *id = mOwnId; @@ -74,7 +106,7 @@ void bdNode::getOwnId(bdNodeId *id) /***** Startup / Shutdown ******/ void bdNode::restartNode() { - resetStats(); + mAccount.resetStats(); mStore.reloadFromStore(); @@ -90,7 +122,9 @@ void bdNode::restartNode() void bdNode::shutdownNode() { /* clear the queries */ - mLocalQueries.clear(); + mQueryMgr->shutdownQueries(); + mConnMgr->shutdownConnections(); + mRemoteQueries.clear(); /* clear the space */ @@ -127,32 +161,16 @@ void bdNode::printState() mNodeSpace.printDHT(); - printQueries(); + mQueryMgr->printQueries(); + mConnMgr->printConnections(); #ifdef USE_HISTORY mHistory.printMsgs(); #endif - printStats(std::cerr); + mAccount.printStats(std::cerr); } -void bdNode::printQueries() -{ - std::cerr << "bdNode::printQueries() for Peer: "; - mFns->bdPrintNodeId(std::cerr, &mOwnId); - std::cerr << std::endl; - - int i = 0; - std::list::iterator it; - for(it = mLocalQueries.begin(); it != mLocalQueries.end(); it++, i++) - { - fprintf(stderr, "Query #%d:\n", i); - (*it)->printQuery(); - fprintf(stderr, "\n"); - } -} - - void bdNode::iterationOff() { /* clean up any incoming messages */ @@ -244,18 +262,6 @@ void bdNode::iteration() int sentMsgs = 0; int sentPings = 0; -#if 0 - int ilim = mLocalQueries.size() * 15; - if (ilim < 20) - { - ilim = 20; - } - if (ilim > 500) - { - ilim = 500; - } -#endif - while((mPotentialPeers.size() > 0) && (sentMsgs < allowedPings)) { /* check history ... is we have pinged them already... @@ -285,12 +291,7 @@ void bdNode::iteration() /**** TEMP ****/ { - - - bdToken transId; - genNewTransId(&transId); - //registerOutgoingMsg(&pid, &transId, BITDHT_MSG_TYPE_PING); - msgout_ping(&pid, &transId); + send_ping(&pid); sentMsgs++; sentPings++; @@ -301,82 +302,62 @@ void bdNode::iteration() std::cerr << std::endl; #endif - mCounterPings++; } } /* allow each query to send up to one query... until maxMsgs has been reached */ - int numQueries = mLocalQueries.size(); - int sentQueries = 0; - int i = 0; - while((i < numQueries) && (sentMsgs < maxMsgs)) - { - bdQuery *query = mLocalQueries.front(); - mLocalQueries.pop_front(); - mLocalQueries.push_back(query); - - /* go through the possible queries */ - if (query->nextQuery(id, targetNodeId)) - { -#ifdef DEBUG_NODE_MSGS - std::cerr << "bdNode::iteration() send_query("; - mFns->bdPrintId(std::cerr, &id); - std::cerr << ","; - mFns->bdPrintNodeId(std::cerr, &targetNodeId); - std::cerr << ")"; - std::cerr << std::endl; -#endif - send_query(&id, &targetNodeId); - sentMsgs++; - sentQueries++; - } - i++; - } + int sentQueries = mQueryMgr->iterateQueries(maxMsgs-sentMsgs); + sentMsgs += sentQueries; #ifdef DEBUG_NODE_ACTIONS std::cerr << "bdNode::iteration() maxMsgs: " << maxMsgs << " sentPings: " << sentPings; std::cerr << " / " << allowedPings; std::cerr << " sentQueries: " << sentQueries; - std::cerr << " / " << numQueries; std::cerr << std::endl; #endif /* process remote query too */ processRemoteQuery(); - while(mNodeSpace.out_of_date_peer(id)) + std::list peerIds; + std::list::iterator oit; + mNodeSpace.scanOutOfDatePeers(peerIds); + + for(oit = peerIds.begin(); oit != peerIds.end(); oit++) { - /* push out ping */ - bdToken transId; - genNewTransId(&transId); - //registerOutgoingMsg(&id, &transId, BITDHT_MSG_TYPE_PING); - msgout_ping(&id, &transId); + send_ping(&(*oit)); + mAccount.incCounter(BDACCOUNT_MSG_OUTOFDATEPING, true); #ifdef DEBUG_NODE_MSGS std::cerr << "bdNode::iteration() Pinging Out-Of-Date Peer: "; - mFns->bdPrintId(std::cerr, &id); + mFns->bdPrintId(std::cerr, *oit); std::cerr << std::endl; #endif - - mCounterOutOfDatePing++; - - //registerOutgoingMsg(&id, &transId, BITDHT_MSG_TYPE_FIND_NODE); - //msgout_find_node(&id, &transId, &(id.id)); } - // Handle Connection loops. - tickConnections(); + mConnMgr->tickConnections(); - - doStats(); - - //printStats(std::cerr); - - //printQueries(); + mAccount.doStats(); } + + +/*************************************************************************************** + *************************************************************************************** + ***************************************************************************************/ + +void bdNode::send_ping(bdId *id) +{ + bdToken transId; + genNewTransId(&transId); + //registerOutgoingMsg(&id, &transId, BITDHT_MSG_TYPE_PING); + + msgout_ping(id, &transId); +} + + void bdNode::send_query(bdId *id, bdNodeId *targetNodeId) { /* push out query */ @@ -393,168 +374,32 @@ void bdNode::send_query(bdId *id, bdNodeId *targetNodeId) mFns->bdPrintNodeId(std::cerr, &targetNodeId); std::cerr << std::endl; #endif - mCounterQueryNode++; } -#define LPF_FACTOR (0.90) - -void bdNode::doStats() +void bdNode::send_connect_msg(bdId *id, int msgtype, bdId *srcAddr, bdId *destAddr, int mode, int status) { - mLpfOutOfDatePing *= (LPF_FACTOR) ; - mLpfOutOfDatePing += (1.0 - LPF_FACTOR) * mCounterOutOfDatePing; - mLpfPings *= (LPF_FACTOR); - mLpfPings += (1.0 - LPF_FACTOR) * mCounterPings; - mLpfPongs *= (LPF_FACTOR); - mLpfPongs += (1.0 - LPF_FACTOR) * mCounterPongs; - mLpfQueryNode *= (LPF_FACTOR); - mLpfQueryNode += (1.0 - LPF_FACTOR) * mCounterQueryNode; - mLpfQueryHash *= (LPF_FACTOR); - mLpfQueryHash += (1.0 - LPF_FACTOR) * mCounterQueryHash; - mLpfReplyFindNode *= (LPF_FACTOR); - mLpfReplyFindNode += (1.0 - LPF_FACTOR) * mCounterReplyFindNode; - mLpfReplyQueryHash *= (LPF_FACTOR); - mLpfReplyQueryHash += (1.0 - LPF_FACTOR) * mCounterReplyQueryHash; + /* push out query */ + bdToken transId; + genNewTransId(&transId); + //registerOutgoingMsg(&id, &transId, BITDHT_MSG_TYPE_FIND_NODE); - mLpfRecvPing *= (LPF_FACTOR); - mLpfRecvPing += (1.0 - LPF_FACTOR) * mCounterRecvPing; - mLpfRecvPong *= (LPF_FACTOR); - mLpfRecvPong += (1.0 - LPF_FACTOR) * mCounterRecvPong; - mLpfRecvQueryNode *= (LPF_FACTOR); - mLpfRecvQueryNode += (1.0 - LPF_FACTOR) * mCounterRecvQueryNode; - mLpfRecvQueryHash *= (LPF_FACTOR); - mLpfRecvQueryHash += (1.0 - LPF_FACTOR) * mCounterRecvQueryHash; - mLpfRecvReplyFindNode *= (LPF_FACTOR); - mLpfRecvReplyFindNode += (1.0 - LPF_FACTOR) * mCounterRecvReplyFindNode; - mLpfRecvReplyQueryHash *= (LPF_FACTOR); - mLpfRecvReplyQueryHash += (1.0 - LPF_FACTOR) * mCounterRecvReplyQueryHash; + msgout_connect_genmsg(id, &transId, msgtype, srcAddr, destAddr, mode, status); - // connection stats. - mLpfConnectRequest *= (LPF_FACTOR); - mLpfConnectRequest += (1.0 - LPF_FACTOR) * mCounterConnectRequest; - mLpfConnectReply *= (LPF_FACTOR); - mLpfConnectReply += (1.0 - LPF_FACTOR) * mCounterConnectReply; - mLpfConnectStart *= (LPF_FACTOR); - mLpfConnectStart += (1.0 - LPF_FACTOR) * mCounterConnectStart; - mLpfConnectAck *= (LPF_FACTOR); - mLpfConnectAck += (1.0 - LPF_FACTOR) * mCounterConnectAck; - - mLpfRecvConnectRequest *= (LPF_FACTOR); - mLpfRecvConnectRequest += (1.0 - LPF_FACTOR) * mCounterRecvConnectRequest; - mLpfRecvConnectReply *= (LPF_FACTOR); - mLpfRecvConnectReply += (1.0 - LPF_FACTOR) * mCounterRecvConnectReply; - mLpfRecvConnectStart *= (LPF_FACTOR); - mLpfRecvConnectStart += (1.0 - LPF_FACTOR) * mCounterRecvConnectStart; - mLpfRecvConnectAck *= (LPF_FACTOR); - mLpfRecvConnectAck += (1.0 - LPF_FACTOR) * mCounterRecvConnectAck; - - resetCounters(); +#ifdef DEBUG_NODE_MSGS + std::cerr << "bdNode::send_connect_msg() to: "; + mFns->bdPrintId(std::cerr, &id); + std::cerr << std::endl; +#endif } -void bdNode::printStats(std::ostream &out) -{ - out << "bdNode::printStats()" << std::endl; - out << " Send Recv: "; - out << std::endl; - out << " mLpfOutOfDatePing : " << std::setw(10) << mLpfOutOfDatePing; - out << std::endl; - out << " mLpfPings : " << std::setw(10) << mLpfPings; - out << " mLpfRecvPongs : " << std::setw(10) << mLpfRecvPong; - out << std::endl; - out << " mLpfPongs : " << std::setw(10) << mLpfPongs; - out << " mLpfRecvPings : " << std::setw(10) << mLpfRecvPing; - out << std::endl; - out << " mLpfQueryNode : " << std::setw(10) << mLpfQueryNode; - out << " mLpfRecvReplyFindNode : " << std::setw(10) << mLpfRecvReplyFindNode; - out << std::endl; - out << " mLpfQueryHash : " << std::setw(10) << mLpfQueryHash; - out << " mLpfRecvReplyQueryHash : " << std::setw(10) << mLpfRecvReplyQueryHash; - out << std::endl; - out << " mLpfReplyFindNode : " << std::setw(10) << mLpfReplyFindNode; - out << " mLpfRecvQueryNode : " << std::setw(10) << mLpfRecvQueryNode; - out << std::endl; - out << " mLpfReplyQueryHash/sec : " << std::setw(10) << mLpfReplyQueryHash; - out << " mLpfRecvQueryHash/sec : " << std::setw(10) << mLpfRecvQueryHash; - out << std::endl; - out << std::endl; - out << " mLpfConnectRequest/sec : " << std::setw(10) << mLpfConnectRequest; - out << " mLpfRecvConnectReq/sec : " << std::setw(10) << mLpfRecvConnectRequest; - out << std::endl; - out << " mLpfConnectReply/sec : " << std::setw(10) << mLpfConnectReply; - out << " mLpfRecvConnReply/sec : " << std::setw(10) << mLpfRecvConnectReply; - out << std::endl; - out << " mLpfConnectStart/sec : " << std::setw(10) << mLpfConnectStart; - out << " mLpfRecvConnStart/sec : " << std::setw(10) << mLpfRecvConnectStart; - out << std::endl; - out << " mLpfConnectAck/sec : " << std::setw(10) << mLpfConnectAck; - out << " mLpfRecvConnectAck/sec : " << std::setw(10) << mLpfRecvConnectAck; - out << std::endl; - out << std::endl; -} - -void bdNode::resetCounters() -{ - mCounterOutOfDatePing = 0; - mCounterPings = 0; - mCounterPongs = 0; - mCounterQueryNode = 0; - mCounterQueryHash = 0; - mCounterReplyFindNode = 0; - mCounterReplyQueryHash = 0; - - mCounterRecvPing = 0; - mCounterRecvPong = 0; - mCounterRecvQueryNode = 0; - mCounterRecvQueryHash = 0; - mCounterRecvReplyFindNode = 0; - mCounterRecvReplyQueryHash = 0; - - mCounterConnectRequest = 0; - mCounterConnectReply = 0; - mCounterConnectStart = 0; - mCounterConnectAck = 0; - - mCounterRecvConnectRequest = 0; - mCounterRecvConnectReply = 0; - mCounterRecvConnectStart = 0; - mCounterRecvConnectAck = 0; -} - -void bdNode::resetStats() -{ - mLpfOutOfDatePing = 0; - mLpfPings = 0; - mLpfPongs = 0; - mLpfQueryNode = 0; - mLpfQueryHash = 0; - mLpfReplyFindNode = 0; - mLpfReplyQueryHash = 0; - - mLpfRecvPing = 0; - mLpfRecvPong = 0; - mLpfRecvQueryNode = 0; - mLpfRecvQueryHash = 0; - mLpfRecvReplyFindNode = 0; - mLpfRecvReplyQueryHash = 0; - - resetCounters(); -} void bdNode::checkPotentialPeer(bdId *id, bdId *src) { - bool isWorthyPeer = false; - /* also push to queries */ - std::list::iterator it; - for(it = mLocalQueries.begin(); it != mLocalQueries.end(); it++) - { - if ((*it)->addPotentialPeer(id, src, 0)) - { - isWorthyPeer = true; - } - } + bool isWorthyPeer = mQueryMgr->checkPotentialPeer(id, src); if (isWorthyPeer) { @@ -564,7 +409,7 @@ void bdNode::checkPotentialPeer(bdId *id, bdId *src) if (src) // src can be NULL! { - bdNode::addPotentialConnectionProxy(src, id); // CAUTION: Order switched! + mConnMgr->addPotentialConnectionProxy(src, id); // CAUTION: Order switched! } } @@ -588,13 +433,22 @@ void bdNode::addPeer(const bdId *id, uint32_t peerflags) fprintf(stderr, ")\n"); #endif - /* iterate through queries */ - std::list::iterator it; - for(it = mLocalQueries.begin(); it != mLocalQueries.end(); it++) + /* first check the filters */ + if (mFilterPeers->checkPeer(id, peerflags)) { - (*it)->addPeer(id, peerflags); + std::cerr << "bdNode::addPeer("; + mFns->bdPrintId(std::cerr, id); + std::cerr << ", " << std::hex << peerflags << std::dec; + std::cerr << ") FAILED the BAD PEER FILTER!!!! DISCARDING MSG"; + + std::list filteredIPs; + mFilterPeers->filteredIPs(filteredIPs); + mStore.filterIpList(filteredIPs); + + return; } + mQueryMgr->addPeer(id, peerflags); mNodeSpace.add_peer(id, peerflags); bdPeer peer; @@ -604,126 +458,10 @@ void bdNode::addPeer(const bdId *id, uint32_t peerflags) mStore.addStore(&peer); // Finally we pass to connections for them to use. - bdNode::updatePotentialConnectionProxy(id, peerflags); + mConnMgr->updatePotentialConnectionProxy(id, peerflags); } - -#if 0 - // virtual so manager can do callback. - // peer flags defined in bdiface.h -void bdNode::PeerResponse(const bdId *id, const bdNodeId *target, uint32_t peerflags) -{ - -#ifdef DEBUG_NODE_ACTIONS - std::cerr << "bdNode::PeerResponse("; - mFns->bdPrintId(std::cerr, id); - std::cerr << ", target: "; - mFns->bdPrintNodeId(std::cerr, target); - fprintf(stderr, ")\n"); -#endif - - /* iterate through queries */ - std::list::iterator it; - for(it = mLocalQueries.begin(); it != mLocalQueries.end(); it++) - { - it->PeerResponse(id, target, peerflags); - } - - mNodeSpace.add_peer(id, peerflags); - - bdPeer peer; - peer.mPeerId = *id; - peer.mPeerFlags = peerflags; - peer.mLastRecvTime = time(NULL); - mStore.addStore(&peer); -} - -#endif - -/************************************ Query Details *************************/ -void bdNode::addQuery(const bdNodeId *id, uint32_t qflags) -{ - - std::list startList; - std::multimap nearest; - std::multimap::iterator it; - - //mNodeSpace.find_nearest_nodes(id, BITDHT_QUERY_START_PEERS, startList, nearest, 0); - - mNodeSpace.find_nearest_nodes(id, BITDHT_QUERY_START_PEERS, nearest); - - fprintf(stderr, "bdNode::addQuery("); - mFns->bdPrintNodeId(std::cerr, id); - fprintf(stderr, ")\n"); - - for(it = nearest.begin(); it != nearest.end(); it++) - { - startList.push_back(it->second); - } - - bdQuery *query = new bdQuery(id, startList, qflags, mFns); - mLocalQueries.push_back(query); -} - - -void bdNode::clearQuery(const bdNodeId *rmId) -{ - std::list::iterator it; - for(it = mLocalQueries.begin(); it != mLocalQueries.end();) - { - if ((*it)->mId == *rmId) - { - bdQuery *query = (*it); - it = mLocalQueries.erase(it); - delete query; - } - else - { - it++; - } - } -} - -void bdNode::QueryStatus(std::map &statusMap) -{ - std::list::iterator it; - for(it = mLocalQueries.begin(); it != mLocalQueries.end(); it++) - { - bdQueryStatus status; - status.mStatus = (*it)->mState; - status.mQFlags = (*it)->mQueryFlags; - (*it)->result(status.mResults); - statusMap[(*it)->mId] = status; - } -} - -int bdNode::QuerySummary(const bdNodeId *id, bdQuerySummary &query) -{ - std::list::iterator it; - for(it = mLocalQueries.begin(); it != mLocalQueries.end(); it++) - { - if ((*it)->mId == *id) - { - query.mId = (*it)->mId; - query.mLimit = (*it)->mLimit; - query.mState = (*it)->mState; - query.mQueryTS = (*it)->mQueryTS; - query.mQueryFlags = (*it)->mQueryFlags; - query.mSearchTime = (*it)->mSearchTime; - query.mClosest = (*it)->mClosest; - query.mPotentialPeers = (*it)->mPotentialPeers; - query.mProxiesUnknown = (*it)->mProxiesUnknown; - query.mProxiesFlagged = (*it)->mProxiesFlagged; - - return 1; - } - } - return 0; -} - - - /************************************ Process Remote Query *************************/ void bdNode::processRemoteQuery() { @@ -770,8 +508,6 @@ void bdNode::processRemoteQuery() std::cerr << ", found " << nearest.size() << " nodes "; std::cerr << std::endl; #endif - - mCounterReplyFindNode++; break; } @@ -783,8 +519,6 @@ void bdNode::processRemoteQuery() std::cerr << " TODO"; std::cerr << std::endl; #endif - mCounterReplyQueryHash++; - /* TODO */ break; @@ -859,8 +593,17 @@ int bdNode::outgoingMsg(struct sockaddr_in *addr, char *msg, int *len) void bdNode::incomingMsg(struct sockaddr_in *addr, char *msg, int len) { - bdNodeNetMsg *bdmsg = new bdNodeNetMsg(msg, len, addr); - mIncomingMsgs.push_back(bdmsg); + /* check against the filter */ + if (mFilterPeers->addrOkay(addr)) + { + bdNodeNetMsg *bdmsg = new bdNodeNetMsg(msg, len, addr); + mIncomingMsgs.push_back(bdmsg); + } + else + { + std::cerr << "bdNode::incomingMsg() Incoming Packet Filtered"; + std::cerr << std::endl; + } } /************************************ Message Handling *****************************/ @@ -887,6 +630,7 @@ void bdNode::msgout_ping(bdId *id, bdToken *transId) int blen = bitdht_create_ping_msg(transId, &(mOwnId), msg, avail-1); sendPkt(msg, blen, id->addr); + mAccount.incCounter(BDACCOUNT_MSG_PING, true); } @@ -920,6 +664,8 @@ void bdNode::msgout_pong(bdId *id, bdToken *transId) int blen = bitdht_response_ping_msg(transId, &(mOwnId), &vid, msg, avail-1); sendPkt(msg, blen, id->addr); + + mAccount.incCounter(BDACCOUNT_MSG_PONG, true); } @@ -947,6 +693,7 @@ void bdNode::msgout_find_node(bdId *id, bdToken *transId, bdNodeId *query) sendPkt(msg, blen, id->addr); + mAccount.incCounter(BDACCOUNT_MSG_QUERYNODE, true); } @@ -957,6 +704,7 @@ void bdNode::msgout_reply_find_node(bdId *id, bdToken *transId, std::list registerOutgoingMsg(id, transId, BITDHT_MSG_TYPE_REPLY_NODE); + mAccount.incCounter(BDACCOUNT_MSG_REPLYFINDNODE, true); int blen = bitdht_resp_node_msg(transId, &(mOwnId), peers, msg, avail-1); @@ -1005,6 +753,7 @@ void bdNode::msgout_get_hash(bdId *id, bdToken *transId, bdNodeId *info_hash) sendPkt(msg, blen, id->addr); + mAccount.incCounter(BDACCOUNT_MSG_QUERYHASH, true); } @@ -1037,6 +786,7 @@ void bdNode::msgout_reply_hash(bdId *id, bdToken *transId, bdToken *token, std:: sendPkt(msg, blen, id->addr); + mAccount.incCounter(BDACCOUNT_MSG_REPLYQUERYHASH, true); } @@ -1070,6 +820,8 @@ void bdNode::msgout_reply_nearest(bdId *id, bdToken *transId, bdToken *token, st int blen = bitdht_peers_reply_closest_msg(transId, &(mOwnId), token, nodes, msg, avail-1); sendPkt(msg, blen, id->addr); + mAccount.incCounter(BDACCOUNT_MSG_REPLYQUERYHASH, true); + } @@ -1097,6 +849,8 @@ void bdNode::msgout_post_hash(bdId *id, bdToken *transId, bdNodeId *info_hash, u int blen = bitdht_announce_peers_msg(transId,&(mOwnId),info_hash,port,token,msg,avail-1); sendPkt(msg, blen, id->addr); + mAccount.incCounter(BDACCOUNT_MSG_POSTHASH, true); + } @@ -1111,14 +865,15 @@ void bdNode::msgout_reply_post(bdId *id, bdToken *transId) #endif /* generate message, send to udp */ - char msg[10240]; - int avail = 10240; + char msg[10240]; + int avail = 10240; registerOutgoingMsg(id, transId, BITDHT_MSG_TYPE_REPLY_POST); - int blen = bitdht_reply_announce_msg(transId, &(mOwnId), msg, avail-1); + int blen = bitdht_reply_announce_msg(transId, &(mOwnId), msg, avail-1); - sendPkt(msg, blen, id->addr); + sendPkt(msg, blen, id->addr); + mAccount.incCounter(BDACCOUNT_MSG_REPLYPOSTHASH, true); } @@ -1128,10 +883,19 @@ void bdNode::sendPkt(char *msg, int len, struct sockaddr_in addr) //fprintf(stderr, "bdNode::sendPkt(%d) to %s:%d\n", // len, inet_ntoa(addr.sin_addr), htons(addr.sin_port)); - bdNodeNetMsg *bdmsg = new bdNodeNetMsg(msg, len, &addr); - //bdmsg->print(std::cerr); - mOutgoingMsgs.push_back(bdmsg); - //bdmsg->print(std::cerr); + /* filter outgoing packets */ + if (mFilterPeers->addrOkay(&addr)) + { + bdNodeNetMsg *bdmsg = new bdNodeNetMsg(msg, len, &addr); + //bdmsg->print(std::cerr); + mOutgoingMsgs.push_back(bdmsg); + //bdmsg->print(std::cerr); + } + else + { + std::cerr << "bdNode::sendPkt() Outgoing Packet Filtered"; + std::cerr << std::endl; + } return; } @@ -1658,11 +1422,11 @@ void bdNode::msgin_ping(bdId *id, bdToken *transId) mFns->bdPrintId(std::cerr, id); std::cerr << std::endl; #endif - mCounterRecvPing++; - mCounterPongs++; + mAccount.incCounter(BDACCOUNT_MSG_PING, false); + /* peer is alive */ - uint32_t peerflags = 0; /* no id typically, so cant get version */ + uint32_t peerflags = BITDHT_PEER_STATUS_RECV_PING; /* no id typically, so cant get version */ addPeer(id, peerflags); /* reply */ @@ -1687,7 +1451,8 @@ void bdNode::msgin_pong(bdId *id, bdToken *transId, bdToken *versionId) (void) transId; #endif - mCounterRecvPong++; + mAccount.incCounter(BDACCOUNT_MSG_PONG, false); + /* recv pong, and peer is alive. add to DHT */ //uint32_t vId = 0; // TODO XXX convertBdVersionToVID(versionId); @@ -1804,7 +1569,8 @@ void bdNode::msgin_find_node(bdId *id, bdToken *transId, bdNodeId *query) std::cerr << std::endl; #endif - mCounterRecvQueryNode++; + mAccount.incCounter(BDACCOUNT_MSG_QUERYNODE, false); + /* store query... */ queueQuery(id, query, transId, BD_QUERY_NEIGHBOURS); @@ -1833,8 +1599,8 @@ void bdNode::msgin_reply_find_node(bdId *id, bdToken *transId, std::list & #else (void) transId; #endif - mCounterRecvReplyFindNode++; + mAccount.incCounter(BDACCOUNT_MSG_REPLYFINDNODE, false); /* add neighbours to the potential list */ for(it = nodes.begin(); it != nodes.end(); it++) @@ -1853,6 +1619,8 @@ void bdNode::msgin_reply_find_node(bdId *id, bdToken *transId, std::list & void bdNode::msgin_get_hash(bdId *id, bdToken *transId, bdNodeId *info_hash) { + + #ifdef DEBUG_NODE_MSGIN std::cerr << "bdNode::msgin_get_hash() TransId: "; bdPrintTransId(std::cerr, transId); @@ -1863,7 +1631,8 @@ void bdNode::msgin_get_hash(bdId *id, bdToken *transId, bdNodeId *info_hash) std::cerr << std::endl; #endif - mCounterRecvQueryHash++; + + mAccount.incCounter(BDACCOUNT_MSG_QUERYHASH, false); /* generate message, send to udp */ queueQuery(id, info_hash, transId, BD_QUERY_HASH); @@ -1872,7 +1641,7 @@ void bdNode::msgin_get_hash(bdId *id, bdToken *transId, bdNodeId *info_hash) void bdNode::msgin_reply_hash(bdId *id, bdToken *transId, bdToken *token, std::list &values) { - mCounterRecvReplyQueryHash++; + mAccount.incCounter(BDACCOUNT_MSG_REPLYQUERYHASH, false); #ifdef DEBUG_NODE_MSGIN std::cerr << "bdNode::msgin_reply_hash() TransId: "; @@ -1900,7 +1669,7 @@ void bdNode::msgin_reply_hash(bdId *id, bdToken *transId, bdToken *token, std::l void bdNode::msgin_reply_nearest(bdId *id, bdToken *transId, bdToken *token, std::list &nodes) { - //mCounterRecvReplyNearestHash++; + mAccount.incCounter(BDACCOUNT_MSG_REPLYQUERYHASH, false); #ifdef DEBUG_NODE_MSGIN std::cerr << "bdNode::msgin_reply_nearest() TransId: "; @@ -1930,7 +1699,8 @@ void bdNode::msgin_reply_nearest(bdId *id, bdToken *transId, bdToken *token, std void bdNode::msgin_post_hash(bdId *id, bdToken *transId, bdNodeId *info_hash, uint32_t port, bdToken *token) { - //mCounterRecvPostHash++; + + mAccount.incCounter(BDACCOUNT_MSG_POSTHASH, false); #ifdef DEBUG_NODE_MSGIN std::cerr << "bdNode::msgin_post_hash() TransId: "; @@ -1957,7 +1727,7 @@ void bdNode::msgin_post_hash(bdId *id, bdToken *transId, bdNodeId *info_hash, void bdNode::msgin_reply_post(bdId *id, bdToken *transId) { /* generate message, send to udp */ - //mCounterRecvReplyPostHash++; + mAccount.incCounter(BDACCOUNT_MSG_REPLYPOSTHASH, false); #ifdef DEBUG_NODE_MSGIN std::cerr << "bdNode::msgin_reply_post() TransId: "; @@ -1972,6 +1742,153 @@ void bdNode::msgin_reply_post(bdId *id, bdToken *transId) } + +/************************************************************************************************************ +******************************************** Message Interface ********************************************** +************************************************************************************************************/ + +/* Outgoing Messages */ +std::string getConnectMsgType(int msgtype) +{ + switch(msgtype) + { + case BITDHT_MSG_TYPE_CONNECT_REQUEST: + return "ConnectRequest"; + break; + case BITDHT_MSG_TYPE_CONNECT_REPLY: + return "ConnectReply"; + break; + case BITDHT_MSG_TYPE_CONNECT_START: + return "ConnectStart"; + break; + case BITDHT_MSG_TYPE_CONNECT_ACK: + return "ConnectAck"; + break; + default: + return "ConnectUnknown"; + break; + } +} + +void bdNode::msgout_connect_genmsg(bdId *id, bdToken *transId, int msgtype, bdId *srcAddr, bdId *destAddr, int mode, int status) +{ + std::cerr << "bdConnectManager::msgout_connect_genmsg() Type: " << getConnectMsgType(msgtype); + std::cerr << " TransId: "; + bdPrintTransId(std::cerr, transId); + std::cerr << " To: "; + mFns->bdPrintId(std::cerr, id); + std::cerr << " SrcAddr: "; + mFns->bdPrintId(std::cerr, srcAddr); + std::cerr << " DestAddr: "; + mFns->bdPrintId(std::cerr, destAddr); + std::cerr << " Mode: " << mode; + std::cerr << " Status: " << status; + std::cerr << std::endl; +#ifdef DEBUG_NODE_MSGOUT +#endif + + switch(msgtype) + { + default: + case BITDHT_MSG_TYPE_CONNECT_REQUEST: + mAccount.incCounter(BDACCOUNT_MSG_CONNECTREQUEST, true); + break; + case BITDHT_MSG_TYPE_CONNECT_REPLY: + mAccount.incCounter(BDACCOUNT_MSG_CONNECTREPLY, true); + break; + case BITDHT_MSG_TYPE_CONNECT_START: + mAccount.incCounter(BDACCOUNT_MSG_CONNECTSTART, true); + break; + case BITDHT_MSG_TYPE_CONNECT_ACK: + mAccount.incCounter(BDACCOUNT_MSG_CONNECTACK, true); + break; + } + + registerOutgoingMsg(id, transId, msgtype); + + /* create string */ + char msg[10240]; + int avail = 10240; + + int blen = bitdht_connect_genmsg(transId, &(mOwnId), msgtype, srcAddr, destAddr, mode, status, msg, avail-1); + sendPkt(msg, blen, id->addr); +} + + +void bdNode::msgin_connect_genmsg(bdId *id, bdToken *transId, int msgtype, + bdId *srcAddr, bdId *destAddr, int mode, int status) +{ + std::list::iterator it; + + std::cerr << "bdConnectManager::msgin_connect_genmsg() Type: " << getConnectMsgType(msgtype); + std::cerr << " TransId: "; + bdPrintTransId(std::cerr, transId); + std::cerr << " From: "; + mFns->bdPrintId(std::cerr, id); + std::cerr << " SrcAddr: "; + mFns->bdPrintId(std::cerr, srcAddr); + std::cerr << " DestAddr: "; + mFns->bdPrintId(std::cerr, destAddr); + std::cerr << " Mode: " << mode; + std::cerr << " Status: " << status; + std::cerr << std::endl; +#ifdef DEBUG_NODE_MSGS +#else + (void) transId; +#endif + + /* switch to actual work functions */ + uint32_t peerflags = 0; + switch(msgtype) + { + case BITDHT_MSG_TYPE_CONNECT_REQUEST: + peerflags = BITDHT_PEER_STATUS_RECV_CONNECT_MSG; + mAccount.incCounter(BDACCOUNT_MSG_CONNECTREQUEST, false); + + + mConnMgr->recvedConnectionRequest(id, srcAddr, destAddr, mode); + + break; + case BITDHT_MSG_TYPE_CONNECT_REPLY: + peerflags = BITDHT_PEER_STATUS_RECV_CONNECT_MSG; + mAccount.incCounter(BDACCOUNT_MSG_CONNECTREPLY, false); + + mConnMgr->recvedConnectionReply(id, srcAddr, destAddr, mode, status); + + break; + case BITDHT_MSG_TYPE_CONNECT_START: + peerflags = BITDHT_PEER_STATUS_RECV_CONNECT_MSG; + mAccount.incCounter(BDACCOUNT_MSG_CONNECTSTART, false); + + mConnMgr->recvedConnectionStart(id, srcAddr, destAddr, mode, status); + + break; + case BITDHT_MSG_TYPE_CONNECT_ACK: + peerflags = BITDHT_PEER_STATUS_RECV_CONNECT_MSG; + mAccount.incCounter(BDACCOUNT_MSG_CONNECTACK, false); + + mConnMgr->recvedConnectionAck(id, srcAddr, destAddr, mode); + + break; + default: + break; + } + + /* received message - so peer must be good */ + addPeer(id, peerflags); + +} + + + + + + + + + + + /****************** Other Functions ******************/ void bdNode::genNewToken(bdToken *token) diff --git a/libbitdht/src/bitdht/bdnode.h b/libbitdht/src/bitdht/bdnode.h index 0f92f2230..3d43d1c5c 100644 --- a/libbitdht/src/bitdht/bdnode.h +++ b/libbitdht/src/bitdht/bdnode.h @@ -35,6 +35,9 @@ #include "bitdht/bdhistory.h" #include "bitdht/bdconnection.h" +#include "bitdht/bdaccount.h" + +class bdFilter; #define BD_QUERY_NEIGHBOURS 1 @@ -92,17 +95,39 @@ class bdNodeNetMsg }; -class bdNode +class bdNodePublisher +{ + public: + /* simplified outgoing msg functions (for the managers) */ + virtual void send_ping(bdId *id) = 0; /* message out */ + virtual void send_query(bdId *id, bdNodeId *targetNodeId) = 0; /* message out */ + virtual void send_connect_msg(bdId *id, int msgtype, + bdId *srcAddr, bdId *destAddr, int mode, int status) = 0; + + // internal Callback -> normally continues to callbackConnect(). + virtual void callbackConnect(bdId *srcId, bdId *proxyId, bdId *destId, + int mode, int point, int cbtype, int errcode) = 0; + +}; + + +class bdNode: public bdNodePublisher { public: bdNode(bdNodeId *id, std::string dhtVersion, std::string bootfile, bdDhtFunctions *fns); + void init(); /* sets up the self referential classes (mQueryMgr & mConnMgr) */ + + void setNodeOptions(uint32_t optFlags); + /* startup / shutdown node */ void restartNode(); void shutdownNode(); + void getOwnId(bdNodeId *id); + // virtual so manager can do callback. // peer flags defined in bdiface.h virtual void addPeer(const bdId *id, uint32_t peerflags); @@ -111,31 +136,33 @@ class bdNode void checkPotentialPeer(bdId *id, bdId *src); void addPotentialPeer(bdId *id, bdId *src); - void addQuery(const bdNodeId *id, uint32_t qflags); - void clearQuery(const bdNodeId *id); - void QueryStatus(std::map &statusMap); - int QuerySummary(const bdNodeId *id, bdQuerySummary &query); - - /* connection functions */ - void requestConnection(bdNodeId *id, uint32_t modes); - void allowConnection(bdNodeId *id, uint32_t modes); - void iterationOff(); void iteration(); void processRemoteQuery(); void updateStore(); + /* simplified outgoing msg functions (for the managers) */ + virtual void send_ping(bdId *id); /* message out */ + virtual void send_query(bdId *id, bdNodeId *targetNodeId); /* message out */ + virtual void send_connect_msg(bdId *id, int msgtype, + bdId *srcAddr, bdId *destAddr, int mode, int status); - /* interaction with outside world */ +// This is implemented in bdManager. +// virtual void callbackConnect(bdId *srcId, bdId *proxyId, bdId *destId, +// int mode, int point, int cbtype, int errcode); + + /* interaction with outside world (Accessed by controller to deliver us msgs) */ int outgoingMsg(struct sockaddr_in *addr, char *msg, int *len); void incomingMsg(struct sockaddr_in *addr, char *msg, int len); + + // Below is internal Management of incoming / outgoing messages. + private: + /* internal interaction with network */ void sendPkt(char *msg, int len, struct sockaddr_in addr); void recvPkt(char *msg, int len, struct sockaddr_in addr); - /* internal assistance functions */ - void send_query(bdId *id, bdNodeId *targetNodeId); /* message out */ /* output functions (send msg) */ void msgout_ping(bdId *id, bdToken *transId); @@ -172,6 +199,11 @@ void recvPkt(char *msg, int len, struct sockaddr_in addr); bdNodeId *info_hash, uint32_t port, bdToken *token); void msgin_reply_post(bdId *id, bdToken *transId); + void msgout_connect_genmsg(bdId *id, bdToken *transId, int msgtype, + bdId *srcAddr, bdId *destAddr, int mode, int status); + void msgin_connect_genmsg(bdId *id, bdToken *transId, int msgtype, + bdId *srcAddr, bdId *destAddr, int mode, int status); + /* token handling */ @@ -184,171 +216,43 @@ void recvPkt(char *msg, int len, struct sockaddr_in addr); uint32_t checkIncomingMsg(bdId *id, bdToken *transId, uint32_t msgType); void cleanupTransIdRegister(); - void getOwnId(bdNodeId *id); void doStats(); - void printStats(std::ostream &out); - void printQueries(); - - void resetCounters(); - void resetStats(); - - - /****************************** Connection Code (in bdconnection.cc) ****************************/ - - /* Connections: Configuration */ - void defaultConnectionOptions(); - virtual void setConnectionOptions(uint32_t allowedModes, uint32_t flags); - - /* Connections: Messages */ - - void msgout_connect_genmsg(bdId *id, bdToken *transId, int msgtype, - bdId *srcAddr, bdId *destAddr, int mode, int status); - void msgin_connect_genmsg(bdId *id, bdToken *transId, int msgtype, - bdId *srcAddr, bdId *destAddr, int mode, int status); - - /* Connections: Initiation */ - - int requestConnection(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode, uint32_t start); - int requestConnection_direct(struct sockaddr_in *laddr, bdNodeId *target); - int requestConnection_proxy(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode); - - int killConnectionRequest(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode); - - int checkExistingConnectionAttempt(bdNodeId *target); - void addPotentialConnectionProxy(const bdId *srcId, const bdId *target); - void updatePotentialConnectionProxy(const bdId *id, uint32_t mode); - - int checkPeerForFlag(const bdId *id, uint32_t with_flag); - - int tickConnections(); - void iterateConnectionRequests(); - int startConnectionAttempt(bdConnectionRequest *req); - - // internal Callback -> normally continues to callbackConnect(). - void callbackConnectRequest(bdId *srcId, bdId *proxyId, bdId *destId, - int mode, int point, int cbtype, int errcode); - - /* Connections: Outgoing */ - - int startConnectionAttempt(bdId *proxyId, bdId *srcConnAddr, bdId *destConnAddr, int mode); - void AuthConnectionOk(bdId *srcId, bdId *proxyId, bdId *destId, int mode, int loc); - void AuthConnectionNo(bdId *srcId, bdId *proxyId, bdId *destId, int mode, int loc, int errcode); - void iterateConnections(); - - - /* Connections: Utility State */ - - bdConnection *findExistingConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId); - bdConnection *newConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId); - int cleanConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId); - - int determinePosition(bdNodeId *sender, bdNodeId *src, bdNodeId *dest); - int determineProxyId(bdNodeId *sender, bdNodeId *src, bdNodeId *dest, bdNodeId *proxyId); - - bdConnection *findSimilarConnection(bdNodeId *srcId, bdNodeId *destId); - bdConnection *findExistingConnectionBySender(bdId *sender, bdId *src, bdId *dest); - bdConnection *newConnectionBySender(bdId *sender, bdId *src, bdId *dest); - int cleanConnectionBySender(bdId *sender, bdId *src, bdId *dest); - - // Overloaded Generalised Connection Callback. - virtual void callbackConnect(bdId *srcId, bdId *proxyId, bdId *destId, - int mode, int point, int cbtype, int errcode); - - /* Connections: */ - int recvedConnectionRequest(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode); - int recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode, int status); - int recvedConnectionStart(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode, int bandwidth); - int recvedConnectionAck(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode); + /********** Variables **********/ private: - std::map mConnections; - std::map mConnectionRequests; - - uint32_t mConfigAllowedModes; - bool mConfigAutoProxy; - - /****************************** Connection Code (in bdconnection.cc) ****************************/ - + /**** Some Variables are Protected to allow inherited classes to use *****/ protected: + bdSpace mNodeSpace; + + bdQueryManager *mQueryMgr; + bdConnectManager *mConnMgr; + bdFilter *mFilterPeers; bdNodeId mOwnId; bdId mLikelyOwnId; // Try to workout own id address. - bdSpace mNodeSpace; + std::string mDhtVersion; + + bdAccount mAccount; + bdStore mStore; + + bdDhtFunctions *mFns; + bdHashSpace mHashSpace; private: - bdStore mStore; - std::string mDhtVersion; + uint32_t mNodeOptionFlags; - bdDhtFunctions *mFns; - - bdHashSpace mHashSpace; - bdHistory mHistory; /* for understanding the DHT */ - std::list mLocalQueries; std::list mRemoteQueries; std::list mPotentialPeers; std::list mOutgoingMsgs; std::list mIncomingMsgs; - - // Statistics. - double mCounterOutOfDatePing; - double mCounterPings; - double mCounterPongs; - double mCounterQueryNode; - double mCounterQueryHash; - double mCounterReplyFindNode; - double mCounterReplyQueryHash; - // connection stats. - double mCounterConnectRequest; - double mCounterConnectReply; - double mCounterConnectStart; - double mCounterConnectAck; - - double mCounterRecvPing; - double mCounterRecvPong; - double mCounterRecvQueryNode; - double mCounterRecvQueryHash; - double mCounterRecvReplyFindNode; - double mCounterRecvReplyQueryHash; - // connection stats. - double mCounterRecvConnectRequest; - double mCounterRecvConnectReply; - double mCounterRecvConnectStart; - double mCounterRecvConnectAck; - - double mLpfOutOfDatePing; - double mLpfPings; - double mLpfPongs; - double mLpfQueryNode; - double mLpfQueryHash; - double mLpfReplyFindNode; - double mLpfReplyQueryHash; - // connection stats. - double mLpfConnectRequest; - double mLpfConnectReply; - double mLpfConnectStart; - double mLpfConnectAck; - - double mLpfRecvPing; - double mLpfRecvPong; - double mLpfRecvQueryNode; - double mLpfRecvQueryHash; - double mLpfRecvReplyFindNode; - double mLpfRecvReplyQueryHash; - // connection stats. - double mLpfRecvConnectRequest; - double mLpfRecvConnectReply; - double mLpfRecvConnectStart; - double mLpfRecvConnectAck; - - }; diff --git a/libbitdht/src/bitdht/bdpeer.cc b/libbitdht/src/bitdht/bdpeer.cc index 3b770030d..c4c388178 100644 --- a/libbitdht/src/bitdht/bdpeer.cc +++ b/libbitdht/src/bitdht/bdpeer.cc @@ -192,6 +192,11 @@ bdSpace::bdSpace(bdNodeId *ownId, bdDhtFunctions *fns) { /* make some space for data */ buckets.resize(mFns->bdNumBuckets()); + + mAttachTS = 0; + mAttachedFlags = 0; + mAttachedCount = 0; + return; } @@ -207,11 +212,17 @@ int bdSpace::clear() return 1; } - +int bdSpace::setAttachedFlag(uint32_t withflags, int count) +{ + mAttachedFlags = withflags; + mAttachedCount = count; + mAttachTS = 0; + return 1; +} int bdSpace::find_nearest_nodes_with_flags(const bdNodeId *id, int number, std::list /* excluding */, - std::multimap &nearest, uint32_t with_flag) + std::multimap &nearest, uint32_t with_flags) { std::multimap closest; std::multimap::iterator mit; @@ -237,7 +248,7 @@ int bdSpace::find_nearest_nodes_with_flags(const bdNodeId *id, int number, { for(eit = it->entries.begin(); eit != it->entries.end(); eit++) { - if ((!with_flag) || (with_flag & eit->mPeerFlags)) + if ((!with_flags) || ((with_flags & eit->mPeerFlags) == with_flags)) { mFns->bdDistance(id, &(eit->mPeerId.id), &dist); closest.insert(std::pair(dist, eit->mPeerId)); @@ -319,7 +330,7 @@ int bdSpace::find_nearest_nodes(const bdNodeId *id, int number, /* This is much cheaper than find nearest... we only look in the one bucket */ -int bdSpace::find_node(const bdNodeId *id, int number, std::list &matchIds, uint32_t with_flag) +int bdSpace::find_node(const bdNodeId *id, int number, std::list &matchIds, uint32_t with_flags) { bdMetric dist; mFns->bdDistance(id, &(mOwnId), &dist); @@ -346,7 +357,7 @@ int bdSpace::find_node(const bdNodeId *id, int number, std::list &matchIds std::cerr << " withFlags: " << eit->mPeerFlags; std::cerr << std::endl; - if ((!with_flag) || (with_flag & eit->mPeerFlags)) + if ((!with_flags) || ((with_flags & eit->mPeerFlags) == with_flags)) { if (*id == eit->mPeerId.id) { @@ -423,7 +434,7 @@ int bdSpace::find_exactnode(const bdId *id, bdPeer &peer) } - +#if 0 int bdSpace::out_of_date_peer(bdId &id) { /* @@ -492,6 +503,177 @@ int bdSpace::out_of_date_peer(bdId &id) return 0; } +#endif + + + + +#define BITDHT_ATTACHED_SEND_PERIOD 17 + +int bdSpace::scanOutOfDatePeers(std::list &peerIds) +{ + /* + * + */ + bool doAttached = (mAttachedCount > 0); + int attachedCount = 0; + + std::map closest; + std::map::iterator mit; + + std::vector::iterator it; + std::list::iterator eit; + time_t ts = time(NULL); + + /* iterate through the buckets, and sort by distance */ + for(it = buckets.begin(); it != buckets.end(); it++) + { + for(eit = it->entries.begin(); eit != it->entries.end(); ) + { + bool added = false; + if (doAttached) + { + if (eit->mExtraFlags & BITDHT_PEER_EXFLAG_ATTACHED) + { + /* add to send list, if we haven't pinged recently */ + if ((ts - eit->mLastSendTime > BITDHT_ATTACHED_SEND_PERIOD ) && + (ts - eit->mLastRecvTime > BITDHT_ATTACHED_SEND_PERIOD )) + { + peerIds.push_back(eit->mPeerId); + eit->mLastSendTime = ts; + added = true; + } + attachedCount++; + } + } + + + /* timeout on last send time! */ + if ((!added) && (ts - eit->mLastSendTime > BITDHT_MAX_SEND_PERIOD )) + { + /* We want to ping a peer iff: + * 1) They are out-of-date: mLastRecvTime is too old. + * 2) They don't have 0x0001 flag (we haven't received a PONG) and never sent. + */ + if ((ts - eit->mLastRecvTime > BITDHT_MAX_SEND_PERIOD ) || + !(eit->mPeerFlags & BITDHT_PEER_STATUS_RECV_PONG)) + { + peerIds.push_back(eit->mPeerId); + eit->mLastSendTime = ts; + } + } + + + /* we also want to remove very old entries (should it happen here?) + * which are not pushed out by newer entries (will happen in for closer buckets) + */ + + bool discard = false; + /* discard very old entries */ + if (ts - eit->mLastRecvTime > BITDHT_DISCARD_PERIOD) + { + discard = true; + } + + /* discard peers which have not responded to anything (ie have no flags set) */ + /* changed into have not id'ed themselves, as we've added ping to list of flags. */ + if ((ts - eit->mFoundTime > BITDHT_MAX_RESPONSE_PERIOD ) && + !(eit->mPeerFlags & BITDHT_PEER_STATUS_RECV_PONG)) + { + discard = true; + } + + + /* INCREMENT */ + if (discard) + { + eit = it->entries.erase(eit); + } + else + { + eit++; + } + } + } + +#define ATTACH_UPDATE_PERIOD 600 + + if ((ts - mAttachTS > ATTACH_UPDATE_PERIOD) || (attachedCount != mAttachedCount)) + { + std::cerr << "Updating ATTACH Stuff"; + std::cerr << std::endl; + updateAttachedPeers(); /* XXX TEMP HACK to look at stability */ + mAttachTS = ts; + } + + return (peerIds.size()); +} + + +int bdSpace::updateAttachedPeers() +{ + /* + * + */ + bool doAttached = (mAttachedCount > 0); + int attachedCount = 0; + + if (!doAttached) + { + return 0; + } + + std::map closest; + std::map::iterator mit; + + std::vector::iterator it; + std::list::reverse_iterator eit; + + + /* skip the first bucket, as we don't want to ping ourselves! */ + it = buckets.begin(); + if (it != buckets.end()) + { + it++; + } + + /* iterate through the buckets (sorted by distance) */ + for(; it != buckets.end(); it++) + { + /* start from the back, as these are the most recently seen (and more likely to be the old ATTACHED) */ + for(eit = it->entries.rbegin(); eit != it->entries.rend(); eit++) + { + bool added = false; + if (doAttached) + { + if ((eit->mPeerFlags & mAttachedFlags) == mAttachedFlags) + { + /* flag as attached */ + eit->mExtraFlags |= BITDHT_PEER_EXFLAG_ATTACHED; + + /* inc count, and cancel search if we've found them */ + attachedCount++; + if (attachedCount >= mAttachedCount) + { + doAttached = false; + } + } + else + { + eit->mExtraFlags &= ~BITDHT_PEER_EXFLAG_ATTACHED; + } + } + else + { + eit->mExtraFlags &= ~BITDHT_PEER_EXFLAG_ATTACHED; + } + } + } +} + + + + /* Called to add or update peer. * sorts bucket lists by lastRecvTime. * updates requested node. @@ -500,6 +682,7 @@ int bdSpace::out_of_date_peer(bdId &id) /* peer flags * order is important! * higher bits = more priority. + * BITDHT_PEER_STATUS_RECVPING * BITDHT_PEER_STATUS_RECVPONG * BITDHT_PEER_STATUS_RECVNODES * BITDHT_PEER_STATUS_RECVHASHES @@ -543,15 +726,22 @@ int bdSpace::add_peer(const bdId *id, uint32_t peerflags) /* loop through ids, to find it */ for(it = buck.entries.begin(); it != buck.entries.end(); it++) { - if (*id == it->mPeerId) - // should check addr too! - { + /* similar id check */ + if (mFns->bdSimilarId(id, &(it->mPeerId))) + { bdPeer peer = *it; it = buck.entries.erase(it); peer.mLastRecvTime = ts; peer.mPeerFlags |= peerflags; /* must be cumulative ... so can do online, replynodes, etc */ + /* also update port from incoming id, as we have definitely recved from it */ + if (mFns->bdUpdateSimilarId(&(peer.mPeerId), id)) + { + /* updated it... must be Unstable */ + peer.mExtraFlags |= BITDHT_PEER_EXFLAG_UNSTABLE; + } + buck.entries.push_back(peer); #ifdef DEBUG_BD_SPACE @@ -625,6 +815,7 @@ int bdSpace::add_peer(const bdId *id, uint32_t peerflags) newPeer.mLastSendTime = 0; // ts; //???? newPeer.mFoundTime = ts; newPeer.mPeerFlags = peerflags; + newPeer.mExtraFlags = 0; buck.entries.push_back(newPeer); @@ -1047,10 +1238,11 @@ bool bdSpace::findRandomPeerWithFlag(bdId &id, uint32_t withFlag) { if (i == rnd) { +#ifdef BITDHT_DEBUG std::cerr << "bdSpace::findRandomPeerWithFlag() found #" << i; std::cerr << " in bucket #" << buck; std::cerr << std::endl; - +#endif /* found */ id = lit->mPeerId; return true; @@ -1061,6 +1253,8 @@ bool bdSpace::findRandomPeerWithFlag(bdId &id, uint32_t withFlag) } std::cerr << "bdSpace::findRandomPeerWithFlag() failed to find " << rnd << " / " << totalcount; std::cerr << std::endl; +#ifdef BITDHT_DEBUG +#endif return false; } diff --git a/libbitdht/src/bitdht/bdpeer.h b/libbitdht/src/bitdht/bdpeer.h index 957f01a2b..65b931f3c 100644 --- a/libbitdht/src/bitdht/bdpeer.h +++ b/libbitdht/src/bitdht/bdpeer.h @@ -159,6 +159,8 @@ class bdSpace int clear(); +int setAttachedFlag(uint32_t withflags, int count); + /* accessors */ int find_nearest_nodes(const bdNodeId *id, int number, std::multimap &nearest); @@ -171,7 +173,11 @@ int find_node(const bdNodeId *id, int number, std::list &matchIds, uint32_t with_flag); int find_exactnode(const bdId *id, bdPeer &peer); -int out_of_date_peer(bdId &id); // side-effect updates, send flag on peer. +// switched to more efficient single sweep. +//int out_of_date_peer(bdId &id); // side-effect updates, send flag on peer. +int scanOutOfDatePeers(std::list &peerIds); +int updateAttachedPeers(); + int add_peer(const bdId *id, uint32_t mode); int printDHT(); int getDhtBucket(const int idx, bdBucket &bucket); @@ -192,6 +198,10 @@ int updateOwnId(bdNodeId *newOwnId); std::vector buckets; bdNodeId mOwnId; bdDhtFunctions *mFns; + + uint32_t mAttachedFlags; + uint32_t mAttachedCount; + time_t mAttachTS; }; diff --git a/libbitdht/src/bitdht/bdquery.cc b/libbitdht/src/bitdht/bdquery.cc index 78482ab7b..a3e7a93d0 100644 --- a/libbitdht/src/bitdht/bdquery.cc +++ b/libbitdht/src/bitdht/bdquery.cc @@ -316,7 +316,11 @@ int bdQuery::addClosestPeer(const bdId *id, uint32_t mode) if (mode) { /* also update port from incoming id, as we have definitely recved from it */ - mFns->bdUpdateSimilarId(&(it->second.mPeerId), id); + if (mFns->bdUpdateSimilarId(&(it->second.mPeerId), id)) + { + /* updated it... must be Unstable */ + it->second.mExtraFlags |= BITDHT_PEER_EXFLAG_UNSTABLE; + } } if (mode & BITDHT_PEER_STATUS_RECV_NODES) { @@ -567,7 +571,11 @@ int bdQuery::updatePotentialPeer(const bdId *id, uint32_t mode, uint32_t addType else if (mode) { /* also update port from incoming id, as we have definitely recved from it */ - mFns->bdUpdateSimilarId(&(it->second.mPeerId), id); + if (mFns->bdUpdateSimilarId(&(it->second.mPeerId), id)) + { + /* updated it... must be Unstable */ + it->second.mExtraFlags |= BITDHT_PEER_EXFLAG_UNSTABLE; + } } return 0; } @@ -818,7 +826,11 @@ int bdQuery::updateProxyList(const bdId *id, uint32_t mode, std::list &s if (mode) { /* also update port from incoming id, as we have definitely recved from it */ - mFns->bdUpdateSimilarId(&(it->mPeerId), id); + if (mFns->bdUpdateSimilarId(&(it->mPeerId), id)) + { + /* updated it... must be Unstable */ + it->mExtraFlags |= BITDHT_PEER_EXFLAG_UNSTABLE; + } } it->mPeerFlags |= mode; it->mLastRecvTime = now; diff --git a/libbitdht/src/bitdht/bdquerymgr.cc b/libbitdht/src/bitdht/bdquerymgr.cc new file mode 100644 index 000000000..5dedf45b0 --- /dev/null +++ b/libbitdht/src/bitdht/bdquerymgr.cc @@ -0,0 +1,310 @@ +/* + * bitdht/bdnode.cc + * + * BitDHT: An Flexible DHT library. + * + * Copyright 2010 by Robert Fernie + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License Version 3 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems to "bitdht@lunamutt.com". + * + */ + +#include "bitdht/bdquerymgr.h" +#include "bitdht/bdnode.h" + +#include +#include + +#include +#include +#include + + +#define BITDHT_QUERY_START_PEERS 10 +#define BITDHT_QUERY_NEIGHBOUR_PEERS 8 +#define BITDHT_MAX_REMOTE_QUERY_AGE 10 + +/**** + * #define DEBUG_NODE_MULTIPEER 1 + * #define DEBUG_NODE_MSGS 1 + * #define DEBUG_NODE_ACTIONS 1 + + * #define DEBUG_NODE_MSGIN 1 + * #define DEBUG_NODE_MSGOUT 1 + ***/ + +//#define DEBUG_NODE_MSGS 1 + + +bdQueryManager::bdQueryManager(bdSpace *space, bdDhtFunctions *fns, bdNodePublisher *pub) + :mNodeSpace(space), mFns(fns), mPub(pub) +{ +} + +/***** Startup / Shutdown ******/ +void bdQueryManager::shutdownQueries() +{ + /* clear the queries */ + std::list::iterator it; + for(it = mLocalQueries.begin(); it != mLocalQueries.end();it++) + { + delete (*it); + } + + mLocalQueries.clear(); +} + + +void bdQueryManager::printQueries() +{ + std::cerr << "bdQueryManager::printQueries()"; + std::cerr << std::endl; + + int i = 0; + std::list::iterator it; + for(it = mLocalQueries.begin(); it != mLocalQueries.end(); it++, i++) + { + fprintf(stderr, "Query #%d:\n", i); + (*it)->printQuery(); + fprintf(stderr, "\n"); + } +} + + +int bdQueryManager::iterateQueries(int maxQueries) +{ +#ifdef DEBUG_NODE_MULTIPEER + std::cerr << "bdQueryManager::iterateQueries() of Peer: "; + mFns->bdPrintNodeId(std::cerr, &mOwnId); + std::cerr << std::endl; +#endif + + /* allow each query to send up to one query... until maxMsgs has been reached */ + int numQueries = mLocalQueries.size(); + int sentQueries = 0; + int i = 0; + + bdId id; + bdNodeId targetNodeId; + + while((i < numQueries) && (sentQueries < maxQueries)) + { + bdQuery *query = mLocalQueries.front(); + mLocalQueries.pop_front(); + mLocalQueries.push_back(query); + + /* go through the possible queries */ + if (query->nextQuery(id, targetNodeId)) + { +#ifdef DEBUG_NODE_MSGS + std::cerr << "bdQueryManager::iteration() send_query("; + mFns->bdPrintId(std::cerr, &id); + std::cerr << ","; + mFns->bdPrintNodeId(std::cerr, &targetNodeId); + std::cerr << ")"; + std::cerr << std::endl; +#endif + mPub->send_query(&id, &targetNodeId); + sentQueries++; + } + i++; + } + +#ifdef DEBUG_NODE_ACTIONS + std::cerr << "bdQueryManager::iteration() maxMsgs: " << maxMsgs << " sentPings: " << sentPings; + std::cerr << " / " << allowedPings; + std::cerr << " sentQueries: " << sentQueries; + std::cerr << " / " << numQueries; + std::cerr << std::endl; +#endif + + //printQueries(); + + return sentQueries; +} + + +bool bdQueryManager::checkPotentialPeer(bdId *id, bdId *src) +{ + bool isWorthyPeer = false; + /* also push to queries */ + std::list::iterator it; + for(it = mLocalQueries.begin(); it != mLocalQueries.end(); it++) + { + if ((*it)->addPotentialPeer(id, src, 0)) + { + isWorthyPeer = true; + } + } + return isWorthyPeer; +} + + +void bdQueryManager::addPeer(const bdId *id, uint32_t peerflags) +{ + +#ifdef DEBUG_NODE_ACTIONS + fprintf(stderr, "bdQueryManager::addPeer("); + mFns->bdPrintId(std::cerr, id); + fprintf(stderr, ")\n"); +#endif + + /* iterate through queries */ + std::list::iterator it; + for(it = mLocalQueries.begin(); it != mLocalQueries.end(); it++) + { + (*it)->addPeer(id, peerflags); + } +} + + +/************************************ Query Details *************************/ +void bdQueryManager::addQuery(const bdNodeId *id, uint32_t qflags) +{ + + std::list startList; + std::multimap nearest; + std::multimap::iterator it; + + mNodeSpace->find_nearest_nodes(id, BITDHT_QUERY_START_PEERS, nearest); + + fprintf(stderr, "bdQueryManager::addQuery("); + mFns->bdPrintNodeId(std::cerr, id); + fprintf(stderr, ")\n"); + + for(it = nearest.begin(); it != nearest.end(); it++) + { + startList.push_back(it->second); + } + + bdQuery *query = new bdQuery(id, startList, qflags, mFns); + mLocalQueries.push_back(query); +} + + +void bdQueryManager::clearQuery(const bdNodeId *rmId) +{ + std::list::iterator it; + for(it = mLocalQueries.begin(); it != mLocalQueries.end();) + { + if ((*it)->mId == *rmId) + { + bdQuery *query = (*it); + it = mLocalQueries.erase(it); + delete query; + } + else + { + it++; + } + } +} + +void bdQueryManager::QueryStatus(std::map &statusMap) +{ + std::list::iterator it; + for(it = mLocalQueries.begin(); it != mLocalQueries.end(); it++) + { + bdQueryStatus status; + status.mStatus = (*it)->mState; + status.mQFlags = (*it)->mQueryFlags; + (*it)->result(status.mResults); + statusMap[(*it)->mId] = status; + } +} + +int bdQueryManager::QuerySummary(const bdNodeId *id, bdQuerySummary &query) +{ + std::list::iterator it; + for(it = mLocalQueries.begin(); it != mLocalQueries.end(); it++) + { + if ((*it)->mId == *id) + { + query.mId = (*it)->mId; + query.mLimit = (*it)->mLimit; + query.mState = (*it)->mState; + query.mQueryTS = (*it)->mQueryTS; + query.mQueryFlags = (*it)->mQueryFlags; + query.mSearchTime = (*it)->mSearchTime; + query.mClosest = (*it)->mClosest; + query.mPotentialPeers = (*it)->mPotentialPeers; + query.mProxiesUnknown = (*it)->mProxiesUnknown; + query.mProxiesFlagged = (*it)->mProxiesFlagged; + + return 1; + } + } + return 0; +} + +/* Extract Results from Peer Queries */ + +#define BDQRYMGR_RESULTS 1 +#define BDQRYMGR_PROXIES 2 +#define BDQRYMGR_POTPROXIES 3 + +int bdQueryManager::getResults(bdNodeId *target, std::list &answer, int querytype) +{ + + /* grab any peers from any existing query */ + int results = 0; + std::list::iterator qit; + for(qit = mLocalQueries.begin(); qit != mLocalQueries.end(); qit++) + { + if (!((*qit)->mId == (*target))) + { + continue; + } + +#ifdef DEBUG_NODE_CONNECTION + std::cerr << "bdQueryManager::getResults() Found Matching Query"; + std::cerr << std::endl; +#endif + switch(querytype) + { + default: + case BDQRYMGR_RESULTS: + results = (*qit)->result(answer); + break; + case BDQRYMGR_PROXIES: + results = (*qit)->proxies(answer); + break; + case BDQRYMGR_POTPROXIES: + results = (*qit)->potentialProxies(answer); + break; + } + /* will only be one matching query.. so end loop */ + return results; + } +} + + +int bdQueryManager::result(bdNodeId *target, std::list &answer) +{ + return getResults(target, answer, BDQRYMGR_RESULTS); +} + +int bdQueryManager::proxies(bdNodeId *target, std::list &answer) +{ + return getResults(target, answer, BDQRYMGR_PROXIES); +} + +int bdQueryManager::potentialProxies(bdNodeId *target, std::list &answer) +{ + return getResults(target, answer, BDQRYMGR_POTPROXIES); +} + diff --git a/libbitdht/src/bitdht/bdquerymgr.h b/libbitdht/src/bitdht/bdquerymgr.h new file mode 100644 index 000000000..a5ea596b6 --- /dev/null +++ b/libbitdht/src/bitdht/bdquerymgr.h @@ -0,0 +1,73 @@ +#ifndef BITDHT_QUERY_MANAGER_H +#define BITDHT_QUERY_MANAGER_H + +/* + * bitdht/bdquerymgr.h + * + * BitDHT: An Flexible DHT library. + * + * Copyright 2011 by Robert Fernie + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License Version 3 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems to "bitdht@lunamutt.com". + * + */ + + +#include "bitdht/bdquery.h" +class bdNodePublisher; + + +class bdQueryManager +{ + public: + + bdQueryManager(bdSpace *space, bdDhtFunctions *fns, bdNodePublisher *pub); + + void shutdownQueries(); + void printQueries(); + + int iterateQueries(int maxqueries); + + bool checkPotentialPeer(bdId *id, bdId *src); + void addPeer(const bdId *id, uint32_t peerflags); + + void addQuery(const bdNodeId *id, uint32_t qflags); + void clearQuery(const bdNodeId *id); + void QueryStatus(std::map &statusMap); + int QuerySummary(const bdNodeId *id, bdQuerySummary &query); + + int result(bdNodeId *target, std::list &answer); + int proxies(bdNodeId *target, std::list &answer); + int potentialProxies(bdNodeId *target, std::list &answer); + + private: + + int getResults(bdNodeId *target, std::list &answer, int querytype); + + /* NB: No Mutex Protection... Single threaded, Mutex at higher level! + */ + + bdSpace *mNodeSpace; + bdDhtFunctions *mFns; + bdNodePublisher *mPub; + + std::list mLocalQueries; +}; + + + +#endif // BITDHT_QUERY_MANAGER_H diff --git a/libbitdht/src/bitdht/bdstddht.cc b/libbitdht/src/bitdht/bdstddht.cc index 281f90f2f..a8872bcde 100644 --- a/libbitdht/src/bitdht/bdstddht.cc +++ b/libbitdht/src/bitdht/bdstddht.cc @@ -75,22 +75,29 @@ void bdStdZeroNodeId(bdNodeId *id) // can could end-up with the wrong port. // However this only matters with firewalled peers anyway. // So not too serious. -uint32_t bdStdSimilarId(const bdId *n1, const bdId *n2) +bool bdStdSimilarId(const bdId *n1, const bdId *n2) { if (n1->id == n2->id) { if (n1->addr.sin_addr.s_addr == n2->addr.sin_addr.s_addr) { - return 1; + return true; } } - return 0; + return false; } -void bdStdUpdateSimilarId(bdId *dest, const bdId *src) +bool bdStdUpdateSimilarId(bdId *dest, const bdId *src) { /* only difference that's currently allowed */ + if (dest->addr.sin_port == src->addr.sin_port) + { + /* no update required */ + return false; + } + dest->addr.sin_port = src->addr.sin_port; + return true; } @@ -274,13 +281,13 @@ int bdStdDht::bdBucketDistance(const bdMetric *metric) } -uint32_t bdStdDht::bdSimilarId(const bdId *id1, const bdId *id2) +bool bdStdDht::bdSimilarId(const bdId *id1, const bdId *id2) { return bdStdSimilarId(id1, id2); } -void bdStdDht::bdUpdateSimilarId(bdId *dest, const bdId *src) +bool bdStdDht::bdUpdateSimilarId(bdId *dest, const bdId *src) { return bdStdUpdateSimilarId(dest, src); } diff --git a/libbitdht/src/bitdht/bdstddht.h b/libbitdht/src/bitdht/bdstddht.h index be70db624..71e1b44ce 100644 --- a/libbitdht/src/bitdht/bdstddht.h +++ b/libbitdht/src/bitdht/bdstddht.h @@ -76,8 +76,8 @@ virtual int bdDistance(const bdNodeId *n1, const bdNodeId *n2, bdMetric *metric) virtual int bdBucketDistance(const bdNodeId *n1, const bdNodeId *n2); virtual int bdBucketDistance(const bdMetric *metric); -virtual uint32_t bdSimilarId(const bdId *id1, const bdId *id2); -virtual void bdUpdateSimilarId(bdId *dest, const bdId *src); +virtual bool bdSimilarId(const bdId *id1, const bdId *id2); +virtual bool bdUpdateSimilarId(bdId *dest, const bdId *src); /* returns true if update was necessary */ virtual void bdRandomMidId(const bdNodeId *target, const bdNodeId *other, bdNodeId *mid); diff --git a/libbitdht/src/bitdht/bdstore.cc b/libbitdht/src/bitdht/bdstore.cc index 9921c6f92..10faba3b4 100644 --- a/libbitdht/src/bitdht/bdstore.cc +++ b/libbitdht/src/bitdht/bdstore.cc @@ -101,6 +101,7 @@ int bdStore::reloadFromStore() } +// This is a very ugly function! int bdStore::getPeer(bdPeer *peer) { #ifdef DEBUG_STORE @@ -119,6 +120,34 @@ int bdStore::getPeer(bdPeer *peer) return 0; } +int bdStore::filterIpList(const std::list &filteredIPs) +{ + // Nasty O(n^2) iteration over 500 entries!!!. + // hope its not used to often. + + std::list::const_iterator it; + for(it = filteredIPs.begin(); it != filteredIPs.end(); it++) + { + std::list::iterator sit; + for(sit = store.begin(); sit != store.end();) + { + if (it->sin_addr.s_addr == sit->mPeerId.addr.sin_addr.s_addr) + { + std::cerr << "bdStore::filterIpList() Found Bad entry in Store. Erasing!"; + std::cerr << std::endl; + + sit = store.erase(sit); + } + else + { + sit++; + } + } + } +} + + + #define MAX_ENTRIES 500 /* maintain a sorted list */ @@ -219,3 +248,5 @@ void bdStore::writeStore() return writeStore(mStoreFile); } + + diff --git a/libbitdht/src/bitdht/bdstore.h b/libbitdht/src/bitdht/bdstore.h index 51f566aee..c1b0f7b03 100644 --- a/libbitdht/src/bitdht/bdstore.h +++ b/libbitdht/src/bitdht/bdstore.h @@ -38,6 +38,7 @@ class bdStore bdStore(std::string file, bdDhtFunctions *fns); int reloadFromStore(); /* for restarts */ +int filterIpList(const std::list &filteredIPs); int clear(); int getPeer(bdPeer *peer); diff --git a/libbitdht/src/libbitdht.pro b/libbitdht/src/libbitdht.pro index 0172ab35d..dd7bb73c2 100644 --- a/libbitdht/src/libbitdht.pro +++ b/libbitdht/src/libbitdht.pro @@ -107,6 +107,7 @@ HEADERS += \ bitdht/bdconnection.h \ bitdht/bdfilter.h \ bitdht/bdaccount.h \ + bitdht/bdquerymgr.h \ SOURCES += \ bitdht/bencode.c \ @@ -129,5 +130,6 @@ SOURCES += \ bitdht/bdconnection.cc \ bitdht/bdfilter.cc \ bitdht/bdaccount.cc \ + bitdht/bdquerymgr.cc \