Fixed up BITDHT versioning.

* Advertises client as DBxxxx where xxxx is provided by using app.
  * Added COMPILE switches to enable ANONYMOUS version or remove BD portion.
  * Fixed version code.
  * Added slow increase in retry timeout, to reduce DHT traffic over time.
      now RETRY PERIOD = query age / 2  
  * initialised bdToken bdVersion etc length.
  * new bdboot.txt 



git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@3615 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
drbob 2010-10-05 21:57:22 +00:00
parent d31cef0f11
commit cc5fa5e5dc
9 changed files with 268 additions and 208 deletions

View file

@ -681,8 +681,6 @@ void bdNode::msgout_ping(bdId *id, bdToken *transId)
void bdNode::msgout_pong(bdId *id, bdToken *transId)
{
char version[5] = "RS50";
#ifdef DEBUG_NODE_MSGOUT
std::cerr << "bdNode::msgout_pong() TransId: ";
bdPrintTransId(std::cerr, transId);
@ -696,8 +694,13 @@ void bdNode::msgout_pong(bdId *id, bdToken *transId)
/* generate message, send to udp */
bdToken vid;
memcpy(vid.data, version, 5);
vid.len = 4;
int vlen = BITDHT_TOKEN_MAX_LEN;
if (mDhtVersion.size() < vlen)
{
vlen = mDhtVersion.size();
}
memcpy(vid.data, mDhtVersion.c_str(), vlen);
vid.len = vlen;
char msg[10240];
int avail = 10240;
@ -931,7 +934,19 @@ void bdNode::sendPkt(char *msg, int len, struct sockaddr_in addr)
void bdNode::recvPkt(char *msg, int len, struct sockaddr_in addr)
{
#ifdef DEBUG_NODE_PARSE
fprintf(stderr, "bdNode::recvPkt()\n");
std::cerr << "bdNode::recvPkt() msg[" << len << "] = ";
for(int i = 0; i < len; i++)
{
if ((msg[i] > 31) && (msg[i] < 127))
{
std::cerr << msg[i];
}
else
{
std::cerr << "[" << (int) msg[i] << "]";
}
}
std::cerr << std::endl;
#endif
/* convert to a be_node */
@ -1035,7 +1050,7 @@ void bdNode::recvPkt(char *msg, int len, struct sockaddr_in addr)
bdToken versionId;
if (beType == BITDHT_MSG_TYPE_PONG)
{
be_version = beMsgGetDictNode(be_data, "version");
be_version = beMsgGetDictNode(node, "v");
if (!be_version)
{
#ifdef DEBUG_NODE_PARSE
@ -1050,7 +1065,6 @@ void bdNode::recvPkt(char *msg, int len, struct sockaddr_in addr)
beMsgGetToken(be_version, versionId);
}
/*********** handle target (query) or info_hash (get_hash) ************/
bdNodeId target_info_hash;
be_node *be_target = NULL;
@ -1202,7 +1216,15 @@ void bdNode::recvPkt(char *msg, int len, struct sockaddr_in addr)
mFns->bdPrintId(std::cerr, &srcId);
std::cerr << std::endl;
#endif
msgin_pong(&srcId, &transId, &versionId);
if (be_version)
{
msgin_pong(&srcId, &transId, &versionId);
}
else
{
msgin_pong(&srcId, &transId, NULL);
}
break;
}
case BITDHT_MSG_TYPE_FIND_NODE: /* a: id, transId, target */
@ -1361,40 +1383,50 @@ void bdNode::msgin_pong(bdId *id, bdToken *transId, bdToken *versionId)
#endif
/* check two bytes */
if ((versionId->len > 2) && (mDhtVersion.size() > 2) &&
if ((versionId->len >= 2) && (mDhtVersion.size() >= 2) &&
(versionId->data[0] == mDhtVersion[0]) && (versionId->data[1] == mDhtVersion[1]))
{
sameDhtEngine = true;
}
/* check two bytes */
if ((versionId->len > 4) && (mDhtVersion.size() > 4) &&
if ((versionId->len >= 4) && (mDhtVersion.size() >= 4) &&
(versionId->data[2] == mDhtVersion[2]) && (versionId->data[3] == mDhtVersion[3]))
{
sameAppl = true;
}
/* check two bytes */
if ((versionId->len > 6) && (mDhtVersion.size() > 6) &&
if ((versionId->len >= 6) && (mDhtVersion.size() >= 6) &&
(versionId->data[4] == mDhtVersion[4]) && (versionId->data[5] == mDhtVersion[5]))
{
sameVersion = true;
}
}
else
{
#ifdef DEBUG_NODE_MSGIN
std::cerr << "bdNode::msgin_pong() No Version";
std::cerr << std::endl;
#endif
}
uint32_t peerflags = BITDHT_PEER_STATUS_RECV_PONG; /* should have id too */
if (sameDhtEngine)
{
peerflags = BITDHT_PEER_STATUS_DHT_ENGINE;
peerflags |= BITDHT_PEER_STATUS_DHT_ENGINE;
}
if (sameAppl)
{
peerflags = BITDHT_PEER_STATUS_DHT_APPL;
peerflags |= BITDHT_PEER_STATUS_DHT_APPL;
}
if (sameVersion)
{
peerflags = BITDHT_PEER_STATUS_DHT_VERSION;
peerflags |= BITDHT_PEER_STATUS_DHT_VERSION;
}
addPeer(id, peerflags);