iproute-1.2.6: IP Routing Table

Safe HaskellSafe-Infered

Data.IP.RouteTable

Contents

Description

IP routing table is a tree of IPRange 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.

For more information, see: http://www.mew.org/~kazu/proj/iproute/

Synopsis

Documentation

Routable class

class Addr a => Routable a whereSource

A class to contain IPv4 and IPv6.

Methods

intToTBit :: Int -> aSource

The intToTBit function takes Int and returns an Routable address whose only n-th bit is set.

isZero :: a -> a -> BoolSource

The isZero function takes an Routable address and an test bit Routable address and returns True is the bit is unset, otherwise returns False.

Type for IP routing table

data IPRTable k a 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

(Eq k, Eq a) => Eq (IPRTable k a) 
(Show k, Show a) => Show (IPRTable k a) 

Functions to manipulate an IP routing table

empty :: Routable k => IPRTable k aSource

The empty function returns an empty IP routing table.

>>> (empty :: IPRTable IPv4 ()) == fromList []
True

insert :: Routable k => AddrRange k -> a -> IPRTable k a -> IPRTable k aSource

The insert function inserts a value with a key of AddrRange to IPRTable and returns a new IPRTable.

>>> (insert ("127.0.0.1" :: AddrRange IPv4) () empty) == fromList [("127.0.0.1",())]
True

delete :: Routable k => AddrRange k -> IPRTable k a -> IPRTable k aSource

The delete function deletes a value by a key of AddrRange from IPRTable and returns a new IPRTable.

>>> delete "127.0.0.1" (insert "127.0.0.1" () empty) == (empty :: IPRTable IPv4 ())
True

lookup :: Routable k => AddrRange k -> IPRTable k a -> Maybe aSource

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

findMatch :: MonadPlus 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 aSource

The fromList function creates a new IP routing table from a list of a pair of IPrange and value.

toList :: Routable k => IPRTable k a -> [(AddrRange k, a)]Source

The toList function creates a list of a pair of AddrRange and value from an IP routing table.