X-Git-Url: https://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FIPv4Address.hs;h=6153d282a681305bdcd8a83848ebe16ed40de9ba;hb=e8b41784eaa68049f7a7354916c9c9920050db70;hp=e72dd592ee1c2f1ad8a3fe5dad6fe26fc43701b1;hpb=041d33c0e5ac9c0e9733f42cd96aa2fba07a043f;p=hath.git diff --git a/src/IPv4Address.hs b/src/IPv4Address.hs index e72dd59..6153d28 100644 --- a/src/IPv4Address.hs +++ b/src/IPv4Address.hs @@ -1,16 +1,12 @@ module IPv4Address -( ipv4address_from_octets, - ipv4address_tests, - IPv4Address(None), +( ipv4address_tests, + IPv4Address(..), max_address, min_address, most_sig_bit_different, - octet1, - octet2, - octet3, - octet4 ) where +import Data.Maybe (fromJust) import Test.HUnit import Test.QuickCheck @@ -18,154 +14,142 @@ import Maskable import Maskbits import Octet -data IPv4Address = None | IPv4Address { octet1 :: Octet, - octet2 :: Octet, - octet3 :: Octet, - octet4 :: Octet } - deriving (Eq) +data IPv4Address = + IPv4Address { octet1 :: Octet, + octet2 :: Octet, + octet3 :: Octet, + octet4 :: Octet } + deriving (Eq) instance Show IPv4Address where - show IPv4Address.None = "None" - show addr = concat [(show oct1) ++ ".", - (show oct2) ++ ".", - (show oct3) ++ ".", - (show oct4)] - where - oct1 = (octet1 addr) - oct2 = (octet2 addr) - oct3 = (octet3 addr) - oct4 = (octet4 addr) + show addr = concat [(show oct1) ++ ".", + (show oct2) ++ ".", + (show oct3) ++ ".", + (show oct4)] + where + oct1 = (octet1 addr) + oct2 = (octet2 addr) + oct3 = (octet3 addr) + oct4 = (octet4 addr) instance Arbitrary IPv4Address where - arbitrary = do - oct1 <- arbitrary :: Gen Octet - oct2 <- arbitrary :: Gen Octet - oct3 <- arbitrary :: Gen Octet - oct4 <- arbitrary :: Gen Octet - return (IPv4Address oct1 oct2 oct3 oct4) + arbitrary = do + oct1 <- arbitrary :: Gen Octet + oct2 <- arbitrary :: Gen Octet + oct3 <- arbitrary :: Gen Octet + oct4 <- arbitrary :: Gen Octet + return (IPv4Address oct1 oct2 oct3 oct4) instance Maskable IPv4Address where - apply_mask _ Maskbits.None _ = IPv4Address.None - apply_mask addr mask bit - | mask == ThirtyTwo = addr - | mask == ThirtyOne = addr { octet4 = (apply_mask oct4 Seven bit) } - | mask == Thirty = addr { octet4 = (apply_mask oct4 Six bit) } - | mask == TwentyNine = addr { octet4 = (apply_mask oct4 Five bit) } - | mask == TwentyEight = addr { octet4 = (apply_mask oct4 Four bit) } - | mask == TwentySeven = addr { octet4 = (apply_mask oct4 Three bit) } - | mask == TwentySix = addr { octet4 = (apply_mask oct4 Two bit) } - | mask == TwentyFive = addr { octet4 = (apply_mask oct4 One bit) } - | mask == TwentyFour = addr { octet4 = (apply_mask oct4 Zero bit) } - | mask == TwentyThree = addr { octet3 = (apply_mask oct3 Seven bit), - octet4 = (apply_mask oct4 Zero bit) } - | mask == TwentyTwo = addr { octet3 = (apply_mask oct3 Six bit), - octet4 = (apply_mask oct4 Zero bit) } - | mask == TwentyOne = addr { octet3 = (apply_mask oct3 Five bit), - octet4 = (apply_mask oct4 Zero bit) } - | mask == Twenty = addr { octet3 = (apply_mask oct3 Four bit), - octet4 = (apply_mask oct4 Zero bit) } - | mask == Nineteen = addr { octet3 = (apply_mask oct3 Three bit), - octet4 = (apply_mask oct4 Zero bit) } - | mask == Eighteen = addr { octet3 = (apply_mask oct3 Two bit), + + apply_mask addr mask bit + | mask == ThirtyTwo = addr + | mask == ThirtyOne = addr { octet4 = (apply_mask oct4 Seven bit) } + | mask == Thirty = addr { octet4 = (apply_mask oct4 Six bit) } + | mask == TwentyNine = addr { octet4 = (apply_mask oct4 Five bit) } + | mask == TwentyEight = addr { octet4 = (apply_mask oct4 Four bit) } + | mask == TwentySeven = addr { octet4 = (apply_mask oct4 Three bit) } + | mask == TwentySix = addr { octet4 = (apply_mask oct4 Two bit) } + | mask == TwentyFive = addr { octet4 = (apply_mask oct4 One bit) } + | mask == TwentyFour = addr { octet4 = (apply_mask oct4 Zero bit) } + | mask == TwentyThree = addr { octet3 = (apply_mask oct3 Seven bit), octet4 = (apply_mask oct4 Zero bit) } - | mask == Seventeen = addr { octet3 = (apply_mask oct3 One bit), - octet4 = (apply_mask oct4 Zero bit) } - | mask == Sixteen = addr { octet3 = (apply_mask oct3 Zero bit), - octet4 = (apply_mask oct4 Zero bit) } - | mask == Fifteen = addr { octet2 = (apply_mask oct2 Seven bit), - octet3 = (apply_mask oct3 Zero bit), - octet4 = (apply_mask oct4 Zero bit) } - | mask == Fourteen = addr { octet2 = (apply_mask oct2 Six bit), - octet3 = (apply_mask oct3 Zero bit), - octet4 = (apply_mask oct4 Zero bit)} - | mask == Thirteen = addr { octet2 = (apply_mask oct2 Five bit), - octet3 = (apply_mask oct3 Zero bit), - octet4 = (apply_mask oct4 Zero bit)} - | mask == Twelve = addr { octet2 = (apply_mask oct2 Four bit), - octet3 = (apply_mask oct3 Zero bit), - octet4 = (apply_mask oct4 Zero bit)} - | mask == Eleven = addr { octet2 = (apply_mask oct2 Three bit), - octet3 = (apply_mask oct3 Zero bit), - octet4 = (apply_mask oct4 Zero bit)} - | mask == Ten = addr { octet2 = (apply_mask oct2 Two bit), - octet3 = (apply_mask oct3 Zero bit), - octet4 = (apply_mask oct4 Zero bit)} - | mask == Nine = addr { octet2 = (apply_mask oct2 One bit), + | mask == TwentyTwo = addr { octet3 = (apply_mask oct3 Six bit), + octet4 = (apply_mask oct4 Zero bit) } + | mask == TwentyOne = addr { octet3 = (apply_mask oct3 Five bit), + octet4 = (apply_mask oct4 Zero bit) } + | mask == Twenty = addr { octet3 = (apply_mask oct3 Four bit), + octet4 = (apply_mask oct4 Zero bit) } + | mask == Nineteen = addr { octet3 = (apply_mask oct3 Three bit), + octet4 = (apply_mask oct4 Zero bit) } + | mask == Eighteen = addr { octet3 = (apply_mask oct3 Two bit), + octet4 = (apply_mask oct4 Zero bit) } + | mask == Seventeen = addr { octet3 = (apply_mask oct3 One bit), + octet4 = (apply_mask oct4 Zero bit) } + | mask == Sixteen = addr { octet3 = (apply_mask oct3 Zero bit), + octet4 = (apply_mask oct4 Zero bit) } + | mask == Fifteen = addr { octet2 = (apply_mask oct2 Seven bit), octet3 = (apply_mask oct3 Zero bit), - octet4 = (apply_mask oct4 Zero bit)} - | mask == Eight = addr { octet2 = (apply_mask oct2 Zero bit), + octet4 = (apply_mask oct4 Zero bit) } + | mask == Fourteen = addr { octet2 = (apply_mask oct2 Six bit), octet3 = (apply_mask oct3 Zero bit), octet4 = (apply_mask oct4 Zero bit)} - | mask == Seven = addr { octet1 = (apply_mask oct1 Seven bit), - octet2 = (apply_mask oct2 Zero bit), + | mask == Thirteen = addr { octet2 = (apply_mask oct2 Five bit), octet3 = (apply_mask oct3 Zero bit), octet4 = (apply_mask oct4 Zero bit)} - | mask == Six = addr { octet1 = (apply_mask oct1 Six bit), - octet2 = (apply_mask oct2 Zero bit), + | mask == Twelve = addr { octet2 = (apply_mask oct2 Four bit), octet3 = (apply_mask oct3 Zero bit), octet4 = (apply_mask oct4 Zero bit)} - | mask == Five = addr { octet1 = (apply_mask oct1 Five bit), - octet2 = (apply_mask oct2 Zero bit), - octet3 = (apply_mask oct3 Zero bit), - octet4 = (apply_mask oct4 Zero bit)} - | mask == Four = addr { octet1 = (apply_mask oct1 Four bit), - octet2 = (apply_mask oct2 Zero bit), - octet3 = (apply_mask oct3 Zero bit), - octet4 = (apply_mask oct4 Zero bit)} - | mask == Three = addr { octet1 = (apply_mask oct1 Three bit), - octet2 = (apply_mask oct2 Zero bit), - octet3 = (apply_mask oct3 Zero bit), - octet4 = (apply_mask oct4 Zero bit)} - | mask == Two = addr { octet1 = (apply_mask oct1 Two bit), - octet2 = (apply_mask oct2 Zero bit), - octet3 = (apply_mask oct3 Zero bit), - octet4 = (apply_mask oct4 Zero bit)} - | mask == One = addr { octet1 = (apply_mask oct1 One bit), - octet2 = (apply_mask oct2 Zero bit), + | mask == Eleven = addr { octet2 = (apply_mask oct2 Three bit), octet3 = (apply_mask oct3 Zero bit), octet4 = (apply_mask oct4 Zero bit)} - | mask == Zero = addr { octet1 = (apply_mask oct1 Zero bit), - octet2 = (apply_mask oct2 Zero bit), - octet3 = (apply_mask oct3 Zero bit), - octet4 = (apply_mask oct4 Zero bit)} - | otherwise = IPv4Address.None - where - oct1 = (octet1 addr) - oct2 = (octet2 addr) - oct3 = (octet3 addr) - oct4 = (octet4 addr) - + | mask == Ten = addr { octet2 = (apply_mask oct2 Two bit), + octet3 = (apply_mask oct3 Zero bit), + octet4 = (apply_mask oct4 Zero bit)} + | mask == Nine = addr { octet2 = (apply_mask oct2 One bit), + octet3 = (apply_mask oct3 Zero bit), + octet4 = (apply_mask oct4 Zero bit)} + | mask == Eight = addr { octet2 = (apply_mask oct2 Zero bit), + octet3 = (apply_mask oct3 Zero bit), + octet4 = (apply_mask oct4 Zero bit)} + | mask == Seven = addr { octet1 = (apply_mask oct1 Seven bit), + octet2 = (apply_mask oct2 Zero bit), + octet3 = (apply_mask oct3 Zero bit), + octet4 = (apply_mask oct4 Zero bit)} + | mask == Six = addr { octet1 = (apply_mask oct1 Six bit), + octet2 = (apply_mask oct2 Zero bit), + octet3 = (apply_mask oct3 Zero bit), + octet4 = (apply_mask oct4 Zero bit)} + | mask == Five = addr { octet1 = (apply_mask oct1 Five bit), + octet2 = (apply_mask oct2 Zero bit), + octet3 = (apply_mask oct3 Zero bit), + octet4 = (apply_mask oct4 Zero bit)} + | mask == Four = addr { octet1 = (apply_mask oct1 Four bit), + octet2 = (apply_mask oct2 Zero bit), + octet3 = (apply_mask oct3 Zero bit), + octet4 = (apply_mask oct4 Zero bit)} + | mask == Three = addr { octet1 = (apply_mask oct1 Three bit), + octet2 = (apply_mask oct2 Zero bit), + octet3 = (apply_mask oct3 Zero bit), + octet4 = (apply_mask oct4 Zero bit)} + | mask == Two = addr { octet1 = (apply_mask oct1 Two bit), + octet2 = (apply_mask oct2 Zero bit), + octet3 = (apply_mask oct3 Zero bit), + octet4 = (apply_mask oct4 Zero bit)} + | mask == One = addr { octet1 = (apply_mask oct1 One bit), + octet2 = (apply_mask oct2 Zero bit), + octet3 = (apply_mask oct3 Zero bit), + octet4 = (apply_mask oct4 Zero bit)} + | mask == Zero = addr { octet1 = (apply_mask oct1 Zero bit), + octet2 = (apply_mask oct2 Zero bit), + octet3 = (apply_mask oct3 Zero bit), + octet4 = (apply_mask oct4 Zero bit)} + where + oct1 = (octet1 addr) + oct2 = (octet2 addr) + oct3 = (octet3 addr) + oct4 = (octet4 addr) --- 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 - --- The minimum possible IPv4 address, 0.0.0.0. +-- | The minimum possible IPv4 address, 0.0.0.0. min_address :: IPv4Address -min_address = IPv4Address min_octet min_octet min_octet min_octet +min_address = + IPv4Address min_octet min_octet min_octet min_octet --- The maximum possible IPv4 address, 255.255.255.255. +-- | The maximum possible IPv4 address, 255.255.255.255. max_address :: IPv4Address -max_address = IPv4Address max_octet max_octet max_octet max_octet +max_address = + IPv4Address max_octet max_octet max_octet max_octet --- Given two addresses, find the number of the most significant bit --- where they differ. If the addresses are the same, return --- Maskbits.Zero. +-- | Given two addresses, find the number of the most significant bit +-- where they differ. If the addresses are the same, return +-- Maskbits.Zero. most_sig_bit_different :: IPv4Address -> IPv4Address -> Maskbits most_sig_bit_different addr1 addr2 | addr1 == addr2 = Maskbits.Zero @@ -281,24 +265,38 @@ most_sig_bit_different addr1 addr2 -- HUnit Tests mk_testaddr :: Int -> Int -> Int -> Int -> IPv4Address mk_testaddr a b c d = - IPv4Address oct1 oct2 oct3 oct4 - where - oct1 = octet_from_int a - oct2 = octet_from_int b - oct3 = octet_from_int c - oct4 = octet_from_int d + IPv4Address oct1 oct2 oct3 oct4 + where + oct1 = fromJust $ octet_from_int a + oct2 = fromJust $ octet_from_int b + oct3 = fromJust $ octet_from_int c + oct4 = fromJust $ octet_from_int d test_most_sig_bit_different1 :: Test test_most_sig_bit_different1 = - TestCase $ assertEqual "10.1.1.0 and 10.1.0.0 differ in bit 24" TwentyFour (most_sig_bit_different (mk_testaddr 10 1 1 0) (mk_testaddr 10 1 0 0)) + TestCase $ assertEqual "10.1.1.0 and 10.1.0.0 differ in bit 24" + TwentyFour + bit + where + addr1 = mk_testaddr 10 1 1 0 + addr2 = (mk_testaddr 10 1 0 0) + bit = most_sig_bit_different addr1 addr2 + test_most_sig_bit_different2 :: Test test_most_sig_bit_different2 = - TestCase $ assertEqual "10.1.2.0 and 10.1.1.0 differ in bit 23" TwentyThree (most_sig_bit_different (mk_testaddr 10 1 2 0) (mk_testaddr 10 1 1 0)) + TestCase $ assertEqual "10.1.2.0 and 10.1.1.0 differ in bit 23" + TwentyThree + bit + where + addr1 = mk_testaddr 10 1 2 0 + addr2 = mk_testaddr 10 1 1 0 + bit = most_sig_bit_different addr1 addr2 ipv4address_tests :: [Test] -ipv4address_tests = [ test_most_sig_bit_different1, - test_most_sig_bit_different2 ] +ipv4address_tests = + [ test_most_sig_bit_different1, + test_most_sig_bit_different2 ]