netlink_packet_route/link/
map.rs1use netlink_packet_utils::{
4 traits::{Emitable, Parseable},
5 DecodeError,
6};
7
8const LINK_MAP_LEN: usize = 32;
9
10buffer!(MapBuffer(LINK_MAP_LEN) {
11 memory_start: (u64, 0..8),
12 memory_end: (u64, 8..16),
13 base_address: (u64, 16..24),
14 irq: (u16, 24..26),
15 dma: (u8, 26),
16 port: (u8, 27),
17});
18
19#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)]
20#[non_exhaustive]
21pub struct Map {
22 pub memory_start: u64,
23 pub memory_end: u64,
24 pub base_address: u64,
25 pub irq: u16,
26 pub dma: u8,
27 pub port: u8,
28}
29
30impl<T: AsRef<[u8]>> Parseable<MapBuffer<T>> for Map {
31 fn parse(buf: &MapBuffer<T>) -> Result<Self, DecodeError> {
32 Ok(Self {
33 memory_start: buf.memory_start(),
34 memory_end: buf.memory_end(),
35 base_address: buf.base_address(),
36 irq: buf.irq(),
37 dma: buf.dma(),
38 port: buf.port(),
39 })
40 }
41}
42
43impl Emitable for Map {
44 fn buffer_len(&self) -> usize {
45 LINK_MAP_LEN
46 }
47
48 fn emit(&self, buffer: &mut [u8]) {
49 let mut buffer = MapBuffer::new(buffer);
50 buffer.set_memory_start(self.memory_start);
51 buffer.set_memory_end(self.memory_end);
52 buffer.set_base_address(self.base_address);
53 buffer.set_irq(self.irq);
54 buffer.set_dma(self.dma);
55 buffer.set_port(self.port);
56 }
57}