netlink_packet_route/link/
map.rs

1// SPDX-License-Identifier: MIT
2
3use netlink_packet_utils::traits::{Emitable, Parseable};
4use netlink_packet_utils::DecodeError;
5
6const LINK_MAP_LEN: usize = 32;
7
8buffer!(MapBuffer(LINK_MAP_LEN) {
9    memory_start: (u64, 0..8),
10    memory_end: (u64, 8..16),
11    base_address: (u64, 16..24),
12    irq: (u16, 24..26),
13    dma: (u8, 26),
14    port: (u8, 27),
15});
16
17#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)]
18#[non_exhaustive]
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    type Error = DecodeError;
30    fn parse(buf: &MapBuffer<T>) -> Result<Self, DecodeError> {
31        Ok(Self {
32            memory_start: buf.memory_start(),
33            memory_end: buf.memory_end(),
34            base_address: buf.base_address(),
35            irq: buf.irq(),
36            dma: buf.dma(),
37            port: buf.port(),
38        })
39    }
40}
41
42impl Emitable for Map {
43    fn buffer_len(&self) -> usize {
44        LINK_MAP_LEN
45    }
46
47    fn emit(&self, buffer: &mut [u8]) {
48        let mut buffer = MapBuffer::new(buffer);
49        buffer.set_memory_start(self.memory_start);
50        buffer.set_memory_end(self.memory_end);
51        buffer.set_base_address(self.base_address);
52        buffer.set_irq(self.irq);
53        buffer.set_dma(self.dma);
54        buffer.set_port(self.port);
55    }
56}