Trait treebitmap::IpLookupTableOps
[−]
[src]
pub trait IpLookupTableOps<Addr, T> { fn insert(&mut self, ip: Addr, masklen: u32, value: T) -> Option<T>; fn remove(&mut self, ip: Addr, masklen: u32) -> Option<T>; fn exact_match(&self, ip: Addr, masklen: u32) -> Option<&T>; fn longest_match(&self, ip: Addr) -> Option<(Addr, u32, &T)>; fn iter(&self) -> Iter<Addr, T>; fn iter_mut(&self) -> IterMut<Addr, T>; }
The operations defined on the lookup table.
Required Methods
fn insert(&mut self, ip: Addr, masklen: u32, value: T) -> Option<T>
Insert a value for the prefix designated by ip and masklen. If prefix existed previously, the old value is returned.
Example
use treebitmap::{IpLookupTable, IpLookupTableOps}; use std::net::Ipv6Addr; let mut table: IpLookupTable<Ipv6Addr,&str> = IpLookupTable::new(); let prefix = Ipv6Addr::new(0x2001, 0xdb8, 0xdead, 0xbeef, 0, 0, 0, 0); let masklen = 32; assert_eq!(table.insert(prefix, masklen, "foo"), None); // Insert duplicate assert_eq!(table.insert(prefix, masklen, "bar"), Some("foo"));
fn remove(&mut self, ip: Addr, masklen: u32) -> Option<T>
Remove an entry from the lookup table. If the prefix existed previously, the value is returned.
Example
use treebitmap::{IpLookupTable, IpLookupTableOps}; use std::net::Ipv6Addr; let mut table: IpLookupTable<Ipv6Addr,&str> = IpLookupTable::new(); let prefix = Ipv6Addr::new(0x2001, 0xdb8, 0xdead, 0xbeef, 0, 0, 0, 0); let masklen = 32; table.insert(prefix, masklen, "foo"); assert_eq!(table.remove(prefix, masklen), Some("foo")); // Remove non-existant assert_eq!(table.remove(prefix, masklen), None);
fn exact_match(&self, ip: Addr, masklen: u32) -> Option<&T>
Perform exact match lookup of ip
/masklen
and return the
value.
Example
use treebitmap::{IpLookupTable, IpLookupTableOps}; use std::net::Ipv6Addr; let mut table: IpLookupTable<Ipv6Addr,&str> = IpLookupTable::new(); let prefix = Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 0); let masklen = 32; table.insert(prefix, masklen, "foo"); assert_eq!(table.exact_match(prefix, masklen), Some(&"foo")); // differing mask assert_eq!(table.exact_match(prefix, 48), None);
fn longest_match(&self, ip: Addr) -> Option<(Addr, u32, &T)>
Perform longest match lookup of ip
and return the best matching
prefix, designated by ip, masklen, along with its value.
Example
use treebitmap::{IpLookupTable, IpLookupTableOps}; use std::net::Ipv6Addr; let mut table: IpLookupTable<Ipv6Addr,&str> = IpLookupTable::new(); let less_specific = Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 0); let more_specific = Ipv6Addr::new(0x2001, 0xdb8, 0xdead, 0, 0, 0, 0, 0); table.insert(less_specific, 32, "foo"); table.insert(more_specific, 48, "bar"); let lookupip = Ipv6Addr::new(0x2001, 0xdb8, 0xdead, 0xbeef, 0xcafe, 0xbabe, 0, 1); let result = table.longest_match(lookupip); assert_eq!(result, Some((more_specific, 48, &"bar"))); let lookupip = Ipv6Addr::new(0x2001, 0xdb8, 0xcafe, 0xf00, 0xf00, 0xf00, 0, 1); let result = table.longest_match(lookupip); assert_eq!(result, Some((less_specific, 32, &"foo")));
fn iter(&self) -> Iter<Addr, T>
Returns iterator over prefixes and values.
Example
use treebitmap::{IpLookupTable, IpLookupTableOps}; use std::net::Ipv6Addr; let mut table: IpLookupTable<Ipv6Addr,&str> = IpLookupTable::new(); let less_specific = Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 0); let more_specific = Ipv6Addr::new(0x2001, 0xdb8, 0xdead, 0, 0, 0, 0, 0); table.insert(less_specific, 32, "foo"); table.insert(more_specific, 48, "bar"); let mut iter = table.iter(); assert_eq!(iter.next(), Some((less_specific, 32, &"foo"))); assert_eq!(iter.next(), Some((more_specific, 48, &"bar"))); assert_eq!(iter.next(), None);
fn iter_mut(&self) -> IterMut<Addr, T>
Mutable version of iter()
Implementors
impl<T: Sized> IpLookupTableOps<Ipv4Addr, T> for treebitmap::IpLookupTable<Ipv4Addr, T>
impl<T: Sized> IpLookupTableOps<Ipv6Addr, T> for treebitmap::IpLookupTable<Ipv6Addr, T>