/* * Copyright 2011 Cloud.com, Inc. * * Licensed 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; } }