mirror of https://github.com/apache/cloudstack.git
137 lines
3.8 KiB
Java
137 lines
3.8 KiB
Java
// 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;
|
|
}
|
|
}
|