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