packages feed

rpf-0.2.0: RPF/IP.hs

module RPF.IP where

import Data.IP
import Data.IP.RouteTable (IPRTable)
import qualified Data.IP.RouteTable as T hiding (IPRTable)
import Data.Maybe

----------------------------------------------------------------

data IPTable = IPTable {
    ipv4table :: IPRTable IPv4 Bool -- Bool is dummy
  , ipv6table :: IPRTable IPv6 Bool -- Bool is dummy
  } deriving (Eq,Show)

----------------------------------------------------------------

ipMatch :: IP -> IPTable -> Bool
ipMatch (IPv4 ip) tbl = fromMaybe False $ T.lookup ir (ipv4table tbl)
  where
    ir = makeAddrRange ip 32
ipMatch (IPv6 ip) tbl = fromMaybe False $ T.lookup ir (ipv6table tbl)
  where
    ir = makeAddrRange ip 128

----------------------------------------------------------------

makeIPTable :: [IPRange] -> IPTable
makeIPTable is = IPTable {
    ipv4table = T.fromList $ zip ipv4addrRange (repeat True)
  , ipv6table = T.fromList $ zip ipv6addrRange (repeat True)
  }
  where
    ipv4addrRange = map toIPv4AddrRange $ filter isIPv4Range is
    ipv6addrRange = map toIPv6AddrRange $ filter isIPv6Range is

isIPv4Range :: IPRange -> Bool
isIPv4Range (IPv4Range _) = True
isIPv4Range _             = False

toIPv4AddrRange :: IPRange -> AddrRange IPv4
toIPv4AddrRange (IPv4Range x) = x
toIPv4AddrRange _             = error "toIPv4AddrRange"

isIPv6Range :: IPRange -> Bool
isIPv6Range (IPv6Range _) = True
isIPv6Range _             = False

toIPv6AddrRange :: IPRange -> AddrRange IPv6
toIPv6AddrRange (IPv6Range x) = x
toIPv6AddrRange _             = error "toIPv6AddrRange"