/* * libretroshare/src/pqi: p3linkmgr.h * * 3P/PQI network interface for RetroShare. * * Copyright 2007-2011 by Robert Fernie. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License Version 2 as published by the Free Software Foundation. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. * * Please report all bugs and problems to "retroshare@lunamutt.com". * */ #ifndef MRK_PQI_LINK_MANAGER_HEADER #define MRK_PQI_LINK_MANAGER_HEADER #include "pqi/pqimonitor.h" #include "pqi/pqiipset.h" //#include "pqi/p3dhtmgr.h" //#include "pqi/p3upnpmgr.h" #include "pqi/pqiassist.h" #include "pqi/p3cfgmgr.h" #include "util/rsthreads.h" class ExtAddrFinder ; class DNSResolver ; /* RS_VIS_STATE_XXXX * determines how public this peer wants to be... * * STD = advertise to Peers / DHT checking etc * GRAY = share with friends / but not DHT * DARK = hidden from all * BROWN? = hidden from friends / but on DHT */ const uint32_t RS_VIS_STATE_NODISC = 0x0001; const uint32_t RS_VIS_STATE_NODHT = 0x0002; const uint32_t RS_VIS_STATE_STD = 0x0000; const uint32_t RS_VIS_STATE_GRAY = RS_VIS_STATE_NODHT; const uint32_t RS_VIS_STATE_DARK = RS_VIS_STATE_NODISC | RS_VIS_STATE_NODHT; const uint32_t RS_VIS_STATE_BROWN = RS_VIS_STATE_NODISC; /* Startup Modes (confirmed later) */ const uint32_t RS_NET_MODE_TRYMODE = 0x00f0; const uint32_t RS_NET_MODE_TRY_EXT = 0x0010; const uint32_t RS_NET_MODE_TRY_UPNP = 0x0020; const uint32_t RS_NET_MODE_TRY_UDP = 0x0040; /* Actual State */ const uint32_t RS_NET_MODE_ACTUAL = 0x000f; const uint32_t RS_NET_MODE_UNKNOWN = 0x0000; const uint32_t RS_NET_MODE_EXT = 0x0001; const uint32_t RS_NET_MODE_UPNP = 0x0002; const uint32_t RS_NET_MODE_UDP = 0x0004; const uint32_t RS_NET_MODE_UNREACHABLE = 0x0008; /* order of attempts ... */ const uint32_t RS_NET_CONN_TCP_ALL = 0x000f; const uint32_t RS_NET_CONN_UDP_ALL = 0x00f0; const uint32_t RS_NET_CONN_TUNNEL = 0x0f00; const uint32_t RS_NET_CONN_TCP_LOCAL = 0x0001; const uint32_t RS_NET_CONN_TCP_EXTERNAL = 0x0002; const uint32_t RS_NET_CONN_TCP_UNKNOW_TOPOLOGY = 0x0004; const uint32_t RS_NET_CONN_UDP_DHT_SYNC = 0x0010; const uint32_t RS_NET_CONN_UDP_PEER_SYNC = 0x0020; /* coming soon */ /* extra flags */ // not sure if needed yet. //const uint32_t RS_NET_CONN_PEERAGE = 0x0f00; //const uint32_t RS_NET_CONN_SERVER = 0x0100; /* TCP only */ //const uint32_t RS_NET_CONN_PEER = 0x0200; /* all UDP */ /* flags of peerStatus */ const uint32_t RS_NET_FLAGS_USE_DISC = 0x0001; const uint32_t RS_NET_FLAGS_USE_DHT = 0x0002; const uint32_t RS_NET_FLAGS_ONLINE = 0x0004; const uint32_t RS_NET_FLAGS_EXTERNAL_ADDR = 0x0008; const uint32_t RS_NET_FLAGS_STABLE_UDP = 0x0010; const uint32_t RS_NET_FLAGS_TRUSTS_ME = 0x0020; const uint32_t RS_TCP_STD_TIMEOUT_PERIOD = 5; /* 5 seconds! */ class peerAddrInfo { public: peerAddrInfo(); /* init */ bool found; uint32_t type; pqiIpAddrSet addrs; time_t ts; }; class peerConnectAddress { public: peerConnectAddress(); /* init */ struct sockaddr_in addr; uint32_t delay; /* to stop simultaneous connects */ uint32_t period; /* UDP only */ uint32_t type; time_t ts; }; class peerConnectState { public: peerConnectState(); /* init */ std::string id; //std::string gpg_id; //uint32_t netMode; /* EXT / UPNP / UDP / INVALID */ uint32_t visState; /* STD, GRAY, DARK */ //struct sockaddr_in localaddr, serveraddr; //used to store current ip (for config and connection management) //struct sockaddr_in currentlocaladdr; /* Mandatory */ //struct sockaddr_in currentserveraddr; /* Mandatory */ //std::string dyndns; //time_t lastcontact; /* list of addresses from various sources */ //pqiIpAddrSet ipAddrs; /***** Below here not stored permanently *****/ uint32_t connecttype; // RS_NET_CONN_TCP_ALL / RS_NET_CONN_UDP_ALL time_t lastavailable; time_t lastattempt; std::string name; std::string location; uint32_t state; uint32_t actions; uint32_t source; /* most current source */ peerAddrInfo dht; peerAddrInfo disc; peerAddrInfo peer; /* a list of connect attempts to make (in order) */ bool inConnAttempt; peerConnectAddress currentConnAddrAttempt; std::list connAddrs; }; class p3tunnel; class RsPeerGroupItem; class RsGroupInfo; std::string textPeerConnectState(peerConnectState &state); class p3LinkMgr: public pqiConnectCb { public: p3LinkMgr(); void tick(); /*************** Setup ***************************/ void addNetAssistConnect(uint32_t type, pqiNetAssistConnect *); void addNetAssistFirewall(uint32_t type, pqiNetAssistFirewall *); void addNetListener(pqiNetListener *listener); bool checkNetAddress(); /* check our address is sensible */ /*************** External Control ****************/ bool shutdown(); /* blocking shutdown call */ bool retryConnect(const std::string &id); void setTunnelConnection(bool b); bool getTunnelConnection(); void setOwnNetConfig(uint32_t netMode, uint32_t visState); bool setLocalAddress(const std::string &id, struct sockaddr_in addr); bool setExtAddress(const std::string &id, struct sockaddr_in addr); bool setDynDNS(const std::string &id, const std::string &dyndns); bool updateAddressList(const std::string& id, const pqiIpAddrSet &addrs); bool setNetworkMode(const std::string &id, uint32_t netMode); bool setVisState(const std::string &id, uint32_t visState); bool setLocation(const std::string &pid, const std::string &location);//location is shown in the gui to differentiate ssl certs /* add/remove friends */ bool addFriend(const std::string &ssl_id, const std::string &gpg_id, uint32_t netMode = RS_NET_MODE_UDP, uint32_t visState = RS_VIS_STATE_STD , time_t lastContact = 0); bool removeFriend(const std::string &ssl_id); /*************** External Control ****************/ /* access to network details (called through Monitor) */ const std::string getOwnId(); bool getOwnNetStatus(peerConnectState &state); bool isOnline(const std::string &ssl_id); bool getFriendNetStatus(const std::string &id, peerConnectState &state); bool getOthersNetStatus(const std::string &id, peerConnectState &state); void getOnlineList(std::list &ssl_peers); bool getPeerCount (unsigned int *pnFriendCount, unsigned int *pnOnlineCount, bool ssl); /**************** handle monitors *****************/ void addMonitor(pqiMonitor *mon); void removeMonitor(pqiMonitor *mon); /******* overloaded from pqiConnectCb *************/ virtual void peerStatus(std::string id, const pqiIpAddrSet &addrs, uint32_t type, uint32_t flags, uint32_t source); virtual void peerConnectRequest(std::string id, struct sockaddr_in raddr, uint32_t source); //virtual void stunStatus(std::string id, struct sockaddr_in raddr, uint32_t type, uint32_t flags); /****************** Connections *******************/ bool connectAttempt(const std::string &id, struct sockaddr_in &addr, uint32_t &delay, uint32_t &period, uint32_t &type); bool connectResult(const std::string &id, bool success, uint32_t flags, struct sockaddr_in remote_peer_address); protected: /****************** Internal Interface *******************/ virtual bool enableNetAssistConnect(bool on); virtual bool netAssistConnectEnabled(); virtual bool netAssistConnectActive(); virtual bool netAssistConnectShutdown(); virtual bool netAssistConnectStats(uint32_t &netsize, uint32_t &localnetsize); /* Assist Connect */ virtual bool netAssistFriend(std::string id, bool on); virtual bool netAssistSetAddress( struct sockaddr_in &laddr, struct sockaddr_in &eaddr, uint32_t mode); /* Internal Functions */ void netReset(); void statusTick(); void netTick(); void netStartup(); /* monitor control */ void tickMonitors(); /* connect attempts UDP */ bool retryConnectUDP(const std::string &id, struct sockaddr_in &rUdpAddr); /* connect attempts TCP */ bool retryConnectTCP(const std::string &id); void locked_ConnectAttempt_CurrentAddresses(peerConnectState *peer); void locked_ConnectAttempt_HistoricalAddresses(peerConnectState *peer); void locked_ConnectAttempt_AddDynDNS(peerConnectState *peer); void locked_ConnectAttempt_AddTunnel(peerConnectState *peer); bool locked_ConnectAttempt_Complete(peerConnectState *peer); bool locked_CheckPotentialAddr(struct sockaddr_in *addr, time_t age); bool addAddressIfUnique(std::list &addrList, peerConnectAddress &pca); protected: private: // These should have there own Mutex Protection, //p3tunnel *mP3tunnel; DNSResolver *mDNSResolver ; std::map mDhts; RsMutex mLinkMtx; /* protects below */ uint32_t mRetryPeriod; bool mStatusChanged; std::list clients; bool mAllowTunnelConnection; /* external Address determination */ //bool mUpnpAddrValid, mStunAddrValid; //struct sockaddr_in mUpnpExtAddr; peerConnectState mOwnState; std::map mFriendList; std::map mOthersList; std::list groupList; uint32_t lastGroupId; /* relatively static list of banned ip addresses */ std::list mBannedIpList; }; #endif // MRK_PQI_LINK_MANAGER_HEADER