aboutsummaryrefslogtreecommitdiff
path: root/src/protocol.cpp
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2012-01-03 23:33:31 +0100
committerPieter Wuille <pieter.wuille@gmail.com>2012-01-06 18:55:37 +0100
commit67a42f929b1434f647c63922fd02dc2b93b28060 (patch)
tree9c4313e815bd77e817f2dc5b796347d343458d0e /src/protocol.cpp
parent7486c64dd8436febbe59e82dbb875e83ad6b5194 (diff)
downloadbitcoin-67a42f929b1434f647c63922fd02dc2b93b28060.tar.xz
Network stack refactor
This introduces CNetAddr and CService, respectively wrapping an (IPv6) IP address and an IP+port combination. This functionality used to be part of CAddress, which also contains network flags and connection attempt information. These extra fields are however not always necessary. These classes, along with logic for creating connections and doing name lookups, are moved to netbase.{h,cpp}, which does not depend on headers.h. Furthermore, CNetAddr is mostly IPv6-ready, though IPv6 functionality is not yet enabled for the application itself.
Diffstat (limited to 'src/protocol.cpp')
-rw-r--r--src/protocol.cpp172
1 files changed, 5 insertions, 167 deletions
diff --git a/src/protocol.cpp b/src/protocol.cpp
index 27efb8f293..45f08082e9 100644
--- a/src/protocol.cpp
+++ b/src/protocol.cpp
@@ -5,16 +5,12 @@
#include "protocol.h"
#include "util.h"
+#include "netbase.h"
#ifndef WIN32
# include <arpa/inet.h>
#endif
-// Prototypes from net.h, but that header (currently) stinks, can't #include it without breaking things
-bool Lookup(const char *pszName, std::vector<CAddress>& vaddr, int nServices, int nMaxSolutions, bool fAllowLookup = false, int portDefault = 0, bool fAllowPort = false);
-bool Lookup(const char *pszName, CAddress& addr, int nServices, bool fAllowLookup = false, int portDefault = 0, bool fAllowPort = false);
-
-static const unsigned char pchIPv4[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff };
static const char* ppszTypeName[] =
{
"ERROR",
@@ -77,185 +73,26 @@ bool CMessageHeader::IsValid() const
return true;
}
-CAddress::CAddress()
-{
- Init();
-}
-
-CAddress::CAddress(unsigned int ipIn, unsigned short portIn, uint64 nServicesIn)
-{
- Init();
- ip = ipIn;
- port = htons(portIn == 0 ? GetDefaultPort() : portIn);
- nServices = nServicesIn;
-}
-
-CAddress::CAddress(const struct sockaddr_in& sockaddr, uint64 nServicesIn)
-{
- Init();
- ip = sockaddr.sin_addr.s_addr;
- port = sockaddr.sin_port;
- nServices = nServicesIn;
-}
-
-CAddress::CAddress(const char* pszIn, int portIn, bool fNameLookup, uint64 nServicesIn)
-{
- Init();
- Lookup(pszIn, *this, nServicesIn, fNameLookup, portIn);
-}
-CAddress::CAddress(const char* pszIn, bool fNameLookup, uint64 nServicesIn)
-{
- Init();
- Lookup(pszIn, *this, nServicesIn, fNameLookup, 0, true);
-}
-CAddress::CAddress(std::string strIn, int portIn, bool fNameLookup, uint64 nServicesIn)
+CAddress::CAddress() : CService()
{
Init();
- Lookup(strIn.c_str(), *this, nServicesIn, fNameLookup, portIn);
}
-CAddress::CAddress(std::string strIn, bool fNameLookup, uint64 nServicesIn)
+CAddress::CAddress(CService ipIn, uint64 nServicesIn) : CService(ipIn)
{
Init();
- Lookup(strIn.c_str(), *this, nServicesIn, fNameLookup, 0, true);
+ nServices = nServicesIn;
}
void CAddress::Init()
{
nServices = NODE_NETWORK;
- memcpy(pchReserved, pchIPv4, sizeof(pchReserved));
- ip = INADDR_NONE;
- port = htons(GetDefaultPort());
nTime = 100000000;
nLastTry = 0;
}
-bool operator==(const CAddress& a, const CAddress& b)
-{
- return (memcmp(a.pchReserved, b.pchReserved, sizeof(a.pchReserved)) == 0 &&
- a.ip == b.ip &&
- a.port == b.port);
-}
-
-bool operator!=(const CAddress& a, const CAddress& b)
-{
- return (!(a == b));
-}
-
-bool operator<(const CAddress& a, const CAddress& b)
-{
- int ret = memcmp(a.pchReserved, b.pchReserved, sizeof(a.pchReserved));
- if (ret < 0)
- return true;
- else if (ret == 0)
- {
- if (ntohl(a.ip) < ntohl(b.ip))
- return true;
- else if (a.ip == b.ip)
- return ntohs(a.port) < ntohs(b.port);
- }
- return false;
-}
-
-std::vector<unsigned char> CAddress::GetKey() const
-{
- CDataStream ss;
- ss.reserve(18);
- ss << FLATDATA(pchReserved) << ip << port;
-
- #if defined(_MSC_VER) && _MSC_VER < 1300
- return std::vector<unsigned char>((unsigned char*)&ss.begin()[0], (unsigned char*)&ss.end()[0]);
- #else
- return std::vector<unsigned char>(ss.begin(), ss.end());
- #endif
-}
-
-struct sockaddr_in CAddress::GetSockAddr() const
-{
- struct sockaddr_in sockaddr;
- memset(&sockaddr, 0, sizeof(sockaddr));
- sockaddr.sin_family = AF_INET;
- sockaddr.sin_addr.s_addr = ip;
- sockaddr.sin_port = port;
- return sockaddr;
-}
-
-bool CAddress::IsIPv4() const
-{
- return (memcmp(pchReserved, pchIPv4, sizeof(pchIPv4)) == 0);
-}
-
-bool CAddress::IsRFC1918() const
-{
- return IsIPv4() && (GetByte(3) == 10 ||
- (GetByte(3) == 192 && GetByte(2) == 168) ||
- (GetByte(3) == 172 &&
- (GetByte(2) >= 16 && GetByte(2) <= 31)));
-}
-
-bool CAddress::IsRFC3927() const
-{
- return IsIPv4() && (GetByte(3) == 169 && GetByte(2) == 254);
-}
-
-bool CAddress::IsLocal() const
-{
- return IsIPv4() && (GetByte(3) == 127 ||
- GetByte(3) == 0);
-}
-
-bool CAddress::IsRoutable() const
-{
- return IsValid() &&
- !(IsRFC1918() || IsRFC3927() || IsLocal());
-}
-
-bool CAddress::IsValid() const
-{
- // Clean up 3-byte shifted addresses caused by garbage in size field
- // of addr messages from versions before 0.2.9 checksum.
- // Two consecutive addr messages look like this:
- // header20 vectorlen3 addr26 addr26 addr26 header20 vectorlen3 addr26 addr26 addr26...
- // so if the first length field is garbled, it reads the second batch
- // of addr misaligned by 3 bytes.
- if (memcmp(pchReserved, pchIPv4+3, sizeof(pchIPv4)-3) == 0)
- return false;
-
- return (ip != 0 && ip != INADDR_NONE && port != htons(std::numeric_limits<unsigned short>::max()));
-}
-
-unsigned char CAddress::GetByte(int n) const
-{
- return ((unsigned char*)&ip)[3-n];
-}
-
-std::string CAddress::ToStringIPPort() const
-{
- return strprintf("%u.%u.%u.%u:%u", GetByte(3), GetByte(2), GetByte(1), GetByte(0), ntohs(port));
-}
-
-std::string CAddress::ToStringIP() const
-{
- return strprintf("%u.%u.%u.%u", GetByte(3), GetByte(2), GetByte(1), GetByte(0));
-}
-
-std::string CAddress::ToStringPort() const
-{
- return strprintf("%u", ntohs(port));
-}
-
-std::string CAddress::ToString() const
-{
- return strprintf("%u.%u.%u.%u:%u", GetByte(3), GetByte(2), GetByte(1), GetByte(0), ntohs(port));
-}
-
-void CAddress::print() const
-{
- printf("CAddress(%s)\n", ToString().c_str());
-}
-
CInv::CInv()
{
type = 0;
@@ -310,3 +147,4 @@ void CInv::print() const
{
printf("CInv(%s)\n", ToString().c_str());
}
+