public static String getIPv6AddresFromMac(String networkCidr, String mac) { IPv6Network network = IPv6Network.fromString(networkCidr); if (network.getNetmask().asPrefixLength() > 64) { return null; } int idx = networkCidr.indexOf("::"); String[] macs = mac.split(":"); String ip = networkCidr.substring(0, idx) + "::" + Integer.toHexString(Integer.parseInt(macs[0], 16) ^ 2) + macs[1] + ":" + macs[2] + "ff:fe" + macs[3] +":" + macs[4] + macs[5]; return getIpv6AddressCanonicalString(ip); }
public static int getIp6CidrSize(final String ip6Cidr) { IPv6Network network = null; try { network = IPv6Network.fromString(ip6Cidr); } catch (final IllegalArgumentException ex) { return 0; } return network.getNetmask().asPrefixLength(); }
public static int getPrefixLenOfNetworkCidr(String cidr) { IPv6Network network = IPv6Network.fromString(cidr); return network.getNetmask().asPrefixLength(); }
public static IPv6Address EUI64Address(final IPv6Network cidr, final String macAddress) { if (cidr.getNetmask().asPrefixLength() > 64) { throw new IllegalArgumentException("IPv6 subnet " + cidr.toString() + " is not 64 bits or larger in size"); } String mac[] = macAddress.toLowerCase().split(":"); return IPv6Address.fromString(cidr.getFirst().toString() + Integer.toHexString(Integer.parseInt(mac[0], 16) ^ 2) + mac[1] + ":" + mac[2] + "ff:fe" + mac[3] +":" + mac[4] + mac[5]); }
public static String getFormalNetmaskOfNetworkCidr(String cidr) { Integer prefix = IPv6Network.fromString(cidr).getNetmask().asPrefixLength(); return getFormalNetmaskOfNetworkCidr(prefix); }
public static boolean isValidUnicastNetworkCidr(String networkCidr) { try { IPv6Network network = IPv6Network.fromString(networkCidr); if ((network.getNetmask().asPrefixLength() > IPv6Constants.IPV6_PREFIX_LEN_MAX) || (network.getNetmask().asPrefixLength() < IPv6Constants.IPV6_PREFIX_LEN_MIN)) { return false; } return !(network.getFirst().isSiteLocal() || network.getFirst().isLinkLocal() || network.getFirst().isMulticast()); } catch (Exception e) { return false; } }
public static String getGatewayOfNetworkCidr(String cidr) { IPv6Network network = IPv6Network.fromString(cidr); if (network.getNetmask().asPrefixLength() <= 127) { return network.getFirst().add(1).toString(); } else { return network.getFirst().toString(); } }
public static String getStartIpOfNetworkCidr(String cidr) { IPv6Network network = IPv6Network.fromString(cidr); if (network.getNetmask().asPrefixLength() < 127) { return network.getFirst().add(2).toString(); } else { return network.getFirst().toString(); } }
/** * Split a network in smaller subnets of a given size. * * @param size size (expressed as {@link com.googlecode.ipv6.IPv6NetworkMask}) of the subnets * @return iterator of the splitted subnets. * @throws IllegalArgumentException if the requested size is bigger than the original size */ public Iterator<IPv6Network> split(IPv6NetworkMask size) { if (size.asPrefixLength() < this.getNetmask().asPrefixLength()) throw new IllegalArgumentException(String.format("Can not split a network of size %s in subnets of larger size %s", this.getNetmask().asPrefixLength(), size.asPrefixLength())); return new IPv6NetworkSplitsIterator(size); }
/** * Split a network in smaller subnets of a given size. * * @param size size (expressed as {@link com.googlecode.ipv6.IPv6NetworkMask}) of the subnets * @return iterator of the splitted subnets. * @throws IllegalArgumentException if the requested size is bigger than the original size */ public Iterator<IPv6Network> split(IPv6NetworkMask size) { if (size.asPrefixLength() < this.getNetmask().asPrefixLength()) throw new IllegalArgumentException(String.format("Can not split a network of size %s in subnets of larger size %s", this.getNetmask().asPrefixLength(), size.asPrefixLength())); return new IPv6NetworkSplitsIterator(size); }
/** * @return like <code>toString</code> but without using shorthand notations for addresses */ public String toLongString() { return address.toLongString() + "/" + networkMask.asPrefixLength(); }
public IPv6NetworkSplitsIterator(IPv6NetworkMask size) { this.size = size; this.nbrAddressesPerSplit = BigInteger.ONE.shiftLeft(128 - size.asPrefixLength()); this.current = IPv6Network.fromAddressAndMask(IPv6Network.this.address, size); }
public IPv6NetworkSplitsIterator(IPv6NetworkMask size) { this.size = size; this.nbrAddressesPerSplit = BigInteger.ONE.shiftLeft(128 - size.asPrefixLength()); this.current = IPv6Network.fromAddressAndMask(IPv6Network.this.address, size); }
@Override public String toString() { return address.toString() + "/" + networkMask.asPrefixLength(); }
@Override public String toString() { return address.toString() + "/" + networkMask.asPrefixLength(); }
/** * @return like <code>toString</code> but without using shorthand notations for addresses */ public String toLongString() { return address.toLongString() + "/" + networkMask.asPrefixLength(); }
private void validateRangeIsMultipleOfSubnetsOfGivenSize(IPv6AddressRange range, IPv6NetworkMask allocationSubnetSize) { final int allocatableBits = 128 - allocationSubnetSize.asPrefixLength(); if (range.getFirst().numberOfTrailingZeroes() < allocatableBits) throw new IllegalArgumentException( "range [" + this + "] is not aligned with prefix length [" + allocationSubnetSize.asPrefixLength() + "], " + "first address should end with " + allocatableBits + " zero bits"); if (range.getLast().numberOfTrailingOnes() < allocatableBits) throw new IllegalArgumentException( "range [" + this + "] is not aligned with prefix length [" + allocationSubnetSize.asPrefixLength() + "], last address should end with " + allocatableBits + " one bits"); }
private void validateRangeIsMultipleOfSubnetsOfGivenSize(IPv6AddressRange range, IPv6NetworkMask allocationSubnetSize) { final int allocatableBits = 128 - allocationSubnetSize.asPrefixLength(); if (range.getFirst().numberOfTrailingZeroes() < allocatableBits) throw new IllegalArgumentException( "range [" + this + "] is not aligned with prefix length [" + allocationSubnetSize.asPrefixLength() + "], " + "first address should end with " + allocatableBits + " zero bits"); if (range.getLast().numberOfTrailingOnes() < allocatableBits) throw new IllegalArgumentException( "range [" + this + "] is not aligned with prefix length [" + allocationSubnetSize.asPrefixLength() + "], last address should end with " + allocatableBits + " one bits"); }
public static int getIp6CidrSize(final String ip6Cidr) { IPv6Network network = null; try { network = IPv6Network.fromString(ip6Cidr); } catch (final IllegalArgumentException ex) { return 0; } return network.getNetmask().asPrefixLength(); }
public boolean isFree(final IPv6Network network) { if (network == null) throw new IllegalArgumentException("network invalid [null]"); if (!this.allocationSubnetSize.equals(network.getNetmask())) throw new IllegalArgumentException( "network of prefix length [" + network.getNetmask().asPrefixLength() + "] can not be free in a pool which uses prefix length [" + allocationSubnetSize + "]"); // find a free range that contains the network for (IPv6AddressRange freeRange : freeRanges) { if (freeRange.contains(network)) { return true; } } // nothing found return false; }