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