X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FCidr.hs;h=f13c4f36e14104fe7d12cbb9a33715928a7a908b;hb=e061c778a9234bd4e4ed2b6fe43422cbedda7de0;hp=98c42c7e6bdab38a0f2d1da47c142aba445c7182;hpb=c5ea6135a25e8c9e108c34ebb0d0cbb4b4af1e6d;p=hath.git diff --git a/src/Cidr.hs b/src/Cidr.hs index 98c42c7..f13c4f3 100644 --- a/src/Cidr.hs +++ b/src/Cidr.hs @@ -5,6 +5,14 @@ module Cidr combine_all, contains, contains_proper, + max_octet1, + max_octet2, + max_octet3, + max_octet4, + min_octet1, + min_octet2, + min_octet3, + min_octet4, prop_all_cidrs_contain_themselves, prop_contains_proper_intransitive ) where @@ -13,6 +21,7 @@ import Data.List (nubBy) import Test.HUnit import Test.QuickCheck +import qualified Bit as B import IPv4Address import ListUtils import Maskable @@ -46,13 +55,16 @@ equivalent Cidr.None Cidr.None = True equivalent Cidr.None _ = False equivalent _ Cidr.None = False equivalent (Cidr addr1 mbits1) (Cidr addr2 mbits2) = - (mbits1 == mbits2) && ((apply_mask addr1 mbits1) == (apply_mask addr2 mbits2)) + (mbits1 == mbits2) && ((apply_mask addr1 mbits1 B.Zero) == (apply_mask addr2 mbits2 B.Zero)) -- Returns the mask portion of a CIDR address. That is, everything -- after the trailing slash. maskbits_from_cidr_string :: String -> Maskbits -maskbits_from_cidr_string s = - maskbits_from_string ((splitWith (`elem` "/") s) !! 1) +maskbits_from_cidr_string s + | length partlist == 2 = maskbits_from_string (partlist !! 1) + | otherwise = Maskbits.None + where + partlist = (splitWith (`elem` "/") s) -- Takes an IP address String in CIDR notation, and returns a list of @@ -78,6 +90,46 @@ cidr_from_string s +min_host :: Cidr -> IPv4Address +min_host Cidr.None = IPv4Address.None +min_host (Cidr IPv4Address.None _) = IPv4Address.None +min_host (Cidr _ Maskbits.None) = IPv4Address.None +min_host (Cidr addr mask) = apply_mask addr mask B.Zero + + +max_host :: Cidr -> IPv4Address +max_host Cidr.None = IPv4Address.None +max_host (Cidr IPv4Address.None _) = IPv4Address.None +max_host (Cidr _ Maskbits.None) = IPv4Address.None +max_host (Cidr addr mask) = apply_mask addr mask B.One + + +min_octet1 :: Cidr -> Octet +min_octet1 cidr = octet1 (min_host cidr) + +min_octet2 :: Cidr -> Octet +min_octet2 cidr = octet2 (min_host cidr) + +min_octet3 :: Cidr -> Octet +min_octet3 cidr = octet3 (min_host cidr) + +min_octet4 :: Cidr -> Octet +min_octet4 cidr = octet4 (min_host cidr) + +max_octet1 :: Cidr -> Octet +max_octet1 cidr = octet1 (max_host cidr) + +max_octet2 :: Cidr -> Octet +max_octet2 cidr = octet2 (max_host cidr) + +max_octet3 :: Cidr -> Octet +max_octet3 cidr = octet3 (max_host cidr) + +max_octet4 :: Cidr -> Octet +max_octet4 cidr = octet4 (max_host cidr) + + + -- Return true if the first argument (a CIDR range) contains the -- second (another CIDR range). There are a lot of ways we can be fed -- junk here. For lack of a better alternative, just return False when @@ -121,8 +173,8 @@ contains (Cidr addr1 mbits1) (Cidr addr2 mbits2) | mbits1 > mbits2 = False | otherwise = addr1masked == addr2masked where - addr1masked = apply_mask addr1 mbits1 - addr2masked = apply_mask addr2 mbits1 + addr1masked = apply_mask addr1 mbits1 B.Zero + addr2masked = apply_mask addr2 mbits1 B.Zero contains_proper :: Cidr -> Cidr -> Bool