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