Reorganize mappingservice.implementation
[lispflowmapping.git] / mappingservice / implementation / src / main / java / org / opendaylight / lispflowmapping / implementation / util / MaskUtil.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.implementation.util;
9
10 import java.net.Inet4Address;
11 import java.net.Inet6Address;
12 import java.net.InetAddress;
13 import java.net.UnknownHostException;
14 import java.nio.ByteBuffer;
15
16 import org.apache.commons.lang3.exception.ExceptionUtils;
17 import org.opendaylight.lispflowmapping.lisp.util.LispAFIConvertor;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.LispAFIAddress;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.lcafsegmentaddress.AddressBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.lcafsegmentaddress.Address;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.lispaddress.lispaddresscontainer.address.ipv4.Ipv4Address;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.lispaddress.lispaddresscontainer.address.ipv6.Ipv6Address;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.lispaddress.lispaddresscontainer.address.lcafsegment.LcafSegmentAddr;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.lispaddress.lispaddresscontainer.address.lcafsegment.LcafSegmentAddrBuilder;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27
28 public class MaskUtil {
29     private static final Logger LOG = LoggerFactory.getLogger(MaskUtil.class);
30     public static boolean isMaskable(LispAFIAddress address) {
31         if (address instanceof Ipv4Address || address instanceof Ipv6Address
32                 || address instanceof LcafSegmentAddr) {
33             return true;
34         }
35         return false;
36     }
37
38     public static LispAFIAddress normalize(LispAFIAddress address, int mask) {
39         try {
40             if (address instanceof Ipv4Address) {
41                 return LispAFIConvertor.asIPAfiAddress(normalizeIP(Inet4Address.getByName(((Ipv4Address) address)
42                         .getIpv4Address().getValue()), mask).getHostAddress());
43             } else if (address instanceof Ipv6Address) {
44                 return  LispAFIConvertor.asIPv6AfiAddress(normalizeIP(Inet6Address.getByName(((Ipv6Address) address)
45                         .getIpv6Address().getValue()), mask).getHostAddress());
46             } else if (address instanceof LcafSegmentAddr) {
47                 LcafSegmentAddr segAddr = (LcafSegmentAddr) address;
48                 Address normalizedAddr = new AddressBuilder().setPrimitiveAddress(LispAFIConvertor.toPrimitive(
49                         normalizeIpAddress(LispAFIConvertor.toAFIfromPrimitive(segAddr.getAddress()
50                         .getPrimitiveAddress()), mask))).build();
51                 return new LcafSegmentAddrBuilder(segAddr).setAddress(normalizedAddr).build();
52             }
53         } catch (UnknownHostException e) {
54             LOG.trace("Failed to normalize " + address + ": " + ExceptionUtils.getStackTrace(e));
55             return null;
56         }
57         return null;
58     }
59
60     private static LispAFIAddress normalizeIpAddress(LispAFIAddress address, int mask) throws UnknownHostException {
61         if (address instanceof Ipv4Address) {
62             return LispAFIConvertor.asIPAfiAddress(normalizeIP(Inet4Address.getByName(((Ipv4Address) address)
63                     .getIpv4Address().getValue()), mask).getHostAddress());
64         } else if (address instanceof Ipv6Address) {
65             return  LispAFIConvertor.asIPv6AfiAddress(normalizeIP(Inet6Address.getByName(((Ipv6Address) address)
66                     .getIpv6Address().getValue()), mask).getHostAddress());
67         }
68         throw new UnknownHostException("Address + " + address + " not an IPv4 or IPv6 address");
69     }
70
71     private static InetAddress normalizeIP(InetAddress address, int mask) throws UnknownHostException {
72         ByteBuffer byteRepresentation = ByteBuffer.wrap(address.getAddress());
73         byte b = (byte) 0xff;
74         for (int i = 0; i < byteRepresentation.array().length; i++) {
75             if (mask >= 8)
76                 byteRepresentation.put(i, (byte) (b & byteRepresentation.get(i)));
77
78             else if (mask > 0) {
79                 byteRepresentation.put(i, (byte) ((byte) (b << (8 - mask)) & byteRepresentation.get(i)));
80             } else {
81                 byteRepresentation.put(i, (byte) (0 & byteRepresentation.get(i)));
82             }
83
84             mask -= 8;
85         }
86         return InetAddress.getByAddress(byteRepresentation.array());
87     }
88
89     public static int getMaxMask(LispAFIAddress address) {
90         if (address instanceof Ipv4Address) {
91             return 32;
92         }
93         if (address instanceof Ipv6Address) {
94             return 128;
95         }
96         return -1;
97     }
98
99     public static byte getMaxMaskForAfi(int afi) {
100         if (afi == 1) {
101             return (byte) 32;
102         } else if (afi == 2){
103             return (byte) 128;
104         } else {
105             return (byte) -1;
106         }
107     }
108 }