module Data.IP.Op where
import Data.Bits
import Data.IP.Addr
import Data.IP.Mask
import Data.IP.Range
class Eq a => Addr a where
masked :: a -> a -> a
intToMask :: Int -> a
instance Addr IPv4 where
masked :: IPv4 -> IPv4 -> IPv4
masked = IPv4 -> IPv4 -> IPv4
maskedIPv4
intToMask :: Int -> IPv4
intToMask = Int -> IPv4
maskIPv4
instance Addr IPv6 where
masked :: IPv6 -> IPv6 -> IPv6
masked = IPv6 -> IPv6 -> IPv6
maskedIPv6
intToMask :: Int -> IPv6
intToMask = Int -> IPv6
maskIPv6
(>:>) :: Addr a => AddrRange a -> AddrRange a -> Bool
AddrRange a
a >:> :: forall a. Addr a => AddrRange a -> AddrRange a -> Bool
>:> AddrRange a
b = forall a. AddrRange a -> Int
mlen AddrRange a
a forall a. Ord a => a -> a -> Bool
<= forall a. AddrRange a -> Int
mlen AddrRange a
b Bool -> Bool -> Bool
&& (forall a. AddrRange a -> a
addr AddrRange a
b forall a. Addr a => a -> a -> a
`masked` forall a. AddrRange a -> a
mask AddrRange a
a) forall a. Eq a => a -> a -> Bool
== forall a. AddrRange a -> a
addr AddrRange a
a
isMatchedTo :: Addr a => a -> AddrRange a -> Bool
isMatchedTo :: forall a. Addr a => a -> AddrRange a -> Bool
isMatchedTo a
a AddrRange a
r = a
a forall a. Addr a => a -> a -> a
`masked` forall a. AddrRange a -> a
mask AddrRange a
r forall a. Eq a => a -> a -> Bool
== forall a. AddrRange a -> a
addr AddrRange a
r
makeAddrRange :: Addr a => a -> Int -> AddrRange a
makeAddrRange :: forall a. Addr a => a -> Int -> AddrRange a
makeAddrRange a
ad Int
len = forall a. a -> a -> Int -> AddrRange a
AddrRange a
adr a
msk Int
len
where
msk :: a
msk = forall a. Addr a => Int -> a
intToMask Int
len
adr :: a
adr = a
ad forall a. Addr a => a -> a -> a
`masked` a
msk
ipv4RangeToIPv6 :: AddrRange IPv4 -> AddrRange IPv6
ipv4RangeToIPv6 :: AddrRange IPv4 -> AddrRange IPv6
ipv4RangeToIPv6 AddrRange IPv4
range =
forall a. Addr a => a -> Int -> AddrRange a
makeAddrRange ([Int] -> IPv6
toIPv6 [Int
0,Int
0,Int
0,Int
0,Int
0,Int
0xffff, (Int
i1 forall a. Bits a => a -> Int -> a
`shift` Int
8) forall a. Bits a => a -> a -> a
.|. Int
i2, (Int
i3 forall a. Bits a => a -> Int -> a
`shift` Int
8) forall a. Bits a => a -> a -> a
.|. Int
i4]) (Int
masklen forall a. Num a => a -> a -> a
+ Int
96)
where
(IPv4
ip, Int
masklen) = forall a. Addr a => AddrRange a -> (a, Int)
addrRangePair AddrRange IPv4
range
[Int
i1,Int
i2,Int
i3,Int
i4] = IPv4 -> [Int]
fromIPv4 IPv4
ip
addrRangePair :: Addr a => AddrRange a -> (a, Int)
addrRangePair :: forall a. Addr a => AddrRange a -> (a, Int)
addrRangePair (AddrRange a
adr a
_ Int
len) = (a
adr, Int
len)