blob: cfe41fa03e4ebad7bb6d44c0a1d1d48bd843bdb9 [file] [log] [blame]
// Copyright 2018 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.
//! A networking stack.
#![deny(clippy::unused_async)]
#![deny(missing_docs, unreachable_patterns, unused)]
#![recursion_limit = "256"]
mod bindings;
use std::num::NonZeroU8;
use fuchsia_component::server::{ServiceFs, ServiceFsDir};
use log::info;
use bindings::{InspectPublisher, NetstackSeed, Service};
/// Runs Netstack3.
pub fn main() {
let config = ns3_config::Config::take_from_startup_handle();
let ns3_config::Config { num_threads, debug_logs } = &config;
let num_threads = NonZeroU8::new(*num_threads).expect("invalid 0 thread count value");
let mut executor = fuchsia_async::SendExecutor::new(num_threads.get().into());
let mut log_options = diagnostics_log::PublishOptions::default();
if *debug_logs {
// When forcing debug logs, disable all the dynamic features from the
// logging framework, we want logs pegged at Severity::Debug.
log_options = log_options
.minimum_severity(diagnostics_log::Severity::Debug)
.wait_for_initial_interest(false)
.listen_for_interest_updates(false);
}
diagnostics_log::initialize(log_options).expect("failed to initialize log");
fuchsia_trace_provider::trace_provider_create_with_fdio();
info!("starting netstack3 with {config:?}");
let mut fs = ServiceFs::new();
let _: &mut ServiceFsDir<'_, _> = fs
.dir("svc")
// TODO(https://fxbug.dev/42076541): This is transitional. Once the
// out-of-stack DHCP client is being used by both netstacks, it
// should be moved out of the netstack realm and into the network
// realm. The trip through Netstack3 allows for availability of DHCP
// client to be dependent on Netstack version when using
// netstack-proxy.
.add_proxy_service::<fidl_fuchsia_net_dhcp::ClientProviderMarker, _>()
.add_service_connector(Service::DebugDiagnostics)
.add_fidl_service(Service::DebugInterfaces)
.add_fidl_service(Service::DnsServerWatcher)
.add_fidl_service(Service::Stack)
.add_fidl_service(Service::Socket)
.add_fidl_service(Service::PacketSocket)
.add_fidl_service(Service::RawSocket)
.add_fidl_service(Service::RootInterfaces)
.add_fidl_service(Service::RoutesState)
.add_fidl_service(Service::RoutesStateV4)
.add_fidl_service(Service::RoutesStateV6)
.add_fidl_service(Service::RoutesAdminV4)
.add_fidl_service(Service::RoutesAdminV6)
.add_fidl_service(Service::RouteTableProviderV4)
.add_fidl_service(Service::RouteTableProviderV6)
.add_fidl_service(Service::RuleTableV4)
.add_fidl_service(Service::RuleTableV6)
.add_fidl_service(Service::RootRoutesV4)
.add_fidl_service(Service::RootRoutesV6)
.add_fidl_service(Service::Interfaces)
.add_fidl_service(Service::InterfacesAdmin)
.add_fidl_service(Service::MulticastAdminV4)
.add_fidl_service(Service::MulticastAdminV6)
.add_fidl_service(Service::FilterState)
.add_fidl_service(Service::FilterControl)
.add_fidl_service(Service::Neighbor)
.add_fidl_service(Service::NeighborController)
.add_fidl_service(Service::Verifier);
let seed = NetstackSeed::default();
let inspect_publisher = InspectPublisher::new();
inspect_publisher
.inspector()
.root()
.record_child("Config", |config_node| config.record_inspect(config_node));
let _: &mut ServiceFs<_> = fs.take_and_serve_directory_handle().expect("directory handle");
executor.run(seed.serve(fs, inspect_publisher))
}