X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FIPv4Address.hs;h=8c5d4837853cb3511f59c38049d98d29e5d144fb;hb=df31e221bd5df65c8d6d506fa84f84639f964d97;hp=3d6b1bbc2980107ae15d3d9da3ccd521b5cd2c9c;hpb=efae8ede78e938ce92379614428c498c4beccc44;p=hath.git diff --git a/src/IPv4Address.hs b/src/IPv4Address.hs index 3d6b1bb..8c5d483 100644 --- a/src/IPv4Address.hs +++ b/src/IPv4Address.hs @@ -1,52 +1,82 @@ -module IPv4Address where - -import Bit +module IPv4Address +( ipv4address_from_octets, + IPv4Address(None), + max_octet1, + max_octet2, + max_octet3, + max_octet4, + min_octet1, + min_octet2, + min_octet3, + min_octet4, + octet1, + octet2, + octet3, + octet4 +) + where + +import qualified Bit as B +import Maskbits import Octet -type Maskbits = Int - -data IPv4Address = IPv4Address { octet1 :: Octet, - octet2 :: Octet, - octet3 :: Octet, - octet4 :: Octet } +data IPv4Address = None | IPv4Address { octet1 :: Octet, + octet2 :: Octet, + octet3 :: Octet, + octet4 :: Octet } deriving (Eq, Show) +-- We don't export our constructor so this function is the only +-- way to construct an address from octets. As a result, we can +-- return IPv4Address.None in response to being passed one of more +-- Octet.None octets. +ipv4address_from_octets :: Octet -> Octet -> Octet -> Octet -> IPv4Address +ipv4address_from_octets oct1 oct2 oct3 oct4 + | or [oct1 == Octet.None, + oct2 == Octet.None, + oct3 == Octet.None, + oct4 == Octet.None] = IPv4Address.None + | otherwise = IPv4Address oct1 oct2 oct3 oct4 + + min_address :: IPv4Address -> Maskbits -> IPv4Address +min_address IPv4Address.None _ = IPv4Address.None +min_address _ Maskbits.None = IPv4Address.None min_address addr mask - | mask == 32 = IPv4Address oct1 oct2 oct3 oct4 - | mask == 31 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 a31 Zero) - | mask == 30 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 Zero Zero) - | mask == 29 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 Zero Zero Zero) - | mask == 28 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 Zero Zero Zero Zero) - | mask == 27 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 Zero Zero Zero Zero Zero) - | mask == 26 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 Zero Zero Zero Zero Zero Zero) - | mask == 25 = IPv4Address oct1 oct2 oct3 (Octet a25 Zero Zero Zero Zero Zero Zero Zero) - | mask == 24 = IPv4Address oct1 oct2 oct3 (min_octet) - | mask == 23 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 a23 Zero) (min_octet) - | mask == 22 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 Zero Zero) (min_octet) - | mask == 21 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 Zero Zero Zero) (min_octet) - | mask == 20 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 Zero Zero Zero Zero) (min_octet) - | mask == 19 = IPv4Address oct1 oct2 (Octet a17 a18 a19 Zero Zero Zero Zero Zero) (min_octet) - | mask == 18 = IPv4Address oct1 oct2 (Octet a17 a18 Zero Zero Zero Zero Zero Zero) (min_octet) - | mask == 17 = IPv4Address oct1 oct2 (Octet a17 Zero Zero Zero Zero Zero Zero Zero) (min_octet) - | mask == 16 = IPv4Address oct1 oct2 (min_octet) (min_octet) - | mask == 15 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 a15 Zero) (min_octet) (min_octet) - | mask == 14 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 Zero Zero) (min_octet) (min_octet) - | mask == 13 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 Zero Zero Zero) (min_octet) (min_octet) - | mask == 12 = IPv4Address oct1 (Octet a9 a10 a11 a12 Zero Zero Zero Zero) (min_octet) (min_octet) - | mask == 11 = IPv4Address oct1 (Octet a9 a10 a11 Zero Zero Zero Zero Zero) (min_octet) (min_octet) - | mask == 10 = IPv4Address oct1 (Octet a9 a10 Zero Zero Zero Zero Zero Zero) (min_octet) (min_octet) - | mask == 9 = IPv4Address oct1 (Octet a9 Zero Zero Zero Zero Zero Zero Zero) (min_octet) (min_octet) - | mask == 8 = IPv4Address oct1 (min_octet) (min_octet) (min_octet) - | mask == 7 = IPv4Address (Octet a1 a2 a3 a4 a5 a6 a7 Zero) (min_octet) (min_octet) (min_octet) - | mask == 6 = IPv4Address (Octet a1 a2 a3 a4 a5 a6 Zero Zero) (min_octet) (min_octet) (min_octet) - | mask == 5 = IPv4Address (Octet a1 a2 a3 a4 a5 Zero Zero Zero) (min_octet) (min_octet) (min_octet) - | mask == 4 = IPv4Address (Octet a1 a2 a3 a4 Zero Zero Zero Zero) (min_octet) (min_octet) (min_octet) - | mask == 3 = IPv4Address (Octet a1 a2 a3 Zero Zero Zero Zero Zero) (min_octet) (min_octet) (min_octet) - | mask == 2 = IPv4Address (Octet a1 a2 Zero Zero Zero Zero Zero Zero) (min_octet) (min_octet) (min_octet) - | mask == 1 = IPv4Address (Octet a1 Zero Zero Zero Zero Zero Zero Zero) (min_octet) (min_octet) (min_octet) - | mask == 0 = IPv4Address (min_octet) (min_octet) (min_octet) (min_octet) + | mask == ThirtyTwo = IPv4Address oct1 oct2 oct3 oct4 + | mask == ThirtyOne = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 a31 B.Zero) + | mask == Thirty = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 B.Zero B.Zero) + | mask == TwentyNine = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 B.Zero B.Zero B.Zero) + | mask == TwentyEight = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 B.Zero B.Zero B.Zero B.Zero) + | mask == TwentySeven = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 B.Zero B.Zero B.Zero B.Zero B.Zero) + | mask == TwentySix = IPv4Address oct1 oct2 oct3 (Octet a25 a26 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero) + | mask == TwentyFive = IPv4Address oct1 oct2 oct3 (Octet a25 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero) + | mask == TwentyFour = IPv4Address oct1 oct2 oct3 (min_octet) + | mask == TwentyThree = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 a23 B.Zero) (min_octet) + | mask == TwentyTwo = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 B.Zero B.Zero) (min_octet) + | mask == TwentyOne = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 B.Zero B.Zero B.Zero) (min_octet) + | mask == Twenty = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 B.Zero B.Zero B.Zero B.Zero) (min_octet) + | mask == Nineteen = IPv4Address oct1 oct2 (Octet a17 a18 a19 B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet) + | mask == Eighteen = IPv4Address oct1 oct2 (Octet a17 a18 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet) + | mask == Seventeen = IPv4Address oct1 oct2 (Octet a17 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet) + | mask == Sixteen = IPv4Address oct1 oct2 (min_octet) (min_octet) + | mask == Fifteen = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 a15 B.Zero) (min_octet) (min_octet) + | mask == Fourteen = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 B.Zero B.Zero) (min_octet) (min_octet) + | mask == Thirteen = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 B.Zero B.Zero B.Zero) (min_octet) (min_octet) + | mask == Twelve = IPv4Address oct1 (Octet a9 a10 a11 a12 B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet) + | mask == Eleven = IPv4Address oct1 (Octet a9 a10 a11 B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet) + | mask == Ten = IPv4Address oct1 (Octet a9 a10 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet) + | mask == Nine = IPv4Address oct1 (Octet a9 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet) + | mask == Eight = IPv4Address oct1 (min_octet) (min_octet) (min_octet) + | mask == Seven = IPv4Address (Octet a1 a2 a3 a4 a5 a6 a7 B.Zero) (min_octet) (min_octet) (min_octet) + | mask == Six = IPv4Address (Octet a1 a2 a3 a4 a5 a6 B.Zero B.Zero) (min_octet) (min_octet) (min_octet) + | mask == Five = IPv4Address (Octet a1 a2 a3 a4 a5 B.Zero B.Zero B.Zero) (min_octet) (min_octet) (min_octet) + | mask == Four = IPv4Address (Octet a1 a2 a3 a4 B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet) (min_octet) + | mask == Three = IPv4Address (Octet a1 a2 a3 B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet) (min_octet) + | mask == Two = IPv4Address (Octet a1 a2 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet) (min_octet) + | mask == One = IPv4Address (Octet a1 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet) (min_octet) + | mask == Zero = IPv4Address (min_octet) (min_octet) (min_octet) (min_octet) | otherwise = addr where a1 = (b1 oct1) @@ -85,40 +115,42 @@ min_address addr mask max_address :: IPv4Address -> Maskbits -> IPv4Address +max_address IPv4Address.None _ = IPv4Address.None +max_address _ Maskbits.None = IPv4Address.None max_address addr mask - | mask == 32 = IPv4Address oct1 oct2 oct3 oct4 - | mask == 31 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 a31 One) - | mask == 30 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 One One) - | mask == 29 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 One One One) - | mask == 28 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 One One One One) - | mask == 27 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 One One One One One) - | mask == 26 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 One One One One One One) - | mask == 25 = IPv4Address oct1 oct2 oct3 (Octet a25 One One One One One One One) - | mask == 24 = IPv4Address oct1 oct2 oct3 (max_octet) - | mask == 23 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 a23 One) (max_octet) - | mask == 22 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 One One) (max_octet) - | mask == 21 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 One One One) (max_octet) - | mask == 20 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 One One One One) (max_octet) - | mask == 19 = IPv4Address oct1 oct2 (Octet a17 a18 a19 One One One One One) (max_octet) - | mask == 18 = IPv4Address oct1 oct2 (Octet a17 a18 One One One One One One) (max_octet) - | mask == 17 = IPv4Address oct1 oct2 (Octet a17 One One One One One One One) (max_octet) - | mask == 16 = IPv4Address oct1 oct2 (max_octet) (max_octet) - | mask == 15 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 a15 One) (max_octet) (max_octet) - | mask == 14 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 One One) (max_octet) (max_octet) - | mask == 13 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 One One One) (max_octet) (max_octet) - | mask == 12 = IPv4Address oct1 (Octet a9 a10 a11 a12 One One One One) (max_octet) (max_octet) - | mask == 11 = IPv4Address oct1 (Octet a9 a10 a11 One One One One One) (max_octet) (max_octet) - | mask == 10 = IPv4Address oct1 (Octet a9 a10 One One One One One One) (max_octet) (max_octet) - | mask == 9 = IPv4Address oct1 (Octet a9 One One One One One One One) (max_octet) (max_octet) - | mask == 8 = IPv4Address oct1 (max_octet) (max_octet) (max_octet) - | mask == 7 = IPv4Address (Octet a1 a2 a3 a4 a5 a6 a7 One) (max_octet) (max_octet) (max_octet) - | mask == 6 = IPv4Address (Octet a1 a2 a3 a4 a5 a6 One One) (max_octet) (max_octet) (max_octet) - | mask == 5 = IPv4Address (Octet a1 a2 a3 a4 a5 One One One) (max_octet) (max_octet) (max_octet) - | mask == 4 = IPv4Address (Octet a1 a2 a3 a4 One One One One) (max_octet) (max_octet) (max_octet) - | mask == 3 = IPv4Address (Octet a1 a2 a3 One One One One One) (max_octet) (max_octet) (max_octet) - | mask == 2 = IPv4Address (Octet a1 a2 One One One One One One) (max_octet) (max_octet) (max_octet) - | mask == 1 = IPv4Address (Octet a1 One One One One One One One) (max_octet) (max_octet) (max_octet) - | mask == 0 = IPv4Address (max_octet) (max_octet) (max_octet) (max_octet) + | mask == ThirtyTwo = IPv4Address oct1 oct2 oct3 oct4 + | mask == ThirtyOne = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 a31 B.One) + | mask == Thirty = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 B.One B.One) + | mask == TwentyNine = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 B.One B.One B.One) + | mask == TwentyEight = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 B.One B.One B.One B.One) + | mask == TwentySeven = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 B.One B.One B.One B.One B.One) + | mask == TwentySix = IPv4Address oct1 oct2 oct3 (Octet a25 a26 B.One B.One B.One B.One B.One B.One) + | mask == TwentyFive = IPv4Address oct1 oct2 oct3 (Octet a25 B.One B.One B.One B.One B.One B.One B.One) + | mask == TwentyFour = IPv4Address oct1 oct2 oct3 (max_octet) + | mask == TwentyThree = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 a23 B.One) (max_octet) + | mask == TwentyTwo = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 B.One B.One) (max_octet) + | mask == TwentyOne = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 B.One B.One B.One) (max_octet) + | mask == Twenty = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 B.One B.One B.One B.One) (max_octet) + | mask == Nineteen = IPv4Address oct1 oct2 (Octet a17 a18 a19 B.One B.One B.One B.One B.One) (max_octet) + | mask == Eighteen = IPv4Address oct1 oct2 (Octet a17 a18 B.One B.One B.One B.One B.One B.One) (max_octet) + | mask == Seventeen = IPv4Address oct1 oct2 (Octet a17 B.One B.One B.One B.One B.One B.One B.One) (max_octet) + | mask == Sixteen = IPv4Address oct1 oct2 (max_octet) (max_octet) + | mask == Fifteen = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 a15 B.One) (max_octet) (max_octet) + | mask == Fourteen = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 B.One B.One) (max_octet) (max_octet) + | mask == Thirteen = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 B.One B.One B.One) (max_octet) (max_octet) + | mask == Twelve = IPv4Address oct1 (Octet a9 a10 a11 a12 B.One B.One B.One B.One) (max_octet) (max_octet) + | mask == Eleven = IPv4Address oct1 (Octet a9 a10 a11 B.One B.One B.One B.One B.One) (max_octet) (max_octet) + | mask == Ten = IPv4Address oct1 (Octet a9 a10 B.One B.One B.One B.One B.One B.One) (max_octet) (max_octet) + | mask == Nine = IPv4Address oct1 (Octet a9 B.One B.One B.One B.One B.One B.One B.One) (max_octet) (max_octet) + | mask == Eight = IPv4Address oct1 (max_octet) (max_octet) (max_octet) + | mask == Seven = IPv4Address (Octet a1 a2 a3 a4 a5 a6 a7 B.One) (max_octet) (max_octet) (max_octet) + | mask == Six = IPv4Address (Octet a1 a2 a3 a4 a5 a6 B.One B.One) (max_octet) (max_octet) (max_octet) + | mask == Five = IPv4Address (Octet a1 a2 a3 a4 a5 B.One B.One B.One) (max_octet) (max_octet) (max_octet) + | mask == Four = IPv4Address (Octet a1 a2 a3 a4 B.One B.One B.One B.One) (max_octet) (max_octet) (max_octet) + | mask == Three = IPv4Address (Octet a1 a2 a3 B.One B.One B.One B.One B.One) (max_octet) (max_octet) (max_octet) + | mask == Two = IPv4Address (Octet a1 a2 B.One B.One B.One B.One B.One B.One) (max_octet) (max_octet) (max_octet) + | mask == One = IPv4Address (Octet a1 B.One B.One B.One B.One B.One B.One B.One) (max_octet) (max_octet) (max_octet) + | mask == Zero = IPv4Address (max_octet) (max_octet) (max_octet) (max_octet) | otherwise = addr where a1 = (b1 oct1)