embassy-net

Crates

git

Versions

default

Flavors

Skip to main content

NeighborCache

Struct NeighborCache 

Source
pub struct NeighborCache<'d> { /* private fields */ }
Expand description

The neighbor cache: the stack’s map of IP addresses to hardware addresses.

It holds one entry per neighbor, keyed by the interface it is reachable through plus its IP address. Entries are filled in by ARP and neighbor discovery, and expire after 60 s unless traffic from the neighbor refreshes them.

Access it with Stack::neighbor_cache.

Implementations§

Source§

impl<'d> NeighborCache<'d>

Source

pub fn get(&self, iface: IfaceHandle, addr: IpAddr) -> Option<Neighbor>

Get the entry for a neighbor.

An entry that expired is reported as NeighborState::Stale from the next poll on, until the stack reuses its slot. Before that poll it is still Reachable, with an expires_at that has passed.

Source

pub fn iter(&self) -> impl Iterator<Item = Neighbor> + 'd

Iterate over all entries.

Source

pub fn insert( &self, iface: IfaceHandle, addr: IpAddr, hardware_addr: HardwareAddress, expires_at: Instant, ) -> Result<(), NotUnicast>

Add or replace an entry, mapping addr on iface to hardware_addr.

expires_at is when the entry stops being used. There are no static entries. To keep an entry, insert it again before it expires. An expires_at more than ~12 days away is clamped to that.

The stack changes the entry too:

  • Traffic from the neighbor sets it to expire 60 s later.
  • ARP or neighbor discovery replaces it if the neighbor answers with a different hardware address.

If the cache is full, another entry is evicted to make room.

§Errors
  • NotUnicast: if addr or hardware_addr is not unicast. The cache is left unchanged.
Source

pub fn remove(&self, iface: IfaceHandle, addr: IpAddr) -> Option<Neighbor>

Remove the entry for a neighbor, returning it if there was one.

Removing an entry whose resolution is still in progress drops the packets parked on it at the next poll.

Source

pub fn retain(&self, f: impl FnMut(&Neighbor) -> bool)

Keep only the entries for which f returns true.

Same caveat as NeighborCache::remove for entries being resolved.

Source

pub fn clear_iface(&self, iface: IfaceHandle)

Remove all entries for one interface.

Same caveat as NeighborCache::remove for entries being resolved.

Source

pub fn clear(&self)

Remove all entries.

Same caveat as NeighborCache::remove for entries being resolved.

Source

pub fn len(&self) -> usize

Number of entries.

Source

pub fn is_empty(&self) -> bool

Whether the cache is empty.

Trait Implementations§

Source§

impl<'d> Clone for NeighborCache<'d>

Source§

fn clone(&self) -> NeighborCache<'d>

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<'d> Copy for NeighborCache<'d>

Auto Trait Implementations§

§

impl<'d> !RefUnwindSafe for NeighborCache<'d>

§

impl<'d> !Send for NeighborCache<'d>

§

impl<'d> !Sync for NeighborCache<'d>

§

impl<'d> !UnwindSafe for NeighborCache<'d>

§

impl<'d> Freeze for NeighborCache<'d>

§

impl<'d> Unpin for NeighborCache<'d>

§

impl<'d> UnsafeUnpin for NeighborCache<'d>

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, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

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.