blob: 44205aec37083ca534c9216c9be19276796bb7e5 [file] [log] [blame]
// Copyright 2021 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.
#include "config.h"
namespace network {
namespace tun {
std::optional<BasePortConfig> BasePortConfig::Create(
const fuchsia_net_tun::wire::BasePortConfig& config) {
BasePortConfig out{
.mtu = config.has_mtu() ? config.mtu() : fuchsia_net_tun::wire::kMaxMtu,
.port_class = config.has_port_class() ? config.port_class()
: fuchsia_hardware_network::wire::PortClass::kVirtual,
};
// Check validity.
if (out.mtu == 0 || out.mtu > fuchsia_net_tun::wire::kMaxMtu) {
return std::nullopt;
}
// Check required fields.
if (!config.has_id() || config.id() >= fuchsia_hardware_network::wire::kMaxPorts) {
return std::nullopt;
}
out.port_id = config.id();
if (!config.has_rx_types()) {
return std::nullopt;
}
auto const& rx_types = config.rx_types();
if (rx_types.empty()) {
return std::nullopt;
}
std::copy(rx_types.begin(), rx_types.end(), std::back_inserter(out.rx_types));
if (!config.has_tx_types()) {
return std::nullopt;
}
auto const& tx_types = config.tx_types();
if (tx_types.empty()) {
return std::nullopt;
}
std::copy(tx_types.begin(), tx_types.end(), std::back_inserter(out.tx_types));
return out;
}
std::optional<DevicePortConfig> DevicePortConfig::Create(
const fuchsia_net_tun::wire::DevicePortConfig& config) {
if (!config.has_base()) {
return std::nullopt;
}
std::optional base = BasePortConfig::Create(config.base());
if (!base.has_value()) {
return std::nullopt;
}
DevicePortConfig out(std::move(base.value()));
out.online = config.has_online() && config.online();
if (config.has_mac()) {
out.mac = config.mac();
}
return out;
}
std::optional<DevicePairPortConfig> DevicePairPortConfig::Create(
const fuchsia_net_tun::wire::DevicePairPortConfig& config) {
if (!config.has_base()) {
return std::nullopt;
}
std::optional base = BasePortConfig::Create(config.base());
if (!base.has_value()) {
return std::nullopt;
}
DevicePairPortConfig out(std::move(base.value()));
if (config.has_mac_left()) {
out.mac_left = config.mac_left();
}
if (config.has_mac_right()) {
out.mac_right = config.mac_right();
}
return out;
}
BaseDeviceConfig::BaseDeviceConfig(const fuchsia_net_tun::wire::BaseDeviceConfig& config) {
if (config.has_report_metadata()) {
report_metadata = config.report_metadata();
}
if (config.has_min_tx_buffer_length()) {
min_tx_buffer_length = config.min_tx_buffer_length();
}
if (config.has_min_rx_buffer_length()) {
min_rx_buffer_length = config.min_rx_buffer_length();
}
}
DeviceConfig::DeviceConfig(const fuchsia_net_tun::wire::DeviceConfig& config)
: BaseDeviceConfig([&config]() {
if (config.has_base()) {
return BaseDeviceConfig(config.base());
} else {
return BaseDeviceConfig(fuchsia_net_tun::wire::BaseDeviceConfig());
}
}()) {
if (config.has_blocking()) {
blocking = config.blocking();
}
}
DevicePairConfig::DevicePairConfig(const fuchsia_net_tun::wire::DevicePairConfig& config)
: BaseDeviceConfig([&config]() {
if (config.has_base()) {
return BaseDeviceConfig(config.base());
} else {
return BaseDeviceConfig(fuchsia_net_tun::wire::BaseDeviceConfig());
}
}()) {
if (config.has_fallible_transmit_left()) {
fallible_transmit_left = config.fallible_transmit_left();
}
if (config.has_fallible_transmit_right()) {
fallible_transmit_right = config.fallible_transmit_right();
}
}
} // namespace tun
} // namespace network