Data.IP.RouteTable

iproute-1.7.1: IP Routing Table

Safe Haskell | None
Language | Haskell2010

Data.IP.RouteTable

Contents

- Documentation
  - Routable class
  - Type for IP routing table
  - Functions to manipulate an IP routing table

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

- class Addr a => Routable a where
- data IPRTable k a
- empty :: Routable k => IPRTable k a
- insert :: Routable k => AddrRange k -> a -> IPRTable k a -> IPRTable k a
- delete :: Routable k => AddrRange k -> IPRTable k a -> IPRTable k a
- lookup :: Routable k => AddrRange k -> IPRTable k a -> Maybe a
- findMatch :: MonadPlus 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)]

# Documentation

## Routable class

class Addr a => Routable a where #

A class to contain IPv4 and IPv6.

Minimal complete definition

intToTBit, isZero

Methods

intToTBit :: Int -> a #

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

isZero :: a -> a -> Bool #

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

Instances

Routable IPv6 # |
Methods intToTBit :: Int -> IPv6 # isZero :: IPv6 -> IPv6 -> Bool #
Routable IPv4 # |
Methods intToTBit :: Int -> IPv4 # isZero :: IPv4 -> IPv4 -> Bool #

## Type for IP routing table

data IPRTable k a #

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

Functor (IPRTable k) # |
Methods fmap :: (a -> b) -> IPRTable k a -> IPRTable k b # (<$) :: a -> IPRTable k b -> IPRTable k a #
Foldable (IPRTable k) # |
Methods fold :: Monoid m => IPRTable k m -> 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 # toList :: IPRTable k a -> [a] # null :: IPRTable k a -> Bool # length :: IPRTable k a -> Int # elem :: Eq a => a -> IPRTable k a -> Bool # maximum :: Ord a => IPRTable k a -> a # minimum :: Ord a => IPRTable k a -> a # sum :: Num a => IPRTable k a -> a # product :: Num a => IPRTable k a -> a #
Traversable (IPRTable k) # |
Methods traverse :: Applicative f => (a -> f b) -> IPRTable k a -> f (IPRTable k b) # sequenceA :: Applicative f => IPRTable k (f a) -> f (IPRTable k a) # mapM :: Monad m => (a -> m b) -> IPRTable k a -> m (IPRTable k b) # sequence :: Monad m => IPRTable k (m a) -> m (IPRTable k a) #
(Eq k, Eq a) => Eq (IPRTable k a) # |
Methods (==) :: IPRTable k a -> IPRTable k a -> Bool # (/=) :: IPRTable k a -> IPRTable k a -> Bool #
(Show k, Show a) => Show (IPRTable k a) # |
Methods showsPrec :: Int -> IPRTable k a -> ShowS # show :: IPRTable k a -> String # showList :: [IPRTable k a] -> ShowS #

## Functions to manipulate an IP routing table

empty :: Routable k => IPRTable k a #

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 a #

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 a #

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 a #

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) #

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 #

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)] #

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