public static String ipAndNetMaskToCidr(final String ip, final String netmask) { if (!isValidIp4(ip)) { return null; } if (!isValidIp4Netmask(netmask)) { return null; } final long ipAddr = ip2Long(ip); final long subnet = ip2Long(netmask); final long result = ipAddr & subnet; int bits = subnet == 0 ? 0 : 1; long subnet2 = subnet; while ((subnet2 = subnet2 >> 1 & subnet) != 0) { bits++; } return long2Ip(result) + "/" + Integer.toString(bits); }
public static boolean validateGuestCidr(final String cidr) { // RFC 1918 - The Internet Assigned Numbers Authority (IANA) has reserved the // following three blocks of the IP address space for private internets: // 10.0.0.0 - 10.255.255.255 (10/8 prefix) // 172.16.0.0 - 172.31.255.255 (172.16/12 prefix) // 192.168.0.0 - 192.168.255.255 (192.168/16 prefix) // RFC 6598 - The IETF detailed shared address space for use in ISP CGN // deployments and NAT devices that can handle the same addresses occurring both on inbound and outbound interfaces. // ARIN returned space to the IANA as needed for this allocation. // The allocated address block is 100.64.0.0/10 final String[] allowedNetBlocks = {"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "100.64.0.0/10"}; if (!isValidIp4Cidr(cidr)) { s_logger.warn("Cidr " + cidr + " is not valid"); return false; } for (String block: allowedNetBlocks) { if (isNetworkAWithinNetworkB(cidr, block)) { return true; } } // not in allowedNetBlocks - return false s_logger.warn("cidr " + cidr + " is not RFC 1918 or 6598 compliant"); return false; }
private void checkIpRange(final String startIp, final String endIp, final String cidrAddress, final long cidrSize) { //Checking not null for start IP as well. Previously we assumed to be not null always. //But the check is required for the change in updatePod API. if (!Strings.isNullOrEmpty(startIp) && !NetUtils.isValidIp4(startIp)) { throw new InvalidParameterValueException("The start address of the IP range is not a valid IP address."); } if (!Strings.isNullOrEmpty(endIp) && !NetUtils.isValidIp4(endIp)) { throw new InvalidParameterValueException("The end address of the IP range is not a valid IP address."); } //Not null check is required for the change in updatePod API. if (!Strings.isNullOrEmpty(startIp) && !NetUtils.getCidrSubNet(startIp, cidrSize).equalsIgnoreCase(NetUtils.getCidrSubNet(cidrAddress, cidrSize))) { throw new InvalidParameterValueException("The start address of the IP range is not in the CIDR subnet."); } if (!Strings.isNullOrEmpty(endIp) && !NetUtils.getCidrSubNet(endIp, cidrSize).equalsIgnoreCase(NetUtils.getCidrSubNet(cidrAddress, cidrSize))) { throw new InvalidParameterValueException("The end address of the IP range is not in the CIDR subnet."); } if (!Strings.isNullOrEmpty(endIp) && NetUtils.ip2Long(startIp) > NetUtils.ip2Long(endIp)) { throw new InvalidParameterValueException("The start IP address must have a lower value than the end IP address."); } }
public static String getIpRangeEndIpFromCidr(final String cidr, final long size) { final long ip = ip2Long(cidr); final long startNetMask = ip2Long(getCidrNetmask(size)); final long start = (ip & startNetMask) + 1; long end = start; end = end >> MAX_CIDR - size; end++; end = (end << MAX_CIDR - size) - 2; return long2Ip(end); }
public static String getCidrFromGatewayAndNetmask(final String gatewayStr, final String netmaskStr) { final long netmask = ip2Long(netmaskStr); final long gateway = ip2Long(gatewayStr); final long firstPart = gateway & netmask; final long size = getCidrSize(netmaskStr); return long2Ip(firstPart) + "/" + size; }
private List<Pair<String, String>> getIpAddressRanges(Network network) { List<Pair<String, String>> ipAddressRanges = Lists.newArrayList(); String subnet = NetUtils.getCidrSubNet(network.getCidr()); String netmask = NetUtils.getCidrNetmask(network.getCidr()); long cidrSize = NetUtils.getCidrSize(netmask); Set<Long> allIPsInCidr = NetUtils.getAllIpsFromCidr(subnet, cidrSize, new HashSet<Long>()); if (allIPsInCidr == null || !(allIPsInCidr instanceof TreeSet)) { throw new IllegalStateException("The IPs in CIDR for subnet " + subnet + " where null or returned in a non-ordered set."); } Iterator<Long> ipIterator = allIPsInCidr.iterator(); long ip = ipIterator.next(); long gatewayIp = NetUtils.ip2Long(network.getGateway()); String lastIp = NetUtils.getIpRangeEndIpFromCidr(subnet, cidrSize); if (gatewayIp == ip) { ip = ipIterator.next(); ipAddressRanges.add(Pair.of(NetUtils.long2Ip(ip), lastIp)); } else if (!network.getGateway().equals(lastIp)) { ipAddressRanges.add(Pair.of(NetUtils.long2Ip(ip), NetUtils.long2Ip(gatewayIp - 1))); ipAddressRanges.add(Pair.of(NetUtils.long2Ip(gatewayIp + 1), lastIp)); } else { ipAddressRanges.add(Pair.of(NetUtils.long2Ip(ip), NetUtils.long2Ip(gatewayIp - 1))); } return ipAddressRanges; }
return; if (!NetUtils.isValidIp4(destIpOrCidr) && !NetUtils.isValidIp4Cidr(destIpOrCidr)) { s_logger.warn(" destIp is not a valid ip address or cidr destIp=" + destIpOrCidr); return; if (NetUtils.isValidIp4(destIpOrCidr)) { if (eth1ip != null && eth1mask != null) { inSameSubnet = NetUtils.sameSubnet(eth1ip, destIpOrCidr, eth1mask); } else { s_logger.warn("addRouteToInternalIp: unable to determine same subnet: _eth1ip=" + eth1ip + ", dest ip=" + destIpOrCidr + ", _eth1mask=" + eth1mask); inSameSubnet = NetUtils.isNetworkAWithinNetworkB(destIpOrCidr, NetUtils.ipAndNetMaskToCidr(eth1ip, eth1mask));
final Network net = _networkModel.getNetwork(guestNic.getNetworkId()); buf.append(" guestgw=").append(net.getGateway()); final String brd = NetUtils.long2Ip(NetUtils.ip2Long(guestNic.getIPv4Address()) | ~NetUtils.ip2Long(guestNic.getIPv4Netmask())); buf.append(" guestbrd=").append(brd); buf.append(" guestcidrsize=").append(NetUtils.getCidrSize(guestNic.getIPv4Netmask())); cidrSize = NetUtils.getCidrSize(guestNic.getIPv4Netmask()); final String cidr = NetUtils.getCidrSubNet(guestNic.getIPv4Gateway(), cidrSize); if (cidr != null) { dhcpRange = NetUtils.getIpRangeStartIpFromCidr(cidr, cidrSize); final String cidr = _networkModel.getValidNetworkCidr(guestNetwork); if (cidr != null) { cidrSize = NetUtils.getCidrSize(NetUtils.getCidrNetmask(cidr)); dhcpRange = NetUtils.getDhcpRange(cidr);
final long newCidr = NetUtils.getCidrSize(netmask); final long oldCidr = pod.getCidrSize(); netmask = NetUtils.getCidrNetmask(pod.getCidrSize()); final String cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask); final boolean checkForDuplicates = !oldPodName.equals(name); checkPodAttributes(id, name, pod.getDataCenterId(), gateway, cidr, startIp, endIp, allocationStateStr, checkForDuplicates, true); if (!NetUtils.isValidIp4(existingPodIpRange[0]) || !NetUtils.isValidIp4(existingPodIpRange[1])) { continue; if (!NetUtils.getCidrSubNet(existingPodIpRange[0], cidrSize).equalsIgnoreCase(NetUtils.getCidrSubNet(cidrAddress, cidrSize))) { throw new InvalidParameterValueException("The start address of the some IP range is not in the CIDR subnet."); if (!NetUtils.getCidrSubNet(existingPodIpRange[1], cidrSize).equalsIgnoreCase(NetUtils.getCidrSubNet(cidrAddress, cidrSize))) { throw new InvalidParameterValueException("The end address of the some IP range is not in the CIDR subnet."); if (NetUtils.ipRangesOverlap(existingPodIpRange[0], existingPodIpRange[1], gateway, gateway)) { throw new InvalidParameterValueException("The gateway shouldn't overlap some start/end ip addresses");
if (!NetUtils.verifyDomainName(domainSuffix)) { throw new InvalidParameterValueException( "Invalid network domain. Total length shouldn't exceed 190 chars. Each domain label must be between 1 and 63 characters long, can contain ASCII letters 'a' through 'z', the digits '0' through '9', " if (!NetUtils.isValidIp4Cidr(guestVmCidr)) { throw new InvalidParameterValueException("Invalid format of Guest VM CIDR."); if (!NetUtils.validateGuestCidr(guestVmCidr)) { throw new InvalidParameterValueException("Invalid format of Guest VM CIDR. Make sure it is RFC1918 compliant. "); if (!NetUtils.isNetworkAWithinNetworkB(guestVmCidr, networkCidr)) { throw new InvalidParameterValueException("Invalid value of Guest VM CIDR. For IP Reservation, Guest VM CIDR should be a subset of network CIDR : " + networkCidr); if (!NetUtils.isNetworkAWithinNetworkB(guestVmCidr, network.getCidr())) { throw new InvalidParameterValueException("Invalid value of Guest VM CIDR. For IP Reservation, Guest VM CIDR should be a subset of network CIDR : " + network.getCidr()); String cidrIpRange[] = NetUtils.getIpRangeFromCidr(guestVmCidrPair[0], size); s_logger.info("The start IP of the specified guest vm cidr is: " + cidrIpRange[0] + " and end IP is: " + cidrIpRange[1]); long startIp = NetUtils.ip2Long(cidrIpRange[0]); long endIp = NetUtils.ip2Long(cidrIpRange[1]); long range = endIp - startIp + 1; s_logger.info("The specified guest vm cidr has " + range + " IPs"); long nicIp = NetUtils.ip2Long(nic.getIPv4Address()); if (NetUtils.isSameIpRange(guestVmCidr, network.getCidr()) && !guestVmCidr.equals(network.getCidr())) { throw new InvalidParameterValueException("The Start IP and End IP of guestvmcidr: " + guestVmCidr + " and CIDR: " + network.getCidr() + " are same, " + "even though both the cidrs appear to be different. As a precaution no IP Reservation will be applied.");
public static String[] getLinkLocalIPRange(final int size) { if (size > 16 || size <= 0) { return null; } /* reserve gateway */ final String[] range = getIpRangeFromCidr(getLinkLocalGateway(), MAX_CIDR - size); if (range[0].equalsIgnoreCase(getLinkLocalGateway())) { /* remove the gateway */ long ip = ip2Long(range[0]); ip += 1; range[0] = long2Ip(ip); } return range; }
public static String getCidrSubNet(final String cidr) { if (cidr == null || cidr.isEmpty()) { return null; } final String[] cidrPair = cidr.split("\\/"); if (cidrPair.length != 2) { return null; } final String cidrAddress = cidrPair[0]; final String cidrSize = cidrPair[1]; if (!isValidIp4(cidrAddress)) { return null; } long cidrSizeNum = getCidrSizeFromString(cidrSize); final long numericNetmask = netMaskFromCidr(cidrSizeNum); final String netmask = NetUtils.long2Ip(numericNetmask); return getSubNet(cidrAddress, netmask); }
public static Long[] cidrToLong(final String cidr) { if (cidr == null || cidr.isEmpty()) { throw new CloudRuntimeException("empty cidr can not be converted to longs"); } final String[] cidrPair = cidr.split("\\/"); if (cidrPair.length != 2) { throw new CloudRuntimeException("cidr is not formatted correctly: "+ cidr); } final String cidrAddress = cidrPair[0]; final String cidrSize = cidrPair[1]; if (!isValidIp4(cidrAddress)) { throw new CloudRuntimeException("cidr is not valid in ip space" + cidr); } long cidrSizeNum = getCidrSizeFromString(cidrSize); final long numericNetmask = netMaskFromCidr(cidrSizeNum); final long ipAddr = ip2Long(cidrAddress); final Long[] cidrlong = {ipAddr & numericNetmask, cidrSizeNum}; return cidrlong; }
response.setNetmask(NetUtils.cidr2Netmask(network.getNetworkCidr())); response.setNetmask(NetUtils.cidr2Netmask(network.getCidr())); if ((network.getCidr() != null) && (NetUtils.isNetworkAWithinNetworkB(network.getCidr(), network.getNetworkCidr()))) { String[] guestVmCidrPair = network.getCidr().split("\\/"); String[] guestCidrPair = network.getNetworkCidr().split("\\/"); Long guestCidrSize = Long.valueOf(guestCidrPair[1]); String[] guestVmIpRange = NetUtils.getIpRangeFromCidr(guestVmCidrPair[0], guestVmCidrSize); String[] guestIpRange = NetUtils.getIpRangeFromCidr(guestCidrPair[0], guestCidrSize); long startGuestIp = NetUtils.ip2Long(guestIpRange[0]); long endGuestIp = NetUtils.ip2Long(guestIpRange[1]); long startVmIp = NetUtils.ip2Long(guestVmIpRange[0]); long endVmIp = NetUtils.ip2Long(guestVmIpRange[1]); reservation = (NetUtils.long2Ip(endVmIp + 1) + "-" + NetUtils.long2Ip(endGuestIp)); reservation = (NetUtils.long2Ip(startGuestIp) + "-" + NetUtils.long2Ip(startVmIp - 1)); reservation = (NetUtils.long2Ip(startGuestIp) + "-" + NetUtils.long2Ip(startVmIp - 1) + " , " + NetUtils.long2Ip(endVmIp + 1) + "-" + NetUtils.long2Ip(endGuestIp));
private void updatePodNetmaskIfNeeded(HostPodVO pod, String agentNetmask) { // If the server's private netmask is less inclusive than the pod's CIDR // netmask, update cidrSize of the default POD //(reason: we are maintaining pods only for internal accounting.) long cidrSize = pod.getCidrSize(); String cidrNetmask = NetUtils.getCidrSubNet("255.255.255.255", cidrSize); long cidrNetmaskNumeric = NetUtils.ip2Long(cidrNetmask); long serverNetmaskNumeric = NetUtils.ip2Long(agentNetmask);// if (serverNetmaskNumeric > cidrNetmaskNumeric) { //update pod's cidrsize int newCidrSize = new Long(NetUtils.getCidrSize(agentNetmask)).intValue(); pod.setCidrSize(newCidrSize); _podDao.update(pod.getId(), pod); } }
public static boolean isIpInCidrList(final InetAddress address, final String[] cidrlist) { boolean match = false; for (String cidr: cidrlist) { try { if (address instanceof Inet6Address && isValidIp6Cidr(cidr)) { if (isIp6InNetwork(IPv6Address.fromInetAddress(address), IPv6Network.fromString(cidr))) { match = true; break; } } else if (address instanceof Inet4Address && isValidIp4Cidr(cidr)) { if (NetUtils.isIpWithInCidrRange(address.getHostAddress(), cidr)) { match = true; break; } } } catch (IllegalArgumentException e) { continue; } } return match; }
public static boolean isSameIpRange(final String cidrA, final String cidrB) { if (!NetUtils.isValidIp4Cidr(cidrA)) { s_logger.info("Invalid value of cidr " + cidrA); return false; } if (!NetUtils.isValidIp4Cidr(cidrB)) { s_logger.info("Invalid value of cidr " + cidrB); return false; } final String[] cidrPairFirst = cidrA.split("\\/"); final String[] cidrPairSecond = cidrB.split("\\/"); final Long networkSizeFirst = Long.valueOf(cidrPairFirst[1]); final Long networkSizeSecond = Long.valueOf(cidrPairSecond[1]); final String ipRangeFirst[] = NetUtils.getIpRangeFromCidr(cidrPairFirst[0], networkSizeFirst); final String ipRangeSecond[] = NetUtils.getIpRangeFromCidr(cidrPairFirst[0], networkSizeSecond); final long startIpFirst = NetUtils.ip2Long(ipRangeFirst[0]); final long endIpFirst = NetUtils.ip2Long(ipRangeFirst[1]); final long startIpSecond = NetUtils.ip2Long(ipRangeSecond[0]); final long endIpSecond = NetUtils.ip2Long(ipRangeSecond[1]); if (startIpFirst == startIpSecond && endIpFirst == endIpSecond) { return true; } return false; }
public static long getCidrSize(final String netmask) { final long ip = ip2Long(netmask); int count = 0; for (int i = 0; i < MAX_CIDR; i++) { if ((ip >> i & 0x1) == 0) { count++; } else { break; } } return MAX_CIDR - count; }
nic.setMacAddress(NetUtils.long2Mac(NetUtils.ip2Long(ip) | (14l << 40))); nic.setIPv4Netmask("255.255.0.0"); nic.setFormat(AddressFormat.Ip4); nic.setIPv4Gateway(NetUtils.getLinkLocalGateway());