doc/wg/network/notes/network-notes-2023-09-21.md
skbuf or mbuf structure.PacketBuffer trait on several types of bufferswhen HEADROOM >= NEW_HEADROOMstatic_init!, which made us edit the board main.rs file whenever we guessed the wrong size for some thing.current_head?SubSlice (previously LeasableBuffer) works:
LeasableBuffer, but it seems that you tried it.PacketBuffer
// head tail
// | |
// [0, 0, 0, 0, DATA, 1, 2, 3, 42, 0, 0, 0, 0] -> [ ... ]
// PacketArray<true, 4>.reduce_headroom::<2>()
trait PacketBuffer<CONTIGUOUS: bool, HEADROOM: usize> {
fn reduce_type_headroom<NEW_HEADROOM: usize>(self) -> PacketBuffer<CONTIGUOUS, NEW_HEADROOM>
when HEADROOM >= NEW_HEADROOM
{
}
fn prepend(data: &[u8]) -> PacketBuffer<CONTIGUOUS, NEW_HEADROOM> {
self.current_head -= data.len()
}
}
// Borrows a slice to an array
struct PacketSlice<'a> { // implements PacketBuffer
current_head: usize, // offset into the buffer in some way
slice: &'a mut [u8],
next_buffer: &PacketBuffer<_, _>,
}
// Owns an array
struct PacketArray<SIZE: usize> { // implements PacketBuffer
current_head: usize,
arr: [u8; SIZE],
next_buffer: &PacketBuffer<_, _>,
}
impl EthernetHIL for MyEthernetMAC {
fn transmit_buffer(buf: impl PacketBuffer<true, 32>) {
}
}
// Example of a stackup that needs header room
// allocate buffer
// |
// v
// UDP
// |
// |
// IP (24 bytes header + max(32, 14) = 56 bytes)
// |
// |------------------------------\
// Ethernet A (32 byte headroom) Ethernet B (14 byte headroom)
// allocate buffer
// |
// v
// UDP
// |
// |
// IP (non-contig, 0 byte headroom)
// |
// |------------------------------------------\
// Ethernet A (non-contig, 0 byte headroom) Ethernet B (non-contig, 0 byte headroom)