Merge pull request #4605
aa82795Add detailed network info to getnetworkinfo RPC (Wladimir J. van der Laan)075cf49Add GetNetworkName function (Wladimir J. van der Laan)c91a947Add IsReachable(net) function (Wladimir J. van der Laan)60dc8e4Allow -onlynet=onion to be used (Wladimir J. van der Laan)
This commit is contained in:
@@ -247,7 +247,7 @@ std::string HelpMessage(HelpMessageMode mode)
|
|||||||
strUsage += " -maxreceivebuffer=<n> " + _("Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)") + "\n";
|
strUsage += " -maxreceivebuffer=<n> " + _("Maximum per-connection receive buffer, <n>*1000 bytes (default: 5000)") + "\n";
|
||||||
strUsage += " -maxsendbuffer=<n> " + _("Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)") + "\n";
|
strUsage += " -maxsendbuffer=<n> " + _("Maximum per-connection send buffer, <n>*1000 bytes (default: 1000)") + "\n";
|
||||||
strUsage += " -onion=<ip:port> " + _("Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)") + "\n";
|
strUsage += " -onion=<ip:port> " + _("Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: -proxy)") + "\n";
|
||||||
strUsage += " -onlynet=<net> " + _("Only connect to nodes in network <net> (IPv4, IPv6 or Tor)") + "\n";
|
strUsage += " -onlynet=<net> " + _("Only connect to nodes in network <net> (ipv4, ipv6 or onion)") + "\n";
|
||||||
strUsage += " -permitbaremultisig " + _("Relay non-P2SH multisig (default: 1)") + "\n";
|
strUsage += " -permitbaremultisig " + _("Relay non-P2SH multisig (default: 1)") + "\n";
|
||||||
strUsage += " -port=<port> " + _("Listen for connections on <port> (default: 8333 or testnet: 18333)") + "\n";
|
strUsage += " -port=<port> " + _("Listen for connections on <port> (default: 8333 or testnet: 18333)") + "\n";
|
||||||
strUsage += " -proxy=<ip:port> " + _("Connect through SOCKS5 proxy") + "\n";
|
strUsage += " -proxy=<ip:port> " + _("Connect through SOCKS5 proxy") + "\n";
|
||||||
|
|||||||
10
src/net.cpp
10
src/net.cpp
@@ -307,12 +307,18 @@ bool IsLocal(const CService& addr)
|
|||||||
return mapLocalHost.count(addr) > 0;
|
return mapLocalHost.count(addr) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** check whether a given network is one we can probably connect to */
|
||||||
|
bool IsReachable(enum Network net)
|
||||||
|
{
|
||||||
|
LOCK(cs_mapLocalHost);
|
||||||
|
return vfReachable[net] && !vfLimited[net];
|
||||||
|
}
|
||||||
|
|
||||||
/** check whether a given address is in a network we can probably connect to */
|
/** check whether a given address is in a network we can probably connect to */
|
||||||
bool IsReachable(const CNetAddr& addr)
|
bool IsReachable(const CNetAddr& addr)
|
||||||
{
|
{
|
||||||
LOCK(cs_mapLocalHost);
|
|
||||||
enum Network net = addr.GetNetwork();
|
enum Network net = addr.GetNetwork();
|
||||||
return vfReachable[net] && !vfLimited[net];
|
return IsReachable(net);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GetMyExternalIP2(const CService& addrConnect, const char* pszGet, const char* pszKeyword, CNetAddr& ipRet)
|
bool GetMyExternalIP2(const CService& addrConnect, const char* pszGet, const char* pszKeyword, CNetAddr& ipRet)
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ bool AddLocal(const CNetAddr& addr, int nScore = LOCAL_NONE);
|
|||||||
bool SeenLocal(const CService& addr);
|
bool SeenLocal(const CService& addr);
|
||||||
bool IsLocal(const CService& addr);
|
bool IsLocal(const CService& addr);
|
||||||
bool GetLocal(CService &addr, const CNetAddr *paddrPeer = NULL);
|
bool GetLocal(CService &addr, const CNetAddr *paddrPeer = NULL);
|
||||||
|
bool IsReachable(enum Network net);
|
||||||
bool IsReachable(const CNetAddr &addr);
|
bool IsReachable(const CNetAddr &addr);
|
||||||
void SetReachable(enum Network net, bool fFlag = true);
|
void SetReachable(enum Network net, bool fFlag = true);
|
||||||
CAddress GetLocalAddress(const CNetAddr *paddrPeer = NULL);
|
CAddress GetLocalAddress(const CNetAddr *paddrPeer = NULL);
|
||||||
|
|||||||
@@ -47,10 +47,20 @@ enum Network ParseNetwork(std::string net) {
|
|||||||
boost::to_lower(net);
|
boost::to_lower(net);
|
||||||
if (net == "ipv4") return NET_IPV4;
|
if (net == "ipv4") return NET_IPV4;
|
||||||
if (net == "ipv6") return NET_IPV6;
|
if (net == "ipv6") return NET_IPV6;
|
||||||
if (net == "tor") return NET_TOR;
|
if (net == "tor" || net == "onion") return NET_TOR;
|
||||||
return NET_UNROUTABLE;
|
return NET_UNROUTABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string GetNetworkName(enum Network net) {
|
||||||
|
switch(net)
|
||||||
|
{
|
||||||
|
case NET_IPV4: return "ipv4";
|
||||||
|
case NET_IPV6: return "ipv6";
|
||||||
|
case NET_TOR: return "onion";
|
||||||
|
default: return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SplitHostPort(std::string in, int &portOut, std::string &hostOut) {
|
void SplitHostPort(std::string in, int &portOut, std::string &hostOut) {
|
||||||
size_t colon = in.find_last_of(':');
|
size_t colon = in.find_last_of(':');
|
||||||
// if a : is found, and it either follows a [...], or no other : is in the string, treat it as port separator
|
// if a : is found, and it either follows a [...], or no other : is in the string, treat it as port separator
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ extern bool fNameLookup;
|
|||||||
|
|
||||||
enum Network
|
enum Network
|
||||||
{
|
{
|
||||||
NET_UNROUTABLE,
|
NET_UNROUTABLE = 0,
|
||||||
NET_IPV4,
|
NET_IPV4,
|
||||||
NET_IPV6,
|
NET_IPV6,
|
||||||
NET_TOR,
|
NET_TOR,
|
||||||
@@ -164,6 +164,7 @@ class CService : public CNetAddr
|
|||||||
typedef CService proxyType;
|
typedef CService proxyType;
|
||||||
|
|
||||||
enum Network ParseNetwork(std::string net);
|
enum Network ParseNetwork(std::string net);
|
||||||
|
std::string GetNetworkName(enum Network net);
|
||||||
void SplitHostPort(std::string in, int &portOut, std::string &hostOut);
|
void SplitHostPort(std::string in, int &portOut, std::string &hostOut);
|
||||||
bool SetProxy(enum Network net, CService addrProxy);
|
bool SetProxy(enum Network net, CService addrProxy);
|
||||||
bool GetProxy(enum Network net, proxyType &proxyInfoOut);
|
bool GetProxy(enum Network net, proxyType &proxyInfoOut);
|
||||||
|
|||||||
@@ -338,6 +338,26 @@ Value getnettotals(const Array& params, bool fHelp)
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Array GetNetworksInfo()
|
||||||
|
{
|
||||||
|
Array networks;
|
||||||
|
for(int n=0; n<NET_MAX; ++n)
|
||||||
|
{
|
||||||
|
enum Network network = static_cast<enum Network>(n);
|
||||||
|
if(network == NET_UNROUTABLE)
|
||||||
|
continue;
|
||||||
|
proxyType proxy;
|
||||||
|
Object obj;
|
||||||
|
GetProxy(network, proxy);
|
||||||
|
obj.push_back(Pair("name", GetNetworkName(network)));
|
||||||
|
obj.push_back(Pair("limited", IsLimited(network)));
|
||||||
|
obj.push_back(Pair("reachable", IsReachable(network)));
|
||||||
|
obj.push_back(Pair("proxy", proxy.IsValid() ? proxy.ToStringIPPort() : string()));
|
||||||
|
networks.push_back(obj);
|
||||||
|
}
|
||||||
|
return networks;
|
||||||
|
}
|
||||||
|
|
||||||
Value getnetworkinfo(const Array& params, bool fHelp)
|
Value getnetworkinfo(const Array& params, bool fHelp)
|
||||||
{
|
{
|
||||||
if (fHelp || params.size() != 0)
|
if (fHelp || params.size() != 0)
|
||||||
@@ -351,7 +371,13 @@ Value getnetworkinfo(const Array& params, bool fHelp)
|
|||||||
" \"localservices\": \"xxxxxxxxxxxxxxxx\", (string) the services we offer to the network\n"
|
" \"localservices\": \"xxxxxxxxxxxxxxxx\", (string) the services we offer to the network\n"
|
||||||
" \"timeoffset\": xxxxx, (numeric) the time offset\n"
|
" \"timeoffset\": xxxxx, (numeric) the time offset\n"
|
||||||
" \"connections\": xxxxx, (numeric) the number of connections\n"
|
" \"connections\": xxxxx, (numeric) the number of connections\n"
|
||||||
" \"proxy\": \"host:port\", (string, optional) the proxy used by the server\n"
|
" \"networks\": [ (array) information per network\n"
|
||||||
|
" \"name\": \"xxx\", (string) network (ipv4, ipv6 or onion)\n"
|
||||||
|
" \"limited\": xxx, (boolean) is the network limited using -onlynet?\n"
|
||||||
|
" \"reachable\": xxx, (boolean) is the network reachable?\n"
|
||||||
|
" \"proxy\": \"host:port\" (string) the proxy that is used for this network, or empty if none\n"
|
||||||
|
" },\n"
|
||||||
|
" ],\n"
|
||||||
" \"relayfee\": x.xxxx, (numeric) minimum relay fee for non-free transactions in btc/kb\n"
|
" \"relayfee\": x.xxxx, (numeric) minimum relay fee for non-free transactions in btc/kb\n"
|
||||||
" \"localaddresses\": [, (array) list of local addresses\n"
|
" \"localaddresses\": [, (array) list of local addresses\n"
|
||||||
" \"address\": \"xxxx\", (string) network address\n"
|
" \"address\": \"xxxx\", (string) network address\n"
|
||||||
@@ -364,16 +390,13 @@ Value getnetworkinfo(const Array& params, bool fHelp)
|
|||||||
+ HelpExampleRpc("getnetworkinfo", "")
|
+ HelpExampleRpc("getnetworkinfo", "")
|
||||||
);
|
);
|
||||||
|
|
||||||
proxyType proxy;
|
|
||||||
GetProxy(NET_IPV4, proxy);
|
|
||||||
|
|
||||||
Object obj;
|
Object obj;
|
||||||
obj.push_back(Pair("version", (int)CLIENT_VERSION));
|
obj.push_back(Pair("version", (int)CLIENT_VERSION));
|
||||||
obj.push_back(Pair("protocolversion",(int)PROTOCOL_VERSION));
|
obj.push_back(Pair("protocolversion",(int)PROTOCOL_VERSION));
|
||||||
obj.push_back(Pair("localservices", strprintf("%016x", nLocalServices)));
|
obj.push_back(Pair("localservices", strprintf("%016x", nLocalServices)));
|
||||||
obj.push_back(Pair("timeoffset", GetTimeOffset()));
|
obj.push_back(Pair("timeoffset", GetTimeOffset()));
|
||||||
obj.push_back(Pair("connections", (int)vNodes.size()));
|
obj.push_back(Pair("connections", (int)vNodes.size()));
|
||||||
obj.push_back(Pair("proxy", (proxy.IsValid() ? proxy.ToStringIPPort() : string())));
|
obj.push_back(Pair("networks", GetNetworksInfo()));
|
||||||
obj.push_back(Pair("relayfee", ValueFromAmount(::minRelayTxFee.GetFeePerK())));
|
obj.push_back(Pair("relayfee", ValueFromAmount(::minRelayTxFee.GetFeePerK())));
|
||||||
Array localAddresses;
|
Array localAddresses;
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user