+-- | The CIDR modules contains most of the functions used for working
+-- with the CIDR type.
module Cidr
( Cidr(..),
cidr_from_string,
) where
import Data.List (nubBy)
+import Data.List.Split (splitOneOf)
import Data.Maybe (catMaybes, fromJust)
import Test.HUnit (assertEqual)
import qualified Bit as B
import IPv4Address
-import ListUtils
import Maskable
import Maskbits
import Octet
cidr1 == cidr2 = (cidr1 `equivalent` cidr2)
--- Two CIDR ranges are equivalent if they have the same network bits
--- and the masks are the same.
+-- | Two CIDR ranges are equivalent if they have the same network bits
+-- and the masks are the same.
equivalent :: Cidr -> Cidr -> Bool
equivalent (Cidr addr1 mbits1) (Cidr 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.
+-- | Returns the mask portion of a CIDR address. That is, everything
+-- after the trailing slash.
maskbits_from_cidr_string :: String -> Maybe Maskbits
maskbits_from_cidr_string s
| length partlist == 2 = maskbits_from_string (partlist !! 1)
| otherwise = Nothing
where
- partlist = (splitWith (`elem` "/") s)
+ partlist = splitOneOf "/" s
-- | Takes an IP address String in CIDR notation, and returns a list
-- of its octets (as Ints).
octets_from_cidr_string :: String -> [Octet]
octets_from_cidr_string s =
- catMaybes $ map octet_from_string (take 4 (splitWith (`elem` "./") s))
+ catMaybes $ map octet_from_string (take 4 (splitOneOf "./" s))
-- | Return Nothing if we can't parse both maskbits and octets from
+-- | Given a CIDR, return the minimum valid IPv4 address contained
+-- within it.
min_host :: Cidr -> IPv4Address
min_host (Cidr addr mask) = apply_mask addr mask B.Zero
-
+-- | Given a CIDR, return the maximum valid IPv4 address contained
+-- within it.
max_host :: Cidr -> IPv4Address
max_host (Cidr addr mask) = apply_mask addr mask B.One
-
+-- | Given a CIDR, return the first octet of the minimum valid IPv4
+-- address contained within it.
min_octet1 :: Cidr -> Octet
min_octet1 cidr = octet1 (min_host cidr)
+-- | Given a CIDR, return the second octet of the minimum valid IPv4
+-- address contained within it.
min_octet2 :: Cidr -> Octet
min_octet2 cidr = octet2 (min_host cidr)
+-- | Given a CIDR, return the third octet of the minimum valid IPv4
+-- address contained within it.
min_octet3 :: Cidr -> Octet
min_octet3 cidr = octet3 (min_host cidr)
+-- | Given a CIDR, return the fourth octet of the minimum valid IPv4
+-- address contained within it.
min_octet4 :: Cidr -> Octet
min_octet4 cidr = octet4 (min_host cidr)
+-- | Given a CIDR, return the first octet of the maximum valid IPv4
+-- address contained within it.
max_octet1 :: Cidr -> Octet
max_octet1 cidr = octet1 (max_host cidr)
+-- | Given a CIDR, return the second octet of the maximum valid IPv4
+-- address contained within it.
max_octet2 :: Cidr -> Octet
max_octet2 cidr = octet2 (max_host cidr)
+-- | Given a CIDR, return the third octet of the maximum valid IPv4
+-- address contained within it.
max_octet3 :: Cidr -> Octet
max_octet3 cidr = octet3 (max_host cidr)
+-- | Given a CIDR, return the fourth octet of the maximum valid IPv4
+-- address contained within it.
max_octet4 :: Cidr -> Octet
max_octet4 cidr = octet4 (max_host cidr)
addr2masked = apply_mask addr2 mbits1 B.Zero
+-- | Contains but is not equal to.
contains_proper :: Cidr -> Cidr -> Bool
contains_proper cidr1 cidr2 =
(cidr1 `contains` cidr2) && (not (cidr2 `contains` cidr1))