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