use sciparse::{
address::socket_addr::ScionSocketAddr,
core::{
convert::{TryFromView, TryToModel},
encode::WireEncode,
view::View,
},
dataplane_path::model::DpPath,
packet::{
model::{ScionRawPacket, ScionUdpPacket},
view::ScionRawPacketView,
},
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let packet = 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(),
);
let buf = encode_packet(&packet)?;
decode_slice(&buf)?;
Ok(())
}
fn decode_slice(buf: &[u8]) -> Result<(), Box<dyn std::error::Error>> {
let (packet, _rest): (&ScionRawPacketView, &[u8]) = ScionRawPacketView::try_from_slice(buf)?;
println!("{:?}", packet);
let model = packet.try_to_model();
println!("{:?}", model);
let (packet, _rest): (ScionRawPacket, &[u8]) = ScionRawPacket::try_from_slice(buf)?;
println!("{:?}", packet);
Ok(())
}
fn encode_packet(packet: &impl WireEncode) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
let required_size = packet.required_size();
let mut buf = vec![0u8; required_size];
packet.try_encode(&mut buf[..])?;
Ok(buf)
}