use std::{collections::BTreeMap, num::NonZeroU16, time::SystemTime};
use crate::{
network::scion::topology::{ScionAs, ScionLink, ScionLinkType, ScionTopology},
runtime::PocketScionRuntimeBuilder,
state::SharedPocketScionState,
topologies::{IA132, IA212, IA222, PocketScionHandle, UnderlayType},
};
pub async fn minimal_topology(underlay: UnderlayType) -> PocketScionHandle {
let mut pstate = SharedPocketScionState::new(SystemTime::now());
let mut topo = ScionTopology::new();
topo.add_as(ScionAs::new_core(IA212))
.unwrap()
.add_as(ScionAs::new_core(IA132))
.unwrap()
.add_link(ScionLink::new(IA132, 1, ScionLinkType::Core, IA212, 3).unwrap())
.unwrap();
pstate.set_topology(topo);
let _eh132 = pstate.add_endhost_api(vec![IA132]);
let _eh212 = pstate.add_endhost_api(vec![IA212]);
match underlay {
UnderlayType::Snap => {
let _snap132 = pstate.add_snap(IA132).unwrap();
let _snap212 = pstate.add_snap(IA212).unwrap();
}
UnderlayType::Udp => {
pstate.add_router(
IA132,
vec![NonZeroU16::new(1).unwrap(), NonZeroU16::new(2).unwrap()],
vec![],
BTreeMap::new(),
);
pstate.add_router(
IA212,
vec![NonZeroU16::new(3).unwrap(), NonZeroU16::new(4).unwrap()],
vec![],
BTreeMap::new(),
);
}
}
let pocketscion = PocketScionRuntimeBuilder::new()
.with_system_state(pstate.into_state())
.with_mgmt_listen_addr("127.0.0.1:0".parse().unwrap())
.start()
.await
.expect("Failed to start PocketSCION");
let api_client = pocketscion.api_client();
PocketScionHandle::new(pocketscion, api_client)
}
pub async fn two_path_topology(underlay: UnderlayType) -> PocketScionHandle {
scion_sdk_utils::rustls::select_ring_crypto_provider();
let mut pstate = SharedPocketScionState::new(SystemTime::now());
let mut topo = ScionTopology::new();
topo.add_as(ScionAs::new_core(IA212))
.unwrap()
.add_as(ScionAs::new_core(IA132))
.unwrap()
.add_as(ScionAs::new_core(IA222))
.unwrap()
.add_link(ScionLink::new(IA132, 1, ScionLinkType::Core, IA212, 3).unwrap())
.unwrap()
.add_link(ScionLink::new(IA132, 2, ScionLinkType::Core, IA222, 1).unwrap())
.unwrap()
.add_link(ScionLink::new(IA212, 4, ScionLinkType::Core, IA222, 2).unwrap())
.unwrap();
pstate.set_topology(topo);
let _eh132 = pstate.add_endhost_api(vec![IA132]);
let _eh212 = pstate.add_endhost_api(vec![IA212]);
match underlay {
UnderlayType::Snap => {
let _snap132 = pstate.add_snap(IA132).unwrap();
let _snap212 = pstate.add_snap(IA212).unwrap();
}
UnderlayType::Udp => {
pstate.add_router(
IA132,
vec![NonZeroU16::new(1).unwrap(), NonZeroU16::new(2).unwrap()],
vec![],
BTreeMap::new(),
);
pstate.add_router(
IA212,
vec![NonZeroU16::new(3).unwrap(), NonZeroU16::new(4).unwrap()],
vec![],
BTreeMap::new(),
);
}
}
let pocketscion = PocketScionRuntimeBuilder::new()
.with_system_state(pstate.into_state())
.with_mgmt_listen_addr("127.0.0.1:0".parse().unwrap())
.start()
.await
.expect("Failed to start PocketSCION");
let api_client = pocketscion.api_client();
PocketScionHandle::new(pocketscion, api_client)
}