]> gitweb.michael.orlitzky.com - hath.git/blob - src/IPv4Address.hs
Added three new modules which are currently independent of the rest of the code:...
[hath.git] / src / IPv4Address.hs
1 module IPv4Address (
2 IPv4Address,
3 ipv4address_from_string,
4 min_octet1,
5 min_octet2,
6 min_octet3,
7 min_octet4,
8 max_octet1,
9 max_octet2,
10 max_octet3,
11 max_octet4
12 ) where
13
14 import Bit
15 import Octet
16
17 type Maskbits = Int
18
19 data IPv4Address = IPv4Address { octet1 :: Octet,
20 octet2 :: Octet,
21 octet3 :: Octet,
22 octet4 :: Octet }
23 deriving (Eq, Show)
24
25
26 default_ipv4address :: IPv4Address
27 default_ipv4address = IPv4Address (min_octet) (min_octet) (min_octet) (min_octet)
28
29
30 ipv4address_from_string :: String -> IPv4Address
31 ipv4address_from_string s
32 | length s < 32 = default_ipv4address
33 | otherwise = IPv4Address (Octet a1 a2 a3 a4 a5 a6 a7 a8) (Octet a9 a10 a11 a12 a13 a14 a15 a16)(Octet a17 a18 a19 a20 a21 a22 a23 a24) (Octet a25 a26 a27 a28 a29 a30 a31 a32)
34 where
35 a1 = bit_from_char (s !! 0)
36 a2 = bit_from_char (s !! 1)
37 a3 = bit_from_char (s !! 2)
38 a4 = bit_from_char (s !! 3)
39 a5 = bit_from_char (s !! 4)
40 a6 = bit_from_char (s !! 5)
41 a7 = bit_from_char (s !! 6)
42 a8 = bit_from_char (s !! 7)
43 a9 = bit_from_char (s !! 8)
44 a10 = bit_from_char (s !! 9)
45 a11 = bit_from_char (s !! 10)
46 a12 = bit_from_char (s !! 11)
47 a13 = bit_from_char (s !! 12)
48 a14 = bit_from_char (s !! 13)
49 a15 = bit_from_char (s !! 14)
50 a16 = bit_from_char (s !! 15)
51 a17 = bit_from_char (s !! 16)
52 a18 = bit_from_char (s !! 17)
53 a19 = bit_from_char (s !! 18)
54 a20 = bit_from_char (s !! 19)
55 a21 = bit_from_char (s !! 20)
56 a22 = bit_from_char (s !! 21)
57 a23 = bit_from_char (s !! 22)
58 a24 = bit_from_char (s !! 23)
59 a25 = bit_from_char (s !! 24)
60 a26 = bit_from_char (s !! 25)
61 a27 = bit_from_char (s !! 26)
62 a28 = bit_from_char (s !! 27)
63 a29 = bit_from_char (s !! 28)
64 a30 = bit_from_char (s !! 29)
65 a31 = bit_from_char (s !! 30)
66 a32 = bit_from_char (s !! 31)
67
68
69 min_address :: IPv4Address -> Maskbits -> IPv4Address
70 min_address addr mask
71 | mask == 32 = IPv4Address oct1 oct2 oct3 oct4
72 | mask == 31 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 a31 Zero)
73 | mask == 30 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 Zero Zero)
74 | mask == 29 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 Zero Zero Zero)
75 | mask == 28 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 Zero Zero Zero Zero)
76 | mask == 27 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 Zero Zero Zero Zero Zero)
77 | mask == 26 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 Zero Zero Zero Zero Zero Zero)
78 | mask == 25 = IPv4Address oct1 oct2 oct3 (Octet a25 Zero Zero Zero Zero Zero Zero Zero)
79 | mask == 24 = IPv4Address oct1 oct2 oct3 (min_octet)
80 | mask == 23 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 a23 Zero) (min_octet)
81 | mask == 22 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 Zero Zero) (min_octet)
82 | mask == 21 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 Zero Zero Zero) (min_octet)
83 | mask == 20 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 Zero Zero Zero Zero) (min_octet)
84 | mask == 19 = IPv4Address oct1 oct2 (Octet a17 a18 a19 Zero Zero Zero Zero Zero) (min_octet)
85 | mask == 18 = IPv4Address oct1 oct2 (Octet a17 a18 Zero Zero Zero Zero Zero Zero) (min_octet)
86 | mask == 17 = IPv4Address oct1 oct2 (Octet a17 Zero Zero Zero Zero Zero Zero Zero) (min_octet)
87 | mask == 16 = IPv4Address oct1 oct2 (min_octet) (min_octet)
88 | mask == 15 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 a15 Zero) (min_octet) (min_octet)
89 | mask == 14 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 Zero Zero) (min_octet) (min_octet)
90 | mask == 13 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 Zero Zero Zero) (min_octet) (min_octet)
91 | mask == 12 = IPv4Address oct1 (Octet a9 a10 a11 a12 Zero Zero Zero Zero) (min_octet) (min_octet)
92 | mask == 11 = IPv4Address oct1 (Octet a9 a10 a11 Zero Zero Zero Zero Zero) (min_octet) (min_octet)
93 | mask == 10 = IPv4Address oct1 (Octet a9 a10 Zero Zero Zero Zero Zero Zero) (min_octet) (min_octet)
94 | mask == 9 = IPv4Address oct1 (Octet a9 Zero Zero Zero Zero Zero Zero Zero) (min_octet) (min_octet)
95 | mask == 8 = IPv4Address oct1 (min_octet) (min_octet) (min_octet)
96 | mask == 7 = IPv4Address (Octet a1 a2 a3 a4 a5 a6 a7 Zero) (min_octet) (min_octet) (min_octet)
97 | mask == 6 = IPv4Address (Octet a1 a2 a3 a4 a5 a6 Zero Zero) (min_octet) (min_octet) (min_octet)
98 | mask == 5 = IPv4Address (Octet a1 a2 a3 a4 a5 Zero Zero Zero) (min_octet) (min_octet) (min_octet)
99 | mask == 4 = IPv4Address (Octet a1 a2 a3 a4 Zero Zero Zero Zero) (min_octet) (min_octet) (min_octet)
100 | mask == 3 = IPv4Address (Octet a1 a2 a3 Zero Zero Zero Zero Zero) (min_octet) (min_octet) (min_octet)
101 | mask == 2 = IPv4Address (Octet a1 a2 Zero Zero Zero Zero Zero Zero) (min_octet) (min_octet) (min_octet)
102 | mask == 1 = IPv4Address (Octet a1 Zero Zero Zero Zero Zero Zero Zero) (min_octet) (min_octet) (min_octet)
103 | mask == 0 = IPv4Address (min_octet) (min_octet) (min_octet) (min_octet)
104 | otherwise = addr
105 where
106 a1 = (b1 oct1)
107 a2 = (b2 oct1)
108 a3 = (b3 oct1)
109 a4 = (b4 oct1)
110 a5 = (b5 oct1)
111 a6 = (b6 oct1)
112 a7 = (b7 oct1)
113 a9 = (b1 oct2)
114 a10 = (b2 oct2)
115 a11 = (b3 oct2)
116 a12 = (b4 oct2)
117 a13 = (b5 oct2)
118 a14 = (b6 oct2)
119 a15 = (b7 oct2)
120 a17 = (b1 oct3)
121 a18 = (b2 oct3)
122 a19 = (b3 oct3)
123 a20 = (b4 oct3)
124 a21 = (b5 oct3)
125 a22 = (b6 oct3)
126 a23 = (b7 oct3)
127 a25 = (b1 oct4)
128 a26 = (b2 oct4)
129 a27 = (b3 oct4)
130 a28 = (b4 oct4)
131 a29 = (b5 oct4)
132 a30 = (b6 oct4)
133 a31 = (b7 oct4)
134 oct1 = (octet1 addr)
135 oct2 = (octet2 addr)
136 oct3 = (octet3 addr)
137 oct4 = (octet4 addr)
138
139
140
141 max_address :: IPv4Address -> Maskbits -> IPv4Address
142 max_address addr mask
143 | mask == 32 = IPv4Address oct1 oct2 oct3 oct4
144 | mask == 31 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 a31 One)
145 | mask == 30 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 One One)
146 | mask == 29 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 One One One)
147 | mask == 28 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 One One One One)
148 | mask == 27 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 One One One One One)
149 | mask == 26 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 One One One One One One)
150 | mask == 25 = IPv4Address oct1 oct2 oct3 (Octet a25 One One One One One One One)
151 | mask == 24 = IPv4Address oct1 oct2 oct3 (max_octet)
152 | mask == 23 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 a23 One) (max_octet)
153 | mask == 22 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 One One) (max_octet)
154 | mask == 21 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 One One One) (max_octet)
155 | mask == 20 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 One One One One) (max_octet)
156 | mask == 19 = IPv4Address oct1 oct2 (Octet a17 a18 a19 One One One One One) (max_octet)
157 | mask == 18 = IPv4Address oct1 oct2 (Octet a17 a18 One One One One One One) (max_octet)
158 | mask == 17 = IPv4Address oct1 oct2 (Octet a17 One One One One One One One) (max_octet)
159 | mask == 16 = IPv4Address oct1 oct2 (max_octet) (max_octet)
160 | mask == 15 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 a15 One) (max_octet) (max_octet)
161 | mask == 14 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 One One) (max_octet) (max_octet)
162 | mask == 13 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 One One One) (max_octet) (max_octet)
163 | mask == 12 = IPv4Address oct1 (Octet a9 a10 a11 a12 One One One One) (max_octet) (max_octet)
164 | mask == 11 = IPv4Address oct1 (Octet a9 a10 a11 One One One One One) (max_octet) (max_octet)
165 | mask == 10 = IPv4Address oct1 (Octet a9 a10 One One One One One One) (max_octet) (max_octet)
166 | mask == 9 = IPv4Address oct1 (Octet a9 One One One One One One One) (max_octet) (max_octet)
167 | mask == 8 = IPv4Address oct1 (max_octet) (max_octet) (max_octet)
168 | mask == 7 = IPv4Address (Octet a1 a2 a3 a4 a5 a6 a7 One) (max_octet) (max_octet) (max_octet)
169 | mask == 6 = IPv4Address (Octet a1 a2 a3 a4 a5 a6 One One) (max_octet) (max_octet) (max_octet)
170 | mask == 5 = IPv4Address (Octet a1 a2 a3 a4 a5 One One One) (max_octet) (max_octet) (max_octet)
171 | mask == 4 = IPv4Address (Octet a1 a2 a3 a4 One One One One) (max_octet) (max_octet) (max_octet)
172 | mask == 3 = IPv4Address (Octet a1 a2 a3 One One One One One) (max_octet) (max_octet) (max_octet)
173 | mask == 2 = IPv4Address (Octet a1 a2 One One One One One One) (max_octet) (max_octet) (max_octet)
174 | mask == 1 = IPv4Address (Octet a1 One One One One One One One) (max_octet) (max_octet) (max_octet)
175 | mask == 0 = IPv4Address (max_octet) (max_octet) (max_octet) (max_octet)
176 | otherwise = addr
177 where
178 a1 = (b1 oct1)
179 a2 = (b2 oct1)
180 a3 = (b3 oct1)
181 a4 = (b4 oct1)
182 a5 = (b5 oct1)
183 a6 = (b6 oct1)
184 a7 = (b7 oct1)
185 a9 = (b1 oct2)
186 a10 = (b2 oct2)
187 a11 = (b3 oct2)
188 a12 = (b4 oct2)
189 a13 = (b5 oct2)
190 a14 = (b6 oct2)
191 a15 = (b7 oct2)
192 a17 = (b1 oct3)
193 a18 = (b2 oct3)
194 a19 = (b3 oct3)
195 a20 = (b4 oct3)
196 a21 = (b5 oct3)
197 a22 = (b6 oct3)
198 a23 = (b7 oct3)
199 a25 = (b1 oct4)
200 a26 = (b2 oct4)
201 a27 = (b3 oct4)
202 a28 = (b4 oct4)
203 a29 = (b5 oct4)
204 a30 = (b6 oct4)
205 a31 = (b7 oct4)
206 oct1 = (octet1 addr)
207 oct2 = (octet2 addr)
208 oct3 = (octet3 addr)
209 oct4 = (octet4 addr)
210
211
212
213 min_octet1 :: IPv4Address -> Maskbits -> Octet
214 min_octet1 addr mask = octet1 (min_address addr mask)
215
216 min_octet2 :: IPv4Address -> Maskbits -> Octet
217 min_octet2 addr mask = octet2 (min_address addr mask)
218
219 min_octet3 :: IPv4Address -> Maskbits -> Octet
220 min_octet3 addr mask = octet3 (min_address addr mask)
221
222 min_octet4 :: IPv4Address -> Maskbits -> Octet
223 min_octet4 addr mask = octet4 (min_address addr mask)
224
225 max_octet1 :: IPv4Address -> Maskbits -> Octet
226 max_octet1 addr mask = octet1 (max_address addr mask)
227
228 max_octet2 :: IPv4Address -> Maskbits -> Octet
229 max_octet2 addr mask = octet2 (max_address addr mask)
230
231 max_octet3 :: IPv4Address -> Maskbits -> Octet
232 max_octet3 addr mask = octet3 (max_address addr mask)
233
234 max_octet4 :: IPv4Address -> Maskbits -> Octet
235 max_octet4 addr mask = octet4 (max_address addr mask)