Exemplo n.º 1
0
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();
    }
  }
}
Exemplo n.º 2
0
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();
    }
  }
}
Exemplo n.º 3
0
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();
    }
  }
}