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