use sciparse::{
address::socket_addr::ScionSocketAddr,
core::{encode::WireEncode, view::View},
dataplane_path::{model::DpPath, view::ScionDpPathViewExt},
packet::{classify::ClassifiedPacketView, model::ScionUdpPacket, view::ScionRawPacketView},
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let buf = ScionUdpPacket::new(
"[1-1,2.2.2.2]:1234".parse::<ScionSocketAddr>()?,
"[1-1,3.3.3.3]:5678".parse::<ScionSocketAddr>()?,
DpPath::Empty, b"payload".to_vec(),
)
.try_encode_to_vec()?;
let response = echo_request(buf)?;
println!("Received response: {:?}", response);
Ok(())
}
fn echo_request(pkt: Vec<u8>) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
let (packet, _rest): (&ScionRawPacketView, &[u8]) = ScionRawPacketView::try_from_slice(&pkt)?;
match packet.try_classify()? {
ClassifiedPacketView::Udp(scion_packet_view) => {
let path = scion_packet_view.header().path().to_model();
let path = path.try_into_reversed().map_err(|(_, err)| err)?;
let response = ScionUdpPacket::new(
scion_packet_view.dst_socket_addr()?,
scion_packet_view.src_socket_addr()?,
path,
scion_packet_view.payload().to_vec(),
)
.try_encode_to_vec()?;
Ok(response)
}
_ => {
Err("Unsupported packet type".into())
}
}
}