#![allow(dead_code, unused_imports)]
use super::{black_box, header, payload, read_slice_bounds, touch_slice_bounds};
use crate::{
core::view::View,
packet::{
classify::ClassifiedPacketView,
view::{ScionRawPacketView, ScionScmpPacketView, ScionUdpPacketView},
},
payload::{scmp::view::ScmpPayloadView, udp::view::UdpDatagramView},
};
pub fn exec_every_view_function(view: &mut ScionRawPacketView) {
read_slice_bounds(view.payload());
touch_slice_bounds(view.payload_mut());
read_slice_bounds(view.as_slice());
black_box(view.header());
header::exec_every_view_function(view.header_mut());
if let Ok(class) = view.try_classify() {
black_box(class.dst_socket_addr());
match class {
ClassifiedPacketView::Udp(udp_view) => {
exec_udp_packet_view(udp_view);
}
ClassifiedPacketView::Scmp(scmp_view) => {
exec_scmp_packet_view(scmp_view);
}
ClassifiedPacketView::Other(_raw) => {}
}
}
if let Ok((udp_view, _rest)) = ScionUdpPacketView::try_from_slice(view.as_slice()) {
exec_udp_packet_view(udp_view);
}
if let Ok((scmp_view, _rest)) = ScionScmpPacketView::try_from_slice(view.as_slice()) {
exec_scmp_packet_view(scmp_view);
}
unsafe {
if let Ok((udp_view_mut, _rest)) =
ScionUdpPacketView::try_from_mut_slice(view.as_slice_mut())
{
exec_udp_packet_view_mut(udp_view_mut);
}
}
unsafe {
if let Ok((scmp_view_mut, _rest)) =
ScionScmpPacketView::try_from_mut_slice(view.as_slice_mut())
{
exec_scmp_packet_view_mut(scmp_view_mut);
}
}
}
fn exec_udp_packet_view(view: &ScionUdpPacketView) {
black_box(view.header());
read_slice_bounds(view.payload());
read_slice_bounds(view.as_slice());
let udp = view.udp();
black_box(udp.src_port());
black_box(udp.dst_port());
black_box(udp.length());
black_box(udp.checksum());
read_slice_bounds(udp.payload());
read_slice_bounds(udp.as_slice());
let raw = view.as_raw();
black_box(raw.header());
read_slice_bounds(raw.payload());
read_slice_bounds(raw.as_slice());
}
fn exec_udp_packet_view_mut(view: &mut ScionUdpPacketView) {
exec_udp_packet_view(view);
header::exec_every_view_function(view.header_mut());
{
let udp = view.udp();
payload::udp::exec_every_view_function_ref(udp);
}
let raw = view.as_raw_mut();
touch_slice_bounds(raw.payload_mut());
}
fn exec_scmp_packet_view(view: &ScionScmpPacketView) {
black_box(view.header());
read_slice_bounds(view.payload());
read_slice_bounds(view.as_slice());
let scmp = view.scmp();
black_box(scmp.message_type());
black_box(scmp.code());
black_box(scmp.checksum());
black_box(scmp.dst_port());
black_box(scmp.message());
read_slice_bounds(scmp.as_slice());
let raw = view.as_raw();
black_box(raw.header());
read_slice_bounds(raw.payload());
read_slice_bounds(raw.as_slice());
}
fn exec_scmp_packet_view_mut(view: &mut ScionScmpPacketView) {
exec_scmp_packet_view(view);
header::exec_every_view_function(view.header_mut());
{
let scmp = view.scmp();
black_box(scmp.message_type());
black_box(scmp.code());
black_box(scmp.checksum());
black_box(scmp.dst_port());
black_box(scmp.message());
}
let raw = unsafe { view.as_raw_mut() };
touch_slice_bounds(raw.payload_mut());
}