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;
11 import java.net.Inet4Address;
12 import java.net.Inet6Address;
13 import java.net.InetAddress;
14 import java.util.ArrayList;
15 import java.util.List;
16 import java.util.regex.Pattern;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.AsNumberAfi;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameAfi;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameType;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ExplicitLocatorPathLcaf;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.InstanceIdType;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6Afi;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6PrefixAfi;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.KeyValueAddressLcaf;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddressFamily;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.NoAddressAfi;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathIdType;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathLcaf;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.AsNumberBuilder;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.DistinguishedNameBuilder;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6PrefixBuilder;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.MacBuilder;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.NoAddressBuilder;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePathBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.EidBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.key.value.address.KeyValueAddressBuilder;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePath;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKey;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder;
64 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
65 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.ExplicitLocatorPathBuilder;
66 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;
67 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.Hop.LrsBits;
68 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.explicit.locator.path.HopBuilder;
69 import org.slf4j.Logger;
70 import org.slf4j.LoggerFactory;
72 public final class LispAddressUtil {
73 protected static final Logger LOG = LoggerFactory.getLogger(LispAddressUtil.class);
75 public static final short STARTING_SERVICE_INDEX = 255;
76 private static final Pattern IP4_PATTERN =
77 Pattern.compile("(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])", Pattern.CASE_INSENSITIVE);
78 private static final Pattern IP6_PATTERN =
79 Pattern.compile("([0-9a-f]{1,4}:){7}([0-9a-f]){1,4}", Pattern.CASE_INSENSITIVE);
81 // Utility class, should not be instantiated
82 private LispAddressUtil() {
85 public static Class<? extends LispAddressFamily> addressTypeFromSimpleAddress(SimpleAddress address) {
86 if (address.getIpAddress() != null) {
87 return addressTypeFromIpAddress(address.getIpAddress());
88 } else if (address.getIpPrefix() != null) {
89 return addressTypeFromIpPrefix(address.getIpPrefix());
90 } else if (address.getMacAddress() != null) {
92 } else if (address.getDistinguishedNameType() != null) {
93 return DistinguishedNameAfi.class;
94 } else if (address.getAsNumber() != null) {
95 return AsNumberAfi.class;
100 public static Address addressFromSimpleAddress(SimpleAddress address) {
101 if (address.getIpAddress() != null) {
102 return addressFromIpAddress(address.getIpAddress());
103 } else if (address.getIpPrefix() != null) {
104 return addressFromIpPrefix(address.getIpPrefix());
105 } else if (address.getMacAddress() != null) {
106 return addressFromMacAddress(address.getMacAddress());
107 } else if (address.getDistinguishedNameType() != null) {
108 return addressFromDistinguishedName(address.getDistinguishedNameType());
109 } else if (address.getAsNumber() != null) {
110 return addressFromAsNumber(address.getAsNumber());
115 public static Class<? extends LispAddressFamily> addressTypeFromInet(InetAddress address) {
116 if (address instanceof Inet4Address) {
117 return Ipv4Afi.class;
118 } else if (address instanceof Inet6Address) {
119 return Ipv6Afi.class;
124 public static Address addressFromInet(InetAddress address) {
125 if (address instanceof Inet4Address) {
126 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder()
127 .setIpv4(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address(address.getHostAddress())).build();
128 } else if (address instanceof Inet6Address) {
129 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder()
130 .setIpv6(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address(address.getHostAddress())).build();
135 public static Class<? extends LispAddressFamily> addressTypeFromIpAddress(IpAddress address) {
136 if (address == null) {
138 } else if (address.getIpv4Address() != null) {
139 return Ipv4Afi.class;
140 } else if (address.getIpv6Address() != null) {
141 return Ipv6Afi.class;
146 public static Address addressFromIpAddress(IpAddress address) {
147 if (address == null) {
149 } else if (address.getIpv4Address() != null) {
150 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder().setIpv4(address.getIpv4Address()).build();
151 } else if (address.getIpv6Address() != null) {
152 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder().setIpv6(address.getIpv6Address()).build();
157 public static Class<? extends LispAddressFamily> addressTypeFromIpPrefix(IpPrefix address) {
158 if (address == null) {
160 } else if (address.getIpv4Prefix() != null) {
161 return Ipv4PrefixAfi.class;
162 } else if (address.getIpv6Prefix() != null) {
163 return Ipv6PrefixAfi.class;
168 public static Address addressFromIpPrefix(IpPrefix address) {
169 if (address == null) {
171 } else if (address.getIpv4Prefix() != null) {
172 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder().setIpv4Prefix(address.getIpv4Prefix()).build();
173 } else if (address.getIpv6Prefix() != null) {
174 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6PrefixBuilder().setIpv6Prefix(address.getIpv6Prefix()).build();
179 public static Address addressFromMacAddress(MacAddress address) {
180 if (address == null) {
183 return (Address) new MacBuilder().setMac(address).build();
187 public static Address addressFromServicePath(ServicePath address) {
188 if (address == null) {
191 return (Address) new ServicePathBuilder().setServicePath(address).build();
195 public static Address addressFromDistinguishedName(DistinguishedNameType address) {
196 if (address == null) {
199 return (Address) new DistinguishedNameBuilder().setDistinguishedName(address).build();
203 public static Address addressFromAsNumber(AsNumber address) {
204 if (address == null) {
207 return (Address) new AsNumberBuilder().setAsNumber(address).build();
210 public static Rloc toRloc(SimpleAddress address) {
211 RlocBuilder builder = new RlocBuilder();
212 builder.setAddressType(addressTypeFromSimpleAddress(address));
213 builder.setVirtualNetworkId(null);
214 builder.setAddress(addressFromSimpleAddress(address));
215 return builder.build();
218 public static Rloc toRloc(InetAddress address) {
219 RlocBuilder builder = new RlocBuilder();
220 builder.setAddressType(addressTypeFromInet(address));
221 builder.setVirtualNetworkId(null);
222 builder.setAddress(addressFromInet(address));
223 return builder.build();
226 public static Rloc toRloc(Ipv4Address address) {
227 RlocBuilder builder = new RlocBuilder();
228 builder.setAddressType(Ipv4Afi.class);
229 builder.setVirtualNetworkId(null);
230 builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
231 return builder.build();
234 public static Rloc toRloc(Ipv6Address address) {
235 RlocBuilder builder = new RlocBuilder();
236 builder.setAddressType(Ipv6Afi.class);
237 builder.setVirtualNetworkId(null);
238 builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
239 return builder.build();
242 public static Rloc asIpv4Rloc(String address) {
243 return toRloc(new Ipv4Address(address));
246 public static Rloc asIpv6Rloc(String address) {
247 return toRloc(new Ipv6Address(address));
250 public static Eid toEid(Ipv4Prefix prefix, InstanceIdType vni) {
251 EidBuilder builder = new EidBuilder();
252 builder.setAddressType(Ipv4PrefixAfi.class);
253 builder.setVirtualNetworkId(vni);
254 builder.setAddress((Address) new Ipv4PrefixBuilder().setIpv4Prefix(prefix).build());
255 return builder.build();
258 public static Eid toEid(Ipv4Address prefix, InstanceIdType vni) {
259 EidBuilder builder = new EidBuilder();
260 builder.setAddressType(Ipv4Afi.class);
261 builder.setVirtualNetworkId(vni);
262 builder.setAddress((Address) new Ipv4Builder().setIpv4(prefix).build());
263 return builder.build();
266 // XXX getMapping rcp fails if VNI set to 0
267 public static Eid toEidNoVni(IpPrefix prefix) {
268 EidBuilder builder = new EidBuilder();
269 builder.setAddress(addressFromIpPrefix(prefix));
270 builder.setAddressType(addressTypeFromIpPrefix(prefix));
271 return builder.build();
274 public static Eid toEid(IpPrefix prefix, InstanceIdType vni) {
275 EidBuilder builder = new EidBuilder();
276 builder.setAddress(addressFromIpPrefix(prefix));
277 builder.setAddressType(addressTypeFromIpPrefix(prefix));
278 builder.setVirtualNetworkId(vni);
279 return builder.build();
282 public static Eid toIpPrefixEid(IpAddress addr, int vni) {
283 // If you touch this, be sure that sfclisp compiles!
284 int mask = addressTypeFromIpAddress(addr) == Ipv4Afi.class ? 32 : 128;
285 IpPrefix prefix = asIpPrefix(addr.getValue().toString(), mask);
286 // XXX getMapping rcp fails if VNI set to 0
287 return toEidNoVni(prefix);
290 public static Eid asEid(SimpleAddress address, InstanceIdType vni) {
291 EidBuilder builder = new EidBuilder();
292 builder.setAddressType(addressTypeFromSimpleAddress(address));
293 builder.setVirtualNetworkId(vni);
294 // XXX Not sure if the below actually works as expected... also, what happens to AFI?
295 builder.setAddress(addressFromSimpleAddress(address));
296 return builder.build();
299 public static Eid asIpv4PrefixEid(String prefix) {
300 return toEid(new Ipv4Prefix(prefix), null);
303 public static Eid asIpv4Eid(String address) {
304 return toEid(new Ipv4Address(address), null);
307 public static Eid toEid(Ipv6Prefix prefix, InstanceIdType vni) {
308 EidBuilder builder = new EidBuilder();
309 builder.setAddressType(Ipv6PrefixAfi.class);
310 builder.setVirtualNetworkId(vni);
311 builder.setAddress((Address) new Ipv6PrefixBuilder().setIpv6Prefix(prefix).build());
312 return builder.build();
315 public static Eid toEid(Ipv6Address prefix, InstanceIdType vni) {
316 EidBuilder builder = new EidBuilder();
317 builder.setAddressType(Ipv6Afi.class);
318 builder.setVirtualNetworkId(vni);
319 builder.setAddress((Address) new Ipv6Builder().setIpv6(prefix).build());
320 return builder.build();
323 public static Eid asIpv6Eid(String address, long vni) {
324 return toEid(new Ipv6Address(address), new InstanceIdType(vni));
327 public static Eid asIpv6PrefixEid(String prefix) {
328 return toEid(new Ipv6Prefix(prefix), null);
331 public static Eid asIpv6Eid(String address) {
332 return toEid(new Ipv6Address(address), null);
335 public static Eid asIpv4Eid(String address, long vni) {
336 return toEid(new Ipv4Address(address), new InstanceIdType(vni));
339 public static int ipVersionFromString(String ip) {
340 if (IP4_PATTERN.matcher(ip).matches()) {
342 } else if (IP6_PATTERN.matcher(ip).matches()) {
349 public static IpPrefix asIpPrefix(String addr, int mask) {
350 int version = ipVersionFromString(addr);
351 if (version == 4 && (mask >= 0 && mask <= 32)) {
352 return new IpPrefix(new Ipv4Prefix(addr + "/" + mask));
353 } else if (version == 6 && (mask >=0 && mask <= 128)) {
354 return new IpPrefix(new Ipv6Prefix(addr + "/" + mask));
360 public static Eid asIpv4PrefixEid(Ipv4Address addr, InstanceIdType vni) {
361 return toEid(new IpPrefix(new Ipv4Prefix(addr.getValue() + "/32")), vni);
364 public static Eid asIpv6PrefixEid(Ipv6Address addr, InstanceIdType vni) {
365 return toEid(new IpPrefix(new Ipv4Prefix(addr.getValue() + "/128")), vni);
368 public static Eid asIpv4PrefixEid(Eid eid, Inet4Address address, short mask) {
369 EidBuilder builder = new EidBuilder();
370 builder.setAddressType(eid.getAddressType());
371 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
372 builder.setAddress(new Ipv4PrefixBuilder().setIpv4Prefix(new Ipv4Prefix(getStringPrefix(address, mask))).build());
373 return builder.build();
376 public static Eid asIpv6PrefixEid(Eid eid, Inet6Address address, short mask) {
377 EidBuilder builder = new EidBuilder();
378 builder.setAddressType(eid.getAddressType());
379 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
380 builder.setAddress(new Ipv6PrefixBuilder().setIpv6Prefix(new Ipv6Prefix(getStringPrefix(address, mask))).build());
381 return builder.build();
384 public static Eid asServicePathEid(long vni, long servicePathId, short serviceIndex) {
385 EidBuilder eb = new EidBuilder();
386 eb.setAddressType(ServicePathLcaf.class);
388 eb.setVirtualNetworkId(new InstanceIdType(vni));
390 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePathBuilder spb = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePathBuilder();
391 spb.setServicePathId(new ServicePathIdType(servicePathId));
392 spb.setServiceIndex(serviceIndex);
393 return eb.setAddress(addressFromServicePath(spb.build())).build();
396 public static Eid toEid(MacAddress mac, InstanceIdType vni) {
397 EidBuilder builder = new EidBuilder();
398 builder.setAddressType(MacAfi.class);
399 builder.setVirtualNetworkId(vni);
400 builder.setAddress((Address) new MacBuilder().setMac(mac).build());
401 return builder.build();
404 public static Eid asMacEid(String address, long vni) {
405 return toEid(new MacAddress(address), new InstanceIdType(vni));
408 public static Eid asMacEid(String address) {
409 return toEid(new MacAddress(address), null);
412 public static Eid toEid(DistinguishedNameType dn, InstanceIdType vni) {
413 EidBuilder builder = new EidBuilder();
414 builder.setAddressType(DistinguishedNameAfi.class);
415 builder.setVirtualNetworkId(vni);
416 builder.setAddress((Address) new DistinguishedNameBuilder().setDistinguishedName(dn).build());
417 return builder.build();
420 public static Eid asDistinguishedNameEid(String address, long vni) {
421 return toEid(new MacAddress(address), new InstanceIdType(vni));
424 public static Eid asDistinguishedNameEid(String address) {
425 return toEid(new DistinguishedNameType(address), null);
428 public static Eid asKeyValueAddressEid(SimpleAddress key, SimpleAddress value) {
429 KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
431 kvab.setValue(value);
432 KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddressBuilder()
433 .setKeyValueAddress(kvab.build()).build();
434 EidBuilder builder = new EidBuilder();
435 builder.setAddressType(KeyValueAddressLcaf.class);
436 builder.setVirtualNetworkId(null);
437 builder.setAddress((Address) address);
438 return builder.build();
441 public static Rloc asKeyValueAddressRloc(SimpleAddress key, SimpleAddress value) {
442 KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
444 kvab.setValue(value);
445 KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddressBuilder()
446 .setKeyValueAddress(kvab.build()).build();
447 RlocBuilder builder = new RlocBuilder();
448 builder.setAddressType(KeyValueAddressLcaf.class);
449 builder.setVirtualNetworkId(null);
450 builder.setAddress((Address) address);
451 return builder.build();
454 public static Rloc asKeyValueAddress(String key, SimpleAddress value) {
455 return asKeyValueAddressRloc(new SimpleAddress(new DistinguishedNameType(key)), value);
458 private static String getStringPrefix(InetAddress address, short mask) {
459 StringBuilder sb = new StringBuilder();
460 sb.append(address.getHostAddress());
463 return sb.toString();
466 public static SourceDestKey asSrcDst(String src, String dst, int smask, int dmask) {
467 SourceDestKeyBuilder builder = new SourceDestKeyBuilder();
468 builder.setSource(new SimpleAddress(asIpPrefix(src, smask)));
469 builder.setDest(new SimpleAddress(asIpPrefix(dst, dmask)));
470 return builder.build();
473 public static Eid asSrcDstEid(String src, String dst, int smask, int dmask, int vni) {
474 EidBuilder builder = new EidBuilder();
475 builder.setAddressType(SourceDestKeyLcaf.class);
476 builder.setVirtualNetworkId(new InstanceIdType(Long.valueOf(vni)));
478 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKeyBuilder()
479 .setSourceDestKey(asSrcDst(src, dst, smask, dmask)).build());
481 return builder.build();
484 public static Eid asSrcDstEid(SourceDestKey sd, InstanceIdType vni) {
485 EidBuilder builder = new EidBuilder();
486 builder.setAddressType(SourceDestKeyLcaf.class);
487 builder.setVirtualNetworkId(vni);
488 builder.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
489 .rev151105.lisp.address.address.SourceDestKeyBuilder().setSourceDestKey(sd).build());
490 return builder.build();
493 public static Rloc asTeLcafRloc(List<IpAddress> hopList) {
494 RlocBuilder teBuilder = new RlocBuilder();
495 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ExplicitLocatorPathBuilder elpBuilder =
496 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ExplicitLocatorPathBuilder();
497 ExplicitLocatorPathBuilder teAddrBuilder = new ExplicitLocatorPathBuilder();
498 teAddrBuilder.setHop(new ArrayList<Hop>());
499 for (IpAddress hop : hopList) {
500 HopBuilder hopBuilder = new HopBuilder();
501 hopBuilder.setAddress(new SimpleAddress(hop));
502 hopBuilder.setHopId("Hop " + teAddrBuilder.getHop().size());
503 hopBuilder.setLrsBits(new LrsBits(false, false, false));
504 teAddrBuilder.getHop().add(hopBuilder.build());
507 elpBuilder.setExplicitLocatorPath(teAddrBuilder.build());
508 teBuilder.setAddress(elpBuilder.build());
509 teBuilder.setAddressType(ExplicitLocatorPathLcaf.class);
510 return teBuilder.build();
513 public static List<LocatorRecord> asLocatorRecords(List<Rloc> locators) {
514 List<LocatorRecord> locatorRecords = new ArrayList<LocatorRecord>();
515 for (Rloc locator : locators) {
516 LocatorRecordBuilder locatorBuilder = new LocatorRecordBuilder();
517 locatorBuilder.setLocalLocator(false).setRlocProbed(false).setWeight((short) 1).setPriority((short) 1)
518 .setMulticastWeight((short) 1).setMulticastPriority((short) 1).setRouted(true)
519 .setRloc(locator).setLocatorId("SFC_LISP").build();
520 locatorRecords.add(locatorBuilder.build());
522 return locatorRecords;
525 public static Eid getNoAddressEid() {
526 EidBuilder builder = new EidBuilder();
527 builder.setAddressType(NoAddressAfi.class);
528 builder.setVirtualNetworkId(null);
529 builder.setAddress(new NoAddressBuilder().setNoAddress(true).build());
530 return builder.build();
533 public static InetAddress ipAddressToInet(Address addr) {
534 if (addr instanceof Ipv4) {
535 return InetAddresses.forString(((Ipv4) addr).getIpv4().getValue());
536 } else if (addr instanceof Ipv6) {
537 return InetAddresses.forString(((Ipv6) addr).getIpv6().getValue());
543 public static int compareInetAddresses(InetAddress a, InetAddress b) {
545 if (a instanceof Inet4Address && b instanceof Inet6Address) {
547 } else if (a instanceof Inet6Address && b instanceof Inet4Address) {
549 } else if (a instanceof Inet4Address && b instanceof Inet4Address) {
550 byte[] aBytes = ((Inet4Address) a).getAddress();
551 byte[] bBytes = ((Inet4Address) b).getAddress();
552 for (i = 0; i < 4; i++) {
553 if (aBytes[i] < bBytes[i]) {
555 } else if (aBytes[i] > bBytes[i]) {
560 } else if (a instanceof Inet6Address && b instanceof Inet6Address) {
561 byte[] aBytes = ((Inet4Address) a).getAddress();
562 byte[] bBytes = ((Inet4Address) b).getAddress();
563 for (i = 0; i < 16; i++) {
564 if (aBytes[i] < bBytes[i]) {
566 } else if (aBytes[i] > bBytes[i]) {