inline std::size_t hash_value(const IP& ip) { size_t seed = 0; switch (ip.family()) { case AF_INET: boost::hash_combine(seed, htonl(ip.in().get().s_addr)); return seed; default: UNREACHABLE(); } }
// TODO(evelinad): Move this to Address. inline struct sockaddr_storage createSockaddrStorage(const IP& ip, int port) { struct sockaddr_storage storage; memset(&storage, 0, sizeof(storage)); switch (ip.family()) { case AF_INET: { struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr = ip.in().get(); addr.sin_port = htons(port); memcpy(&storage, &addr, sizeof(addr)); break; } default: { ABORT("Unsupported family type: " + stringify(ip.family())); } } return storage; }
inline Try<IPNetwork> IPNetwork::create(const IP& address, const IP& netmask) { if (address.family() != netmask.family()) { return Error( "The network families of the IP address '" + stringify(address.family()) + "' and the IP netmask '" + stringify(netmask.family()) + "' do not match"); } switch (address.family()) { case AF_INET: { uint32_t mask = ntohl(netmask.in().get().s_addr); if (((~mask + 1) & (~mask)) != 0) { return Error("Netmask is not valid"); } return IPNetwork(address, netmask); } default: { UNREACHABLE(); } } }