Reliable SMR async
[lispflowmapping.git] / mappingservice / lisp-proto / src / main / java / org / opendaylight / lispflowmapping / lisp / util / LispAddressUtil.java
1 /*
2  * Copyright (c) 2014 Contextream, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.lispflowmapping.lisp.util;
9
10 import com.google.common.base.Preconditions;
11 import com.google.common.collect.Lists;
12 import com.google.common.net.InetAddresses;
13 import java.net.Inet4Address;
14 import java.net.Inet6Address;
15 import java.net.InetAddress;
16 import java.util.ArrayList;
17 import java.util.List;
18 import java.util.regex.Pattern;
19 import org.apache.commons.lang3.tuple.ImmutablePair;
20 import org.apache.commons.lang3.tuple.Pair;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
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.IpPrefix;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
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.Ipv6Address;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.AsNumberAfi;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameAfi;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameType;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ExplicitLocatorPathLcaf;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.InstanceIdType;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6Afi;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6PrefixAfi;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.KeyValueAddressLcaf;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddressFamily;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.NoAddressAfi;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathIdType;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathLcaf;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.AsNumberBuilder;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.DistinguishedNameBuilder;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6PrefixBuilder;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.MacBuilder;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.NoAddressBuilder;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePathBuilder;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.ExplicitLocatorPathBuilder;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop.LrsBits;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.HopBuilder;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.key.value.address.KeyValueAddressBuilder;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePath;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKey;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder;
67 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.IpAddressBinary;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv4AddressBinary;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv6AddressBinary;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4BinaryAfi;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4PrefixBinaryAfi;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv6BinaryAfi;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv6PrefixBinaryAfi;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4Binary;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4BinaryBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4PrefixBinary;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4PrefixBinaryBuilder;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6Binary;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6BinaryBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6PrefixBinary;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6PrefixBinaryBuilder;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.EidBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRloc;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
90 import org.slf4j.Logger;
91 import org.slf4j.LoggerFactory;
92
93 public final class LispAddressUtil {
94     protected static final Logger LOG = LoggerFactory.getLogger(LispAddressUtil.class);
95
96     public static final short STARTING_SERVICE_INDEX = 255;
97     private static final Pattern IP4_PATTERN =
98             Pattern.compile("(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])",
99             Pattern.CASE_INSENSITIVE);
100     private static final Pattern IP6_PATTERN =
101             Pattern.compile("([0-9a-f]{1,4}:){7}([0-9a-f]){1,4}", Pattern.CASE_INSENSITIVE);
102
103     // Utility class, should not be instantiated
104     private LispAddressUtil() {
105     }
106
107     public static Class<? extends LispAddressFamily> addressTypeFromSimpleAddress(SimpleAddress address) {
108         if (address.getIpAddress() != null) {
109             return binaryAddressTypeFromIpAddress(address.getIpAddress());
110         } else if (address.getIpPrefix() != null) {
111             return addressTypeFromIpPrefix(address.getIpPrefix());
112         } else if (address.getMacAddress() != null) {
113             return MacAfi.class;
114         } else if (address.getDistinguishedNameType() != null) {
115             return DistinguishedNameAfi.class;
116         } else if (address.getAsNumber() != null) {
117             return AsNumberAfi.class;
118         }
119         return null;
120     }
121
122     public static Address addressFromSimpleAddress(SimpleAddress address) {
123         if (address.getIpAddress() != null) {
124             return binaryAddressFromIpAddress(address.getIpAddress());
125         } else if (address.getIpPrefix() != null) {
126             return addressFromIpPrefix(address.getIpPrefix());
127         } else if (address.getMacAddress() != null) {
128             return addressFromMacAddress(address.getMacAddress());
129         } else if (address.getDistinguishedNameType() != null) {
130             return addressFromDistinguishedName(address.getDistinguishedNameType());
131         } else if (address.getAsNumber() != null) {
132             return addressFromAsNumber(address.getAsNumber());
133         }
134         return null;
135     }
136
137     public static Class<? extends LispAddressFamily> addressTypeFromInet(InetAddress address) {
138         if (address instanceof Inet4Address) {
139             return Ipv4Afi.class;
140         } else if (address instanceof Inet6Address) {
141             return Ipv6Afi.class;
142         }
143         return null;
144     }
145
146     public static Address addressFromInet(InetAddress address) {
147         if (address instanceof Inet4Address) {
148             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
149                     .rev151105.lisp.address.address.Ipv4Builder()
150                     .setIpv4(IetfInetUtil.INSTANCE.ipv4AddressFor(address)).build();
151         } else if (address instanceof Inet6Address) {
152             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
153                     .rev151105.lisp.address.address.Ipv6Builder()
154                     .setIpv6(IetfInetUtil.INSTANCE.ipv6AddressFor(address)).build();
155         }
156         return null;
157     }
158
159     public static Class<? extends LispAddressFamily> binaryAddressTypeFromInet(InetAddress address) {
160         if (address instanceof Inet4Address) {
161             return Ipv4BinaryAfi.class;
162         } else if (address instanceof Inet6Address) {
163             return Ipv6BinaryAfi.class;
164         }
165         return null;
166     }
167
168     public static Address binaryAddressFromInet(InetAddress address) {
169         if (address instanceof Inet4Address) {
170             return (Address) new Ipv4BinaryBuilder().setIpv4Binary(new Ipv4AddressBinary(address.getAddress())).build();
171         } else if (address instanceof Inet6Address) {
172             return (Address) new Ipv6BinaryBuilder().setIpv6Binary(new Ipv6AddressBinary(address.getAddress())).build();
173         }
174         return null;
175     }
176
177     public static Class<? extends LispAddressFamily> addressTypeFromIpAddress(IpAddress address) {
178         if (address == null) {
179             return null;
180         } else if (address.getIpv4Address() != null) {
181             return Ipv4Afi.class;
182         } else if (address.getIpv6Address() != null) {
183             return Ipv6Afi.class;
184         }
185         return null;
186     }
187
188     public static Class<? extends LispAddressFamily> binaryAddressTypeFromIpAddress(IpAddress address) {
189         if (address == null) {
190             return null;
191         } else if (address.getIpv4Address() != null) {
192             return Ipv4BinaryAfi.class;
193         } else if (address.getIpv6Address() != null) {
194             return Ipv6BinaryAfi.class;
195         }
196         return null;
197     }
198
199     public static Address addressFromIpAddress(IpAddress address) {
200         if (address == null) {
201             return null;
202         } else if (address.getIpv4Address() != null) {
203             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
204                     .rev151105.lisp.address.address.Ipv4Builder().setIpv4(address.getIpv4Address()).build();
205         } else if (address.getIpv6Address() != null) {
206             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
207                     .rev151105.lisp.address.address.Ipv6Builder().setIpv6(address.getIpv6Address()).build();
208         }
209         return null;
210     }
211
212
213     public static Address binaryAddressFromIpAddress(IpAddress address) {
214         if (address == null) {
215             return null;
216         } else if (address.getIpv4Address() != null) {
217             return (Address) new Ipv4BinaryBuilder().setIpv4Binary(new Ipv4AddressBinary(
218                     InetAddresses.forString(address.getIpv4Address().getValue()).getAddress())).build();
219         } else if (address.getIpv6Address() != null) {
220             return (Address) new Ipv6BinaryBuilder().setIpv6Binary(new Ipv6AddressBinary(
221                     InetAddresses.forString(address.getIpv6Address().getValue()).getAddress())).build();
222         }
223         return null;
224     }
225
226     public static Class<? extends LispAddressFamily> addressTypeFromIpPrefix(IpPrefix address) {
227         if (address == null) {
228             return null;
229         } else if (address.getIpv4Prefix() != null) {
230             return Ipv4PrefixAfi.class;
231         } else if (address.getIpv6Prefix() != null) {
232             return Ipv6PrefixAfi.class;
233         }
234         return null;
235     }
236
237     public static Address addressFromIpPrefix(IpPrefix address) {
238         if (address == null) {
239             return null;
240         } else if (address.getIpv4Prefix() != null) {
241             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
242                     .rev151105.lisp.address.address.Ipv4PrefixBuilder().setIpv4Prefix(address.getIpv4Prefix()).build();
243         } else if (address.getIpv6Prefix() != null) {
244             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
245                     .rev151105.lisp.address.address.Ipv6PrefixBuilder().setIpv6Prefix(address.getIpv6Prefix()).build();
246         }
247         return null;
248     }
249
250     public static Address addressFromMacAddress(MacAddress address) {
251         if (address == null) {
252             return null;
253         } else {
254             return (Address) new MacBuilder().setMac(address).build();
255         }
256     }
257
258     public static Address addressFromServicePath(ServicePath address) {
259         if (address == null) {
260             return null;
261         } else {
262             return (Address) new ServicePathBuilder().setServicePath(address).build();
263         }
264     }
265
266     public static Address addressFromDistinguishedName(DistinguishedNameType address) {
267         if (address == null) {
268             return null;
269         } else {
270             return (Address) new DistinguishedNameBuilder().setDistinguishedName(address).build();
271         }
272     }
273
274     public static Address addressFromAsNumber(AsNumber address) {
275         if (address == null) {
276             return null;
277         } else {
278             return (Address) new AsNumberBuilder().setAsNumber(address).build();
279         }
280     }
281
282     public static Rloc toRloc(SimpleAddress address) {
283         RlocBuilder builder = new RlocBuilder();
284         builder.setAddressType(addressTypeFromSimpleAddress(address));
285         builder.setVirtualNetworkId(null);
286         builder.setAddress(addressFromSimpleAddress(address));
287         return builder.build();
288     }
289
290     public static Rloc toRloc(InetAddress address) {
291         RlocBuilder builder = new RlocBuilder();
292         builder.setAddressType(binaryAddressTypeFromInet(address));
293         builder.setVirtualNetworkId(null);
294         builder.setAddress(binaryAddressFromInet(address));
295         return builder.build();
296     }
297
298     public static Rloc toRloc(Ipv4Address address) {
299         RlocBuilder builder = new RlocBuilder();
300         builder.setAddressType(Ipv4Afi.class);
301         builder.setVirtualNetworkId(null);
302         builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
303         return builder.build();
304     }
305
306     public static Rloc toRloc(Ipv4AddressBinary address) {
307         RlocBuilder builder = new RlocBuilder();
308         builder.setAddressType(Ipv4BinaryAfi.class);
309         builder.setVirtualNetworkId(null);
310         builder.setAddress((Address) new Ipv4BinaryBuilder().setIpv4Binary(address).build());
311         return builder.build();
312     }
313
314     public static Rloc toRloc(Ipv6Address address) {
315         RlocBuilder builder = new RlocBuilder();
316         builder.setAddressType(Ipv6Afi.class);
317         builder.setVirtualNetworkId(null);
318         builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
319         return builder.build();
320     }
321
322     public static Rloc toRloc(Ipv6AddressBinary address) {
323         RlocBuilder builder = new RlocBuilder();
324         builder.setAddressType(Ipv6BinaryAfi.class);
325         builder.setVirtualNetworkId(null);
326         builder.setAddress((Address) new Ipv6BinaryBuilder().setIpv6Binary(address).build());
327         return builder.build();
328     }
329
330     public static Rloc asIpv4Rloc(String address) {
331         return toRloc(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()));
332     }
333
334     public static Rloc asIpv6Rloc(String address) {
335         return toRloc(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()));
336     }
337
338     public static Eid toEid(Ipv4Prefix prefix, InstanceIdType vni) {
339         EidBuilder builder = new EidBuilder();
340         builder.setAddressType(Ipv4PrefixAfi.class);
341         builder.setVirtualNetworkId(vni);
342         builder.setAddress((Address) new Ipv4PrefixBuilder().setIpv4Prefix(prefix).build());
343         return builder.build();
344     }
345
346     public static Eid toEid(Ipv4PrefixBinary prefix, InstanceIdType vni) {
347         EidBuilder builder = new EidBuilder();
348         builder.setAddressType(Ipv4PrefixBinaryAfi.class);
349         builder.setVirtualNetworkId(vni);
350         builder.setAddress((Address) prefix);
351         return builder.build();
352     }
353
354     public static Eid toEid(Ipv6PrefixBinary prefix, InstanceIdType vni) {
355         EidBuilder builder = new EidBuilder();
356         builder.setAddressType(Ipv6PrefixBinaryAfi.class);
357         builder.setVirtualNetworkId(vni);
358         builder.setAddress((Address) prefix);
359         return builder.build();
360     }
361
362     public static Eid toEid(Ipv4Address address, InstanceIdType vni) {
363         EidBuilder builder = new EidBuilder();
364         builder.setAddressType(Ipv4Afi.class);
365         builder.setVirtualNetworkId(vni);
366         builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
367         return builder.build();
368     }
369
370     public static Eid toEid(Ipv4AddressBinary address, InstanceIdType vni) {
371         EidBuilder builder = new EidBuilder();
372         builder.setAddressType(Ipv4BinaryAfi.class);
373         builder.setVirtualNetworkId(vni);
374         builder.setAddress((Address) new Ipv4BinaryBuilder().setIpv4Binary(address).build());
375         return builder.build();
376     }
377
378     public static Eid toEid(IpPrefix prefix, InstanceIdType vni) {
379         EidBuilder builder = new EidBuilder();
380         builder.setAddress(addressFromIpPrefix(prefix));
381         builder.setAddressType(addressTypeFromIpPrefix(prefix));
382         builder.setVirtualNetworkId(vni);
383         return builder.build();
384     }
385
386     public static Eid toEid(Ipv6Address address, InstanceIdType vni) {
387         EidBuilder builder = new EidBuilder();
388         builder.setAddressType(Ipv6Afi.class);
389         builder.setVirtualNetworkId(vni);
390         builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
391         return builder.build();
392     }
393
394     public static Eid toEid(Ipv6AddressBinary address, InstanceIdType vni) {
395         EidBuilder builder = new EidBuilder();
396         builder.setAddressType(Ipv6BinaryAfi.class);
397         builder.setVirtualNetworkId(vni);
398         builder.setAddress((Address) new Ipv6BinaryBuilder().setIpv6Binary(address).build());
399         return builder.build();
400     }
401
402     public static Eid toEid(DistinguishedNameType dn, InstanceIdType vni) {
403         EidBuilder builder = new EidBuilder();
404         builder.setAddressType(DistinguishedNameAfi.class);
405         builder.setVirtualNetworkId(vni);
406         builder.setAddress((Address) new DistinguishedNameBuilder().setDistinguishedName(dn).build());
407         return builder.build();
408     }
409
410     public static Eid toEid(MacAddress mac, InstanceIdType vni) {
411         EidBuilder builder = new EidBuilder();
412         builder.setAddressType(MacAfi.class);
413         builder.setVirtualNetworkId(vni);
414         builder.setAddress((Address) new MacBuilder().setMac(mac).build());
415         return builder.build();
416     }
417
418     public static Eid toEid(Ipv6Prefix prefix, InstanceIdType vni) {
419         EidBuilder builder = new EidBuilder();
420         builder.setAddressType(Ipv6PrefixAfi.class);
421         builder.setVirtualNetworkId(vni);
422         builder.setAddress((Address) new Ipv6PrefixBuilder().setIpv6Prefix(prefix).build());
423         return builder.build();
424     }
425
426     // XXX getMapping rcp fails if VNI set to 0
427     public static Eid toEidNoVni(IpPrefix prefix) {
428         EidBuilder builder = new EidBuilder();
429         builder.setAddress(addressFromIpPrefix(prefix));
430         builder.setAddressType(addressTypeFromIpPrefix(prefix));
431         return builder.build();
432     }
433
434     public static Eid toIpPrefixEid(IpAddress addr, int vni) {
435         // If you touch this, be sure that sfclisp compiles!
436         int mask = addressTypeFromIpAddress(addr) == Ipv4Afi.class ? 32 : 128;
437         IpPrefix prefix = asIpPrefix(String.valueOf(addr.getValue()), mask);
438         // XXX getMapping rcp fails if VNI set to 0
439         return toEidNoVni(prefix);
440     }
441
442     public static Eid asEid(SimpleAddress address, InstanceIdType vni) {
443         EidBuilder builder = new EidBuilder();
444         builder.setAddressType(addressTypeFromSimpleAddress(address));
445         builder.setVirtualNetworkId(vni);
446         // XXX Not sure if the below actually works as expected... also, what happens to AFI?
447         builder.setAddress(addressFromSimpleAddress(address));
448         return builder.build();
449     }
450
451     public static Eid asIpv4PrefixEid(String prefix) {
452         return asIpv4PrefixEid(prefix, null);
453     }
454
455     public static Eid asIpv4PrefixEid(Ipv4Address addr, InstanceIdType vni) {
456         return toEid(new IpPrefix(IetfInetUtil.INSTANCE.ipv4PrefixFor(addr)), vni);
457     }
458
459     public static Eid asIpv4PrefixEid(final String prefix, final InstanceIdType iiType) {
460         return toEid(new Ipv4Prefix(prefix), iiType);
461     }
462
463     public static Eid asIpv4PrefixEid(Eid eid, Inet4Address address, short mask) {
464         EidBuilder builder = new EidBuilder();
465         builder.setAddressType(Ipv4PrefixAfi.class);
466         builder.setVirtualNetworkId(eid.getVirtualNetworkId());
467         builder.setAddress(new Ipv4PrefixBuilder().setIpv4Prefix(
468                 IetfInetUtil.INSTANCE.ipv4PrefixFor(address, mask)).build());
469         return builder.build();
470     }
471
472     public static Eid asIpv4PrefixBinaryEid(final String prefix) {
473         return asIpv4PrefixBinaryEid(prefix, null);
474     }
475
476     public static Eid asIpv4PrefixBinaryEid(final String prefix, final InstanceIdType iiType) {
477         String address = MaskUtil.getPrefixAddress(prefix);
478         short mask = Short.valueOf(MaskUtil.getPrefixMask(prefix));
479         byte[] ipv4 = InetAddresses.forString(address).getAddress();
480         return toEid(new Ipv4PrefixBinaryBuilder().setIpv4AddressBinary(new Ipv4AddressBinary(ipv4))
481                 .setIpv4MaskLength(mask).build(), iiType);
482     }
483
484     public static Eid asIpv4PrefixBinaryEid(Eid eid, byte[] address, short mask) {
485         Preconditions.checkArgument(address.length == 4,
486                 "asIpv4PrefixBinaryEid called with incorrect length byte array ({})", address.length);
487         EidBuilder builder = new EidBuilder();
488         builder.setAddressType(Ipv4PrefixBinaryAfi.class);
489         builder.setVirtualNetworkId(eid.getVirtualNetworkId());
490         builder.setAddress(new Ipv4PrefixBinaryBuilder().setIpv4AddressBinary(new Ipv4AddressBinary(address))
491                 .setIpv4MaskLength(mask).build());
492         return builder.build();
493     }
494
495     public static Eid asIpv4Eid(String address) {
496         return toEid(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()), null);
497     }
498
499     public static Eid asIpv4Eid(String address, long vni) {
500         return toEid(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()), new InstanceIdType(vni));
501     }
502
503     public static Eid asIpv6Eid(String address) {
504         return toEid(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()), null);
505     }
506
507     public static Eid asIpv6Eid(String address, long vni) {
508         return toEid(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()), new InstanceIdType(vni));
509     }
510
511     public static Eid asIpv6PrefixEid(String prefix) {
512         return toEid(new Ipv6Prefix(prefix), null);
513     }
514
515     public static Eid asIpv6PrefixEid(Ipv6Address addr, InstanceIdType vni) {
516         return toEid(new IpPrefix(IetfInetUtil.INSTANCE.ipv6PrefixFor(addr)), vni);
517     }
518
519     public static Eid asIpv6PrefixEid(Eid eid, Inet6Address address, short mask) {
520         EidBuilder builder = new EidBuilder();
521         builder.setAddressType(Ipv6PrefixAfi.class);
522         builder.setVirtualNetworkId(eid.getVirtualNetworkId());
523         builder.setAddress(new Ipv6PrefixBuilder().setIpv6Prefix(
524                 IetfInetUtil.INSTANCE.ipv6PrefixFor(address, mask)).build());
525         return builder.build();
526     }
527
528     public static Eid asIpv6PrefixBinaryEid(final String prefix) {
529         return asIpv6PrefixBinaryEid(prefix, null);
530     }
531
532     public static Eid asIpv6PrefixBinaryEid(final String prefix, final InstanceIdType iiType) {
533         String address = MaskUtil.getPrefixAddress(prefix);
534         short mask = Short.valueOf(MaskUtil.getPrefixMask(prefix));
535         byte[] ipv6 = InetAddresses.forString(address).getAddress();
536         return toEid(new Ipv6PrefixBinaryBuilder().setIpv6AddressBinary(new Ipv6AddressBinary(ipv6))
537                 .setIpv6MaskLength(mask).build(), iiType);
538     }
539
540     public static Eid asIpv6PrefixBinaryEid(Eid eid, byte[] address, short mask) {
541         Preconditions.checkArgument(address.length == 16,
542                 "asIpv6PrefixBinaryEid called with incorrect length byte array ({})", address.length);
543         EidBuilder builder = new EidBuilder();
544         builder.setAddressType(Ipv6PrefixBinaryAfi.class);
545         builder.setVirtualNetworkId(eid.getVirtualNetworkId());
546         builder.setAddress(new Ipv6PrefixBinaryBuilder().setIpv6AddressBinary(new Ipv6AddressBinary(address))
547                 .setIpv6MaskLength(mask).build());
548         return builder.build();
549     }
550
551     public static Eid asBinaryEid(SimpleAddress address, InstanceIdType iid) {
552         if (address.getIpPrefix() != null) {
553             if (address.getIpPrefix().getIpv4Prefix() != null) {
554                 return LispAddressUtil.asIpv4PrefixBinaryEid(address.getIpPrefix().getIpv4Prefix().getValue(), iid);
555             } else if (address.getIpPrefix().getIpv6Prefix() != null) {
556                 return LispAddressUtil.asIpv6PrefixBinaryEid(address.getIpPrefix().getIpv6Prefix().getValue(), iid);
557             }
558         } else if (address.getIpAddress() != null) {
559             if (address.getIpAddress().getIpv4Address() != null) {
560                 LispAddressUtil.toEid(new Ipv4AddressBinary(InetAddresses.forString(
561                         address.getIpAddress().getIpv4Address().getValue()).getAddress()), iid);
562             } else if (address.getIpAddress().getIpv6Address() != null) {
563                 LispAddressUtil.toEid(new Ipv6AddressBinary(InetAddresses.forString(
564                         address.getIpAddress().getIpv6Address().getValue()).getAddress()), iid);
565             }
566         }
567         return LispAddressUtil.asEid(address, iid);
568     }
569
570     public static Eid asIpPrefixBinaryEid(Eid eid) {
571         Address address = eid.getAddress();
572         if (address instanceof Ipv4Binary) {
573             return LispAddressUtil.asIpv4PrefixBinaryEid(eid, ((Ipv4Binary) address).getIpv4Binary().getValue(),
574                     (short) 32);
575         } else if (address instanceof Ipv6Binary) {
576             return LispAddressUtil.asIpv6PrefixBinaryEid(eid, ((Ipv6Binary) address).getIpv6Binary().getValue(),
577                     (short) 128);
578         } else if (address instanceof Ipv4PrefixBinary || address instanceof Ipv6PrefixBinary) {
579             return eid;
580         } else if (address instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address
581                 .types.rev151105.lisp.address.address.Ipv4) {
582             return LispAddressUtil.asIpv4PrefixBinaryEid(((Ipv4) address).getIpv4().getValue() + "/32",
583                     eid.getVirtualNetworkId());
584         } else if (address instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address
585                 .types.rev151105.lisp.address.address.Ipv6) {
586             return LispAddressUtil.asIpv6PrefixBinaryEid(((Ipv6) address).getIpv6().getValue() + "/128",
587                     eid.getVirtualNetworkId());
588         }
589         return convertToBinary(eid);
590     }
591
592     public static int ipVersionFromString(String ip) {
593         if (IP4_PATTERN.matcher(ip).matches()) {
594             return 4;
595         } else if (IP6_PATTERN.matcher(ip).matches()) {
596             return 6;
597         } else {
598             return 0;
599         }
600     }
601
602     public static IpPrefix asIpPrefix(String addr, int mask) {
603         int version = ipVersionFromString(addr);
604         if (version == 4 && (mask >= 0 && mask <= 32)) {
605             return new IpPrefix(new Ipv4Prefix(addr + "/" + mask));
606         } else if (version == 6 && (mask >= 0 && mask <= 128)) {
607             return new IpPrefix(new Ipv6Prefix(addr + "/" + mask));
608         } else {
609             return null;
610         }
611     }
612
613     public static Eid asServicePathEid(long vni, long servicePathId, short serviceIndex) {
614         EidBuilder eb = new EidBuilder();
615         eb.setAddressType(ServicePathLcaf.class);
616         if (vni >= 0) {
617             eb.setVirtualNetworkId(new InstanceIdType(vni));
618         }
619         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
620                 .lisp.address.address.service.path.ServicePathBuilder spb =
621                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
622                 .lisp.address.address.service.path.ServicePathBuilder();
623         spb.setServicePathId(new ServicePathIdType(servicePathId));
624         spb.setServiceIndex(serviceIndex);
625         return eb.setAddress(addressFromServicePath(spb.build())).build();
626     }
627
628     public static Eid asMacEid(String address, long vni) {
629         return toEid(new MacAddress(address), new InstanceIdType(vni));
630     }
631
632     public static Eid asMacEid(String address) {
633         return toEid(new MacAddress(address), null);
634     }
635
636     public static Eid asDistinguishedNameEid(String address, long vni) {
637         return toEid(new MacAddress(address), new InstanceIdType(vni));
638     }
639
640     public static Eid asDistinguishedNameEid(String address) {
641         return toEid(new DistinguishedNameType(address), null);
642     }
643
644     public static Eid asKeyValueAddressEid(SimpleAddress key, SimpleAddress value) {
645         KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
646         kvab.setKey(key);
647         kvab.setValue(value);
648         KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
649                 .rev151105.lisp.address.address.KeyValueAddressBuilder()
650                 .setKeyValueAddress(kvab.build()).build();
651         EidBuilder builder = new EidBuilder();
652         builder.setAddressType(KeyValueAddressLcaf.class);
653         builder.setVirtualNetworkId(null);
654         builder.setAddress((Address) address);
655         return builder.build();
656     }
657
658     public static Rloc asKeyValueAddressRloc(SimpleAddress key, SimpleAddress value) {
659         KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
660         kvab.setKey(key);
661         kvab.setValue(value);
662         KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
663                 .rev151105.lisp.address.address.KeyValueAddressBuilder()
664                 .setKeyValueAddress(kvab.build()).build();
665         RlocBuilder builder = new RlocBuilder();
666         builder.setAddressType(KeyValueAddressLcaf.class);
667         builder.setVirtualNetworkId(null);
668         builder.setAddress((Address) address);
669         return builder.build();
670     }
671
672     public static Rloc asKeyValueAddress(String key, SimpleAddress value) {
673         return asKeyValueAddressRloc(new SimpleAddress(new DistinguishedNameType(key)), value);
674     }
675
676     public static SourceDestKey asSrcDst(String src, String dst, int smask, int dmask) {
677         SourceDestKeyBuilder builder = new SourceDestKeyBuilder();
678         builder.setSource(new SimpleAddress(asIpPrefix(src, smask)));
679         builder.setDest(new SimpleAddress(asIpPrefix(dst, dmask)));
680         return builder.build();
681     }
682
683     public static Eid asSrcDstEid(String src, String dst, int smask, int dmask, int vni) {
684         EidBuilder builder = new EidBuilder();
685         builder.setAddressType(SourceDestKeyLcaf.class);
686         builder.setVirtualNetworkId(new InstanceIdType(Long.valueOf(vni)));
687         builder.setAddress(
688                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
689                         .lisp.address.address.SourceDestKeyBuilder()
690                         .setSourceDestKey(asSrcDst(src, dst, smask, dmask)).build());
691
692         return builder.build();
693     }
694
695     public static Eid asSrcDstEid(SourceDestKey sd, InstanceIdType vni) {
696         EidBuilder builder = new EidBuilder();
697         builder.setAddressType(SourceDestKeyLcaf.class);
698         builder.setVirtualNetworkId(vni);
699         builder.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
700                 .rev151105.lisp.address.address.SourceDestKeyBuilder().setSourceDestKey(sd).build());
701         return builder.build();
702     }
703
704     public static Rloc asTeLcafRloc(List<IpAddress> hopList) {
705         ExplicitLocatorPathBuilder teAddrBuilder = new ExplicitLocatorPathBuilder();
706         teAddrBuilder.setHop(new ArrayList<Hop>());
707         for (IpAddress hop : hopList) {
708             HopBuilder hopBuilder = new HopBuilder();
709             hopBuilder.setAddress(new SimpleAddress(hop));
710             hopBuilder.setHopId("Hop " + teAddrBuilder.getHop().size());
711             hopBuilder.setLrsBits(new LrsBits(false, false, false));
712             teAddrBuilder.getHop().add(hopBuilder.build());
713         }
714
715         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
716             .lisp.address.address.ExplicitLocatorPathBuilder elpBuilder =
717             new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
718             .lisp.address.address.ExplicitLocatorPathBuilder();
719         elpBuilder.setExplicitLocatorPath(teAddrBuilder.build());
720
721         RlocBuilder teBuilder = new RlocBuilder();
722         teBuilder.setAddress(elpBuilder.build());
723         teBuilder.setAddressType(ExplicitLocatorPathLcaf.class);
724         return teBuilder.build();
725     }
726
727     public static List<LocatorRecord> asLocatorRecords(List<Rloc> locators) {
728         List<LocatorRecord> locatorRecords = new ArrayList<LocatorRecord>();
729         for (Rloc locator : locators) {
730             LocatorRecordBuilder locatorBuilder = new LocatorRecordBuilder();
731             locatorBuilder.setLocalLocator(false).setRlocProbed(false).setWeight((short) 1).setPriority((short) 1)
732                     .setMulticastWeight((short) 1).setMulticastPriority((short) 1).setRouted(true)
733                     .setRloc(locator).setLocatorId("SFC_LISP").build();
734             locatorRecords.add(locatorBuilder.build());
735         }
736         return locatorRecords;
737     }
738
739     public static Eid getNoAddressEid() {
740         EidBuilder builder = new EidBuilder();
741         builder.setAddressType(NoAddressAfi.class);
742         builder.setVirtualNetworkId(null);
743         builder.setAddress(new NoAddressBuilder().setNoAddress(true).build());
744         return builder.build();
745     }
746
747     public static byte[] ipAddressToByteArray(Address addr) {
748         if (addr instanceof Ipv4) {
749             return InetAddresses.forString(((Ipv4) addr).getIpv4().getValue()).getAddress();
750         } else if (addr instanceof Ipv6) {
751             return InetAddresses.forString(((Ipv6) addr).getIpv6().getValue()).getAddress();
752         } else if (addr instanceof Ipv4Binary) {
753             return ((Ipv4Binary) addr).getIpv4Binary().getValue();
754         } else if (addr instanceof Ipv6Binary) {
755             return ((Ipv6Binary) addr).getIpv6Binary().getValue();
756         } else {
757             return null;
758         }
759     }
760
761     private static Ipv4PrefixBinary convertToBinary(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
762             .lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix prefix) {
763         Ipv4PrefixBinaryBuilder pb = new Ipv4PrefixBinaryBuilder();
764         byte[] address = InetAddresses.forString(MaskUtil.getAddressStringForIpv4Prefix(prefix)).getAddress();
765         pb.setIpv4AddressBinary(new Ipv4AddressBinary(address));
766         pb.setIpv4MaskLength(MaskUtil.getMaskForAddress(prefix));
767         return pb.build();
768     }
769
770     private static Ipv6PrefixBinary convertToBinary(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
771             .lisp.address.types.rev151105.lisp.address.address.Ipv6Prefix prefix) {
772         Ipv6PrefixBinaryBuilder pb = new Ipv6PrefixBinaryBuilder();
773         byte[] address = InetAddresses.forString(MaskUtil.getAddressStringForIpv6Prefix(prefix)).getAddress();
774         pb.setIpv6AddressBinary(new Ipv6AddressBinary(address));
775         pb.setIpv6MaskLength(MaskUtil.getMaskForAddress(prefix));
776         return pb.build();
777     }
778
779     private static Ipv4Binary convertToBinary(Ipv4 address) {
780         byte[] addr = InetAddresses.forString(address.getIpv4().getValue()).getAddress();
781         return new Ipv4BinaryBuilder().setIpv4Binary(new Ipv4AddressBinary(addr)).build();
782     }
783
784     private static Ipv6Binary convertToBinary(Ipv6 address) {
785         byte[] addr = InetAddresses.forString(address.getIpv6().getValue()).getAddress();
786         return new Ipv6BinaryBuilder().setIpv6Binary(new Ipv6AddressBinary(addr)).build();
787     }
788
789     private static Pair<Class<? extends LispAddressFamily>, Address> convertToBinary(Address addr) {
790         Address convAddr = null;
791         Class<? extends LispAddressFamily> convType = null;
792         if (addr instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
793                 .lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix) {
794             convAddr = convertToBinary((org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
795                     .lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix) addr);
796             convType = Ipv4PrefixBinaryAfi.class;
797         } else if (addr instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
798                 .lisp.address.types.rev151105.lisp.address.address.Ipv6Prefix) {
799             convAddr = convertToBinary((org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
800                     .lisp.address.types.rev151105.lisp.address.address.Ipv6Prefix) addr);
801             convType = Ipv6PrefixBinaryAfi.class;
802         } else if (addr instanceof Ipv4) {
803             convAddr = convertToBinary((Ipv4) addr);
804             convType = Ipv4BinaryAfi.class;
805         } else if (addr instanceof Ipv6) {
806             convAddr = convertToBinary((Ipv6) addr);
807             convType = Ipv6BinaryAfi.class;
808         }
809         return new ImmutablePair<Class<? extends LispAddressFamily>, Address>(convType, convAddr);
810     }
811
812     public static Eid convertToBinary(Eid eid) {
813         Pair<Class<? extends LispAddressFamily>, Address> converted = convertToBinary(eid.getAddress());
814         if (converted.getRight() == null) {
815             return eid;
816         }
817         EidBuilder eb = new EidBuilder(eid);
818         eb.setAddressType(converted.getLeft());
819         eb.setAddress(converted.getRight());
820         return eb.build();
821     }
822
823     public static Rloc convertToBinary(Rloc rloc) {
824         Pair<Class<? extends LispAddressFamily>, Address> converted = convertToBinary(rloc.getAddress());
825         if (converted.getRight() == null) {
826             return rloc;
827         }
828         RlocBuilder rb = new RlocBuilder(rloc);
829         rb.setAddressType(converted.getLeft());
830         rb.setAddress(converted.getRight());
831         return rb.build();
832     }
833
834     /**
835      * Converts the {@link InetAddress} into Ipv4 or Ipv6 {@link IpAddressBinary}. If null parameter is passed, method
836      * returns the Ipv4 loopback address (127.0.0.1).
837      *
838      * @param inetAddress Any Ipv4 or Ipv6 InetAddress.
839      * @return The converted Ipv4 or Ipv6 IpAddressBinary, or Ipv4 loopback address (127.0.0.1) if null is passed.
840      */
841     public static IpAddressBinary addressBinaryFromInet(InetAddress inetAddress) {
842         if (inetAddress == null) {
843             inetAddress = Inet4Address.getLoopbackAddress();
844         }
845
846         if (inetAddress instanceof Inet4Address) {
847             return new IpAddressBinary(new Ipv4AddressBinary(inetAddress.getAddress()));
848         } else if (inetAddress instanceof Inet6Address) {
849             return new IpAddressBinary(new Ipv6AddressBinary(inetAddress.getAddress()));
850         }
851         return null;
852     }
853
854     public static IpAddressBinary addressBinaryFromAddress(Address address) {
855         if (address instanceof Ipv4Binary) {
856             return new IpAddressBinary(((Ipv4Binary) address).getIpv4Binary());
857         } else if (address instanceof Ipv6Binary) {
858             return new IpAddressBinary(((Ipv6Binary) address).getIpv6Binary());
859         }
860         return null;
861     }
862
863     public static List<IpAddressBinary> addressBinariesFromItrRlocs(List<ItrRloc> itrRlocs) {
864         List<IpAddressBinary> ipAddressBinaryList = Lists.newArrayList();
865         for (ItrRloc itrRloc : itrRlocs) {
866             ipAddressBinaryList.add(addressBinaryFromAddress(itrRloc.getRloc().getAddress()));
867         }
868         return ipAddressBinaryList;
869     }
870
871     private static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
872             .lisp.address.address.Ipv4Prefix convertFromBinary(Ipv4PrefixBinary prefix) {
873         return new Ipv4PrefixBuilder().setIpv4Prefix(IetfInetUtil.INSTANCE.ipv4PrefixFor(
874                 prefix.getIpv4AddressBinary().getValue(),
875                 prefix.getIpv4MaskLength())).build();
876     }
877
878     private static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
879             .lisp.address.address.Ipv6Prefix convertFromBinary(Ipv6PrefixBinary prefix) {
880         return new Ipv6PrefixBuilder().setIpv6Prefix(IetfInetUtil.INSTANCE.ipv6PrefixFor(
881                 prefix.getIpv6AddressBinary().getValue(),
882                 prefix.getIpv6MaskLength())).build();
883     }
884
885     private static Ipv4 convertFromBinary(Ipv4Binary address) {
886         return new Ipv4Builder().setIpv4(IetfInetUtil.INSTANCE.ipv4AddressFor(address.getIpv4Binary().getValue()))
887                 .build();
888     }
889
890     private static Ipv6 convertFromBinary(Ipv6Binary address) {
891         return new Ipv6Builder().setIpv6(IetfInetUtil.INSTANCE.ipv6AddressFor(address.getIpv6Binary().getValue()))
892                 .build();
893     }
894
895     private static Pair<Class<? extends LispAddressFamily>, Address> convertFromBinary(Address addr) {
896         Address convAddr = null;
897         Class<? extends LispAddressFamily> convType = null;
898         if (addr instanceof Ipv4PrefixBinary) {
899             convAddr = convertFromBinary((Ipv4PrefixBinary) addr);
900             convType = Ipv4PrefixAfi.class;
901         } else if (addr instanceof Ipv6PrefixBinary) {
902             convAddr = convertFromBinary((Ipv6PrefixBinary) addr);
903             convType = Ipv6PrefixAfi.class;
904         } else if (addr instanceof Ipv4Binary) {
905             convAddr = convertFromBinary((Ipv4Binary) addr);
906             convType = Ipv4Afi.class;
907         } else if (addr instanceof Ipv6Binary) {
908             convAddr = convertFromBinary((Ipv6Binary) addr);
909             convType = Ipv6Afi.class;
910         }
911         return new ImmutablePair<Class<? extends LispAddressFamily>, Address>(convType, convAddr);
912     }
913
914     public static Eid convertFromBinary(Eid eid) {
915         Pair<Class<? extends LispAddressFamily>, Address> converted = convertFromBinary(eid.getAddress());
916         if (converted.getRight() == null) {
917             return eid;
918         }
919         EidBuilder eb = new EidBuilder(eid);
920         eb.setAddressType(converted.getLeft());
921         eb.setAddress(converted.getRight());
922         return eb.build();
923     }
924
925     public static Rloc convertFromBinary(Rloc rloc) {
926         Pair<Class<? extends LispAddressFamily>, Address> converted = convertFromBinary(rloc.getAddress());
927         if (converted.getRight() == null) {
928             return rloc;
929         }
930         RlocBuilder rb = new RlocBuilder(rloc);
931         rb.setAddressType(converted.getLeft());
932         rb.setAddress(converted.getRight());
933         return rb.build();
934     }
935
936     public static boolean addressNeedsConversionToBinary(Address address) {
937         if (address instanceof Ipv4 || address instanceof Ipv6
938                 || address instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
939                         .lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix
940                 || address instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
941                         .lisp.address.types.rev151105.lisp.address.address.Ipv6Prefix) {
942             return true;
943         }
944         return false;
945     }
946
947     public static boolean addressNeedsConversionFromBinary(Address address) {
948         if (address instanceof Ipv4Binary || address instanceof Ipv6Binary
949                 || address instanceof Ipv4PrefixBinary || address instanceof Ipv6PrefixBinary) {
950             return true;
951         }
952         return false;
953     }
954
955     public static int compareIpAddressByteArrays(byte[] one, byte[] two) {
956         if (one.length < two.length) {
957             return -1;
958         } else if (one.length > two.length) {
959             return 1;
960         } else if (one.length == 4 && two.length == 4) {
961             for (int i = 0; i < 4; i++) {
962                 if (one[i] < two[i]) {
963                     return -1;
964                 } else if (one[i] > two[i]) {
965                     return 1;
966                 }
967             }
968             return 0;
969         } else if (one.length == 16 && two.length == 16) {
970             for (int i = 0; i < 16; i++) {
971                 if (one[i] < two[i]) {
972                     return -1;
973                 } else if (one[i] > two[i]) {
974                     return 1;
975                 }
976             }
977             return 0;
978         }
979         return 0;
980     }
981
982     public static short getIpPrefixMask(Eid eid) {
983         Address addr = eid.getAddress();
984         if (addr instanceof Ipv4PrefixBinary) {
985             return ((Ipv4PrefixBinary) addr).getIpv4MaskLength();
986         } else if (addr instanceof Ipv6PrefixBinary) {
987             return ((Ipv6PrefixBinary) addr).getIpv6MaskLength();
988         }
989         return 0;
990     }
991 }