mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-10-01 02:35:48 -04:00
Improvement to BanPeers Sharing Code.
* Added p3BanList as a service. * Added interfaces to communicate addresses. * Added debug to p3BanList. * Fixed several bugs in the AddEntry/Condense * Fixed Mutex deadlocks. Improvements to Dsdv code too. * Added p3Dsdv as a service. * Added Function to create a TEST service for routing. git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5-dhtmods@4687 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
8d4a7ed4f0
commit
85ea54395b
@ -70,6 +70,11 @@ virtual int dhtConnectCallback(const bdId *srcId, const bdId *proxyId, const bdI
|
|||||||
return mParent->ConnectCallback(srcId, proxyId, destId, mode, point, param, cbtype, errcode);
|
return mParent->ConnectCallback(srcId, proxyId, destId, mode, point, param, cbtype, errcode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual int dhtInfoCallback(const bdId *id, uint32_t type, uint32_t flags, std::string info)
|
||||||
|
{
|
||||||
|
return mParent->InfoCallback(id, type, flags, info);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
p3BitDht *mParent;
|
p3BitDht *mParent;
|
||||||
@ -84,6 +89,8 @@ p3BitDht::p3BitDht(std::string id, pqiConnectCb *cb, p3NetMgr *nm,
|
|||||||
mProxyStunner = NULL;
|
mProxyStunner = NULL;
|
||||||
mRelay = NULL;
|
mRelay = NULL;
|
||||||
|
|
||||||
|
mPeerSharer = NULL;
|
||||||
|
|
||||||
std::string dhtVersion = "RS51"; // should come from elsewhere!
|
std::string dhtVersion = "RS51"; // should come from elsewhere!
|
||||||
mOwnRsId = id;
|
mOwnRsId = id;
|
||||||
|
|
||||||
@ -150,6 +157,10 @@ void p3BitDht::setupConnectBits(UdpStunner *dhtStunner, UdpStunner *proxyStun
|
|||||||
mRelay = relay;
|
mRelay = relay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void p3BitDht::setupPeerSharer(pqiNetAssistPeerShare *sharer)
|
||||||
|
{
|
||||||
|
mPeerSharer = sharer;
|
||||||
|
}
|
||||||
|
|
||||||
void p3BitDht::start()
|
void p3BitDht::start()
|
||||||
{
|
{
|
||||||
|
@ -155,8 +155,7 @@ virtual std::string getUdpAddressString();
|
|||||||
|
|
||||||
|
|
||||||
void setupConnectBits(UdpStunner *dhtStunner, UdpStunner *proxyStunner, UdpRelayReceiver *relay);
|
void setupConnectBits(UdpStunner *dhtStunner, UdpStunner *proxyStunner, UdpRelayReceiver *relay);
|
||||||
|
void setupPeerSharer(pqiNetAssistPeerShare *sharer);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void start(); /* starts up the bitdht thread */
|
void start(); /* starts up the bitdht thread */
|
||||||
@ -177,6 +176,7 @@ virtual bool getNetworkStats(uint32_t &netsize, uint32_t &localnetsize);
|
|||||||
virtual bool findPeer(std::string id);
|
virtual bool findPeer(std::string id);
|
||||||
virtual bool dropPeer(std::string id);
|
virtual bool dropPeer(std::string id);
|
||||||
|
|
||||||
|
virtual int addBadPeer(const struct sockaddr_in &addr, uint32_t reason, uint32_t flags, uint32_t age);
|
||||||
virtual int addKnownPeer(const std::string &pid, const struct sockaddr_in &addr, uint32_t flags);
|
virtual int addKnownPeer(const std::string &pid, const struct sockaddr_in &addr, uint32_t flags);
|
||||||
//virtual int addFriend(const std::string pid);
|
//virtual int addFriend(const std::string pid);
|
||||||
//virtual int addFriendOfFriend(const std::string pid);
|
//virtual int addFriendOfFriend(const std::string pid);
|
||||||
@ -219,6 +219,8 @@ int PeerCallback(const bdId *id, uint32_t status);
|
|||||||
int ValueCallback(const bdNodeId *id, std::string key, uint32_t status);
|
int ValueCallback(const bdNodeId *id, std::string key, uint32_t status);
|
||||||
int ConnectCallback(const bdId *srcId, const bdId *proxyId, const bdId *destId,
|
int ConnectCallback(const bdId *srcId, const bdId *proxyId, const bdId *destId,
|
||||||
uint32_t mode, uint32_t point, uint32_t param, uint32_t cbtype, uint32_t errcode);
|
uint32_t mode, uint32_t point, uint32_t param, uint32_t cbtype, uint32_t errcode);
|
||||||
|
int InfoCallback(const bdId *id, uint32_t type, uint32_t flags, std::string info);
|
||||||
|
|
||||||
|
|
||||||
int OnlinePeerCallback_locked(const bdId *id, uint32_t status, DhtPeerDetails *dpd);
|
int OnlinePeerCallback_locked(const bdId *id, uint32_t status, DhtPeerDetails *dpd);
|
||||||
int UnreachablePeerCallback_locked(const bdId *id, uint32_t status, DhtPeerDetails *dpd);
|
int UnreachablePeerCallback_locked(const bdId *id, uint32_t status, DhtPeerDetails *dpd);
|
||||||
@ -283,6 +285,8 @@ int calculateNodeId(const std::string pid, bdNodeId *id);
|
|||||||
|
|
||||||
p3NetMgr *mNetMgr;
|
p3NetMgr *mNetMgr;
|
||||||
|
|
||||||
|
pqiNetAssistPeerShare *mPeerSharer;
|
||||||
|
|
||||||
RsMutex dhtMtx;
|
RsMutex dhtMtx;
|
||||||
|
|
||||||
std::string mOwnRsId;
|
std::string mOwnRsId;
|
||||||
|
@ -37,6 +37,50 @@
|
|||||||
************************************* Dht Callback ***************************************
|
************************************* Dht Callback ***************************************
|
||||||
******************************************************************************************/
|
******************************************************************************************/
|
||||||
|
|
||||||
|
/**** dht NodeCallback ****
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* In the old version, we used this to callback mConnCb->peerStatus()
|
||||||
|
* We might want to drop this, and concentrate on the connection stuff.
|
||||||
|
*
|
||||||
|
* -> if an new dht peer, then pass to Stunners.
|
||||||
|
* -> do we care if we know them? not really!
|
||||||
|
*/
|
||||||
|
|
||||||
|
int p3BitDht::InfoCallback(const bdId *id, uint32_t type, uint32_t flags, std::string info)
|
||||||
|
{
|
||||||
|
/* translate info */
|
||||||
|
std::string rsid;
|
||||||
|
struct sockaddr_in addr = id->addr;
|
||||||
|
int outtype = PNASS_TYPE_BADPEER;
|
||||||
|
int outreason = PNASS_REASON_UNKNOWN;
|
||||||
|
int outage = 0;
|
||||||
|
|
||||||
|
#ifdef DEBUG_BITDHT_COMMON
|
||||||
|
std::cerr << "p3BitDht::InfoCallback() likely BAD_PEER: ";
|
||||||
|
bdStdPrintId(std::cerr, id);
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
RsStackMutex stack(dhtMtx); /********** LOCKED MUTEX ***************/
|
||||||
|
|
||||||
|
DhtPeerDetails *dpd = findInternalDhtPeer_locked(&(id->id), RSDHT_PEERTYPE_ANY);
|
||||||
|
|
||||||
|
if (dpd)
|
||||||
|
{
|
||||||
|
rsid = dpd->mRsId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mPeerSharer)
|
||||||
|
{
|
||||||
|
mPeerSharer->updatePeer(rsid, addr, outtype, outreason, outage);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**** dht NodeCallback ****
|
/**** dht NodeCallback ****
|
||||||
*
|
*
|
||||||
|
@ -183,6 +183,13 @@ bool p3BitDht::dropPeer(std::string pid)
|
|||||||
********************************* Basic Peer Details *************************************
|
********************************* Basic Peer Details *************************************
|
||||||
******************************************************************************************/
|
******************************************************************************************/
|
||||||
|
|
||||||
|
int p3BitDht::addBadPeer(const struct sockaddr_in &addr, uint32_t reason, uint32_t flags, uint32_t age)
|
||||||
|
{
|
||||||
|
//mUdpBitDht->updateKnownPeer(&id, 0, bdflags);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int p3BitDht::addKnownPeer(const std::string &pid, const struct sockaddr_in &addr, uint32_t flags)
|
int p3BitDht::addKnownPeer(const std::string &pid, const struct sockaddr_in &addr, uint32_t flags)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -1423,6 +1423,22 @@ bool p3NetMgrIMPL::netAssistKnownPeer(std::string id, const struct sockaddr_in &
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool p3NetMgrIMPL::netAssistBadPeer(const struct sockaddr_in &addr, uint32_t reason, uint32_t flags, uint32_t age)
|
||||||
|
{
|
||||||
|
std::map<uint32_t, pqiNetAssistConnect *>::iterator it;
|
||||||
|
|
||||||
|
#ifdef NETMGR_DEBUG
|
||||||
|
std::cerr << "p3NetMgrIMPL::netAssistBadPeer(" << rs_inet_ntoa(addr.sin_addr) << ")";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for(it = mDhts.begin(); it != mDhts.end(); it++)
|
||||||
|
{
|
||||||
|
(it->second)->addBadPeer(addr, reason, flags, age);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool p3NetMgrIMPL::netAssistAttach(bool on)
|
bool p3NetMgrIMPL::netAssistAttach(bool on)
|
||||||
{
|
{
|
||||||
|
@ -120,6 +120,7 @@ virtual bool setVisState(uint32_t visState) = 0;
|
|||||||
// Switch DHT On/Off.
|
// Switch DHT On/Off.
|
||||||
virtual bool netAssistFriend(std::string id, bool on) = 0;
|
virtual bool netAssistFriend(std::string id, bool on) = 0;
|
||||||
virtual bool netAssistKnownPeer(std::string id, const struct sockaddr_in &addr, uint32_t flags) = 0;
|
virtual bool netAssistKnownPeer(std::string id, const struct sockaddr_in &addr, uint32_t flags) = 0;
|
||||||
|
virtual bool netAssistBadPeer(const struct sockaddr_in &addr, uint32_t reason, uint32_t flags, uint32_t age) = 0;
|
||||||
virtual bool netAssistStatusUpdate(std::string id, int mode) = 0;
|
virtual bool netAssistStatusUpdate(std::string id, int mode) = 0;
|
||||||
|
|
||||||
/* Get Network State */
|
/* Get Network State */
|
||||||
@ -175,6 +176,7 @@ virtual bool setVisState(uint32_t visState);
|
|||||||
// Switch DHT On/Off.
|
// Switch DHT On/Off.
|
||||||
virtual bool netAssistFriend(std::string id, bool on);
|
virtual bool netAssistFriend(std::string id, bool on);
|
||||||
virtual bool netAssistKnownPeer(std::string id, const struct sockaddr_in &addr, uint32_t flags);
|
virtual bool netAssistKnownPeer(std::string id, const struct sockaddr_in &addr, uint32_t flags);
|
||||||
|
virtual bool netAssistBadPeer(const struct sockaddr_in &addr, uint32_t reason, uint32_t flags, uint32_t age);
|
||||||
virtual bool netAssistStatusUpdate(std::string id, int mode);
|
virtual bool netAssistStatusUpdate(std::string id, int mode);
|
||||||
|
|
||||||
/* Get Network State */
|
/* Get Network State */
|
||||||
|
@ -79,6 +79,19 @@ virtual bool getExternalAddress(struct sockaddr_in &addr) = 0;
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define PNASS_TYPE_BADPEER 0x0001
|
||||||
|
#define PNASS_REASON_UNKNOWN 0x0001
|
||||||
|
|
||||||
|
class pqiNetAssistPeerShare
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/* share Addresses for various reasons (bad peers, etc) */
|
||||||
|
virtual void updatePeer(std::string id, struct sockaddr_in addr, int type, int reason, int age) = 0;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* this is for the Stunners
|
/* this is for the Stunners
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
@ -130,6 +143,7 @@ virtual bool findPeer(std::string id) = 0;
|
|||||||
virtual bool dropPeer(std::string id) = 0;
|
virtual bool dropPeer(std::string id) = 0;
|
||||||
|
|
||||||
/* add non-active peers (can still toggle active/non-active via above) */
|
/* add non-active peers (can still toggle active/non-active via above) */
|
||||||
|
virtual int addBadPeer(const struct sockaddr_in &addr, uint32_t reason, uint32_t flags, uint32_t age) = 0;
|
||||||
virtual int addKnownPeer(const std::string &pid, const struct sockaddr_in &addr, uint32_t flags) = 0;
|
virtual int addKnownPeer(const std::string &pid, const struct sockaddr_in &addr, uint32_t flags) = 0;
|
||||||
|
|
||||||
//virtual int addFriend(const std::string pid) = 0;
|
//virtual int addFriend(const std::string pid) = 0;
|
||||||
|
@ -37,6 +37,7 @@ extern RsDsdv *rsDsdv;
|
|||||||
|
|
||||||
#define RSDSDV_IDTYPE_PEER 0x0001
|
#define RSDSDV_IDTYPE_PEER 0x0001
|
||||||
#define RSDSDV_IDTYPE_SERVICE 0x0002
|
#define RSDSDV_IDTYPE_SERVICE 0x0002
|
||||||
|
#define RSDSDV_IDTYPE_TEST 0x0100
|
||||||
|
|
||||||
#define RSDSDV_FLAGS_SIGNIFICANT_CHANGE 0x0001
|
#define RSDSDV_FLAGS_SIGNIFICANT_CHANGE 0x0001
|
||||||
#define RSDSDV_FLAGS_STABLE_ROUTE 0x0002
|
#define RSDSDV_FLAGS_STABLE_ROUTE 0x0002
|
||||||
|
@ -1781,6 +1781,9 @@ RsTurtle *rsTurtle = NULL ;
|
|||||||
#include "services/p3vors.h"
|
#include "services/p3vors.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "services/p3banlist.h"
|
||||||
|
#include "services/p3dsdv.h"
|
||||||
|
|
||||||
|
|
||||||
RsControl *createRsControl(RsIface &iface, NotifyBase ¬ify)
|
RsControl *createRsControl(RsIface &iface, NotifyBase ¬ify)
|
||||||
{
|
{
|
||||||
@ -2127,6 +2130,16 @@ int RsServer::StartupRetroShare()
|
|||||||
rsVoip = mVoipTest;
|
rsVoip = mVoipTest;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// new services to test.
|
||||||
|
p3BanList *mBanList = new p3BanList(mLinkMgr, mNetMgr);
|
||||||
|
pqih -> addService(mBanList);
|
||||||
|
mBitDht->setupPeerSharer(mBanList);
|
||||||
|
|
||||||
|
p3Dsdv *mDsdv = new p3Dsdv(mLinkMgr);
|
||||||
|
pqih -> addService(mDsdv);
|
||||||
|
rsDsdv = mDsdv;
|
||||||
|
mDsdv->addTestService();
|
||||||
|
|
||||||
#endif // MINIMAL_LIBRS
|
#endif // MINIMAL_LIBRS
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
@ -166,6 +166,11 @@ std::ostream &RsTlvBanListEntry::print(std::ostream &out, uint16_t indent)
|
|||||||
|
|
||||||
/************************************* RsTlvBanList ************************************/
|
/************************************* RsTlvBanList ************************************/
|
||||||
|
|
||||||
|
RsTlvBanList::RsTlvBanList()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void RsTlvBanList::TlvClear()
|
void RsTlvBanList::TlvClear()
|
||||||
{
|
{
|
||||||
entries.clear();
|
entries.clear();
|
||||||
|
@ -278,6 +278,11 @@ std::ostream &RsTlvDsdvEntry::print(std::ostream &out, uint16_t indent)
|
|||||||
|
|
||||||
/************************************* RsTlvDsdvEntrySet ************************************/
|
/************************************* RsTlvDsdvEntrySet ************************************/
|
||||||
|
|
||||||
|
RsTlvDsdvEntrySet::RsTlvDsdvEntrySet()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void RsTlvDsdvEntrySet::TlvClear()
|
void RsTlvDsdvEntrySet::TlvClear()
|
||||||
{
|
{
|
||||||
entries.clear();
|
entries.clear();
|
||||||
|
@ -37,6 +37,8 @@
|
|||||||
* #define DEBUG_BANLIST 1
|
* #define DEBUG_BANLIST 1
|
||||||
****/
|
****/
|
||||||
|
|
||||||
|
#define DEBUG_BANLIST 1
|
||||||
|
|
||||||
|
|
||||||
/* DEFINE INTERFACE POINTER! */
|
/* DEFINE INTERFACE POINTER! */
|
||||||
//RsBanList *rsBanList = NULL;
|
//RsBanList *rsBanList = NULL;
|
||||||
@ -89,6 +91,12 @@ bool p3BanList::processIncoming()
|
|||||||
bool updated = false;
|
bool updated = false;
|
||||||
while(NULL != (item = recvItem()))
|
while(NULL != (item = recvItem()))
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG_BANLIST
|
||||||
|
std::cerr << "p3BanList::processingIncoming() Received Item:";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
item->print(std::cerr);
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
switch(item->PacketSubType())
|
switch(item->PacketSubType())
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
@ -134,6 +142,24 @@ bool p3BanList::recvBanItem(RsBanListItem *item)
|
|||||||
return updated;
|
return updated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* overloaded from pqiNetAssistSharePeer */
|
||||||
|
void p3BanList::updatePeer(std::string id, struct sockaddr_in addr, int type, int reason, int age)
|
||||||
|
{
|
||||||
|
std::string ownId = mLinkMgr->getOwnId();
|
||||||
|
|
||||||
|
int int_reason = 0;
|
||||||
|
addBanEntry(ownId, addr, RSBANLIST_SOURCE_SELF, int_reason, age);
|
||||||
|
|
||||||
|
/* process */
|
||||||
|
{
|
||||||
|
RsStackMutex stack(mBanMtx); /****** LOCKED MUTEX *******/
|
||||||
|
|
||||||
|
mBanSet.clear();
|
||||||
|
condenseBanSources_locked();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool p3BanList::addBanEntry(const std::string &peerId, const struct sockaddr_in &addr, uint32_t level, uint32_t reason, uint32_t age)
|
bool p3BanList::addBanEntry(const std::string &peerId, const struct sockaddr_in &addr, uint32_t level, uint32_t reason, uint32_t age)
|
||||||
{
|
{
|
||||||
RsStackMutex stack(mBanMtx); /****** LOCKED MUTEX *******/
|
RsStackMutex stack(mBanMtx); /****** LOCKED MUTEX *******/
|
||||||
@ -141,13 +167,19 @@ bool p3BanList::addBanEntry(const std::string &peerId, const struct sockaddr_in
|
|||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
bool updated = false;
|
bool updated = false;
|
||||||
|
|
||||||
|
#ifdef DEBUG_BANLIST
|
||||||
|
std::cerr << "p3BanList::addBanEntry() Addr: " << rs_inet_ntoa(addr.sin_addr) << " Level: " << level;
|
||||||
|
std::cerr << " Reason: " << reason << " Age: " << age;
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
std::map<std::string, BanList>::iterator it;
|
std::map<std::string, BanList>::iterator it;
|
||||||
it = mBanSources.find(peerId);
|
it = mBanSources.find(peerId);
|
||||||
if (it == mBanSources.end())
|
if (it == mBanSources.end())
|
||||||
{
|
{
|
||||||
BanList bl;
|
BanList bl;
|
||||||
bl.mPeerId = peerId;
|
bl.mPeerId = peerId;
|
||||||
bl.mLastUpdate = 0;
|
bl.mLastUpdate = now;
|
||||||
mBanSources[peerId] = bl;
|
mBanSources[peerId] = bl;
|
||||||
|
|
||||||
it = mBanSources.find(peerId);
|
it = mBanSources.find(peerId);
|
||||||
@ -164,6 +196,9 @@ bool p3BanList::addBanEntry(const std::string &peerId, const struct sockaddr_in
|
|||||||
blp.reason = reason;
|
blp.reason = reason;
|
||||||
blp.level = level;
|
blp.level = level;
|
||||||
blp.mTs = now - age;
|
blp.mTs = now - age;
|
||||||
|
|
||||||
|
it->second.mBanPeers[addr.sin_addr.s_addr] = blp;
|
||||||
|
it->second.mLastUpdate = now;
|
||||||
updated = true;
|
updated = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -178,6 +213,8 @@ bool p3BanList::addBanEntry(const std::string &peerId, const struct sockaddr_in
|
|||||||
mit->second.reason = reason;
|
mit->second.reason = reason;
|
||||||
mit->second.level = level;
|
mit->second.level = level;
|
||||||
mit->second.mTs = now - age;
|
mit->second.mTs = now - age;
|
||||||
|
|
||||||
|
it->second.mLastUpdate = now;
|
||||||
updated = true;
|
updated = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -190,14 +227,30 @@ int p3BanList::condenseBanSources_locked()
|
|||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
std::string ownId = mLinkMgr->getOwnId();
|
std::string ownId = mLinkMgr->getOwnId();
|
||||||
|
|
||||||
|
#ifdef DEBUG_BANLIST
|
||||||
|
std::cerr << "p3BanList::condenseBanSources_locked()";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
std::map<std::string, BanList>::const_iterator it;
|
std::map<std::string, BanList>::const_iterator it;
|
||||||
for(it = mBanSources.begin(); it != mBanSources.end(); it++)
|
for(it = mBanSources.begin(); it != mBanSources.end(); it++)
|
||||||
{
|
{
|
||||||
if (now - it->second.mLastUpdate > RSBANLIST_ENTRY_MAX_AGE)
|
if (now - it->second.mLastUpdate > RSBANLIST_ENTRY_MAX_AGE)
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG_BANLIST
|
||||||
|
std::cerr << "p3BanList::condenseBanSources_locked()";
|
||||||
|
std::cerr << " Ignoring Out-Of-Date peer: " << it->first;
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_BANLIST
|
||||||
|
std::cerr << "p3BanList::condenseBanSources_locked()";
|
||||||
|
std::cerr << " Condensing Info from peer: " << it->first;
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
std::map<uint32_t, BanListPeer>::const_iterator lit;
|
std::map<uint32_t, BanListPeer>::const_iterator lit;
|
||||||
for(lit = it->second.mBanPeers.begin();
|
for(lit = it->second.mBanPeers.begin();
|
||||||
lit != it->second.mBanPeers.end(); lit++)
|
lit != it->second.mBanPeers.end(); lit++)
|
||||||
@ -205,6 +258,12 @@ int p3BanList::condenseBanSources_locked()
|
|||||||
/* check timestamp */
|
/* check timestamp */
|
||||||
if (now - lit->second.mTs > RSBANLIST_ENTRY_MAX_AGE)
|
if (now - lit->second.mTs > RSBANLIST_ENTRY_MAX_AGE)
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG_BANLIST
|
||||||
|
std::cerr << "p3BanList::condenseBanSources_locked()";
|
||||||
|
std::cerr << " Ignoring Out-Of-Date Entry for: ";
|
||||||
|
std::cerr << rs_inet_ntoa(lit->second.addr.sin_addr);
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,9 +283,21 @@ int p3BanList::condenseBanSources_locked()
|
|||||||
bp.level = lvl;
|
bp.level = lvl;
|
||||||
bp.addr.sin_port = 0;
|
bp.addr.sin_port = 0;
|
||||||
mBanSet[lit->second.addr.sin_addr.s_addr] = bp;
|
mBanSet[lit->second.addr.sin_addr.s_addr] = bp;
|
||||||
|
#ifdef DEBUG_BANLIST
|
||||||
|
std::cerr << "p3BanList::condenseBanSources_locked()";
|
||||||
|
std::cerr << " Added New Entry for: ";
|
||||||
|
std::cerr << rs_inet_ntoa(lit->second.addr.sin_addr);
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG_BANLIST
|
||||||
|
std::cerr << "p3BanList::condenseBanSources_locked()";
|
||||||
|
std::cerr << " Merging Info for: ";
|
||||||
|
std::cerr << rs_inet_ntoa(lit->second.addr.sin_addr);
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
/* update if necessary */
|
/* update if necessary */
|
||||||
if (lvl == sit->second.level)
|
if (lvl == sit->second.level)
|
||||||
{
|
{
|
||||||
@ -239,6 +310,15 @@ int p3BanList::condenseBanSources_locked()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG_BANLIST
|
||||||
|
std::cerr << "p3BanList::condenseBanSources_locked() Printing New Set:";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
printBanSet_locked(std::cerr);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -255,10 +335,15 @@ int p3BanList::sendPackets()
|
|||||||
if (now - pt > RSBANLIST_SEND_PERIOD)
|
if (now - pt > RSBANLIST_SEND_PERIOD)
|
||||||
{
|
{
|
||||||
sendBanLists();
|
sendBanLists();
|
||||||
printBanSources(std::cerr);
|
|
||||||
printBanSet(std::cerr);
|
|
||||||
|
|
||||||
RsStackMutex stack(mBanMtx); /****** LOCKED MUTEX *******/
|
RsStackMutex stack(mBanMtx); /****** LOCKED MUTEX *******/
|
||||||
|
|
||||||
|
std::cerr << "p3BanList::sendPackets() Regular Broadcast";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
|
||||||
|
printBanSources_locked(std::cerr);
|
||||||
|
printBanSet_locked(std::cerr);
|
||||||
|
|
||||||
mSentListTime = now;
|
mSentListTime = now;
|
||||||
}
|
}
|
||||||
return true ;
|
return true ;
|
||||||
@ -325,11 +410,9 @@ int p3BanList::sendBanSet(std::string peerid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int p3BanList::printBanSet(std::ostream &out)
|
int p3BanList::printBanSet_locked(std::ostream &out)
|
||||||
{
|
{
|
||||||
RsStackMutex stack(mBanMtx); /****** LOCKED MUTEX *******/
|
out << "p3BanList::printBanSet_locked()";
|
||||||
|
|
||||||
out << "p3BanList::printBanSet";
|
|
||||||
out << std::endl;
|
out << std::endl;
|
||||||
|
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
@ -352,10 +435,8 @@ int p3BanList::printBanSet(std::ostream &out)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int p3BanList::printBanSources(std::ostream &out)
|
int p3BanList::printBanSources_locked(std::ostream &out)
|
||||||
{
|
{
|
||||||
RsStackMutex stack(mBanMtx); /****** LOCKED MUTEX *******/
|
|
||||||
|
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
|
|
||||||
std::map<std::string, BanList>::const_iterator it;
|
std::map<std::string, BanList>::const_iterator it;
|
||||||
|
@ -65,13 +65,18 @@ class BanList
|
|||||||
* Exchange list of Banned IP addresses with peers.
|
* Exchange list of Banned IP addresses with peers.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class p3BanList: /* public RsBanList, */ public p3Service /* , public p3Config, public pqiMonitor */
|
class p3BanList: /* public RsBanList, */ public p3Service, public pqiNetAssistPeerShare /* , public p3Config, public pqiMonitor */
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
p3BanList(p3LinkMgr *lm, p3NetMgr *nm);
|
p3BanList(p3LinkMgr *lm, p3NetMgr *nm);
|
||||||
|
|
||||||
/***** overloaded from RsBanList *****/
|
/***** overloaded from RsBanList *****/
|
||||||
|
|
||||||
|
/***** overloaded from pqiNetAssistPeerShare *****/
|
||||||
|
|
||||||
|
virtual void updatePeer(std::string id, struct sockaddr_in addr, int type, int reason, int age);
|
||||||
|
|
||||||
|
|
||||||
/***** overloaded from p3Service *****/
|
/***** overloaded from p3Service *****/
|
||||||
/*!
|
/*!
|
||||||
* This retrieves all chat msg items and also (important!)
|
* This retrieves all chat msg items and also (important!)
|
||||||
@ -93,8 +98,6 @@ class p3BanList: /* public RsBanList, */ public p3Service /* , public p3Config,
|
|||||||
void sendBanLists();
|
void sendBanLists();
|
||||||
int sendBanSet(std::string peerid);
|
int sendBanSet(std::string peerid);
|
||||||
|
|
||||||
int printBanSources(std::ostream &out);
|
|
||||||
int printBanSet(std::ostream &out);
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Interface stuff.
|
* Interface stuff.
|
||||||
@ -115,6 +118,8 @@ class p3BanList: /* public RsBanList, */ public p3Service /* , public p3Config,
|
|||||||
RsMutex mBanMtx;
|
RsMutex mBanMtx;
|
||||||
|
|
||||||
int condenseBanSources_locked();
|
int condenseBanSources_locked();
|
||||||
|
int printBanSources_locked(std::ostream &out);
|
||||||
|
int printBanSet_locked(std::ostream &out);
|
||||||
|
|
||||||
time_t mSentListTime;
|
time_t mSentListTime;
|
||||||
std::map<std::string, BanList> mBanSources;
|
std::map<std::string, BanList> mBanSources;
|
||||||
|
@ -29,11 +29,14 @@
|
|||||||
//#include "serialiser/rsdsdvitems.h"
|
//#include "serialiser/rsdsdvitems.h"
|
||||||
#include "services/p3dsdv.h"
|
#include "services/p3dsdv.h"
|
||||||
#include "pqi/p3linkmgr.h"
|
#include "pqi/p3linkmgr.h"
|
||||||
|
#include "util/rsrandom.h"
|
||||||
|
|
||||||
|
#include <openssl/sha.h>
|
||||||
|
|
||||||
/****
|
/****
|
||||||
* #define DEBUG_DSDV 1
|
* #define DEBUG_DSDV 1
|
||||||
****/
|
****/
|
||||||
|
#define DEBUG_DSDV 1
|
||||||
|
|
||||||
/* DEFINE INTERFACE POINTER! */
|
/* DEFINE INTERFACE POINTER! */
|
||||||
RsDsdv *rsDsdv = NULL;
|
RsDsdv *rsDsdv = NULL;
|
||||||
@ -98,8 +101,16 @@ int p3Dsdv::sendTables()
|
|||||||
|
|
||||||
if (now - tt > DSDV_BROADCAST_PERIOD)
|
if (now - tt > DSDV_BROADCAST_PERIOD)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifdef DEBUG_DSDV
|
||||||
|
std::cerr << "p3Dsdv::sendTables() Broadcast Time";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
generateRoutingTables(false);
|
generateRoutingTables(false);
|
||||||
|
|
||||||
|
printDsdvTable(std::cerr);
|
||||||
|
|
||||||
RsStackMutex stack(mDsdvMtx); /****** LOCKED MUTEX *******/
|
RsStackMutex stack(mDsdvMtx); /****** LOCKED MUTEX *******/
|
||||||
mSentTablesTime = now;
|
mSentTablesTime = now;
|
||||||
mSentIncrementTime = now;
|
mSentIncrementTime = now;
|
||||||
@ -359,11 +370,68 @@ void p3Dsdv::statusChange(const std::list<pqipeer> &plist)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int p3Dsdv::addTestService()
|
||||||
|
{
|
||||||
|
RsDsdvId testId;
|
||||||
|
|
||||||
|
int rndhash1[SHA_DIGEST_LENGTH / 4];
|
||||||
|
int rndhash2[SHA_DIGEST_LENGTH / 4];
|
||||||
|
std::ostringstream rh, sh;
|
||||||
|
std::string realHash;
|
||||||
|
std::string seedHash;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for(i = 0; i < SHA_DIGEST_LENGTH / 4; i++)
|
||||||
|
{
|
||||||
|
rndhash1[i] = RSRandom::random_u32();
|
||||||
|
rndhash2[i] = RSRandom::random_u32();
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < SHA_DIGEST_LENGTH; i++)
|
||||||
|
{
|
||||||
|
rh << std::setw(2) << std::setfill('0') << std::hex << (uint32_t) ((uint8_t *) rndhash1)[i];
|
||||||
|
sh << std::setw(2) << std::setfill('0') << std::hex << (uint32_t) ((uint8_t *) rndhash2)[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
realHash = rh.str();
|
||||||
|
seedHash = sh.str();
|
||||||
|
|
||||||
|
uint8_t sha_hash[SHA_DIGEST_LENGTH];
|
||||||
|
memset(sha_hash,0,SHA_DIGEST_LENGTH*sizeof(uint8_t)) ;
|
||||||
|
SHA_CTX *sha_ctx = new SHA_CTX;
|
||||||
|
SHA1_Init(sha_ctx);
|
||||||
|
|
||||||
|
SHA1_Update(sha_ctx, realHash.c_str(), realHash.length());
|
||||||
|
SHA1_Update(sha_ctx, seedHash.c_str(), seedHash.length());
|
||||||
|
SHA1_Final(sha_hash, sha_ctx);
|
||||||
|
delete sha_ctx;
|
||||||
|
|
||||||
|
std::ostringstream keystr;
|
||||||
|
for(int i = 0; i < SHA_DIGEST_LENGTH; i++)
|
||||||
|
{
|
||||||
|
keystr << std::setw(2) << std::setfill('0') << std::hex << (uint32_t) (sha_hash)[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
testId.mIdType = RSDSDV_IDTYPE_TEST;
|
||||||
|
testId.mAnonChunk = seedHash;
|
||||||
|
testId.mHash = keystr.str();
|
||||||
|
|
||||||
|
addDsdvId(&testId, realHash);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int p3Dsdv::addDsdvId(RsDsdvId *id, std::string realHash)
|
int p3Dsdv::addDsdvId(RsDsdvId *id, std::string realHash)
|
||||||
{
|
{
|
||||||
|
|
||||||
RsStackMutex stack(mDsdvMtx); /****** LOCKED MUTEX *******/
|
RsStackMutex stack(mDsdvMtx); /****** LOCKED MUTEX *******/
|
||||||
|
|
||||||
|
#ifdef DEBUG_DSDV
|
||||||
|
std::cerr << "p3Dsdv::addDsdvId() ID: " << *id << " RealHash: " << realHash;
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
|
|
||||||
/* check for duplicate */
|
/* check for duplicate */
|
||||||
@ -407,6 +475,11 @@ int p3Dsdv::dropDsdvId(RsDsdvId *id)
|
|||||||
{
|
{
|
||||||
RsStackMutex stack(mDsdvMtx); /****** LOCKED MUTEX *******/
|
RsStackMutex stack(mDsdvMtx); /****** LOCKED MUTEX *******/
|
||||||
|
|
||||||
|
#ifdef DEBUG_DSDV
|
||||||
|
std::cerr << "p3Dsdv::dropDsdvId() ID: " << *id;
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* This should send out an infinity packet... and flag for deletion */
|
/* This should send out an infinity packet... and flag for deletion */
|
||||||
|
|
||||||
std::map<std::string, RsDsdvTableEntry>::iterator it;
|
std::map<std::string, RsDsdvTableEntry>::iterator it;
|
||||||
@ -436,9 +509,12 @@ int p3Dsdv::printDsdvTable(std::ostream &out)
|
|||||||
{
|
{
|
||||||
RsDsdvTableEntry &v = it->second;
|
RsDsdvTableEntry &v = it->second;
|
||||||
out << v.mDest;
|
out << v.mDest;
|
||||||
out << " BR: " << v.mBestRoute;
|
out << std::endl;
|
||||||
out << " SR: " << v.mBestRoute;
|
out << "\tBR: " << v.mBestRoute;
|
||||||
out << " Flags: " << v.mFlags;
|
out << std::endl;
|
||||||
|
out << "\tSR: " << v.mBestRoute;
|
||||||
|
out << std::endl;
|
||||||
|
out << "\tFlags: " << v.mFlags;
|
||||||
out << " Own: " << v.mOwnSource;
|
out << " Own: " << v.mOwnSource;
|
||||||
if (v.mMatched)
|
if (v.mMatched)
|
||||||
{
|
{
|
||||||
|
@ -60,6 +60,8 @@ int addDsdvId(RsDsdvId *id, std::string realHash);
|
|||||||
int dropDsdvId(RsDsdvId *id);
|
int dropDsdvId(RsDsdvId *id);
|
||||||
int printDsdvTable(std::ostream &out);
|
int printDsdvTable(std::ostream &out);
|
||||||
|
|
||||||
|
int addTestService();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
int sendTables();
|
int sendTables();
|
||||||
|
Loading…
Reference in New Issue
Block a user