Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Data.IP.RouteTable.Internal
Description
IP routing table is a tree of AddrRange
to search one of them on the longest
match base. It is a kind of TRIE with one
way branching removed. Both IPv4 and IPv6
are supported.
Synopsis
- class Addr a => Routable a where
- intToTBitIPv4 :: Int -> IPv4
- intToTBitIPv6 :: Int -> IPv6
- intToTBitsWord32 :: [Word32]
- intToTBitsIPv4 :: IntMap IPv4Addr
- intToTBitsIPv6 :: IntMap IPv6Addr
- data IPRTable k a
- empty :: Routable k => IPRTable k a
- insert :: Routable k => AddrRange k -> a -> IPRTable k a -> IPRTable k a
- link :: Routable k => IPRTable k a -> IPRTable k a -> IPRTable k a
- glue :: Routable k => Int -> AddrRange k -> AddrRange k -> AddrRange k
- keyToTestBit :: Routable k => AddrRange k -> k
- isLeft :: Routable k => AddrRange k -> k -> Bool
- delete :: Routable k => AddrRange k -> IPRTable k a -> IPRTable k a
- node :: Routable k => AddrRange k -> k -> Maybe a -> IPRTable k a -> IPRTable k a -> IPRTable k a
- lookup :: Routable k => AddrRange k -> IPRTable k a -> Maybe a
- lookupKeyValue :: Routable k => AddrRange k -> IPRTable k a -> Maybe (AddrRange k, a)
- search :: Routable k => AddrRange k -> IPRTable k a -> Maybe (AddrRange k, a) -> Maybe (AddrRange k, a)
- lookupAll :: Routable k => AddrRange k -> IPRTable k a -> [(AddrRange k, a)]
- findMatch :: Alternative m => Routable k => AddrRange k -> IPRTable k a -> m (AddrRange k, a)
- fromList :: Routable k => [(AddrRange k, a)] -> IPRTable k a
- toList :: Routable k => IPRTable k a -> [(AddrRange k, a)]
- foldt :: (IPRTable k a -> b -> b) -> b -> IPRTable k a -> b
- foldlWithKey :: (b -> AddrRange k -> a -> b) -> b -> IPRTable k a -> b
- foldrWithKey :: (AddrRange k -> a -> b -> b) -> b -> IPRTable k a -> b
Documentation
class Addr a => Routable a where Source #
A class to contain IPv4 and IPv6.
intToTBitIPv4 :: Int -> IPv4 Source #
intToTBitIPv6 :: Int -> IPv6 Source #
intToTBitsWord32 :: [Word32] Source #
intToTBitsIPv4 :: IntMap IPv4Addr Source #
intToTBitsIPv6 :: IntMap IPv6Addr Source #
The Tree structure for IP routing table based on TRIE with
one way branching removed. This is an abstract data type,
so you cannot touch its inside. Please use insert
or lookup
, instead.
Instances
Generic1 (IPRTable k :: Type -> Type) Source # | |
Foldable (IPRTable k) Source # | |
Defined in Data.IP.RouteTable.Internal Methods fold :: Monoid m => IPRTable k m -> m foldMap :: Monoid m => (a -> m) -> IPRTable k a -> m foldMap' :: Monoid m => (a -> m) -> IPRTable k a -> m foldr :: (a -> b -> b) -> b -> IPRTable k a -> b foldr' :: (a -> b -> b) -> b -> IPRTable k a -> b foldl :: (b -> a -> b) -> b -> IPRTable k a -> b foldl' :: (b -> a -> b) -> b -> IPRTable k a -> b foldr1 :: (a -> a -> a) -> IPRTable k a -> a foldl1 :: (a -> a -> a) -> IPRTable k a -> a elem :: Eq a => a -> IPRTable k a -> Bool maximum :: Ord a => IPRTable k a -> a minimum :: Ord a => IPRTable k a -> a | |
Traversable (IPRTable k) Source # | |
Defined in Data.IP.RouteTable.Internal | |
Functor (IPRTable k) Source # | |
Routable k => Monoid (IPRTable k a) Source # | Since: 1.7.5 |
Routable k => Semigroup (IPRTable k a) Source # | Note that Semigroup and Monoid instances are right-biased. That is, if both arguments have the same key, the value from the right argument will be used. Since: 1.7.5 |
Generic (IPRTable k a) Source # | |
(Show k, Show a) => Show (IPRTable k a) Source # | |
(Eq k, Eq a) => Eq (IPRTable k a) Source # | |
type Rep1 (IPRTable k :: Type -> Type) Source # | |
Defined in Data.IP.RouteTable.Internal type Rep1 (IPRTable k :: Type -> Type) = D1 ('MetaData "IPRTable" "Data.IP.RouteTable.Internal" "iproute-1.7.12-IhoklPQYItb8qGu1G3vmcD" 'False) (C1 ('MetaCons "Nil" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Node" 'PrefixI 'False) ((S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (AddrRange k)) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 k)) :*: (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec1 Maybe) :*: (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec1 (IPRTable k)) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec1 (IPRTable k)))))) | |
type Rep (IPRTable k a) Source # | |
Defined in Data.IP.RouteTable.Internal type Rep (IPRTable k a) = D1 ('MetaData "IPRTable" "Data.IP.RouteTable.Internal" "iproute-1.7.12-IhoklPQYItb8qGu1G3vmcD" 'False) (C1 ('MetaCons "Nil" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Node" 'PrefixI 'False) ((S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (AddrRange k)) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 k)) :*: (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe a)) :*: (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (IPRTable k a)) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (IPRTable k a)))))) |
empty :: Routable k => IPRTable k a Source #
The empty
function returns an empty IP routing table.
>>>
(empty :: IPRTable IPv4 ()) == fromList []
True
keyToTestBit :: Routable k => AddrRange k -> k Source #
node :: Routable k => AddrRange k -> k -> Maybe a -> IPRTable k a -> IPRTable k a -> IPRTable k a Source #
lookup :: Routable k => AddrRange k -> IPRTable k a -> Maybe a Source #
The lookup
function looks up IPRTable
with a key of AddrRange
.
If a routing information in IPRTable
matches the key, its value
is returned.
>>>
let v4 = ["133.4.0.0/16","133.5.0.0/16","133.5.16.0/24","133.5.23.0/24"] :: [AddrRange IPv4]
>>>
let rt = fromList $ zip v4 v4
>>>
lookup "127.0.0.1" rt
Nothing>>>
lookup "133.3.0.1" rt
Nothing>>>
lookup "133.4.0.0" rt
Just 133.4.0.0/16>>>
lookup "133.4.0.1" rt
Just 133.4.0.0/16>>>
lookup "133.5.16.0" rt
Just 133.5.16.0/24>>>
lookup "133.5.16.1" rt
Just 133.5.16.0/24
lookupKeyValue :: Routable k => AddrRange k -> IPRTable k a -> Maybe (AddrRange k, a) Source #
The lookupKeyValue
function looks up IPRTable
with a key of AddrRange
.
If a routing information in IPRTable
matches the key, both key and value
are returned.
>>>
:set -XOverloadedStrings
>>>
let rt = fromList ([("192.168.0.0/24", 1), ("10.10.0.0/16", 2)] :: [(AddrRange IPv4, Int)])
>>>
lookupKeyValue "127.0.0.1" rt
Nothing>>>
lookupKeyValue "192.168.0.1" rt
Just (192.168.0.0/24,1)>>>
lookupKeyValue "10.10.0.1" rt
Just (10.10.0.0/16,2)
search :: Routable k => AddrRange k -> IPRTable k a -> Maybe (AddrRange k, a) -> Maybe (AddrRange k, a) Source #
lookupAll :: Routable k => AddrRange k -> IPRTable k a -> [(AddrRange k, a)] Source #
lookupAll
is a version of lookup
that returns all entries matching the
given key, not just the longest match.
>>>
:set -XOverloadedStrings
>>>
let rt = fromList ([("192.168.0.0/24", 1), ("10.10.0.0/16", 2), ("10.0.0.0/8", 3)] :: [(AddrRange IPv4, Int)])
>>>
lookupAll "127.0.0.1" rt
[]>>>
lookupAll "192.168.0.1" rt
[(192.168.0.0/24,1)]>>>
lookupAll "10.10.0.1" rt
[(10.10.0.0/16,2),(10.0.0.0/8,3)]
findMatch :: Alternative m => Routable k => AddrRange k -> IPRTable k a -> m (AddrRange k, a) Source #
The findMatch
function looks up IPRTable
with a key of AddrRange
.
If the key matches routing informations in IPRTable
, they are
returned.
>>>
let v4 = ["133.4.0.0/16","133.5.0.0/16","133.5.16.0/24","133.5.23.0/24"] :: [AddrRange IPv4]
>>>
let rt = fromList $ zip v4 $ repeat ()
>>>
findMatch "133.4.0.0/15" rt :: [(AddrRange IPv4,())]
[(133.4.0.0/16,()),(133.5.0.0/16,()),(133.5.16.0/24,()),(133.5.23.0/24,())]
fromList :: Routable k => [(AddrRange k, a)] -> IPRTable k a Source #
The fromList
function creates a new IP routing table from
a list of a pair of IPrange
and value.
foldlWithKey :: (b -> AddrRange k -> a -> b) -> b -> IPRTable k a -> b Source #
O(n). Fold the keys and values in the IPRTable using the given left-associative binary operator. This function is equivalent to Data.Map.foldlWithKey with necessary to IPRTable changes. Since: 1.7.5
foldrWithKey :: (AddrRange k -> a -> b -> b) -> b -> IPRTable k a -> b Source #
O(n). Fold the keys and values in the IPRTable using the given right-associative binary operator. This function is equivalent to Data.Map.foldrWithKey with necessary to IPRTable changes. Since: 1.7.5