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 com.google.common.net.InetAddresses;
12 import java.net.Inet4Address;
13 import java.net.Inet6Address;
14 import java.net.InetAddress;
15 import java.util.ArrayList;
16 import java.util.List;
17 import java.util.regex.Pattern;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.AsNumberAfi;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameAfi;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameType;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ExplicitLocatorPathLcaf;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.InstanceIdType;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6Afi;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6PrefixAfi;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.KeyValueAddressLcaf;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddressFamily;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.NoAddressAfi;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathIdType;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathLcaf;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.AsNumberBuilder;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.DistinguishedNameBuilder;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6PrefixBuilder;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.MacBuilder;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.NoAddressBuilder;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePathBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv4AddressBinary;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv6AddressBinary;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4BinaryAfi;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv6BinaryAfi;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4Binary;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4BinaryBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6Binary;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6BinaryBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.EidBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
70 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.key.value.address.KeyValueAddressBuilder;
71 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePath;
72 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKey;
73 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder;
74 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
75 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.ExplicitLocatorPathBuilder;
76 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;
77 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;
78 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;
79 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IetfInetUtil;
80 import org.slf4j.Logger;
81 import org.slf4j.LoggerFactory;
83 public final class LispAddressUtil {
84 protected static final Logger LOG = LoggerFactory.getLogger(LispAddressUtil.class);
86 public static final short STARTING_SERVICE_INDEX = 255;
87 private static final Pattern IP4_PATTERN =
88 Pattern.compile("(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])",
89 Pattern.CASE_INSENSITIVE);
90 private static final Pattern IP6_PATTERN =
91 Pattern.compile("([0-9a-f]{1,4}:){7}([0-9a-f]){1,4}", Pattern.CASE_INSENSITIVE);
93 // Utility class, should not be instantiated
94 private LispAddressUtil() {
97 public static Class<? extends LispAddressFamily> addressTypeFromSimpleAddress(SimpleAddress address) {
98 if (address.getIpAddress() != null) {
99 return binaryAddressTypeFromIpAddress(address.getIpAddress());
100 } else if (address.getIpPrefix() != null) {
101 return addressTypeFromIpPrefix(address.getIpPrefix());
102 } else if (address.getMacAddress() != null) {
104 } else if (address.getDistinguishedNameType() != null) {
105 return DistinguishedNameAfi.class;
106 } else if (address.getAsNumber() != null) {
107 return AsNumberAfi.class;
112 public static Address addressFromSimpleAddress(SimpleAddress address) {
113 if (address.getIpAddress() != null) {
114 return binaryAddressFromIpAddress(address.getIpAddress());
115 } else if (address.getIpPrefix() != null) {
116 return addressFromIpPrefix(address.getIpPrefix());
117 } else if (address.getMacAddress() != null) {
118 return addressFromMacAddress(address.getMacAddress());
119 } else if (address.getDistinguishedNameType() != null) {
120 return addressFromDistinguishedName(address.getDistinguishedNameType());
121 } else if (address.getAsNumber() != null) {
122 return addressFromAsNumber(address.getAsNumber());
127 public static Class<? extends LispAddressFamily> addressTypeFromInet(InetAddress address) {
128 if (address instanceof Inet4Address) {
129 return Ipv4Afi.class;
130 } else if (address instanceof Inet6Address) {
131 return Ipv6Afi.class;
136 public static Address addressFromInet(InetAddress address) {
137 if (address instanceof Inet4Address) {
138 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
139 .rev151105.lisp.address.address.Ipv4Builder()
140 .setIpv4(IetfInetUtil.INSTANCE.ipv4AddressFor(address)).build();
141 } else if (address instanceof Inet6Address) {
142 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
143 .rev151105.lisp.address.address.Ipv6Builder()
144 .setIpv6(IetfInetUtil.INSTANCE.ipv6AddressFor(address)).build();
149 public static Class<? extends LispAddressFamily> addressTypeFromIpAddress(IpAddress address) {
150 if (address == null) {
152 } else if (address.getIpv4Address() != null) {
153 return Ipv4Afi.class;
154 } else if (address.getIpv6Address() != null) {
155 return Ipv6Afi.class;
160 public static Class<? extends LispAddressFamily> binaryAddressTypeFromIpAddress(IpAddress address) {
161 if (address == null) {
163 } else if (address.getIpv4Address() != null) {
164 return Ipv4BinaryAfi.class;
165 } else if (address.getIpv6Address() != null) {
166 return Ipv6BinaryAfi.class;
171 public static Address addressFromIpAddress(IpAddress address) {
172 if (address == null) {
174 } else if (address.getIpv4Address() != null) {
175 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
176 .rev151105.lisp.address.address.Ipv4Builder().setIpv4(address.getIpv4Address()).build();
177 } else if (address.getIpv6Address() != null) {
178 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
179 .rev151105.lisp.address.address.Ipv6Builder().setIpv6(address.getIpv6Address()).build();
185 public static Address binaryAddressFromIpAddress(IpAddress address) {
186 if (address == null) {
188 } else if (address.getIpv4Address() != null) {
189 return (Address) new Ipv4BinaryBuilder().setIpv4Binary(new Ipv4AddressBinary(
190 InetAddresses.forString(address.getIpv4Address().getValue()).getAddress())).build();
191 } else if (address.getIpv6Address() != null) {
192 return (Address) new Ipv6BinaryBuilder().setIpv6Binary(new Ipv6AddressBinary(
193 InetAddresses.forString(address.getIpv4Address().getValue()).getAddress())).build();
198 public static Class<? extends LispAddressFamily> addressTypeFromIpPrefix(IpPrefix address) {
199 if (address == null) {
201 } else if (address.getIpv4Prefix() != null) {
202 return Ipv4PrefixAfi.class;
203 } else if (address.getIpv6Prefix() != null) {
204 return Ipv6PrefixAfi.class;
209 public static Address addressFromIpPrefix(IpPrefix address) {
210 if (address == null) {
212 } else if (address.getIpv4Prefix() != null) {
213 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
214 .rev151105.lisp.address.address.Ipv4PrefixBuilder().setIpv4Prefix(address.getIpv4Prefix()).build();
215 } else if (address.getIpv6Prefix() != null) {
216 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
217 .rev151105.lisp.address.address.Ipv6PrefixBuilder().setIpv6Prefix(address.getIpv6Prefix()).build();
222 public static Address addressFromMacAddress(MacAddress address) {
223 if (address == null) {
226 return (Address) new MacBuilder().setMac(address).build();
230 public static Address addressFromServicePath(ServicePath address) {
231 if (address == null) {
234 return (Address) new ServicePathBuilder().setServicePath(address).build();
238 public static Address addressFromDistinguishedName(DistinguishedNameType address) {
239 if (address == null) {
242 return (Address) new DistinguishedNameBuilder().setDistinguishedName(address).build();
246 public static Address addressFromAsNumber(AsNumber address) {
247 if (address == null) {
250 return (Address) new AsNumberBuilder().setAsNumber(address).build();
253 public static Rloc toRloc(SimpleAddress address) {
254 RlocBuilder builder = new RlocBuilder();
255 builder.setAddressType(addressTypeFromSimpleAddress(address));
256 builder.setVirtualNetworkId(null);
257 builder.setAddress(addressFromSimpleAddress(address));
258 return builder.build();
261 public static Rloc toRloc(InetAddress address) {
262 RlocBuilder builder = new RlocBuilder();
263 builder.setAddressType(addressTypeFromInet(address));
264 builder.setVirtualNetworkId(null);
265 builder.setAddress(addressFromInet(address));
266 return builder.build();
269 public static Rloc toRloc(Ipv4Address address) {
270 RlocBuilder builder = new RlocBuilder();
271 builder.setAddressType(Ipv4Afi.class);
272 builder.setVirtualNetworkId(null);
273 builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
274 return builder.build();
277 public static Rloc toRloc(Ipv4AddressBinary address) {
278 RlocBuilder builder = new RlocBuilder();
279 builder.setAddressType(Ipv4BinaryAfi.class);
280 builder.setVirtualNetworkId(null);
281 builder.setAddress((Address) new Ipv4BinaryBuilder().setIpv4Binary(address).build());
282 return builder.build();
285 public static Rloc toRloc(Ipv6Address address) {
286 RlocBuilder builder = new RlocBuilder();
287 builder.setAddressType(Ipv6Afi.class);
288 builder.setVirtualNetworkId(null);
289 builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
290 return builder.build();
293 public static Rloc toRloc(Ipv6AddressBinary address) {
294 RlocBuilder builder = new RlocBuilder();
295 builder.setAddressType(Ipv6BinaryAfi.class);
296 builder.setVirtualNetworkId(null);
297 builder.setAddress((Address) new Ipv6BinaryBuilder().setIpv6Binary(address).build());
298 return builder.build();
301 public static Rloc asIpv4Rloc(String address) {
302 return toRloc(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()));
305 public static Rloc asIpv6Rloc(String address) {
306 return toRloc(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()));
309 public static Eid toEid(Ipv4Prefix prefix, InstanceIdType vni) {
310 EidBuilder builder = new EidBuilder();
311 builder.setAddressType(Ipv4PrefixAfi.class);
312 builder.setVirtualNetworkId(vni);
313 builder.setAddress((Address) new Ipv4PrefixBuilder().setIpv4Prefix(prefix).build());
314 return builder.build();
317 public static Eid toEid(Ipv4Address address, InstanceIdType vni) {
318 EidBuilder builder = new EidBuilder();
319 builder.setAddressType(Ipv4Afi.class);
320 builder.setVirtualNetworkId(vni);
321 builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
322 return builder.build();
325 public static Eid toEid(Ipv4AddressBinary address, InstanceIdType vni) {
326 EidBuilder builder = new EidBuilder();
327 builder.setAddressType(Ipv4BinaryAfi.class);
328 builder.setVirtualNetworkId(vni);
329 builder.setAddress((Address) new Ipv4BinaryBuilder().setIpv4Binary(address).build());
330 return builder.build();
333 // XXX getMapping rcp fails if VNI set to 0
334 public static Eid toEidNoVni(IpPrefix prefix) {
335 EidBuilder builder = new EidBuilder();
336 builder.setAddress(addressFromIpPrefix(prefix));
337 builder.setAddressType(addressTypeFromIpPrefix(prefix));
338 return builder.build();
341 public static Eid toEid(IpPrefix prefix, InstanceIdType vni) {
342 EidBuilder builder = new EidBuilder();
343 builder.setAddress(addressFromIpPrefix(prefix));
344 builder.setAddressType(addressTypeFromIpPrefix(prefix));
345 builder.setVirtualNetworkId(vni);
346 return builder.build();
349 public static Eid toIpPrefixEid(IpAddress addr, int vni) {
350 // If you touch this, be sure that sfclisp compiles!
351 int mask = addressTypeFromIpAddress(addr) == Ipv4Afi.class ? 32 : 128;
352 IpPrefix prefix = asIpPrefix(String.valueOf(addr.getValue()), mask);
353 // XXX getMapping rcp fails if VNI set to 0
354 return toEidNoVni(prefix);
357 public static Eid asEid(SimpleAddress address, InstanceIdType vni) {
358 EidBuilder builder = new EidBuilder();
359 builder.setAddressType(addressTypeFromSimpleAddress(address));
360 builder.setVirtualNetworkId(vni);
361 // XXX Not sure if the below actually works as expected... also, what happens to AFI?
362 builder.setAddress(addressFromSimpleAddress(address));
363 return builder.build();
366 public static Eid asIpv4PrefixEid(String prefix) {
367 return toEid(new Ipv4Prefix(prefix), null);
370 public static Eid asIpv4PrefixEid(final String prefix, final InstanceIdType iiType) {
371 return toEid(new Ipv4Prefix(prefix), iiType);
374 public static Eid asIpv4Eid(String address) {
375 return toEid(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()), null);
378 public static Eid toEid(Ipv6Prefix prefix, InstanceIdType vni) {
379 EidBuilder builder = new EidBuilder();
380 builder.setAddressType(Ipv6PrefixAfi.class);
381 builder.setVirtualNetworkId(vni);
382 builder.setAddress((Address) new Ipv6PrefixBuilder().setIpv6Prefix(prefix).build());
383 return builder.build();
386 public static Eid toEid(Ipv6Address address, InstanceIdType vni) {
387 EidBuilder builder = new EidBuilder();
388 builder.setAddressType(Ipv6Afi.class);
389 builder.setVirtualNetworkId(vni);
390 builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
391 return builder.build();
394 public static Eid toEid(Ipv6AddressBinary address, InstanceIdType vni) {
395 EidBuilder builder = new EidBuilder();
396 builder.setAddressType(Ipv6BinaryAfi.class);
397 builder.setVirtualNetworkId(vni);
398 builder.setAddress((Address) new Ipv6BinaryBuilder().setIpv6Binary(address).build());
399 return builder.build();
402 public static Eid asIpv6Eid(String address, long vni) {
403 return toEid(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()), new InstanceIdType(vni));
406 public static Eid asIpv6PrefixEid(String prefix) {
407 return toEid(new Ipv6Prefix(prefix), null);
410 public static Eid asIpv6Eid(String address) {
411 return toEid(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()), null);
414 public static Eid asIpv4Eid(String address, long vni) {
415 return toEid(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()), new InstanceIdType(vni));
418 public static int ipVersionFromString(String ip) {
419 if (IP4_PATTERN.matcher(ip).matches()) {
421 } else if (IP6_PATTERN.matcher(ip).matches()) {
428 public static IpPrefix asIpPrefix(String addr, int mask) {
429 int version = ipVersionFromString(addr);
430 if (version == 4 && (mask >= 0 && mask <= 32)) {
431 return new IpPrefix(new Ipv4Prefix(addr + "/" + mask));
432 } else if (version == 6 && (mask >=0 && mask <= 128)) {
433 return new IpPrefix(new Ipv6Prefix(addr + "/" + mask));
439 public static Eid asIpv4PrefixEid(Ipv4Address addr, InstanceIdType vni) {
440 return toEid(new IpPrefix(IetfInetUtil.INSTANCE.ipv4PrefixFor(addr)), vni);
443 public static Eid asIpv6PrefixEid(Ipv6Address addr, InstanceIdType vni) {
444 return toEid(new IpPrefix(IetfInetUtil.INSTANCE.ipv6PrefixFor(addr)), vni);
447 public static Eid asIpv4PrefixEid(Eid eid, Inet4Address address, short mask) {
448 EidBuilder builder = new EidBuilder();
449 builder.setAddressType(eid.getAddressType());
450 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
451 builder.setAddress(new Ipv4PrefixBuilder().setIpv4Prefix(
452 IetfInetUtil.INSTANCE.ipv4PrefixFor(address, mask)).build());
453 return builder.build();
456 public static Eid asIpv6PrefixEid(Eid eid, Inet6Address address, short mask) {
457 EidBuilder builder = new EidBuilder();
458 builder.setAddressType(eid.getAddressType());
459 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
460 builder.setAddress(new Ipv6PrefixBuilder().setIpv6Prefix(
461 IetfInetUtil.INSTANCE.ipv6PrefixFor(address, mask)).build());
462 return builder.build();
465 public static Eid asServicePathEid(long vni, long servicePathId, short serviceIndex) {
466 EidBuilder eb = new EidBuilder();
467 eb.setAddressType(ServicePathLcaf.class);
469 eb.setVirtualNetworkId(new InstanceIdType(vni));
471 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
472 .lisp.address.address.service.path.ServicePathBuilder spb =
473 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
474 .lisp.address.address.service.path.ServicePathBuilder();
475 spb.setServicePathId(new ServicePathIdType(servicePathId));
476 spb.setServiceIndex(serviceIndex);
477 return eb.setAddress(addressFromServicePath(spb.build())).build();
480 public static Eid toEid(MacAddress mac, InstanceIdType vni) {
481 EidBuilder builder = new EidBuilder();
482 builder.setAddressType(MacAfi.class);
483 builder.setVirtualNetworkId(vni);
484 builder.setAddress((Address) new MacBuilder().setMac(mac).build());
485 return builder.build();
488 public static Eid asMacEid(String address, long vni) {
489 return toEid(new MacAddress(address), new InstanceIdType(vni));
492 public static Eid asMacEid(String address) {
493 return toEid(new MacAddress(address), null);
496 public static Eid toEid(DistinguishedNameType dn, InstanceIdType vni) {
497 EidBuilder builder = new EidBuilder();
498 builder.setAddressType(DistinguishedNameAfi.class);
499 builder.setVirtualNetworkId(vni);
500 builder.setAddress((Address) new DistinguishedNameBuilder().setDistinguishedName(dn).build());
501 return builder.build();
504 public static Eid asDistinguishedNameEid(String address, long vni) {
505 return toEid(new MacAddress(address), new InstanceIdType(vni));
508 public static Eid asDistinguishedNameEid(String address) {
509 return toEid(new DistinguishedNameType(address), null);
512 public static Eid asKeyValueAddressEid(SimpleAddress key, SimpleAddress value) {
513 KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
515 kvab.setValue(value);
516 KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
517 .rev151105.lisp.address.address.KeyValueAddressBuilder()
518 .setKeyValueAddress(kvab.build()).build();
519 EidBuilder builder = new EidBuilder();
520 builder.setAddressType(KeyValueAddressLcaf.class);
521 builder.setVirtualNetworkId(null);
522 builder.setAddress((Address) address);
523 return builder.build();
526 public static Rloc asKeyValueAddressRloc(SimpleAddress key, SimpleAddress value) {
527 KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
529 kvab.setValue(value);
530 KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
531 .rev151105.lisp.address.address.KeyValueAddressBuilder()
532 .setKeyValueAddress(kvab.build()).build();
533 RlocBuilder builder = new RlocBuilder();
534 builder.setAddressType(KeyValueAddressLcaf.class);
535 builder.setVirtualNetworkId(null);
536 builder.setAddress((Address) address);
537 return builder.build();
540 public static Rloc asKeyValueAddress(String key, SimpleAddress value) {
541 return asKeyValueAddressRloc(new SimpleAddress(new DistinguishedNameType(key)), value);
544 public static SourceDestKey asSrcDst(String src, String dst, int smask, int dmask) {
545 SourceDestKeyBuilder builder = new SourceDestKeyBuilder();
546 builder.setSource(new SimpleAddress(asIpPrefix(src, smask)));
547 builder.setDest(new SimpleAddress(asIpPrefix(dst, dmask)));
548 return builder.build();
551 public static Eid asSrcDstEid(String src, String dst, int smask, int dmask, int vni) {
552 EidBuilder builder = new EidBuilder();
553 builder.setAddressType(SourceDestKeyLcaf.class);
554 builder.setVirtualNetworkId(new InstanceIdType(Long.valueOf(vni)));
556 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
557 .lisp.address.address.SourceDestKeyBuilder()
558 .setSourceDestKey(asSrcDst(src, dst, smask, dmask)).build());
560 return builder.build();
563 public static Eid asSrcDstEid(SourceDestKey sd, InstanceIdType vni) {
564 EidBuilder builder = new EidBuilder();
565 builder.setAddressType(SourceDestKeyLcaf.class);
566 builder.setVirtualNetworkId(vni);
567 builder.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
568 .rev151105.lisp.address.address.SourceDestKeyBuilder().setSourceDestKey(sd).build());
569 return builder.build();
572 public static Rloc asTeLcafRloc(List<IpAddress> hopList) {
573 RlocBuilder teBuilder = new RlocBuilder();
574 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
575 .lisp.address.address.ExplicitLocatorPathBuilder elpBuilder =
576 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
577 .lisp.address.address.ExplicitLocatorPathBuilder();
578 ExplicitLocatorPathBuilder teAddrBuilder = new ExplicitLocatorPathBuilder();
579 teAddrBuilder.setHop(new ArrayList<Hop>());
580 for (IpAddress hop : hopList) {
581 HopBuilder hopBuilder = new HopBuilder();
582 hopBuilder.setAddress(new SimpleAddress(hop));
583 hopBuilder.setHopId("Hop " + teAddrBuilder.getHop().size());
584 hopBuilder.setLrsBits(new LrsBits(false, false, false));
585 teAddrBuilder.getHop().add(hopBuilder.build());
588 elpBuilder.setExplicitLocatorPath(teAddrBuilder.build());
589 teBuilder.setAddress(elpBuilder.build());
590 teBuilder.setAddressType(ExplicitLocatorPathLcaf.class);
591 return teBuilder.build();
594 public static List<LocatorRecord> asLocatorRecords(List<Rloc> locators) {
595 List<LocatorRecord> locatorRecords = new ArrayList<LocatorRecord>();
596 for (Rloc locator : locators) {
597 LocatorRecordBuilder locatorBuilder = new LocatorRecordBuilder();
598 locatorBuilder.setLocalLocator(false).setRlocProbed(false).setWeight((short) 1).setPriority((short) 1)
599 .setMulticastWeight((short) 1).setMulticastPriority((short) 1).setRouted(true)
600 .setRloc(locator).setLocatorId("SFC_LISP").build();
601 locatorRecords.add(locatorBuilder.build());
603 return locatorRecords;
606 public static Eid getNoAddressEid() {
607 EidBuilder builder = new EidBuilder();
608 builder.setAddressType(NoAddressAfi.class);
609 builder.setVirtualNetworkId(null);
610 builder.setAddress(new NoAddressBuilder().setNoAddress(true).build());
611 return builder.build();
614 public static byte[] ipAddressToByteArray(Address addr) {
615 if (addr instanceof Ipv4) {
616 return InetAddresses.forString(((Ipv4) addr).getIpv4().getValue()).getAddress();
617 } else if (addr instanceof Ipv6) {
618 return InetAddresses.forString(((Ipv6) addr).getIpv6().getValue()).getAddress();
619 } else if (addr instanceof Ipv4Binary) {
620 return ((Ipv4Binary) addr).getIpv4Binary().getValue();
621 } else if (addr instanceof Ipv6Binary) {
622 return ((Ipv6Binary) addr).getIpv6Binary().getValue();
628 public static int compareIpAddressByteArrays(byte[] a, byte[] b) {
630 if (a.length < b.length) {
632 } else if (a.length > b.length) {
634 } else if (a.length == 4 && b.length == 4) {
635 for (i = 0; i < 4; i++) {
638 } else if (a[i] > b[i]) {
643 } else if (a.length == 16 && b.length == 16) {
644 for (i = 0; i < 16; i++) {
647 } else if (a[i] > b[i]) {