2 * Copyright (c) 2014 Contextream, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.lispflowmapping.lisp.util;
10 import java.net.Inet4Address;
11 import java.net.Inet6Address;
12 import java.net.InetAddress;
13 import java.util.regex.Pattern;
14 import java.util.regex.PatternSyntaxException;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.AsNumberAfi;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameAfi;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameType;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.InstanceIdType;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6Afi;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6PrefixAfi;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.KeyValueAddressLcaf;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddressFamily;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6PrefixBuilder;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.MacBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.EidBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.key.value.address.KeyValueAddressBuilder;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKey;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
51 public class LispAddressUtil {
52 private static Pattern IP4_PATTERN = null;
53 private static Pattern IP6_PATTERN = null;
54 private static final String ip4Pattern = "(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])";
55 private static final String ip6Pattern = "([0-9a-f]{1,4}:){7}([0-9a-f]){1,4}";
58 IP4_PATTERN = Pattern.compile(ip4Pattern, Pattern.CASE_INSENSITIVE);
59 IP6_PATTERN = Pattern.compile(ip6Pattern, Pattern.CASE_INSENSITIVE);
60 } catch (PatternSyntaxException e) {
64 public static Class<? extends LispAddressFamily> addressTypeFromSimpleAddress(SimpleAddress address) {
65 if (address.getIpAddress() != null) {
66 return addressTypeFromIpAddress(address.getIpAddress());
67 } else if (address.getIpPrefix() != null) {
68 return addressTypeFromIpPrefix(address.getIpPrefix());
69 } else if (address.getMacAddress() != null) {
71 } else if (address.getDistinguishedNameType() != null) {
72 return DistinguishedNameAfi.class;
73 } else if (address.getAsNumber() != null) {
74 return AsNumberAfi.class;
79 public static Address addressFromSimpleAddress(SimpleAddress address) {
80 if (address.getIpAddress() != null) {
81 return addressFromIpAddress(address.getIpAddress());
82 } else if (address.getIpPrefix() != null) {
83 return addressFromIpPrefix(address.getIpPrefix());
85 // TODO the rest of the types
89 public static Class<? extends LispAddressFamily> addressTypeFromInet(InetAddress address) {
90 if (address instanceof Inet4Address) {
92 } else if (address instanceof Inet6Address) {
98 public static Address addressFromInet(InetAddress address) {
99 if (address instanceof Inet4Address) {
100 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder()
101 .setIpv4(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address(address.getHostAddress())).build();
102 } else if (address instanceof Inet6Address) {
103 return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder()
104 .setIpv6(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address(address.getHostAddress())).build();
109 public static Class<? extends LispAddressFamily> addressTypeFromIpAddress(IpAddress address) {
110 if (address == null) {
112 } else if (address.getIpv4Address() != null) {
113 return Ipv4Afi.class;
114 } else if (address.getIpv6Address() != null) {
115 return Ipv6Afi.class;
120 public static Address addressFromIpAddress(IpAddress address) {
121 if (address == null) {
123 } else if (address.getIpv4Address() != null) {
124 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();
125 } else if (address.getIpv6Address() != null) {
126 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();
131 public static Class<? extends LispAddressFamily> addressTypeFromIpPrefix(IpPrefix address) {
132 if (address == null) {
134 } else if (address.getIpv4Prefix() != null) {
135 return Ipv4PrefixAfi.class;
136 } else if (address.getIpv6Prefix() != null) {
137 return Ipv6PrefixAfi.class;
142 public static Address addressFromIpPrefix(IpPrefix address) {
143 if (address == null) {
145 } else if (address.getIpv4Prefix() != null) {
146 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();
147 } else if (address.getIpv6Prefix() != null) {
148 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();
153 public static Rloc toRloc(SimpleAddress address) {
154 RlocBuilder builder = new RlocBuilder();
155 builder.setAddressType(addressTypeFromSimpleAddress(address));
156 builder.setVirtualNetworkId(null);
157 builder.setAddress(addressFromSimpleAddress(address));
158 return builder.build();
161 public static Rloc toRloc(InetAddress address) {
162 RlocBuilder builder = new RlocBuilder();
163 builder.setAddressType(addressTypeFromInet(address));
164 builder.setVirtualNetworkId(null);
165 builder.setAddress(addressFromInet(address));
166 return builder.build();
169 public static Rloc toRloc(Ipv4Address address) {
170 RlocBuilder builder = new RlocBuilder();
171 builder.setAddressType(Ipv4Afi.class);
172 builder.setVirtualNetworkId(null);
173 builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
174 return builder.build();
177 public static Rloc toRloc(Ipv6Address address) {
178 RlocBuilder builder = new RlocBuilder();
179 builder.setAddressType(Ipv6Afi.class);
180 builder.setVirtualNetworkId(null);
181 builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
182 return builder.build();
185 public static Rloc asIpv4Rloc(String address) {
186 return toRloc(new Ipv4Address(address));
189 public static Rloc asIpv6Rloc(String address) {
190 return toRloc(new Ipv6Address(address));
193 public static Eid toEid(Ipv4Prefix prefix, InstanceIdType vni) {
194 EidBuilder builder = new EidBuilder();
195 builder.setAddressType(Ipv4PrefixAfi.class);
196 builder.setVirtualNetworkId(vni);
197 builder.setAddress((Address) new Ipv4PrefixBuilder().setIpv4Prefix(prefix).build());
198 return builder.build();
201 public static Eid toEid(Ipv4Address prefix, InstanceIdType vni) {
202 EidBuilder builder = new EidBuilder();
203 builder.setAddressType(Ipv4Afi.class);
204 builder.setVirtualNetworkId(vni);
205 builder.setAddress((Address) new Ipv4Builder().setIpv4(prefix).build());
206 return builder.build();
209 public static Eid toEid(Eid eid, IpPrefix prefix) {
210 EidBuilder builder = new EidBuilder();
211 builder.setAddressType(eid.getAddressType());
212 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
213 // XXX Not sure if the below actually works as expected... also, what happens to AFI?
214 builder.setAddress(addressFromIpPrefix(prefix));
215 return builder.build();
218 public static Eid toEid(IpPrefix prefix, int vni) {
219 EidBuilder builder = new EidBuilder();
220 builder.setAddress(addressFromIpPrefix(prefix));
221 builder.setAddressType(addressTypeFromIpPrefix(prefix));
222 builder.setVirtualNetworkId(new InstanceIdType(Long.valueOf(vni)));
223 return builder.build();
226 public static Eid asIpv4PrefixEid(String prefix) {
227 return toEid(new Ipv4Prefix(prefix), null);
230 public static Eid asIpv4Eid(String address) {
231 return toEid(new Ipv4Address(address), null);
234 public static Eid toEid(Ipv6Prefix prefix, InstanceIdType vni) {
235 EidBuilder builder = new EidBuilder();
236 builder.setAddressType(Ipv6PrefixAfi.class);
237 builder.setVirtualNetworkId(vni);
238 builder.setAddress((Address) new Ipv6PrefixBuilder().setIpv6Prefix(prefix).build());
239 return builder.build();
242 public static Eid toEid(Ipv6Address prefix, InstanceIdType vni) {
243 EidBuilder builder = new EidBuilder();
244 builder.setAddressType(Ipv6Afi.class);
245 builder.setVirtualNetworkId(vni);
246 builder.setAddress((Address) new Ipv6Builder().setIpv6(prefix).build());
247 return builder.build();
250 public static Eid asIpv6Eid(String address, long vni) {
251 return toEid(new Ipv6Address(address), new InstanceIdType(vni));
254 public static Eid asIpv6PrefixEid(String prefix) {
255 return toEid(new Ipv6Prefix(prefix), null);
258 public static Eid asIpv6Eid(String address) {
259 return toEid(new Ipv6Address(address), null);
262 public static Eid asIpv4Eid(String address, long vni) {
263 return toEid(new Ipv4Address(address), new InstanceIdType(vni));
266 public static int ipVersionFromString(String ip) {
267 if (IP4_PATTERN.matcher(ip).matches()) {
269 } else if (IP6_PATTERN.matcher(ip).matches()) {
276 public static IpPrefix asIpPrefix(String addr, int mask) {
277 int version = ipVersionFromString(addr);
278 if (version == 4 && (mask >= 0 && mask <= 32)) {
279 return new IpPrefix(new Ipv4Prefix(addr + "/" + mask));
280 } else if (version == 6 && (mask >=0 && mask <= 128)) {
281 return new IpPrefix(new Ipv6Prefix(addr + "/" + mask));
287 public static Eid asIpv4PrefixEid(Eid eid, Inet4Address address, short mask) {
288 EidBuilder builder = new EidBuilder();
289 builder.setAddressType(eid.getAddressType());
290 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
291 builder.setAddress(new Ipv4PrefixBuilder().setIpv4Prefix(new Ipv4Prefix(getStringPrefix(address, mask))).build());
292 return builder.build();
295 public static Eid asIpv6PrefixEid(Eid eid, Inet6Address address, short mask) {
296 EidBuilder builder = new EidBuilder();
297 builder.setAddressType(eid.getAddressType());
298 builder.setVirtualNetworkId(eid.getVirtualNetworkId());
299 builder.setAddress(new Ipv6PrefixBuilder().setIpv6Prefix(new Ipv6Prefix(getStringPrefix(address, mask))).build());
300 return builder.build();
303 public static Eid toEid(MacAddress mac, InstanceIdType vni) {
304 EidBuilder builder = new EidBuilder();
305 builder.setAddressType(MacAfi.class);
306 builder.setVirtualNetworkId(vni);
307 builder.setAddress((Address) new MacBuilder().setMac(mac).build());
308 return builder.build();
311 public static Eid asMacEid(String address, long vni) {
312 return toEid(new MacAddress(address), new InstanceIdType(vni));
315 public static Eid asMacEid(String address) {
316 return toEid(new MacAddress(address), null);
319 public static Rloc asKeyValueAddress(String key, SimpleAddress value) {
320 KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
321 kvab.setKey(new SimpleAddress(new DistinguishedNameType(key)));
322 kvab.setValue(value);
323 KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddressBuilder()
324 .setKeyValueAddress(kvab.build()).build();
325 RlocBuilder builder = new RlocBuilder();
326 builder.setAddressType(KeyValueAddressLcaf.class);
327 builder.setVirtualNetworkId(null);
328 builder.setAddress((Address) address);
329 return builder.build();
332 private static String getStringPrefix(InetAddress address, short mask) {
333 StringBuilder sb = new StringBuilder();
334 sb.append(address.getHostAddress());
337 return sb.toString();
340 public static SourceDestKey asSrcDst(String src, String dst, int smask, int dmask) {
341 SourceDestKeyBuilder builder = new SourceDestKeyBuilder();
342 builder.setSource(asIpPrefix(src, smask));
343 builder.setDest(asIpPrefix(dst, dmask));
344 return builder.build();
347 public static Eid asSrcDstEid(String src, String dst, int smask, int dmask, int vni) {
348 EidBuilder builder = new EidBuilder();
349 builder.setAddressType(SourceDestKeyLcaf.class);
350 builder.setVirtualNetworkId(new InstanceIdType(Long.valueOf(vni)));
352 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKeyBuilder()
353 .setSourceDestKey(asSrcDst(src, dst, smask, dmask)).build());
355 return builder.build();
358 public static Eid asSrcDstEid(SourceDestKey sd, int vni) {
359 EidBuilder builder = new EidBuilder();
360 builder.setAddressType(SourceDestKeyLcaf.class);
361 builder.setVirtualNetworkId(new InstanceIdType(Long.valueOf(vni)));
363 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.SourceDestKeyBuilder()
364 .setSourceDestKey(sd).build());
365 return builder.build();