mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
131 lines
4.2 KiB
Java
131 lines
4.2 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;
|
|
}
|
|
}
|