pub mod minimal;
use std::net::SocketAddr;
use scion_proto::address::{Asn, Isd, IsdAsn};
use url::Url;
use crate::{api::admin::client::ApiClient, runtime::PocketScionRuntime};
pub const IA132: IsdAsn = IsdAsn::new(Isd(1), Asn::new(0xff00_0000_0132));
pub const IA212: IsdAsn = IsdAsn::new(Isd(2), Asn::new(0xff00_0000_0212));
pub const IA222: IsdAsn = IsdAsn::new(Isd(2), Asn::new(0xff00_0000_0222));
pub struct PocketScionHandle {
pub runtime: PocketScionRuntime,
pub api_client: ApiClient,
}
impl PocketScionHandle {
pub fn new(pocketscion: PocketScionRuntime, api_client: ApiClient) -> Self {
Self {
runtime: pocketscion,
api_client,
}
}
pub async fn endhost_api(&self, isd_as: IsdAsn) -> anyhow::Result<Url> {
let resp = self.api_client.get_endhost_apis().await?;
let (_id, entry) = resp
.endhost_apis
.iter()
.find(|(_id, entry)| entry.local_ases.contains(&isd_as))
.ok_or_else(|| anyhow::anyhow!("No endhost API for AS {isd_as} found in topology"))?;
Ok(entry.url.clone())
}
pub async fn router_addr(&self, isd_as: IsdAsn) -> anyhow::Result<SocketAddr> {
let resp = self.api_client.get_routers().await?;
let (_id, entry) = resp
.routers
.iter()
.find(|(_id, entry)| entry.isd_as == isd_as)
.ok_or_else(|| {
anyhow::anyhow!("No router address for AS {isd_as} found in topology")
})?;
Ok(entry.addr)
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum UnderlayType {
Udp,
Snap,
}