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