1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.server.dhcp.store;
21
22
23 import java.net.InetAddress;
24 import java.net.UnknownHostException;
25 import java.util.Arrays;
26
27
28
29
30
31
32
33
34 public class Subnet extends DhcpConfigElement
35 {
36
37 private final InetAddress address;
38
39
40 private final InetAddress netmask;
41
42
43 private InetAddress rangeMin;
44
45
46 private InetAddress rangeMax;
47
48
49 public Subnet(InetAddress address, InetAddress netmask, InetAddress rangeMin, InetAddress rangeMax)
50 {
51
52 byte masked[] = netmask.getAddress();
53 byte addrBytes[] = netmask.getAddress();
54 for ( int i = 0; i < addrBytes.length; i++ )
55 masked[i] &= addrBytes[i];
56
57 if ( !Arrays.equals( masked, addrBytes ) )
58 try
59 {
60 address = InetAddress.getByAddress( masked );
61 }
62 catch ( UnknownHostException e )
63 {
64
65 }
66
67 this.address = address;
68 this.netmask = netmask;
69 this.rangeMin = rangeMin;
70 this.rangeMax = rangeMax;
71 }
72
73
74 public InetAddress getAddress()
75 {
76 return address;
77 }
78
79
80 public InetAddress getNetmask()
81 {
82 return netmask;
83 }
84
85
86 public InetAddress getRangeMax()
87 {
88 return rangeMax;
89 }
90
91
92 public void setRangeMax( InetAddress rangeMax )
93 {
94 this.rangeMax = rangeMax;
95 }
96
97
98 public InetAddress getRangeMin()
99 {
100 return rangeMin;
101 }
102
103
104 public void setRangeMin( InetAddress rangeMin )
105 {
106 this.rangeMin = rangeMin;
107 }
108
109
110
111
112
113
114
115
116
117 public boolean contains( InetAddress clientAddress )
118 {
119
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
134
135
136
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 }