Switch Ipv4 and Ipv6 (de)serialization to binary
[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 com.google.common.net.InetAddresses;
11
12 import java.net.Inet4Address;
13 import java.net.Inet6Address;
14 import java.net.InetAddress;
15 import java.util.ArrayList;
16 import java.util.List;
17 import java.util.regex.Pattern;
18
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.AsNumberAfi;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameAfi;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.DistinguishedNameType;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ExplicitLocatorPathLcaf;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.InstanceIdType;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4PrefixAfi;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6Afi;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6PrefixAfi;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.KeyValueAddressLcaf;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddressFamily;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.NoAddressAfi;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathIdType;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.ServicePathLcaf;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SimpleAddress;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.SourceDestKeyLcaf;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.AsNumberBuilder;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.DistinguishedNameBuilder;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4PrefixBuilder;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6PrefixBuilder;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.KeyValueAddress;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.MacBuilder;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.NoAddressBuilder;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.ServicePathBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv4AddressBinary;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv6AddressBinary;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4BinaryAfi;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv6BinaryAfi;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4Binary;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4BinaryBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6Binary;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6BinaryBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.EidBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
70 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.key.value.address.KeyValueAddressBuilder;
71 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.service.path.ServicePath;
72 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKey;
73 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.source.dest.key.SourceDestKeyBuilder;
74 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
75 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.explicit.locator.path.ExplicitLocatorPathBuilder;
76 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;
77 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;
78 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;
79 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IetfInetUtil;
80 import org.slf4j.Logger;
81 import org.slf4j.LoggerFactory;
82
83 public final class LispAddressUtil {
84     protected static final Logger LOG = LoggerFactory.getLogger(LispAddressUtil.class);
85
86     public static final short STARTING_SERVICE_INDEX = 255;
87     private static final Pattern IP4_PATTERN =
88             Pattern.compile("(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])",
89             Pattern.CASE_INSENSITIVE);
90     private static final Pattern IP6_PATTERN =
91             Pattern.compile("([0-9a-f]{1,4}:){7}([0-9a-f]){1,4}", Pattern.CASE_INSENSITIVE);
92
93     // Utility class, should not be instantiated
94     private LispAddressUtil() {
95     }
96
97     public static Class<? extends LispAddressFamily> addressTypeFromSimpleAddress(SimpleAddress address) {
98         if (address.getIpAddress() != null) {
99             return binaryAddressTypeFromIpAddress(address.getIpAddress());
100         } else if (address.getIpPrefix() != null) {
101             return addressTypeFromIpPrefix(address.getIpPrefix());
102         } else if (address.getMacAddress() != null) {
103             return MacAfi.class;
104         } else if (address.getDistinguishedNameType() != null) {
105             return DistinguishedNameAfi.class;
106         } else if (address.getAsNumber() != null) {
107             return AsNumberAfi.class;
108         }
109         return null;
110     }
111
112     public static Address addressFromSimpleAddress(SimpleAddress address) {
113         if (address.getIpAddress() != null) {
114             return binaryAddressFromIpAddress(address.getIpAddress());
115         } else if (address.getIpPrefix() != null) {
116             return addressFromIpPrefix(address.getIpPrefix());
117         } else if (address.getMacAddress() != null) {
118             return addressFromMacAddress(address.getMacAddress());
119         } else if (address.getDistinguishedNameType() != null) {
120             return addressFromDistinguishedName(address.getDistinguishedNameType());
121         } else if (address.getAsNumber() != null) {
122             return addressFromAsNumber(address.getAsNumber());
123         }
124         return null;
125     }
126
127     public static Class<? extends LispAddressFamily> addressTypeFromInet(InetAddress address) {
128         if (address instanceof Inet4Address) {
129             return Ipv4Afi.class;
130         } else if (address instanceof Inet6Address) {
131             return Ipv6Afi.class;
132         }
133         return null;
134     }
135
136     public static Address addressFromInet(InetAddress address) {
137         if (address instanceof Inet4Address) {
138             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
139                     .rev151105.lisp.address.address.Ipv4Builder()
140                     .setIpv4(IetfInetUtil.INSTANCE.ipv4AddressFor(address)).build();
141         } else if (address instanceof Inet6Address) {
142             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
143                     .rev151105.lisp.address.address.Ipv6Builder()
144                     .setIpv6(IetfInetUtil.INSTANCE.ipv6AddressFor(address)).build();
145         }
146         return null;
147     }
148
149     public static Class<? extends LispAddressFamily> addressTypeFromIpAddress(IpAddress address) {
150         if (address == null) {
151             return null;
152         } else if (address.getIpv4Address() != null) {
153             return Ipv4Afi.class;
154         } else if (address.getIpv6Address() != null) {
155             return Ipv6Afi.class;
156         }
157         return null;
158     }
159
160     public static Class<? extends LispAddressFamily> binaryAddressTypeFromIpAddress(IpAddress address) {
161         if (address == null) {
162             return null;
163         } else if (address.getIpv4Address() != null) {
164             return Ipv4BinaryAfi.class;
165         } else if (address.getIpv6Address() != null) {
166             return Ipv6BinaryAfi.class;
167         }
168         return null;
169     }
170
171     public static Address addressFromIpAddress(IpAddress address) {
172         if (address == null) {
173             return null;
174         } else if (address.getIpv4Address() != null) {
175             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
176                     .rev151105.lisp.address.address.Ipv4Builder().setIpv4(address.getIpv4Address()).build();
177         } else if (address.getIpv6Address() != null) {
178             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
179                     .rev151105.lisp.address.address.Ipv6Builder().setIpv6(address.getIpv6Address()).build();
180         }
181         return null;
182     }
183
184
185     public static Address binaryAddressFromIpAddress(IpAddress address) {
186         if (address == null) {
187             return null;
188         } else if (address.getIpv4Address() != null) {
189             return (Address) new Ipv4BinaryBuilder().setIpv4Binary(new Ipv4AddressBinary(
190                     InetAddresses.forString(address.getIpv4Address().getValue()).getAddress())).build();
191         } else if (address.getIpv6Address() != null) {
192             return (Address) new Ipv6BinaryBuilder().setIpv6Binary(new Ipv6AddressBinary(
193                     InetAddresses.forString(address.getIpv4Address().getValue()).getAddress())).build();
194         }
195         return null;
196     }
197
198     public static Class<? extends LispAddressFamily> addressTypeFromIpPrefix(IpPrefix address) {
199         if (address == null) {
200             return null;
201         } else if (address.getIpv4Prefix() != null) {
202             return Ipv4PrefixAfi.class;
203         } else if (address.getIpv6Prefix() != null) {
204             return Ipv6PrefixAfi.class;
205         }
206         return null;
207     }
208
209     public static Address addressFromIpPrefix(IpPrefix address) {
210         if (address == null) {
211             return null;
212         } else if (address.getIpv4Prefix() != null) {
213             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
214                     .rev151105.lisp.address.address.Ipv4PrefixBuilder().setIpv4Prefix(address.getIpv4Prefix()).build();
215         } else if (address.getIpv6Prefix() != null) {
216             return (Address) new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
217                     .rev151105.lisp.address.address.Ipv6PrefixBuilder().setIpv6Prefix(address.getIpv6Prefix()).build();
218         }
219         return null;
220     }
221
222     public static Address addressFromMacAddress(MacAddress address) {
223         if (address == null) {
224             return null;
225         } else {
226             return (Address) new MacBuilder().setMac(address).build();
227         }
228     }
229
230     public static Address addressFromServicePath(ServicePath address) {
231         if (address == null) {
232             return null;
233         } else {
234             return (Address) new ServicePathBuilder().setServicePath(address).build();
235         }
236     }
237
238     public static Address addressFromDistinguishedName(DistinguishedNameType address) {
239         if (address == null) {
240             return null;
241         } else {
242             return (Address) new DistinguishedNameBuilder().setDistinguishedName(address).build();
243         }
244     }
245
246     public static Address addressFromAsNumber(AsNumber address) {
247         if (address == null) {
248             return null;
249         } else {
250             return (Address) new AsNumberBuilder().setAsNumber(address).build();
251         }
252     }
253     public static Rloc toRloc(SimpleAddress address) {
254         RlocBuilder builder = new RlocBuilder();
255         builder.setAddressType(addressTypeFromSimpleAddress(address));
256         builder.setVirtualNetworkId(null);
257         builder.setAddress(addressFromSimpleAddress(address));
258         return builder.build();
259     }
260
261     public static Rloc toRloc(InetAddress address) {
262         RlocBuilder builder = new RlocBuilder();
263         builder.setAddressType(addressTypeFromInet(address));
264         builder.setVirtualNetworkId(null);
265         builder.setAddress(addressFromInet(address));
266         return builder.build();
267     }
268
269     public static Rloc toRloc(Ipv4Address address) {
270         RlocBuilder builder = new RlocBuilder();
271         builder.setAddressType(Ipv4Afi.class);
272         builder.setVirtualNetworkId(null);
273         builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
274         return builder.build();
275     }
276
277     public static Rloc toRloc(Ipv4AddressBinary address) {
278         RlocBuilder builder = new RlocBuilder();
279         builder.setAddressType(Ipv4BinaryAfi.class);
280         builder.setVirtualNetworkId(null);
281         builder.setAddress((Address) new Ipv4BinaryBuilder().setIpv4Binary(address).build());
282         return builder.build();
283     }
284
285     public static Rloc toRloc(Ipv6Address address) {
286         RlocBuilder builder = new RlocBuilder();
287         builder.setAddressType(Ipv6Afi.class);
288         builder.setVirtualNetworkId(null);
289         builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
290         return builder.build();
291     }
292
293     public static Rloc toRloc(Ipv6AddressBinary address) {
294         RlocBuilder builder = new RlocBuilder();
295         builder.setAddressType(Ipv6BinaryAfi.class);
296         builder.setVirtualNetworkId(null);
297         builder.setAddress((Address) new Ipv6BinaryBuilder().setIpv6Binary(address).build());
298         return builder.build();
299     }
300
301     public static Rloc asIpv4Rloc(String address) {
302         return toRloc(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()));
303     }
304
305     public static Rloc asIpv6Rloc(String address) {
306         return toRloc(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()));
307     }
308
309     public static Eid toEid(Ipv4Prefix prefix, InstanceIdType vni) {
310         EidBuilder builder = new EidBuilder();
311         builder.setAddressType(Ipv4PrefixAfi.class);
312         builder.setVirtualNetworkId(vni);
313         builder.setAddress((Address) new Ipv4PrefixBuilder().setIpv4Prefix(prefix).build());
314         return builder.build();
315     }
316
317     public static Eid toEid(Ipv4Address address, InstanceIdType vni) {
318         EidBuilder builder = new EidBuilder();
319         builder.setAddressType(Ipv4Afi.class);
320         builder.setVirtualNetworkId(vni);
321         builder.setAddress((Address) new Ipv4Builder().setIpv4(address).build());
322         return builder.build();
323     }
324
325     public static Eid toEid(Ipv4AddressBinary address, InstanceIdType vni) {
326         EidBuilder builder = new EidBuilder();
327         builder.setAddressType(Ipv4BinaryAfi.class);
328         builder.setVirtualNetworkId(vni);
329         builder.setAddress((Address) new Ipv4BinaryBuilder().setIpv4Binary(address).build());
330         return builder.build();
331     }
332
333     // XXX getMapping rcp fails if VNI set to 0
334     public static Eid toEidNoVni(IpPrefix prefix) {
335         EidBuilder builder = new EidBuilder();
336         builder.setAddress(addressFromIpPrefix(prefix));
337         builder.setAddressType(addressTypeFromIpPrefix(prefix));
338         return builder.build();
339     }
340
341     public static Eid toEid(IpPrefix prefix, InstanceIdType vni) {
342         EidBuilder builder = new EidBuilder();
343         builder.setAddress(addressFromIpPrefix(prefix));
344         builder.setAddressType(addressTypeFromIpPrefix(prefix));
345         builder.setVirtualNetworkId(vni);
346         return builder.build();
347     }
348
349     public static Eid toIpPrefixEid(IpAddress addr, int vni) {
350         // If you touch this, be sure that sfclisp compiles!
351         int mask = addressTypeFromIpAddress(addr) == Ipv4Afi.class ? 32 : 128;
352         IpPrefix prefix = asIpPrefix(String.valueOf(addr.getValue()), mask);
353         // XXX getMapping rcp fails if VNI set to 0
354         return toEidNoVni(prefix);
355     }
356
357     public static Eid asEid(SimpleAddress address, InstanceIdType vni) {
358         EidBuilder builder = new EidBuilder();
359         builder.setAddressType(addressTypeFromSimpleAddress(address));
360         builder.setVirtualNetworkId(vni);
361         // XXX Not sure if the below actually works as expected... also, what happens to AFI?
362         builder.setAddress(addressFromSimpleAddress(address));
363         return builder.build();
364     }
365
366     public static Eid asIpv4PrefixEid(String prefix) {
367         return toEid(new Ipv4Prefix(prefix), null);
368     }
369
370     public static Eid asIpv4PrefixEid(final String prefix, final InstanceIdType iiType) {
371         return toEid(new Ipv4Prefix(prefix), iiType);
372     }
373
374     public static Eid asIpv4Eid(String address) {
375         return toEid(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()), null);
376     }
377
378     public static Eid toEid(Ipv6Prefix prefix, InstanceIdType vni) {
379         EidBuilder builder = new EidBuilder();
380         builder.setAddressType(Ipv6PrefixAfi.class);
381         builder.setVirtualNetworkId(vni);
382         builder.setAddress((Address) new Ipv6PrefixBuilder().setIpv6Prefix(prefix).build());
383         return builder.build();
384     }
385
386     public static Eid toEid(Ipv6Address address, InstanceIdType vni) {
387         EidBuilder builder = new EidBuilder();
388         builder.setAddressType(Ipv6Afi.class);
389         builder.setVirtualNetworkId(vni);
390         builder.setAddress((Address) new Ipv6Builder().setIpv6(address).build());
391         return builder.build();
392     }
393
394     public static Eid toEid(Ipv6AddressBinary address, InstanceIdType vni) {
395         EidBuilder builder = new EidBuilder();
396         builder.setAddressType(Ipv6BinaryAfi.class);
397         builder.setVirtualNetworkId(vni);
398         builder.setAddress((Address) new Ipv6BinaryBuilder().setIpv6Binary(address).build());
399         return builder.build();
400     }
401
402     public static Eid asIpv6Eid(String address, long vni) {
403         return toEid(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()), new InstanceIdType(vni));
404     }
405
406     public static Eid asIpv6PrefixEid(String prefix) {
407         return toEid(new Ipv6Prefix(prefix), null);
408     }
409
410     public static Eid asIpv6Eid(String address) {
411         return toEid(new Ipv6AddressBinary(InetAddresses.forString(address).getAddress()), null);
412     }
413
414     public static Eid asIpv4Eid(String address, long vni) {
415         return toEid(new Ipv4AddressBinary(InetAddresses.forString(address).getAddress()), new InstanceIdType(vni));
416     }
417
418     public static int ipVersionFromString(String ip) {
419         if (IP4_PATTERN.matcher(ip).matches()) {
420             return 4;
421         } else if (IP6_PATTERN.matcher(ip).matches()) {
422             return 6;
423         } else {
424             return 0;
425         }
426     }
427
428     public static IpPrefix asIpPrefix(String addr, int mask) {
429         int version = ipVersionFromString(addr);
430         if (version == 4 && (mask >= 0 && mask <= 32)) {
431             return new IpPrefix(new Ipv4Prefix(addr + "/" + mask));
432         } else if (version == 6 && (mask >=0 && mask <= 128)) {
433             return new IpPrefix(new Ipv6Prefix(addr + "/" + mask));
434         } else {
435             return null;
436         }
437     }
438
439     public static Eid asIpv4PrefixEid(Ipv4Address addr, InstanceIdType vni) {
440         return toEid(new IpPrefix(IetfInetUtil.INSTANCE.ipv4PrefixFor(addr)), vni);
441     }
442
443     public static Eid asIpv6PrefixEid(Ipv6Address addr, InstanceIdType vni) {
444         return toEid(new IpPrefix(IetfInetUtil.INSTANCE.ipv6PrefixFor(addr)), vni);
445     }
446
447     public static Eid asIpv4PrefixEid(Eid eid, Inet4Address address, short mask) {
448         EidBuilder builder = new EidBuilder();
449         builder.setAddressType(eid.getAddressType());
450         builder.setVirtualNetworkId(eid.getVirtualNetworkId());
451         builder.setAddress(new Ipv4PrefixBuilder().setIpv4Prefix(
452                 IetfInetUtil.INSTANCE.ipv4PrefixFor(address, mask)).build());
453         return builder.build();
454     }
455
456     public static Eid asIpv6PrefixEid(Eid eid, Inet6Address address, short mask) {
457         EidBuilder builder = new EidBuilder();
458         builder.setAddressType(eid.getAddressType());
459         builder.setVirtualNetworkId(eid.getVirtualNetworkId());
460         builder.setAddress(new Ipv6PrefixBuilder().setIpv6Prefix(
461                 IetfInetUtil.INSTANCE.ipv6PrefixFor(address, mask)).build());
462         return builder.build();
463     }
464
465     public static Eid asServicePathEid(long vni, long servicePathId, short serviceIndex) {
466         EidBuilder eb = new EidBuilder();
467         eb.setAddressType(ServicePathLcaf.class);
468         if (vni >= 0) {
469             eb.setVirtualNetworkId(new InstanceIdType(vni));
470         }
471         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
472                 .lisp.address.address.service.path.ServicePathBuilder spb =
473                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
474                 .lisp.address.address.service.path.ServicePathBuilder();
475         spb.setServicePathId(new ServicePathIdType(servicePathId));
476         spb.setServiceIndex(serviceIndex);
477         return eb.setAddress(addressFromServicePath(spb.build())).build();
478     }
479
480     public static Eid toEid(MacAddress mac, InstanceIdType vni) {
481         EidBuilder builder = new EidBuilder();
482         builder.setAddressType(MacAfi.class);
483         builder.setVirtualNetworkId(vni);
484         builder.setAddress((Address) new MacBuilder().setMac(mac).build());
485         return builder.build();
486     }
487
488     public static Eid asMacEid(String address, long vni) {
489         return toEid(new MacAddress(address), new InstanceIdType(vni));
490     }
491
492     public static Eid asMacEid(String address) {
493         return toEid(new MacAddress(address), null);
494     }
495
496     public static Eid toEid(DistinguishedNameType dn, InstanceIdType vni) {
497         EidBuilder builder = new EidBuilder();
498         builder.setAddressType(DistinguishedNameAfi.class);
499         builder.setVirtualNetworkId(vni);
500         builder.setAddress((Address) new DistinguishedNameBuilder().setDistinguishedName(dn).build());
501         return builder.build();
502     }
503
504     public static Eid asDistinguishedNameEid(String address, long vni) {
505         return toEid(new MacAddress(address), new InstanceIdType(vni));
506     }
507
508     public static Eid asDistinguishedNameEid(String address) {
509         return toEid(new DistinguishedNameType(address), null);
510     }
511
512     public static Eid asKeyValueAddressEid(SimpleAddress key, SimpleAddress value) {
513         KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
514         kvab.setKey(key);
515         kvab.setValue(value);
516         KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
517                 .rev151105.lisp.address.address.KeyValueAddressBuilder()
518                 .setKeyValueAddress(kvab.build()).build();
519         EidBuilder builder = new EidBuilder();
520         builder.setAddressType(KeyValueAddressLcaf.class);
521         builder.setVirtualNetworkId(null);
522         builder.setAddress((Address) address);
523         return builder.build();
524     }
525
526     public static Rloc asKeyValueAddressRloc(SimpleAddress key, SimpleAddress value) {
527         KeyValueAddressBuilder kvab = new KeyValueAddressBuilder();
528         kvab.setKey(key);
529         kvab.setValue(value);
530         KeyValueAddress address = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
531                 .rev151105.lisp.address.address.KeyValueAddressBuilder()
532                 .setKeyValueAddress(kvab.build()).build();
533         RlocBuilder builder = new RlocBuilder();
534         builder.setAddressType(KeyValueAddressLcaf.class);
535         builder.setVirtualNetworkId(null);
536         builder.setAddress((Address) address);
537         return builder.build();
538     }
539
540     public static Rloc asKeyValueAddress(String key, SimpleAddress value) {
541         return asKeyValueAddressRloc(new SimpleAddress(new DistinguishedNameType(key)), value);
542     }
543
544     public static SourceDestKey asSrcDst(String src, String dst, int smask, int dmask) {
545         SourceDestKeyBuilder builder = new SourceDestKeyBuilder();
546         builder.setSource(new SimpleAddress(asIpPrefix(src, smask)));
547         builder.setDest(new SimpleAddress(asIpPrefix(dst, dmask)));
548         return builder.build();
549     }
550
551     public static Eid asSrcDstEid(String src, String dst, int smask, int dmask, int vni) {
552         EidBuilder builder = new EidBuilder();
553         builder.setAddressType(SourceDestKeyLcaf.class);
554         builder.setVirtualNetworkId(new InstanceIdType(Long.valueOf(vni)));
555         builder.setAddress(
556                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
557                         .lisp.address.address.SourceDestKeyBuilder()
558                         .setSourceDestKey(asSrcDst(src, dst, smask, dmask)).build());
559
560         return builder.build();
561     }
562
563     public static Eid asSrcDstEid(SourceDestKey sd, InstanceIdType vni) {
564         EidBuilder builder = new EidBuilder();
565         builder.setAddressType(SourceDestKeyLcaf.class);
566         builder.setVirtualNetworkId(vni);
567         builder.setAddress(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types
568                 .rev151105.lisp.address.address.SourceDestKeyBuilder().setSourceDestKey(sd).build());
569         return builder.build();
570     }
571
572     public static Rloc asTeLcafRloc(List<IpAddress> hopList) {
573         RlocBuilder teBuilder = new RlocBuilder();
574         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
575                 .lisp.address.address.ExplicitLocatorPathBuilder elpBuilder =
576                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105
577                 .lisp.address.address.ExplicitLocatorPathBuilder();
578         ExplicitLocatorPathBuilder teAddrBuilder = new ExplicitLocatorPathBuilder();
579         teAddrBuilder.setHop(new ArrayList<Hop>());
580         for (IpAddress hop : hopList) {
581             HopBuilder hopBuilder = new HopBuilder();
582             hopBuilder.setAddress(new SimpleAddress(hop));
583             hopBuilder.setHopId("Hop " + teAddrBuilder.getHop().size());
584             hopBuilder.setLrsBits(new LrsBits(false, false, false));
585             teAddrBuilder.getHop().add(hopBuilder.build());
586         }
587
588         elpBuilder.setExplicitLocatorPath(teAddrBuilder.build());
589         teBuilder.setAddress(elpBuilder.build());
590         teBuilder.setAddressType(ExplicitLocatorPathLcaf.class);
591         return teBuilder.build();
592     }
593
594     public static List<LocatorRecord> asLocatorRecords(List<Rloc> locators) {
595         List<LocatorRecord> locatorRecords = new ArrayList<LocatorRecord>();
596         for (Rloc locator : locators) {
597             LocatorRecordBuilder locatorBuilder = new LocatorRecordBuilder();
598             locatorBuilder.setLocalLocator(false).setRlocProbed(false).setWeight((short) 1).setPriority((short) 1)
599                     .setMulticastWeight((short) 1).setMulticastPriority((short) 1).setRouted(true)
600                     .setRloc(locator).setLocatorId("SFC_LISP").build();
601             locatorRecords.add(locatorBuilder.build());
602         }
603         return locatorRecords;
604     }
605
606     public static Eid getNoAddressEid() {
607         EidBuilder builder = new EidBuilder();
608         builder.setAddressType(NoAddressAfi.class);
609         builder.setVirtualNetworkId(null);
610         builder.setAddress(new NoAddressBuilder().setNoAddress(true).build());
611         return builder.build();
612     }
613
614     public static byte[] ipAddressToByteArray(Address addr) {
615         if (addr instanceof Ipv4) {
616             return InetAddresses.forString(((Ipv4) addr).getIpv4().getValue()).getAddress();
617         } else if (addr instanceof Ipv6) {
618             return InetAddresses.forString(((Ipv6) addr).getIpv6().getValue()).getAddress();
619         } else if (addr instanceof Ipv4Binary) {
620             return ((Ipv4Binary) addr).getIpv4Binary().getValue();
621         } else if (addr instanceof Ipv6Binary) {
622             return ((Ipv6Binary) addr).getIpv6Binary().getValue();
623         } else {
624             return null;
625         }
626     }
627
628     public static int compareIpAddressByteArrays(byte[] a, byte[] b) {
629         int i;
630         if (a.length < b.length) {
631             return -1;
632         } else if (a.length > b.length) {
633             return 1;
634         } else if (a.length == 4 && b.length == 4) {
635             for (i = 0; i < 4; i++) {
636                 if (a[i] < b[i]) {
637                     return -1;
638                 } else if (a[i] > b[i]) {
639                     return 1;
640                 }
641             }
642             return 0;
643         } else if (a.length == 16 && b.length == 16) {
644             for (i = 0; i < 16; i++) {
645                 if (a[i] < b[i]) {
646                     return -1;
647                 } else if (a[i] > b[i]) {
648                     return 1;
649                 }
650             }
651             return 0;
652         }
653         return 0;
654     }
655 }