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