Add radix trie to HashMapDb for fast IP LPM
[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
13 import java.net.Inet4Address;
14 import java.net.Inet6Address;
15 import java.net.InetAddress;
16 import java.util.ArrayList;
17 import java.util.List;
18 import java.util.regex.Pattern;
19
20 import org.apache.commons.lang3.tuple.ImmutablePair;
21 import org.apache.commons.lang3.tuple.Pair;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.AsNumberAfi;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameAfi;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameType;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ExplicitLocatorPathLcaf;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.InstanceIdType;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6Afi;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6PrefixAfi;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.KeyValueAddressLcaf;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddressFamily;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.NoAddressAfi;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathIdType;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathLcaf;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.AsNumberBuilder;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.DistinguishedNameBuilder;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6PrefixBuilder;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.MacBuilder;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.NoAddressBuilder;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePathBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv4AddressBinary;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv6AddressBinary;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4BinaryAfi;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4PrefixBinaryAfi;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv6BinaryAfi;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv6PrefixBinaryAfi;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4Binary;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4BinaryBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4PrefixBinary;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4PrefixBinaryBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6Binary;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6BinaryBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6PrefixBinary;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6PrefixBinaryBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.EidBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
79 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.key.value.address.KeyValueAddressBuilder;
80 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePath;
81 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKey;
82 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder;
83 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
84 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.ExplicitLocatorPathBuilder;
85 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;
86 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;
87 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;
88 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IetfInetUtil;
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     public static Rloc toRloc(SimpleAddress address) {
281         RlocBuilder builder = new RlocBuilder();
282         builder.setAddressType(addressTypeFromSimpleAddress(address));
283         builder.setVirtualNetworkId(null);
284         builder.setAddress(addressFromSimpleAddress(address));
285         return builder.build();
286     }
287
288     public static Rloc toRloc(InetAddress address) {
289         RlocBuilder builder = new RlocBuilder();
290         builder.setAddressType(binaryAddressTypeFromInet(address));
291         builder.setVirtualNetworkId(null);
292         builder.setAddress(binaryAddressFromInet(address));
293         return builder.build();
294     }
295
296     public static Rloc toRloc(Ipv4Address address) {
297         RlocBuilder builder = new RlocBuilder();
298         builder.setAddressType(Ipv4Afi.class);
299         builder.setVirtualNetworkId(null);
300         builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
301         return builder.build();
302     }
303
304     public static Rloc toRloc(Ipv4AddressBinary address) {
305         RlocBuilder builder = new RlocBuilder();
306         builder.setAddressType(Ipv4BinaryAfi.class);
307         builder.setVirtualNetworkId(null);
308         builder.setAddress((Address) new Ipv4BinaryBuilder().setIpv4Binary(address).build());
309         return builder.build();
310     }
311
312     public static Rloc toRloc(Ipv6Address address) {
313         RlocBuilder builder = new RlocBuilder();
314         builder.setAddressType(Ipv6Afi.class);
315         builder.setVirtualNetworkId(null);
316         builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
317         return builder.build();
318     }
319
320     public static Rloc toRloc(Ipv6AddressBinary address) {
321         RlocBuilder builder = new RlocBuilder();
322         builder.setAddressType(Ipv6BinaryAfi.class);
323         builder.setVirtualNetworkId(null);
324         builder.setAddress((Address) new Ipv6BinaryBuilder().setIpv6Binary(address).build());
325         return builder.build();
326     }
327
328     public static Rloc asIpv4Rloc(String address) {
329         return toRloc(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()));
330     }
331
332     public static Rloc asIpv6Rloc(String address) {
333         return toRloc(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()));
334     }
335
336     public static Eid toEid(Ipv4Prefix prefix, InstanceIdType vni) {
337         EidBuilder builder = new EidBuilder();
338         builder.setAddressType(Ipv4PrefixAfi.class);
339         builder.setVirtualNetworkId(vni);
340         builder.setAddress((Address) new Ipv4PrefixBuilder().setIpv4Prefix(prefix).build());
341         return builder.build();
342     }
343
344     public static Eid toEid(Ipv4PrefixBinary prefix, InstanceIdType vni) {
345         EidBuilder builder = new EidBuilder();
346         builder.setAddressType(Ipv4PrefixBinaryAfi.class);
347         builder.setVirtualNetworkId(vni);
348         builder.setAddress((Address) prefix);
349         return builder.build();
350     }
351
352     public static Eid toEid(Ipv6PrefixBinary prefix, InstanceIdType vni) {
353         EidBuilder builder = new EidBuilder();
354         builder.setAddressType(Ipv6PrefixBinaryAfi.class);
355         builder.setVirtualNetworkId(vni);
356         builder.setAddress((Address) prefix);
357         return builder.build();
358     }
359
360     public static Eid toEid(Ipv4Address address, InstanceIdType vni) {
361         EidBuilder builder = new EidBuilder();
362         builder.setAddressType(Ipv4Afi.class);
363         builder.setVirtualNetworkId(vni);
364         builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
365         return builder.build();
366     }
367
368     public static Eid toEid(Ipv4AddressBinary address, InstanceIdType vni) {
369         EidBuilder builder = new EidBuilder();
370         builder.setAddressType(Ipv4BinaryAfi.class);
371         builder.setVirtualNetworkId(vni);
372         builder.setAddress((Address) new Ipv4BinaryBuilder().setIpv4Binary(address).build());
373         return builder.build();
374     }
375
376     // XXX getMapping rcp fails if VNI set to 0
377     public static Eid toEidNoVni(IpPrefix prefix) {
378         EidBuilder builder = new EidBuilder();
379         builder.setAddress(addressFromIpPrefix(prefix));
380         builder.setAddressType(addressTypeFromIpPrefix(prefix));
381         return builder.build();
382     }
383
384     public static Eid toEid(IpPrefix prefix, InstanceIdType vni) {
385         EidBuilder builder = new EidBuilder();
386         builder.setAddress(addressFromIpPrefix(prefix));
387         builder.setAddressType(addressTypeFromIpPrefix(prefix));
388         builder.setVirtualNetworkId(vni);
389         return builder.build();
390     }
391
392     public static Eid toIpPrefixEid(IpAddress addr, int vni) {
393         // If you touch this, be sure that sfclisp compiles!
394         int mask = addressTypeFromIpAddress(addr) == Ipv4Afi.class ? 32 : 128;
395         IpPrefix prefix = asIpPrefix(String.valueOf(addr.getValue()), mask);
396         // XXX getMapping rcp fails if VNI set to 0
397         return toEidNoVni(prefix);
398     }
399
400     public static Eid asEid(SimpleAddress address, InstanceIdType vni) {
401         EidBuilder builder = new EidBuilder();
402         builder.setAddressType(addressTypeFromSimpleAddress(address));
403         builder.setVirtualNetworkId(vni);
404         // XXX Not sure if the below actually works as expected... also, what happens to AFI?
405         builder.setAddress(addressFromSimpleAddress(address));
406         return builder.build();
407     }
408
409     public static Eid asIpv4PrefixEid(String prefix) {
410         return asIpv4PrefixEid(prefix, null);
411     }
412
413     public static Eid asIpv4PrefixEid(final String prefix, final InstanceIdType iiType) {
414         return toEid(new Ipv4Prefix(prefix), iiType);
415     }
416
417     public static Eid asIpv4PrefixBinaryEid(final String prefix) {
418         return asIpv4PrefixBinaryEid(prefix, null);
419     }
420
421     public static Eid asIpv4PrefixBinaryEid(final String prefix, final InstanceIdType iiType) {
422         String address = MaskUtil.getPrefixAddress(prefix);
423         short mask = Short.valueOf(MaskUtil.getPrefixMask(prefix));
424         byte[] ipv4 = InetAddresses.forString(address).getAddress();
425         return toEid(new Ipv4PrefixBinaryBuilder().setIpv4AddressBinary(new Ipv4AddressBinary(ipv4))
426                 .setIpv4MaskLength(mask).build(), iiType);
427     }
428
429     public static Eid asIpv4Eid(String address) {
430         return toEid(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()), null);
431     }
432
433     public static Eid toEid(Ipv6Prefix prefix, InstanceIdType vni) {
434         EidBuilder builder = new EidBuilder();
435         builder.setAddressType(Ipv6PrefixAfi.class);
436         builder.setVirtualNetworkId(vni);
437         builder.setAddress((Address) new Ipv6PrefixBuilder().setIpv6Prefix(prefix).build());
438         return builder.build();
439     }
440
441     public static Eid toEid(Ipv6Address address, InstanceIdType vni) {
442         EidBuilder builder = new EidBuilder();
443         builder.setAddressType(Ipv6Afi.class);
444         builder.setVirtualNetworkId(vni);
445         builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
446         return builder.build();
447     }
448
449     public static Eid toEid(Ipv6AddressBinary address, InstanceIdType vni) {
450         EidBuilder builder = new EidBuilder();
451         builder.setAddressType(Ipv6BinaryAfi.class);
452         builder.setVirtualNetworkId(vni);
453         builder.setAddress((Address) new Ipv6BinaryBuilder().setIpv6Binary(address).build());
454         return builder.build();
455     }
456
457     public static Eid asIpv6Eid(String address, long vni) {
458         return toEid(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()), new InstanceIdType(vni));
459     }
460
461     public static Eid asIpv6PrefixEid(String prefix) {
462         return toEid(new Ipv6Prefix(prefix), null);
463     }
464
465     public static Eid asIpv6Eid(String address) {
466         return toEid(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()), null);
467     }
468
469     public static Eid asIpv6PrefixBinaryEid(final String prefix) {
470         return asIpv6PrefixBinaryEid(prefix, null);
471     }
472
473     public static Eid asIpv6PrefixBinaryEid(final String prefix, final InstanceIdType iiType) {
474         String address = MaskUtil.getPrefixAddress(prefix);
475         short mask = Short.valueOf(MaskUtil.getPrefixMask(prefix));
476         byte[] ipv6 = InetAddresses.forString(address).getAddress();
477         return toEid(new Ipv6PrefixBinaryBuilder().setIpv6AddressBinary(new Ipv6AddressBinary(ipv6))
478                 .setIpv6MaskLength(mask).build(), iiType);
479     }
480
481     public static Eid asIpv4Eid(String address, long vni) {
482         return toEid(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()), new InstanceIdType(vni));
483     }
484
485     public static Eid asBinaryEid(SimpleAddress address, InstanceIdType iid) {
486         if (address.getIpPrefix() != null) {
487             if (address.getIpPrefix().getIpv4Prefix() != null) {
488                 return LispAddressUtil.asIpv4PrefixBinaryEid(address.getIpPrefix().getIpv4Prefix().getValue(), iid);
489             } else if (address.getIpPrefix().getIpv6Prefix() != null) {
490                 return LispAddressUtil.asIpv6PrefixBinaryEid(address.getIpPrefix().getIpv6Prefix().getValue(), iid);
491             }
492         } else if (address.getIpAddress() != null) {
493             if (address.getIpAddress().getIpv4Address() != null) {
494                 LispAddressUtil.toEid(new Ipv4AddressBinary(InetAddresses.forString(
495                         address.getIpAddress().getIpv4Address().getValue()).getAddress()), iid);
496             } else if (address.getIpAddress().getIpv6Address() != null) {
497                 LispAddressUtil.toEid(new Ipv6AddressBinary(InetAddresses.forString(
498                         address.getIpAddress().getIpv6Address().getValue()).getAddress()), iid);
499             }
500         }
501         return LispAddressUtil.asEid(address, iid);
502     }
503
504     public static int ipVersionFromString(String ip) {
505         if (IP4_PATTERN.matcher(ip).matches()) {
506             return 4;
507         } else if (IP6_PATTERN.matcher(ip).matches()) {
508             return 6;
509         } else {
510             return 0;
511         }
512     }
513
514     public static IpPrefix asIpPrefix(String addr, int mask) {
515         int version = ipVersionFromString(addr);
516         if (version == 4 && (mask >= 0 && mask <= 32)) {
517             return new IpPrefix(new Ipv4Prefix(addr + "/" + mask));
518         } else if (version == 6 && (mask >=0 && mask <= 128)) {
519             return new IpPrefix(new Ipv6Prefix(addr + "/" + mask));
520         } else {
521             return null;
522         }
523     }
524
525     public static Eid asIpv4PrefixEid(Ipv4Address addr, InstanceIdType vni) {
526         return toEid(new IpPrefix(IetfInetUtil.INSTANCE.ipv4PrefixFor(addr)), vni);
527     }
528
529     public static Eid asIpv6PrefixEid(Ipv6Address addr, InstanceIdType vni) {
530         return toEid(new IpPrefix(IetfInetUtil.INSTANCE.ipv6PrefixFor(addr)), vni);
531     }
532
533     public static Eid asIpv4PrefixEid(Eid eid, Inet4Address address, short mask) {
534         EidBuilder builder = new EidBuilder();
535         builder.setAddressType(eid.getAddressType());
536         builder.setVirtualNetworkId(eid.getVirtualNetworkId());
537         builder.setAddress(new Ipv4PrefixBuilder().setIpv4Prefix(
538                 IetfInetUtil.INSTANCE.ipv4PrefixFor(address, mask)).build());
539         return builder.build();
540     }
541
542     public static Eid asIpv6PrefixEid(Eid eid, Inet6Address address, short mask) {
543         EidBuilder builder = new EidBuilder();
544         builder.setAddressType(eid.getAddressType());
545         builder.setVirtualNetworkId(eid.getVirtualNetworkId());
546         builder.setAddress(new Ipv6PrefixBuilder().setIpv6Prefix(
547                 IetfInetUtil.INSTANCE.ipv6PrefixFor(address, mask)).build());
548         return builder.build();
549     }
550
551     public static Eid asIpv4PrefixBinaryEid(Eid eid, byte[] address, short mask) {
552         Preconditions.checkArgument(address.length == 4,
553                 "asIpv4PrefixBinaryEid called with incorrect length byte array ({})", address.length);
554         EidBuilder builder = new EidBuilder();
555         builder.setAddressType(Ipv4PrefixBinaryAfi.class);
556         builder.setVirtualNetworkId(eid.getVirtualNetworkId());
557         builder.setAddress(new Ipv4PrefixBinaryBuilder().setIpv4AddressBinary(new Ipv4AddressBinary(address))
558                 .setIpv4MaskLength(mask).build());
559         return builder.build();
560     }
561
562     public static Eid asIpv6PrefixBinaryEid(Eid eid, byte[] address, short mask) {
563         Preconditions.checkArgument(address.length == 16,
564                 "asIpv6PrefixBinaryEid called with incorrect length byte array ({})", address.length);
565         EidBuilder builder = new EidBuilder();
566         builder.setAddressType(Ipv6PrefixBinaryAfi.class);
567         builder.setVirtualNetworkId(eid.getVirtualNetworkId());
568         builder.setAddress(new Ipv6PrefixBinaryBuilder().setIpv6AddressBinary(new Ipv6AddressBinary(address))
569                 .setIpv6MaskLength(mask).build());
570         return builder.build();
571     }
572
573     public static Eid asServicePathEid(long vni, long servicePathId, short serviceIndex) {
574         EidBuilder eb = new EidBuilder();
575         eb.setAddressType(ServicePathLcaf.class);
576         if (vni >= 0) {
577             eb.setVirtualNetworkId(new InstanceIdType(vni));
578         }
579         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
580                 .lisp.address.address.service.path.ServicePathBuilder spb =
581                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
582                 .lisp.address.address.service.path.ServicePathBuilder();
583         spb.setServicePathId(new ServicePathIdType(servicePathId));
584         spb.setServiceIndex(serviceIndex);
585         return eb.setAddress(addressFromServicePath(spb.build())).build();
586     }
587
588     public static Eid toEid(MacAddress mac, InstanceIdType vni) {
589         EidBuilder builder = new EidBuilder();
590         builder.setAddressType(MacAfi.class);
591         builder.setVirtualNetworkId(vni);
592         builder.setAddress((Address) new MacBuilder().setMac(mac).build());
593         return builder.build();
594     }
595
596     public static Eid asMacEid(String address, long vni) {
597         return toEid(new MacAddress(address), new InstanceIdType(vni));
598     }
599
600     public static Eid asMacEid(String address) {
601         return toEid(new MacAddress(address), null);
602     }
603
604     public static Eid toEid(DistinguishedNameType dn, InstanceIdType vni) {
605         EidBuilder builder = new EidBuilder();
606         builder.setAddressType(DistinguishedNameAfi.class);
607         builder.setVirtualNetworkId(vni);
608         builder.setAddress((Address) new DistinguishedNameBuilder().setDistinguishedName(dn).build());
609         return builder.build();
610     }
611
612     public static Eid asDistinguishedNameEid(String address, long vni) {
613         return toEid(new MacAddress(address), new InstanceIdType(vni));
614     }
615
616     public static Eid asDistinguishedNameEid(String address) {
617         return toEid(new DistinguishedNameType(address), null);
618     }
619
620     public static Eid asKeyValueAddressEid(SimpleAddress key, SimpleAddress value) {
621         KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
622         kvab.setKey(key);
623         kvab.setValue(value);
624         KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
625                 .rev151105.lisp.address.address.KeyValueAddressBuilder()
626                 .setKeyValueAddress(kvab.build()).build();
627         EidBuilder builder = new EidBuilder();
628         builder.setAddressType(KeyValueAddressLcaf.class);
629         builder.setVirtualNetworkId(null);
630         builder.setAddress((Address) address);
631         return builder.build();
632     }
633
634     public static Rloc asKeyValueAddressRloc(SimpleAddress key, SimpleAddress value) {
635         KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
636         kvab.setKey(key);
637         kvab.setValue(value);
638         KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
639                 .rev151105.lisp.address.address.KeyValueAddressBuilder()
640                 .setKeyValueAddress(kvab.build()).build();
641         RlocBuilder builder = new RlocBuilder();
642         builder.setAddressType(KeyValueAddressLcaf.class);
643         builder.setVirtualNetworkId(null);
644         builder.setAddress((Address) address);
645         return builder.build();
646     }
647
648     public static Rloc asKeyValueAddress(String key, SimpleAddress value) {
649         return asKeyValueAddressRloc(new SimpleAddress(new DistinguishedNameType(key)), value);
650     }
651
652     public static SourceDestKey asSrcDst(String src, String dst, int smask, int dmask) {
653         SourceDestKeyBuilder builder = new SourceDestKeyBuilder();
654         builder.setSource(new SimpleAddress(asIpPrefix(src, smask)));
655         builder.setDest(new SimpleAddress(asIpPrefix(dst, dmask)));
656         return builder.build();
657     }
658
659     public static Eid asSrcDstEid(String src, String dst, int smask, int dmask, int vni) {
660         EidBuilder builder = new EidBuilder();
661         builder.setAddressType(SourceDestKeyLcaf.class);
662         builder.setVirtualNetworkId(new InstanceIdType(Long.valueOf(vni)));
663         builder.setAddress(
664                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
665                         .lisp.address.address.SourceDestKeyBuilder()
666                         .setSourceDestKey(asSrcDst(src, dst, smask, dmask)).build());
667
668         return builder.build();
669     }
670
671     public static Eid asSrcDstEid(SourceDestKey sd, InstanceIdType vni) {
672         EidBuilder builder = new EidBuilder();
673         builder.setAddressType(SourceDestKeyLcaf.class);
674         builder.setVirtualNetworkId(vni);
675         builder.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
676                 .rev151105.lisp.address.address.SourceDestKeyBuilder().setSourceDestKey(sd).build());
677         return builder.build();
678     }
679
680     public static Rloc asTeLcafRloc(List<IpAddress> hopList) {
681         RlocBuilder teBuilder = new RlocBuilder();
682         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
683                 .lisp.address.address.ExplicitLocatorPathBuilder elpBuilder =
684                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
685                 .lisp.address.address.ExplicitLocatorPathBuilder();
686         ExplicitLocatorPathBuilder teAddrBuilder = new ExplicitLocatorPathBuilder();
687         teAddrBuilder.setHop(new ArrayList<Hop>());
688         for (IpAddress hop : hopList) {
689             HopBuilder hopBuilder = new HopBuilder();
690             hopBuilder.setAddress(new SimpleAddress(hop));
691             hopBuilder.setHopId("Hop " + teAddrBuilder.getHop().size());
692             hopBuilder.setLrsBits(new LrsBits(false, false, false));
693             teAddrBuilder.getHop().add(hopBuilder.build());
694         }
695
696         elpBuilder.setExplicitLocatorPath(teAddrBuilder.build());
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 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
746             .lisp.address.address.Ipv4Prefix convertFromBinary(Ipv4PrefixBinary prefix) {
747         return new Ipv4PrefixBuilder().setIpv4Prefix(IetfInetUtil.INSTANCE.ipv4PrefixFor(
748                 prefix.getIpv4AddressBinary().getValue(),
749                 prefix.getIpv4MaskLength())).build();
750     }
751
752     private static Ipv6PrefixBinary convertToBinary(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
753             .lisp.address.types.rev151105.lisp.address.address.Ipv6Prefix prefix) {
754         Ipv6PrefixBinaryBuilder pb = new Ipv6PrefixBinaryBuilder();
755         byte[] address = InetAddresses.forString(MaskUtil.getAddressStringForIpv6Prefix(prefix)).getAddress();
756         pb.setIpv6AddressBinary(new Ipv6AddressBinary(address));
757         pb.setIpv6MaskLength(MaskUtil.getMaskForAddress(prefix));
758         return pb.build();
759     }
760
761     private static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
762             .lisp.address.address.Ipv6Prefix convertFromBinary(Ipv6PrefixBinary prefix) {
763         return new Ipv6PrefixBuilder().setIpv6Prefix(IetfInetUtil.INSTANCE.ipv6PrefixFor(
764                 prefix.getIpv6AddressBinary().getValue(),
765                 prefix.getIpv6MaskLength())).build();
766 }
767
768     private static Ipv4Binary convertToBinary(Ipv4 address) {
769         byte[] addr = InetAddresses.forString(address.getIpv4().getValue()).getAddress();
770         return new Ipv4BinaryBuilder().setIpv4Binary(new Ipv4AddressBinary(addr)).build();
771     }
772
773     private static Ipv4 convertFromBinary(Ipv4Binary address) {
774         return new Ipv4Builder().setIpv4(IetfInetUtil.INSTANCE.ipv4AddressFor(address.getIpv4Binary().getValue()))
775                 .build();
776     }
777
778     private static Ipv6Binary convertToBinary(Ipv6 address) {
779         byte[] addr = InetAddresses.forString(address.getIpv6().getValue()).getAddress();
780         return new Ipv6BinaryBuilder().setIpv6Binary(new Ipv6AddressBinary(addr)).build();
781     }
782
783     private static Ipv6 convertFromBinary(Ipv6Binary address) {
784         return new Ipv6Builder().setIpv6(IetfInetUtil.INSTANCE.ipv6AddressFor(address.getIpv6Binary().getValue()))
785                 .build();
786     }
787
788     private static Pair<Class<? extends LispAddressFamily>, Address> convertToBinary(Address addr) {
789         Address convAddr = null;
790         Class<? extends LispAddressFamily> convType = null;
791         if (addr instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
792                 .lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix) {
793             convAddr = convertToBinary((org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
794                     .lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix) addr);
795             convType = Ipv4PrefixBinaryAfi.class;
796         } else if (addr instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
797                 .lisp.address.types.rev151105.lisp.address.address.Ipv6Prefix) {
798             convAddr = convertToBinary((org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
799                     .lisp.address.types.rev151105.lisp.address.address.Ipv6Prefix) addr);
800             convType = Ipv6PrefixBinaryAfi.class;
801         } else if (addr instanceof Ipv4) {
802             convAddr = convertToBinary((Ipv4) addr);
803             convType = Ipv4BinaryAfi.class;
804         } else if (addr instanceof Ipv6) {
805             convAddr = convertToBinary((Ipv6) addr);
806             convType = Ipv6BinaryAfi.class;
807         }
808         return new ImmutablePair<Class<? extends LispAddressFamily>, Address>(convType, convAddr);
809     }
810
811     private static Pair<Class<? extends LispAddressFamily>, Address> convertFromBinary(Address addr) {
812         Address convAddr = null;
813         Class<? extends LispAddressFamily> convType = null;
814         if (addr instanceof Ipv4PrefixBinary) {
815             convAddr = convertFromBinary((Ipv4PrefixBinary) addr);
816             convType = Ipv4PrefixAfi.class;
817         } else if (addr instanceof Ipv6PrefixBinary) {
818             convAddr = convertFromBinary((Ipv6PrefixBinary) addr);
819             convType = Ipv6PrefixAfi.class;
820         } else if (addr instanceof Ipv4Binary) {
821             convAddr = convertFromBinary((Ipv4Binary) addr);
822             convType = Ipv4Afi.class;
823         } else if (addr instanceof Ipv6Binary) {
824             convAddr = convertFromBinary((Ipv6Binary) addr);
825             convType = Ipv6Afi.class;
826         }
827         return new ImmutablePair<Class<? extends LispAddressFamily>, Address>(convType, convAddr);
828     }
829
830     public static Eid convertToBinary(Eid eid) {
831         Pair<Class<? extends LispAddressFamily>, Address> converted = convertToBinary(eid.getAddress());
832         if (converted.getRight() == null) {
833             return eid;
834         }
835         EidBuilder eb = new EidBuilder(eid);
836         eb.setAddressType(converted.getLeft());
837         eb.setAddress(converted.getRight());
838         return eb.build();
839     }
840
841     public static Eid convertFromBinary(Eid eid) {
842         Pair<Class<? extends LispAddressFamily>, Address> converted = convertFromBinary(eid.getAddress());
843         if (converted.getRight() == null) {
844             return eid;
845         }
846         EidBuilder eb = new EidBuilder(eid);
847         eb.setAddressType(converted.getLeft());
848         eb.setAddress(converted.getRight());
849         return eb.build();
850     }
851
852     public static Rloc convertToBinary(Rloc rloc) {
853         Pair<Class<? extends LispAddressFamily>, Address> converted = convertToBinary(rloc.getAddress());
854         if (converted.getRight() == null) {
855             return rloc;
856         }
857         RlocBuilder rb = new RlocBuilder(rloc);
858         rb.setAddressType(converted.getLeft());
859         rb.setAddress(converted.getRight());
860         return rb.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[] a, byte[] b) {
894         int i;
895         if (a.length < b.length) {
896             return -1;
897         } else if (a.length > b.length) {
898             return 1;
899         } else if (a.length == 4 && b.length == 4) {
900             for (i = 0; i < 4; i++) {
901                 if (a[i] < b[i]) {
902                     return -1;
903                 } else if (a[i] > b[i]) {
904                     return 1;
905                 }
906             }
907             return 0;
908         } else if (a.length == 16 && b.length == 16) {
909             for (i = 0; i < 16; i++) {
910                 if (a[i] < b[i]) {
911                     return -1;
912                 } else if (a[i] > b[i]) {
913                     return 1;
914                 }
915             }
916             return 0;
917         }
918         return 0;
919     }
920
921     public static short getIpPrefixMask(Eid eid) {
922         Address addr = eid.getAddress();
923         if (addr instanceof Ipv4PrefixBinary) {
924             return ((Ipv4PrefixBinary) addr).getIpv4MaskLength();
925         } else if (addr instanceof Ipv6PrefixBinary) {
926             return ((Ipv6PrefixBinary) addr).getIpv6MaskLength();
927         }
928         return 0;
929     }
930 }