2018-05-21 12:23:52 -04:00
|
|
|
/*******************************************************************************
|
|
|
|
* bitdht/bdquery.h *
|
|
|
|
* *
|
|
|
|
* BitDHT: An Flexible DHT library. *
|
|
|
|
* *
|
|
|
|
* Copyright 2010 by Robert Fernie <bitdht@lunamutt.com> *
|
|
|
|
* *
|
|
|
|
* This program is free software: you can redistribute it and/or modify *
|
|
|
|
* it under the terms of the GNU Affero General Public License as *
|
|
|
|
* published by the Free Software Foundation, either version 3 of the *
|
|
|
|
* License, or (at your option) any later version. *
|
|
|
|
* *
|
|
|
|
* This program 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 Affero General Public License for more details. *
|
|
|
|
* *
|
|
|
|
* You should have received a copy of the GNU Affero General Public License *
|
|
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>. *
|
|
|
|
* *
|
|
|
|
*******************************************************************************/
|
2010-07-10 07:48:24 -04:00
|
|
|
#ifndef BITDHT_QUERY_H
|
|
|
|
#define BITDHT_QUERY_H
|
|
|
|
|
2010-07-18 12:28:51 -04:00
|
|
|
#include "bitdht/bdiface.h"
|
|
|
|
#include "bitdht/bdpeer.h"
|
|
|
|
#include "bitdht/bdobj.h"
|
2010-07-10 07:48:24 -04:00
|
|
|
|
|
|
|
/* Query result flags are in bdiface.h */
|
|
|
|
|
|
|
|
#define BITDHT_MIN_QUERY_AGE 10
|
2011-07-05 20:14:58 -04:00
|
|
|
#define BITDHT_MAX_QUERY_AGE 300 /* Query Should take <1 minute, so 5 minutes sounds reasonable */
|
2010-07-10 07:48:24 -04:00
|
|
|
|
|
|
|
class bdQuery
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
bdQuery(const bdNodeId *id, std::list<bdId> &startList, uint32_t queryFlags,
|
|
|
|
bdDhtFunctions *fns);
|
|
|
|
|
|
|
|
// get the answer.
|
|
|
|
bool result(std::list<bdId> &answer);
|
2011-06-29 06:46:11 -04:00
|
|
|
bool proxies(std::list<bdId> &answer);
|
|
|
|
bool potentialProxies(std::list<bdId> &answer);
|
2010-07-10 07:48:24 -04:00
|
|
|
|
|
|
|
// returning results get passed to all queries.
|
|
|
|
//void addNode(const bdId *id, int mode);
|
|
|
|
int nextQuery(bdId &id, bdNodeId &targetId);
|
|
|
|
int addPeer(const bdId *id, uint32_t mode);
|
2011-06-29 06:46:11 -04:00
|
|
|
int addPotentialPeer(const bdId *id, const bdId *src, uint32_t srcmode);
|
2010-07-10 07:48:24 -04:00
|
|
|
int printQuery();
|
|
|
|
|
|
|
|
// searching for
|
|
|
|
bdNodeId mId;
|
|
|
|
bdMetric mLimit;
|
|
|
|
uint32_t mState;
|
|
|
|
time_t mQueryTS;
|
|
|
|
uint32_t mQueryFlags;
|
2010-10-19 18:03:38 -04:00
|
|
|
int32_t mSearchTime;
|
2010-07-10 07:48:24 -04:00
|
|
|
|
2010-10-05 17:57:22 -04:00
|
|
|
int32_t mQueryIdlePeerRetryPeriod; // seconds between retries.
|
|
|
|
|
2011-06-29 06:46:11 -04:00
|
|
|
//private:
|
2010-07-10 07:48:24 -04:00
|
|
|
|
2011-06-29 06:46:11 -04:00
|
|
|
// Closest Handling Fns.
|
|
|
|
int addClosestPeer(const bdId *id, uint32_t mode);
|
|
|
|
|
|
|
|
// Potential Handling Fns.
|
|
|
|
int worthyPotentialPeer(const bdId *id);
|
|
|
|
int updatePotentialPeer(const bdId *id, uint32_t mode, uint32_t addType);
|
|
|
|
int trimPotentialPeers_FixedLength();
|
|
|
|
int trimPotentialPeers_toClosest();
|
2011-07-05 20:14:58 -04:00
|
|
|
int removeOldPotentialPeers();
|
2011-06-29 06:46:11 -04:00
|
|
|
|
|
|
|
// Proxy Handling Fns.
|
|
|
|
int addProxy(const bdId *id, const bdId *src, uint32_t srcmode);
|
|
|
|
int updateProxy(const bdId *id, uint32_t mode);
|
|
|
|
int updateProxyList(const bdId *id, uint32_t mode, std::list<bdPeer> &searchProxyList);
|
|
|
|
int trimProxies();
|
|
|
|
|
|
|
|
|
|
|
|
// closest peers.
|
2010-07-10 07:48:24 -04:00
|
|
|
std::multimap<bdMetric, bdPeer> mClosest;
|
2011-06-29 06:46:11 -04:00
|
|
|
std::multimap<bdMetric, bdPeer> mPotentialPeers;
|
2011-07-05 20:14:58 -04:00
|
|
|
time_t mPotPeerCleanTS; // periodic cleanup of PotentialPeers.
|
2010-07-10 07:48:24 -04:00
|
|
|
|
2011-06-29 06:46:11 -04:00
|
|
|
uint32_t mRequiredPeerFlags;
|
|
|
|
std::list<bdPeer> mProxiesUnknown;
|
|
|
|
std::list<bdPeer> mProxiesFlagged;
|
|
|
|
|
|
|
|
int mClosestListSize;
|
2010-07-10 07:48:24 -04:00
|
|
|
bdDhtFunctions *mFns;
|
2011-07-05 20:14:58 -04:00
|
|
|
|
2010-07-10 07:48:24 -04:00
|
|
|
};
|
|
|
|
|
2011-06-29 06:46:11 -04:00
|
|
|
#if 0
|
|
|
|
|
2010-07-10 07:48:24 -04:00
|
|
|
class bdQueryStatus
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
uint32_t mStatus;
|
|
|
|
uint32_t mQFlags;
|
|
|
|
std::list<bdId> mResults;
|
|
|
|
};
|
|
|
|
|
2011-06-29 06:46:11 -04:00
|
|
|
#endif
|
|
|
|
|
2010-07-10 07:48:24 -04:00
|
|
|
|
|
|
|
|
|
|
|
/* this is just a container class.
|
|
|
|
* we locally seach for this, once then discard.
|
|
|
|
*/
|
|
|
|
class bdRemoteQuery
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
bdRemoteQuery(bdId *id, bdNodeId *query, bdToken *transId, uint32_t query_type);
|
|
|
|
|
|
|
|
bdId mId;
|
|
|
|
bdNodeId mQuery;
|
|
|
|
bdToken mTransId;
|
|
|
|
uint32_t mQueryType;
|
|
|
|
|
|
|
|
time_t mQueryTS;
|
|
|
|
};
|
|
|
|
|
2013-09-03 07:09:30 -04:00
|
|
|
|
|
|
|
|
|
|
|
class bdQueryHistoryList
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
bdQueryHistoryList();
|
|
|
|
|
|
|
|
bool addIncomingQuery(time_t recvd, const bdNodeId *aboutId); // calcs and returns mBadPeer
|
|
|
|
bool cleanupMsgs(time_t before); // returns true if empty.
|
|
|
|
|
|
|
|
bool mBadPeer;
|
|
|
|
std::multimap<time_t, bdNodeId> mList;
|
|
|
|
};
|
|
|
|
|
|
|
|
class bdQueryHistory
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
bdQueryHistory();
|
|
|
|
|
|
|
|
bool addIncomingQuery(time_t recvd, const bdId *id, const bdNodeId *aboutId);
|
|
|
|
void printMsgs();
|
|
|
|
|
|
|
|
void cleanupOldMsgs();
|
|
|
|
|
|
|
|
bool isBadPeer(const bdId *id);
|
|
|
|
|
|
|
|
int mStorePeriod;
|
|
|
|
std::map<bdId, bdQueryHistoryList> mHistory;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2010-07-10 07:48:24 -04:00
|
|
|
#endif
|
|
|
|
|