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