diff options
author | Pieter Wuille <pieter.wuille@gmail.com> | 2012-01-03 23:33:31 +0100 |
---|---|---|
committer | Pieter Wuille <pieter.wuille@gmail.com> | 2012-01-06 18:55:37 +0100 |
commit | 67a42f929b1434f647c63922fd02dc2b93b28060 (patch) | |
tree | 9c4313e815bd77e817f2dc5b796347d343458d0e /src/protocol.cpp | |
parent | 7486c64dd8436febbe59e82dbb875e83ad6b5194 (diff) |
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.cpp | 172 |
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()); } + |