pub(crate) mod arp;
pub(crate) mod ether;
pub(crate) mod icmp;
pub(crate) mod ipv4;
pub(crate) mod ipv6;
pub(crate) mod payload;
pub(crate) mod tcp;
pub(crate) mod udp;
pub(crate) mod vlan;
use std::fmt::Display;
use crate::layers;
use crate::layers::arp::{Arp, ArpMut};
use crate::layers::ether::{Ether, EtherMut};
use crate::layers::icmp::{Icmp, IcmpMut};
use crate::layers::ipv4::{Ipv4, Ipv4Mut};
use crate::layers::ipv6::{Ipv6, Ipv6Mut};
use crate::layers::payload::{Payload, PayloadMut};
use crate::layers::tcp::{Tcp, TcpMut};
use crate::layers::udp::{Udp, UdpMut};
use crate::layers::vlan::{Vlan, VlanMut};
layers!(
Ether => EtherMut,
Vlan => VlanMut,
Arp => ArpMut,
Ipv4 => Ipv4Mut,
Ipv6 => Ipv6Mut,
Icmp => IcmpMut,
Udp => UdpMut,
Tcp => TcpMut,
Payload => PayloadMut
);
pub trait LayerImmutable<'a> {
type Packet;
type PacketMut;
type LayerMutType;
fn new(buf: &'a [u8]) -> Self;
fn as_mut(&self) -> Option<Self::LayerMutType>;
fn get_buf(&self) -> &[u8];
fn as_pnet(&self) -> Option<Self::Packet>;
fn as_mut_pnet(&self) -> Option<Self::PacketMut>;
fn get_layer(&'a self, layer: Layers) -> Option<Layer<'a>>;
fn get_layer_from_buf(buf: &'_ [u8], layer: Layers) -> Option<Layer<'_>>;
}
pub trait LayerMutable<'a>: Sized {
type PacketMut;
fn new() -> Self;
fn from_buf(buf: Vec<u8>) -> Option<Self>;
fn get_layer(&'a mut self, _layer: &Layers) -> Option<&'a mut LayerMut> {
None
}
fn modify(&'a mut self) -> Option<Self::PacketMut>;
fn set_payload(&'a mut self, payload: &[u8]);
fn add(&mut self, _layer: LayerMut) -> bool {
false
}
fn switch_src_dst(&mut self) {}
fn build(self) -> Option<Vec<u8>>;
}