15 static const unsigned char pchIPv4[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff };
16 static const unsigned char pchOnionCat[] = {0xFD,0x87,0xD8,0x7E,0xEB,0x43};
20 memset(
ip, 0,
sizeof(
ip));
40 assert(!
"invalid network");
46 if (strName.size()>6 && strName.substr(strName.size() - 6, 6) ==
".onion") {
47 std::vector<unsigned char> vchAddr =
DecodeBase32(strName.substr(0, strName.size() - 6).c_str());
51 for (
unsigned int i=0; i<16-
sizeof(
pchOnionCat); i++)
130 static const unsigned char pchRFC6052[] = {0,0x64,0xFF,0x9B,0,0,0,0,0,0,0,0};
131 return (memcmp(
ip, pchRFC6052,
sizeof(pchRFC6052)) == 0);
141 static const unsigned char pchRFC4862[] = {0xFE,0x80,0,0,0,0,0,0};
142 return (memcmp(
ip, pchRFC4862,
sizeof(pchRFC4862)) == 0);
147 return ((
GetByte(15) & 0xFE) == 0xFC);
152 static const unsigned char pchRFC6145[] = {0,0,0,0,0,0,0,0,0xFF,0xFF,0,0};
153 return (memcmp(
ip, pchRFC6145,
sizeof(pchRFC6145)) == 0);
173 static const unsigned char pchLocal[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
174 if (memcmp(
ip, pchLocal, 16) == 0)
198 unsigned char ipNone[16] = {};
199 if (memcmp(
ip, ipNone, 16) == 0)
209 uint32_t ipNone = INADDR_NONE;
210 if (memcmp(
ip+12, &ipNone, 4) == 0)
215 if (memcmp(
ip+12, &ipNone, 4) == 0)
248 struct sockaddr_storage sockaddr;
249 socklen_t socklen =
sizeof(sockaddr);
250 if (serv.
GetSockAddr((
struct sockaddr*)&sockaddr, &socklen)) {
251 char name[1025] =
"";
252 if (!getnameinfo((
const struct sockaddr*)&sockaddr, socklen,
name,
sizeof(
name), NULL, 0, NI_NUMERICHOST))
253 return std::string(
name);
259 return strprintf(
"%x:%x:%x:%x:%x:%x:%x:%x",
273 return (memcmp(a.
ip, b.
ip, 16) == 0);
278 return (memcmp(a.
ip, b.
ip, 16) != 0);
283 return (memcmp(a.
ip, b.
ip, 16) < 0);
304 std::vector<unsigned char> vchRet;
339 vchRet.push_back(
GetByte(3) ^ 0xFF);
340 vchRet.push_back(
GetByte(2) ^ 0xFF);
356 vchRet.push_back(nClass);
359 vchRet.push_back(
GetByte(15 - nStartByte));
364 vchRet.push_back(
GetByte(15 - nStartByte) | ((1 << (8 - nBits)) - 1));
373 memcpy(&nRet, &hash,
sizeof(nRet));
404 return REACH_UNREACHABLE;
413 default:
return REACH_DEFAULT;
418 default:
return REACH_DEFAULT;
421 case NET_IPV6:
return fTunnel ? REACH_IPV6_WEAK : REACH_IPV6_STRONG;
425 default:
return REACH_DEFAULT;
427 case NET_TOR:
return REACH_PRIVATE;
431 default:
return REACH_DEFAULT;
433 case NET_IPV6:
return REACH_IPV6_WEAK;
440 default:
return REACH_DEFAULT;
442 case NET_IPV6:
return REACH_IPV6_WEAK;
444 case NET_TOR:
return REACH_PRIVATE;
473 assert(addr.sin_family == AF_INET);
478 assert(addr.sin6_family == AF_INET6);
483 switch (paddr->sa_family) {
485 *
this =
CService(*(
const struct sockaddr_in*)paddr);
488 *
this =
CService(*(
const struct sockaddr_in6*)paddr);
518 if (*addrlen < (socklen_t)
sizeof(
struct sockaddr_in))
520 *addrlen =
sizeof(
struct sockaddr_in);
521 struct sockaddr_in *paddrin = (
struct sockaddr_in*)paddr;
522 memset(paddrin, 0, *addrlen);
525 paddrin->sin_family = AF_INET;
526 paddrin->sin_port = htons(
port);
530 if (*addrlen < (socklen_t)
sizeof(
struct sockaddr_in6))
532 *addrlen =
sizeof(
struct sockaddr_in6);
533 struct sockaddr_in6 *paddrin6 = (
struct sockaddr_in6*)paddr;
534 memset(paddrin6, 0, *addrlen);
537 paddrin6->sin6_family = AF_INET6;
538 paddrin6->sin6_port = htons(
port);
546 std::vector<unsigned char> vKey;
549 vKey[16] =
port / 0x100;
550 vKey[17] =
port & 0x0FF;
595 if(
n >= 0 &&
n <= (128 - astartofs*8))
605 for(
int x=0; x<16; ++x)
619 for(
int x=astartofs; x<16; ++x)
623 for(
int x=0; x<16; ++x)
628 valid(addr.IsValid())
638 for(
int x=0; x<16; ++x)
647 case 0x00:
return 0;
break;
648 case 0x80:
return 1;
break;
649 case 0xc0:
return 2;
break;
650 case 0xe0:
return 3;
break;
651 case 0xf0:
return 4;
break;
652 case 0xf8:
return 5;
break;
653 case 0xfc:
return 6;
break;
654 case 0xfe:
return 7;
break;
655 case 0xff:
return 8;
break;
656 default:
return -1;
break;
664 bool valid_cidr =
true;
676 for (;
n < 16 && valid_cidr; ++
n)
681 std::string strNetmask;
688 strNetmask =
strprintf(
"%x:%x:%x:%x:%x:%x:%x:%x",
bool operator==(const CNetAddr &a, const CNetAddr &b)
std::vector< unsigned char > GetKey() const
std::string ToStringIP(bool fUseGetnameinfo=true) const
static const int NET_UNKNOWN
std::string ToString() const
string EncodeBase32(const unsigned char *pch, size_t len)
uint8_t netmask[16]
Netmask, in network byte order.
void SetRaw(Network network, const uint8_t *data)
std::vector< unsigned char > GetGroup() const
void SetIP(const CNetAddr &ip)
unsigned short GetPort() const
static const unsigned char pchOnionCat[]
bool operator!=(const CNetAddr &a, const CNetAddr &b)
static int GetExtNetwork(const CNetAddr *addr)
std::string ToStringIPPort(bool fUseGetnameinfo=true) const
CNetAddr network
Network (base) address.
void SetPort(unsigned short portIn)
int GetReachabilityFrom(const CNetAddr *paddrPartner=NULL) const
bool GetIn6Addr(struct in6_addr *pipv6Addr) const
bool valid
Is this value valid? (only used to signal parse errors)
uint256 Hash(const T1 pbegin, const T1 pend)
std::string ToStringPort() const
bool SetSockAddr(const struct sockaddr *paddr)
bool operator<(const CNetAddr &a, const CNetAddr &b)
static int NetmaskBits(uint8_t x)
std::string ToString() const
void * memcpy(void *a, const void *b, size_t c)
static const int NET_TEREDO
unsigned int GetByte(int n) const
bool SetSpecial(const std::string &strName)
bool GetInAddr(struct in_addr *pipv4Addr) const
enum Network GetNetwork() const
vector< unsigned char > DecodeBase32(const char *p, bool *pfInvalid)
bool GetSockAddr(struct sockaddr *paddr, socklen_t *addrlen) const
bool Match(const CNetAddr &addr) const
static const unsigned char pchIPv4[12]