2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.protocol.util;
10 import com.google.common.base.Preconditions;
11 import com.google.common.net.InetAddresses;
12 import com.google.common.primitives.UnsignedBytes;
13 import io.netty.buffer.ByteBuf;
14 import io.netty.buffer.Unpooled;
15 import java.net.InetAddress;
16 import java.net.InetSocketAddress;
17 import java.util.ArrayList;
18 import java.util.Arrays;
19 import java.util.Collections;
20 import java.util.List;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
30 * Util class for creating generated Ipv4Address.
32 public final class Ipv4Util {
33 public static final int IP4_LENGTH = 4;
34 public static final int IP4_BITS_LENGTH = 32;
36 static final int PREFIX_BYTE_LENGTH = IP4_LENGTH + 1;
38 private static final Ipv4Prefix EMPTY_PREFIX = new Ipv4Prefix("0.0.0.0/0");
45 * Reads from ByteBuf buffer and converts bytes to Ipv4Address.
47 * @param buffer containing Ipv4 address, starting at reader index
50 public static Ipv4Address addressForByteBuf(final ByteBuf buffer) {
51 return IetfInetUtil.INSTANCE.ipv4AddressFor(ByteArray.readBytes(buffer, IP4_LENGTH));
55 * Reads from ByteBuf buffer and converts bytes to Ipv4Address.
57 * @param buffer containing Ipv4 address, starting at reader index
58 * @return Ipv4AddressNoZone
60 public static Ipv4AddressNoZone noZoneAddressForByteBuf(final ByteBuf buffer) {
61 return IetfInetUtil.INSTANCE.ipv4AddressNoZoneFor(ByteArray.readBytes(buffer, IP4_LENGTH));
65 * From string ipAddress creates an InetAddress and puts it into ByteBuf.
67 * @param ipAddress Ipv4 address
68 * @return ByteBuf with filled in bytes from ipAddress
70 public static ByteBuf byteBufForAddress(final Ipv4Address ipAddress) {
71 return Unpooled.wrappedBuffer(bytesForAddress(ipAddress));
75 * Converts Ipv4Address to byte array.
77 * @param address Ipv4Address to be converted
80 public static byte[] bytesForAddress(final Ipv4Address address) {
81 return IetfInetUtil.INSTANCE.ipv4AddressBytes(address);
84 public static int prefixBitsToBytes(final int bits) {
85 if (bits % Byte.SIZE != 0) {
86 return bits / Byte.SIZE + 1;
88 return bits / Byte.SIZE;
92 * Returns number of minimum bytes needed to cover all bits of prefix.
94 public static int getPrefixLengthBytes(final String prefix) {
95 return prefixBitsToBytes(Ipv4Util.getPrefixLength(prefix));
99 * Converts Ipv4Prefix to byte array. Prefix length at the end.
101 * @param prefix Ipv4Prefix to be converted
102 * @return byte array with prefix length at the end
104 public static byte[] bytesForPrefix(final Ipv4Prefix prefix) {
105 return IetfInetUtil.INSTANCE.ipv4PrefixToBytes(prefix);
109 * Creates an Ipv4Prefix object from given byte array.
111 * @param bytes IPv4 address
112 * @param length prefix length
113 * @return Ipv4Prefix object
115 public static Ipv4Prefix prefixForBytes(final byte[] bytes, final int length) {
116 Preconditions.checkArgument(length <= bytes.length * Byte.SIZE);
119 if (bytes.length != IP4_LENGTH) {
120 tmp = Arrays.copyOfRange(bytes, 0, IP4_LENGTH);
125 return IetfInetUtil.INSTANCE.ipv4PrefixFor(tmp, length);
129 * Creates an Ipv4Prefix object from given ByteBuf. Prefix length is assumed to
130 * be in the left most byte of the buffer.
132 * @param buf Buffer containing serialized prefix
133 * @return Ipv4Prefix object
135 public static Ipv4Prefix prefixForByteBuf(final ByteBuf buf) {
136 final int prefixLength = UnsignedBytes.toInt(buf.readByte());
137 return prefixForByteBuf(buf, prefixLength);
141 * Creates an Ipv4Prefix object from given ByteBuf with specified NLRI length.
143 * @param buf Buffer containing serialized prefix
144 * @param prefixLength Prefix length
145 * @return Ipv4Prefix object
147 public static Ipv4Prefix prefixForByteBuf(final ByteBuf buf, final int prefixLength) {
148 final int size = prefixLength / Byte.SIZE + (prefixLength % Byte.SIZE == 0 ? 0 : 1);
149 final int readable = buf.readableBytes();
150 Preconditions.checkArgument(size <= readable, "Illegal length of IP prefix: %s/%s", size, readable);
152 final byte[] bytes = new byte[IP4_LENGTH];
153 buf.readBytes(bytes, 0, size);
154 return IetfInetUtil.INSTANCE.ipv4PrefixFor(bytes, prefixLength);
158 * Creates a list of Ipv4 Prefixes from given byte array.
160 * @param bytes to be converted to List of Ipv4Prefixes.
161 * @return A list of Ipv4Prefixes
163 public static List<Ipv4Prefix> prefixListForBytes(final byte[] bytes) {
164 if (bytes.length == 0) {
165 return Collections.emptyList();
167 final List<Ipv4Prefix> list = new ArrayList<>();
169 while (byteOffset < bytes.length) {
170 final int bitLength = UnsignedBytes.toInt(bytes[byteOffset]);
172 // if length == 0, default route will be added
173 if (bitLength == 0) {
174 list.add(EMPTY_PREFIX);
178 list.add(IetfInetUtil.INSTANCE.ipv4PrefixForShort(bytes, byteOffset, bitLength));
179 byteOffset += bitLength / Byte.SIZE;
180 if (bitLength % Byte.SIZE != 0) {
189 * Obtains prefix length from given string prefix.
191 * @param prefixValue value of prefix
192 * @return prefix length
194 protected static int getPrefixLength(final String prefixValue) {
195 final int sep = prefixValue.indexOf('/');
196 return Integer.parseInt(prefixValue.substring(sep + 1, prefixValue.length()));
200 * Converts InetAddress to IpAddress.
202 * @param inetAddress address
205 public static IpAddress getIpAddress(final InetAddress inetAddress) {
206 return IetfInetUtil.INSTANCE.ipAddressFor(inetAddress);
210 * Converts IpAddress and PortNumber to InetSocketAddress.
212 * @param ipAddress address
214 * @return InetSocketAddress
216 public static InetSocketAddress toInetSocketAddress(final IpAddress ipAddress, final PortNumber port) {
217 final String ipString = toStringIP(ipAddress);
218 return new InetSocketAddress(InetAddresses.forString(ipString), port.getValue().toJava());
224 * @param ipv4Address String containing Ipv4Address
225 * @return String containing Ipv4Address incremented by 1
227 public static String incrementIpv4Address(final String ipv4Address) {
228 return InetAddresses.increment(InetAddresses.forString(ipv4Address)).getHostAddress();
234 * @param ipv4Address ipv4 address to be incremented
235 * @return new ipv4 address
237 public static Ipv4Address incrementIpv4Address(final Ipv4Address ipv4Address) {
238 return new Ipv4Address(incrementIpv4Address(ipv4Address.getValue()));
241 public static Ipv4Prefix incrementIpv4Prefix(final Ipv4Prefix ipv4Prefix) {
242 final Map.Entry<Ipv4Address, Integer> splitIpv4Prefix = IetfInetUtil.INSTANCE.splitIpv4Prefix(ipv4Prefix);
243 return IetfInetUtil.INSTANCE.ipv4PrefixFor(incrementIpv4Address(splitIpv4Prefix.getKey()),
244 splitIpv4Prefix.getValue());
248 * Get string representation of IpAddress.
250 * @param ipAddress address
251 * @return String value of Ipv4Address or Ipv6Address
253 public static String toStringIP(final IpAddress ipAddress) {
254 if (ipAddress.getIpv4Address() != null) {
255 return ipAddress.getIpv4Address().getValue();
257 return ipAddress.getIpv6Address().getValue();