Skip to main content

Router

Struct Router 

Source
pub struct Router<const N: usize> { /* private fields */ }
Expand description

A fixed-size routing table for one node.

The table holds up to N routes, learned from the traffic the node hears. It keeps the cheapest route it knows to each destination, and when full it gives up the most expensive route to make room for a cheaper one, so its limited memory holds the routes most worth keeping.

§Examples

use pamoja_routing::{Forward, Router};

let mut router: Router<8> = Router::new(0x0A);
router.observe(0x0B, 0x0C, 3); // reach 0x0B via 0x0C, cost 3
assert_eq!(router.next_hop(0x0B), Some(0x0C));
assert_eq!(router.forward(0x0A), Forward::Deliver); // a packet for us

Implementations§

Source§

impl<const N: usize> Router<N>

Source

pub const fn new(me: u32) -> Self

Creates an empty router for the node at me.

§Arguments
  • me - this node’s address.
§Returns

A router holding no routes.

Source

pub fn address(&self) -> u32

Returns this node’s address.

§Returns

The address the router was created with.

Source

pub fn observe(&mut self, origin: u32, via: u32, cost: u16) -> bool

Learns the way to a node from a packet heard from it.

A packet that originated at origin and reached this node via the neighbour via proves via is a way back to origin at the reported cost. The router adopts the route if it is cheaper than what it knows, or if it refreshes the cost of the route it is already using, and ignores a route to itself.

§Arguments
  • origin - the node the packet came from, the destination this route reaches.
  • via - the neighbour the packet arrived through, the next hop for this route.
  • cost - the cost the packet reports for reaching origin through via.
§Returns

true if the table changed (a route was added, redirected, or recosted), false if the observation taught it nothing new.

Source

pub fn next_hop(&self, dst: u32) -> Option<u32>

Returns the next hop to reach a destination, if a route is known.

§Arguments
  • dst - the destination to reach.
§Returns

The next-hop address, or None if no route is known.

Source

pub fn cost(&self, dst: u32) -> Option<u16>

Returns the cost of the known route to a destination, if any.

§Arguments
  • dst - the destination to reach.
§Returns

The route cost, or None if no route is known.

Source

pub fn route(&self, dst: u32) -> Option<Route>

Returns the known route to a destination, if any.

§Arguments
  • dst - the destination to reach.
§Returns

The Route, or None if no route is known.

Source

pub fn forward(&self, dst: u32) -> Forward

Decides what to do with a packet bound for a destination.

§Arguments
  • dst - the packet’s destination.
§Returns

Forward::Deliver if the packet is for this node, Forward::Relay with the next hop if a route is known, or Forward::Flood otherwise.

Source

pub fn forget(&mut self, dst: u32)

Forgets the route to a destination, if one is held.

§Arguments
  • dst - the destination whose route to drop.
Source

pub fn len(&self) -> usize

Returns how many routes the table currently holds.

§Returns

The number of routes.

Source

pub fn is_empty(&self) -> bool

Reports whether the table holds no routes.

§Returns

true if no routes are held.

Trait Implementations§

Source§

impl<const N: usize> Clone for Router<N>

Source§

fn clone(&self) -> Router<N>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<const N: usize> Copy for Router<N>

Source§

impl<const N: usize> Debug for Router<N>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<const N: usize> Freeze for Router<N>

§

impl<const N: usize> RefUnwindSafe for Router<N>

§

impl<const N: usize> Send for Router<N>

§

impl<const N: usize> Sync for Router<N>

§

impl<const N: usize> Unpin for Router<N>

§

impl<const N: usize> UnsafeUnpin for Router<N>

§

impl<const N: usize> UnwindSafe for Router<N>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.