module Data.IP.Mask where
import Data.Bits
import Data.IP.Addr
import Data.Word
import Data.IntMap hiding (map)
maskIPv4 :: Int -> IPv4
maskIPv4 len = IP4 (masksIPv4 ! len)
maskIPv6 :: Int -> IPv6
maskIPv6 len = IP6 (masksIPv6 ! len)
masksWord32 :: [Word32]
masksWord32 = take 33 $ iterate (`shift` 1) 0xffffffff
masksIPv4 :: IntMap IPv4Addr
masksIPv4 = fromList $ zip [32,31..0] masksWord32
masksIPv6 :: IntMap IPv6Addr
masksIPv6 = fromList $ zip [128,127..0] ms
where
ms = m0 ++ m1 ++ m2 ++ m3 ++ m4
m0 = [(all1,all1,all1,all1)]
m1 = map (\vmsk -> (all1,all1,all1,vmsk)) masks
m2 = map (\vmsk -> (all1,all1,vmsk,all0)) masks
m3 = map (\vmsk -> (all1,vmsk,all0,all0)) masks
m4 = map (\vmsk -> (vmsk,all0,all0,all0)) masks
masks = tail masksWord32
all1 = 0xffffffff
all0 = 0x00000000