mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-12-24 15:09:33 -05:00
A series of small bugfixes - as we head towards the first v0.4 release.
* Added stun bootstrap functionality. * Added in two temporary StunServers. * Reconnect attempts are TCP only. * enabled AUTOCONNECT and TCP Connections. * reduced UDP keepAlive timer to 15 secs. * made UPnP the default startup behaviour. * Removed StunId raw printouts -> now use BinToHex() * Unified TTLS and PERIODS in p3dhtmgr.h * DHT bugfix (data not passed to ConnMgr). git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@370 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
63828f77a8
commit
85aa75ef5d
@ -30,6 +30,7 @@
|
||||
#include <sstream>
|
||||
|
||||
#include "util/rsnet.h"
|
||||
#include "util/rsprint.h"
|
||||
|
||||
const std::string openDHT_Client = "Retroshare V0.4";
|
||||
const std::string openDHT_Agent = "RS-HTTP-V0.4";
|
||||
@ -303,7 +304,7 @@ bool OpenDHTClient::publishKey(std::string key, std::string value, uint32_t ttl)
|
||||
{
|
||||
/* create request */
|
||||
#ifdef OPENDHT_DEBUG
|
||||
std::cerr << "OpenDHTClient::openDHT_publishKey() key: " << key << " value: " << value;
|
||||
std::cerr << "OpenDHTClient::openDHT_publishKey() key: 0x" << RsUtil::BinToHex(key) << " value: 0x" << RsUtil::BinToHex(value);
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
std::string putmsg = createOpenDHT_put(key, value, ttl, openDHT_Client);
|
||||
@ -391,7 +392,7 @@ bool OpenDHTClient::searchKey(std::string key, std::list<std::string> &values)
|
||||
{
|
||||
std::cerr << "openDHT_searchKey() Value:" << value << ":END:" << std::endl;
|
||||
std::string result = convertFromBase64(value);
|
||||
std::cerr << "openDHT_searchKey() Result:" << result << ":END:" << std::endl;
|
||||
std::cerr << "openDHT_searchKey() Result: 0x" << RsUtil::BinToHex(result) << ":END:" << std::endl;
|
||||
values.push_back(result);
|
||||
}
|
||||
|
||||
|
@ -45,16 +45,24 @@ const uint32_t RS_STUN_LIST_MIN = 100;
|
||||
|
||||
const uint32_t MAX_UPNP_INIT = 60; /* seconds UPnP timeout */
|
||||
|
||||
#define CONN_DEBUG 1
|
||||
#define P3CONNMGR_NO_TCP_CONNECTIONS 1
|
||||
|
||||
/****
|
||||
* #define CONN_DEBUG 1
|
||||
***/
|
||||
/****
|
||||
* #define P3CONNMGR_NO_TCP_CONNECTIONS 1
|
||||
***/
|
||||
/****
|
||||
* #define P3CONNMGR_NO_AUTO_CONNECTION 1
|
||||
***/
|
||||
|
||||
#define CONN_DEBUG 1
|
||||
|
||||
const uint32_t P3CONNMGR_TCP_DEFAULT_DELAY = 10; /* 10 Seconds should be enough! */
|
||||
const uint32_t P3CONNMGR_UDP_DHT_DELAY = 300 + 60; /* 5 minutes FIND + 1 minute for DHT POST */
|
||||
const uint32_t P3CONNMGR_UDP_PROXY_DELAY = 30; /* 30 seconds */
|
||||
const uint32_t P3CONNMGR_UDP_DHT_DELAY = DHT_NOTIFY_PERIOD + 60; /* + 1 minute for DHT POST */
|
||||
const uint32_t P3CONNMGR_UDP_PROXY_DELAY = 30; /* 30 seconds (NOT IMPLEMENTED YET!) */
|
||||
|
||||
#define MAX_AVAIL_PERIOD (2 * DHT_NOTIFY_PERIOD) // If we haven't connected in 2 DHT periods.
|
||||
#define MIN_RETRY_PERIOD (DHT_CHECK_PERIOD + 120) // just over DHT CHECK_PERIOD
|
||||
|
||||
void printConnectState(peerConnectState &peer);
|
||||
|
||||
@ -263,10 +271,19 @@ void p3ConnectMgr::netStartup()
|
||||
|
||||
case RS_NET_MODE_TRY_UPNP:
|
||||
default:
|
||||
/* Force it here (could be default!) */
|
||||
ownState.netMode |= RS_NET_MODE_TRY_UPNP;
|
||||
ownState.netMode |= RS_NET_MODE_UDP;
|
||||
mNetStatus = RS_NET_UPNP_INIT;
|
||||
break;
|
||||
}
|
||||
|
||||
/* add Bootstrap Peers if we've got none from config */
|
||||
if (mStunList.size() < 1)
|
||||
{
|
||||
addBootstrapStunPeers();
|
||||
}
|
||||
|
||||
connMtx.unlock(); /* UNLOCK MUTEX */
|
||||
}
|
||||
|
||||
@ -279,8 +296,6 @@ void p3ConnectMgr::tick()
|
||||
|
||||
}
|
||||
|
||||
#define MAX_AVAIL_PERIOD 900 // 15 minutes
|
||||
#define MIN_RETRY_PERIOD 1900 // just over 30 minutes. (DHT retry period)
|
||||
|
||||
void p3ConnectMgr::statusTick()
|
||||
{
|
||||
@ -338,7 +353,7 @@ void p3ConnectMgr::statusTick()
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
/* retry it! */
|
||||
retryConnect(*it2);
|
||||
retryConnectTCP(*it2);
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -1606,7 +1621,13 @@ void p3ConnectMgr::peerStatus(std::string id,
|
||||
std::cerr << "p3ConnectMgr::peerStatus() ALREADY IN CONNECT ATTEMPT: ";
|
||||
std::cerr << " id: " << id;
|
||||
std::cerr << std::endl;
|
||||
|
||||
/* -> it'll automatically use the addresses */
|
||||
|
||||
std::cerr << "p3ConnectMgr::peerStatus() Resulting Peer State:" << std::endl;
|
||||
printConnectState(it->second);
|
||||
std::cerr << std::endl;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1628,6 +1649,10 @@ void p3ConnectMgr::peerStatus(std::string id,
|
||||
std::cerr << std::endl;
|
||||
}
|
||||
|
||||
std::cerr << "p3ConnectMgr::peerStatus() Resulting Peer State:" << std::endl;
|
||||
printConnectState(it->second);
|
||||
std::cerr << std::endl;
|
||||
|
||||
}
|
||||
|
||||
void p3ConnectMgr::peerConnectRequest(std::string id, struct sockaddr_in raddr,
|
||||
@ -2674,3 +2699,22 @@ void printConnectState(peerConnectState &peer)
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool p3ConnectMgr::addBootstrapStunPeers()
|
||||
{
|
||||
std::string id;
|
||||
|
||||
// Two Defaults for The Initial Release.
|
||||
id = "7ad672ea4d4af8560d5230aff3c88b59";
|
||||
mStunList.push_back(RsUtil::HashId(id, false));
|
||||
|
||||
id = "8ad7c08e7778e0289de04843bf57a6ae";
|
||||
mStunList.push_back(RsUtil::HashId(id, false));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -248,6 +248,7 @@ void udpStunPeer(std::string id, struct sockaddr_in &addr);
|
||||
void stunInit();
|
||||
bool stunCheck();
|
||||
void stunCollect(std::string id, struct sockaddr_in addr, uint32_t flags);
|
||||
bool addBootstrapStunPeers();
|
||||
|
||||
/* monitor control */
|
||||
void tickMonitors();
|
||||
|
@ -53,22 +53,13 @@
|
||||
#define DHT_STATE_FIND_STUN 3
|
||||
#define DHT_STATE_ACTIVE 4
|
||||
|
||||
/* TIMEOUTS */
|
||||
#define DHT_SEARCH_PERIOD 1800 /* PeerKeys: if we haven't found them: 30 min */
|
||||
#define DHT_CHECK_PERIOD 1800 /* PeerKeys: re-lookup peer: 30 min */
|
||||
#define DHT_PUBLISH_PERIOD 900 /* OwnKey 30 min (15 minutes for now) */
|
||||
#define DHT_NOTIFY_PERIOD 300 /* 5 min - Notify Check period */
|
||||
/* TIMEOUTS (Key ones in .h) */
|
||||
#define DHT_RESTART_PERIOD 300 /* 5 min */
|
||||
|
||||
#define DHT_DEFAULT_PERIOD 600 /* Default period if no work to do */
|
||||
#define DHT_DEFAULT_PERIOD 300 /* Default period if no work to do */
|
||||
#define DHT_MIN_PERIOD 1 /* to ensure we don't get too many requests */
|
||||
|
||||
#define DHT_DEFAULT_WAITTIME 1 /* Std sleep break period */
|
||||
|
||||
/* TTLs for DHTs posts */
|
||||
#define DHT_TTL_PUBLISH (DHT_PUBLISH_PERIOD + 120) // for a little overlap.
|
||||
#define DHT_TTL_NOTIFY (DHT_NOTIFY_PERIOD + 60) // for time to find it...
|
||||
|
||||
|
||||
void printDhtPeerEntry(dhtPeerEntry *ent, std::ostream &out);
|
||||
|
||||
@ -509,7 +500,7 @@ int p3DhtMgr::checkOwnDHTKeys()
|
||||
|
||||
#ifdef DHT_DEBUG
|
||||
std::cerr << "PUBLISH: ";
|
||||
std::cerr << " hash1: " << peer.hash1;
|
||||
std::cerr << " hash1: " << RsUtil::BinToHex(peer.hash1);
|
||||
std::cerr << " laddr: " << inet_ntoa(peer.laddr.sin_addr);
|
||||
std::cerr << ":" << ntohs(peer.laddr.sin_port);
|
||||
std::cerr << " raddr: " << inet_ntoa(peer.raddr.sin_addr);
|
||||
@ -1071,7 +1062,7 @@ bool p3DhtMgr::dhtPublish(std::string idhash,
|
||||
#ifdef DHT_DEBUG
|
||||
std::cerr << "p3DhtMgr::dhtPublish()" << std::endl;
|
||||
|
||||
std::cerr << "PUBLISHing: idhash: " << idhash;
|
||||
std::cerr << "PUBLISHing: idhash: " << RsUtil::BinToHex(idhash);
|
||||
std::cerr << " laddr: " << inet_ntoa(laddr.sin_addr);
|
||||
std::cerr << ":" << ntohs(laddr.sin_port);
|
||||
std::cerr << " raddr: " << inet_ntoa(raddr.sin_addr);
|
||||
@ -1108,7 +1099,7 @@ bool p3DhtMgr::dhtPublish(std::string idhash,
|
||||
#ifdef DHT_DEBUG
|
||||
std::cerr << "p3DhtMgr::dhtPublish()" << std::endl;
|
||||
|
||||
std::cerr << "PUBLISH: key: " << idhash;
|
||||
std::cerr << "PUBLISH: key: " << RsUtil::BinToHex(idhash);
|
||||
std::cerr << " value: " << value;
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
@ -1198,7 +1189,7 @@ bool p3DhtMgr::resultDHT(std::string key, std::string value)
|
||||
/* get the hash */
|
||||
std::string notifyHash = value.substr(loc);
|
||||
#ifdef DHT_DEBUG
|
||||
std::cerr << "p3DhtMgr::resultDHT() NOTIFY msg HASH:->" << notifyHash << "<-" << std::endl;
|
||||
std::cerr << "p3DhtMgr::resultDHT() NOTIFY msg HASH:-> 0x" << RsUtil::BinToHex(notifyHash) << "<-" << std::endl;
|
||||
#endif
|
||||
/* call out */
|
||||
dhtResultNotify(notifyHash);
|
||||
@ -1344,16 +1335,16 @@ bool p3DhtMgr::dhtResultSearch(std::string idhash,
|
||||
#endif
|
||||
it->second.lastTS = now;
|
||||
|
||||
/* Do callback all the time */
|
||||
ent = it->second;
|
||||
doCb = true;
|
||||
|
||||
/* update info .... always */
|
||||
it->second.state = DHT_PEER_FOUND;
|
||||
it->second.laddr = laddr;
|
||||
it->second.raddr = raddr;
|
||||
it->second.type = type;
|
||||
|
||||
/* Do callback all the time */
|
||||
ent = it->second;
|
||||
doCb = true;
|
||||
|
||||
if (it->second.notifyPending)
|
||||
{
|
||||
/* no wait if we have pendingNotification */
|
||||
|
@ -57,6 +57,21 @@
|
||||
#define DHT_MODE_NOTIFY 2
|
||||
|
||||
|
||||
|
||||
/* TIMEOUTS: Reference Values are set here... */
|
||||
|
||||
#define DHT_SEARCH_PERIOD 1800 /* PeerKeys: if we haven't found them: 30 min */
|
||||
#define DHT_CHECK_PERIOD 1800 /* PeerKeys: re-lookup peer: 30 min */
|
||||
#define DHT_PUBLISH_PERIOD 1800 /* OwnKey: 30 min */
|
||||
#define DHT_NOTIFY_PERIOD 300 /* 5 min - Notify Check period */
|
||||
|
||||
/* TTLs for DHTs posts */
|
||||
#define DHT_TTL_PUBLISH (DHT_PUBLISH_PERIOD + 120) // for a little overlap.
|
||||
#define DHT_TTL_NOTIFY (DHT_NOTIFY_PERIOD + 60) // for time to find it...
|
||||
|
||||
|
||||
|
||||
|
||||
class dhtPeerEntry
|
||||
{
|
||||
public:
|
||||
|
@ -743,7 +743,7 @@ std::ostream &RsPeerStunItem::print(std::ostream &out, uint16_t indent)
|
||||
printRsItemBase(out, "RsPeerStunItem", indent);
|
||||
uint16_t int_Indent = indent + 2;
|
||||
|
||||
stunList.print(out, int_Indent);
|
||||
stunList.printHex(out, int_Indent);
|
||||
|
||||
printRsItemEnd(out, "RsPeerStunItem", indent);
|
||||
return out;
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "rstlvbase.h"
|
||||
#include "rstlvtypes.h"
|
||||
#include "rsbaseserial.h"
|
||||
#include "util/rsprint.h"
|
||||
#include <ostream>
|
||||
#include <sstream>
|
||||
#include <iomanip>
|
||||
@ -322,6 +323,25 @@ std::ostream &RsTlvPeerIdSet::print(std::ostream &out, uint16_t indent)
|
||||
|
||||
}
|
||||
|
||||
/// print to screen RsTlvPeerIdSet contents
|
||||
std::ostream &RsTlvPeerIdSet::printHex(std::ostream &out, uint16_t indent)
|
||||
{
|
||||
printBase(out, "RsTlvPeerIdSet", indent);
|
||||
uint16_t int_Indent = indent + 2;
|
||||
|
||||
std::list<std::string>::iterator it;
|
||||
for(it = ids.begin(); it != ids.end() ; ++it)
|
||||
{
|
||||
printIndent(out, int_Indent);
|
||||
out << "id: 0x" << RsUtil::BinToHex(*it);
|
||||
out << std::endl;
|
||||
}
|
||||
|
||||
printEnd(out, "RsTlvPeerIdSet", indent);
|
||||
return out;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/************************************* Service Id Set ************************************/
|
||||
|
||||
|
@ -150,6 +150,7 @@ virtual void TlvClear();
|
||||
virtual bool SetTlv(void *data, uint32_t size, uint32_t *offset); /* serialise */
|
||||
virtual bool GetTlv(void *data, uint32_t size, uint32_t *offset); /* deserialise */
|
||||
virtual std::ostream &print(std::ostream &out, uint16_t indent);
|
||||
virtual std::ostream &printHex(std::ostream &out, uint16_t indent); /* SPECIAL One */
|
||||
|
||||
std::list<std::string> ids; /* Mandatory */
|
||||
};
|
||||
|
@ -41,7 +41,7 @@
|
||||
#define MAX_SEG 1500
|
||||
#define TCP_MAX_SEQ UINT_MAX
|
||||
#define TCP_MAX_WIN 65500
|
||||
#define TCP_ALIVE_TIMEOUT 20 /* 20 sec */
|
||||
#define TCP_ALIVE_TIMEOUT 15 /* 15 sec ... < 20 sec UDP state limit on some firewalls */
|
||||
#define TCP_RETRANS_TIMEOUT 1 /* 1 sec (Initial value) */
|
||||
#define kNoPktTimeout 60 /* 1 min */
|
||||
|
||||
|
@ -25,6 +25,7 @@
|
||||
|
||||
#include "udpsorter.h"
|
||||
#include "util/rsnet.h"
|
||||
#include "util/rsprint.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
@ -222,7 +223,8 @@ bool UdpSorter::locked_handleStunPkt(void *data, int size, struct sockaddr_in &f
|
||||
if (size == 20) /* request */
|
||||
{
|
||||
#ifdef DEBUG_UDP_SORTER
|
||||
std::cerr << "UdpSorter::handleStunPkt() got Request";
|
||||
std::cerr << "UdpSorter::handleStunPkt() got Request from: ";
|
||||
std::cerr << inet_ntoa(from.sin_addr) << ":" << ntohs(from.sin_port);
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
@ -752,8 +754,10 @@ bool UdpSorter::locked_printStunList()
|
||||
std::list<TouStunPeer>::iterator it;
|
||||
for(it = mStunList.begin(); it != mStunList.end(); it++)
|
||||
{
|
||||
out << "id:" << it->id << " addr: " << inet_ntoa(it->remote.sin_addr);
|
||||
out << "id:" << RsUtil::BinToHex(it->id) << " addr: " << inet_ntoa(it->remote.sin_addr);
|
||||
out << ":" << htons(it->remote.sin_port);
|
||||
out << " eaddr: " << inet_ntoa(it->eaddr.sin_addr);
|
||||
out << ":" << htons(it->eaddr.sin_port);
|
||||
out << " failCount: " << it->failCount;
|
||||
out << " lastSend: " << now - it->lastsend;
|
||||
out << std::endl;
|
||||
|
Loading…
Reference in New Issue
Block a user