use std::sync::Arc;
use scion_sdk_utils::task_handler::CancelTaskSet;
use snap_tun::server::SnapTunAuthorization;
use tokio::net::UdpSocket;
use crate::{
dispatcher::Dispatcher,
tunnel_gateway::{dispatcher::TunnelGatewayDispatcherReceiver, gateway::TunnelGateway},
};
pub mod dispatcher;
pub mod gateway;
pub mod metrics;
pub(crate) mod packet_policy;
pub mod state;
pub fn start_tunnel_gateway<A, D>(
tasks: &mut CancelTaskSet,
socket: UdpSocket,
authz: Arc<A>,
dispatcher: Arc<D>,
tun_dispatcher_rx: TunnelGatewayDispatcherReceiver,
server_static_secret: x25519_dalek::StaticSecret,
) where
A: SnapTunAuthorization + 'static,
D: Dispatcher + 'static,
{
let tun_gateway = TunnelGateway::new(
socket,
server_static_secret,
authz,
dispatcher,
tun_dispatcher_rx,
);
let token = tasks.cancellation_token();
tasks.spawn_cancellable_task(async move {
tun_gateway.start_server(token).await;
Ok(())
});
}