blob: a72f2091e50ec10e5718a3e9998db03f93d3891b [file] [log] [blame]
// Copyright 2019 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.
use fidl_fuchsia_net::{IpAddress, Ipv4Address, Ipv6Address, Subnet};
use fidl_fuchsia_net_interfaces::Address;
use fidl_fuchsia_net_stack::{AdministrativeStatus, InterfaceInfo, PhysicalStatus};
use serde::{Deserialize, Serialize};
/// Enum for supported FIDL commands.
pub enum NetstackMethod {
DisableInterface,
EnableInterface,
GetInterfaceInfo,
GetIpv6Addresses,
GetLinkLocalIpv6Addresses,
InitNetstack,
ListInterfaces,
NetstackUndefined,
}
impl NetstackMethod {
pub fn from_str(method: &String) -> NetstackMethod {
match method.as_ref() {
"DisableInterface" => NetstackMethod::DisableInterface,
"EnableInterface" => NetstackMethod::EnableInterface,
"GetInterfaceInfo" => NetstackMethod::GetInterfaceInfo,
"GetIpv6Addresses" => NetstackMethod::GetIpv6Addresses,
"GetLinkLocalIpv6Addresses" => NetstackMethod::GetLinkLocalIpv6Addresses,
"ListInterfaces" => NetstackMethod::ListInterfaces,
"InitNetstack" => NetstackMethod::InitNetstack,
_ => NetstackMethod::NetstackUndefined,
}
}
}
#[derive(Clone, Debug, Serialize)]
pub struct CustomInterfaceInfo {
pub id: u64,
pub name: String,
pub topopath: String,
pub filepath: String,
pub mac: Option<[u8; 6]>,
pub mtu: u32,
pub features: u32,
pub is_administrative_status_enabled: bool,
pub is_physical_status_up: bool,
pub ipv4_addresses: Vec<Vec<u8>>,
pub ipv6_addresses: Vec<Vec<u8>>,
}
impl CustomInterfaceInfo {
pub fn new(info: &InterfaceInfo) -> Self {
let id = info.id;
let mac = if let Some(v) = &info.properties.mac { Some(v.octets) } else { None };
let is_administrative_status_enabled = match info.properties.administrative_status {
AdministrativeStatus::Enabled => true,
AdministrativeStatus::Disabled => false,
};
let is_physical_status_up = match info.properties.physical_status {
PhysicalStatus::Up => true,
PhysicalStatus::Down => false,
};
let mut ipv4_addresses = Vec::new();
let mut ipv6_addresses = Vec::new();
for address_info in &info.properties.addresses {
match address_info.addr {
IpAddress::Ipv4(ip) => ipv4_addresses.push(ip.addr.to_vec()),
IpAddress::Ipv6(ip) => ipv6_addresses.push(ip.addr.to_vec()),
};
}
CustomInterfaceInfo {
id: id,
name: info.properties.name.clone(),
topopath: info.properties.topopath.clone(),
filepath: info.properties.filepath.clone(),
mac: mac,
mtu: info.properties.mtu,
features: info.properties.features.bits(),
is_administrative_status_enabled: is_administrative_status_enabled,
is_physical_status_up: is_physical_status_up,
ipv4_addresses: ipv4_addresses,
ipv6_addresses: ipv6_addresses,
}
}
}
#[derive(Serialize, Deserialize)]
pub struct AddressDto {
pub addr: Option<SubnetDto>,
}
#[derive(Serialize, Deserialize)]
pub struct SubnetDto {
pub addr: IpAddressDto,
pub prefix_len: u8,
}
#[derive(Serialize, Deserialize)]
pub enum IpAddressDto {
Ipv4(Ipv4AddressDto),
Ipv6(Ipv6AddressDto),
}
#[derive(Serialize, Deserialize)]
pub struct Ipv4AddressDto {
pub addr: [u8; 4],
}
#[derive(Serialize, Deserialize)]
pub struct Ipv6AddressDto {
pub addr: [u8; 16],
}
impl Into<AddressDto> for Address {
fn into(self) -> AddressDto {
AddressDto {
addr: match self.addr {
Some(subnet) => Some(subnet.into()),
None => None,
},
}
}
}
impl Into<SubnetDto> for Subnet {
fn into(self) -> SubnetDto {
SubnetDto { addr: self.addr.into(), prefix_len: self.prefix_len }
}
}
impl Into<IpAddressDto> for IpAddress {
fn into(self) -> IpAddressDto {
match self {
IpAddress::Ipv4(ipv4) => IpAddressDto::Ipv4(Ipv4AddressDto { addr: ipv4.addr }),
IpAddress::Ipv6(ipv6) => IpAddressDto::Ipv6(Ipv6AddressDto { addr: ipv6.addr }),
}
}
}
impl Into<Address> for AddressDto {
fn into(self) -> Address {
Address {
addr: match self.addr {
Some(subnet) => Some(subnet.into()),
None => None,
},
..Address::EMPTY
}
}
}
impl Into<Subnet> for SubnetDto {
fn into(self) -> Subnet {
Subnet { addr: self.addr.into(), prefix_len: self.prefix_len }
}
}
impl Into<IpAddress> for IpAddressDto {
fn into(self) -> IpAddress {
match self {
IpAddressDto::Ipv4(ipv4) => IpAddress::Ipv4(Ipv4Address { addr: ipv4.addr }),
IpAddressDto::Ipv6(ipv6) => IpAddress::Ipv6(Ipv6Address { addr: ipv6.addr }),
}
}
}