use serde::{Deserialize, Serialize};
use zbus::{
proxy,
zvariant::{OwnedValue, Type, Value},
};
#[derive(Debug, Clone, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct Ip6Prefix {
pub prefix_bytes: Vec<u8>,
pub prefix_length: u8,
}
#[derive(Debug, Clone, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct ScanResult {
pub ext_address: u64,
pub network_name: String,
pub ext_panid: u64,
pub steering_data: Vec<u8>,
pub panid: u16,
pub joiner_udp_port: u16,
pub channel: u8,
pub rssi: i16,
pub lqi: u8,
pub version: u8,
pub is_native: bool,
pub is_joinable: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct EnergyScanResult {
pub channel: u8,
pub max_rssi: u8,
}
#[derive(Debug, Clone, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct ExternalRoute {
pub prefix: Ip6Prefix,
pub rloc16: u16,
pub preference: u8,
pub stable: bool,
pub next_hop_is_self: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct OnMeshPrefix {
pub prefix: Ip6Prefix,
pub rloc16: u16,
pub preference: u8,
pub preferred: bool,
pub slaac: bool,
pub dhcp: bool,
pub configure: bool,
pub default_route: bool,
pub on_mesh: bool,
pub stable: bool,
pub nd_dns: bool,
pub dp: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct LeaderData {
pub partition_id: u32,
pub weighting: u8,
pub data_version: u8,
pub stable_data_version: u8,
pub leader_router_id: u8,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct ChannelQuality {
pub channel: u8,
pub occupancy: u16,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct ChildEntry {
pub ext_address: u64,
pub timeout: u32,
pub age: u32,
pub rloc16: u16,
pub child_id: u16,
pub network_data_version: u8,
pub link_quality_in: u8,
pub average_rssi: u8,
pub last_rssi: u8,
pub frame_error_rate: u16,
pub message_error_rate: u16,
pub rx_on_when_idle: bool,
pub full_thread_device: bool,
pub full_network_data: bool,
pub is_state_restoring: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct NeighborEntry {
pub ext_address: u64,
pub age: u32,
pub rloc16: u16,
pub link_frame_counter: u32,
pub mle_frame_counter: u32,
pub link_quality_in: u8,
pub average_rssi: u8,
pub last_rssi: u8,
pub frame_error_rate: u16,
pub message_error_rate: u16,
pub thread_version: u16,
pub rx_on_when_idle: bool,
pub full_thread_device: bool,
pub full_network_data: bool,
pub is_child: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct LinkCounters {
pub ip_tx_success: u32,
pub ip_rx_success: u32,
pub ip_tx_failure: u32,
pub ip_rx_failure: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct LinkMode {
pub rx_on_when_idle: bool,
pub device_type_ftd: bool,
pub network_data_full: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct SrpLeaseCounters {
pub fresh_count: u32,
pub deleted_count: u32,
pub lease_time_total: u64,
pub key_lease_time_total: u64,
pub remaining_lease_time_total: u64,
pub remaining_key_lease_time_total: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct SrpResponseCounters {
pub success: u32,
pub server_failure: u32,
pub format_error: u32,
pub name_exists: u32,
pub refused: u32,
pub other: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct SrpServerInfo {
pub state: u8,
pub port: u16,
pub address_mode: u8,
pub hosts: SrpLeaseCounters,
pub services: SrpLeaseCounters,
pub responses: SrpResponseCounters,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct DnssdCounters {
pub success: u32,
pub server_failure: u32,
pub format_error: u32,
pub name_error: u32,
pub not_implemented: u32,
pub other: u32,
pub resolved_by_srp: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct RadioSpinelMetrics {
pub rcp_timeout_count: u32,
pub rcp_unexpected_reset_count: u32,
pub rcp_restoration_count: u32,
pub spinel_parse_error_count: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct RcpInterfaceMetrics {
pub rcp_interface_type: u8,
pub transferred_frame_count: u64,
pub transferred_valid_frame_count: u64,
pub transferred_garbage_frame_count: u64,
pub rx_frame_count: u64,
pub rx_frame_byte_count: u64,
pub tx_frame_count: u64,
pub tx_frame_byte_count: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct Nat64Counters {
pub m_4to6_packets: u64,
pub m_4to6_bytes: u64,
pub m_6to4_packets: u64,
pub m_6to4_bytes: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct Nat64ProtocolCounters {
pub total: Nat64Counters,
pub icmp: Nat64Counters,
pub udp: Nat64Counters,
pub tcp: Nat64Counters,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct Nat64ErrorPair {
pub m_4to6_packets: u64,
pub m_6to4_packets: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct Nat64ErrorCounters {
pub unknown: Nat64ErrorPair,
pub illegal_packet: Nat64ErrorPair,
pub unsupported_proto: Nat64ErrorPair,
pub no_mapping: Nat64ErrorPair,
}
#[derive(Debug, Clone, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct Nat64Mapping {
pub id: u64,
pub ip4: Vec<u8>,
pub ip6: Vec<u8>,
pub remaining_time_ms: u32,
pub counters: Nat64ProtocolCounters,
}
#[derive(Debug, Clone, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct Nat64State {
pub prefix_manager_state: String,
pub translator_state: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct PacketByteCounter {
pub packets: u64,
pub bytes: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct BorderRoutingCounters {
pub inbound_unicast: PacketByteCounter,
pub inbound_multicast: PacketByteCounter,
pub outbound_unicast: PacketByteCounter,
pub outbound_multicast: PacketByteCounter,
pub ra_rx: u32,
pub ra_tx_success: u32,
pub ra_tx_failure: u32,
pub rs_rx: u32,
pub rs_tx_success: u32,
pub rs_tx_failure: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct InfraLinkInfo {
pub name: String,
pub is_up: bool,
pub is_running: bool,
pub is_multicast: bool,
pub link_local_addresses: u32,
pub unique_local_addresses: u32,
pub global_unicast_addresses: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct TrelPacketStats {
pub tx_packets: u64,
pub tx_bytes: u64,
pub tx_failure: u64,
pub rx_packets: u64,
pub rx_bytes: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct TrelInfo {
pub enabled: bool,
pub num_trel_peers: u16,
pub stats: TrelPacketStats,
}
#[derive(Debug, Clone, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct VendorTxtEntry {
pub key: String,
pub value: Vec<u8>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct MacCounters {
pub tx_total: u32,
pub tx_unicast: u32,
pub tx_broadcast: u32,
pub tx_ack_requested: u32,
pub tx_acked: u32,
pub tx_no_ack_requested: u32,
pub tx_data: u32,
pub tx_data_poll: u32,
pub tx_beacon: u32,
pub tx_beacon_request: u32,
pub tx_other: u32,
pub tx_retry: u32,
pub tx_err_cca: u32,
pub tx_err_abort: u32,
pub tx_busy_channel: u32,
pub rx_total: u32,
pub rx_unicast: u32,
pub rx_broadcast: u32,
pub rx_data: u32,
pub rx_data_poll: u32,
pub rx_beacon: u32,
pub rx_beacon_request: u32,
pub rx_other: u32,
pub rx_address_filtered: u32,
pub rx_dest_address_filtered: u32,
pub rx_duplicated: u32,
pub rx_err_no_frame: u32,
pub rx_err_unknown_neighbor: u32,
pub rx_err_invalid_src_addr: u32,
pub rx_err_sec: u32,
pub rx_err_fcs: u32,
pub rx_err_other: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct RadioCoexMetrics {
pub num_grant_glitch: u32,
pub num_tx_request: u32,
pub num_tx_grant_immediate: u32,
pub num_tx_grant_wait: u32,
pub num_tx_grant_wait_activated: u32,
pub num_tx_grant_wait_timeout: u32,
pub num_tx_grant_deactivated_during_request: u32,
pub num_tx_delayed_grant: u32,
pub avg_tx_request_to_grant_time: u32,
pub num_rx_request: u32,
pub num_rx_grant_immediate: u32,
pub num_rx_grant_wait: u32,
pub num_rx_grant_wait_activated: u32,
pub num_rx_grant_wait_timeout: u32,
pub num_rx_grant_deactivated_during_request: u32,
pub num_rx_delayed_grant: u32,
pub avg_rx_request_to_grant_time: u32,
pub num_rx_grant_none: u32,
pub stopped: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct MdnsResponseCounters {
pub success: u32,
pub not_found: u32,
pub invalid_args: u32,
pub duplicated: u32,
pub not_implemented: u32,
pub unknown_error: u32,
pub aborted: u32,
pub invalid_state: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Serialize, Deserialize, Value, OwnedValue)]
pub struct MdnsTelemetryInfo {
pub host_registration: MdnsResponseCounters,
pub service_registration: MdnsResponseCounters,
pub host_resolution: MdnsResponseCounters,
pub service_resolution: MdnsResponseCounters,
pub host_registration_ema_latency: u32,
pub service_registration_ema_latency: u32,
pub host_resolution_ema_latency: u32,
pub service_resolution_ema_latency: u32,
}
#[proxy(
interface = "io.openthread.BorderRouter",
default_service = "io.openthread.BorderRouter.wpan0",
default_path = "/io/openthread/BorderRouter/wpan0"
)]
pub trait BorderRouter {
fn scan(&self) -> zbus::Result<Vec<ScanResult>>;
fn energy_scan(&self, scan_duration: u32) -> zbus::Result<Vec<EnergyScanResult>>;
#[allow(clippy::too_many_arguments)]
fn attach(
&self,
network_key: &[u8],
panid: u16,
network_name: &str,
ext_panid: u64,
pskc: &[u8],
channel_mask: u32,
) -> zbus::Result<()>;
fn attach_all_nodes_to(&self, dataset: &[u8]) -> zbus::Result<i64>;
fn detach(&self) -> zbus::Result<()>;
fn permit_unsecure_join(&self, port: u16, timeout: u32) -> zbus::Result<()>;
#[allow(clippy::too_many_arguments)]
fn joiner_start(
&self,
pskd: &str,
provision_url: &str,
vendor_name: &str,
vendor_model: &str,
vendor_sw_version: &str,
vendor_data: &str,
) -> zbus::Result<()>;
fn joiner_stop(&self) -> zbus::Result<()>;
fn factory_reset(&self) -> zbus::Result<()>;
fn reset(&self) -> zbus::Result<()>;
fn add_external_route(&self, route: &ExternalRoute) -> zbus::Result<()>;
fn remove_external_route(&self, prefix: &Ip6Prefix) -> zbus::Result<()>;
fn add_on_mesh_prefix(&self, prefix: &OnMeshPrefix) -> zbus::Result<()>;
fn remove_on_mesh_prefix(&self, prefix: &Ip6Prefix) -> zbus::Result<()>;
fn set_border_agent_enabled(&self, enable: bool) -> zbus::Result<()>;
fn update_vendor_mesh_cop_txt_entries(&self, update: &[VendorTxtEntry]) -> zbus::Result<()>;
fn get_properties(&self, properties: &[&str]) -> zbus::Result<()>;
fn leave_network(&self) -> zbus::Result<()>;
fn set_nat64_enabled(&self, enable: bool) -> zbus::Result<()>;
fn activate_ephemeral_key_mode(&self, lifetime: u32) -> zbus::Result<String>;
fn deactivate_ephemeral_key_mode(&self, retain_active_session: bool) -> zbus::Result<()>;
#[zbus(property)]
fn device_role(&self) -> zbus::Result<String>;
#[zbus(property)]
fn network_name(&self) -> zbus::Result<String>;
#[zbus(property)]
fn pan_id(&self) -> zbus::Result<u16>;
#[zbus(property)]
fn ext_pan_id(&self) -> zbus::Result<u64>;
#[zbus(property)]
fn channel(&self) -> zbus::Result<u16>;
#[zbus(property)]
fn cca_failure_rate(&self) -> zbus::Result<u16>;
#[zbus(property)]
fn mac_counters(&self) -> zbus::Result<MacCounters>;
#[zbus(property)]
fn link_counters(&self) -> zbus::Result<LinkCounters>;
#[zbus(property)]
fn link_supported_channel_mask(&self) -> zbus::Result<u32>;
#[zbus(property)]
fn link_preferred_channel_mask(&self) -> zbus::Result<u32>;
#[zbus(property)]
fn rloc16(&self) -> zbus::Result<u16>;
#[zbus(property)]
fn extended_address(&self) -> zbus::Result<u64>;
#[zbus(property)]
fn router_id(&self) -> zbus::Result<u8>;
#[zbus(property)]
fn leader_data(&self) -> zbus::Result<LeaderData>;
#[zbus(property)]
fn network_data(&self) -> zbus::Result<Vec<u8>>;
#[zbus(property)]
fn stable_network_data(&self) -> zbus::Result<Vec<u8>>;
#[zbus(property)]
fn local_leader_weight(&self) -> zbus::Result<u8>;
#[zbus(property)]
fn channel_monitor_sample_count(&self) -> zbus::Result<u32>;
#[zbus(property)]
fn channel_monitor_channel_quality_map(&self) -> zbus::Result<Vec<ChannelQuality>>;
#[zbus(property)]
fn child_table(&self) -> zbus::Result<Vec<ChildEntry>>;
#[zbus(property)]
fn neighbor_table(&self) -> zbus::Result<Vec<NeighborEntry>>;
#[zbus(property)]
fn partition_id(&self) -> zbus::Result<u32>;
#[zbus(property)]
fn instant_rssi(&self) -> zbus::Result<u8>;
#[zbus(property)]
fn radio_tx_power(&self) -> zbus::Result<u8>;
#[zbus(property)]
fn external_routes(&self) -> zbus::Result<ExternalRoute>;
#[zbus(property)]
fn on_mesh_prefixes(&self) -> zbus::Result<Vec<OnMeshPrefix>>;
#[zbus(property)]
fn pending_dataset_tlvs(&self) -> zbus::Result<Vec<u8>>;
#[zbus(property)]
fn srp_server_info(&self) -> zbus::Result<SrpServerInfo>;
#[zbus(property)]
fn dnssd_counters(&self) -> zbus::Result<DnssdCounters>;
#[zbus(property)]
fn mdns_telemetry_info(&self) -> zbus::Result<MdnsTelemetryInfo>;
#[zbus(property)]
fn otbr_version(&self) -> zbus::Result<String>;
#[zbus(property)]
fn ot_host_version(&self) -> zbus::Result<String>;
#[zbus(property)]
fn ot_rcp_version(&self) -> zbus::Result<String>;
#[zbus(property)]
fn thread_version(&self) -> zbus::Result<u16>;
#[zbus(property)]
fn eui64(&self) -> zbus::Result<u64>;
#[zbus(property)]
fn border_agent_id(&self) -> zbus::Result<Vec<u8>>;
#[zbus(property)]
fn radio_spinel_metrics(&self) -> zbus::Result<RadioSpinelMetrics>;
#[zbus(property)]
fn rcp_interface_metrics(&self) -> zbus::Result<RcpInterfaceMetrics>;
#[zbus(property)]
fn uptime(&self) -> zbus::Result<u64>;
#[zbus(property)]
fn radio_coex_metrics(&self) -> zbus::Result<RadioCoexMetrics>;
#[zbus(property)]
fn nat64_state(&self) -> zbus::Result<Nat64State>;
#[zbus(property)]
fn nat64_mappings(&self) -> zbus::Result<Vec<Nat64Mapping>>;
#[zbus(property)]
fn nat64_protocol_counters(&self) -> zbus::Result<Nat64ProtocolCounters>;
#[zbus(property)]
fn nat64_error_counters(&self) -> zbus::Result<Nat64ErrorCounters>;
#[zbus(property)]
fn border_routing_counters(&self) -> zbus::Result<BorderRoutingCounters>;
#[zbus(property)]
fn infra_link_info(&self) -> zbus::Result<InfraLinkInfo>;
#[zbus(property)]
fn trel_info(&self) -> zbus::Result<TrelInfo>;
#[zbus(property)]
fn multi_ail_detected(&self) -> zbus::Result<bool>;
#[zbus(property)]
fn telemetry_data(&self) -> zbus::Result<Vec<u8>>;
#[zbus(property)]
fn capabilities(&self) -> zbus::Result<Vec<u8>>;
#[zbus(property)]
fn ephemeral_key_enabled(&self) -> zbus::Result<bool>;
#[zbus(property)]
fn set_ephemeral_key_enabled(&self, value: bool) -> zbus::Result<()>;
#[zbus(property)]
fn mesh_local_prefix(&self) -> zbus::Result<Vec<u8>>;
#[zbus(property)]
fn set_mesh_local_prefix(&self, value: &[u8]) -> zbus::Result<()>;
#[zbus(property)]
fn link_mode(&self) -> zbus::Result<LinkMode>;
#[zbus(property)]
fn set_link_mode(&self, value: LinkMode) -> zbus::Result<()>;
#[zbus(property)]
fn active_dataset_tlvs(&self) -> zbus::Result<Vec<u8>>;
#[zbus(property)]
fn set_active_dataset_tlvs(&self, value: &[u8]) -> zbus::Result<()>;
#[zbus(property)]
fn feature_flag_list_data(&self) -> zbus::Result<Vec<u8>>;
#[zbus(property)]
fn set_feature_flag_list_data(&self, value: &[u8]) -> zbus::Result<()>;
#[zbus(property)]
fn radio_region(&self) -> zbus::Result<String>;
#[zbus(property)]
fn set_radio_region(&self, value: &str) -> zbus::Result<()>;
#[zbus(property)]
fn nat64_cidr(&self) -> zbus::Result<String>;
#[zbus(property)]
fn set_nat64_cidr(&self, value: &str) -> zbus::Result<()>;
#[zbus(property)]
fn dns_upstream_query_state(&self) -> zbus::Result<bool>;
#[zbus(property)]
fn set_dns_upstream_query_state(&self, value: bool) -> zbus::Result<()>;
#[zbus(signal)]
fn ready(&self) -> zbus::Result<()>;
}