use std::{
collections::BTreeMap,
net::SocketAddr,
ops::Deref,
sync::{Arc, RwLock},
};
use scion_proto::address::EndhostAddr;
use serde::{Deserialize, Serialize};
use snap_tun::server::SnapTunToken;
pub mod dto;
#[derive(Debug, Default, Clone)]
pub struct SharedTunnelGatewayState<T: SnapTunToken>(
Arc<RwLock<BTreeMap<EndhostAddr, Arc<snap_tun::server::Sender<T>>>>>,
);
impl<T: SnapTunToken> SharedTunnelGatewayState<T> {
pub fn new() -> Self {
Self(Arc::new(RwLock::new(BTreeMap::new())))
}
}
impl<T: SnapTunToken> Deref for SharedTunnelGatewayState<T> {
type Target = Arc<RwLock<BTreeMap<EndhostAddr, Arc<snap_tun::server::Sender<T>>>>>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<T: SnapTunToken> SharedTunnelGatewayState<T> {
pub(crate) fn add_tunnel(&self, addr: EndhostAddr, tunnel: Arc<snap_tun::server::Sender<T>>) {
let mut tunnels = self.write().expect("no fail");
tracing::debug!(%addr, "Adding snaptun connection");
tunnels.insert(addr, tunnel);
}
pub(crate) fn remove_tunnel(&self, addr: EndhostAddr) {
let mut tunnels = self.write().expect("no fail");
tracing::debug!(%addr, "Removing snaptun connection");
tunnels.remove(&addr);
}
pub(crate) fn get_tunnel(&self, addr: EndhostAddr) -> Option<Arc<snap_tun::server::Sender<T>>> {
let tunnels = self.read().expect("no fail");
tunnels.get(&addr).cloned()
}
}
#[derive(Debug, PartialEq, Clone, Default, Serialize, Deserialize)]
pub struct TunnelGatewayIoConfig {
pub listen_addr: Option<SocketAddr>,
}
impl TunnelGatewayIoConfig {
pub fn new(listen_addr: SocketAddr) -> Self {
Self {
listen_addr: Some(listen_addr),
}
}
}