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.base.Preconditions;
11 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;
18 import org.apache.commons.lang3.tuple.ImmutablePair;
19 import org.apache.commons.lang3.tuple.Pair;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.AsNumberAfi;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameAfi;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameType;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ExplicitLocatorPathLcaf;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.InstanceIdType;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6Afi;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6PrefixAfi;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.KeyValueAddressLcaf;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddressFamily;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.NoAddressAfi;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathIdType;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathLcaf;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.AsNumberBuilder;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.DistinguishedNameBuilder;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6PrefixBuilder;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.MacBuilder;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.NoAddressBuilder;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePathBuilder;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.ExplicitLocatorPathBuilder;
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.Hop;
60 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;
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.HopBuilder;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.key.value.address.KeyValueAddressBuilder;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePath;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKey;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder;
66 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv4AddressBinary;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv6AddressBinary;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4BinaryAfi;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4PrefixBinaryAfi;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv6BinaryAfi;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv6PrefixBinaryAfi;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4Binary;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4BinaryBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4PrefixBinary;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4PrefixBinaryBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6Binary;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6BinaryBuilder;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6PrefixBinary;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6PrefixBinaryBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.EidBuilder;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
87 import org.slf4j.Logger;
88 import org.slf4j.LoggerFactory;
90 public final class LispAddressUtil {
91 protected static final Logger LOG = LoggerFactory.getLogger(LispAddressUtil.class);
93 public static final short STARTING_SERVICE_INDEX = 255;
94 private static final Pattern IP4_PATTERN =
95 Pattern.compile("(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])",
96 Pattern.CASE_INSENSITIVE);
97 private static final Pattern IP6_PATTERN =
98 Pattern.compile("([0-9a-f]{1,4}:){7}([0-9a-f]){1,4}", Pattern.CASE_INSENSITIVE);
100 // Utility class, should not be instantiated
101 private LispAddressUtil() {
104 public static Class<? extends LispAddressFamily> addressTypeFromSimpleAddress(SimpleAddress address) {
105 if (address.getIpAddress() != null) {
106 return binaryAddressTypeFromIpAddress(address.getIpAddress());
107 } else if (address.getIpPrefix() != null) {
108 return addressTypeFromIpPrefix(address.getIpPrefix());
109 } else if (address.getMacAddress() != null) {
111 } else if (address.getDistinguishedNameType() != null) {
112 return DistinguishedNameAfi.class;
113 } else if (address.getAsNumber() != null) {
114 return AsNumberAfi.class;
119 public static Address addressFromSimpleAddress(SimpleAddress address) {
120 if (address.getIpAddress() != null) {
121 return binaryAddressFromIpAddress(address.getIpAddress());
122 } else if (address.getIpPrefix() != null) {
123 return addressFromIpPrefix(address.getIpPrefix());
124 } else if (address.getMacAddress() != null) {
125 return addressFromMacAddress(address.getMacAddress());
126 } else if (address.getDistinguishedNameType() != null) {
127 return addressFromDistinguishedName(address.getDistinguishedNameType());
128 } else if (address.getAsNumber() != null) {
129 return addressFromAsNumber(address.getAsNumber());
134 public static Class<? extends LispAddressFamily> addressTypeFromInet(InetAddress address) {
135 if (address instanceof Inet4Address) {
136 return Ipv4Afi.class;
137 } else if (address instanceof Inet6Address) {
138 return Ipv6Afi.class;
143 public static Address addressFromInet(InetAddress address) {
144 if (address instanceof Inet4Address) {
145 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
146 .rev151105.lisp.address.address.Ipv4Builder()
147 .setIpv4(IetfInetUtil.INSTANCE.ipv4AddressFor(address)).build();
148 } else if (address instanceof Inet6Address) {
149 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
150 .rev151105.lisp.address.address.Ipv6Builder()
151 .setIpv6(IetfInetUtil.INSTANCE.ipv6AddressFor(address)).build();
156 public static Class<? extends LispAddressFamily> binaryAddressTypeFromInet(InetAddress address) {
157 if (address instanceof Inet4Address) {
158 return Ipv4BinaryAfi.class;
159 } else if (address instanceof Inet6Address) {
160 return Ipv6BinaryAfi.class;
165 public static Address binaryAddressFromInet(InetAddress address) {
166 if (address instanceof Inet4Address) {
167 return (Address) new Ipv4BinaryBuilder().setIpv4Binary(new Ipv4AddressBinary(address.getAddress())).build();
168 } else if (address instanceof Inet6Address) {
169 return (Address) new Ipv6BinaryBuilder().setIpv6Binary(new Ipv6AddressBinary(address.getAddress())).build();
174 public static Class<? extends LispAddressFamily> addressTypeFromIpAddress(IpAddress address) {
175 if (address == null) {
177 } else if (address.getIpv4Address() != null) {
178 return Ipv4Afi.class;
179 } else if (address.getIpv6Address() != null) {
180 return Ipv6Afi.class;
185 public static Class<? extends LispAddressFamily> binaryAddressTypeFromIpAddress(IpAddress address) {
186 if (address == null) {
188 } else if (address.getIpv4Address() != null) {
189 return Ipv4BinaryAfi.class;
190 } else if (address.getIpv6Address() != null) {
191 return Ipv6BinaryAfi.class;
196 public static Address addressFromIpAddress(IpAddress address) {
197 if (address == null) {
199 } else if (address.getIpv4Address() != null) {
200 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
201 .rev151105.lisp.address.address.Ipv4Builder().setIpv4(address.getIpv4Address()).build();
202 } else if (address.getIpv6Address() != null) {
203 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
204 .rev151105.lisp.address.address.Ipv6Builder().setIpv6(address.getIpv6Address()).build();
210 public static Address binaryAddressFromIpAddress(IpAddress address) {
211 if (address == null) {
213 } else if (address.getIpv4Address() != null) {
214 return (Address) new Ipv4BinaryBuilder().setIpv4Binary(new Ipv4AddressBinary(
215 InetAddresses.forString(address.getIpv4Address().getValue()).getAddress())).build();
216 } else if (address.getIpv6Address() != null) {
217 return (Address) new Ipv6BinaryBuilder().setIpv6Binary(new Ipv6AddressBinary(
218 InetAddresses.forString(address.getIpv6Address().getValue()).getAddress())).build();
223 public static Class<? extends LispAddressFamily> addressTypeFromIpPrefix(IpPrefix address) {
224 if (address == null) {
226 } else if (address.getIpv4Prefix() != null) {
227 return Ipv4PrefixAfi.class;
228 } else if (address.getIpv6Prefix() != null) {
229 return Ipv6PrefixAfi.class;
234 public static Address addressFromIpPrefix(IpPrefix address) {
235 if (address == null) {
237 } else if (address.getIpv4Prefix() != null) {
238 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
239 .rev151105.lisp.address.address.Ipv4PrefixBuilder().setIpv4Prefix(address.getIpv4Prefix()).build();
240 } else if (address.getIpv6Prefix() != null) {
241 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
242 .rev151105.lisp.address.address.Ipv6PrefixBuilder().setIpv6Prefix(address.getIpv6Prefix()).build();
247 public static Address addressFromMacAddress(MacAddress address) {
248 if (address == null) {
251 return (Address) new MacBuilder().setMac(address).build();
255 public static Address addressFromServicePath(ServicePath address) {
256 if (address == null) {
259 return (Address) new ServicePathBuilder().setServicePath(address).build();
263 public static Address addressFromDistinguishedName(DistinguishedNameType address) {
264 if (address == null) {
267 return (Address) new DistinguishedNameBuilder().setDistinguishedName(address).build();
271 public static Address addressFromAsNumber(AsNumber address) {
272 if (address == null) {
275 return (Address) new AsNumberBuilder().setAsNumber(address).build();
279 public static Rloc toRloc(SimpleAddress address) {
280 RlocBuilder builder = new RlocBuilder();
281 builder.setAddressType(addressTypeFromSimpleAddress(address));
282 builder.setVirtualNetworkId(null);
283 builder.setAddress(addressFromSimpleAddress(address));
284 return builder.build();
287 public static Rloc toRloc(InetAddress address) {
288 RlocBuilder builder = new RlocBuilder();
289 builder.setAddressType(binaryAddressTypeFromInet(address));
290 builder.setVirtualNetworkId(null);
291 builder.setAddress(binaryAddressFromInet(address));
292 return builder.build();
295 public static Rloc toRloc(Ipv4Address address) {
296 RlocBuilder builder = new RlocBuilder();
297 builder.setAddressType(Ipv4Afi.class);
298 builder.setVirtualNetworkId(null);
299 builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
300 return builder.build();
303 public static Rloc toRloc(Ipv4AddressBinary address) {
304 RlocBuilder builder = new RlocBuilder();
305 builder.setAddressType(Ipv4BinaryAfi.class);
306 builder.setVirtualNetworkId(null);
307 builder.setAddress((Address) new Ipv4BinaryBuilder().setIpv4Binary(address).build());
308 return builder.build();
311 public static Rloc toRloc(Ipv6Address address) {
312 RlocBuilder builder = new RlocBuilder();
313 builder.setAddressType(Ipv6Afi.class);
314 builder.setVirtualNetworkId(null);
315 builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
316 return builder.build();
319 public static Rloc toRloc(Ipv6AddressBinary address) {
320 RlocBuilder builder = new RlocBuilder();
321 builder.setAddressType(Ipv6BinaryAfi.class);
322 builder.setVirtualNetworkId(null);
323 builder.setAddress((Address) new Ipv6BinaryBuilder().setIpv6Binary(address).build());
324 return builder.build();
327 public static Rloc asIpv4Rloc(String address) {
328 return toRloc(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()));
331 public static Rloc asIpv6Rloc(String address) {
332 return toRloc(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()));
335 public static Eid toEid(Ipv4Prefix prefix, InstanceIdType vni) {
336 EidBuilder builder = new EidBuilder();
337 builder.setAddressType(Ipv4PrefixAfi.class);
338 builder.setVirtualNetworkId(vni);
339 builder.setAddress((Address) new Ipv4PrefixBuilder().setIpv4Prefix(prefix).build());
340 return builder.build();
343 public static Eid toEid(Ipv4PrefixBinary prefix, InstanceIdType vni) {
344 EidBuilder builder = new EidBuilder();
345 builder.setAddressType(Ipv4PrefixBinaryAfi.class);
346 builder.setVirtualNetworkId(vni);
347 builder.setAddress((Address) prefix);
348 return builder.build();
351 public static Eid toEid(Ipv6PrefixBinary prefix, InstanceIdType vni) {
352 EidBuilder builder = new EidBuilder();
353 builder.setAddressType(Ipv6PrefixBinaryAfi.class);
354 builder.setVirtualNetworkId(vni);
355 builder.setAddress((Address) prefix);
356 return builder.build();
359 public static Eid toEid(Ipv4Address address, InstanceIdType vni) {
360 EidBuilder builder = new EidBuilder();
361 builder.setAddressType(Ipv4Afi.class);
362 builder.setVirtualNetworkId(vni);
363 builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
364 return builder.build();
367 public static Eid toEid(Ipv4AddressBinary address, InstanceIdType vni) {
368 EidBuilder builder = new EidBuilder();
369 builder.setAddressType(Ipv4BinaryAfi.class);
370 builder.setVirtualNetworkId(vni);
371 builder.setAddress((Address) new Ipv4BinaryBuilder().setIpv4Binary(address).build());
372 return builder.build();
375 public static Eid toEid(IpPrefix prefix, InstanceIdType vni) {
376 EidBuilder builder = new EidBuilder();
377 builder.setAddress(addressFromIpPrefix(prefix));
378 builder.setAddressType(addressTypeFromIpPrefix(prefix));
379 builder.setVirtualNetworkId(vni);
380 return builder.build();
383 public static Eid toEid(Ipv6Address address, InstanceIdType vni) {
384 EidBuilder builder = new EidBuilder();
385 builder.setAddressType(Ipv6Afi.class);
386 builder.setVirtualNetworkId(vni);
387 builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
388 return builder.build();
391 public static Eid toEid(Ipv6AddressBinary address, InstanceIdType vni) {
392 EidBuilder builder = new EidBuilder();
393 builder.setAddressType(Ipv6BinaryAfi.class);
394 builder.setVirtualNetworkId(vni);
395 builder.setAddress((Address) new Ipv6BinaryBuilder().setIpv6Binary(address).build());
396 return builder.build();
399 public static Eid toEid(DistinguishedNameType dn, InstanceIdType vni) {
400 EidBuilder builder = new EidBuilder();
401 builder.setAddressType(DistinguishedNameAfi.class);
402 builder.setVirtualNetworkId(vni);
403 builder.setAddress((Address) new DistinguishedNameBuilder().setDistinguishedName(dn).build());
404 return builder.build();
407 public static Eid toEid(MacAddress mac, InstanceIdType vni) {
408 EidBuilder builder = new EidBuilder();
409 builder.setAddressType(MacAfi.class);
410 builder.setVirtualNetworkId(vni);
411 builder.setAddress((Address) new MacBuilder().setMac(mac).build());
412 return builder.build();
415 public static Eid toEid(Ipv6Prefix prefix, InstanceIdType vni) {
416 EidBuilder builder = new EidBuilder();
417 builder.setAddressType(Ipv6PrefixAfi.class);
418 builder.setVirtualNetworkId(vni);
419 builder.setAddress((Address) new Ipv6PrefixBuilder().setIpv6Prefix(prefix).build());
420 return builder.build();
423 // XXX getMapping rcp fails if VNI set to 0
424 public static Eid toEidNoVni(IpPrefix prefix) {
425 EidBuilder builder = new EidBuilder();
426 builder.setAddress(addressFromIpPrefix(prefix));
427 builder.setAddressType(addressTypeFromIpPrefix(prefix));
428 return builder.build();
431 public static Eid toIpPrefixEid(IpAddress addr, int vni) {
432 // If you touch this, be sure that sfclisp compiles!
433 int mask = addressTypeFromIpAddress(addr) == Ipv4Afi.class ? 32 : 128;
434 IpPrefix prefix = asIpPrefix(String.valueOf(addr.getValue()), mask);
435 // XXX getMapping rcp fails if VNI set to 0
436 return toEidNoVni(prefix);
439 public static Eid asEid(SimpleAddress address, InstanceIdType vni) {
440 EidBuilder builder = new EidBuilder();
441 builder.setAddressType(addressTypeFromSimpleAddress(address));
442 builder.setVirtualNetworkId(vni);
443 // XXX Not sure if the below actually works as expected... also, what happens to AFI?
444 builder.setAddress(addressFromSimpleAddress(address));
445 return builder.build();
448 public static Eid asIpv4PrefixEid(String prefix) {
449 return asIpv4PrefixEid(prefix, null);
452 public static Eid asIpv4PrefixEid(Ipv4Address addr, InstanceIdType vni) {
453 return toEid(new IpPrefix(IetfInetUtil.INSTANCE.ipv4PrefixFor(addr)), vni);
456 public static Eid asIpv4PrefixEid(final String prefix, final InstanceIdType iiType) {
457 return toEid(new Ipv4Prefix(prefix), iiType);
460 public static Eid asIpv4PrefixEid(Eid eid, Inet4Address address, short mask) {
461 EidBuilder builder = new EidBuilder();
462 builder.setAddressType(Ipv4PrefixAfi.class);
463 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
464 builder.setAddress(new Ipv4PrefixBuilder().setIpv4Prefix(
465 IetfInetUtil.INSTANCE.ipv4PrefixFor(address, mask)).build());
466 return builder.build();
469 public static Eid asIpv4PrefixBinaryEid(final String prefix) {
470 return asIpv4PrefixBinaryEid(prefix, null);
473 public static Eid asIpv4PrefixBinaryEid(final String prefix, final InstanceIdType iiType) {
474 String address = MaskUtil.getPrefixAddress(prefix);
475 short mask = Short.valueOf(MaskUtil.getPrefixMask(prefix));
476 byte[] ipv4 = InetAddresses.forString(address).getAddress();
477 return toEid(new Ipv4PrefixBinaryBuilder().setIpv4AddressBinary(new Ipv4AddressBinary(ipv4))
478 .setIpv4MaskLength(mask).build(), iiType);
481 public static Eid asIpv4PrefixBinaryEid(Eid eid, byte[] address, short mask) {
482 Preconditions.checkArgument(address.length == 4,
483 "asIpv4PrefixBinaryEid called with incorrect length byte array ({})", address.length);
484 EidBuilder builder = new EidBuilder();
485 builder.setAddressType(Ipv4PrefixBinaryAfi.class);
486 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
487 builder.setAddress(new Ipv4PrefixBinaryBuilder().setIpv4AddressBinary(new Ipv4AddressBinary(address))
488 .setIpv4MaskLength(mask).build());
489 return builder.build();
492 public static Eid asIpv4Eid(String address) {
493 return toEid(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()), null);
496 public static Eid asIpv4Eid(String address, long vni) {
497 return toEid(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()), new InstanceIdType(vni));
500 public static Eid asIpv6Eid(String address) {
501 return toEid(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()), null);
504 public static Eid asIpv6Eid(String address, long vni) {
505 return toEid(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()), new InstanceIdType(vni));
508 public static Eid asIpv6PrefixEid(String prefix) {
509 return toEid(new Ipv6Prefix(prefix), null);
512 public static Eid asIpv6PrefixEid(Ipv6Address addr, InstanceIdType vni) {
513 return toEid(new IpPrefix(IetfInetUtil.INSTANCE.ipv6PrefixFor(addr)), vni);
516 public static Eid asIpv6PrefixEid(Eid eid, Inet6Address address, short mask) {
517 EidBuilder builder = new EidBuilder();
518 builder.setAddressType(Ipv6PrefixAfi.class);
519 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
520 builder.setAddress(new Ipv6PrefixBuilder().setIpv6Prefix(
521 IetfInetUtil.INSTANCE.ipv6PrefixFor(address, mask)).build());
522 return builder.build();
525 public static Eid asIpv6PrefixBinaryEid(final String prefix) {
526 return asIpv6PrefixBinaryEid(prefix, null);
529 public static Eid asIpv6PrefixBinaryEid(final String prefix, final InstanceIdType iiType) {
530 String address = MaskUtil.getPrefixAddress(prefix);
531 short mask = Short.valueOf(MaskUtil.getPrefixMask(prefix));
532 byte[] ipv6 = InetAddresses.forString(address).getAddress();
533 return toEid(new Ipv6PrefixBinaryBuilder().setIpv6AddressBinary(new Ipv6AddressBinary(ipv6))
534 .setIpv6MaskLength(mask).build(), iiType);
537 public static Eid asIpv6PrefixBinaryEid(Eid eid, byte[] address, short mask) {
538 Preconditions.checkArgument(address.length == 16,
539 "asIpv6PrefixBinaryEid called with incorrect length byte array ({})", address.length);
540 EidBuilder builder = new EidBuilder();
541 builder.setAddressType(Ipv6PrefixBinaryAfi.class);
542 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
543 builder.setAddress(new Ipv6PrefixBinaryBuilder().setIpv6AddressBinary(new Ipv6AddressBinary(address))
544 .setIpv6MaskLength(mask).build());
545 return builder.build();
548 public static Eid asBinaryEid(SimpleAddress address, InstanceIdType iid) {
549 if (address.getIpPrefix() != null) {
550 if (address.getIpPrefix().getIpv4Prefix() != null) {
551 return LispAddressUtil.asIpv4PrefixBinaryEid(address.getIpPrefix().getIpv4Prefix().getValue(), iid);
552 } else if (address.getIpPrefix().getIpv6Prefix() != null) {
553 return LispAddressUtil.asIpv6PrefixBinaryEid(address.getIpPrefix().getIpv6Prefix().getValue(), iid);
555 } else if (address.getIpAddress() != null) {
556 if (address.getIpAddress().getIpv4Address() != null) {
557 LispAddressUtil.toEid(new Ipv4AddressBinary(InetAddresses.forString(
558 address.getIpAddress().getIpv4Address().getValue()).getAddress()), iid);
559 } else if (address.getIpAddress().getIpv6Address() != null) {
560 LispAddressUtil.toEid(new Ipv6AddressBinary(InetAddresses.forString(
561 address.getIpAddress().getIpv6Address().getValue()).getAddress()), iid);
564 return LispAddressUtil.asEid(address, iid);
567 public static int ipVersionFromString(String ip) {
568 if (IP4_PATTERN.matcher(ip).matches()) {
570 } else if (IP6_PATTERN.matcher(ip).matches()) {
577 public static IpPrefix asIpPrefix(String addr, int mask) {
578 int version = ipVersionFromString(addr);
579 if (version == 4 && (mask >= 0 && mask <= 32)) {
580 return new IpPrefix(new Ipv4Prefix(addr + "/" + mask));
581 } else if (version == 6 && (mask >= 0 && mask <= 128)) {
582 return new IpPrefix(new Ipv6Prefix(addr + "/" + mask));
588 public static Eid asServicePathEid(long vni, long servicePathId, short serviceIndex) {
589 EidBuilder eb = new EidBuilder();
590 eb.setAddressType(ServicePathLcaf.class);
592 eb.setVirtualNetworkId(new InstanceIdType(vni));
594 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
595 .lisp.address.address.service.path.ServicePathBuilder spb =
596 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
597 .lisp.address.address.service.path.ServicePathBuilder();
598 spb.setServicePathId(new ServicePathIdType(servicePathId));
599 spb.setServiceIndex(serviceIndex);
600 return eb.setAddress(addressFromServicePath(spb.build())).build();
603 public static Eid asMacEid(String address, long vni) {
604 return toEid(new MacAddress(address), new InstanceIdType(vni));
607 public static Eid asMacEid(String address) {
608 return toEid(new MacAddress(address), null);
611 public static Eid asDistinguishedNameEid(String address, long vni) {
612 return toEid(new MacAddress(address), new InstanceIdType(vni));
615 public static Eid asDistinguishedNameEid(String address) {
616 return toEid(new DistinguishedNameType(address), null);
619 public static Eid asKeyValueAddressEid(SimpleAddress key, SimpleAddress value) {
620 KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
622 kvab.setValue(value);
623 KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
624 .rev151105.lisp.address.address.KeyValueAddressBuilder()
625 .setKeyValueAddress(kvab.build()).build();
626 EidBuilder builder = new EidBuilder();
627 builder.setAddressType(KeyValueAddressLcaf.class);
628 builder.setVirtualNetworkId(null);
629 builder.setAddress((Address) address);
630 return builder.build();
633 public static Rloc asKeyValueAddressRloc(SimpleAddress key, SimpleAddress value) {
634 KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
636 kvab.setValue(value);
637 KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
638 .rev151105.lisp.address.address.KeyValueAddressBuilder()
639 .setKeyValueAddress(kvab.build()).build();
640 RlocBuilder builder = new RlocBuilder();
641 builder.setAddressType(KeyValueAddressLcaf.class);
642 builder.setVirtualNetworkId(null);
643 builder.setAddress((Address) address);
644 return builder.build();
647 public static Rloc asKeyValueAddress(String key, SimpleAddress value) {
648 return asKeyValueAddressRloc(new SimpleAddress(new DistinguishedNameType(key)), value);
651 public static SourceDestKey asSrcDst(String src, String dst, int smask, int dmask) {
652 SourceDestKeyBuilder builder = new SourceDestKeyBuilder();
653 builder.setSource(new SimpleAddress(asIpPrefix(src, smask)));
654 builder.setDest(new SimpleAddress(asIpPrefix(dst, dmask)));
655 return builder.build();
658 public static Eid asSrcDstEid(String src, String dst, int smask, int dmask, int vni) {
659 EidBuilder builder = new EidBuilder();
660 builder.setAddressType(SourceDestKeyLcaf.class);
661 builder.setVirtualNetworkId(new InstanceIdType(Long.valueOf(vni)));
663 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
664 .lisp.address.address.SourceDestKeyBuilder()
665 .setSourceDestKey(asSrcDst(src, dst, smask, dmask)).build());
667 return builder.build();
670 public static Eid asSrcDstEid(SourceDestKey sd, InstanceIdType vni) {
671 EidBuilder builder = new EidBuilder();
672 builder.setAddressType(SourceDestKeyLcaf.class);
673 builder.setVirtualNetworkId(vni);
674 builder.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
675 .rev151105.lisp.address.address.SourceDestKeyBuilder().setSourceDestKey(sd).build());
676 return builder.build();
679 public static Rloc asTeLcafRloc(List<IpAddress> hopList) {
680 ExplicitLocatorPathBuilder teAddrBuilder = new ExplicitLocatorPathBuilder();
681 teAddrBuilder.setHop(new ArrayList<Hop>());
682 for (IpAddress hop : hopList) {
683 HopBuilder hopBuilder = new HopBuilder();
684 hopBuilder.setAddress(new SimpleAddress(hop));
685 hopBuilder.setHopId("Hop " + teAddrBuilder.getHop().size());
686 hopBuilder.setLrsBits(new LrsBits(false, false, false));
687 teAddrBuilder.getHop().add(hopBuilder.build());
690 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
691 .lisp.address.address.ExplicitLocatorPathBuilder elpBuilder =
692 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
693 .lisp.address.address.ExplicitLocatorPathBuilder();
694 elpBuilder.setExplicitLocatorPath(teAddrBuilder.build());
696 RlocBuilder teBuilder = new RlocBuilder();
697 teBuilder.setAddress(elpBuilder.build());
698 teBuilder.setAddressType(ExplicitLocatorPathLcaf.class);
699 return teBuilder.build();
702 public static List<LocatorRecord> asLocatorRecords(List<Rloc> locators) {
703 List<LocatorRecord> locatorRecords = new ArrayList<LocatorRecord>();
704 for (Rloc locator : locators) {
705 LocatorRecordBuilder locatorBuilder = new LocatorRecordBuilder();
706 locatorBuilder.setLocalLocator(false).setRlocProbed(false).setWeight((short) 1).setPriority((short) 1)
707 .setMulticastWeight((short) 1).setMulticastPriority((short) 1).setRouted(true)
708 .setRloc(locator).setLocatorId("SFC_LISP").build();
709 locatorRecords.add(locatorBuilder.build());
711 return locatorRecords;
714 public static Eid getNoAddressEid() {
715 EidBuilder builder = new EidBuilder();
716 builder.setAddressType(NoAddressAfi.class);
717 builder.setVirtualNetworkId(null);
718 builder.setAddress(new NoAddressBuilder().setNoAddress(true).build());
719 return builder.build();
722 public static byte[] ipAddressToByteArray(Address addr) {
723 if (addr instanceof Ipv4) {
724 return InetAddresses.forString(((Ipv4) addr).getIpv4().getValue()).getAddress();
725 } else if (addr instanceof Ipv6) {
726 return InetAddresses.forString(((Ipv6) addr).getIpv6().getValue()).getAddress();
727 } else if (addr instanceof Ipv4Binary) {
728 return ((Ipv4Binary) addr).getIpv4Binary().getValue();
729 } else if (addr instanceof Ipv6Binary) {
730 return ((Ipv6Binary) addr).getIpv6Binary().getValue();
736 private static Ipv4PrefixBinary convertToBinary(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
737 .lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix prefix) {
738 Ipv4PrefixBinaryBuilder pb = new Ipv4PrefixBinaryBuilder();
739 byte[] address = InetAddresses.forString(MaskUtil.getAddressStringForIpv4Prefix(prefix)).getAddress();
740 pb.setIpv4AddressBinary(new Ipv4AddressBinary(address));
741 pb.setIpv4MaskLength(MaskUtil.getMaskForAddress(prefix));
745 private static Ipv6PrefixBinary convertToBinary(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
746 .lisp.address.types.rev151105.lisp.address.address.Ipv6Prefix prefix) {
747 Ipv6PrefixBinaryBuilder pb = new Ipv6PrefixBinaryBuilder();
748 byte[] address = InetAddresses.forString(MaskUtil.getAddressStringForIpv6Prefix(prefix)).getAddress();
749 pb.setIpv6AddressBinary(new Ipv6AddressBinary(address));
750 pb.setIpv6MaskLength(MaskUtil.getMaskForAddress(prefix));
754 private static Ipv4Binary convertToBinary(Ipv4 address) {
755 byte[] addr = InetAddresses.forString(address.getIpv4().getValue()).getAddress();
756 return new Ipv4BinaryBuilder().setIpv4Binary(new Ipv4AddressBinary(addr)).build();
759 private static Ipv6Binary convertToBinary(Ipv6 address) {
760 byte[] addr = InetAddresses.forString(address.getIpv6().getValue()).getAddress();
761 return new Ipv6BinaryBuilder().setIpv6Binary(new Ipv6AddressBinary(addr)).build();
764 private static Pair<Class<? extends LispAddressFamily>, Address> convertToBinary(Address addr) {
765 Address convAddr = null;
766 Class<? extends LispAddressFamily> convType = null;
767 if (addr instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
768 .lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix) {
769 convAddr = convertToBinary((org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
770 .lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix) addr);
771 convType = Ipv4PrefixBinaryAfi.class;
772 } else if (addr instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
773 .lisp.address.types.rev151105.lisp.address.address.Ipv6Prefix) {
774 convAddr = convertToBinary((org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
775 .lisp.address.types.rev151105.lisp.address.address.Ipv6Prefix) addr);
776 convType = Ipv6PrefixBinaryAfi.class;
777 } else if (addr instanceof Ipv4) {
778 convAddr = convertToBinary((Ipv4) addr);
779 convType = Ipv4BinaryAfi.class;
780 } else if (addr instanceof Ipv6) {
781 convAddr = convertToBinary((Ipv6) addr);
782 convType = Ipv6BinaryAfi.class;
784 return new ImmutablePair<Class<? extends LispAddressFamily>, Address>(convType, convAddr);
787 public static Eid convertToBinary(Eid eid) {
788 Pair<Class<? extends LispAddressFamily>, Address> converted = convertToBinary(eid.getAddress());
789 if (converted.getRight() == null) {
792 EidBuilder eb = new EidBuilder(eid);
793 eb.setAddressType(converted.getLeft());
794 eb.setAddress(converted.getRight());
798 public static Rloc convertToBinary(Rloc rloc) {
799 Pair<Class<? extends LispAddressFamily>, Address> converted = convertToBinary(rloc.getAddress());
800 if (converted.getRight() == null) {
803 RlocBuilder rb = new RlocBuilder(rloc);
804 rb.setAddressType(converted.getLeft());
805 rb.setAddress(converted.getRight());
809 private static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
810 .lisp.address.address.Ipv4Prefix convertFromBinary(Ipv4PrefixBinary prefix) {
811 return new Ipv4PrefixBuilder().setIpv4Prefix(IetfInetUtil.INSTANCE.ipv4PrefixFor(
812 prefix.getIpv4AddressBinary().getValue(),
813 prefix.getIpv4MaskLength())).build();
816 private static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
817 .lisp.address.address.Ipv6Prefix convertFromBinary(Ipv6PrefixBinary prefix) {
818 return new Ipv6PrefixBuilder().setIpv6Prefix(IetfInetUtil.INSTANCE.ipv6PrefixFor(
819 prefix.getIpv6AddressBinary().getValue(),
820 prefix.getIpv6MaskLength())).build();
823 private static Ipv4 convertFromBinary(Ipv4Binary address) {
824 return new Ipv4Builder().setIpv4(IetfInetUtil.INSTANCE.ipv4AddressFor(address.getIpv4Binary().getValue()))
828 private static Ipv6 convertFromBinary(Ipv6Binary address) {
829 return new Ipv6Builder().setIpv6(IetfInetUtil.INSTANCE.ipv6AddressFor(address.getIpv6Binary().getValue()))
833 private static Pair<Class<? extends LispAddressFamily>, Address> convertFromBinary(Address addr) {
834 Address convAddr = null;
835 Class<? extends LispAddressFamily> convType = null;
836 if (addr instanceof Ipv4PrefixBinary) {
837 convAddr = convertFromBinary((Ipv4PrefixBinary) addr);
838 convType = Ipv4PrefixAfi.class;
839 } else if (addr instanceof Ipv6PrefixBinary) {
840 convAddr = convertFromBinary((Ipv6PrefixBinary) addr);
841 convType = Ipv6PrefixAfi.class;
842 } else if (addr instanceof Ipv4Binary) {
843 convAddr = convertFromBinary((Ipv4Binary) addr);
844 convType = Ipv4Afi.class;
845 } else if (addr instanceof Ipv6Binary) {
846 convAddr = convertFromBinary((Ipv6Binary) addr);
847 convType = Ipv6Afi.class;
849 return new ImmutablePair<Class<? extends LispAddressFamily>, Address>(convType, convAddr);
852 public static Eid convertFromBinary(Eid eid) {
853 Pair<Class<? extends LispAddressFamily>, Address> converted = convertFromBinary(eid.getAddress());
854 if (converted.getRight() == null) {
857 EidBuilder eb = new EidBuilder(eid);
858 eb.setAddressType(converted.getLeft());
859 eb.setAddress(converted.getRight());
863 public static Rloc convertFromBinary(Rloc rloc) {
864 Pair<Class<? extends LispAddressFamily>, Address> converted = convertFromBinary(rloc.getAddress());
865 if (converted.getRight() == null) {
868 RlocBuilder rb = new RlocBuilder(rloc);
869 rb.setAddressType(converted.getLeft());
870 rb.setAddress(converted.getRight());
874 public static boolean addressNeedsConversionToBinary(Address address) {
875 if (address instanceof Ipv4 || address instanceof Ipv6
876 || address instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
877 .lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix
878 || address instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
879 .lisp.address.types.rev151105.lisp.address.address.Ipv6Prefix) {
885 public static boolean addressNeedsConversionFromBinary(Address address) {
886 if (address instanceof Ipv4Binary || address instanceof Ipv6Binary
887 || address instanceof Ipv4PrefixBinary || address instanceof Ipv6PrefixBinary) {
893 public static int compareIpAddressByteArrays(byte[] one, byte[] two) {
894 if (one.length < two.length) {
896 } else if (one.length > two.length) {
898 } else if (one.length == 4 && two.length == 4) {
899 for (int i = 0; i < 4; i++) {
900 if (one[i] < two[i]) {
902 } else if (one[i] > two[i]) {
907 } else if (one.length == 16 && two.length == 16) {
908 for (int i = 0; i < 16; i++) {
909 if (one[i] < two[i]) {
911 } else if (one[i] > two[i]) {
920 public static short getIpPrefixMask(Eid eid) {
921 Address addr = eid.getAddress();
922 if (addr instanceof Ipv4PrefixBinary) {
923 return ((Ipv4PrefixBinary) addr).getIpv4MaskLength();
924 } else if (addr instanceof Ipv6PrefixBinary) {
925 return ((Ipv6PrefixBinary) addr).getIpv6MaskLength();