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