/** * Creates an IP address by masking it with a network mask of given * mask length. * * @param address the address to mask * @param prefixLength the length of the mask prefix. Must be in the * interval [0, 32] for IPv4, or [0, 128] for IPv6 * @return a new IP address that is masked with a mask prefix of the * specified length * @throws IllegalArgumentException if the prefix length is invalid */ public static IpAddress makeMaskedAddress(final IpAddress address, int prefixLength) { if (address instanceof Ip4Address) { Ip4Address ip4a = (Ip4Address) address; return Ip4Address.makeMaskedAddress(ip4a, prefixLength); } else if (address instanceof Ip6Address) { Ip6Address ip6a = (Ip6Address) address; return Ip6Address.makeMaskedAddress(ip6a, prefixLength); } else { byte[] net = makeMaskedAddressArray(address, prefixLength); return IpAddress.valueOf(address.version(), net); } }
private void registerDhcpInfo(OpenstackPort openstackPort) { checkNotNull(openstackPort); checkArgument(!openstackPort.fixedIps().isEmpty()); OpenstackSubnet openstackSubnet = openstackService.subnets().stream() .filter(n -> n.networkId().equals(openstackPort.networkId())) .findFirst().orElse(null); if (openstackSubnet == null) { log.warn("Failed to find subnet for {}", openstackPort); return; } Ip4Address ipAddress = openstackPort.fixedIps().values().stream().findFirst().get(); IpPrefix subnetPrefix = IpPrefix.valueOf(openstackSubnet.cidr()); Ip4Address broadcast = Ip4Address.makeMaskedAddress( ipAddress, subnetPrefix.prefixLength()); // TODO: supports multiple DNS servers Ip4Address domainServer = openstackSubnet.dnsNameservers().isEmpty() ? DNS_SERVER_IP : openstackSubnet.dnsNameservers().get(0); IpAssignment ipAssignment = IpAssignment.builder() .ipAddress(ipAddress) .leasePeriod(DHCP_INFINITE_LEASE) .timestamp(new Date()) .subnetMask(Ip4Address.makeMaskPrefix(subnetPrefix.prefixLength())) .broadcast(broadcast) .domainServer(domainServer) .assignmentStatus(Option_RangeNotEnforced) .routerAddress(Ip4Address.valueOf(openstackSubnet.gatewayIp())) .build(); dhcpService.setStaticMapping(openstackPort.macAddress(), ipAssignment); }