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