f9a5a8747b5809ad9e3f666a0b0d0eaa3b0651b3
[lispflowmapping.git] / mappingservice / lisp-proto / src / main / java / org / opendaylight / lispflowmapping / lisp / util / LispAddressUtil.java
1 /*
2  * Copyright (c) 2014 Contextream, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.lispflowmapping.lisp.util;
9
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;
15
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;
50
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}";
56     static {
57         try {
58           IP4_PATTERN = Pattern.compile(ip4Pattern, Pattern.CASE_INSENSITIVE);
59           IP6_PATTERN = Pattern.compile(ip6Pattern, Pattern.CASE_INSENSITIVE);
60         } catch (PatternSyntaxException e) {
61         }
62       }
63
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) {
70             return MacAfi.class;
71         } else if (address.getDistinguishedNameType() != null) {
72             return DistinguishedNameAfi.class;
73         } else if (address.getAsNumber() != null) {
74             return AsNumberAfi.class;
75         }
76         return null;
77     }
78
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());
84         }
85         // TODO the rest of the types
86         return null;
87     }
88
89     public static Class<? extends LispAddressFamily> addressTypeFromInet(InetAddress address) {
90         if (address instanceof Inet4Address) {
91             return Ipv4Afi.class;
92         } else if (address instanceof Inet6Address) {
93             return Ipv6Afi.class;
94         }
95         return null;
96     }
97
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();
105         }
106         return null;
107     }
108
109     public static Class<? extends LispAddressFamily> addressTypeFromIpAddress(IpAddress address) {
110         if (address == null) {
111             return null;
112         } else if (address.getIpv4Address() != null) {
113             return Ipv4Afi.class;
114         } else if (address.getIpv6Address() != null) {
115             return Ipv6Afi.class;
116         }
117         return null;
118     }
119
120     public static Address addressFromIpAddress(IpAddress address) {
121         if (address == null) {
122             return 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();
127         }
128         return null;
129     }
130
131     public static Class<? extends LispAddressFamily> addressTypeFromIpPrefix(IpPrefix address) {
132         if (address == null) {
133             return null;
134         } else if (address.getIpv4Prefix() != null) {
135             return Ipv4PrefixAfi.class;
136         } else if (address.getIpv6Prefix() != null) {
137             return Ipv6PrefixAfi.class;
138         }
139         return null;
140     }
141
142     public static Address addressFromIpPrefix(IpPrefix address) {
143         if (address == null) {
144             return 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();
149         }
150         return null;
151     }
152
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();
159     }
160
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();
167     }
168
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();
175     }
176
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();
183     }
184
185     public static Rloc asIpv4Rloc(String address) {
186         return toRloc(new Ipv4Address(address));
187     }
188
189     public static Rloc asIpv6Rloc(String address) {
190         return toRloc(new Ipv6Address(address));
191     }
192
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();
199     }
200
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();
207     }
208
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();
216     }
217
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();
224     }
225
226     public static Eid asIpv4PrefixEid(String prefix) {
227         return toEid(new Ipv4Prefix(prefix), null);
228     }
229
230     public static Eid asIpv4Eid(String address) {
231         return toEid(new Ipv4Address(address), null);
232     }
233
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();
240     }
241
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();
248     }
249
250     public static Eid asIpv6Eid(String address, long vni) {
251         return toEid(new Ipv6Address(address), new InstanceIdType(vni));
252     }
253
254     public static Eid asIpv6PrefixEid(String prefix) {
255         return toEid(new Ipv6Prefix(prefix), null);
256     }
257
258     public static Eid asIpv6Eid(String address) {
259         return toEid(new Ipv6Address(address), null);
260     }
261
262     public static Eid asIpv4Eid(String address, long vni) {
263         return toEid(new Ipv4Address(address), new InstanceIdType(vni));
264     }
265
266     public static int ipVersionFromString(String ip) {
267         if (IP4_PATTERN.matcher(ip).matches()) {
268             return 4;
269         } else if (IP6_PATTERN.matcher(ip).matches()) {
270             return 6;
271         } else {
272             return 0;
273         }
274     }
275
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));
282         } else {
283             return null;
284         }
285     }
286
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();
293     }
294
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();
301     }
302
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();
309     }
310
311     public static Eid asMacEid(String address, long vni) {
312         return toEid(new MacAddress(address), new InstanceIdType(vni));
313     }
314
315     public static Eid asMacEid(String address) {
316         return toEid(new MacAddress(address), null);
317     }
318
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();
330     }
331
332     private static String getStringPrefix(InetAddress address, short mask) {
333         StringBuilder sb = new StringBuilder();
334         sb.append(address.getHostAddress());
335         sb.append("/");
336         sb.append(mask);
337         return sb.toString();
338     }
339
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();
345     }
346
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)));
351         builder.setAddress(
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());
354
355         return builder.build();
356     }
357
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)));
362         builder.setAddress(
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();
366     }
367 }