// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package com.cloud.bridge.util; import java.io.IOException; /** * Represents a network IP address or a range of addresses. * A range is useful when representing IP addresses defined in * CIDR format. The range is a 32 bit IP inclusive. */ public class IpAddressRange { private long minAddress; private long maxAddress; public IpAddressRange() { } public long getMinAddress() { return minAddress; } public void setMinAddress(long param) { this.minAddress = param; } public long getMaxAddress() { return maxAddress; } public void setMaxAddress(long param) { this.maxAddress = param; } public String toString() { StringBuffer value = new StringBuffer(); value.append("(ip range min: " + minAddress); value.append(", max: " + maxAddress + ")"); return value.toString(); } /** * Is the parameter (i.e., left) inside the range represented by this object? * @param left * @return boolean */ public boolean contains(IpAddressRange left) { long leftMin = left.getMinAddress(); if (leftMin < minAddress || leftMin > maxAddress) return false; else return true; } public static IpAddressRange parseRange(String ipAddress) throws Exception { IpAddressRange range = null; long maskBits = 0; long address = 0; if (null == ipAddress) return null; // -> is it a CIDR format? String[] halfs = ipAddress.split("/"); if (2 == halfs.length) { range = new IpAddressRange(); address = IpAddressRange.ipToInt(halfs[0]); maskBits = Integer.parseInt(halfs[1]) & 0xFF; if (maskBits >= 1 && maskBits <= 32) { range.setMinAddress(address & (~((1 << (32 - maskBits)) - 1) & 0xFFFFFFFF)); range.setMaxAddress(range.getMinAddress() | (((1 << (32 - maskBits)) - 1) & 0xFFFFFFFF)); } } else if (1 == halfs.length) { // -> should be just a simple IP address range = new IpAddressRange(); address = IpAddressRange.ipToInt(ipAddress); range.setMaxAddress(address); range.setMinAddress(address); } else throw new Exception("Invalid Ip Address: " + ipAddress); return range; } /** * In order to do unsigned math here we must use long types so that high order bits * are not used as the sign of the number. * * @param ipAddress * @return */ private static long ipToInt(String ipAddress) throws Exception { String[] parts = ipAddress.split("[.]"); if (4 != parts.length) throw new Exception("Invalid Ip Address: " + ipAddress); long[] address = new long[4]; address[0] = Long.parseLong(parts[0]); address[1] = Long.parseLong(parts[1]); address[2] = Long.parseLong(parts[2]); address[3] = Long.parseLong(parts[3]); if (address[0] < 0 || address[1] < 0 || address[2] < 0 || address[3] < 0) throw new Exception("Invalid Ip Address: " + ipAddress); if (address[0] > 255 || address[1] > 255 || address[2] > 255 || address[3] > 255) throw new Exception("Invalid Ip Address: " + ipAddress); long value = (address[0] << 24) | (address[1] << 16) | (address[2] << 8) | address[3]; return value; } }