inline Try<IPNetwork> IPNetwork::create(const IP& address, int prefix) { if (prefix < 0) { return Error("Subnet prefix is negative"); } switch (address.family()) { case AF_INET: { if (prefix > 32) { return Error("Subnet prefix is larger than 32"); } return IPNetwork(address, IP(0xffffffff << (32 - prefix))); } default: { UNREACHABLE(); } } }
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(); } } }
inline Try<IPNetwork> IPNetwork::create(const IP& address, int prefix) { if (prefix < 0) { return Error("Subnet prefix is negative"); } switch (address.family()) { case AF_INET: { if (prefix > 32) { return Error("Subnet prefix is larger than 32"); } // Avoid left-shifting by 32 bits when prefix is 0. uint32_t mask = 0; if (prefix > 0) { mask = 0xffffffff << (32 - prefix); } return IPNetwork(address, IP(mask)); } default: { UNREACHABLE(); } } }