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