001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 *
019 */
020 package org.apache.directory.server.dhcp.store;
021
022
023 import java.net.InetAddress;
024 import java.net.UnknownHostException;
025 import java.util.Arrays;
026
027
028 /**
029 * The definition of a Subnet.
030 *
031 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
032 * @version $Rev: 545042 $, $Date: 2007-06-06 22:32:01 -0500 (Mi, 06 Jun 2007) $
033 */
034 public class Subnet extends DhcpConfigElement
035 {
036 /** the subnet's address */
037 private final InetAddress address;
038
039 /** the subnet's netmask */
040 private final InetAddress netmask;
041
042 /** the subnet's range: minimum address in range */
043 private InetAddress rangeMin;
044
045 /** the subnet's range: maximum address in range */
046 private InetAddress rangeMax;
047
048
049 public Subnet(InetAddress address, InetAddress netmask, InetAddress rangeMin, InetAddress rangeMax)
050 {
051 // mask address to match subnet
052 byte masked[] = netmask.getAddress();
053 byte addrBytes[] = netmask.getAddress();
054 for ( int i = 0; i < addrBytes.length; i++ )
055 masked[i] &= addrBytes[i];
056
057 if ( !Arrays.equals( masked, addrBytes ) )
058 try
059 {
060 address = InetAddress.getByAddress( masked );
061 }
062 catch ( UnknownHostException e )
063 {
064 // ignore - doesn't happen.
065 }
066
067 this.address = address;
068 this.netmask = netmask;
069 this.rangeMin = rangeMin;
070 this.rangeMax = rangeMax;
071 }
072
073
074 public InetAddress getAddress()
075 {
076 return address;
077 }
078
079
080 public InetAddress getNetmask()
081 {
082 return netmask;
083 }
084
085
086 public InetAddress getRangeMax()
087 {
088 return rangeMax;
089 }
090
091
092 public void setRangeMax( InetAddress rangeMax )
093 {
094 this.rangeMax = rangeMax;
095 }
096
097
098 public InetAddress getRangeMin()
099 {
100 return rangeMin;
101 }
102
103
104 public void setRangeMin( InetAddress rangeMin )
105 {
106 this.rangeMin = rangeMin;
107 }
108
109
110 /**
111 * Check whether the given client address resides within this subnet and
112 * possibly range.
113 *
114 * @param clientAddress
115 * @return boolean
116 */
117 public boolean contains( InetAddress clientAddress )
118 {
119 // check address type
120 if ( !clientAddress.getClass().equals( address.getClass() ) )
121 return false;
122
123 byte client[] = clientAddress.getAddress();
124 byte masked[] = netmask.getAddress();
125 for ( int i = 0; i < masked.length; i++ )
126 masked[i] &= client[i];
127
128 return Arrays.equals( masked, address.getAddress() );
129 }
130
131
132 /**
133 * Check whether the specified address is within the range for this subnet.
134 *
135 * @param clientAddress
136 * @return boolean
137 */
138 public boolean isInRange( InetAddress clientAddress )
139 {
140 byte client[] = clientAddress.getAddress();
141 byte masked[] = netmask.getAddress();
142 for ( int i = 0; i < masked.length; i++ )
143 masked[i] &= client[i];
144
145 if ( null != rangeMin )
146 if ( arrayComp( masked, rangeMin.getAddress() ) < 0 )
147 return false;
148
149 if ( null != rangeMin )
150 if ( arrayComp( masked, rangeMax.getAddress() ) > 0 )
151 return false;
152
153 return true;
154 }
155
156
157 private static int arrayComp( byte a1[], byte a2[] )
158 {
159 for ( int i = 0; i < a1.length && i < a2.length; i++ )
160 {
161 if ( a1[i] != a2[i] )
162 return ( a1[i] & 0xff ) - ( a2[i] & 0xff );
163 }
164
165 return a1.length - a2.length;
166 }
167 }