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;
13 import java.net.Inet4Address;
14 import java.net.Inet6Address;
15 import java.net.InetAddress;
16 import java.util.ArrayList;
17 import java.util.List;
18 import java.util.regex.Pattern;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.AsNumberAfi;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameAfi;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameType;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ExplicitLocatorPathLcaf;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.InstanceIdType;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6Afi;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6PrefixAfi;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.KeyValueAddressLcaf;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddressFamily;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.NoAddressAfi;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathIdType;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathLcaf;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.AsNumberBuilder;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.DistinguishedNameBuilder;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6PrefixBuilder;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.MacBuilder;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.NoAddressBuilder;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePathBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv4AddressBinary;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv6AddressBinary;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4BinaryAfi;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4PrefixBinaryAfi;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv6BinaryAfi;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv6PrefixBinaryAfi;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4Binary;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4BinaryBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4PrefixBinary;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4PrefixBinaryBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6Binary;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6BinaryBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6PrefixBinary;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6PrefixBinaryBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.EidBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
77 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.key.value.address.KeyValueAddressBuilder;
78 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePath;
79 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKey;
80 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder;
81 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
82 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.ExplicitLocatorPathBuilder;
83 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;
84 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;
85 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;
86 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IetfInetUtil;
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> addressTypeFromIpAddress(IpAddress address) {
157 if (address == null) {
159 } else if (address.getIpv4Address() != null) {
160 return Ipv4Afi.class;
161 } else if (address.getIpv6Address() != null) {
162 return Ipv6Afi.class;
167 public static Class<? extends LispAddressFamily> binaryAddressTypeFromIpAddress(IpAddress address) {
168 if (address == null) {
170 } else if (address.getIpv4Address() != null) {
171 return Ipv4BinaryAfi.class;
172 } else if (address.getIpv6Address() != null) {
173 return Ipv6BinaryAfi.class;
178 public static Address addressFromIpAddress(IpAddress address) {
179 if (address == null) {
181 } else if (address.getIpv4Address() != null) {
182 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
183 .rev151105.lisp.address.address.Ipv4Builder().setIpv4(address.getIpv4Address()).build();
184 } else if (address.getIpv6Address() != null) {
185 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
186 .rev151105.lisp.address.address.Ipv6Builder().setIpv6(address.getIpv6Address()).build();
192 public static Address binaryAddressFromIpAddress(IpAddress address) {
193 if (address == null) {
195 } else if (address.getIpv4Address() != null) {
196 return (Address) new Ipv4BinaryBuilder().setIpv4Binary(new Ipv4AddressBinary(
197 InetAddresses.forString(address.getIpv4Address().getValue()).getAddress())).build();
198 } else if (address.getIpv6Address() != null) {
199 return (Address) new Ipv6BinaryBuilder().setIpv6Binary(new Ipv6AddressBinary(
200 InetAddresses.forString(address.getIpv6Address().getValue()).getAddress())).build();
205 public static Class<? extends LispAddressFamily> addressTypeFromIpPrefix(IpPrefix address) {
206 if (address == null) {
208 } else if (address.getIpv4Prefix() != null) {
209 return Ipv4PrefixAfi.class;
210 } else if (address.getIpv6Prefix() != null) {
211 return Ipv6PrefixAfi.class;
216 public static Address addressFromIpPrefix(IpPrefix address) {
217 if (address == null) {
219 } else if (address.getIpv4Prefix() != null) {
220 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
221 .rev151105.lisp.address.address.Ipv4PrefixBuilder().setIpv4Prefix(address.getIpv4Prefix()).build();
222 } else if (address.getIpv6Prefix() != null) {
223 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
224 .rev151105.lisp.address.address.Ipv6PrefixBuilder().setIpv6Prefix(address.getIpv6Prefix()).build();
229 public static Address addressFromMacAddress(MacAddress address) {
230 if (address == null) {
233 return (Address) new MacBuilder().setMac(address).build();
237 public static Address addressFromServicePath(ServicePath address) {
238 if (address == null) {
241 return (Address) new ServicePathBuilder().setServicePath(address).build();
245 public static Address addressFromDistinguishedName(DistinguishedNameType address) {
246 if (address == null) {
249 return (Address) new DistinguishedNameBuilder().setDistinguishedName(address).build();
253 public static Address addressFromAsNumber(AsNumber address) {
254 if (address == null) {
257 return (Address) new AsNumberBuilder().setAsNumber(address).build();
260 public static Rloc toRloc(SimpleAddress address) {
261 RlocBuilder builder = new RlocBuilder();
262 builder.setAddressType(addressTypeFromSimpleAddress(address));
263 builder.setVirtualNetworkId(null);
264 builder.setAddress(addressFromSimpleAddress(address));
265 return builder.build();
268 public static Rloc toRloc(InetAddress address) {
269 RlocBuilder builder = new RlocBuilder();
270 builder.setAddressType(addressTypeFromInet(address));
271 builder.setVirtualNetworkId(null);
272 builder.setAddress(addressFromInet(address));
273 return builder.build();
276 public static Rloc toRloc(Ipv4Address address) {
277 RlocBuilder builder = new RlocBuilder();
278 builder.setAddressType(Ipv4Afi.class);
279 builder.setVirtualNetworkId(null);
280 builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
281 return builder.build();
284 public static Rloc toRloc(Ipv4AddressBinary address) {
285 RlocBuilder builder = new RlocBuilder();
286 builder.setAddressType(Ipv4BinaryAfi.class);
287 builder.setVirtualNetworkId(null);
288 builder.setAddress((Address) new Ipv4BinaryBuilder().setIpv4Binary(address).build());
289 return builder.build();
292 public static Rloc toRloc(Ipv6Address address) {
293 RlocBuilder builder = new RlocBuilder();
294 builder.setAddressType(Ipv6Afi.class);
295 builder.setVirtualNetworkId(null);
296 builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
297 return builder.build();
300 public static Rloc toRloc(Ipv6AddressBinary address) {
301 RlocBuilder builder = new RlocBuilder();
302 builder.setAddressType(Ipv6BinaryAfi.class);
303 builder.setVirtualNetworkId(null);
304 builder.setAddress((Address) new Ipv6BinaryBuilder().setIpv6Binary(address).build());
305 return builder.build();
308 public static Rloc asIpv4Rloc(String address) {
309 return toRloc(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()));
312 public static Rloc asIpv6Rloc(String address) {
313 return toRloc(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()));
316 public static Eid toEid(Ipv4Prefix prefix, InstanceIdType vni) {
317 EidBuilder builder = new EidBuilder();
318 builder.setAddressType(Ipv4PrefixAfi.class);
319 builder.setVirtualNetworkId(vni);
320 builder.setAddress((Address) new Ipv4PrefixBuilder().setIpv4Prefix(prefix).build());
321 return builder.build();
324 public static Eid toEid(Ipv4PrefixBinary prefix, InstanceIdType vni) {
325 EidBuilder builder = new EidBuilder();
326 builder.setAddressType(Ipv4PrefixBinaryAfi.class);
327 builder.setVirtualNetworkId(vni);
328 builder.setAddress((Address) prefix);
329 return builder.build();
332 public static Eid toEid(Ipv6PrefixBinary prefix, InstanceIdType vni) {
333 EidBuilder builder = new EidBuilder();
334 builder.setAddressType(Ipv6PrefixBinaryAfi.class);
335 builder.setVirtualNetworkId(vni);
336 builder.setAddress((Address) prefix);
337 return builder.build();
340 public static Eid toEid(Ipv4Address address, InstanceIdType vni) {
341 EidBuilder builder = new EidBuilder();
342 builder.setAddressType(Ipv4Afi.class);
343 builder.setVirtualNetworkId(vni);
344 builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
345 return builder.build();
348 public static Eid toEid(Ipv4AddressBinary address, InstanceIdType vni) {
349 EidBuilder builder = new EidBuilder();
350 builder.setAddressType(Ipv4BinaryAfi.class);
351 builder.setVirtualNetworkId(vni);
352 builder.setAddress((Address) new Ipv4BinaryBuilder().setIpv4Binary(address).build());
353 return builder.build();
356 // XXX getMapping rcp fails if VNI set to 0
357 public static Eid toEidNoVni(IpPrefix prefix) {
358 EidBuilder builder = new EidBuilder();
359 builder.setAddress(addressFromIpPrefix(prefix));
360 builder.setAddressType(addressTypeFromIpPrefix(prefix));
361 return builder.build();
364 public static Eid toEid(IpPrefix prefix, InstanceIdType vni) {
365 EidBuilder builder = new EidBuilder();
366 builder.setAddress(addressFromIpPrefix(prefix));
367 builder.setAddressType(addressTypeFromIpPrefix(prefix));
368 builder.setVirtualNetworkId(vni);
369 return builder.build();
372 public static Eid toIpPrefixEid(IpAddress addr, int vni) {
373 // If you touch this, be sure that sfclisp compiles!
374 int mask = addressTypeFromIpAddress(addr) == Ipv4Afi.class ? 32 : 128;
375 IpPrefix prefix = asIpPrefix(String.valueOf(addr.getValue()), mask);
376 // XXX getMapping rcp fails if VNI set to 0
377 return toEidNoVni(prefix);
380 public static Eid asEid(SimpleAddress address, InstanceIdType vni) {
381 EidBuilder builder = new EidBuilder();
382 builder.setAddressType(addressTypeFromSimpleAddress(address));
383 builder.setVirtualNetworkId(vni);
384 // XXX Not sure if the below actually works as expected... also, what happens to AFI?
385 builder.setAddress(addressFromSimpleAddress(address));
386 return builder.build();
389 public static Eid asIpv4PrefixEid(String prefix) {
390 return asIpv4PrefixEid(prefix, null);
393 public static Eid asIpv4PrefixEid(final String prefix, final InstanceIdType iiType) {
394 return toEid(new Ipv4Prefix(prefix), iiType);
397 public static Eid asIpv4PrefixBinaryEid(final String prefix) {
398 return asIpv4PrefixBinaryEid(prefix, null);
401 public static Eid asIpv4PrefixBinaryEid(final String prefix, final InstanceIdType iiType) {
402 String address = MaskUtil.getPrefixAddress(prefix);
403 short mask = Short.valueOf(MaskUtil.getPrefixMask(prefix));
404 byte[] ipv4 = InetAddresses.forString(address).getAddress();
405 return toEid(new Ipv4PrefixBinaryBuilder().setIpv4AddressBinary(new Ipv4AddressBinary(ipv4))
406 .setIpv4MaskLength(mask).build(), iiType);
409 public static Eid asIpv4Eid(String address) {
410 return toEid(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()), null);
413 public static Eid toEid(Ipv6Prefix prefix, InstanceIdType vni) {
414 EidBuilder builder = new EidBuilder();
415 builder.setAddressType(Ipv6PrefixAfi.class);
416 builder.setVirtualNetworkId(vni);
417 builder.setAddress((Address) new Ipv6PrefixBuilder().setIpv6Prefix(prefix).build());
418 return builder.build();
421 public static Eid toEid(Ipv6Address address, InstanceIdType vni) {
422 EidBuilder builder = new EidBuilder();
423 builder.setAddressType(Ipv6Afi.class);
424 builder.setVirtualNetworkId(vni);
425 builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
426 return builder.build();
429 public static Eid toEid(Ipv6AddressBinary address, InstanceIdType vni) {
430 EidBuilder builder = new EidBuilder();
431 builder.setAddressType(Ipv6BinaryAfi.class);
432 builder.setVirtualNetworkId(vni);
433 builder.setAddress((Address) new Ipv6BinaryBuilder().setIpv6Binary(address).build());
434 return builder.build();
437 public static Eid asIpv6Eid(String address, long vni) {
438 return toEid(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()), new InstanceIdType(vni));
441 public static Eid asIpv6PrefixEid(String prefix) {
442 return toEid(new Ipv6Prefix(prefix), null);
445 public static Eid asIpv6Eid(String address) {
446 return toEid(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()), null);
449 public static Eid asIpv6PrefixBinaryEid(final String prefix) {
450 return asIpv6PrefixBinaryEid(prefix, null);
453 public static Eid asIpv6PrefixBinaryEid(final String prefix, final InstanceIdType iiType) {
454 String address = MaskUtil.getPrefixAddress(prefix);
455 short mask = Short.valueOf(MaskUtil.getPrefixMask(prefix));
456 byte[] ipv6 = InetAddresses.forString(address).getAddress();
457 return toEid(new Ipv6PrefixBinaryBuilder().setIpv6AddressBinary(new Ipv6AddressBinary(ipv6))
458 .setIpv6MaskLength(mask).build(), iiType);
461 public static Eid asIpv4Eid(String address, long vni) {
462 return toEid(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()), new InstanceIdType(vni));
465 public static int ipVersionFromString(String ip) {
466 if (IP4_PATTERN.matcher(ip).matches()) {
468 } else if (IP6_PATTERN.matcher(ip).matches()) {
475 public static IpPrefix asIpPrefix(String addr, int mask) {
476 int version = ipVersionFromString(addr);
477 if (version == 4 && (mask >= 0 && mask <= 32)) {
478 return new IpPrefix(new Ipv4Prefix(addr + "/" + mask));
479 } else if (version == 6 && (mask >=0 && mask <= 128)) {
480 return new IpPrefix(new Ipv6Prefix(addr + "/" + mask));
486 public static Eid asIpv4PrefixEid(Ipv4Address addr, InstanceIdType vni) {
487 return toEid(new IpPrefix(IetfInetUtil.INSTANCE.ipv4PrefixFor(addr)), vni);
490 public static Eid asIpv6PrefixEid(Ipv6Address addr, InstanceIdType vni) {
491 return toEid(new IpPrefix(IetfInetUtil.INSTANCE.ipv6PrefixFor(addr)), vni);
494 public static Eid asIpv4PrefixEid(Eid eid, Inet4Address address, short mask) {
495 EidBuilder builder = new EidBuilder();
496 builder.setAddressType(eid.getAddressType());
497 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
498 builder.setAddress(new Ipv4PrefixBuilder().setIpv4Prefix(
499 IetfInetUtil.INSTANCE.ipv4PrefixFor(address, mask)).build());
500 return builder.build();
503 public static Eid asIpv6PrefixEid(Eid eid, Inet6Address address, short mask) {
504 EidBuilder builder = new EidBuilder();
505 builder.setAddressType(eid.getAddressType());
506 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
507 builder.setAddress(new Ipv6PrefixBuilder().setIpv6Prefix(
508 IetfInetUtil.INSTANCE.ipv6PrefixFor(address, mask)).build());
509 return builder.build();
512 public static Eid asIpv4PrefixBinaryEid(Eid eid, byte[] address, short mask) {
513 Preconditions.checkArgument(address.length == 4,
514 "asIpv4PrefixBinaryEid called with incorrect length byte array ({})", address.length);
515 EidBuilder builder = new EidBuilder();
516 builder.setAddressType(Ipv4PrefixBinaryAfi.class);
517 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
518 builder.setAddress(new Ipv4PrefixBinaryBuilder().setIpv4AddressBinary(new Ipv4AddressBinary(address))
519 .setIpv4MaskLength(mask).build());
520 return builder.build();
523 public static Eid asIpv6PrefixBinaryEid(Eid eid, byte[] address, short mask) {
524 Preconditions.checkArgument(address.length == 16,
525 "asIpv6PrefixBinaryEid called with incorrect length byte array ({})", address.length);
526 EidBuilder builder = new EidBuilder();
527 builder.setAddressType(Ipv6PrefixBinaryAfi.class);
528 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
529 builder.setAddress(new Ipv6PrefixBinaryBuilder().setIpv6AddressBinary(new Ipv6AddressBinary(address))
530 .setIpv6MaskLength(mask).build());
531 return builder.build();
534 public static Eid asServicePathEid(long vni, long servicePathId, short serviceIndex) {
535 EidBuilder eb = new EidBuilder();
536 eb.setAddressType(ServicePathLcaf.class);
538 eb.setVirtualNetworkId(new InstanceIdType(vni));
540 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
541 .lisp.address.address.service.path.ServicePathBuilder spb =
542 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
543 .lisp.address.address.service.path.ServicePathBuilder();
544 spb.setServicePathId(new ServicePathIdType(servicePathId));
545 spb.setServiceIndex(serviceIndex);
546 return eb.setAddress(addressFromServicePath(spb.build())).build();
549 public static Eid toEid(MacAddress mac, InstanceIdType vni) {
550 EidBuilder builder = new EidBuilder();
551 builder.setAddressType(MacAfi.class);
552 builder.setVirtualNetworkId(vni);
553 builder.setAddress((Address) new MacBuilder().setMac(mac).build());
554 return builder.build();
557 public static Eid asMacEid(String address, long vni) {
558 return toEid(new MacAddress(address), new InstanceIdType(vni));
561 public static Eid asMacEid(String address) {
562 return toEid(new MacAddress(address), null);
565 public static Eid toEid(DistinguishedNameType dn, InstanceIdType vni) {
566 EidBuilder builder = new EidBuilder();
567 builder.setAddressType(DistinguishedNameAfi.class);
568 builder.setVirtualNetworkId(vni);
569 builder.setAddress((Address) new DistinguishedNameBuilder().setDistinguishedName(dn).build());
570 return builder.build();
573 public static Eid asDistinguishedNameEid(String address, long vni) {
574 return toEid(new MacAddress(address), new InstanceIdType(vni));
577 public static Eid asDistinguishedNameEid(String address) {
578 return toEid(new DistinguishedNameType(address), null);
581 public static Eid asKeyValueAddressEid(SimpleAddress key, SimpleAddress value) {
582 KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
584 kvab.setValue(value);
585 KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
586 .rev151105.lisp.address.address.KeyValueAddressBuilder()
587 .setKeyValueAddress(kvab.build()).build();
588 EidBuilder builder = new EidBuilder();
589 builder.setAddressType(KeyValueAddressLcaf.class);
590 builder.setVirtualNetworkId(null);
591 builder.setAddress((Address) address);
592 return builder.build();
595 public static Rloc asKeyValueAddressRloc(SimpleAddress key, SimpleAddress value) {
596 KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
598 kvab.setValue(value);
599 KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
600 .rev151105.lisp.address.address.KeyValueAddressBuilder()
601 .setKeyValueAddress(kvab.build()).build();
602 RlocBuilder builder = new RlocBuilder();
603 builder.setAddressType(KeyValueAddressLcaf.class);
604 builder.setVirtualNetworkId(null);
605 builder.setAddress((Address) address);
606 return builder.build();
609 public static Rloc asKeyValueAddress(String key, SimpleAddress value) {
610 return asKeyValueAddressRloc(new SimpleAddress(new DistinguishedNameType(key)), value);
613 public static SourceDestKey asSrcDst(String src, String dst, int smask, int dmask) {
614 SourceDestKeyBuilder builder = new SourceDestKeyBuilder();
615 builder.setSource(new SimpleAddress(asIpPrefix(src, smask)));
616 builder.setDest(new SimpleAddress(asIpPrefix(dst, dmask)));
617 return builder.build();
620 public static Eid asSrcDstEid(String src, String dst, int smask, int dmask, int vni) {
621 EidBuilder builder = new EidBuilder();
622 builder.setAddressType(SourceDestKeyLcaf.class);
623 builder.setVirtualNetworkId(new InstanceIdType(Long.valueOf(vni)));
625 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
626 .lisp.address.address.SourceDestKeyBuilder()
627 .setSourceDestKey(asSrcDst(src, dst, smask, dmask)).build());
629 return builder.build();
632 public static Eid asSrcDstEid(SourceDestKey sd, InstanceIdType vni) {
633 EidBuilder builder = new EidBuilder();
634 builder.setAddressType(SourceDestKeyLcaf.class);
635 builder.setVirtualNetworkId(vni);
636 builder.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
637 .rev151105.lisp.address.address.SourceDestKeyBuilder().setSourceDestKey(sd).build());
638 return builder.build();
641 public static Rloc asTeLcafRloc(List<IpAddress> hopList) {
642 RlocBuilder teBuilder = new RlocBuilder();
643 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
644 .lisp.address.address.ExplicitLocatorPathBuilder elpBuilder =
645 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
646 .lisp.address.address.ExplicitLocatorPathBuilder();
647 ExplicitLocatorPathBuilder teAddrBuilder = new ExplicitLocatorPathBuilder();
648 teAddrBuilder.setHop(new ArrayList<Hop>());
649 for (IpAddress hop : hopList) {
650 HopBuilder hopBuilder = new HopBuilder();
651 hopBuilder.setAddress(new SimpleAddress(hop));
652 hopBuilder.setHopId("Hop " + teAddrBuilder.getHop().size());
653 hopBuilder.setLrsBits(new LrsBits(false, false, false));
654 teAddrBuilder.getHop().add(hopBuilder.build());
657 elpBuilder.setExplicitLocatorPath(teAddrBuilder.build());
658 teBuilder.setAddress(elpBuilder.build());
659 teBuilder.setAddressType(ExplicitLocatorPathLcaf.class);
660 return teBuilder.build();
663 public static List<LocatorRecord> asLocatorRecords(List<Rloc> locators) {
664 List<LocatorRecord> locatorRecords = new ArrayList<LocatorRecord>();
665 for (Rloc locator : locators) {
666 LocatorRecordBuilder locatorBuilder = new LocatorRecordBuilder();
667 locatorBuilder.setLocalLocator(false).setRlocProbed(false).setWeight((short) 1).setPriority((short) 1)
668 .setMulticastWeight((short) 1).setMulticastPriority((short) 1).setRouted(true)
669 .setRloc(locator).setLocatorId("SFC_LISP").build();
670 locatorRecords.add(locatorBuilder.build());
672 return locatorRecords;
675 public static Eid getNoAddressEid() {
676 EidBuilder builder = new EidBuilder();
677 builder.setAddressType(NoAddressAfi.class);
678 builder.setVirtualNetworkId(null);
679 builder.setAddress(new NoAddressBuilder().setNoAddress(true).build());
680 return builder.build();
683 public static byte[] ipAddressToByteArray(Address addr) {
684 if (addr instanceof Ipv4) {
685 return InetAddresses.forString(((Ipv4) addr).getIpv4().getValue()).getAddress();
686 } else if (addr instanceof Ipv6) {
687 return InetAddresses.forString(((Ipv6) addr).getIpv6().getValue()).getAddress();
688 } else if (addr instanceof Ipv4Binary) {
689 return ((Ipv4Binary) addr).getIpv4Binary().getValue();
690 } else if (addr instanceof Ipv6Binary) {
691 return ((Ipv6Binary) addr).getIpv6Binary().getValue();
697 public static int compareIpAddressByteArrays(byte[] a, byte[] b) {
699 if (a.length < b.length) {
701 } else if (a.length > b.length) {
703 } else if (a.length == 4 && b.length == 4) {
704 for (i = 0; i < 4; i++) {
707 } else if (a[i] > b[i]) {
712 } else if (a.length == 16 && b.length == 16) {
713 for (i = 0; i < 16; i++) {
716 } else if (a[i] > b[i]) {