2 * Copyright (c) 2014 Contextream, Inc. and others. All rights reserved.
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
8 package org.opendaylight.lispflowmapping.lisp.util;
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;
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.Ipv4;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6PrefixBuilder;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.MacBuilder;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.NoAddressBuilder;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePathBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.EidBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.key.value.address.KeyValueAddressBuilder;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePath;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKey;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.ExplicitLocatorPathBuilder;
67 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop;
68 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop.LrsBits;
69 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;
70 import org.slf4j.Logger;
71 import org.slf4j.LoggerFactory;
73 public final class LispAddressUtil {
74 protected static final Logger LOG = LoggerFactory.getLogger(LispAddressUtil.class);
76 public static final short STARTING_SERVICE_INDEX = 255;
77 private static Pattern IP4_PATTERN = null;
78 private static Pattern IP6_PATTERN = null;
79 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])";
80 private static final String ip6Pattern = "([0-9a-f]{1,4}:){7}([0-9a-f]){1,4}";
83 IP4_PATTERN = Pattern.compile(ip4Pattern, Pattern.CASE_INSENSITIVE);
84 IP6_PATTERN = Pattern.compile(ip6Pattern, Pattern.CASE_INSENSITIVE);
85 } catch (PatternSyntaxException e) {
86 LOG.debug("Caught pattern syntax exception", e);
90 // Utility class, should not be instantiated
91 private LispAddressUtil() {
94 public static Class<? extends LispAddressFamily> addressTypeFromSimpleAddress(SimpleAddress address) {
95 if (address.getIpAddress() != null) {
96 return addressTypeFromIpAddress(address.getIpAddress());
97 } else if (address.getIpPrefix() != null) {
98 return addressTypeFromIpPrefix(address.getIpPrefix());
99 } else if (address.getMacAddress() != null) {
101 } else if (address.getDistinguishedNameType() != null) {
102 return DistinguishedNameAfi.class;
103 } else if (address.getAsNumber() != null) {
104 return AsNumberAfi.class;
109 public static Address addressFromSimpleAddress(SimpleAddress address) {
110 if (address.getIpAddress() != null) {
111 return addressFromIpAddress(address.getIpAddress());
112 } else if (address.getIpPrefix() != null) {
113 return addressFromIpPrefix(address.getIpPrefix());
114 } else if (address.getMacAddress() != null) {
115 return addressFromMacAddress(address.getMacAddress());
116 } else if (address.getDistinguishedNameType() != null) {
117 return addressFromDistinguishedName(address.getDistinguishedNameType());
118 } else if (address.getAsNumber() != null) {
119 return addressFromAsNumber(address.getAsNumber());
124 public static Class<? extends LispAddressFamily> addressTypeFromInet(InetAddress address) {
125 if (address instanceof Inet4Address) {
126 return Ipv4Afi.class;
127 } else if (address instanceof Inet6Address) {
128 return Ipv6Afi.class;
133 public static Address addressFromInet(InetAddress address) {
134 if (address instanceof Inet4Address) {
135 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder()
136 .setIpv4(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address(address.getHostAddress())).build();
137 } else if (address instanceof Inet6Address) {
138 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder()
139 .setIpv6(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address(address.getHostAddress())).build();
144 public static Class<? extends LispAddressFamily> addressTypeFromIpAddress(IpAddress address) {
145 if (address == null) {
147 } else if (address.getIpv4Address() != null) {
148 return Ipv4Afi.class;
149 } else if (address.getIpv6Address() != null) {
150 return Ipv6Afi.class;
155 public static Address addressFromIpAddress(IpAddress address) {
156 if (address == null) {
158 } else if (address.getIpv4Address() != null) {
159 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();
160 } else if (address.getIpv6Address() != null) {
161 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();
166 public static Class<? extends LispAddressFamily> addressTypeFromIpPrefix(IpPrefix address) {
167 if (address == null) {
169 } else if (address.getIpv4Prefix() != null) {
170 return Ipv4PrefixAfi.class;
171 } else if (address.getIpv6Prefix() != null) {
172 return Ipv6PrefixAfi.class;
177 public static Address addressFromIpPrefix(IpPrefix address) {
178 if (address == null) {
180 } else if (address.getIpv4Prefix() != null) {
181 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();
182 } else if (address.getIpv6Prefix() != null) {
183 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();
188 public static Address addressFromMacAddress(MacAddress address) {
189 if (address == null) {
192 return (Address) new MacBuilder().setMac(address).build();
196 public static Address addressFromServicePath(ServicePath address) {
197 if (address == null) {
200 return (Address) new ServicePathBuilder().setServicePath(address).build();
204 public static Address addressFromDistinguishedName(DistinguishedNameType address) {
205 if (address == null) {
208 return (Address) new DistinguishedNameBuilder().setDistinguishedName(address).build();
212 public static Address addressFromAsNumber(AsNumber address) {
213 if (address == null) {
216 return (Address) new AsNumberBuilder().setAsNumber(address).build();
219 public static Rloc toRloc(SimpleAddress address) {
220 RlocBuilder builder = new RlocBuilder();
221 builder.setAddressType(addressTypeFromSimpleAddress(address));
222 builder.setVirtualNetworkId(null);
223 builder.setAddress(addressFromSimpleAddress(address));
224 return builder.build();
227 public static Rloc toRloc(InetAddress address) {
228 RlocBuilder builder = new RlocBuilder();
229 builder.setAddressType(addressTypeFromInet(address));
230 builder.setVirtualNetworkId(null);
231 builder.setAddress(addressFromInet(address));
232 return builder.build();
235 public static Rloc toRloc(Ipv4Address address) {
236 RlocBuilder builder = new RlocBuilder();
237 builder.setAddressType(Ipv4Afi.class);
238 builder.setVirtualNetworkId(null);
239 builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
240 return builder.build();
243 public static Rloc toRloc(Ipv6Address address) {
244 RlocBuilder builder = new RlocBuilder();
245 builder.setAddressType(Ipv6Afi.class);
246 builder.setVirtualNetworkId(null);
247 builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
248 return builder.build();
251 public static Rloc asIpv4Rloc(String address) {
252 return toRloc(new Ipv4Address(address));
255 public static Rloc asIpv6Rloc(String address) {
256 return toRloc(new Ipv6Address(address));
259 public static Eid toEid(Ipv4Prefix prefix, InstanceIdType vni) {
260 EidBuilder builder = new EidBuilder();
261 builder.setAddressType(Ipv4PrefixAfi.class);
262 builder.setVirtualNetworkId(vni);
263 builder.setAddress((Address) new Ipv4PrefixBuilder().setIpv4Prefix(prefix).build());
264 return builder.build();
267 public static Eid toEid(Ipv4Address prefix, InstanceIdType vni) {
268 EidBuilder builder = new EidBuilder();
269 builder.setAddressType(Ipv4Afi.class);
270 builder.setVirtualNetworkId(vni);
271 builder.setAddress((Address) new Ipv4Builder().setIpv4(prefix).build());
272 return builder.build();
275 // XXX getMapping rcp fails if VNI set to 0
276 public static Eid toEidNoVni(IpPrefix prefix) {
277 EidBuilder builder = new EidBuilder();
278 builder.setAddress(addressFromIpPrefix(prefix));
279 builder.setAddressType(addressTypeFromIpPrefix(prefix));
280 return builder.build();
283 public static Eid toEid(IpPrefix prefix, InstanceIdType vni) {
284 EidBuilder builder = new EidBuilder();
285 builder.setAddress(addressFromIpPrefix(prefix));
286 builder.setAddressType(addressTypeFromIpPrefix(prefix));
287 builder.setVirtualNetworkId(vni);
288 return builder.build();
291 public static Eid toIpPrefixEid(IpAddress addr, int vni) {
292 // If you touch this, be sure that sfclisp compiles!
293 int mask = addressTypeFromIpAddress(addr) == Ipv4Afi.class ? 32 : 128;
294 IpPrefix prefix = asIpPrefix(addr.getValue().toString(), mask);
295 // XXX getMapping rcp fails if VNI set to 0
296 return toEidNoVni(prefix);
299 public static Eid asEid(SimpleAddress address, InstanceIdType vni) {
300 EidBuilder builder = new EidBuilder();
301 builder.setAddressType(addressTypeFromSimpleAddress(address));
302 builder.setVirtualNetworkId(vni);
303 // XXX Not sure if the below actually works as expected... also, what happens to AFI?
304 builder.setAddress(addressFromSimpleAddress(address));
305 return builder.build();
308 public static Eid asIpv4PrefixEid(String prefix) {
309 return toEid(new Ipv4Prefix(prefix), null);
312 public static Eid asIpv4Eid(String address) {
313 return toEid(new Ipv4Address(address), null);
316 public static Eid toEid(Ipv6Prefix prefix, InstanceIdType vni) {
317 EidBuilder builder = new EidBuilder();
318 builder.setAddressType(Ipv6PrefixAfi.class);
319 builder.setVirtualNetworkId(vni);
320 builder.setAddress((Address) new Ipv6PrefixBuilder().setIpv6Prefix(prefix).build());
321 return builder.build();
324 public static Eid toEid(Ipv6Address prefix, InstanceIdType vni) {
325 EidBuilder builder = new EidBuilder();
326 builder.setAddressType(Ipv6Afi.class);
327 builder.setVirtualNetworkId(vni);
328 builder.setAddress((Address) new Ipv6Builder().setIpv6(prefix).build());
329 return builder.build();
332 public static Eid asIpv6Eid(String address, long vni) {
333 return toEid(new Ipv6Address(address), new InstanceIdType(vni));
336 public static Eid asIpv6PrefixEid(String prefix) {
337 return toEid(new Ipv6Prefix(prefix), null);
340 public static Eid asIpv6Eid(String address) {
341 return toEid(new Ipv6Address(address), null);
344 public static Eid asIpv4Eid(String address, long vni) {
345 return toEid(new Ipv4Address(address), new InstanceIdType(vni));
348 public static int ipVersionFromString(String ip) {
349 if (IP4_PATTERN.matcher(ip).matches()) {
351 } else if (IP6_PATTERN.matcher(ip).matches()) {
358 public static IpPrefix asIpPrefix(String addr, int mask) {
359 int version = ipVersionFromString(addr);
360 if (version == 4 && (mask >= 0 && mask <= 32)) {
361 return new IpPrefix(new Ipv4Prefix(addr + "/" + mask));
362 } else if (version == 6 && (mask >=0 && mask <= 128)) {
363 return new IpPrefix(new Ipv6Prefix(addr + "/" + mask));
369 public static Eid asIpv4PrefixEid(Ipv4Address addr, InstanceIdType vni) {
370 return toEid(new IpPrefix(new Ipv4Prefix(addr.getValue() + "/" + 32)), vni);
373 public static Eid asIpv6PrefixEid(Ipv6Address addr, InstanceIdType vni) {
374 return toEid(new IpPrefix(new Ipv4Prefix(addr.getValue() + "/" + 128)), vni);
377 public static Eid asIpv4PrefixEid(Eid eid, Inet4Address address, short mask) {
378 EidBuilder builder = new EidBuilder();
379 builder.setAddressType(eid.getAddressType());
380 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
381 builder.setAddress(new Ipv4PrefixBuilder().setIpv4Prefix(new Ipv4Prefix(getStringPrefix(address, mask))).build());
382 return builder.build();
385 public static Eid asIpv6PrefixEid(Eid eid, Inet6Address address, short mask) {
386 EidBuilder builder = new EidBuilder();
387 builder.setAddressType(eid.getAddressType());
388 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
389 builder.setAddress(new Ipv6PrefixBuilder().setIpv6Prefix(new Ipv6Prefix(getStringPrefix(address, mask))).build());
390 return builder.build();
393 public static Eid asServicePathEid(long vni, long servicePathId, short serviceIndex) {
394 EidBuilder eb = new EidBuilder();
395 eb.setAddressType(ServicePathLcaf.class);
397 eb.setVirtualNetworkId(new InstanceIdType(vni));
399 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();
400 spb.setServicePathId(new ServicePathIdType(servicePathId));
401 spb.setServiceIndex(serviceIndex);
402 return eb.setAddress(addressFromServicePath(spb.build())).build();
405 public static Eid toEid(MacAddress mac, InstanceIdType vni) {
406 EidBuilder builder = new EidBuilder();
407 builder.setAddressType(MacAfi.class);
408 builder.setVirtualNetworkId(vni);
409 builder.setAddress((Address) new MacBuilder().setMac(mac).build());
410 return builder.build();
413 public static Eid asMacEid(String address, long vni) {
414 return toEid(new MacAddress(address), new InstanceIdType(vni));
417 public static Eid asMacEid(String address) {
418 return toEid(new MacAddress(address), null);
421 public static Eid toEid(DistinguishedNameType dn, InstanceIdType vni) {
422 EidBuilder builder = new EidBuilder();
423 builder.setAddressType(DistinguishedNameAfi.class);
424 builder.setVirtualNetworkId(vni);
425 builder.setAddress((Address) new DistinguishedNameBuilder().setDistinguishedName(dn).build());
426 return builder.build();
429 public static Eid asDistinguishedNameEid(String address, long vni) {
430 return toEid(new MacAddress(address), new InstanceIdType(vni));
433 public static Eid asDistinguishedNameEid(String address) {
434 return toEid(new DistinguishedNameType(address), null);
437 public static Eid asKeyValueAddressEid(SimpleAddress key, SimpleAddress value) {
438 KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
440 kvab.setValue(value);
441 KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddressBuilder()
442 .setKeyValueAddress(kvab.build()).build();
443 EidBuilder builder = new EidBuilder();
444 builder.setAddressType(KeyValueAddressLcaf.class);
445 builder.setVirtualNetworkId(null);
446 builder.setAddress((Address) address);
447 return builder.build();
450 public static Rloc asKeyValueAddressRloc(SimpleAddress key, SimpleAddress value) {
451 KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
453 kvab.setValue(value);
454 KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddressBuilder()
455 .setKeyValueAddress(kvab.build()).build();
456 RlocBuilder builder = new RlocBuilder();
457 builder.setAddressType(KeyValueAddressLcaf.class);
458 builder.setVirtualNetworkId(null);
459 builder.setAddress((Address) address);
460 return builder.build();
463 public static Rloc asKeyValueAddress(String key, SimpleAddress value) {
464 return asKeyValueAddressRloc(new SimpleAddress(new DistinguishedNameType(key)), value);
467 private static String getStringPrefix(InetAddress address, short mask) {
468 StringBuilder sb = new StringBuilder();
469 sb.append(address.getHostAddress());
472 return sb.toString();
475 public static SourceDestKey asSrcDst(String src, String dst, int smask, int dmask) {
476 SourceDestKeyBuilder builder = new SourceDestKeyBuilder();
477 builder.setSource(new SimpleAddress(asIpPrefix(src, smask)));
478 builder.setDest(new SimpleAddress(asIpPrefix(dst, dmask)));
479 return builder.build();
482 public static Eid asSrcDstEid(String src, String dst, int smask, int dmask, int vni) {
483 EidBuilder builder = new EidBuilder();
484 builder.setAddressType(SourceDestKeyLcaf.class);
485 builder.setVirtualNetworkId(new InstanceIdType(Long.valueOf(vni)));
487 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKeyBuilder()
488 .setSourceDestKey(asSrcDst(src, dst, smask, dmask)).build());
490 return builder.build();
493 public static Eid asSrcDstEid(SourceDestKey sd, InstanceIdType vni) {
494 EidBuilder builder = new EidBuilder();
495 builder.setAddressType(SourceDestKeyLcaf.class);
496 builder.setVirtualNetworkId(vni);
497 builder.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
498 .rev151105.lisp.address.address.SourceDestKeyBuilder().setSourceDestKey(sd).build());
499 return builder.build();
502 public static Rloc asTeLcafRloc(List<IpAddress> hopList) {
503 RlocBuilder teBuilder = new RlocBuilder();
504 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ExplicitLocatorPathBuilder elpBuilder =
505 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ExplicitLocatorPathBuilder();
506 ExplicitLocatorPathBuilder teAddrBuilder = new ExplicitLocatorPathBuilder();
507 teAddrBuilder.setHop(new ArrayList<Hop>());
508 for (IpAddress hop : hopList) {
509 HopBuilder hopBuilder = new HopBuilder();
510 hopBuilder.setAddress(new SimpleAddress(hop));
511 hopBuilder.setHopId("Hop " + teAddrBuilder.getHop().size());
512 hopBuilder.setLrsBits(new LrsBits(false, false, false));
513 teAddrBuilder.getHop().add(hopBuilder.build());
516 elpBuilder.setExplicitLocatorPath(teAddrBuilder.build());
517 teBuilder.setAddress(elpBuilder.build());
518 teBuilder.setAddressType(ExplicitLocatorPathLcaf.class);
519 return teBuilder.build();
522 public static List<LocatorRecord> asLocatorRecords(List<Rloc> locators) {
523 List<LocatorRecord> locatorRecords = new ArrayList<LocatorRecord>();
524 for (Rloc locator : locators) {
525 LocatorRecordBuilder locatorBuilder = new LocatorRecordBuilder();
526 locatorBuilder.setLocalLocator(false).setRlocProbed(false).setWeight((short) 1).setPriority((short) 1)
527 .setMulticastWeight((short) 1).setMulticastPriority((short) 1).setRouted(true)
528 .setRloc(locator).setLocatorId("SFC_LISP").build();
529 locatorRecords.add(locatorBuilder.build());
531 return locatorRecords;
534 public static Eid getNoAddressEid() {
535 EidBuilder builder = new EidBuilder();
536 builder.setAddressType(NoAddressAfi.class);
537 builder.setVirtualNetworkId(null);
538 builder.setAddress(new NoAddressBuilder().setNoAddress(true).build());
539 return builder.build();
542 public static InetAddress ipAddressToInet(Address addr) {
544 if (addr instanceof Ipv4) {
545 return Inet4Address.getByName(((Ipv4) addr).getIpv4().getValue());
546 } else if (addr instanceof Ipv6) {
547 return Inet6Address.getByName(((Ipv6) addr).getIpv6().getValue());
549 } catch (java.net.UnknownHostException e) {
550 LOG.debug("Failed to build InetAddress: {}", e);
555 public static int compareInetAddresses(InetAddress a, InetAddress b) {
557 if (a instanceof Inet4Address && b instanceof Inet6Address) {
559 } else if (a instanceof Inet6Address && b instanceof Inet4Address) {
561 } else if (a instanceof Inet4Address && b instanceof Inet4Address) {
562 byte[] aBytes = ((Inet4Address) a).getAddress();
563 byte[] bBytes = ((Inet4Address) b).getAddress();
564 for (i = 0; i < 4; i++) {
565 if (aBytes[i] < bBytes[i]) {
567 } else if (aBytes[i] > bBytes[i]) {
572 } else if (a instanceof Inet6Address && b instanceof Inet6Address) {
573 byte[] aBytes = ((Inet4Address) a).getAddress();
574 byte[] bBytes = ((Inet4Address) b).getAddress();
575 for (i = 0; i < 16; i++) {
576 if (aBytes[i] < bBytes[i]) {
578 } else if (aBytes[i] > bBytes[i]) {