netlink_packet_route/link/
map.rs

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