Bug 5270: Fix merging
[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 java.net.Inet4Address;
11 import java.net.Inet6Address;
12 import java.net.InetAddress;
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.regex.Pattern;
16 import java.util.regex.PatternSyntaxException;
17
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.AsNumberAfi;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameAfi;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameType;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ExplicitLocatorPathLcaf;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.InstanceIdType;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6Afi;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6PrefixAfi;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.KeyValueAddressLcaf;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddressFamily;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.NoAddressAfi;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathIdType;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathLcaf;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.AsNumberBuilder;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.DistinguishedNameBuilder;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6PrefixBuilder;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.MacBuilder;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.NoAddressBuilder;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePathBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.EidBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.key.value.address.KeyValueAddressBuilder;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePath;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKey;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.ExplicitLocatorPathBuilder;
67 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;
68 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;
69 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;
70 import org.slf4j.Logger;
71 import org.slf4j.LoggerFactory;
72
73 public final class LispAddressUtil {
74     protected static final Logger LOG = LoggerFactory.getLogger(LispAddressUtil.class);
75
76     public static final short STARTING_SERVICE_INDEX = 255;
77     private static Pattern IP4_PATTERN = null;
78     private static Pattern IP6_PATTERN = null;
79     private static final String ip4Pattern = "(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])";
80     private static final String ip6Pattern = "([0-9a-f]{1,4}:){7}([0-9a-f]){1,4}";
81     static {
82         try {
83           IP4_PATTERN = Pattern.compile(ip4Pattern, Pattern.CASE_INSENSITIVE);
84           IP6_PATTERN = Pattern.compile(ip6Pattern, Pattern.CASE_INSENSITIVE);
85         } catch (PatternSyntaxException e) {
86             LOG.debug("Caught pattern syntax exception", e);
87         }
88       }
89
90     // Utility class, should not be instantiated
91     private LispAddressUtil() {
92     }
93
94     public static Class<? extends LispAddressFamily> addressTypeFromSimpleAddress(SimpleAddress address) {
95         if (address.getIpAddress() != null) {
96             return addressTypeFromIpAddress(address.getIpAddress());
97         } else if (address.getIpPrefix() != null) {
98             return addressTypeFromIpPrefix(address.getIpPrefix());
99         } else if (address.getMacAddress() != null) {
100             return MacAfi.class;
101         } else if (address.getDistinguishedNameType() != null) {
102             return DistinguishedNameAfi.class;
103         } else if (address.getAsNumber() != null) {
104             return AsNumberAfi.class;
105         }
106         return null;
107     }
108
109     public static Address addressFromSimpleAddress(SimpleAddress address) {
110         if (address.getIpAddress() != null) {
111             return addressFromIpAddress(address.getIpAddress());
112         } else if (address.getIpPrefix() != null) {
113             return addressFromIpPrefix(address.getIpPrefix());
114         } else if (address.getMacAddress() != null) {
115             return addressFromMacAddress(address.getMacAddress());
116         } else if (address.getDistinguishedNameType() != null) {
117             return addressFromDistinguishedName(address.getDistinguishedNameType());
118         } else if (address.getAsNumber() != null) {
119             return addressFromAsNumber(address.getAsNumber());
120         }
121         return null;
122     }
123
124     public static Class<? extends LispAddressFamily> addressTypeFromInet(InetAddress address) {
125         if (address instanceof Inet4Address) {
126             return Ipv4Afi.class;
127         } else if (address instanceof Inet6Address) {
128             return Ipv6Afi.class;
129         }
130         return null;
131     }
132
133     public static Address addressFromInet(InetAddress address) {
134         if (address instanceof Inet4Address) {
135             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder()
136             .setIpv4(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address(address.getHostAddress())).build();
137         } else if (address instanceof Inet6Address) {
138             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder()
139             .setIpv6(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address(address.getHostAddress())).build();
140         }
141         return null;
142     }
143
144     public static Class<? extends LispAddressFamily> addressTypeFromIpAddress(IpAddress address) {
145         if (address == null) {
146             return null;
147         } else if (address.getIpv4Address() != null) {
148             return Ipv4Afi.class;
149         } else if (address.getIpv6Address() != null) {
150             return Ipv6Afi.class;
151         }
152         return null;
153     }
154
155     public static Address addressFromIpAddress(IpAddress address) {
156         if (address == null) {
157             return null;
158         } else if (address.getIpv4Address() != null) {
159             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder().setIpv4(address.getIpv4Address()).build();
160         } else if (address.getIpv6Address() != null) {
161             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder().setIpv6(address.getIpv6Address()).build();
162         }
163         return null;
164     }
165
166     public static Class<? extends LispAddressFamily> addressTypeFromIpPrefix(IpPrefix address) {
167         if (address == null) {
168             return null;
169         } else if (address.getIpv4Prefix() != null) {
170             return Ipv4PrefixAfi.class;
171         } else if (address.getIpv6Prefix() != null) {
172             return Ipv6PrefixAfi.class;
173         }
174         return null;
175     }
176
177     public static Address addressFromIpPrefix(IpPrefix address) {
178         if (address == null) {
179             return null;
180         } else if (address.getIpv4Prefix() != null) {
181             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder().setIpv4Prefix(address.getIpv4Prefix()).build();
182         } else if (address.getIpv6Prefix() != null) {
183             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6PrefixBuilder().setIpv6Prefix(address.getIpv6Prefix()).build();
184         }
185         return null;
186     }
187
188     public static Address addressFromMacAddress(MacAddress address) {
189         if (address == null) {
190             return null;
191         } else {
192             return (Address) new MacBuilder().setMac(address).build();
193         }
194     }
195
196     public static Address addressFromServicePath(ServicePath address) {
197         if (address == null) {
198             return null;
199         } else {
200             return (Address) new ServicePathBuilder().setServicePath(address).build();
201         }
202     }
203
204     public static Address addressFromDistinguishedName(DistinguishedNameType address) {
205         if (address == null) {
206             return null;
207         } else {
208             return (Address) new DistinguishedNameBuilder().setDistinguishedName(address).build();
209         }
210     }
211
212     public static Address addressFromAsNumber(AsNumber address) {
213         if (address == null) {
214             return null;
215         } else {
216             return (Address) new AsNumberBuilder().setAsNumber(address).build();
217         }
218     }
219     public static Rloc toRloc(SimpleAddress address) {
220         RlocBuilder builder = new RlocBuilder();
221         builder.setAddressType(addressTypeFromSimpleAddress(address));
222         builder.setVirtualNetworkId(null);
223         builder.setAddress(addressFromSimpleAddress(address));
224         return builder.build();
225     }
226
227     public static Rloc toRloc(InetAddress address) {
228         RlocBuilder builder = new RlocBuilder();
229         builder.setAddressType(addressTypeFromInet(address));
230         builder.setVirtualNetworkId(null);
231         builder.setAddress(addressFromInet(address));
232         return builder.build();
233     }
234
235     public static Rloc toRloc(Ipv4Address address) {
236         RlocBuilder builder = new RlocBuilder();
237         builder.setAddressType(Ipv4Afi.class);
238         builder.setVirtualNetworkId(null);
239         builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
240         return builder.build();
241     }
242
243     public static Rloc toRloc(Ipv6Address address) {
244         RlocBuilder builder = new RlocBuilder();
245         builder.setAddressType(Ipv6Afi.class);
246         builder.setVirtualNetworkId(null);
247         builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
248         return builder.build();
249     }
250
251     public static Rloc asIpv4Rloc(String address) {
252         return toRloc(new Ipv4Address(address));
253     }
254
255     public static Rloc asIpv6Rloc(String address) {
256         return toRloc(new Ipv6Address(address));
257     }
258
259     public static Eid toEid(Ipv4Prefix prefix, InstanceIdType vni) {
260         EidBuilder builder = new EidBuilder();
261         builder.setAddressType(Ipv4PrefixAfi.class);
262         builder.setVirtualNetworkId(vni);
263         builder.setAddress((Address) new Ipv4PrefixBuilder().setIpv4Prefix(prefix).build());
264         return builder.build();
265     }
266
267     public static Eid toEid(Ipv4Address prefix, InstanceIdType vni) {
268         EidBuilder builder = new EidBuilder();
269         builder.setAddressType(Ipv4Afi.class);
270         builder.setVirtualNetworkId(vni);
271         builder.setAddress((Address) new Ipv4Builder().setIpv4(prefix).build());
272         return builder.build();
273     }
274
275     // XXX getMapping rcp fails if VNI set to 0
276     public static Eid toEidNoVni(IpPrefix prefix) {
277         EidBuilder builder = new EidBuilder();
278         builder.setAddress(addressFromIpPrefix(prefix));
279         builder.setAddressType(addressTypeFromIpPrefix(prefix));
280         return builder.build();
281     }
282
283     public static Eid toEid(IpPrefix prefix, InstanceIdType vni) {
284         EidBuilder builder = new EidBuilder();
285         builder.setAddress(addressFromIpPrefix(prefix));
286         builder.setAddressType(addressTypeFromIpPrefix(prefix));
287         builder.setVirtualNetworkId(vni);
288         return builder.build();
289     }
290
291     public static Eid toIpPrefixEid(IpAddress addr, int vni) {
292         // If you touch this, be sure that sfclisp compiles!
293         int mask = addressTypeFromIpAddress(addr) == Ipv4Afi.class ? 32 : 128;
294         IpPrefix prefix = asIpPrefix(addr.getValue().toString(), mask);
295         // XXX getMapping rcp fails if VNI set to 0
296         return toEidNoVni(prefix);
297     }
298
299     public static Eid asEid(SimpleAddress address, InstanceIdType vni) {
300         EidBuilder builder = new EidBuilder();
301         builder.setAddressType(addressTypeFromSimpleAddress(address));
302         builder.setVirtualNetworkId(vni);
303         // XXX Not sure if the below actually works as expected... also, what happens to AFI?
304         builder.setAddress(addressFromSimpleAddress(address));
305         return builder.build();
306     }
307
308     public static Eid asIpv4PrefixEid(String prefix) {
309         return toEid(new Ipv4Prefix(prefix), null);
310     }
311
312     public static Eid asIpv4Eid(String address) {
313         return toEid(new Ipv4Address(address), null);
314     }
315
316     public static Eid toEid(Ipv6Prefix prefix, InstanceIdType vni) {
317         EidBuilder builder = new EidBuilder();
318         builder.setAddressType(Ipv6PrefixAfi.class);
319         builder.setVirtualNetworkId(vni);
320         builder.setAddress((Address) new Ipv6PrefixBuilder().setIpv6Prefix(prefix).build());
321         return builder.build();
322     }
323
324     public static Eid toEid(Ipv6Address prefix, InstanceIdType vni) {
325         EidBuilder builder = new EidBuilder();
326         builder.setAddressType(Ipv6Afi.class);
327         builder.setVirtualNetworkId(vni);
328         builder.setAddress((Address) new Ipv6Builder().setIpv6(prefix).build());
329         return builder.build();
330     }
331
332     public static Eid asIpv6Eid(String address, long vni) {
333         return toEid(new Ipv6Address(address), new InstanceIdType(vni));
334     }
335
336     public static Eid asIpv6PrefixEid(String prefix) {
337         return toEid(new Ipv6Prefix(prefix), null);
338     }
339
340     public static Eid asIpv6Eid(String address) {
341         return toEid(new Ipv6Address(address), null);
342     }
343
344     public static Eid asIpv4Eid(String address, long vni) {
345         return toEid(new Ipv4Address(address), new InstanceIdType(vni));
346     }
347
348     public static int ipVersionFromString(String ip) {
349         if (IP4_PATTERN.matcher(ip).matches()) {
350             return 4;
351         } else if (IP6_PATTERN.matcher(ip).matches()) {
352             return 6;
353         } else {
354             return 0;
355         }
356     }
357
358     public static IpPrefix asIpPrefix(String addr, int mask) {
359         int version = ipVersionFromString(addr);
360         if (version == 4 && (mask >= 0 && mask <= 32)) {
361             return new IpPrefix(new Ipv4Prefix(addr + "/" + mask));
362         } else if (version == 6 && (mask >=0 && mask <= 128)) {
363             return new IpPrefix(new Ipv6Prefix(addr + "/" + mask));
364         } else {
365             return null;
366         }
367     }
368
369     public static Eid asIpv4PrefixEid(Ipv4Address addr, InstanceIdType vni) {
370         return toEid(new IpPrefix(new Ipv4Prefix(addr.getValue() + "/" + 32)), vni);
371     }
372
373     public static Eid asIpv6PrefixEid(Ipv6Address addr, InstanceIdType vni) {
374         return toEid(new IpPrefix(new Ipv4Prefix(addr.getValue() + "/" + 128)), vni);
375     }
376
377     public static Eid asIpv4PrefixEid(Eid eid, Inet4Address address, short mask) {
378         EidBuilder builder = new EidBuilder();
379         builder.setAddressType(eid.getAddressType());
380         builder.setVirtualNetworkId(eid.getVirtualNetworkId());
381         builder.setAddress(new Ipv4PrefixBuilder().setIpv4Prefix(new Ipv4Prefix(getStringPrefix(address, mask))).build());
382         return builder.build();
383     }
384
385     public static Eid asIpv6PrefixEid(Eid eid, Inet6Address address, short mask) {
386         EidBuilder builder = new EidBuilder();
387         builder.setAddressType(eid.getAddressType());
388         builder.setVirtualNetworkId(eid.getVirtualNetworkId());
389         builder.setAddress(new Ipv6PrefixBuilder().setIpv6Prefix(new Ipv6Prefix(getStringPrefix(address, mask))).build());
390         return builder.build();
391     }
392
393     public static Eid asServicePathEid(long vni, long servicePathId, short serviceIndex) {
394         EidBuilder eb = new EidBuilder();
395         eb.setAddressType(ServicePathLcaf.class);
396         if (vni >= 0) {
397             eb.setVirtualNetworkId(new InstanceIdType(vni));
398         }
399         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePathBuilder spb = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePathBuilder();
400         spb.setServicePathId(new ServicePathIdType(servicePathId));
401         spb.setServiceIndex(serviceIndex);
402         return eb.setAddress(addressFromServicePath(spb.build())).build();
403     }
404
405     public static Eid toEid(MacAddress mac, InstanceIdType vni) {
406         EidBuilder builder = new EidBuilder();
407         builder.setAddressType(MacAfi.class);
408         builder.setVirtualNetworkId(vni);
409         builder.setAddress((Address) new MacBuilder().setMac(mac).build());
410         return builder.build();
411     }
412
413     public static Eid asMacEid(String address, long vni) {
414         return toEid(new MacAddress(address), new InstanceIdType(vni));
415     }
416
417     public static Eid asMacEid(String address) {
418         return toEid(new MacAddress(address), null);
419     }
420
421     public static Eid toEid(DistinguishedNameType dn, InstanceIdType vni) {
422         EidBuilder builder = new EidBuilder();
423         builder.setAddressType(DistinguishedNameAfi.class);
424         builder.setVirtualNetworkId(vni);
425         builder.setAddress((Address) new DistinguishedNameBuilder().setDistinguishedName(dn).build());
426         return builder.build();
427     }
428
429     public static Eid asDistinguishedNameEid(String address, long vni) {
430         return toEid(new MacAddress(address), new InstanceIdType(vni));
431     }
432
433     public static Eid asDistinguishedNameEid(String address) {
434         return toEid(new DistinguishedNameType(address), null);
435     }
436
437     public static Eid asKeyValueAddressEid(SimpleAddress key, SimpleAddress value) {
438         KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
439         kvab.setKey(key);
440         kvab.setValue(value);
441         KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddressBuilder()
442                 .setKeyValueAddress(kvab.build()).build();
443         EidBuilder builder = new EidBuilder();
444         builder.setAddressType(KeyValueAddressLcaf.class);
445         builder.setVirtualNetworkId(null);
446         builder.setAddress((Address) address);
447         return builder.build();
448     }
449
450     public static Rloc asKeyValueAddressRloc(SimpleAddress key, SimpleAddress value) {
451         KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
452         kvab.setKey(key);
453         kvab.setValue(value);
454         KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddressBuilder()
455                 .setKeyValueAddress(kvab.build()).build();
456         RlocBuilder builder = new RlocBuilder();
457         builder.setAddressType(KeyValueAddressLcaf.class);
458         builder.setVirtualNetworkId(null);
459         builder.setAddress((Address) address);
460         return builder.build();
461     }
462
463     public static Rloc asKeyValueAddress(String key, SimpleAddress value) {
464         return asKeyValueAddressRloc(new SimpleAddress(new DistinguishedNameType(key)), value);
465     }
466
467     private static String getStringPrefix(InetAddress address, short mask) {
468         StringBuilder sb = new StringBuilder();
469         sb.append(address.getHostAddress());
470         sb.append("/");
471         sb.append(mask);
472         return sb.toString();
473     }
474
475     public static SourceDestKey asSrcDst(String src, String dst, int smask, int dmask) {
476         SourceDestKeyBuilder builder = new SourceDestKeyBuilder();
477         builder.setSource(new SimpleAddress(asIpPrefix(src, smask)));
478         builder.setDest(new SimpleAddress(asIpPrefix(dst, dmask)));
479         return builder.build();
480     }
481
482     public static Eid asSrcDstEid(String src, String dst, int smask, int dmask, int vni) {
483         EidBuilder builder = new EidBuilder();
484         builder.setAddressType(SourceDestKeyLcaf.class);
485         builder.setVirtualNetworkId(new InstanceIdType(Long.valueOf(vni)));
486         builder.setAddress(
487                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKeyBuilder()
488                         .setSourceDestKey(asSrcDst(src, dst, smask, dmask)).build());
489
490         return builder.build();
491     }
492
493     public static Eid asSrcDstEid(SourceDestKey sd, InstanceIdType vni) {
494         EidBuilder builder = new EidBuilder();
495         builder.setAddressType(SourceDestKeyLcaf.class);
496         builder.setVirtualNetworkId(vni);
497         builder.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
498                 .rev151105.lisp.address.address.SourceDestKeyBuilder().setSourceDestKey(sd).build());
499         return builder.build();
500     }
501
502     public static Rloc asTeLcafRloc(List<IpAddress> hopList) {
503         RlocBuilder teBuilder = new RlocBuilder();
504         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ExplicitLocatorPathBuilder elpBuilder =
505                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ExplicitLocatorPathBuilder();
506         ExplicitLocatorPathBuilder teAddrBuilder = new ExplicitLocatorPathBuilder();
507         teAddrBuilder.setHop(new ArrayList<Hop>());
508         for (IpAddress hop : hopList) {
509             HopBuilder hopBuilder = new HopBuilder();
510             hopBuilder.setAddress(new SimpleAddress(hop));
511             hopBuilder.setHopId("Hop " + teAddrBuilder.getHop().size());
512             hopBuilder.setLrsBits(new LrsBits(false, false, false));
513             teAddrBuilder.getHop().add(hopBuilder.build());
514         }
515
516         elpBuilder.setExplicitLocatorPath(teAddrBuilder.build());
517         teBuilder.setAddress(elpBuilder.build());
518         teBuilder.setAddressType(ExplicitLocatorPathLcaf.class);
519         return teBuilder.build();
520     }
521
522     public static List<LocatorRecord> asLocatorRecords(List<Rloc> locators) {
523         List<LocatorRecord> locatorRecords = new ArrayList<LocatorRecord>();
524         for (Rloc locator : locators) {
525             LocatorRecordBuilder locatorBuilder = new LocatorRecordBuilder();
526             locatorBuilder.setLocalLocator(false).setRlocProbed(false).setWeight((short) 1).setPriority((short) 1)
527                     .setMulticastWeight((short) 1).setMulticastPriority((short) 1).setRouted(true)
528                     .setRloc(locator).setLocatorId("SFC_LISP").build();
529             locatorRecords.add(locatorBuilder.build());
530         }
531         return locatorRecords;
532     }
533
534     public static Eid getNoAddressEid() {
535         EidBuilder builder = new EidBuilder();
536         builder.setAddressType(NoAddressAfi.class);
537         builder.setVirtualNetworkId(null);
538         builder.setAddress(new NoAddressBuilder().setNoAddress(true).build());
539         return builder.build();
540     }
541
542     public static InetAddress ipAddressToInet(Address addr) {
543         try {
544             if (addr instanceof Ipv4) {
545                 return Inet4Address.getByName(((Ipv4) addr).getIpv4().getValue());
546             } else if (addr instanceof Ipv6) {
547                 return Inet6Address.getByName(((Ipv6) addr).getIpv6().getValue());
548             }
549         } catch (java.net.UnknownHostException e) {
550             LOG.debug("Failed to build InetAddress: {}", e);
551         }
552         return null;
553     }
554
555     public static int compareInetAddresses(InetAddress a, InetAddress b) {
556         int i;
557         if (a instanceof Inet4Address && b instanceof Inet6Address) {
558             return -1;
559         } else if (a instanceof Inet6Address && b instanceof Inet4Address) {
560             return 1;
561         } else if (a instanceof Inet4Address && b instanceof Inet4Address) {
562             byte[] aBytes = ((Inet4Address) a).getAddress();
563             byte[] bBytes = ((Inet4Address) b).getAddress();
564             for (i = 0; i < 4; i++) {
565                 if (aBytes[i] < bBytes[i]) {
566                     return -1;
567                 } else if (aBytes[i] > bBytes[i]) {
568                     return 1;
569                 }
570             }
571             return 0;
572         } else if (a instanceof Inet6Address && b instanceof Inet6Address) {
573             byte[] aBytes = ((Inet4Address) a).getAddress();
574             byte[] bBytes = ((Inet4Address) b).getAddress();
575             for (i = 0; i < 16; i++) {
576                 if (aBytes[i] < bBytes[i]) {
577                     return -1;
578                 } else if (aBytes[i] > bBytes[i]) {
579                     return 1;
580                 }
581             }
582             return 0;
583         }
584         return 0;
585     }
586 }