mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-04-23 16:39:16 -04:00
Various BugFixes and extra debugging to get Proxy Connections Working.
* Added Lots of Debugging! * Added a couple of operator<<() fns. * Added bdSpace::find_node() to find Destination Address. * Added search for Dest IpAddr before Proxy Authentication. * Added NOK ConnectResponse Msg if destination address unknown. * Tweaked bdConnection::ConnectRequestProxy() to include proxy address. git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5-peernet@4268 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
b22a2242ab
commit
d83c58f3f5
@ -80,7 +80,7 @@ void bdNode::msgout_connect_genmsg(bdId *id, bdToken *transId, int msgtype, bdId
|
||||
std::cerr << "bdNode::msgout_connect_genmsg() Type: " << getConnectMsgType(msgtype);
|
||||
std::cerr << " TransId: ";
|
||||
bdPrintTransId(std::cerr, transId);
|
||||
std::cerr << " From: ";
|
||||
std::cerr << " To: ";
|
||||
mFns->bdPrintId(std::cerr, id);
|
||||
std::cerr << " SrcAddr: ";
|
||||
mFns->bdPrintId(std::cerr, srcAddr);
|
||||
@ -581,7 +581,7 @@ void bdNode::AuthConnectionOk(bdId *srcId, bdId *proxyId, bdId *destId, int mode
|
||||
{
|
||||
/* otherwise we are the proxy (for either), pass on the request */
|
||||
|
||||
/* XXX SEARCH for ID of peer */
|
||||
/* SEARCH for IP:Port of destination is done before AUTH */
|
||||
|
||||
conn->AuthoriseProxyConnection(srcId, proxyId, destId, mode, loc);
|
||||
|
||||
@ -789,6 +789,19 @@ int operator==(const bdProxyTuple &a, const bdProxyTuple &b)
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::ostream &operator<<(std::ostream &out, const bdProxyTuple &t)
|
||||
{
|
||||
out << "[---";
|
||||
bdStdPrintNodeId(out, &(t.srcId));
|
||||
out << "---";
|
||||
bdStdPrintNodeId(out, &(t.proxyId));
|
||||
out << "---";
|
||||
bdStdPrintNodeId(out, &(t.destId));
|
||||
out << "---]";
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
bdConnection::bdConnection()
|
||||
{
|
||||
///* Connection State, and TimeStamp of Update */
|
||||
@ -843,12 +856,17 @@ bdConnection *bdNode::findSimilarConnection(bdNodeId *srcId, bdNodeId *destId)
|
||||
bdConnection *bdNode::findExistingConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId)
|
||||
{
|
||||
bdProxyTuple tuple(srcId, proxyId, destId);
|
||||
|
||||
std::cerr << "bdNode::findExistingConnection() Looking For: " << tuple << std::endl;
|
||||
|
||||
std::map<bdProxyTuple, bdConnection>::iterator it = mConnections.find(tuple);
|
||||
if (it == mConnections.end())
|
||||
{
|
||||
std::cerr << "bdNode::findExistingConnection() Failed to Find: " << tuple << std::endl;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
std::cerr << "bdNode::findExistingConnection() Found: " << tuple << std::endl;
|
||||
return &(it->second);
|
||||
}
|
||||
|
||||
@ -857,10 +875,13 @@ bdConnection *bdNode::newConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId
|
||||
bdProxyTuple tuple(srcId, proxyId, destId);
|
||||
bdConnection conn;
|
||||
|
||||
std::cerr << "bdNode::newConnection() Installing: " << tuple << std::endl;
|
||||
|
||||
mConnections[tuple] = conn;
|
||||
std::map<bdProxyTuple, bdConnection>::iterator it = mConnections.find(tuple);
|
||||
if (it == mConnections.end())
|
||||
{
|
||||
std::cerr << "bdNode::newConnection() ERROR Installing: " << tuple << std::endl;
|
||||
return NULL;
|
||||
}
|
||||
return &(it->second);
|
||||
@ -871,9 +892,12 @@ int bdNode::cleanConnection(bdNodeId *srcId, bdNodeId *proxyId, bdNodeId *destId
|
||||
bdProxyTuple tuple(srcId, proxyId, destId);
|
||||
bdConnection conn;
|
||||
|
||||
std::cerr << "bdNode::cleanConnection() Removing: " << tuple << std::endl;
|
||||
|
||||
std::map<bdProxyTuple, bdConnection>::iterator it = mConnections.find(tuple);
|
||||
if (it == mConnections.end())
|
||||
{
|
||||
std::cerr << "bdNode::cleanConnection() ERROR Removing: " << tuple << std::endl;
|
||||
return 0;
|
||||
}
|
||||
mConnections.erase(it);
|
||||
@ -1029,15 +1053,77 @@ 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 << std::endl;
|
||||
|
||||
point = BD_PROXY_CONNECTION_MID_POINT;
|
||||
|
||||
conn->ConnectionRequestProxy(id, srcConnAddr, destConnAddr, mode);
|
||||
/* SEARCH for IP:Port of destination before AUTH */
|
||||
int numNodes = 10;
|
||||
std::list<bdId> matchingIds;
|
||||
|
||||
callbackConnect(&(conn->mSrcId),&(conn->mProxyId),&(conn->mDestId),
|
||||
std::cerr << "bdNode::recvedConnectionRequest() WARNING searching for \"VERSION\" flag... TO FIX LATER";
|
||||
std::cerr << std::endl;
|
||||
|
||||
uint32_t with_flag = BITDHT_PEER_STATUS_DHT_VERSION;
|
||||
//BITDHT_PEER_STATUS_DHT_APPL | BITDHT_PEER_STATUS_DHT_VERSION);
|
||||
|
||||
bool proxyOk = false;
|
||||
bdId destId;
|
||||
|
||||
if (mNodeSpace.find_node(&(destConnAddr->id), numNodes, matchingIds, with_flag))
|
||||
{
|
||||
std::cerr << "bdNode::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 << std::endl;
|
||||
}
|
||||
|
||||
proxyOk = true;
|
||||
destId = matchingIds.front();
|
||||
}
|
||||
|
||||
if (proxyOk)
|
||||
{
|
||||
std::cerr << "bdNode::recvedConnectionRequest() Proxy Addr Ok: ";
|
||||
bdStdPrintId(std::cerr, destConnAddr);
|
||||
std::cerr << "asking for AUTH to continue";
|
||||
std::cerr << std::endl;
|
||||
|
||||
conn->ConnectionRequestProxy(id, srcConnAddr, &mOwnId, &destId, mode);
|
||||
|
||||
callbackConnect(&(conn->mSrcId),&(conn->mProxyId),&(conn->mDestId),
|
||||
conn->mMode, conn->mPoint, BITDHT_CONNECT_CB_AUTH);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* clean up connection... its not going to work */
|
||||
std::cerr << "bdNode::recvedConnectionRequest() ERROR 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;
|
||||
int status = BITDHT_CONNECT_ANSWER_NOK; /* NO DEST ADDRESS */
|
||||
msgout_connect_genmsg(id, &transId, msgtype, srcConnAddr, destConnAddr, mode, status);
|
||||
|
||||
/* remove connection */
|
||||
bdNode::cleanConnectionBySender(id, srcConnAddr, destConnAddr);
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cerr << "bdNode::recvedConnectionRequest() END Proxy/Relay Connection, asking for AUTH to continue";
|
||||
std::cerr << std::endl;
|
||||
|
||||
point = BD_PROXY_CONNECTION_END_POINT;
|
||||
|
||||
conn->ConnectionRequestEnd(id, srcConnAddr, destConnAddr, mode);
|
||||
@ -1078,6 +1164,7 @@ int bdNode::recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAdd
|
||||
default: /* NEVER EXPECT THIS */
|
||||
{
|
||||
|
||||
|
||||
/* Only situation we expect this, is if the connection is not allowed.
|
||||
* DEST has sent back an ERROR Message
|
||||
*/
|
||||
@ -1085,11 +1172,19 @@ int bdNode::recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAdd
|
||||
if ((status == BITDHT_CONNECT_ANSWER_NOK) && (conn->mPoint == BD_PROXY_CONNECTION_START_POINT))
|
||||
{
|
||||
/* connection is killed */
|
||||
std::cerr << "bdNode::recvedConnectionReply() Connection Rejected, Killing It: ";
|
||||
std::cerr << std::endl;
|
||||
std::cerr << *conn;
|
||||
std::cerr << std::endl;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/* ERROR in protocol */
|
||||
std::cerr << "bdNode::recvedConnectionReply() ERROR Unexpected Message, Killing It: ";
|
||||
std::cerr << std::endl;
|
||||
std::cerr << *conn;
|
||||
std::cerr << std::endl;
|
||||
}
|
||||
|
||||
/* do Callback for Failed Connection */
|
||||
@ -1108,9 +1203,16 @@ int bdNode::recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAdd
|
||||
/* We are proxy. and OK / NOK for connection proceed.
|
||||
*/
|
||||
|
||||
std::cerr << "bdNode::recvedConnectionReply() ERROR Unexpected Message, Killing It: ";
|
||||
std::cerr << std::endl;
|
||||
std::cerr << *conn;
|
||||
std::cerr << std::endl;
|
||||
|
||||
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 << std::endl;
|
||||
|
||||
/* Upgrade Connection to Finishing Mode */
|
||||
conn->upgradeProxyConnectionToFinish(id, srcConnAddr, destConnAddr, mode, status);
|
||||
@ -1118,9 +1220,17 @@ int bdNode::recvedConnectionReply(bdId *id, bdId *srcConnAddr, bdId *destConnAdd
|
||||
/* do Callback for Pending Connection */
|
||||
callbackConnect(&(conn->mSrcId),&(conn->mProxyId),&(conn->mDestId),
|
||||
conn->mMode, conn->mPoint, BITDHT_CONNECT_CB_PENDING);
|
||||
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
std::cerr << "bdNode::recvedConnectionReply() @MIDPOINT Some ERROR, Killing It: ";
|
||||
std::cerr << std::endl;
|
||||
std::cerr << *conn;
|
||||
std::cerr << std::endl;
|
||||
|
||||
/* do Callback for Failed Connection */
|
||||
callbackConnect(&(conn->mSrcId),&(conn->mProxyId),&(conn->mDestId),
|
||||
conn->mMode, conn->mPoint, BITDHT_CONNECT_CB_FAILED);
|
||||
@ -1255,7 +1365,7 @@ int bdNode::recvedConnectionAck(bdId *id, bdId *srcConnAddr, bdId *destConnAddr,
|
||||
{
|
||||
/* ERROR */
|
||||
#ifdef DEBUG_NODE_CONNECTION
|
||||
std::cerr << "bdNode::recvedConnectionStart() ERROR NO EXISTING CONNECTION";
|
||||
std::cerr << "bdNode::recvedConnectionAck() ERROR NO EXISTING CONNECTION";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
return 0;
|
||||
@ -1264,29 +1374,43 @@ 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 << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* check state */
|
||||
if (conn->mState != BITDHT_CONNECTION_WAITING_ACK)
|
||||
{
|
||||
/* ERROR */
|
||||
std::cerr << "bdNode::recvedConnectionAck() conn->mState != WAITING_ACK, actual State: " << conn->mState;
|
||||
std::cerr << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (id->id == srcConnAddr->id)
|
||||
{
|
||||
std::cerr << "bdNode::recvedConnectionAck() from Src, marking So";
|
||||
std::cerr << std::endl;
|
||||
|
||||
/* recved Ack from source */
|
||||
conn->mSrcAck = true;
|
||||
}
|
||||
else if (id->id == destConnAddr->id)
|
||||
{
|
||||
std::cerr << "bdNode::recvedConnectionAck() from Dest, marking So";
|
||||
std::cerr << std::endl;
|
||||
/* recved Ack from dest */
|
||||
conn->mDestAck = true;
|
||||
}
|
||||
|
||||
if (conn->mSrcAck && conn->mDestAck)
|
||||
{
|
||||
std::cerr << "bdNode::recvedConnectionAck() ACKs from Both Src & Dest, Connection Complete: callback & cleanup";
|
||||
std::cerr << std::endl;
|
||||
|
||||
/* connection complete! cleanup */
|
||||
if (conn->mMode == BITDHT_CONNECT_MODE_DIRECT)
|
||||
{
|
||||
@ -1364,13 +1488,13 @@ int bdConnection::ConnectionRequestDirect(bdId *id, bdId *srcConnAddr, bdId *des
|
||||
|
||||
|
||||
// Proxy Connection initialised at Proxy (MID_POINT), prior to Auth.
|
||||
int bdConnection::ConnectionRequestProxy(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode)
|
||||
int bdConnection::ConnectionRequestProxy(bdId *id, bdId *srcConnAddr, bdNodeId *ownId, bdId *destConnAddr, int mode)
|
||||
{
|
||||
mState = BITDHT_CONNECTION_WAITING_AUTH;
|
||||
mLastEvent = time(NULL);
|
||||
mSrcId = *id;
|
||||
mDestId = *destConnAddr; /* self, IP unknown */
|
||||
//mProxyId = *id; /* own id, doesn't matter */
|
||||
mProxyId.id = *ownId; /* own id, must be set for callback */
|
||||
|
||||
mPoint = BD_PROXY_CONNECTION_MID_POINT;
|
||||
mMode = mode;
|
||||
@ -1579,3 +1703,43 @@ std::ostream &operator<<(std::ostream &out, const bdConnectionRequest &req)
|
||||
return out;
|
||||
}
|
||||
|
||||
std::ostream &operator<<(std::ostream &out, const bdConnection &conn)
|
||||
{
|
||||
time_t now = time(NULL);
|
||||
out << "bdConnection: ";
|
||||
out << "State: " << conn.mState;
|
||||
out << " LastEvent: " << now - conn.mLastEvent;
|
||||
out << " Point: " << conn.mPoint;
|
||||
out << " Mode: " << conn.mMode;
|
||||
out << std::endl;
|
||||
|
||||
out << "\tsrcId: ";
|
||||
bdStdPrintId(out, &(conn.mSrcId));
|
||||
out << std::endl;
|
||||
out << "\tproxyId: ";
|
||||
bdStdPrintId(out, &(conn.mProxyId));
|
||||
out << std::endl;
|
||||
out << "\tdestId: ";
|
||||
bdStdPrintId(out, &(conn.mDestId));
|
||||
out << std::endl;
|
||||
|
||||
out << "\tsrcConnAddr: ";
|
||||
bdStdPrintId(out, &(conn.mSrcConnAddr));
|
||||
out << std::endl;
|
||||
|
||||
out << "\tdestConnAddr: ";
|
||||
bdStdPrintId(out, &(conn.mDestConnAddr));
|
||||
out << std::endl;
|
||||
|
||||
out << "\tretryCount: " << conn.mRetryCount;
|
||||
out << " retryCount: " << conn.mLastStart;
|
||||
out << " srcAck: " << conn.mSrcAck;
|
||||
out << " destAck: " << conn.mDestAck;
|
||||
out << " completedTS: " << now - conn.mCompletedTS;
|
||||
out << std::endl;
|
||||
|
||||
return out;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -66,6 +66,7 @@ class bdProxyTuple
|
||||
bdNodeId destId;
|
||||
};
|
||||
|
||||
std::ostream &operator<(std::ostream &out, const bdProxyTuple &t);
|
||||
int operator<(const bdProxyTuple &a, const bdProxyTuple &b);
|
||||
int operator==(const bdProxyTuple &a, const bdProxyTuple &b);
|
||||
|
||||
@ -82,7 +83,7 @@ class bdConnection
|
||||
|
||||
// Initialise a new Connection. (receiving a Connection Request)
|
||||
int ConnectionRequestDirect(bdId *id, bdId *srcConnAddr, bdId *destConnAddr);
|
||||
int ConnectionRequestProxy(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode);
|
||||
int ConnectionRequestProxy(bdId *id, bdId *srcConnAddr, bdNodeId *ownId, bdId *destConnAddr, int mode);
|
||||
int ConnectionRequestEnd(bdId *id, bdId *srcConnAddr, bdId *destConnAddr, int mode);
|
||||
|
||||
// Setup Finishing Stage, (receiving a Connection Reply).
|
||||
@ -148,6 +149,7 @@ class bdConnectionRequest
|
||||
};
|
||||
|
||||
std::ostream &operator<<(std::ostream &out, const bdConnectionRequest &req);
|
||||
std::ostream &operator<<(std::ostream &out, const bdConnection &conn);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -261,7 +261,7 @@ void bdNodeManager::iteration()
|
||||
//#define MAX_FINDSELF_TIME 60
|
||||
//#define MIN_OP_SPACE_SIZE 20
|
||||
#define MAX_FINDSELF_TIME 10
|
||||
#define MIN_OP_SPACE_SIZE 3 // for testing.
|
||||
#define MIN_OP_SPACE_SIZE 2 // for testing. self + oneother.
|
||||
|
||||
{
|
||||
uint32_t nodeSpaceSize = mNodeSpace.calcSpaceSize();
|
||||
@ -280,7 +280,7 @@ void bdNodeManager::iteration()
|
||||
|
||||
if (modeAge > MAX_FINDSELF_TIME)
|
||||
{
|
||||
if (nodeSpaceSize > MIN_OP_SPACE_SIZE)
|
||||
if (nodeSpaceSize >= MIN_OP_SPACE_SIZE)
|
||||
{
|
||||
mMode = BITDHT_MGR_STATE_REFRESH;
|
||||
mModeTS = now;
|
||||
|
@ -445,6 +445,74 @@ 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<bdId> &matchIds, uint32_t with_flag)
|
||||
{
|
||||
bdMetric dist;
|
||||
mFns->bdDistance(id, &(mOwnId), &dist);
|
||||
int buckno = mFns->bdBucketDistance(&dist);
|
||||
|
||||
std::cerr << "bdSpace::find_node(NodeId:";
|
||||
mFns->bdPrintNodeId(std::cerr, id);
|
||||
std::cerr << ")";
|
||||
|
||||
std::cerr << " Number: " << number;
|
||||
std::cerr << " Bucket #: " << buckno;
|
||||
std::cerr << std::endl;
|
||||
#ifdef DEBUG_BD_SPACE
|
||||
#endif
|
||||
|
||||
bdBucket &buck = buckets[buckno];
|
||||
|
||||
std::list<bdPeer>::iterator eit;
|
||||
int matchCount = 0;
|
||||
for(eit = buck.entries.begin(); eit != buck.entries.end(); eit++)
|
||||
{
|
||||
std::cerr << "bdSpace::find_node() Checking Against Peer: ";
|
||||
mFns->bdPrintId(std::cerr, &(eit->mPeerId));
|
||||
std::cerr << " withFlags: " << eit->mPeerFlags;
|
||||
std::cerr << std::endl;
|
||||
|
||||
if ((!with_flag) || (with_flag & eit->mPeerFlags))
|
||||
{
|
||||
if (*id == eit->mPeerId.id)
|
||||
{
|
||||
matchIds.push_back(eit->mPeerId);
|
||||
matchCount++;
|
||||
|
||||
std::cerr << "bdSpace::find_node() Found Matching Peer: ";
|
||||
mFns->bdPrintId(std::cerr, &(eit->mPeerId));
|
||||
std::cerr << " withFlags: " << eit->mPeerFlags;
|
||||
std::cerr << std::endl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (*id == eit->mPeerId.id)
|
||||
{
|
||||
//matchIds.push_back(eit->mPeerId);
|
||||
//matchCount++;
|
||||
|
||||
std::cerr << "bdSpace::find_node() Found (WITHOUT FLAGS) Matching Peer: ";
|
||||
mFns->bdPrintId(std::cerr, &(eit->mPeerId));
|
||||
std::cerr << " withFlags: " << eit->mPeerFlags;
|
||||
std::cerr << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::cerr << "bdSpace::find_node() Found " << matchCount << " Matching Peers";
|
||||
std::cerr << std::endl << std::endl;
|
||||
#ifdef DEBUG_BD_SPACE
|
||||
#endif
|
||||
|
||||
return matchCount;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int bdSpace::out_of_date_peer(bdId &id)
|
||||
{
|
||||
/*
|
||||
|
@ -161,6 +161,9 @@ int find_nearest_nodes_with_flags(const bdNodeId *id, int number,
|
||||
std::list<bdId> excluding,
|
||||
std::multimap<bdMetric, bdId> &nearest, uint32_t with_flag);
|
||||
|
||||
int find_node(const bdNodeId *id, int number,
|
||||
std::list<bdId> &matchIds, uint32_t with_flag);
|
||||
|
||||
int out_of_date_peer(bdId &id); // side-effect updates, send flag on peer.
|
||||
int add_peer(const bdId *id, uint32_t mode);
|
||||
int printDHT();
|
||||
|
Loading…
x
Reference in New Issue
Block a user