use std::sync::Arc;
use scion_sdk_observability::metrics::registry::MetricsRegistry;
use scion_sdk_token_validator::validator::{Token, TokenValidator};
use scion_sdk_utils::task_handler::CancelTaskSet;
use serde::Deserialize;
use snap_tun::AddressAllocator;
use crate::{
dispatcher::Dispatcher,
tunnel_gateway::{
gateway::TunnelGateway, metrics::TunnelGatewayMetrics, state::SharedTunnelGatewayState,
},
};
pub mod dispatcher;
pub mod gateway;
pub mod metrics;
mod packet_policy;
pub mod state;
pub fn start_tunnel_gateway<T, D>(
tasks: &mut CancelTaskSet,
shared_tunnel_gw_state: SharedTunnelGatewayState<T>,
address_allocator: Arc<dyn AddressAllocator<T>>,
token_validator: Arc<dyn TokenValidator<T>>,
tunnel_gateway_endpoint: quinn::Endpoint,
lan_gateway_dispatcher: Arc<D>,
metrics_registry: MetricsRegistry,
) where
T: for<'de> Deserialize<'de> + Token + Clone,
D: Dispatcher + 'static,
{
let snaptun_server = snap_tun::server::Server::new(
address_allocator,
token_validator.clone(),
snap_tun::metrics::Metrics::new(&metrics_registry.clone()),
);
let tunnel_gateway = TunnelGateway::new(
shared_tunnel_gw_state.clone(),
snaptun_server,
TunnelGatewayMetrics::new(&metrics_registry),
);
let cancel_token = tasks.cancellation_token();
tasks.spawn_cancellable_task(async move {
tunnel_gateway
.start_server(
cancel_token,
tunnel_gateway_endpoint,
lan_gateway_dispatcher,
)
.await
});
}