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