blob: a15b91d164dca6cda83d8e15bd35bf83382faf64 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//! Extensions for types in the `fidl_fuchsia_net_neighbor` crate.
#![deny(missing_docs)]
use fidl_fuchsia_net as fnet;
use fidl_fuchsia_net_ext as fnet_ext;
use fidl_fuchsia_net_neighbor as fnet_neighbor;
use fidl_table_validation::*;
use fuchsia_zircon_types as zx;
/// Information on a neighboring device in the local network.
#[derive(Clone, Debug, Eq, PartialEq, ValidFidlTable)]
#[fidl_table_src(fnet_neighbor::Entry)]
pub struct Entry {
/// Identifier for the interface used for communicating with the neighbor.
pub interface: u64,
/// IP address of the neighbor.
pub neighbor: fnet::IpAddress,
/// State of the entry within the Neighbor Unreachability Detection (NUD)
/// state machine.
pub state: fnet_neighbor::EntryState,
/// MAC address of the neighboring device's network interface controller.
#[fidl_field_type(optional)]
pub mac: Option<fnet::MacAddress>,
/// Timestamp when this entry has changed `state`.
// TODO(https://fxbug.dev/42155335): Replace with zx::Time once there is
// support for custom conversion functions.
pub updated_at: zx::zx_time_t,
}
/// Returns a &str suitable for display representing the EntryState parameter.
pub fn display_entry_state(state: &fnet_neighbor::EntryState) -> &'static str {
match state {
fnet_neighbor::EntryState::Incomplete => "INCOMPLETE",
fnet_neighbor::EntryState::Reachable => "REACHABLE",
fnet_neighbor::EntryState::Stale => "STALE",
fnet_neighbor::EntryState::Delay => "DELAY",
fnet_neighbor::EntryState::Probe => "PROBE",
fnet_neighbor::EntryState::Static => "STATIC",
fnet_neighbor::EntryState::Unreachable => "UNREACHABLE",
}
}
impl std::fmt::Display for Entry {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
let Self { interface, neighbor, mac, state, updated_at: _ } = self;
write!(f, "Interface {} | IP {} | MAC ", interface, fnet_ext::IpAddress::from(*neighbor))?;
if let Some(mac) = mac {
write!(f, "{}", fnet_ext::MacAddress::from(*mac))?;
} else {
write!(f, "?")?;
}
write!(f, " | {}", display_entry_state(state))
}
}
/// Options for modifying the behavior of `EntryIterator`.
#[derive(Clone, Debug, Eq, PartialEq, ValidFidlTable)]
#[fidl_table_src(fnet_neighbor::EntryIteratorOptions)]
pub struct EntryIteratorOptions {}